@daneren2005/shared-memory-objects 0.0.13 → 0.0.15
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/shared-memory-objects.js +496 -433
- package/dist/shared-memory-objects.js.map +1 -1
- package/dist/shared-memory-objects.umd.cjs +1 -1
- package/dist/shared-memory-objects.umd.cjs.map +1 -1
- package/dist/src/main.d.ts +2 -0
- package/dist/src/shared-pool.d.ts +3 -2
- package/dist/src/utils/atomic-math.d.ts +4 -0
- package/dist/src/utils/float32-atomics.d.ts +4 -3
- package/dist/src/utils/float64-atomics.d.ts +6 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared-memory-objects.umd.cjs","sources":["../src/utils/pointer.ts","../src/allocated-memory.ts","../src/lock/simple-lock.ts","../src/utils/typedarray.js","../src/memory-buffer.ts","../node_modules/pretty-bytes/index.js","../src/memory-heap.ts","../src/shared-list.ts","../src/shared-map.ts","../src/shared-pointer-list.ts","../src/shared-string.ts","../src/shared-vector.ts","../src/cached-item-list.ts","../src/shared-pool.ts","../src/utils/16-from-32-array.ts","../src/utils/16-from-64-array.ts","../src/utils/float32-atomics.ts","../src/lock/read-write-lock.ts"],"sourcesContent":["// bottom 12 bits (4096) for bufferPosition\r\n// top 20 bits (1MB) for bufferByteOffset\r\nconst BYTE_OFFSET_BIT_COUNT = 20;\r\nconst POSITION_BIT_COUNT = 32 - BYTE_OFFSET_BIT_COUNT;\r\nconst MAX_BYTE_OFFSET_LENGTH = Math.pow(2, BYTE_OFFSET_BIT_COUNT);\r\nconst MAX_POSITION_LENGTH = Math.pow(2, POSITION_BIT_COUNT);\r\n\r\nexport function loadPointer(data: Uint32Array, index: number = 0) {\r\n\treturn getPointer(Atomics.load(data, index));\r\n}\r\nexport function loadRawPointer(data: Uint32Array, index: number = 0) {\r\n\treturn Atomics.load(data, index);\r\n}\r\n\r\nexport function storePointer(data: Uint32Array, index: number = 0, bufferPosition: number, bufferByteOffset: number) {\r\n\tAtomics.store(data, index, createPointer(bufferPosition, bufferByteOffset));\r\n}\r\nexport function storeRawPointer(data: Uint32Array, index: number = 0, pointer: number) {\r\n\tAtomics.store(data, index, pointer);\r\n}\r\n\r\nexport function replacePointer(data: Uint32Array, index: number, newBufferPosition: number, newBufferByteOffset: number, oldBufferPosition: number, oldBufferByteOffset: number) {\r\n\tlet oldPointer = createPointer(oldBufferPosition, oldBufferByteOffset);\r\n\treturn Atomics.compareExchange(data, index, oldPointer, createPointer(newBufferPosition, newBufferByteOffset)) === oldPointer;\r\n}\r\nexport function replaceRawPointer(data: Uint32Array, index: number, newPointer: number, oldPointer: number): boolean {\r\n\treturn Atomics.compareExchange(data, index, oldPointer, newPointer) === oldPointer;\r\n}\r\n\r\nexport function getPointer(value: number) {\r\n\treturn {\r\n\t\tbufferPosition: value & 0b00000000000000000000111111111111,\r\n\t\tbufferByteOffset: value >>> POSITION_BIT_COUNT\r\n\t};\r\n}\r\nexport function createPointer(bufferPosition: number, bufferByteOffset: number) {\r\n\treturn bufferPosition + (bufferByteOffset << POSITION_BIT_COUNT);\r\n}\r\n\r\nexport { BYTE_OFFSET_BIT_COUNT, POSITION_BIT_COUNT, MAX_BYTE_OFFSET_LENGTH, MAX_POSITION_LENGTH };","import type { TypedArray } from './interfaces/typed-array';\r\nimport type { TypedArrayConstructor } from './interfaces/typed-array-constructor';\r\nimport type MemoryBuffer from './memory-buffer';\r\nimport type MemoryHeap from './memory-heap';\r\nimport { createPointer } from './utils/pointer';\r\n\r\nexport default class AllocatedMemory {\r\n\tprivate readonly memory: MemoryHeap;\r\n\r\n\treadonly bufferPosition: number;\r\n\tget bufferByteOffset(): number {\r\n\t\treturn this.data.byteOffset;\r\n\t}\r\n\tget pointer(): number {\r\n\t\treturn createPointer(this.bufferPosition, this.bufferByteOffset);\r\n\t}\r\n\tprivate buffer: MemoryBuffer;\r\n\tdata: Uint32Array;\r\n\r\n\tconstructor(memory: MemoryHeap, config: AllocatedMemoryConfig | SharedAllocatedMemory) {\r\n\t\tthis.memory = memory;\r\n\r\n\t\tif('buffer' in config) {\r\n\t\t\tthis.data = config.data;\r\n\t\t\tthis.buffer = config.buffer;\r\n\t\t\tthis.bufferPosition = this.memory.buffers.indexOf(config.buffer);\r\n\t\t} else {\r\n\t\t\tthis.bufferPosition = config.bufferPosition;\r\n\t\t\tthis.buffer = memory.buffers[config.bufferPosition];\r\n\r\n\t\t\t// Making sure these are the correct size is slow but in dev we want to make sure we aren't allowing to go out of bounds\r\n\t\t\tif(import.meta.env.MODE === 'production') {\r\n\t\t\t\tthis.data = new Uint32Array(this.buffer.buf, config.bufferByteOffset);\r\n\t\t\t} else {\r\n\t\t\t\tthis.data = new Uint32Array(this.buffer.buf, config.bufferByteOffset, this.buffer.lengthOf(config.bufferByteOffset));\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tgetArray<T extends TypedArray>(type: TypedArrayConstructor<T>, offset: number, length: number): T {\r\n\t\tif(import.meta.env.MODE === 'development' || import.meta.env.MODE === 'test') {\r\n\t\t\tif((offset + length) * type.BYTES_PER_ELEMENT > this.data.byteLength) {\r\n\t\t\t\tconst message = `Trying to grab more memory from AllocatedMemory.getArray then we have: ${offset * type.BYTES_PER_ELEMENT} + ${length * type.BYTES_PER_ELEMENT} > ${this.data.byteLength}`;\r\n\t\t\t\tif(import.meta.env.MODE === 'test') {\r\n\t\t\t\t\tthrow new Error(message);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tconsole.warn(message);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn new type(this.data.buffer, this.data.byteOffset + offset * type.BYTES_PER_ELEMENT, length);\r\n\t}\r\n\tgetArrayMemory(offset: number, length: number): SharedAllocatedMemory {\r\n\t\tif(import.meta.env.MODE === 'development') {\r\n\t\t\tif(offset + length > this.data.length) {\r\n\t\t\t\tconsole.warn(`Trying to grab more memory from AllocatedMemory.getArrayMemory then we have: ${offset} + ${length} > ${this.data.length}`);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tbufferPosition: this.bufferPosition,\r\n\t\t\tbufferByteOffset: this.bufferByteOffset + offset * this.data.BYTES_PER_ELEMENT\r\n\t\t};\r\n\t}\r\n\r\n\tfree() {\r\n\t\t// NOTE: From worker thread you can't pass the array, you have to pass an explicit address to free\r\n\t\tthis.buffer.free(this.data.byteOffset);\r\n\t}\r\n\r\n\tgetSharedMemory(): SharedAllocatedMemory {\r\n\t\treturn {\r\n\t\t\tbufferPosition: this.bufferPosition,\r\n\t\t\tbufferByteOffset: this.bufferByteOffset\r\n\t\t};\r\n\t}\r\n}\r\n\r\ninterface AllocatedMemoryConfig {\r\n\tdata: Uint32Array\r\n\tbuffer: MemoryBuffer\r\n}\r\n\r\ninterface SharedAllocatedMemory {\r\n\tbufferPosition: number\r\n\tbufferByteOffset: number\r\n}\r\nexport type { SharedAllocatedMemory };","const UNLOCKED = 0;\r\nconst LOCKED = 1;\r\nexport function lock(data: Int32Array, index: number = 0) {\r\n\t// Wait over and over again until we are one who set this from UNLOCKED to LOCKED\r\n\twhile(Atomics.compareExchange(data, index, UNLOCKED, LOCKED) !== UNLOCKED) {\r\n\t\tif('WorkerGlobalScope' in self) {\r\n\t\t\tAtomics.wait(data, index, LOCKED);\r\n\t\t} else {\r\n\t\t\t// TODO: Spin-locks suck....\r\n\t\t}\r\n\t}\r\n}\r\nexport function unlock(data: Int32Array, index: number = 0) {\r\n\tif(Atomics.compareExchange(data, index, LOCKED, UNLOCKED) !== LOCKED) {\r\n\t\tconsole.warn('We are unlocking when it was not locked!');\r\n\t}\r\n\r\n\tAtomics.notify(data, index);\r\n}\r\n\r\nexport const SIMPLE_LOCK_ALLOCATE_COUNT = 1;","// Copied from @thi.ng/api/typedarray\r\n// TODO: rewrite without this but for now just forked in order to add Atomics to base library\r\n\r\nvar GLType = /* @__PURE__ */ ((GLType2) => {\r\n\tGLType2[GLType2['I8'] = 5120] = 'I8';\r\n\tGLType2[GLType2['U8'] = 5121] = 'U8';\r\n\tGLType2[GLType2['I16'] = 5122] = 'I16';\r\n\tGLType2[GLType2['U16'] = 5123] = 'U16';\r\n\tGLType2[GLType2['I32'] = 5124] = 'I32';\r\n\tGLType2[GLType2['U32'] = 5125] = 'U32';\r\n\tGLType2[GLType2['F32'] = 5126] = 'F32';\r\n\treturn GLType2;\r\n})(GLType || {});\r\nconst GL2TYPE = {\r\n\t[5120 /* I8 */]: 'i8',\r\n\t[5121 /* U8 */]: 'u8',\r\n\t[5122 /* I16 */]: 'i16',\r\n\t[5123 /* U16 */]: 'u16',\r\n\t[5124 /* I32 */]: 'i32',\r\n\t[5125 /* U32 */]: 'u32',\r\n\t[5126 /* F32 */]: 'f32'\r\n};\r\nconst TYPE2GL = {\r\n\ti8: 5120 /* I8 */,\r\n\tu8: 5121 /* U8 */,\r\n\tu8c: 5121 /* U8 */,\r\n\ti16: 5122 /* I16 */,\r\n\tu16: 5123 /* U16 */,\r\n\ti32: 5124 /* I32 */,\r\n\tu32: 5125 /* U32 */,\r\n\tf32: 5126 /* F32 */,\r\n\tf64: void 0\r\n};\r\nconst SIZEOF = {\r\n\tu8: 1,\r\n\tu8c: 1,\r\n\ti8: 1,\r\n\tu16: 2,\r\n\ti16: 2,\r\n\tu32: 4,\r\n\ti32: 4,\r\n\ti64: 8,\r\n\tu64: 8,\r\n\tf32: 4,\r\n\tf64: 8\r\n};\r\nconst BIT_SHIFTS = {\r\n\ti8: 0,\r\n\tu8: 0,\r\n\tu8c: 0,\r\n\ti16: 1,\r\n\tu16: 1,\r\n\ti32: 2,\r\n\tu32: 2,\r\n\ti64: 3,\r\n\tu64: 3,\r\n\tf32: 2,\r\n\tf64: 3\r\n};\r\nconst FLOAT_ARRAY_CTORS = {\r\n\tf32: Float32Array,\r\n\tf64: Float64Array\r\n};\r\nconst INT_ARRAY_CTORS = {\r\n\ti8: Int8Array,\r\n\ti16: Int16Array,\r\n\ti32: Int32Array\r\n};\r\nconst UINT_ARRAY_CTORS = {\r\n\tu8: Uint8Array,\r\n\tu8c: Uint8ClampedArray,\r\n\tu16: Uint16Array,\r\n\tu32: Uint32Array\r\n};\r\nconst BIGINT_ARRAY_CTORS = {\r\n\ti64: BigInt64Array,\r\n\tu64: BigUint64Array\r\n};\r\nconst TYPEDARRAY_CTORS = {\r\n\t...FLOAT_ARRAY_CTORS,\r\n\t...INT_ARRAY_CTORS,\r\n\t...UINT_ARRAY_CTORS\r\n};\r\nconst asNativeType = (type) => {\r\n\tconst t = GL2TYPE[type];\r\n\treturn t !== void 0 ? t : type;\r\n};\r\nconst asGLType = (type) => {\r\n\tconst t = TYPE2GL[type];\r\n\treturn t !== void 0 ? t : type;\r\n};\r\nconst asInt = (...args) => args.map((x) => x | 0);\r\nconst sizeOf = (type) => SIZEOF[type] || SIZEOF[asNativeType(type)];\r\nfunction typedArray(type, ...xs) {\r\n\tconst ctor = BIGINT_ARRAY_CTORS[type];\r\n\treturn new (ctor || TYPEDARRAY_CTORS[asNativeType(type)])(...xs);\r\n}\r\nfunction typedArrayOfVec(type, data, stride) {\r\n\tconst $data = Array.isArray(data) ? data : [...data];\r\n\tif(stride === void 0)\r\n\t\tstride = $data[0].length;\r\n\tconst num = $data.length;\r\n\tconst res = typedArray(type, num * stride);\r\n\tfor(let i = 0, j = 0; i < num; i++, j += stride) {\r\n\t\tres.set($data[i], j);\r\n\t}\r\n\treturn res;\r\n}\r\nconst typedArrayType = (x) => {\r\n\tif(Array.isArray(x))\r\n\t\treturn 'f64';\r\n\tfor(let id in TYPEDARRAY_CTORS) {\r\n\t\tif(x instanceof TYPEDARRAY_CTORS[id])\r\n\t\t\treturn id;\r\n\t}\r\n\treturn 'f64';\r\n};\r\nconst uintTypeForSize = (x) => x <= 256 ? 'u8' : x <= 65536 ? 'u16' : 'u32';\r\nconst intTypeForSize = (x) => x >= -128 && x < 128 ? 'i8' : x >= -32768 && x < 32768 ? 'i16' : 'i32';\r\nconst uintTypeForBits = (x) => x > 16 ? 'u32' : x > 8 ? 'u16' : 'u8';\r\nconst intTypeForBits = (x) => x > 16 ? 'i32' : x > 8 ? 'i16' : 'i8';\r\nconst narrowInt = (t) => t === 'i64' ? 'i32' : t === 'i32' ? 'i16' : t === 'i16' ? 'i8' : 'i8';\r\nconst widenInt = (t) => t === 'i8' ? 'i16' : t === 'i16' ? 'i32' : t === 'i32' ? 'i64' : 'i64';\r\nconst narrowUint = (t) => t === 'u64' ? 'u32' : t === 'u32' ? 'u16' : t === 'u16' ? 'u8' : 'u8';\r\nconst widenUint = (t) => t === 'u8' || t === 'u8c' ? 'u16' : t === 'u16' ? 'u32' : t === 'u32' ? 'u64' : 'u64';\r\nconst narrowFloat = (t) => t === 'f64' ? 'f32' : 'f32';\r\nconst widenFloat = (t) => t === 'f32' ? 'f64' : 'f64';\r\nconst narrowType = (t) => t[0] === 'i' ? narrowInt(t) : t[0] === 'u' ? narrowUint(t) : narrowFloat(t);\r\nconst widenType = (t) => t[0] === 'i' ? widenInt(t) : t[0] === 'u' ? widenUint(t) : widenFloat(t);\r\nexport {\r\n\tBIGINT_ARRAY_CTORS,\r\n\tBIT_SHIFTS,\r\n\tFLOAT_ARRAY_CTORS,\r\n\tGL2TYPE,\r\n\tGLType,\r\n\tINT_ARRAY_CTORS,\r\n\tSIZEOF,\r\n\tTYPE2GL,\r\n\tTYPEDARRAY_CTORS,\r\n\tUINT_ARRAY_CTORS,\r\n\tasGLType,\r\n\tasInt,\r\n\tasNativeType,\r\n\tintTypeForBits,\r\n\tintTypeForSize,\r\n\tnarrowFloat,\r\n\tnarrowInt,\r\n\tnarrowType,\r\n\tnarrowUint,\r\n\tsizeOf,\r\n\ttypedArray,\r\n\ttypedArrayOfVec,\r\n\ttypedArrayType,\r\n\tuintTypeForBits,\r\n\tuintTypeForSize,\r\n\twidenFloat,\r\n\twidenInt,\r\n\twidenType,\r\n\twidenUint\r\n};\r\n","// Just disabling this rule instead of re-writing for now to keep asa close to original in case we want to pull updates later\r\n// Doing `block && block.fill(fill)` instead of `if(block) { block.fill(fill); }` is valid code even if it is hard to parse\r\n/* eslint-disable @typescript-eslint/no-unused-expressions */\r\n\r\nimport type { Pow2 } from './interfaces/pow2';\r\nimport type { TypedArray } from './interfaces/typed-array';\r\nimport { lock, unlock } from './lock/simple-lock';\r\nimport { typedArray } from './utils/typedarray';\r\n\r\nconst STATE_FREE = 0;\r\nconst STATE_USED = 1;\r\nconst STATE_TOP = 2;\r\nconst STATE_END = 3;\r\nconst STATE_ALIGN = 4;\r\nconst STATE_FLAGS = 5;\r\nconst STATE_MIN_SPLIT = 6;\r\n\r\nconst MASK_COMPACT = 1;\r\nconst MASK_SPLIT = 2;\r\n\r\nconst SIZEOF_STATE = 8 * 4;\r\n\r\nconst MEM_BLOCK_SIZE = 0;\r\nconst MEM_BLOCK_NEXT = 1;\r\n\r\nconst SIZEOF_MEM_BLOCK = 2 * 4;\r\n\r\n// Copied from https://github.com/thi-ng/umbrella/blob/develop/packages/malloc/src/pool.ts\r\n// Changes: Atomic.load/store on state, simple lock on malloc/free\r\n// Added bytesFor/lengthOf to be able to grab expected length of a block\r\nexport default class MemoryBuffer {\r\n\tbuf: ArrayBufferLike;\r\n\r\n\tprotected readonly start: number;\r\n\tprotected u8: Uint8Array;\r\n\tprotected u32: Uint32Array;\r\n\tprotected state: Uint32Array;\r\n\tprotected lock: Int32Array;\r\n\r\n\tconstructor(opts: Partial<MemoryBufferConfig> = {}) {\r\n\t\tthis.buf = opts.buf ? opts.buf : new ArrayBuffer(opts.size || 0x1000);\r\n\t\tthis.start = opts.start != null ? align(Math.max(opts.start, 0), 4) : 0;\r\n\t\tthis.u8 = new Uint8Array(this.buf);\r\n\t\tthis.u32 = new Uint32Array(this.buf);\r\n\t\tthis.state = new Uint32Array(this.buf, this.start, SIZEOF_STATE / 4);\r\n\t\tthis.lock = new Int32Array(this.buf, this.start + this.state.byteLength - 4, 1);\r\n\r\n\t\tif(!opts.skipInitialization) {\r\n\t\t\tconst _align = opts.align || 8;\r\n\t\t\tif(_align < 8) {\r\n\t\t\t\tthrow new Error(`invalid alignment: ${_align}, must be a pow2 and >= 8`);\r\n\t\t\t}\r\n\t\t\tconst top = this.initialTop(_align);\r\n\t\t\tconst resolvedEnd =\r\n\t\t\t\topts.end != null\r\n\t\t\t\t\t? Math.min(opts.end, this.buf.byteLength)\r\n\t\t\t\t\t: this.buf.byteLength;\r\n\r\n\t\t\tif(top >= resolvedEnd) {\r\n\t\t\t\tthrow new Error(\r\n\t\t\t\t\t`insufficient address range (0x${this.start.toString(\r\n\t\t\t\t\t\t16\r\n\t\t\t\t\t)} - 0x${resolvedEnd.toString(16)})`\r\n\t\t\t\t);\r\n\t\t\t}\r\n\r\n\t\t\tthis.align = _align;\r\n\t\t\tthis.doCompact = opts.compact !== false;\r\n\t\t\tthis.doSplit = opts.split !== false;\r\n\t\t\tthis.minSplit = opts.minSplit || 16;\r\n\t\t\tthis.end = resolvedEnd;\r\n\t\t\tthis.top = top;\r\n\t\t\tthis._free = 0;\r\n\t\t\tthis._used = 0;\r\n\t\t}\r\n\t}\r\n\r\n\tstats(): Readonly<MemoryBufferStats> {\r\n\t\tconst listStats = (block: number) => {\r\n\t\t\tlet count = 0;\r\n\t\t\tlet size = 0;\r\n\t\t\twhile(block) {\r\n\t\t\t\tcount++;\r\n\t\t\t\tsize += this.blockSize(block);\r\n\t\t\t\tblock = this.blockNext(block);\r\n\r\n\t\t\t\tif(block > this.end) {\r\n\t\t\t\t\tconsole.error(`Trying to get stats for block past end of buffer: ${block} > ${this.end}`);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn { count, size };\r\n\t\t};\r\n\t\tconst free = listStats(this._free);\r\n\t\treturn {\r\n\t\t\tfree,\r\n\t\t\tused: listStats(this._used),\r\n\t\t\ttop: this.top,\r\n\t\t\tavailable: this.end - this.top + free.size,\r\n\t\t\ttotal: this.buf.byteLength\r\n\t\t};\r\n\t}\r\n\r\n\tcallocAs<T extends Type>(type: T, num: number, fill = 0) {\r\n\t\tconst block = this.mallocAs(type, num);\r\n\t\tblock && block.fill(fill);\r\n\t\treturn block;\r\n\t}\r\n\r\n\tmallocAs<T extends Type>(type: T, num: number) {\r\n\t\tconst addr = this.malloc(num * SIZEOF[type]);\r\n\t\treturn addr ? typedArray(type, this.buf, addr, num) : undefined;\r\n\t}\r\n\r\n\tcalloc(bytes: number, fill = 0) {\r\n\t\tconst addr = this.malloc(bytes);\r\n\t\taddr && this.u8.fill(fill, addr, addr + bytes);\r\n\t\treturn addr;\r\n\t}\r\n\r\n\tmalloc(bytes: number) {\r\n\t\tif(bytes <= 0) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\tlock(this.lock);\r\n\t\tconst paddedSize = align(bytes + SIZEOF_MEM_BLOCK, this.align);\r\n\t\tconst end = this.end;\r\n\t\tlet top = this.top;\r\n\t\tlet block = this._free;\r\n\t\tlet prev = 0;\r\n\t\twhile(block) {\r\n\t\t\tconst blockSize = this.blockSize(block);\r\n\t\t\tconst isTop = block + blockSize >= top;\r\n\t\t\tif(isTop || blockSize >= paddedSize) {\r\n\t\t\t\tlet result = this.mallocTop(\r\n\t\t\t\t\tblock,\r\n\t\t\t\t\tprev,\r\n\t\t\t\t\tblockSize,\r\n\t\t\t\t\tpaddedSize,\r\n\t\t\t\t\tisTop\r\n\t\t\t\t);\r\n\r\n\t\t\t\tunlock(this.lock);\r\n\t\t\t\treturn result;\r\n\t\t\t}\r\n\t\t\tprev = block;\r\n\t\t\tblock = this.blockNext(block);\r\n\t\t}\r\n\t\tblock = top;\r\n\t\ttop = block + paddedSize;\r\n\t\tif(top <= end) {\r\n\t\t\tthis.initBlock(block, paddedSize, this._used);\r\n\t\t\tthis._used = block;\r\n\t\t\tthis.top = top;\r\n\t\t\tlet result = blockDataAddress(block);\r\n\t\t\tunlock(this.lock);\r\n\r\n\t\t\treturn result;\r\n\t\t}\r\n\t\tunlock(this.lock);\r\n\t\treturn 0;\r\n\t}\r\n\r\n\tprivate mallocTop(\r\n\t\tblock: number,\r\n\t\tprev: number,\r\n\t\tblockSize: number,\r\n\t\tpaddedSize: number,\r\n\t\tisTop: boolean\r\n\t) {\r\n\t\tif(isTop && block + paddedSize > this.end) return 0;\r\n\t\tif(prev) {\r\n\t\t\tthis.unlinkBlock(prev, block);\r\n\t\t} else {\r\n\t\t\tthis._free = this.blockNext(block);\r\n\t\t}\r\n\t\tthis.setBlockNext(block, this._used);\r\n\t\tthis._used = block;\r\n\t\tif(isTop) {\r\n\t\t\tthis.top = block + this.setBlockSize(block, paddedSize);\r\n\t\t} else if(this.doSplit) {\r\n\t\t\tconst excess = blockSize - paddedSize;\r\n\t\t\texcess >= this.minSplit &&\r\n\t\t\t\tthis.splitBlock(block, paddedSize, excess);\r\n\t\t}\r\n\t\treturn blockDataAddress(block);\r\n\t}\r\n\r\n\trealloc(ptr: number, bytes: number) {\r\n\t\tif(bytes <= 0) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\tconst oldAddr = blockSelfAddress(ptr);\r\n\t\tlet newAddr = 0;\r\n\t\tlet block = this._used;\r\n\t\tlet blockEnd = 0;\r\n\t\twhile(block) {\r\n\t\t\tif(block === oldAddr) {\r\n\t\t\t\t[newAddr, blockEnd] = this.reallocBlock(block, bytes);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tblock = this.blockNext(block);\r\n\t\t}\r\n\t\t// copy old block contents to new addr\r\n\t\tif(newAddr && newAddr !== oldAddr) {\r\n\t\t\tthis.u8.copyWithin(\r\n\t\t\t\tblockDataAddress(newAddr),\r\n\t\t\t\tblockDataAddress(oldAddr),\r\n\t\t\t\tblockEnd\r\n\t\t\t);\r\n\t\t}\r\n\t\treturn blockDataAddress(newAddr);\r\n\t}\r\n\r\n\tprivate reallocBlock(block: number, bytes: number) {\r\n\t\tconst blockSize = this.blockSize(block);\r\n\t\tconst blockEnd = block + blockSize;\r\n\t\tconst isTop = blockEnd >= this.top;\r\n\t\tconst paddedSize = align(bytes + SIZEOF_MEM_BLOCK, this.align);\r\n\t\t// shrink & possibly split existing block\r\n\t\tif(paddedSize <= blockSize) {\r\n\t\t\tif(this.doSplit) {\r\n\t\t\t\tconst excess = blockSize - paddedSize;\r\n\t\t\t\tif(excess >= this.minSplit) {\r\n\t\t\t\t\tthis.splitBlock(block, paddedSize, excess);\r\n\t\t\t\t} else if(isTop) {\r\n\t\t\t\t\tthis.top = block + paddedSize;\r\n\t\t\t\t}\r\n\t\t\t} else if(isTop) {\r\n\t\t\t\tthis.top = block + paddedSize;\r\n\t\t\t}\r\n\t\t\treturn [block, blockEnd];\r\n\t\t}\r\n\t\t// try to enlarge block if current top\r\n\t\tif(isTop && block + paddedSize < this.end) {\r\n\t\t\tthis.top = block + this.setBlockSize(block, paddedSize);\r\n\t\t\treturn [block, blockEnd];\r\n\t\t}\r\n\t\t// fallback to free & malloc\r\n\t\tthis.free(block);\r\n\t\treturn [blockSelfAddress(this.malloc(bytes)), blockEnd];\r\n\t}\r\n\r\n\treallocArray<T extends TypedArray>(array: T, num: number): T | undefined {\r\n\t\tif(array.buffer !== this.buf) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst addr = this.realloc(\r\n\t\t\tarray.byteOffset,\r\n\t\t\tnum * array.BYTES_PER_ELEMENT\r\n\t\t);\r\n\t\treturn addr\r\n\t\t\t? new (<any>array.constructor)(this.buf, addr, num)\r\n\t\t\t: undefined;\r\n\t}\r\n\r\n\tbytesFor(ptrOrArray: number | TypedArray): number | undefined {\r\n\t\tlet addr: number;\r\n\t\tif(typeof ptrOrArray !== 'number') {\r\n\t\t\tif(ptrOrArray.buffer !== this.buf) {\r\n\t\t\t\treturn undefined;\r\n\t\t\t}\r\n\t\t\taddr = ptrOrArray.byteOffset;\r\n\t\t} else {\r\n\t\t\taddr = ptrOrArray;\r\n\t\t}\r\n\r\n\t\taddr = blockSelfAddress(addr);\r\n\t\tlet block = this._used;\r\n\t\twhile(block) {\r\n\t\t\tif(block === addr) {\r\n\t\t\t\treturn this.blockSize(addr) - SIZEOF_MEM_BLOCK;\r\n\t\t\t}\r\n\t\t\tblock = this.blockNext(block);\r\n\t\t}\r\n\r\n\t\treturn undefined;\r\n\t}\r\n\tlengthOf(ptrOrArray: number | TypedArray): number | undefined {\r\n\t\tlet bytes = this.bytesFor(ptrOrArray);\r\n\t\tif(bytes) {\r\n\t\t\treturn bytes / this.u32.BYTES_PER_ELEMENT;\r\n\t\t} else {\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\t}\r\n\r\n\tfree(ptrOrArray: number | TypedArray) {\r\n\t\tlet addr: number;\r\n\t\tif(typeof ptrOrArray !== 'number') {\r\n\t\t\tif(ptrOrArray.buffer !== this.buf) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\taddr = ptrOrArray.byteOffset;\r\n\t\t} else {\r\n\t\t\taddr = ptrOrArray;\r\n\t\t}\r\n\t\tlock(this.lock);\r\n\t\taddr = blockSelfAddress(addr);\r\n\t\tlet block = this._used;\r\n\t\tlet prev = 0;\r\n\t\twhile(block) {\r\n\t\t\tif(block === addr) {\r\n\t\t\t\tif(prev) {\r\n\t\t\t\t\tthis.unlinkBlock(prev, block);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis._used = this.blockNext(block);\r\n\t\t\t\t}\r\n\t\t\t\tthis.insert(block);\r\n\t\t\t\tthis.doCompact && this.compact();\r\n\r\n\t\t\t\tunlock(this.lock);\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\tprev = block;\r\n\t\t\tblock = this.blockNext(block);\r\n\t\t}\r\n\r\n\t\tunlock(this.lock);\r\n\t\treturn false;\r\n\t}\r\n\r\n\tfreeAll() {\r\n\t\tthis._free = 0;\r\n\t\tthis._used = 0;\r\n\t\tthis.top = this.initialTop();\r\n\t}\r\n\r\n\trelease() {\r\n\t\tdelete (<any> this).u8;\r\n\t\tdelete (<any> this).u32;\r\n\t\tdelete (<any> this).state;\r\n\t\tdelete (<any> this).buf;\r\n\t\treturn true;\r\n\t}\r\n\r\n\tprotected get align() {\r\n\t\treturn <Pow2> this.state[STATE_ALIGN];\r\n\t}\r\n\r\n\tprotected set align(x: Pow2) {\r\n\t\tthis.state[STATE_ALIGN] = x;\r\n\t}\r\n\r\n\tget end() {\r\n\t\treturn this.state[STATE_END];\r\n\t}\r\n\r\n\tprotected set end(x: number) {\r\n\t\tthis.state[STATE_END] = x;\r\n\t}\r\n\r\n\tget top() {\r\n\t\treturn Atomics.load(this.state, STATE_TOP);\r\n\t}\r\n\r\n\tprotected set top(x: number) {\r\n\t\tAtomics.store(this.state, STATE_TOP, x);\r\n\t}\r\n\r\n\tprotected get _free() {\r\n\t\treturn Atomics.load(this.state, STATE_FREE);\r\n\t}\r\n\r\n\tprotected set _free(block: number) {\r\n\t\tAtomics.store(this.state, STATE_FREE, block);\r\n\t}\r\n\r\n\tprotected get _used() {\r\n\t\treturn Atomics.load(this.state, STATE_USED);\r\n\t}\r\n\r\n\tprotected set _used(block: number) {\r\n\t\tAtomics.store(this.state, STATE_USED, block);\r\n\t}\r\n\r\n\tprotected get doCompact() {\r\n\t\treturn !!(this.state[STATE_FLAGS] & MASK_COMPACT);\r\n\t}\r\n\r\n\tprotected set doCompact(flag: boolean) {\r\n\t\tflag\r\n\t\t\t? (this.state[STATE_FLAGS] |= 1 << (MASK_COMPACT - 1))\r\n\t\t\t: (this.state[STATE_FLAGS] &= ~MASK_COMPACT);\r\n\t}\r\n\r\n\tprotected get doSplit() {\r\n\t\treturn !!(this.state[STATE_FLAGS] & MASK_SPLIT);\r\n\t}\r\n\r\n\tprotected set doSplit(flag: boolean) {\r\n\t\tflag\r\n\t\t\t? (this.state[STATE_FLAGS] |= 1 << (MASK_SPLIT - 1))\r\n\t\t\t: (this.state[STATE_FLAGS] &= ~MASK_SPLIT);\r\n\t}\r\n\r\n\tprotected get minSplit() {\r\n\t\treturn this.state[STATE_MIN_SPLIT];\r\n\t}\r\n\r\n\tprotected set minSplit(x: number) {\r\n\t\tif(x <= SIZEOF_MEM_BLOCK) {\r\n\t\t\tthrow new Error(`illegal min split threshold: ${x}, require at least ${\r\n\t\t\t\tSIZEOF_MEM_BLOCK + 1\r\n\t\t\t}`);\r\n\t\t}\r\n\t\tthis.state[STATE_MIN_SPLIT] = x;\r\n\t}\r\n\r\n\tprotected blockSize(block: number) {\r\n\t\treturn Atomics.load(this.u32, (block >> 2) + MEM_BLOCK_SIZE);\r\n\t}\r\n\r\n\t/**\r\n\t * Sets & returns given block size.\r\n\t *\r\n\t * @param block -\r\n\t * @param size -\r\n\t */\r\n\tprotected setBlockSize(block: number, size: number) {\r\n\t\tAtomics.store(this.u32, (block >> 2) + MEM_BLOCK_SIZE, size);\r\n\t\treturn size;\r\n\t}\r\n\r\n\tprotected blockNext(block: number) {\r\n\t\treturn Atomics.load(this.u32, (block >> 2) + MEM_BLOCK_NEXT);\r\n\t}\r\n\r\n\t/**\r\n\t * Sets block next pointer to `next`. Use zero to indicate list end.\r\n\t *\r\n\t * @param block -\r\n\t */\r\n\tprotected setBlockNext(block: number, next: number) {\r\n\t\tAtomics.store(this.u32, (block >> 2) + MEM_BLOCK_NEXT, next);\r\n\t}\r\n\r\n\t/**\r\n\t * Initializes block header with given `size` and `next` pointer. Returns `block`.\r\n\t *\r\n\t * @param block -\r\n\t * @param size -\r\n\t * @param next -\r\n\t */\r\n\tprotected initBlock(block: number, size: number, next: number) {\r\n\t\tconst idx = block >>> 2;\r\n\t\tAtomics.store(this.u32, idx + MEM_BLOCK_SIZE, size);\r\n\t\tAtomics.store(this.u32, idx + MEM_BLOCK_NEXT, next);\r\n\t\treturn block;\r\n\t}\r\n\r\n\tprotected unlinkBlock(prev: number, block: number) {\r\n\t\tthis.setBlockNext(prev, this.blockNext(block));\r\n\t}\r\n\r\n\tprotected splitBlock(block: number, blockSize: number, excess: number) {\r\n\t\tthis.insert(\r\n\t\t\tthis.initBlock(\r\n\t\t\t\tblock + this.setBlockSize(block, blockSize),\r\n\t\t\t\texcess,\r\n\t\t\t\t0\r\n\t\t\t)\r\n\t\t);\r\n\t\tthis.doCompact && this.compact();\r\n\t}\r\n\r\n\tprotected initialTop(_align = this.align) {\r\n\t\treturn (\r\n\t\t\talign(this.start + SIZEOF_STATE + SIZEOF_MEM_BLOCK, _align) -\r\n\t\t\tSIZEOF_MEM_BLOCK\r\n\t\t);\r\n\t}\r\n\r\n\t/**\r\n\t * Traverses free list and attempts to recursively merge blocks\r\n\t * occupying consecutive memory regions. Returns true if any blocks\r\n\t * have been merged. Only called if `compact` option is enabled.\r\n\t */\r\n\tprotected compact() {\r\n\t\tlet block = this._free;\r\n\t\tlet prev = 0;\r\n\t\tlet scan = 0;\r\n\t\tlet scanPrev: number;\r\n\t\tlet res = false;\r\n\t\twhile(block) {\r\n\t\t\tscanPrev = block;\r\n\t\t\tscan = this.blockNext(block);\r\n\t\t\twhile(scan && scanPrev + this.blockSize(scanPrev) === scan) {\r\n\t\t\t\t// console.log(\"merge:\", scan.addr, scan.size);\r\n\t\t\t\tscanPrev = scan;\r\n\t\t\t\tscan = this.blockNext(scan);\r\n\t\t\t}\r\n\t\t\tif(scanPrev !== block) {\r\n\t\t\t\tconst newSize = scanPrev - block + this.blockSize(scanPrev);\r\n\t\t\t\t// console.log(\"merged size:\", newSize);\r\n\t\t\t\tthis.setBlockSize(block, newSize);\r\n\t\t\t\tconst next = this.blockNext(scanPrev);\r\n\t\t\t\tlet tmp = this.blockNext(block);\r\n\t\t\t\twhile(tmp && tmp !== next) {\r\n\t\t\t\t\t// console.log(\"release:\", tmp.addr);\r\n\t\t\t\t\tconst tn = this.blockNext(tmp);\r\n\t\t\t\t\tthis.setBlockNext(tmp, 0);\r\n\t\t\t\t\ttmp = tn;\r\n\t\t\t\t}\r\n\t\t\t\tthis.setBlockNext(block, next);\r\n\t\t\t\tres = true;\r\n\t\t\t}\r\n\t\t\t// re-adjust top if poss\r\n\t\t\tif(block + this.blockSize(block) >= this.top) {\r\n\t\t\t\tthis.top = block;\r\n\t\t\t\tprev\r\n\t\t\t\t\t? this.unlinkBlock(prev, block)\r\n\t\t\t\t\t: (this._free = this.blockNext(block));\r\n\t\t\t}\r\n\t\t\tprev = block;\r\n\t\t\tblock = this.blockNext(block);\r\n\t\t}\r\n\t\treturn res;\r\n\t}\r\n\r\n\t/**\r\n\t * Inserts given block into list of free blocks, sorted by address.\r\n\t *\r\n\t * @param block -\r\n\t */\r\n\tprotected insert(block: number) {\r\n\t\tlet ptr = this._free;\r\n\t\tlet prev = 0;\r\n\t\twhile(ptr) {\r\n\t\t\tif(block <= ptr) break;\r\n\t\t\tprev = ptr;\r\n\t\t\tptr = this.blockNext(ptr);\r\n\t\t}\r\n\t\tif(prev) {\r\n\t\t\tthis.setBlockNext(prev, block);\r\n\t\t} else {\r\n\t\t\tthis._free = block;\r\n\t\t}\r\n\t\tthis.setBlockNext(block, ptr);\r\n\t}\r\n}\r\n\r\n/**\r\n * Returns a block's data address, based on given alignment.\r\n *\r\n * @param blockAddress -\r\n */\r\nconst blockDataAddress = (blockAddress: number) => blockAddress > 0 ? blockAddress + SIZEOF_MEM_BLOCK : 0;\r\n\r\n/**\r\n * Returns block start address for given data address and alignment.\r\n *\r\n * @param dataAddress -\r\n */\r\nconst blockSelfAddress = (dataAddress: number) => dataAddress > 0 ? dataAddress - SIZEOF_MEM_BLOCK : 0;\r\n\r\nconst align = (addr: number, size: number) => (size--, addr + size & ~size);\r\nconst SIZEOF = {\r\n\tu8: 1,\r\n\tu8c: 1,\r\n\ti8: 1,\r\n\tu16: 2,\r\n\ti16: 2,\r\n\tu32: 4,\r\n\ti32: 4,\r\n\ti64: 8,\r\n\tu64: 8,\r\n\tf32: 4,\r\n\tf64: 8\r\n};\r\ntype Type = 'u8' | 'u8c' | 'i8' | 'u16' | 'i16' | 'u32' | 'i32' | 'f32' | 'f64';\r\n\r\ninterface MemoryBufferConfig {\r\n\t/**\r\n\t * Backing ArrayBuffer (or SharedArrayBuffer). If not given, a new\r\n\t * one will be created with given `size`.\r\n\t */\r\n\tbuf: ArrayBufferLike;\r\n\t/**\r\n\t * Byte size for newly created ArrayBuffers (if `buf` is not given).\r\n\t *\r\n\t * @defaultValue 0x1000 (4KB)\r\n\t */\r\n\tsize: number;\r\n\t/**\r\n\t * Anchor index (byte address) inside the array buffer. The MemPool\r\n\t * stores its internal state from the given address and heap space\r\n\t * starts at least 32 bytes later (depending on chosen `align`\r\n\t * value). Unlike allocator state variables, `start`` cannot be\r\n\t * saved inside the array buffer itself. If the ArrayBuffer is\r\n\t * passed to other consumers they must use the same start value.\r\n\t * MUST be multiple of 4.\r\n\t *\r\n\t * @defaultValue 0\r\n\t */\r\n\tstart: number;\r\n\t/**\r\n\t * Byte address (+1) of the end of the memory region managed by the\r\n\t * {@link MemPool}.\r\n\t *\r\n\t * @defaultValue end of the backing ArrayBuffer\r\n\t */\r\n\tend: number;\r\n\t/**\r\n\t * Number of bytes to align memory blocks to. MUST be a power of 2\r\n\t * and >= 8. Use 16 if the pool is being used for allocating memory\r\n\t * used in SIMD operations.\r\n\t *\r\n\t * @defaultValue 8\r\n\t */\r\n\talign: Pow2;\r\n\t/**\r\n\t * Flag to configure memory block compaction. If true,\r\n\t * adjoining free blocks (in terms of address space) will be merged\r\n\t * to minimize fragementation.\r\n\t *\r\n\t * @defaultValue true\r\n\t */\r\n\tcompact: boolean;\r\n\t/**\r\n\t * Flag to configure memory block splitting. If true, and when the\r\n\t * allocator is re-using a previously freed block larger than the\r\n\t * requested size, the block will be split to minimize wasted/unused\r\n\t * memory. The splitting behavior can further customized via the\r\n\t * `minSplit` option.\r\n\t *\r\n\t * @defaultValue true\r\n\t */\r\n\tsplit: boolean;\r\n\t/**\r\n\t * Only used if `split` behavior is enabled. Defines min number of\r\n\t * excess bytes available in a block for memory block splitting to\r\n\t * occur.\r\n\t *\r\n\t * @defaultValue 16, MUST be > 8\r\n\t */\r\n\tminSplit: number;\r\n\t/**\r\n\t * Only needed when sharing the underlying ArrayBuffer. If true, the\r\n\t * {@link MemPool} constructor will NOT initialize its internal state and\r\n\t * assume the underlying ArrayBuffer has already been initialized by\r\n\t * another {@link MemPool} instance. If this option is used, `buf` MUST be\r\n\t * given.\r\n\t *\r\n\t * @defaultValue false\r\n\t */\r\n\tskipInitialization: boolean;\r\n}\r\ninterface MemoryBufferStats {\r\n\t/**\r\n\t * Free block stats.\r\n\t */\r\n\tfree: { count: number; size: number };\r\n\t/**\r\n\t * Used block stats.\r\n\t */\r\n\tused: { count: number; size: number };\r\n\t/**\r\n\t * Current top address.\r\n\t */\r\n\ttop: number;\r\n\t/**\r\n\t * Bytes available\r\n\t */\r\n\tavailable: number;\r\n\t/**\r\n\t * Total pool size.\r\n\t */\r\n\ttotal: number;\r\n}","const BYTE_UNITS = [\n\t'B',\n\t'kB',\n\t'MB',\n\t'GB',\n\t'TB',\n\t'PB',\n\t'EB',\n\t'ZB',\n\t'YB',\n];\n\nconst BIBYTE_UNITS = [\n\t'B',\n\t'KiB',\n\t'MiB',\n\t'GiB',\n\t'TiB',\n\t'PiB',\n\t'EiB',\n\t'ZiB',\n\t'YiB',\n];\n\nconst BIT_UNITS = [\n\t'b',\n\t'kbit',\n\t'Mbit',\n\t'Gbit',\n\t'Tbit',\n\t'Pbit',\n\t'Ebit',\n\t'Zbit',\n\t'Ybit',\n];\n\nconst BIBIT_UNITS = [\n\t'b',\n\t'kibit',\n\t'Mibit',\n\t'Gibit',\n\t'Tibit',\n\t'Pibit',\n\t'Eibit',\n\t'Zibit',\n\t'Yibit',\n];\n\n/*\nFormats the given number using `Number#toLocaleString`.\n- If locale is a string, the value is expected to be a locale-key (for example: `de`).\n- If locale is true, the system default locale is used for translation.\n- If no value for locale is specified, the number is returned unmodified.\n*/\nconst toLocaleString = (number, locale, options) => {\n\tlet result = number;\n\tif (typeof locale === 'string' || Array.isArray(locale)) {\n\t\tresult = number.toLocaleString(locale, options);\n\t} else if (locale === true || options !== undefined) {\n\t\tresult = number.toLocaleString(undefined, options);\n\t}\n\n\treturn result;\n};\n\nconst log10 = numberOrBigInt => {\n\tif (typeof numberOrBigInt === 'number') {\n\t\treturn Math.log10(numberOrBigInt);\n\t}\n\n\tconst string = numberOrBigInt.toString(10);\n\n\treturn string.length + Math.log10(`0.${string.slice(0, 15)}`);\n};\n\nconst log = numberOrBigInt => {\n\tif (typeof numberOrBigInt === 'number') {\n\t\treturn Math.log(numberOrBigInt);\n\t}\n\n\treturn log10(numberOrBigInt) * Math.log(10);\n};\n\nconst divide = (numberOrBigInt, divisor) => {\n\tif (typeof numberOrBigInt === 'number') {\n\t\treturn numberOrBigInt / divisor;\n\t}\n\n\tconst integerPart = numberOrBigInt / BigInt(divisor);\n\tconst remainder = numberOrBigInt % BigInt(divisor);\n\treturn Number(integerPart) + (Number(remainder) / divisor);\n};\n\nconst applyFixedWidth = (result, fixedWidth) => {\n\tif (fixedWidth === undefined) {\n\t\treturn result;\n\t}\n\n\tif (typeof fixedWidth !== 'number' || !Number.isSafeInteger(fixedWidth) || fixedWidth < 0) {\n\t\tthrow new TypeError(`Expected fixedWidth to be a non-negative integer, got ${typeof fixedWidth}: ${fixedWidth}`);\n\t}\n\n\tif (fixedWidth === 0) {\n\t\treturn result;\n\t}\n\n\treturn result.length < fixedWidth ? result.padStart(fixedWidth, ' ') : result;\n};\n\nconst buildLocaleOptions = options => {\n\tconst {minimumFractionDigits, maximumFractionDigits} = options;\n\n\tif (minimumFractionDigits === undefined && maximumFractionDigits === undefined) {\n\t\treturn undefined;\n\t}\n\n\treturn {\n\t\t...(minimumFractionDigits !== undefined && {minimumFractionDigits}),\n\t\t...(maximumFractionDigits !== undefined && {maximumFractionDigits}),\n\t\troundingMode: 'trunc',\n\t};\n};\n\nexport default function prettyBytes(number, options) {\n\tif (typeof number !== 'bigint' && !Number.isFinite(number)) {\n\t\tthrow new TypeError(`Expected a finite number, got ${typeof number}: ${number}`);\n\t}\n\n\toptions = {\n\t\tbits: false,\n\t\tbinary: false,\n\t\tspace: true,\n\t\tnonBreakingSpace: false,\n\t\t...options,\n\t};\n\n\tconst UNITS = options.bits\n\t\t? (options.binary ? BIBIT_UNITS : BIT_UNITS)\n\t\t: (options.binary ? BIBYTE_UNITS : BYTE_UNITS);\n\n\tconst separator = options.space ? (options.nonBreakingSpace ? '\\u00A0' : ' ') : '';\n\n\t// Handle signed zero case\n\tconst isZero = typeof number === 'number' ? number === 0 : number === 0n;\n\tif (options.signed && isZero) {\n\t\tconst result = ` 0${separator}${UNITS[0]}`;\n\t\treturn applyFixedWidth(result, options.fixedWidth);\n\t}\n\n\tconst isNegative = number < 0;\n\tconst prefix = isNegative ? '-' : (options.signed ? '+' : '');\n\n\tif (isNegative) {\n\t\tnumber = -number;\n\t}\n\n\tconst localeOptions = buildLocaleOptions(options);\n\tlet result;\n\n\tif (number < 1) {\n\t\tconst numberString = toLocaleString(number, options.locale, localeOptions);\n\t\tresult = prefix + numberString + separator + UNITS[0];\n\t} else {\n\t\tconst exponent = Math.min(Math.floor(options.binary ? log(number) / Math.log(1024) : log10(number) / 3), UNITS.length - 1);\n\t\tnumber = divide(number, (options.binary ? 1024 : 1000) ** exponent);\n\n\t\tif (!localeOptions) {\n\t\t\tconst minPrecision = Math.max(3, Math.floor(number).toString().length);\n\t\t\tnumber = number.toPrecision(minPrecision);\n\t\t}\n\n\t\tconst numberString = toLocaleString(Number(number), options.locale, localeOptions);\n\t\tconst unit = UNITS[exponent];\n\t\tresult = prefix + numberString + separator + unit;\n\t}\n\n\treturn applyFixedWidth(result, options.fixedWidth);\n}\n","import AllocatedMemory, { type SharedAllocatedMemory } from './allocated-memory';\r\nimport prettyBytes from 'pretty-bytes';\r\nimport { MAX_BYTE_OFFSET_LENGTH, MAX_POSITION_LENGTH } from './utils/pointer';\r\nimport MemoryBuffer from './memory-buffer';\r\n\r\nconst DEFAULT_BUFFER_SIZE = 8_192;\r\nconst BUFFER_SIZE_INDEX = 0;\r\nconst BUFFER_COUNT_INDEX = 1;\r\nconst BUFFER_AUTO_GROW_INDEX = 2;\r\nexport default class MemoryHeap {\r\n\tbuffers: Array<MemoryBuffer>;\r\n\tprivate onGrowBufferHandlers: Array<OnGrowBuffer> = [];\r\n\tisClone: boolean;\r\n\tprivate memory: AllocatedMemory;\r\n\r\n\tget bufferSize() {\r\n\t\treturn this.memory.data[BUFFER_SIZE_INDEX];\r\n\t}\r\n\r\n\tconstructor(config?: MemoryHeapConfig | MemoryHeapMemory) {\r\n\t\tif(config && 'buffers' in config) {\r\n\t\t\tthis.buffers = config.buffers.map(buffer => {\r\n\t\t\t\treturn new MemoryBuffer({\r\n\t\t\t\t\tbuf: buffer,\r\n\t\t\t\t\tskipInitialization: true\r\n\t\t\t\t});\r\n\t\t\t});\r\n\r\n\t\t\t// TODO: This should be programic instead of hoping the first allocation is always byte 40\r\n\t\t\tthis.memory = new AllocatedMemory(this, {\r\n\t\t\t\tbufferPosition: 0,\r\n\t\t\t\tbufferByteOffset: 40\r\n\t\t\t});\r\n\t\t\tthis.isClone = true;\r\n\t\t} else {\r\n\t\t\tif(!('SharedArrayBuffer' in globalThis)) {\r\n\t\t\t\tconsole.warn('SharedArrayBuffer is not working: falling back to ArrayBuffer');\r\n\t\t\t}\r\n\r\n\t\t\tconst bufferSize = config?.bufferSize ?? DEFAULT_BUFFER_SIZE;\r\n\t\t\tif(bufferSize > MAX_BYTE_OFFSET_LENGTH) {\r\n\t\t\t\tthrow new Error(`Buffer size ${bufferSize} is greater than max ${MAX_BYTE_OFFSET_LENGTH} that we can reference with pointers`);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tlet startBuffer = this.createBuffer(bufferSize);\r\n\t\t\tthis.buffers = [\r\n\t\t\t\tstartBuffer\r\n\t\t\t];\r\n\t\t\tconst data = startBuffer.callocAs('u32', 3);\r\n\t\t\tif(data) {\r\n\t\t\t\tthis.memory = new AllocatedMemory(this, {\r\n\t\t\t\t\tbufferPosition: 0,\r\n\t\t\t\t\tbufferByteOffset: data.byteOffset\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\tthrow new Error('Failed to initialize first byte from buffer');\r\n\t\t\t}\r\n\t\t\tthis.memory.data[BUFFER_SIZE_INDEX] = bufferSize;\r\n\t\t\tthis.memory.data[BUFFER_COUNT_INDEX] = 1;\r\n\t\t\tthis.memory.data[BUFFER_AUTO_GROW_INDEX] = config?.autoGrowSize ?? 100;\r\n\t\t\tthis.isClone = false;\r\n\r\n\t\t\tfor(let i = 1; i < (config?.initialBuffers ?? 1); i++) {\r\n\t\t\t\tthis.buffers.push(this.createBuffer(bufferSize));\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\taddSharedBuffer(data: GrowBufferData) {\r\n\t\tthis.buffers[data.bufferPosition] = new MemoryBuffer({\r\n\t\t\tbuf: data.buffer,\r\n\t\t\tskipInitialization: true\r\n\t\t});\r\n\t}\r\n\r\n\tprivate growBuffer() {\r\n\t\tconst buffer = this.createBuffer();\r\n\t\tlet nextBufferPosition = Atomics.add(this.memory.data, BUFFER_COUNT_INDEX, 1);\r\n\t\t// Setting index set by internal Atomic count so we can create new buffers from multiple threads and keep position consistent\r\n\t\tthis.buffers[nextBufferPosition] = buffer;\r\n\t\tthis.onGrowBufferHandlers.forEach(handler => handler({\r\n\t\t\tbufferPosition: nextBufferPosition,\r\n\t\t\tbuffer: buffer.buf as SharedArrayBuffer\r\n\t\t}));\r\n\r\n\t\treturn buffer;\r\n\t}\r\n\tprivate createBuffer(bufferSize?: number): MemoryBuffer {\r\n\t\tconst usedBufferSize = bufferSize ?? this.bufferSize;\r\n\t\tlet buf: ArrayBuffer | SharedArrayBuffer;\r\n\t\tif('SharedArrayBuffer' in globalThis) {\r\n\t\t\tbuf = new SharedArrayBuffer(usedBufferSize);\r\n\t\t} else {\r\n\t\t\tbuf = new ArrayBuffer(usedBufferSize);\r\n\t\t}\r\n\r\n\t\treturn new MemoryBuffer({\r\n\t\t\tbuf,\r\n\r\n\t\t\t// We can't use this unless we can 100% guarantee that every thread will stop using memory the instant it is freed\r\n\t\t\t// ex: Allocate 16 bytes. Thread A frees that allocation and then allocates 12 bytes and 4 bytes, but Thread B is mid-execution on the old allocation can changes the internal state of the 4-byte allocation breaking everything\r\n\t\t\t// After the internal state is wrong MemoryBuffer will loose track of which blocks are where and how big they are\r\n\t\t\tcompact: false,\r\n\t\t\tsplit: false\r\n\t\t});\r\n\t}\r\n\r\n\taddOnGrowBufferHandlers(handler: OnGrowBuffer) {\r\n\t\tthis.onGrowBufferHandlers.push(handler);\r\n\t}\r\n\r\n\tallocUI32(count: number): AllocatedMemory {\r\n\t\tcount = Math.ceil(count);\r\n\t\tfor(let i = 0; i < this.buffers.length; i++) {\r\n\t\t\tconst buffer = this.buffers[i];\r\n\t\t\t// Should just mean we haven't synced this buffer from another thread yet\r\n\t\t\tif(!buffer) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\t// Should be fine to initialize all values as 0s since unsigned/signed ints and floats all store 0 as all 0s\r\n\t\t\tconst data = buffer.callocAs('u32', count);\r\n\t\t\tif(data) {\r\n\t\t\t\t// Auto grow when nearly full when we need buffer to already be sync'd between threads BEFORE we try to use it\r\n\t\t\t\tif(i === (this.buffers.length - 1) && Atomics.load(this.memory.data, BUFFER_COUNT_INDEX) === this.buffers.length && this.memory.data[BUFFER_AUTO_GROW_INDEX] < 100 && this.memory.data[BUFFER_AUTO_GROW_INDEX] > 0) {\r\n\t\t\t\t\tconst percentFull = buffer.top / buffer.end;\r\n\t\t\t\t\tif(percentFull > (this.memory.data[BUFFER_AUTO_GROW_INDEX] / 100)) {\r\n\t\t\t\t\t\tthis.growBuffer();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn new AllocatedMemory(this, {\r\n\t\t\t\t\tdata,\r\n\t\t\t\t\tbuffer\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif(this.buffers.length >= MAX_POSITION_LENGTH) {\r\n\t\t\tthrow new Error(`Can't initialize a new buffer since it would have a position greater than the max of ${MAX_POSITION_LENGTH}`);\r\n\t\t}\r\n\r\n\t\t// If we get here we need to grow another buffer to continue allocating new memory\r\n\t\tlet buffer = this.growBuffer();\r\n\t\tconst data = buffer.callocAs('u32', count);\r\n\t\tif(data) {\r\n\t\t\treturn new AllocatedMemory(this, {\r\n\t\t\t\tdata,\r\n\t\t\t\tbuffer\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\tthrow new Error(`Unable to allocate ${count} numbers even after adding a new buffer`);\r\n\t\t}\r\n\t}\r\n\r\n\tgetSharedAlloc(shared: SharedAllocatedMemory): AllocatedMemory | undefined {\r\n\t\t// Should just mean it hasn't synced to this thread yet\r\n\t\tif(this.buffers[shared.bufferPosition] === undefined) {\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\r\n\t\treturn new AllocatedMemory(this, shared);\r\n\t}\r\n\r\n\tget currentUsed() {\r\n\t\treturn this.totalAllocated - this.buffers.reduce((total, memPool) => total + memPool.stats().available, 0);\r\n\t}\r\n\tget totalAllocated() {\r\n\t\treturn this.buffers[0].buf.byteLength * this.buffers.length;\r\n\t}\r\n\r\n\tprettyMemory() {\r\n\t\treturn `${myPrettyBytes(this.currentUsed)} / ${myPrettyBytes(this.totalAllocated)}`;\r\n\t}\r\n\r\n\tgetSharedMemory(): MemoryHeapMemory {\r\n\t\treturn {\r\n\t\t\tbuffers: this.buffers.map(buffer => buffer.buf as SharedArrayBuffer)\r\n\t\t};\r\n\t}\r\n}\r\n\r\nfunction myPrettyBytes(bytes: number) {\r\n\treturn prettyBytes(bytes, {\r\n\t\tbinary: true,\r\n\t\tminimumFractionDigits: 1,\r\n\t\tmaximumFractionDigits: 1\r\n\t});\r\n}\r\n\r\ntype OnGrowBuffer = (newBuffer: GrowBufferData) => void;\r\ninterface GrowBufferData {\r\n\tbufferPosition: number\r\n\tbuffer: SharedArrayBuffer\r\n}\r\n\r\ninterface MemoryHeapConfig {\r\n\tbufferSize?: number\r\n\tinitialBuffers?: number\r\n\tautoGrowSize?: number\r\n}\r\ninterface MemoryHeapMemory {\r\n\tbuffers: Array<SharedArrayBuffer>\r\n}\r\n\r\nexport type { MemoryHeapConfig, MemoryHeapMemory, GrowBufferData };","import type { SharedAllocatedMemory } from './allocated-memory';\r\nimport AllocatedMemory from './allocated-memory';\r\nimport type { TypedArrayConstructor } from './interfaces/typed-array-constructor';\r\nimport type MemoryHeap from './memory-heap';\r\nimport { getPointer, loadPointer, loadRawPointer, replaceRawPointer, storePointer, storeRawPointer } from './utils/pointer';\r\n\r\nenum TYPE {\r\n\tuint32,\r\n\tint32,\r\n\tfloat32\r\n}\r\n\r\n// TODO: We need some sort of locking on insert/deletes!\r\nconst FIRST_BLOCK_RECORD_KEEPING_COUNT = 4;\r\nconst DATA_BLOCK_RECORD_KEEPING_COUNT = 1;\r\nconst LENGTH_INDEX = 2;\r\nexport default class SharedList<T extends Uint32Array | Int32Array | Float32Array = Uint32Array> implements Iterable<SharedListIterable<T>> {\r\n\tstatic readonly ALLOCATE_COUNT = FIRST_BLOCK_RECORD_KEEPING_COUNT;\r\n\r\n\tprivate memory: MemoryHeap;\r\n\t/* First block\r\n\t\t32 index 0\r\n\t\tuint16 0 - next buffer position\r\n\t\tuint16 1 - next buffer index\r\n\t\t32 index 1\r\n\t\tuint16 2 - last buffer position\r\n\t\tuint16 3 - last buffer index\r\n\t\t32 index 2\r\n\t\tuint32 4 - length\r\n\t\t32 index 3\r\n\t\tuint16 6 - type\r\n\t\tuint16 7 - data length (defaults to 1 number per data)\r\n\t*/\r\n\t/* Other blocks\r\n\t\t32 index 0\r\n\t\tuint16 0 - next buffer position\r\n\t\tuint16 1 - next buffer index\r\n\t\t32 index 1 => data\r\n\t*/\r\n\tprivate firstBlock: AllocatedMemory;\r\n\tprivate uint16Array: Uint16Array;\r\n\tonDelete?: (data: T) => void;\r\n\r\n\tget length(): number {\r\n\t\treturn Atomics.load(this.firstBlock.data, LENGTH_INDEX);\r\n\t}\r\n\t\r\n\tget type(): number {\r\n\t\treturn Atomics.load(this.uint16Array, 0);\r\n\t}\r\n\tprivate set type(value: number) {\r\n\t\tAtomics.store(this.uint16Array, 0, value);\r\n\t}\r\n\tget dataLength(): number {\r\n\t\t// Can technically be initialized by passing memory without actually every being called - need to make sure dataLength is always at least one\r\n\t\treturn Math.max(1, Atomics.load(this.uint16Array, 1));\r\n\t}\r\n\tprivate set dataLength(value: number) {\r\n\t\tAtomics.store(this.uint16Array, 1, value);\r\n\t}\r\n\r\n\tconstructor(memory: MemoryHeap, config?: SharedListConfig<T> | SharedListMemory) {\r\n\t\tthis.memory = memory;\r\n\r\n\t\tif(config && 'firstBlock' in config) {\r\n\t\t\t// TODO: How to handle referencing memory we don't have access to yet because buffer not synced from worker?\r\n\t\t\tthis.firstBlock = new AllocatedMemory(memory, config.firstBlock);\r\n\t\t\tthis.uint16Array = new Uint16Array(this.firstBlock.data.buffer, this.firstBlock.bufferByteOffset + (LENGTH_INDEX + 1) * Uint32Array.BYTES_PER_ELEMENT, 2);\r\n\t\t} else {\r\n\t\t\tif(config && config.initWithBlock) {\r\n\t\t\t\tthis.firstBlock = new AllocatedMemory(memory, config.initWithBlock);\r\n\t\t\t} else {\r\n\t\t\t\tthis.firstBlock = memory.allocUI32(FIRST_BLOCK_RECORD_KEEPING_COUNT);\r\n\t\t\t}\r\n\t\t\tthis.uint16Array = new Uint16Array(this.firstBlock.data.buffer, this.firstBlock.bufferByteOffset + (LENGTH_INDEX + 1) * Uint32Array.BYTES_PER_ELEMENT, 2);\r\n\r\n\t\t\tconst type = config?.type ?? Uint32Array;\r\n\t\t\tif(type === Uint32Array) {\r\n\t\t\t\tthis.type = TYPE.uint32;\r\n\t\t\t}\r\n\t\t\t// @ts-expect-error\r\n\t\t\telse if(type === Int32Array) {\r\n\t\t\t\tthis.type = TYPE.int32;\r\n\t\t\t}\r\n\t\t\t// @ts-expect-error\r\n\t\t\telse if(type === Float32Array) {\r\n\t\t\t\tthis.type = TYPE.float32;\r\n\t\t\t}\r\n\t\t\tthis.dataLength = config?.dataLength ?? 1;\r\n\t\t}\r\n\t}\r\n\r\n\tinsert(values: number | Array<number>) {\r\n\t\tif(typeof values === 'number') {\r\n\t\t\tvalues = [values];\r\n\t\t}\r\n\r\n\t\tlet dataLength = this.dataLength;\r\n\t\tif(values.length > dataLength) {\r\n\t\t\tthrow new Error(`Can't insert ${values.length} array into shared list of ${dataLength} dataLength`);\r\n\t\t}\r\n\t\tlet newBlock = this.memory.allocUI32(DATA_BLOCK_RECORD_KEEPING_COUNT + dataLength);\r\n\t\tlet newData = this.getDataBlock(newBlock.data);\r\n\t\tlet newBlockPointer = newBlock.pointer;\r\n\t\t\r\n\t\tfor(let i = 0; i < values.length; i++) {\r\n\t\t\tif(newData instanceof Int32Array || newData instanceof Uint32Array) {\r\n\t\t\t\tAtomics.store(newData, i, values[i]);\r\n\t\t\t} else {\r\n\t\t\t\t// TODO: Should we replace with pass thru float32 conversion -> store?\r\n\t\t\t\tnewData[i] = values[i];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tlet lastBlockPointer;\r\n\t\tlet updateWorked = false;\r\n\t\twhile(!updateWorked) {\r\n\t\t\tlastBlockPointer = loadRawPointer(this.firstBlock.data, 1);\r\n\t\t\tupdateWorked = replaceRawPointer(this.firstBlock.data, 1, newBlockPointer, lastBlockPointer);\r\n\t\t}\r\n\r\n\t\tif(lastBlockPointer) {\r\n\t\t\tlet { bufferPosition: lastBlockPosition, bufferByteOffset: lastBlockByteOffset } = getPointer(lastBlockPointer);\r\n\t\t\t// TODO: How to handle referencing memory we don't have access to yet because buffer not synced from worker?\r\n\t\t\tlet lastBlock = new Uint32Array(this.memory.buffers[lastBlockPosition].buf, lastBlockByteOffset, 1);\r\n\t\t\tstoreRawPointer(lastBlock, 0, newBlockPointer);\r\n\t\t} else {\r\n\t\t\t// First item - store on first block\r\n\t\t\tstoreRawPointer(this.firstBlock.data, 0, newBlockPointer);\r\n\t\t}\r\n\t\t\r\n\t\t// Always update new last buffer position and length\r\n\t\tAtomics.add(this.firstBlock.data, LENGTH_INDEX, 1);\r\n\t}\r\n\r\n\tdeleteMatch(callback: (values: T, index: number) => boolean): boolean {\r\n\t\tfor(let { data, index, deleteCurrent } of this) {\r\n\t\t\tif(callback(data, index)) {\r\n\t\t\t\tdeleteCurrent();\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t}\r\n\tdeleteIndex(deleteIndex: number): boolean {\r\n\t\tif(deleteIndex >= this.length || deleteIndex < 0) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn this.deleteMatch((values, index) => index === deleteIndex);\r\n\t}\r\n\tdeleteValue(deleteValues: number | Array<number>) {\r\n\t\tif(typeof deleteValues === 'number') {\r\n\t\t\treturn this.deleteMatch(values => values[0] === deleteValues);\r\n\t\t} else {\r\n\t\t\treturn this.deleteMatch(values => {\r\n\t\t\t\tif(values.length !== deleteValues.length) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tfor(let i = 0; i < values.length; i++) {\r\n\t\t\t\t\t\tif(values[i] !== deleteValues[i]) {\r\n\t\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tclear() {\r\n\t\tlet firstBlockPointer, lastBlockPointer;\r\n\t\tlet updateWorked = false;\r\n\t\twhile(!updateWorked) {\r\n\t\t\tfirstBlockPointer = loadRawPointer(this.firstBlock.data, 0);\r\n\t\t\tlastBlockPointer = loadRawPointer(this.firstBlock.data, 1);\r\n\t\t\t// Already cleared\r\n\t\t\tif(!lastBlockPointer) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tupdateWorked = replaceRawPointer(this.firstBlock.data, 1, 0, lastBlockPointer);\r\n\t\t}\r\n\t\t\r\n\t\t// Shouldn't be possible to hit: making Typescript happy\r\n\t\tif(!firstBlockPointer) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// We only want to update the last block if this is ran before something new was inserted\r\n\t\treplaceRawPointer(this.firstBlock.data, 0, 0, firstBlockPointer);\r\n\r\n\t\t// Iterate through inaccessible nodes and delete them\r\n\t\tlet deletedItems = 0;\r\n\t\tlet nextBlockPointer = firstBlockPointer;\r\n\t\twhile(nextBlockPointer) {\r\n\t\t\tlet { bufferPosition: nextBlockPosition, bufferByteOffset: nextBlockByteOffset } = getPointer(nextBlockPointer);\r\n\t\t\tlet memPool = this.memory.buffers[nextBlockPosition];\r\n\t\t\t// Short circuit iterations if we can't access memory\r\n\t\t\tif(!memPool) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tlet blockRecord = new Uint32Array(memPool.buf, nextBlockByteOffset, 2);\r\n\t\t\tnextBlockPointer = loadRawPointer(blockRecord, 0);\r\n\t\t\tdeletedItems++;\r\n\r\n\t\t\tif(this.onDelete) {\r\n\t\t\t\tthis.onDelete(this.getDataBlock(blockRecord));\r\n\t\t\t}\r\n\r\n\t\t\tmemPool.free(blockRecord.byteOffset);\r\n\t\t}\r\n\t\t\r\n\t\t// Subtract by however many we deleted so that a insert during this operation is accurate\r\n\t\tAtomics.sub(this.firstBlock.data, LENGTH_INDEX, deletedItems);\r\n\t}\r\n\r\n\t*[Symbol.iterator]() {\r\n\t\tlet currentIndex = 0;\r\n\t\tlet { bufferPosition: nextBlockPosition, bufferByteOffset: nextBlockByteOffset } = loadPointer(this.firstBlock.data, 0);\r\n\t\tlet lastBlockData = this.firstBlock.data;\r\n\t\tlet lastBlockPosition = 0;\r\n\t\tlet lastBlockByteOffset = 0;\r\n\t\twhile(nextBlockByteOffset) {\r\n\t\t\tlet memPool = this.memory.buffers[nextBlockPosition];\r\n\t\t\t// Short circuit iterations if we can't access memory\r\n\t\t\tif(!memPool) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tlet blockRecord = new Uint32Array(memPool.buf, nextBlockByteOffset, 2);\r\n\t\t\tlet blockData = this.getDataBlock(blockRecord);\r\n\r\n\t\t\tlet currentBlockPosition = nextBlockPosition;\r\n\t\t\tlet currentBlockByteOffset = nextBlockByteOffset;\r\n\t\t\t({ bufferPosition: nextBlockPosition, bufferByteOffset: nextBlockByteOffset } = loadPointer(blockRecord, 0));\r\n\r\n\t\t\tlet updateLastBlock = true;\r\n\t\t\tyield {\r\n\t\t\t\tdata: blockData,\r\n\t\t\t\tindex: currentIndex,\r\n\t\t\t\tdeleteCurrent: () => {\r\n\t\t\t\t\t// Move previous index to point to one after\r\n\t\t\t\t\tstorePointer(lastBlockData, 0, nextBlockPosition, nextBlockByteOffset);\r\n\r\n\t\t\t\t\t// If this is the last item, update last block to be previous location\r\n\t\t\t\t\tif(!nextBlockByteOffset) {\r\n\t\t\t\t\t\tstorePointer(this.firstBlock.data, 1, lastBlockPosition, lastBlockByteOffset);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif(this.onDelete) {\r\n\t\t\t\t\t\tthis.onDelete(this.getDataBlock(blockRecord));\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tmemPool.free(blockRecord.byteOffset);\r\n\t\t\t\t\tAtomics.sub(this.firstBlock.data, LENGTH_INDEX, 1);\r\n\t\t\t\t\tupdateLastBlock = false;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\tif(updateLastBlock) {\r\n\t\t\t\tlastBlockData = blockRecord;\r\n\t\t\t\tlastBlockPosition = currentBlockPosition;\r\n\t\t\t\tlastBlockByteOffset = currentBlockByteOffset;\r\n\t\t\t\tcurrentIndex++;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tforEach(callback: (data: T) => void) {\r\n\t\tfor(let value of this) {\r\n\t\t\tcallback(value.data);\r\n\t\t}\r\n\t}\r\n\r\n\tgetSharedMemory(): SharedListMemory {\r\n\t\treturn {\r\n\t\t\tfirstBlock: this.firstBlock.getSharedMemory()\r\n\t\t};\r\n\t}\r\n\r\n\tprivate getDataBlock(memory: Uint32Array): T {\r\n\t\tconst startIndex = memory.byteOffset + DATA_BLOCK_RECORD_KEEPING_COUNT * memory.BYTES_PER_ELEMENT;\r\n\r\n\t\tswitch(this.type) {\r\n\t\t\tcase TYPE.int32:\r\n\t\t\t\treturn new Int32Array(memory.buffer, startIndex, this.dataLength) as T;\r\n\t\t\tcase TYPE.uint32:\r\n\t\t\t\treturn new Uint32Array(memory.buffer, startIndex, this.dataLength) as T;\r\n\t\t\tcase TYPE.float32:\r\n\t\t\t\treturn new Float32Array(memory.buffer, startIndex, this.dataLength) as T;\r\n\t\t\tdefault:\r\n\t\t\t\tthrow new Error(`Unknown data block type ${this.type}`);\r\n\t\t}\r\n\t}\r\n\r\n\tfree() {\r\n\t\tlet { bufferPosition: nextBlockPosition, bufferByteOffset: nextBlockByteOffset } = loadPointer(this.firstBlock.data, 0);\r\n\t\twhile(nextBlockByteOffset) {\r\n\t\t\tlet allocatedMemory = new AllocatedMemory(this.memory, {\r\n\t\t\t\tbufferPosition: nextBlockPosition,\r\n\t\t\t\tbufferByteOffset: nextBlockByteOffset\r\n\t\t\t});\r\n\r\n\t\t\t({ bufferPosition: nextBlockPosition, bufferByteOffset: nextBlockByteOffset } = loadPointer(allocatedMemory.data, 0));\r\n\r\n\t\t\tif(this.onDelete) {\r\n\t\t\t\tthis.onDelete(this.getDataBlock(allocatedMemory.data));\r\n\t\t\t}\r\n\r\n\t\t\tallocatedMemory.free();\r\n\t\t}\r\n\r\n\t\tthis.firstBlock.free();\r\n\t}\r\n}\r\n\r\ninterface SharedListConfig<T extends Uint32Array | Int32Array | Float32Array> {\r\n\tinitWithBlock?: SharedAllocatedMemory\r\n\ttype?: TypedArrayConstructor<T>\r\n\tdataLength?: number\r\n}\r\ninterface SharedListMemory {\r\n\tfirstBlock: SharedAllocatedMemory\r\n}\r\n\r\ninterface SharedListIterable<T extends Uint32Array | Int32Array | Float32Array> {\r\n\tdata: T\r\n\tindex: number\r\n\tdeleteCurrent: () => void\r\n}\r\n\r\nexport { type SharedListMemory };","import AllocatedMemory, { type SharedAllocatedMemory } from './allocated-memory';\r\nimport type MemoryHeap from './memory-heap';\r\nimport SharedList from './shared-list';\r\nimport { loadPointer, storePointer } from './utils/pointer';\r\n\r\n// TODO: Grow hashMemory\r\n// TODO: Add iterator\r\n// TODO: Add read/write locks\r\nconst DEFAULT_HASH_SIZE = 10;\r\nexport default class SharedMap<K extends string | number> {\r\n\tstatic readonly ALLOCATE_COUNT = 4;\r\n\r\n\tprivate memory: MemoryHeap;\r\n\t// Memory order: Pointer, Lock, Length, MaxHash\r\n\tprivate pointerMemory: AllocatedMemory;\r\n\tprivate lock: Int32Array;\r\n\tprivate get hashMemory(): AllocatedMemory {\r\n\t\treturn new AllocatedMemory(this.memory, loadPointer(this.pointerMemory.data, 0));\r\n\t}\r\n\r\n\tget length(): number {\r\n\t\treturn Atomics.load(this.pointerMemory.data, 2);\r\n\t}\r\n\tget maxHash(): number {\r\n\t\treturn Atomics.load(this.pointerMemory.data, 3);\r\n\t}\r\n\r\n\tconstructor(memory: MemoryHeap, clone?: SharedMapMemory) {\r\n\t\tthis.memory = memory;\r\n\r\n\t\tif(clone) {\r\n\t\t\tthis.pointerMemory = new AllocatedMemory(memory, clone.firstBlock);\r\n\t\t} else {\r\n\t\t\tthis.pointerMemory = memory.allocUI32(SharedMap.ALLOCATE_COUNT);\r\n\t\t\tlet hashMemory = memory.allocUI32(DEFAULT_HASH_SIZE);\r\n\t\t\tstorePointer(this.pointerMemory.data, 0, hashMemory.bufferPosition, hashMemory.bufferByteOffset);\r\n\t\t\tAtomics.store(this.pointerMemory.data, 3, DEFAULT_HASH_SIZE);\r\n\t\t}\r\n\t\tthis.lock = new Int32Array(this.pointerMemory.data.buffer, this.pointerMemory.bufferByteOffset + Uint32Array.BYTES_PER_ELEMENT, 1);\r\n\t}\r\n\r\n\tset(key: K, value: number) {\r\n\t\tif(this.length >= this.maxHash * 2) {\r\n\t\t\tthis.growHashTable();\r\n\t\t}\r\n\r\n\t\tlet fullHashKey = get32BitHash(key);\r\n\t\tif(this.setHashKey(this.hashMemory, this.maxHash, fullHashKey, value)) {\r\n\t\t\tAtomics.add(this.pointerMemory.data, 2, 1);\r\n\t\t}\r\n\t}\r\n\tprivate setHashKey(hashMemory: AllocatedMemory, maxHash: number, fullHashKey: number, value: number) {\r\n\t\tlet hashKey = this.hash(fullHashKey, maxHash);\r\n\t\t\r\n\t\tlet list: SharedList;\r\n\t\tlet pointer = loadPointer(hashMemory.data, hashKey);\r\n\t\tif(pointer.bufferByteOffset === 0) {\r\n\t\t\t// Initialize a list here\r\n\t\t\tlist = new SharedList(this.memory, {\r\n\t\t\t\tdataLength: 2\r\n\t\t\t});\r\n\r\n\t\t\tlet listMemory = list.getSharedMemory();\r\n\t\t\tstorePointer(hashMemory.data, hashKey, listMemory.firstBlock.bufferPosition, listMemory.firstBlock.bufferByteOffset);\r\n\t\t} else {\r\n\t\t\tlist = new SharedList(this.memory, {\r\n\t\t\t\tfirstBlock: pointer\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// Check if any other items in list have the same key and delete them\r\n\t\tlet inserted = true;\r\n\t\tif(list.deleteValue(fullHashKey)) {\r\n\t\t\tinserted = false;\r\n\t\t}\r\n\t\tlist.insert([fullHashKey, value]);\r\n\t\t\r\n\t\treturn inserted;\r\n\t}\r\n\r\n\tget(key: K): number | undefined {\r\n\t\tlet fullHashKey = get32BitHash(key);\r\n\t\tlet hashKey = this.hash(fullHashKey, this.maxHash);\r\n\r\n\t\tlet pointer = loadPointer(this.hashMemory.data, hashKey);\r\n\t\tif(pointer.bufferByteOffset === 0) {\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\r\n\t\tlet list = new SharedList(this.memory, {\r\n\t\t\tfirstBlock: pointer\r\n\t\t});\r\n\r\n\t\tfor(let { data } of list) {\r\n\t\t\tif(data[0] === fullHashKey) {\r\n\t\t\t\treturn data[1];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn undefined;\r\n\t}\r\n\thas(key: K): boolean {\r\n\t\tlet fullHashKey = get32BitHash(key);\r\n\t\tlet hashKey = this.hash(fullHashKey, this.maxHash);\r\n\r\n\t\tlet pointer = loadPointer(this.hashMemory.data, hashKey);\r\n\t\tif(pointer.bufferByteOffset === 0) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tlet list = new SharedList(this.memory, {\r\n\t\t\tfirstBlock: pointer\r\n\t\t});\r\n\r\n\t\tfor(let { data } of list) {\r\n\t\t\tif(data[0] === fullHashKey) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t}\r\n\r\n\tdelete(key: K): boolean {\r\n\t\tlet fullHashKey = get32BitHash(key);\r\n\t\tlet hashKey = this.hash(fullHashKey, this.maxHash);\r\n\r\n\t\tlet pointer = loadPointer(this.hashMemory.data, hashKey);\r\n\t\tif(pointer.bufferByteOffset === 0) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tlet list = new SharedList(this.memory, {\r\n\t\t\tfirstBlock: pointer\r\n\t\t});\r\n\r\n\t\tfor(let { data, deleteCurrent } of list) {\r\n\t\t\tif(data[0] === fullHashKey) {\r\n\t\t\t\tdeleteCurrent();\r\n\r\n\t\t\t\tAtomics.sub(this.pointerMemory.data, 2, 1);\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t}\r\n\r\n\tprivate growHashTable() {\r\n\t\tlet oldMaxHash = this.maxHash;\r\n\t\tlet newMaxHash = oldMaxHash * 2;\r\n\t\tlet newHashMemory = this.memory.allocUI32(newMaxHash);\r\n\t\tlet oldHashMemory = this.hashMemory;\r\n\r\n\t\t// Copy each old hash value into new hash memory\r\n\t\tfor(let i = 0; i < oldMaxHash; i++) {\r\n\t\t\tlet pointer = loadPointer(oldHashMemory.data, i);\r\n\t\t\tif(pointer.bufferByteOffset === 0) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tlet list = new SharedList(this.memory, {\r\n\t\t\t\tfirstBlock: pointer\r\n\t\t\t});\r\n\t\t\tfor(let { data } of list) {\r\n\t\t\t\tthis.setHashKey(newHashMemory, newMaxHash, data[0], data[1]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstorePointer(this.pointerMemory.data, 0, newHashMemory.bufferPosition, newHashMemory.bufferByteOffset);\r\n\t\tAtomics.store(this.pointerMemory.data, 3, newMaxHash);\r\n\t}\r\n\r\n\tprivate hash(key: number, maxHash: number) {\r\n\t\treturn key % maxHash;\r\n\t}\r\n\r\n\tfree() {\r\n\t\t// Loop through and free lists in hash table first\r\n\t\tfor(let i = 0; i < this.maxHash; i++) {\r\n\t\t\tlet pointer = loadPointer(this.hashMemory.data, i);\r\n\t\t\tif(pointer.bufferByteOffset === 0) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tlet list = new SharedList(this.memory, {\r\n\t\t\t\tfirstBlock: pointer\r\n\t\t\t});\r\n\t\t\tlist.free();\r\n\t\t}\r\n\r\n\t\tthis.hashMemory.free();\r\n\t\tthis.pointerMemory.free();\r\n\t}\r\n\r\n\tgetSharedMemory(): SharedMapMemory {\r\n\t\treturn {\r\n\t\t\tfirstBlock: this.pointerMemory.getSharedMemory()\r\n\t\t};\r\n\t}\r\n}\r\n\r\ninterface SharedMapMemory {\r\n\tfirstBlock: SharedAllocatedMemory\r\n}\r\n\r\nfunction get32BitHash<K extends string | number>(key: K): number {\r\n\tif(typeof key === 'number') {\r\n\t\treturn key;\r\n\t} else if(typeof key === 'string') {\r\n\t\treturn hashString(key as string);\r\n\t} else {\r\n\t\treturn key;\r\n\t}\r\n}\r\n\r\n// Copied from https://github.com/mmomtchev/SharedMap/blob/master/index.js - MurmurHash2\r\nfunction hashString(str: string): number {\r\n\tlet\r\n\t\tl = str.length,\r\n\t\th = 17 ^ l,\r\n\t\ti = 0,\r\n\t\tk;\r\n\twhile(l >= 4) {\r\n\t\tk =\r\n\t\t\t((str.charCodeAt(i) & 0xff)) |\r\n\t\t\t((str.charCodeAt(++i) & 0xff) << 8) |\r\n\t\t\t((str.charCodeAt(++i) & 0xff) << 16) |\r\n\t\t\t((str.charCodeAt(++i) & 0xff) << 14);\r\n\t\tk = (((k & 0xffff) * 0x5bd1e995) + ((((k >>> 16) * 0x5bd1e995) & 0xffff) << 16));\r\n\t\tk ^= k >>> 14;\r\n\t\tk = (((k & 0xffff) * 0x5bd1e995) + ((((k >>> 16) * 0x5bd1e995) & 0xffff) << 16));\r\n\t\th = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16)) ^ k;\r\n\t\tl -= 4;\r\n\t\t++i;\r\n\t}\r\n\t/* eslint-disable no-fallthrough */\r\n\tswitch(l) {\r\n\t\tcase 3: h ^= (str.charCodeAt(i + 2) & 0xff) << 16;\r\n\t\tcase 2: h ^= (str.charCodeAt(i + 1) & 0xff) << 8;\r\n\t\tcase 1: h ^= (str.charCodeAt(i) & 0xff);\r\n\t\t\th = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16));\r\n\t}\r\n\t/* eslint-enable no-fallthrough */\r\n\th ^= h >>> 13;\r\n\th = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16));\r\n\th ^= h >>> 15;\r\n\th = h >>> 0;\r\n\treturn h;\r\n}\r\n\r\nexport type { SharedMapMemory };","import AllocatedMemory from './allocated-memory';\r\nimport type MemoryHeap from './memory-heap';\r\nimport type { SharedListMemory } from './shared-list';\r\nimport SharedList from './shared-list';\r\nimport { createPointer, loadPointer } from './utils/pointer';\r\n\r\nexport default abstract class SharedPointerList<T extends PointerItem> implements Iterable<T> {\r\n\tprivate memory: MemoryHeap;\r\n\tprivate list: SharedList;\r\n\r\n\tconstructor(heap: MemoryHeap, memory?: SharedListMemory) {\r\n\t\tthis.memory = heap;\r\n\r\n\t\tif(memory) {\r\n\t\t\tthis.list = new SharedList(heap, memory);\r\n\t\t} else {\r\n\t\t\tthis.list = new SharedList(heap);\r\n\t\t}\r\n\t}\r\n\r\n\tget length() {\r\n\t\treturn this.list.length;\r\n\t}\r\n\r\n\tinsert(item: T) {\r\n\t\tthis.list.insert(createPointer(item.memory.bufferPosition, item.memory.bufferByteOffset));\r\n\t}\r\n\tdelete(item: T) {\r\n\t\treturn this.list.deleteValue(createPointer(item.memory.bufferPosition, item.memory.bufferByteOffset));\r\n\t}\r\n\r\n\t*[Symbol.iterator]() {\r\n\t\tlet iterator = this.list[Symbol.iterator]();\r\n\r\n\t\tfor(let { data: pointerData } of iterator) {\r\n\t\t\tlet { bufferPosition, bufferByteOffset } = loadPointer(pointerData, 0);\r\n\t\t\tlet allocatedMemory = new AllocatedMemory(this.memory, {\r\n\t\t\t\tbufferPosition,\r\n\t\t\t\tbufferByteOffset\r\n\t\t\t});\r\n\t\t\tyield this.createItem(allocatedMemory);\r\n\t\t}\r\n\t}\r\n\tforEach(callback: (item: T) => void) {\r\n\t\tfor(let value of this) {\r\n\t\t\tcallback(value);\r\n\t\t}\r\n\t}\r\n\r\n\tfind(callback: (item: T) => boolean): T | undefined {\r\n\t\tfor(let value of this) {\r\n\t\t\tif(callback(value)) {\r\n\t\t\t\treturn value;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tgetSharedMemory() {\r\n\t\treturn this.list.getSharedMemory();\r\n\t}\r\n\r\n\tprotected abstract createItem(allocatedMemory: AllocatedMemory): T;\r\n\r\n\tfree() {\r\n\t\tfor(let item of this) {\r\n\t\t\t// NOTE: Anything that allocates it's own memory (ie: type for Item) needs to call free for that class so we can clear all memory recursively\r\n\t\t\tif('free' in item && typeof item.free === 'function') {\r\n\t\t\t\titem.free();\r\n\t\t\t} else {\r\n\t\t\t\titem.memory.free();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.list.free();\r\n\t}\r\n}\r\n\r\ninterface PointerItem {\r\n\treadonly memory: AllocatedMemory\r\n}","import AllocatedMemory from './allocated-memory';\r\nimport type { SharedAllocatedMemory } from './allocated-memory';\r\nimport { lock, unlock } from './lock/simple-lock';\r\nimport type MemoryHeap from './memory-heap';\r\nimport { getPointer, loadPointer, loadRawPointer, storeRawPointer } from './utils/pointer';\r\n\r\nenum CHAR_TYPE {\r\n\tUNDEFINED,\r\n\tASCII,\r\n\tUTF16\r\n}\r\nconst TYPED_ARRAY_MAP = {\r\n\t[CHAR_TYPE.ASCII]: Uint8Array,\r\n\t[CHAR_TYPE.UTF16]: Uint16Array\r\n};\r\n\r\nconst POINTER_INDEX = 0;\r\nconst LENGTH_INDEX = 1;\r\nconst TYPE_INDEX = 2;\r\nconst LOCK_INDEX = 3;\r\nexport default class SharedString {\r\n\tstatic readonly ALLOCATE_COUNT = 4;\r\n\r\n\tprivate memory: MemoryHeap;\r\n\tprivate allocatedMemory: AllocatedMemory;\r\n\tprivate lock: Int32Array;\r\n\r\n\tprivate cachedPointer?: number;\r\n\tprivate cachedString?: string;\r\n\t\r\n\tconstructor(memory: MemoryHeap, value: string | SharedStringConfig | SharedStringMemory) {\r\n\t\tthis.memory = memory;\r\n\r\n\t\tif(typeof value === 'string') {\r\n\t\t\tthis.allocatedMemory = this.memory.allocUI32(SharedString.ALLOCATE_COUNT);\r\n\t\t\tthis.lock = new Int32Array(this.allocatedMemory.data.buffer, this.allocatedMemory.bufferByteOffset + LOCK_INDEX * this.allocatedMemory.data.BYTES_PER_ELEMENT);\r\n\t\t\tthis.updateString(value);\r\n\t\t} else {\r\n\t\t\tthis.allocatedMemory = new AllocatedMemory(memory, value);\r\n\t\t\tthis.lock = new Int32Array(this.allocatedMemory.data.buffer, this.allocatedMemory.bufferByteOffset + LOCK_INDEX * this.allocatedMemory.data.BYTES_PER_ELEMENT);\r\n\r\n\t\t\t// We only allocated memory but didn't initialize the string yet\r\n\t\t\tif('value' in value) {\r\n\t\t\t\tthis.updateString(value.value);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t\r\n\tprivate updateString(value: string) {\r\n\t\tlet stringMemory = this.createString(value);\r\n\r\n\t\tlock(this.lock);\r\n\t\tstoreRawPointer(this.allocatedMemory.data, POINTER_INDEX, stringMemory.pointer);\r\n\t\tAtomics.store(this.allocatedMemory.data, LENGTH_INDEX, value.length);\r\n\t\tAtomics.store(this.allocatedMemory.data, TYPE_INDEX, stringMemory.charType);\r\n\t\tunlock(this.lock);\r\n\r\n\t\tthis.cachedPointer = stringMemory.pointer;\r\n\t\tthis.cachedString = value;\r\n\t}\r\n\tprivate createString(value: string) {\r\n\t\tif(value === '') {\r\n\t\t\treturn {\r\n\t\t\t\tpointer: 0,\r\n\t\t\t\tcharType: CHAR_TYPE.ASCII\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tlet charCodes = [];\r\n\t\tfor(let i = 0; i < value.length; i++) {\r\n\t\t\tcharCodes.push(value.charCodeAt(i));\r\n\t\t}\r\n\r\n\t\tlet maxCharCode = Math.max(...charCodes);\r\n\t\tlet charType = maxCharCode > 255 ? CHAR_TYPE.UTF16 : CHAR_TYPE.ASCII;\r\n\r\n\t\tlet typedArray = TYPED_ARRAY_MAP[charType];\r\n\t\tlet allocatedMemory = this.memory.allocUI32(Math.ceil(value.length / (4 / typedArray.BYTES_PER_ELEMENT)));\r\n\t\tlet data = new typedArray(allocatedMemory.data.buffer as ArrayBuffer, allocatedMemory.data.byteOffset, value.length);\r\n\t\tfor(let i = 0; i < value.length; i++) {\r\n\t\t\tdata[i] = value.charCodeAt(i);\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tpointer: allocatedMemory.pointer,\r\n\t\t\tcharType\r\n\t\t};\r\n\t}\r\n\r\n\tget value(): string {\r\n\t\tlet pointer = loadRawPointer(this.allocatedMemory.data, POINTER_INDEX);\r\n\t\tif(this.cachedPointer === pointer && this.cachedString !== undefined) {\r\n\t\t\treturn this.cachedString;\r\n\t\t} else if(pointer === 0) {\r\n\t\t\treturn '';\r\n\t\t}\r\n\t\tlet { bufferPosition, bufferByteOffset } = getPointer(pointer);\r\n\r\n\t\tlock(this.lock);\r\n\t\tlet charType = Atomics.load(this.allocatedMemory.data, TYPE_INDEX) as number;\r\n\t\t// @ts-expect-error\r\n\t\tlet typedArray = TYPED_ARRAY_MAP[charType];\r\n\t\tlet bufferLength = Atomics.load(this.allocatedMemory.data, LENGTH_INDEX);\r\n\r\n\t\tlet data = new typedArray(this.memory.buffers[bufferPosition].buf, bufferByteOffset, bufferLength);\r\n\t\tlet string = String.fromCharCode.apply(null, data);\r\n\t\t// NOTE: Do not unlock until after transforming the data since the second this is done it can free that memory block\r\n\t\tunlock(this.lock);\r\n\r\n\t\tthis.cachedPointer = pointer;\r\n\t\tthis.cachedString = string;\r\n\r\n\t\treturn string;\r\n\t}\r\n\tset value(value: string) {\r\n\t\tlet { bufferPosition: oldBufferPosition, bufferByteOffset: oldBufferByteOffset } = loadPointer(this.allocatedMemory.data, POINTER_INDEX);\r\n\t\tthis.updateString(value);\r\n\r\n\t\tif(oldBufferByteOffset) {\r\n\t\t\tthis.memory.buffers[oldBufferPosition].free(oldBufferByteOffset);\r\n\t\t}\r\n\t}\r\n\r\n\tgetSharedMemory(): SharedStringMemory {\r\n\t\treturn this.allocatedMemory.getSharedMemory();\r\n\t}\r\n\r\n\tget pointer() {\r\n\t\treturn this.allocatedMemory.pointer;\r\n\t}\r\n\r\n\tfree() {\r\n\t\tlet { bufferPosition, bufferByteOffset } = loadPointer(this.allocatedMemory.data, POINTER_INDEX);\r\n\t\tif(bufferByteOffset) {\r\n\t\t\tthis.memory.buffers[bufferPosition].free(bufferByteOffset);\r\n\t\t}\r\n\t\tthis.allocatedMemory.free();\r\n\t}\r\n}\r\n\r\ninterface SharedStringConfig extends SharedStringMemory {\r\n\tvalue: string\r\n}\r\ntype SharedStringMemory = SharedAllocatedMemory;","import type { SharedAllocatedMemory } from './allocated-memory';\r\nimport AllocatedMemory from './allocated-memory';\r\nimport type { TypedArrayConstructor } from './interfaces/typed-array-constructor';\r\nimport type MemoryHeap from './memory-heap';\r\nimport { getPointer, loadPointer, storePointer } from './utils/pointer';\r\n\r\nenum TYPE {\r\n\tuint32,\r\n\tint32,\r\n\tfloat32\r\n}\r\n\r\nconst VECTOR_INDEX = 0;\r\nconst LENGTH_INDEX = 1;\r\nconst BUFFER_LENGTH_INDEX = 2;\r\nconst TYPE_INDEX = 3;\r\nconst DEFAULT_SIZE = 4;\r\nexport default class SharedVector<T extends Uint32Array | Int32Array | Float32Array = Uint32Array> implements Iterable<T> {\r\n\tstatic readonly ALLOCATE_COUNT = 4;\r\n\tprivate memory: MemoryHeap;\r\n\r\n\t// Pointer, List Length, Buffer Length, Type/DataLength\r\n\tprivate firstBlock: AllocatedMemory;\r\n\tprivate uint16Array: Uint16Array;\r\n\r\n\tget length(): number {\r\n\t\treturn Atomics.load(this.firstBlock.data, LENGTH_INDEX);\r\n\t}\r\n\t\r\n\tget type(): number {\r\n\t\treturn this.uint16Array[0];\r\n\t}\r\n\tprivate set type(value: number) {\r\n\t\tAtomics.store(this.uint16Array, 0, value);\r\n\t}\r\n\tget dataLength(): number {\r\n\t\t// Can technically be initialized by passing memory without actually every being called - need to make sure dataLength is always at least one\r\n\t\treturn Math.max(1, this.uint16Array[1]);\r\n\t}\r\n\tprivate set dataLength(value: number) {\r\n\t\tAtomics.store(this.uint16Array, 1, value);\r\n\t}\r\n\r\n\tget bufferLength(): number {\r\n\t\treturn Atomics.load(this.firstBlock.data, BUFFER_LENGTH_INDEX);\r\n\t}\r\n\tprivate set bufferLength(value: number) {\r\n\t\tAtomics.store(this.firstBlock.data, BUFFER_LENGTH_INDEX, value);\r\n\t}\r\n\r\n\tget pointer() {\r\n\t\treturn this.firstBlock.pointer;\r\n\t}\r\n\r\n\tprivate cachedFullDataBlock?: T;\r\n\tprivate cachedPointer: number;\r\n\r\n\tconstructor(memory: MemoryHeap, config?: SharedVectorConfig<T> | SharedVectorMemory | SharedVectorMemory & SharedVectorConfig<T>) {\r\n\t\tthis.memory = memory;\r\n\r\n\t\tif(config && 'firstBlock' in config) {\r\n\t\t\tthis.firstBlock = new AllocatedMemory(memory, config.firstBlock);\r\n\t\t\tthis.uint16Array = new Uint16Array(this.firstBlock.data.buffer, this.firstBlock.bufferByteOffset + TYPE_INDEX * Uint32Array.BYTES_PER_ELEMENT, 2);\r\n\r\n\t\t\t// Pre-allocating memory and setting up in specific memory location\r\n\t\t\tif('type' in config || 'dataLength' in config) {\r\n\t\t\t\tlet dataBlock = memory.allocUI32(DEFAULT_SIZE * (config.dataLength ?? 1));\r\n\t\t\t\tstorePointer(this.firstBlock.data, VECTOR_INDEX, dataBlock.bufferPosition, dataBlock.bufferByteOffset);\r\n\t\t\t\tthis.bufferLength = DEFAULT_SIZE;\r\n\t\t\t\tthis.dataLength = (config.dataLength ?? 1);\r\n\t\t\t}\r\n\t\t\tif('type' in config) {\r\n\t\t\t\tconst type = config?.type ?? Uint32Array;\r\n\t\t\t\tif(type === Uint32Array) {\r\n\t\t\t\t\tthis.type = TYPE.uint32;\r\n\t\t\t\t}\r\n\t\t\t\t// @ts-expect-error\r\n\t\t\t\telse if(type === Int32Array) {\r\n\t\t\t\t\tthis.type = TYPE.int32;\r\n\t\t\t\t}\r\n\t\t\t\t// @ts-expect-error\r\n\t\t\t\telse if(type === Float32Array) {\r\n\t\t\t\t\tthis.type = TYPE.float32;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tthis.firstBlock = memory.allocUI32(SharedVector.ALLOCATE_COUNT);\r\n\t\t\tthis.uint16Array = new Uint16Array(this.firstBlock.data.buffer, this.firstBlock.bufferByteOffset + TYPE_INDEX * Uint32Array.BYTES_PER_ELEMENT, 2);\r\n\r\n\t\t\tlet dataLength = config?.dataLength ?? 1;\r\n\t\t\tlet bufferLength = config?.bufferLength ?? DEFAULT_SIZE;\r\n\t\t\tlet dataBlock = memory.allocUI32(bufferLength * dataLength);\r\n\t\t\tstorePointer(this.firstBlock.data, VECTOR_INDEX, dataBlock.bufferPosition, dataBlock.bufferByteOffset);\r\n\t\t\tthis.bufferLength = bufferLength;\r\n\r\n\t\t\tconst type = config?.type ?? Uint32Array;\r\n\t\t\tif(type === Uint32Array) {\r\n\t\t\t\tthis.type = TYPE.uint32;\r\n\t\t\t}\r\n\t\t\t// @ts-expect-error\r\n\t\t\telse if(type === Int32Array) {\r\n\t\t\t\tthis.type = TYPE.int32;\r\n\t\t\t}\r\n\t\t\t// @ts-expect-error\r\n\t\t\telse if(type === Float32Array) {\r\n\t\t\t\tthis.type = TYPE.float32;\r\n\t\t\t}\r\n\t\t\tthis.dataLength = dataLength;\r\n\t\t}\r\n\r\n\t\tthis.cachedPointer = this.firstBlock.data[0];\r\n\t\tthis.cachedFullDataBlock = this.getFullDataBlock();\r\n\t}\r\n\r\n\tat(index: number): T {\r\n\t\tlet length = this.length;\r\n\t\tif(index >= length || index < 0) {\r\n\t\t\tthrow new Error(`${index} is out of bounds ${length}`);\r\n\t\t}\r\n\r\n\t\tlet dataBlock = this.getFullDataBlock();\r\n\t\treturn this.getDataBlock(dataBlock, index);\r\n\t}\r\n\tget(index: number, dataIndex = 0): number {\r\n\t\tif(dataIndex >= this.dataLength) {\r\n\t\t\tthrow new Error(`${dataIndex} is out of dataLength bounds ${this.dataLength}`);\r\n\t\t} else if(index >= this.length || index < 0) {\r\n\t\t\tthrow new Error(`${index} is out of bounds ${this.length}`);\r\n\t\t}\r\n\r\n\t\tlet dataBlock = this.getFullDataBlock();\r\n\t\treturn dataBlock[index * this.dataLength + dataIndex];\r\n\t}\r\n\r\n\tpush(values: number | Array<number>): number {\r\n\t\tif(typeof values === 'number') {\r\n\t\t\tvalues = [values];\r\n\t\t}\r\n\r\n\t\tlet dataLength = this.dataLength;\r\n\t\tif(values.length > dataLength) {\r\n\t\t\tthrow new Error(`Can't insert ${values.length} array into shared list of ${dataLength} dataLength`);\r\n\t\t}\r\n\r\n\t\tlet dataBlock = this.getFullDataBlock();\r\n\t\tlet currentLength = this.length;\r\n\t\tdataBlock.set(values, dataLength * currentLength);\r\n\r\n\t\tlet newLength = Atomics.add(this.firstBlock.data, LENGTH_INDEX, 1) + 1;\r\n\t\tif(newLength >= this.bufferLength) {\r\n\t\t\tthis.growBuffer();\r\n\t\t}\r\n\r\n\t\treturn currentLength;\r\n\t}\r\n\r\n\tpop(): T {\r\n\t\tlet oldLength = Atomics.sub(this.firstBlock.data, LENGTH_INDEX, LENGTH_INDEX);\r\n\r\n\t\tlet dataBlock = this.getFullDataBlock();\r\n\t\treturn this.getDataBlock(dataBlock, oldLength - 1);\r\n\t}\r\n\r\n\tdeleteIndex(index: number) {\r\n\t\tlet length = this.length;\r\n\t\tif(index >= length || index < 0) {\r\n\t\t\tthrow new Error(`${index} is out of bounds ${length}`);\r\n\t\t}\r\n\r\n\t\tlet dataLength = this.dataLength;\r\n\t\tlet dataBlock = this.getFullDataBlock();\r\n\t\tfor(let i = index; i < length; i++) {\r\n\t\t\tfor(let j = 0; j < dataLength; j++) {\r\n\t\t\t\tdataBlock[i * dataLength + j] = dataBlock[(i + 1) * dataLength + j];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tAtomics.sub(this.firstBlock.data, LENGTH_INDEX, LENGTH_INDEX);\r\n\t}\r\n\r\n\tclear() {\r\n\t\tthis.firstBlock.data[LENGTH_INDEX] = 0;\r\n\t}\r\n\r\n\t*[Symbol.iterator]() {\r\n\t\tlet dataBlock = this.getFullDataBlock();\r\n\r\n\t\tfor(let i = 0; i < this.length; i++) {\r\n\t\t\tyield this.getDataBlock(dataBlock, i);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate getFullDataBlock(): T {\r\n\t\tlet pointerNumber = Atomics.load(this.firstBlock.data, VECTOR_INDEX);\r\n\t\tif(this.cachedPointer === pointerNumber && this.cachedFullDataBlock) {\r\n\t\t\treturn this.cachedFullDataBlock;\r\n\t\t}\r\n\r\n\t\tlet pointer = getPointer(pointerNumber);\r\n\t\tlet rawData = new AllocatedMemory(this.memory, pointer);\r\n\r\n\t\tlet data: T;\r\n\t\tswitch(this.type) {\r\n\t\t\tcase TYPE.int32:\r\n\t\t\t\tdata = new Int32Array(rawData.data.buffer, rawData.bufferByteOffset, this.dataLength * this.bufferLength) as T;\r\n\t\t\t\tbreak;\r\n\t\t\tcase TYPE.uint32:\r\n\t\t\t\tdata = new Uint32Array(rawData.data.buffer, rawData.bufferByteOffset, this.dataLength * this.bufferLength) as T;\r\n\t\t\t\tbreak;\r\n\t\t\tcase TYPE.float32:\r\n\t\t\t\tdata = new Float32Array(rawData.data.buffer, rawData.bufferByteOffset, this.dataLength * this.bufferLength) as T;\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\tthrow new Error(`Unknown data block type ${this.type}`);\r\n\t\t}\r\n\r\n\t\tthis.cachedPointer = pointerNumber;\r\n\t\tthis.cachedFullDataBlock = data;\r\n\r\n\t\treturn data;\r\n\t}\r\n\tprivate getDataBlock(rawData: T, index: number): T {\r\n\t\tconst start = index * this.dataLength;\r\n\t\treturn rawData.subarray(start, start + this.dataLength) as T;\r\n\t}\r\n\r\n\tprivate growBuffer() {\r\n\t\tlet oldBufferLength = this.bufferLength;\r\n\t\tlet newBufferLength = oldBufferLength * 2;\r\n\t\tlet dataLength = this.dataLength;\r\n\r\n\t\tlet oldPointer = loadPointer(this.firstBlock.data, VECTOR_INDEX);\r\n\t\tlet oldDataMemory = new AllocatedMemory(this.memory, oldPointer);\r\n\t\tlet oldDataBlock = this.getFullDataBlock();\r\n\t\tlet newDataBlock = this.memory.allocUI32(newBufferLength * dataLength);\r\n\r\n\t\tlet newData: T;\r\n\t\tswitch(this.type) {\r\n\t\t\tcase TYPE.int32:\r\n\t\t\t\tnewData = new Int32Array(newDataBlock.data.buffer, newDataBlock.bufferByteOffset, dataLength * this.bufferLength) as T;\r\n\t\t\t\tbreak;\r\n\t\t\tcase TYPE.uint32:\r\n\t\t\t\tnewData = new Uint32Array(newDataBlock.data.buffer, newDataBlock.bufferByteOffset, dataLength * this.bufferLength) as T;\r\n\t\t\t\tbreak;\r\n\t\t\tcase TYPE.float32:\r\n\t\t\t\tnewData = new Float32Array(newDataBlock.data.buffer, newDataBlock.bufferByteOffset, dataLength * this.bufferLength) as T;\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\tthrow new Error(`Unknown data block type ${this.type}`);\r\n\t\t}\r\n\r\n\t\t// Copy old buffer into new buffer\r\n\t\tnewData.set(oldDataBlock);\r\n\r\n\t\tstorePointer(this.firstBlock.data, VECTOR_INDEX, newDataBlock.bufferPosition, newDataBlock.bufferByteOffset);\r\n\t\tthis.bufferLength = newBufferLength;\r\n\t\toldDataMemory.free();\r\n\t}\r\n\r\n\tfree() {\r\n\t\tlet pointer = loadPointer(this.firstBlock.data, VECTOR_INDEX);\r\n\t\tlet dataMemory = new AllocatedMemory(this.memory, pointer);\r\n\r\n\t\tdataMemory.free();\r\n\t\tthis.firstBlock.free();\r\n\t}\r\n\r\n\tgetSharedMemory(): SharedVectorMemory {\r\n\t\treturn {\r\n\t\t\tfirstBlock: this.firstBlock.getSharedMemory()\r\n\t\t};\r\n\t}\r\n}\r\n\r\ninterface SharedVectorConfig<T extends Uint32Array | Int32Array | Float32Array> {\r\n\ttype?: TypedArrayConstructor<T>\r\n\tdataLength?: number\r\n\r\n\tbufferLength?: number\r\n}\r\ninterface SharedVectorMemory {\r\n\tfirstBlock: SharedAllocatedMemory\r\n}\r\n\r\nexport type { SharedVectorConfig, SharedVectorMemory };","import type { SharedAllocatedMemory } from './allocated-memory';\r\nimport type MemoryHeap from './memory-heap';\r\nimport SharedList, { type SharedListMemory } from './shared-list';\r\n\r\nexport default abstract class CachedItemList<T extends Item> implements Iterable<{ item: T, deleteCurrent: () => void }> {\r\n\tstatic readonly ALLOCATE_COUNT = SharedList.ALLOCATE_COUNT;\r\n\r\n\tprotected heap: MemoryHeap;\r\n\tprotected list: SharedList;\r\n\tprotected cache: Map<number, T> = new Map();\r\n\r\n\tconstructor(heap: MemoryHeap, config?: CachedListConfig | SharedListMemory) {\r\n\t\tif(config) {\r\n\t\t\tthis.list = new SharedList(heap, config);\r\n\t\t} else {\r\n\t\t\tthis.list = new SharedList(heap);\r\n\t\t}\r\n\t\tthis.heap = heap;\r\n\r\n\t\tthis.list.onDelete = (pointerData: Uint32Array) => {\r\n\t\t\tlet pointer = Atomics.load(pointerData, 0);\r\n\t\t\tif(pointer) {\r\n\t\t\t\tlet item = this.cache.get(pointer);\r\n\t\t\t\tif(!item) {\r\n\t\t\t\t\titem = this.initItem(pointer);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif(item) {\r\n\t\t\t\t\titem.free();\r\n\t\t\t\t\tthis.cache.delete(pointer);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t}\r\n\r\n\tget length() {\r\n\t\treturn this.list.length;\r\n\t}\r\n\r\n\tclear() {\r\n\t\tthis.list.clear();\r\n\t\tthis.cache.clear();\r\n\t}\r\n\r\n\tinsert(item: T) {\r\n\t\tthis.list.insert(item.pointer);\r\n\t\tthis.cache.set(item.pointer, item);\r\n\t}\r\n\tdelete(item: T) {\r\n\t\tthis.cache.delete(item.pointer);\r\n\t\treturn this.list.deleteValue(item.pointer);\r\n\t}\r\n\r\n\tgetByPointer(pointer: number): T | undefined {\r\n\t\tlet item = this.cache.get(pointer);\r\n\t\tif(!item) {\r\n\t\t\titem = this.initItem(pointer);\r\n\t\t\tif(item) {\r\n\t\t\t\tthis.cache.set(pointer, item);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn item;\r\n\t}\r\n\tprotected abstract initItem(pointer: number): T | undefined\r\n\r\n\t*[Symbol.iterator]() {\r\n\t\tlet iterator = this.list[Symbol.iterator]();\r\n\r\n\t\tfor(let { data: pointerData, deleteCurrent } of iterator) {\r\n\t\t\tlet pointer = Atomics.load(pointerData, 0);\r\n\t\t\tif(!pointer) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tlet item = this.cache.get(pointer);\r\n\t\t\tif(!item) {\r\n\t\t\t\titem = this.initItem(pointer);\r\n\t\t\t\tif(item) {\r\n\t\t\t\t\tthis.cache.set(pointer, item);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif(item) {\r\n\t\t\t\tyield {\r\n\t\t\t\t\titem,\r\n\t\t\t\t\tdeleteCurrent\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tforEach(callback: (item: T) => void, filter?: (item: T) => boolean) {\r\n\t\tfor(let { item } of this) {\r\n\t\t\tif(!filter || filter(item)) {\r\n\t\t\t\tcallback(item);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tfind(callback: (item: T) => boolean): T | undefined {\r\n\t\tfor(let { item } of this) {\r\n\t\t\tif(callback(item)) {\r\n\t\t\t\treturn item;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tfilter(callback: (entity: T) => boolean): Array<T> {\r\n\t\tlet items = [];\r\n\t\tfor(let { item } of this) {\r\n\t\t\tif(callback(item)) {\r\n\t\t\t\titems.push(item);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn items;\r\n\t}\r\n\tmap<X>(callback: (item: T) => X): Array<X> {\r\n\t\tconst array: Array<X> = [];\r\n\t\tfor(let { item } of this) {\r\n\t\t\tarray.push(callback(item));\r\n\t\t}\r\n\r\n\t\treturn array;\r\n\t}\r\n\r\n\tgetSharedMemory() {\r\n\t\treturn this.list.getSharedMemory();\r\n\t}\r\n\r\n\tfree() {\r\n\t\tthis.list.free();\r\n\t\tthis.cache.clear();\r\n\t}\r\n}\r\n\r\nexport interface CachedListConfig {\r\n\tinitWithBlock: SharedAllocatedMemory\r\n}\r\n\r\ninterface Item {\r\n\tpointer: number\r\n\tfree: () => void\r\n}","import type { SharedAllocatedMemory } from './allocated-memory';\r\nimport AllocatedMemory from './allocated-memory';\r\nimport type { TypedArrayConstructor } from './interfaces/typed-array-constructor';\r\nimport type MemoryHeap from './memory-heap';\r\nimport SharedVector from './shared-vector';\r\nimport { getPointer } from './utils/pointer';\r\n\r\nenum TYPE {\r\n\tuint32,\r\n\tint32,\r\n\tfloat32\r\n}\r\n\r\nconst LENGTH_INDEX = 0;\r\nconst TYPE_INDEX = 1;\r\nconst MAX_CHUNK_SIZE_INDEX = 2;\r\nconst POINTERS_INDEX = 3;\r\nconst RECYCLE_INDEX = POINTERS_INDEX + SharedVector.ALLOCATE_COUNT;\r\n\r\n// Array with stable indexes and maximum contiguous memory sizes (necessary to fit large data sets into max 1MB buffers)\r\n// https://plflib.org/colony.htm for future enhancements - it seems to be an optimized version of what we were aiming for with this\r\nexport default class SharedPool<T extends Uint32Array | Int32Array | Float32Array = Uint32Array> implements Iterable<T> {\r\n\tstatic readonly ALLOCATE_COUNT = 3 + SharedVector.ALLOCATE_COUNT * 2;\r\n\tprivate memory: MemoryHeap;\r\n\r\n\t// Current Length, Type/DataLength, MaxChunkLength, Pointer vector, Recycle vector\r\n\tprivate firstBlock: AllocatedMemory;\r\n\tprivate uint16Array: Uint16Array;\r\n\tprivate pointerVector: SharedVector<Uint32Array>;\r\n\tprivate recycleVector: SharedVector<Uint32Array>;\r\n\r\n\tprivate cachedFullDataBlock: { [key: number]: T } = {};\r\n\r\n\tget length(): number {\r\n\t\treturn Atomics.load(this.firstBlock.data, LENGTH_INDEX) - this.recycleVector.length;\r\n\t}\r\n\tget maxChunkSize(): number {\r\n\t\treturn this.firstBlock.data[MAX_CHUNK_SIZE_INDEX];\r\n\t}\r\n\tprivate set maxChunkSize(value: number) {\r\n\t\tAtomics.store(this.firstBlock.data, MAX_CHUNK_SIZE_INDEX, value);\r\n\t}\r\n\t\r\n\tget type(): number {\r\n\t\treturn this.uint16Array[0];\r\n\t}\r\n\tprivate set type(value: number) {\r\n\t\tAtomics.store(this.uint16Array, 0, value);\r\n\t}\r\n\tget dataLength(): number {\r\n\t\treturn Math.max(1, this.uint16Array[1]);\r\n\t}\r\n\tprivate set dataLength(value: number) {\r\n\t\tAtomics.store(this.uint16Array, 1, value);\r\n\t}\r\n\r\n\tget bufferLength(): number {\r\n\t\treturn this.maxChunkSize * this.pointerVector.length;\r\n\t}\r\n\r\n\tconstructor(memory: MemoryHeap, config?: SharedPoolConfig<T> | SharedPoolMemory) {\r\n\t\tthis.memory = memory;\r\n\r\n\t\tif(config && 'firstBlock' in config) {\r\n\t\t\tthis.firstBlock = new AllocatedMemory(memory, config.firstBlock);\r\n\t\t\tthis.uint16Array = new Uint16Array(this.firstBlock.data.buffer, this.firstBlock.bufferByteOffset + TYPE_INDEX * Uint32Array.BYTES_PER_ELEMENT, 2);\r\n\t\t\tthis.pointerVector = new SharedVector(memory, {\r\n\t\t\t\tfirstBlock: {\r\n\t\t\t\t\tbufferPosition: this.firstBlock.bufferPosition,\r\n\t\t\t\t\tbufferByteOffset: this.firstBlock.bufferByteOffset + POINTERS_INDEX * Uint32Array.BYTES_PER_ELEMENT\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\tthis.recycleVector = new SharedVector(memory, {\r\n\t\t\t\tfirstBlock: {\r\n\t\t\t\t\tbufferPosition: this.firstBlock.bufferPosition,\r\n\t\t\t\t\tbufferByteOffset: this.firstBlock.bufferByteOffset + RECYCLE_INDEX * Uint32Array.BYTES_PER_ELEMENT\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\tthis.firstBlock = memory.allocUI32(SharedPool.ALLOCATE_COUNT);\r\n\t\t\tthis.uint16Array = new Uint16Array(this.firstBlock.data.buffer, this.firstBlock.bufferByteOffset + TYPE_INDEX * Uint32Array.BYTES_PER_ELEMENT, 2);\r\n\r\n\t\t\tlet dataLength = config?.dataLength ?? 1;\r\n\t\t\tlet maxLength = config?.maxChunkSize ?? 100;\r\n\r\n\t\t\tthis.pointerVector = new SharedVector(memory, {\r\n\t\t\t\ttype: Uint32Array,\r\n\t\t\t\tfirstBlock: {\r\n\t\t\t\t\tbufferPosition: this.firstBlock.bufferPosition,\r\n\t\t\t\t\tbufferByteOffset: this.firstBlock.bufferByteOffset + POINTERS_INDEX * Uint32Array.BYTES_PER_ELEMENT\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\tthis.recycleVector = new SharedVector(memory, {\r\n\t\t\t\ttype: Uint32Array,\r\n\t\t\t\tfirstBlock: {\r\n\t\t\t\t\tbufferPosition: this.firstBlock.bufferPosition,\r\n\t\t\t\t\tbufferByteOffset: this.firstBlock.bufferByteOffset + RECYCLE_INDEX * Uint32Array.BYTES_PER_ELEMENT\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\t// TODO: Dynamically grow sub-vectors insted of using fixed length versions\r\n\t\t\tlet firstArray = memory.allocUI32(maxLength * dataLength);\r\n\t\t\tthis.pointerVector.push(firstArray.pointer);\r\n\r\n\t\t\tconst type = config?.type ?? Uint32Array;\r\n\t\t\tif(type === Uint32Array) {\r\n\t\t\t\tthis.type = TYPE.uint32;\r\n\t\t\t}\r\n\t\t\t// @ts-expect-error\r\n\t\t\telse if(type === Int32Array) {\r\n\t\t\t\tthis.type = TYPE.int32;\r\n\t\t\t}\r\n\t\t\t// @ts-expect-error\r\n\t\t\telse if(type === Float32Array) {\r\n\t\t\t\tthis.type = TYPE.float32;\r\n\t\t\t}\r\n\t\t\tthis.dataLength = dataLength;\r\n\t\t\tthis.maxChunkSize = maxLength;\r\n\t\t}\r\n\t}\r\n\r\n\tat(index: number): T {\r\n\t\tlet dataBlock = this.getFullDataBlock(index);\r\n\t\treturn this.getDataBlock(dataBlock, index % this.maxChunkSize);\r\n\t}\r\n\tget(index: number, dataIndex = 0): number {\r\n\t\tconst dataLength = this.dataLength;\r\n\t\tif(dataIndex >= dataLength) {\r\n\t\t\tthrow new Error(`${dataIndex} is out of dataLength bounds ${dataLength}`);\r\n\t\t}\r\n\r\n\t\tlet dataBlock = this.getFullDataBlock(index);\r\n\t\treturn dataBlock[(index % this.maxChunkSize) * dataLength + dataIndex];\r\n\t}\r\n\r\n\tpush(values: number | Array<number>): number {\r\n\t\tif(typeof values === 'number') {\r\n\t\t\tvalues = [values];\r\n\t\t}\r\n\r\n\t\tlet dataLength = this.dataLength;\r\n\t\tif(values.length > dataLength) {\r\n\t\t\tthrow new Error(`Can't insert ${values.length} array into shared list of ${dataLength} dataLength`);\r\n\t\t}\r\n\r\n\t\tlet newIndex;\r\n\t\tif(this.recycleVector.length) {\r\n\t\t\tnewIndex = this.recycleVector.pop()[0];\r\n\t\t} else {\r\n\t\t\tnewIndex = Atomics.add(this.firstBlock.data, LENGTH_INDEX, 1);\r\n\t\t}\r\n\t\t\r\n\t\tlet dataBlock = this.getFullDataBlock(newIndex);\r\n\t\tlet blockIndex = newIndex % this.maxChunkSize;\r\n\t\tdataBlock.set(values, dataLength * blockIndex);\r\n\r\n\t\treturn newIndex;\r\n\t}\r\n\r\n\tdeleteIndex(index: number) {\r\n\t\tthis.recycleVector.push(index);\r\n\t}\r\n\r\n\tclear() {\r\n\t\tthis.firstBlock.data[LENGTH_INDEX] = 0;\r\n\t}\r\n\r\n\t*[Symbol.iterator]() {\r\n\t\tlet recycledValues = [...this.recycleVector].reduce((array, value) => {\r\n\t\t\tarray.push(...value);\r\n\t\t\treturn array;\r\n\t\t}, [] as Array<number>);\r\n\r\n\t\tlet dataBlock = this.getFullDataBlock(0);\r\n\t\tlet dataBlockIndex = 0;\r\n\t\tfor(let i = 0; i < Atomics.load(this.firstBlock.data, LENGTH_INDEX); i++) {\r\n\t\t\tif(!recycledValues.includes(i)) {\r\n\t\t\t\tlet newDataBlockIndex = Math.floor(i / this.maxChunkSize);\r\n\t\t\t\tif(newDataBlockIndex !== dataBlockIndex) {\r\n\t\t\t\t\tdataBlock = this.getFullDataBlock(i);\r\n\t\t\t\t\tdataBlockIndex = newDataBlockIndex;\r\n\t\t\t\t}\r\n\t\t\t\tyield this.getDataBlock(dataBlock, i % this.maxChunkSize);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tprivate getFullDataBlock(index: number) {\r\n\t\tlet pointerIndex = Math.floor(index / this.maxChunkSize);\r\n\t\tlet cachedDataBlock = this.cachedFullDataBlock[pointerIndex];\r\n\t\tif(cachedDataBlock) {\r\n\t\t\treturn cachedDataBlock;\r\n\t\t}\r\n\t\tif(pointerIndex >= this.pointerVector.length) {\r\n\t\t\tlet newArray = this.memory.allocUI32(this.maxChunkSize * this.dataLength);\r\n\t\t\tthis.pointerVector.push(newArray.pointer);\r\n\t\t}\r\n\r\n\t\tlet array = new AllocatedMemory(this.memory, getPointer(this.pointerVector.get(pointerIndex)));\r\n\r\n\t\tlet data: T;\r\n\t\tswitch(this.type) {\r\n\t\t\tcase TYPE.int32:\r\n\t\t\t\tdata = new Int32Array(array.data.buffer, array.bufferByteOffset, this.dataLength * this.maxChunkSize) as T;\r\n\t\t\t\tbreak;\r\n\t\t\tcase TYPE.uint32:\r\n\t\t\t\tdata = new Uint32Array(array.data.buffer, array.bufferByteOffset, this.dataLength * this.maxChunkSize) as T;\r\n\t\t\t\tbreak;\r\n\t\t\tcase TYPE.float32:\r\n\t\t\t\tdata = new Float32Array(array.data.buffer, array.bufferByteOffset, this.dataLength * this.maxChunkSize) as T;\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\tthrow new Error(`Unknown data block type ${this.type}`);\r\n\t\t}\r\n\r\n\t\tthis.cachedFullDataBlock[pointerIndex] = data;\r\n\t\treturn data;\r\n\t}\r\n\r\n\tprivate getDataBlock(rawData: T, index: number): T {\r\n\t\tconst start = index * this.dataLength;\r\n\t\treturn rawData.subarray(start, start + this.dataLength) as T;\r\n\t}\r\n\r\n\tfree() {\r\n\t\tthis.recycleVector.free();\r\n\r\n\t\tfor(let pointerArray of this.pointerVector) {\r\n\t\t\tlet pointer = pointerArray[0];\r\n\t\t\tlet memory = new AllocatedMemory(this.memory, getPointer(pointer));\r\n\t\t\tmemory.free();\r\n\t\t}\r\n\t\tthis.pointerVector.free();\r\n\t\tthis.firstBlock.free();\r\n\t}\r\n\r\n\tgetSharedMemory(): SharedPoolMemory {\r\n\t\treturn {\r\n\t\t\tfirstBlock: this.firstBlock.getSharedMemory()\r\n\t\t};\r\n\t}\r\n}\r\n\r\ninterface SharedPoolConfig<T extends Uint32Array | Int32Array | Float32Array> {\r\n\tmaxChunkSize?: number\r\n\ttype?: TypedArrayConstructor<T>\r\n\tdataLength?: number\r\n}\r\ninterface SharedPoolMemory {\r\n\tfirstBlock: SharedAllocatedMemory\r\n}\r\n\r\nexport type { SharedPoolConfig, SharedPoolMemory };","const buffer = new ArrayBuffer(4);\r\nconst uint32Array = new Uint32Array(buffer);\r\nconst uint16Array = new Uint16Array(buffer);\r\n\r\nexport function load16From32(data: Uint32Array, index: number): [number, number] {\r\n\treturn convert32To16(Atomics.load(data, index));\r\n}\r\n\r\nexport function store16In32(data: Uint32Array, index: number, value1: number, value2: number) {\r\n\tAtomics.store(data, index, convert16To32(value1, value2));\r\n}\r\n\r\nexport function convert32To16(value: number): [number, number] {\r\n\tuint32Array[0] = value;\r\n\r\n\treturn [uint16Array[0], uint16Array[1]];\r\n}\r\nexport function convert16To32(value1: number, value2: number): number {\r\n\tuint16Array[0] = value1;\r\n\tuint16Array[1] = value2;\r\n\r\n\treturn uint32Array[0];\r\n}","const buffer = new ArrayBuffer(8);\r\nconst uint64Array = new BigUint64Array(buffer);\r\nconst uint16Array = new Uint16Array(buffer);\r\n\r\nexport function load16From64(data: BigUint64Array, index: number): [number, number, number, number] {\r\n\tuint64Array[0] = Atomics.load(data, index);\r\n\t\r\n\treturn [uint16Array[0], uint16Array[1], uint16Array[2], uint16Array[3]];\r\n}\r\n\r\nexport function store16In64(data: BigUint64Array, index: number, value1: number, value2: number, value3: number, value4: number = 0) {\r\n\tuint16Array[0] = value1;\r\n\tuint16Array[1] = value2;\r\n\tuint16Array[2] = value3;\r\n\tuint16Array[3] = value4;\r\n\r\n\tAtomics.store(data, index, uint64Array[0]);\r\n}","// For doing Atomic operations on floats in SharedArrayBuffers\r\nconst buffer = new ArrayBuffer(4);\r\nconst float32 = new Float32Array(buffer);\r\nconst int32 = new Int32Array(buffer);\r\n\r\nexport function loadFloat32(data: Int32Array | Uint32Array, index: number) {\r\n\treturn convertInt32ToFloat32(Atomics.load(data, index));\r\n}\r\nexport function storeFloat32(data: Int32Array | Uint32Array, index: number, value: number) {\r\n\tAtomics.store(data, index, convertFloat32ToInt32(value));\r\n}\r\n\r\nexport function convertInt32ToFloat32(value: number) {\r\n\tint32[0] = value;\r\n\r\n\treturn float32[0];\r\n}\r\nexport function convertFloat32ToInt32(value: number) {\r\n\tfloat32[0] = value;\r\n\r\n\treturn int32[0];\r\n}\r\n\r\nexport function exchangeFloat32(data: Int32Array | Uint32Array, index: number, value: number) {\r\n\treturn convertInt32ToFloat32(Atomics.exchange(data, index, convertFloat32ToInt32(value)));\r\n}","const UNLOCKED = 0;\r\nconst READ_LOCKED = 1;\r\nconst WRITE_LOCKED = 2;\r\n\r\nexport function readLock(data: Int32Array, index: number = 0) {\r\n\t// Wait over and over again until we get that it was unlocked or read locked\r\n\twhile(Atomics.compareExchange(data, index, UNLOCKED, READ_LOCKED) === WRITE_LOCKED) {\r\n\t\tAtomics.wait(data, index, WRITE_LOCKED);\r\n\t}\r\n\r\n\tAtomics.add(data, index + 1, 1);\r\n}\r\nexport function writeLock(data: Int32Array, index: number = 0) {\r\n\t// Write lock needs to be exclusive - wait until we were in UNLOCKED to proceed\r\n\tlet oldValue = Atomics.compareExchange(data, index, UNLOCKED, WRITE_LOCKED);\r\n\twhile(oldValue !== UNLOCKED) {\r\n\t\tAtomics.wait(data, index, oldValue);\r\n\t\toldValue = Atomics.compareExchange(data, index, UNLOCKED, WRITE_LOCKED);\r\n\t}\r\n}\r\n\r\nexport function readUnlock(data: Int32Array, index: number = 0) {\r\n\tlet readCount = Atomics.sub(data, index + 1, 1) - 1;\r\n\r\n\tif(readCount <= 0) {\r\n\t\tif(Atomics.compareExchange(data, index, READ_LOCKED, UNLOCKED) !== READ_LOCKED) {\r\n\t\t\tconsole.warn('We are unlocking when it was not read locked!');\r\n\t\t}\r\n\r\n\t\tAtomics.notify(data, index);\r\n\t}\r\n}\r\nexport function writeUnlock(data: Int32Array, index: number = 0) {\r\n\tif(Atomics.compareExchange(data, index, WRITE_LOCKED, UNLOCKED) !== WRITE_LOCKED) {\r\n\t\tconsole.warn('We are unlocking when it was not write locked!');\r\n\t}\r\n\r\n\tAtomics.notify(data, index);\r\n}\r\n\r\nexport const READ_WRITE_LOCK_ALLOCATE_COUNT = 2;"],"names":["MAX_BYTE_OFFSET_LENGTH","MAX_POSITION_LENGTH","loadPointer","data","index","getPointer","loadRawPointer","storePointer","bufferPosition","bufferByteOffset","createPointer","storeRawPointer","pointer","replacePointer","newBufferPosition","newBufferByteOffset","oldBufferPosition","oldBufferByteOffset","oldPointer","replaceRawPointer","newPointer","value","AllocatedMemory","memory","config","type","offset","length","UNLOCKED","LOCKED","lock","unlock","SIMPLE_LOCK_ALLOCATE_COUNT","GL2TYPE","FLOAT_ARRAY_CTORS","INT_ARRAY_CTORS","UINT_ARRAY_CTORS","BIGINT_ARRAY_CTORS","TYPEDARRAY_CTORS","asNativeType","typedArray","xs","ctor","STATE_FREE","STATE_USED","STATE_TOP","STATE_END","STATE_ALIGN","STATE_FLAGS","STATE_MIN_SPLIT","MASK_COMPACT","MASK_SPLIT","SIZEOF_STATE","MEM_BLOCK_SIZE","MEM_BLOCK_NEXT","SIZEOF_MEM_BLOCK","MemoryBuffer","opts","align","_align","top","resolvedEnd","listStats","block","count","size","free","num","fill","addr","SIZEOF","bytes","paddedSize","end","prev","blockSize","isTop","result","blockDataAddress","excess","ptr","oldAddr","blockSelfAddress","newAddr","blockEnd","array","ptrOrArray","x","flag","next","idx","scan","scanPrev","res","newSize","tmp","tn","blockAddress","dataAddress","BYTE_UNITS","BIBYTE_UNITS","BIT_UNITS","BIBIT_UNITS","toLocaleString","number","locale","options","log10","numberOrBigInt","string","log","divide","divisor","integerPart","remainder","applyFixedWidth","fixedWidth","buildLocaleOptions","minimumFractionDigits","maximumFractionDigits","prettyBytes","UNITS","separator","isZero","isNegative","prefix","localeOptions","numberString","exponent","minPrecision","unit","DEFAULT_BUFFER_SIZE","BUFFER_SIZE_INDEX","BUFFER_COUNT_INDEX","BUFFER_AUTO_GROW_INDEX","MemoryHeap","buffer","bufferSize","startBuffer","i","nextBufferPosition","handler","usedBufferSize","buf","shared","total","memPool","myPrettyBytes","FIRST_BLOCK_RECORD_KEEPING_COUNT","DATA_BLOCK_RECORD_KEEPING_COUNT","LENGTH_INDEX","SharedList","values","dataLength","newBlock","newData","newBlockPointer","lastBlockPointer","updateWorked","lastBlockPosition","lastBlockByteOffset","lastBlock","callback","deleteCurrent","deleteIndex","deleteValues","firstBlockPointer","deletedItems","nextBlockPointer","nextBlockPosition","nextBlockByteOffset","blockRecord","currentIndex","lastBlockData","blockData","currentBlockPosition","currentBlockByteOffset","updateLastBlock","startIndex","allocatedMemory","DEFAULT_HASH_SIZE","SharedMap","clone","hashMemory","key","fullHashKey","get32BitHash","maxHash","hashKey","list","listMemory","inserted","oldMaxHash","newMaxHash","newHashMemory","oldHashMemory","hashString","str","l","h","k","SharedPointerList","heap","item","iterator","pointerData","TYPED_ARRAY_MAP","POINTER_INDEX","TYPE_INDEX","LOCK_INDEX","SharedString","stringMemory","charCodes","charType","bufferLength","VECTOR_INDEX","BUFFER_LENGTH_INDEX","DEFAULT_SIZE","SharedVector","dataBlock","dataIndex","currentLength","oldLength","j","pointerNumber","rawData","start","newBufferLength","oldDataMemory","oldDataBlock","newDataBlock","CachedItemList","filter","items","MAX_CHUNK_SIZE_INDEX","POINTERS_INDEX","RECYCLE_INDEX","SharedPool","maxLength","firstArray","newIndex","blockIndex","recycledValues","dataBlockIndex","newDataBlockIndex","pointerIndex","cachedDataBlock","newArray","pointerArray","uint32Array","uint16Array","load16From32","convert32To16","store16In32","value1","value2","convert16To32","uint64Array","load16From64","store16In64","value3","value4","float32","int32","loadFloat32","convertInt32ToFloat32","storeFloat32","convertFloat32ToInt32","exchangeFloat32","READ_LOCKED","WRITE_LOCKED","readLock","writeLock","oldValue","readUnlock","writeUnlock","READ_WRITE_LOCK_ALLOCATE_COUNT"],"mappings":"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","x_google_ignoreList":[5]}
|
|
1
|
+
{"version":3,"file":"shared-memory-objects.umd.cjs","sources":["../src/utils/pointer.ts","../src/allocated-memory.ts","../src/lock/simple-lock.ts","../src/utils/typedarray.js","../src/memory-buffer.ts","../node_modules/pretty-bytes/index.js","../src/memory-heap.ts","../src/shared-list.ts","../src/shared-map.ts","../src/shared-pointer-list.ts","../src/shared-string.ts","../src/shared-vector.ts","../src/cached-item-list.ts","../src/shared-pool.ts","../src/utils/16-from-32-array.ts","../src/utils/16-from-64-array.ts","../src/utils/float32-atomics.ts","../src/utils/atomic-math.ts","../src/utils/float64-atomics.ts","../src/lock/read-write-lock.ts"],"sourcesContent":["// bottom 12 bits (4096) for bufferPosition\r\n// top 20 bits (1MB) for bufferByteOffset\r\nconst BYTE_OFFSET_BIT_COUNT = 20;\r\nconst POSITION_BIT_COUNT = 32 - BYTE_OFFSET_BIT_COUNT;\r\nconst MAX_BYTE_OFFSET_LENGTH = Math.pow(2, BYTE_OFFSET_BIT_COUNT);\r\nconst MAX_POSITION_LENGTH = Math.pow(2, POSITION_BIT_COUNT);\r\n\r\nexport function loadPointer(data: Uint32Array, index: number = 0) {\r\n\treturn getPointer(Atomics.load(data, index));\r\n}\r\nexport function loadRawPointer(data: Uint32Array, index: number = 0) {\r\n\treturn Atomics.load(data, index);\r\n}\r\n\r\nexport function storePointer(data: Uint32Array, index: number = 0, bufferPosition: number, bufferByteOffset: number) {\r\n\tAtomics.store(data, index, createPointer(bufferPosition, bufferByteOffset));\r\n}\r\nexport function storeRawPointer(data: Uint32Array, index: number = 0, pointer: number) {\r\n\tAtomics.store(data, index, pointer);\r\n}\r\n\r\nexport function replacePointer(data: Uint32Array, index: number, newBufferPosition: number, newBufferByteOffset: number, oldBufferPosition: number, oldBufferByteOffset: number) {\r\n\tlet oldPointer = createPointer(oldBufferPosition, oldBufferByteOffset);\r\n\treturn Atomics.compareExchange(data, index, oldPointer, createPointer(newBufferPosition, newBufferByteOffset)) === oldPointer;\r\n}\r\nexport function replaceRawPointer(data: Uint32Array, index: number, newPointer: number, oldPointer: number): boolean {\r\n\treturn Atomics.compareExchange(data, index, oldPointer, newPointer) === oldPointer;\r\n}\r\n\r\nexport function getPointer(value: number) {\r\n\treturn {\r\n\t\tbufferPosition: value & 0b00000000000000000000111111111111,\r\n\t\tbufferByteOffset: value >>> POSITION_BIT_COUNT\r\n\t};\r\n}\r\nexport function createPointer(bufferPosition: number, bufferByteOffset: number) {\r\n\treturn bufferPosition + (bufferByteOffset << POSITION_BIT_COUNT);\r\n}\r\n\r\nexport { BYTE_OFFSET_BIT_COUNT, POSITION_BIT_COUNT, MAX_BYTE_OFFSET_LENGTH, MAX_POSITION_LENGTH };","import type { TypedArray } from './interfaces/typed-array';\r\nimport type { TypedArrayConstructor } from './interfaces/typed-array-constructor';\r\nimport type MemoryBuffer from './memory-buffer';\r\nimport type MemoryHeap from './memory-heap';\r\nimport { createPointer } from './utils/pointer';\r\n\r\nexport default class AllocatedMemory {\r\n\tprivate readonly memory: MemoryHeap;\r\n\r\n\treadonly bufferPosition: number;\r\n\tget bufferByteOffset(): number {\r\n\t\treturn this.data.byteOffset;\r\n\t}\r\n\tget pointer(): number {\r\n\t\treturn createPointer(this.bufferPosition, this.bufferByteOffset);\r\n\t}\r\n\tprivate buffer: MemoryBuffer;\r\n\tdata: Uint32Array;\r\n\r\n\tconstructor(memory: MemoryHeap, config: AllocatedMemoryConfig | SharedAllocatedMemory) {\r\n\t\tthis.memory = memory;\r\n\r\n\t\tif('buffer' in config) {\r\n\t\t\tthis.data = config.data;\r\n\t\t\tthis.buffer = config.buffer;\r\n\t\t\tthis.bufferPosition = this.memory.buffers.indexOf(config.buffer);\r\n\t\t} else {\r\n\t\t\tthis.bufferPosition = config.bufferPosition;\r\n\t\t\tthis.buffer = memory.buffers[config.bufferPosition];\r\n\r\n\t\t\t// Making sure these are the correct size is slow but in dev we want to make sure we aren't allowing to go out of bounds\r\n\t\t\tif(import.meta.env.MODE === 'production') {\r\n\t\t\t\tthis.data = new Uint32Array(this.buffer.buf, config.bufferByteOffset);\r\n\t\t\t} else {\r\n\t\t\t\tthis.data = new Uint32Array(this.buffer.buf, config.bufferByteOffset, this.buffer.lengthOf(config.bufferByteOffset));\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tgetArray<T extends TypedArray>(type: TypedArrayConstructor<T>, offset: number, length: number): T {\r\n\t\tif(import.meta.env.MODE === 'development' || import.meta.env.MODE === 'test') {\r\n\t\t\tif((offset + length) * type.BYTES_PER_ELEMENT > this.data.byteLength) {\r\n\t\t\t\tconst message = `Trying to grab more memory from AllocatedMemory.getArray then we have: ${offset * type.BYTES_PER_ELEMENT} + ${length * type.BYTES_PER_ELEMENT} > ${this.data.byteLength}`;\r\n\t\t\t\tif(import.meta.env.MODE === 'test') {\r\n\t\t\t\t\tthrow new Error(message);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tconsole.warn(message);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn new type(this.data.buffer, this.data.byteOffset + offset * type.BYTES_PER_ELEMENT, length);\r\n\t}\r\n\tgetArrayMemory(offset: number, length: number): SharedAllocatedMemory {\r\n\t\tif(import.meta.env.MODE === 'development') {\r\n\t\t\tif(offset + length > this.data.length) {\r\n\t\t\t\tconsole.warn(`Trying to grab more memory from AllocatedMemory.getArrayMemory then we have: ${offset} + ${length} > ${this.data.length}`);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tbufferPosition: this.bufferPosition,\r\n\t\t\tbufferByteOffset: this.bufferByteOffset + offset * this.data.BYTES_PER_ELEMENT\r\n\t\t};\r\n\t}\r\n\r\n\tfree() {\r\n\t\t// NOTE: From worker thread you can't pass the array, you have to pass an explicit address to free\r\n\t\tthis.buffer.free(this.data.byteOffset);\r\n\t}\r\n\r\n\tgetSharedMemory(): SharedAllocatedMemory {\r\n\t\treturn {\r\n\t\t\tbufferPosition: this.bufferPosition,\r\n\t\t\tbufferByteOffset: this.bufferByteOffset\r\n\t\t};\r\n\t}\r\n}\r\n\r\ninterface AllocatedMemoryConfig {\r\n\tdata: Uint32Array\r\n\tbuffer: MemoryBuffer\r\n}\r\n\r\ninterface SharedAllocatedMemory {\r\n\tbufferPosition: number\r\n\tbufferByteOffset: number\r\n}\r\nexport type { SharedAllocatedMemory };","const UNLOCKED = 0;\r\nconst LOCKED = 1;\r\nexport function lock(data: Int32Array, index: number = 0) {\r\n\t// Wait over and over again until we are one who set this from UNLOCKED to LOCKED\r\n\twhile(Atomics.compareExchange(data, index, UNLOCKED, LOCKED) !== UNLOCKED) {\r\n\t\tif('WorkerGlobalScope' in self) {\r\n\t\t\tAtomics.wait(data, index, LOCKED);\r\n\t\t} else {\r\n\t\t\t// TODO: Spin-locks suck....\r\n\t\t}\r\n\t}\r\n}\r\nexport function unlock(data: Int32Array, index: number = 0) {\r\n\tif(Atomics.compareExchange(data, index, LOCKED, UNLOCKED) !== LOCKED) {\r\n\t\tconsole.warn('We are unlocking when it was not locked!');\r\n\t}\r\n\r\n\tAtomics.notify(data, index);\r\n}\r\n\r\nexport const SIMPLE_LOCK_ALLOCATE_COUNT = 1;","// Copied from @thi.ng/api/typedarray\r\n// TODO: rewrite without this but for now just forked in order to add Atomics to base library\r\n\r\nvar GLType = /* @__PURE__ */ ((GLType2) => {\r\n\tGLType2[GLType2['I8'] = 5120] = 'I8';\r\n\tGLType2[GLType2['U8'] = 5121] = 'U8';\r\n\tGLType2[GLType2['I16'] = 5122] = 'I16';\r\n\tGLType2[GLType2['U16'] = 5123] = 'U16';\r\n\tGLType2[GLType2['I32'] = 5124] = 'I32';\r\n\tGLType2[GLType2['U32'] = 5125] = 'U32';\r\n\tGLType2[GLType2['F32'] = 5126] = 'F32';\r\n\treturn GLType2;\r\n})(GLType || {});\r\nconst GL2TYPE = {\r\n\t[5120 /* I8 */]: 'i8',\r\n\t[5121 /* U8 */]: 'u8',\r\n\t[5122 /* I16 */]: 'i16',\r\n\t[5123 /* U16 */]: 'u16',\r\n\t[5124 /* I32 */]: 'i32',\r\n\t[5125 /* U32 */]: 'u32',\r\n\t[5126 /* F32 */]: 'f32'\r\n};\r\nconst TYPE2GL = {\r\n\ti8: 5120 /* I8 */,\r\n\tu8: 5121 /* U8 */,\r\n\tu8c: 5121 /* U8 */,\r\n\ti16: 5122 /* I16 */,\r\n\tu16: 5123 /* U16 */,\r\n\ti32: 5124 /* I32 */,\r\n\tu32: 5125 /* U32 */,\r\n\tf32: 5126 /* F32 */,\r\n\tf64: void 0\r\n};\r\nconst SIZEOF = {\r\n\tu8: 1,\r\n\tu8c: 1,\r\n\ti8: 1,\r\n\tu16: 2,\r\n\ti16: 2,\r\n\tu32: 4,\r\n\ti32: 4,\r\n\ti64: 8,\r\n\tu64: 8,\r\n\tf32: 4,\r\n\tf64: 8\r\n};\r\nconst BIT_SHIFTS = {\r\n\ti8: 0,\r\n\tu8: 0,\r\n\tu8c: 0,\r\n\ti16: 1,\r\n\tu16: 1,\r\n\ti32: 2,\r\n\tu32: 2,\r\n\ti64: 3,\r\n\tu64: 3,\r\n\tf32: 2,\r\n\tf64: 3\r\n};\r\nconst FLOAT_ARRAY_CTORS = {\r\n\tf32: Float32Array,\r\n\tf64: Float64Array\r\n};\r\nconst INT_ARRAY_CTORS = {\r\n\ti8: Int8Array,\r\n\ti16: Int16Array,\r\n\ti32: Int32Array\r\n};\r\nconst UINT_ARRAY_CTORS = {\r\n\tu8: Uint8Array,\r\n\tu8c: Uint8ClampedArray,\r\n\tu16: Uint16Array,\r\n\tu32: Uint32Array\r\n};\r\nconst BIGINT_ARRAY_CTORS = {\r\n\ti64: BigInt64Array,\r\n\tu64: BigUint64Array\r\n};\r\nconst TYPEDARRAY_CTORS = {\r\n\t...FLOAT_ARRAY_CTORS,\r\n\t...INT_ARRAY_CTORS,\r\n\t...UINT_ARRAY_CTORS\r\n};\r\nconst asNativeType = (type) => {\r\n\tconst t = GL2TYPE[type];\r\n\treturn t !== void 0 ? t : type;\r\n};\r\nconst asGLType = (type) => {\r\n\tconst t = TYPE2GL[type];\r\n\treturn t !== void 0 ? t : type;\r\n};\r\nconst asInt = (...args) => args.map((x) => x | 0);\r\nconst sizeOf = (type) => SIZEOF[type] || SIZEOF[asNativeType(type)];\r\nfunction typedArray(type, ...xs) {\r\n\tconst ctor = BIGINT_ARRAY_CTORS[type];\r\n\treturn new (ctor || TYPEDARRAY_CTORS[asNativeType(type)])(...xs);\r\n}\r\nfunction typedArrayOfVec(type, data, stride) {\r\n\tconst $data = Array.isArray(data) ? data : [...data];\r\n\tif(stride === void 0)\r\n\t\tstride = $data[0].length;\r\n\tconst num = $data.length;\r\n\tconst res = typedArray(type, num * stride);\r\n\tfor(let i = 0, j = 0; i < num; i++, j += stride) {\r\n\t\tres.set($data[i], j);\r\n\t}\r\n\treturn res;\r\n}\r\nconst typedArrayType = (x) => {\r\n\tif(Array.isArray(x))\r\n\t\treturn 'f64';\r\n\tfor(let id in TYPEDARRAY_CTORS) {\r\n\t\tif(x instanceof TYPEDARRAY_CTORS[id])\r\n\t\t\treturn id;\r\n\t}\r\n\treturn 'f64';\r\n};\r\nconst uintTypeForSize = (x) => x <= 256 ? 'u8' : x <= 65536 ? 'u16' : 'u32';\r\nconst intTypeForSize = (x) => x >= -128 && x < 128 ? 'i8' : x >= -32768 && x < 32768 ? 'i16' : 'i32';\r\nconst uintTypeForBits = (x) => x > 16 ? 'u32' : x > 8 ? 'u16' : 'u8';\r\nconst intTypeForBits = (x) => x > 16 ? 'i32' : x > 8 ? 'i16' : 'i8';\r\nconst narrowInt = (t) => t === 'i64' ? 'i32' : t === 'i32' ? 'i16' : t === 'i16' ? 'i8' : 'i8';\r\nconst widenInt = (t) => t === 'i8' ? 'i16' : t === 'i16' ? 'i32' : t === 'i32' ? 'i64' : 'i64';\r\nconst narrowUint = (t) => t === 'u64' ? 'u32' : t === 'u32' ? 'u16' : t === 'u16' ? 'u8' : 'u8';\r\nconst widenUint = (t) => t === 'u8' || t === 'u8c' ? 'u16' : t === 'u16' ? 'u32' : t === 'u32' ? 'u64' : 'u64';\r\nconst narrowFloat = (t) => t === 'f64' ? 'f32' : 'f32';\r\nconst widenFloat = (t) => t === 'f32' ? 'f64' : 'f64';\r\nconst narrowType = (t) => t[0] === 'i' ? narrowInt(t) : t[0] === 'u' ? narrowUint(t) : narrowFloat(t);\r\nconst widenType = (t) => t[0] === 'i' ? widenInt(t) : t[0] === 'u' ? widenUint(t) : widenFloat(t);\r\nexport {\r\n\tBIGINT_ARRAY_CTORS,\r\n\tBIT_SHIFTS,\r\n\tFLOAT_ARRAY_CTORS,\r\n\tGL2TYPE,\r\n\tGLType,\r\n\tINT_ARRAY_CTORS,\r\n\tSIZEOF,\r\n\tTYPE2GL,\r\n\tTYPEDARRAY_CTORS,\r\n\tUINT_ARRAY_CTORS,\r\n\tasGLType,\r\n\tasInt,\r\n\tasNativeType,\r\n\tintTypeForBits,\r\n\tintTypeForSize,\r\n\tnarrowFloat,\r\n\tnarrowInt,\r\n\tnarrowType,\r\n\tnarrowUint,\r\n\tsizeOf,\r\n\ttypedArray,\r\n\ttypedArrayOfVec,\r\n\ttypedArrayType,\r\n\tuintTypeForBits,\r\n\tuintTypeForSize,\r\n\twidenFloat,\r\n\twidenInt,\r\n\twidenType,\r\n\twidenUint\r\n};\r\n","// Just disabling this rule instead of re-writing for now to keep asa close to original in case we want to pull updates later\r\n// Doing `block && block.fill(fill)` instead of `if(block) { block.fill(fill); }` is valid code even if it is hard to parse\r\n/* eslint-disable @typescript-eslint/no-unused-expressions */\r\n\r\nimport type { Pow2 } from './interfaces/pow2';\r\nimport type { TypedArray } from './interfaces/typed-array';\r\nimport { lock, unlock } from './lock/simple-lock';\r\nimport { typedArray } from './utils/typedarray';\r\n\r\nconst STATE_FREE = 0;\r\nconst STATE_USED = 1;\r\nconst STATE_TOP = 2;\r\nconst STATE_END = 3;\r\nconst STATE_ALIGN = 4;\r\nconst STATE_FLAGS = 5;\r\nconst STATE_MIN_SPLIT = 6;\r\n\r\nconst MASK_COMPACT = 1;\r\nconst MASK_SPLIT = 2;\r\n\r\nconst SIZEOF_STATE = 8 * 4;\r\n\r\nconst MEM_BLOCK_SIZE = 0;\r\nconst MEM_BLOCK_NEXT = 1;\r\n\r\nconst SIZEOF_MEM_BLOCK = 2 * 4;\r\n\r\n// Copied from https://github.com/thi-ng/umbrella/blob/develop/packages/malloc/src/pool.ts\r\n// Changes: Atomic.load/store on state, simple lock on malloc/free\r\n// Added bytesFor/lengthOf to be able to grab expected length of a block\r\nexport default class MemoryBuffer {\r\n\tbuf: ArrayBufferLike;\r\n\r\n\tprotected readonly start: number;\r\n\tprotected u8: Uint8Array;\r\n\tprotected u32: Uint32Array;\r\n\tprotected state: Uint32Array;\r\n\tprotected lock: Int32Array;\r\n\r\n\tconstructor(opts: Partial<MemoryBufferConfig> = {}) {\r\n\t\tthis.buf = opts.buf ? opts.buf : new ArrayBuffer(opts.size || 0x1000);\r\n\t\tthis.start = opts.start != null ? align(Math.max(opts.start, 0), 4) : 0;\r\n\t\tthis.u8 = new Uint8Array(this.buf);\r\n\t\tthis.u32 = new Uint32Array(this.buf);\r\n\t\tthis.state = new Uint32Array(this.buf, this.start, SIZEOF_STATE / 4);\r\n\t\tthis.lock = new Int32Array(this.buf, this.start + this.state.byteLength - 4, 1);\r\n\r\n\t\tif(!opts.skipInitialization) {\r\n\t\t\tconst _align = opts.align || 8;\r\n\t\t\tif(_align < 8) {\r\n\t\t\t\tthrow new Error(`invalid alignment: ${_align}, must be a pow2 and >= 8`);\r\n\t\t\t}\r\n\t\t\tconst top = this.initialTop(_align);\r\n\t\t\tconst resolvedEnd =\r\n\t\t\t\topts.end != null\r\n\t\t\t\t\t? Math.min(opts.end, this.buf.byteLength)\r\n\t\t\t\t\t: this.buf.byteLength;\r\n\r\n\t\t\tif(top >= resolvedEnd) {\r\n\t\t\t\tthrow new Error(\r\n\t\t\t\t\t`insufficient address range (0x${this.start.toString(\r\n\t\t\t\t\t\t16\r\n\t\t\t\t\t)} - 0x${resolvedEnd.toString(16)})`\r\n\t\t\t\t);\r\n\t\t\t}\r\n\r\n\t\t\tthis.align = _align;\r\n\t\t\tthis.doCompact = opts.compact !== false;\r\n\t\t\tthis.doSplit = opts.split !== false;\r\n\t\t\tthis.minSplit = opts.minSplit || 16;\r\n\t\t\tthis.end = resolvedEnd;\r\n\t\t\tthis.top = top;\r\n\t\t\tthis._free = 0;\r\n\t\t\tthis._used = 0;\r\n\t\t}\r\n\t}\r\n\r\n\tstats(): Readonly<MemoryBufferStats> {\r\n\t\tconst listStats = (block: number) => {\r\n\t\t\tlet count = 0;\r\n\t\t\tlet size = 0;\r\n\t\t\twhile(block) {\r\n\t\t\t\tcount++;\r\n\t\t\t\tsize += this.blockSize(block);\r\n\t\t\t\tblock = this.blockNext(block);\r\n\r\n\t\t\t\tif(block > this.end) {\r\n\t\t\t\t\tconsole.error(`Trying to get stats for block past end of buffer: ${block} > ${this.end}`);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn { count, size };\r\n\t\t};\r\n\t\tconst free = listStats(this._free);\r\n\t\treturn {\r\n\t\t\tfree,\r\n\t\t\tused: listStats(this._used),\r\n\t\t\ttop: this.top,\r\n\t\t\tavailable: this.end - this.top + free.size,\r\n\t\t\ttotal: this.buf.byteLength\r\n\t\t};\r\n\t}\r\n\r\n\tcallocAs<T extends Type>(type: T, num: number, fill = 0) {\r\n\t\tconst block = this.mallocAs(type, num);\r\n\t\tblock && block.fill(fill);\r\n\t\treturn block;\r\n\t}\r\n\r\n\tmallocAs<T extends Type>(type: T, num: number) {\r\n\t\tconst addr = this.malloc(num * SIZEOF[type]);\r\n\t\treturn addr ? typedArray(type, this.buf, addr, num) : undefined;\r\n\t}\r\n\r\n\tcalloc(bytes: number, fill = 0) {\r\n\t\tconst addr = this.malloc(bytes);\r\n\t\taddr && this.u8.fill(fill, addr, addr + bytes);\r\n\t\treturn addr;\r\n\t}\r\n\r\n\tmalloc(bytes: number) {\r\n\t\tif(bytes <= 0) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\tlock(this.lock);\r\n\t\tconst paddedSize = align(bytes + SIZEOF_MEM_BLOCK, this.align);\r\n\t\tconst end = this.end;\r\n\t\tlet top = this.top;\r\n\t\tlet block = this._free;\r\n\t\tlet prev = 0;\r\n\t\twhile(block) {\r\n\t\t\tconst blockSize = this.blockSize(block);\r\n\t\t\tconst isTop = block + blockSize >= top;\r\n\t\t\tif(isTop || blockSize >= paddedSize) {\r\n\t\t\t\tlet result = this.mallocTop(\r\n\t\t\t\t\tblock,\r\n\t\t\t\t\tprev,\r\n\t\t\t\t\tblockSize,\r\n\t\t\t\t\tpaddedSize,\r\n\t\t\t\t\tisTop\r\n\t\t\t\t);\r\n\r\n\t\t\t\tunlock(this.lock);\r\n\t\t\t\treturn result;\r\n\t\t\t}\r\n\t\t\tprev = block;\r\n\t\t\tblock = this.blockNext(block);\r\n\t\t}\r\n\t\tblock = top;\r\n\t\ttop = block + paddedSize;\r\n\t\tif(top <= end) {\r\n\t\t\tthis.initBlock(block, paddedSize, this._used);\r\n\t\t\tthis._used = block;\r\n\t\t\tthis.top = top;\r\n\t\t\tlet result = blockDataAddress(block);\r\n\t\t\tunlock(this.lock);\r\n\r\n\t\t\treturn result;\r\n\t\t}\r\n\t\tunlock(this.lock);\r\n\t\treturn 0;\r\n\t}\r\n\r\n\tprivate mallocTop(\r\n\t\tblock: number,\r\n\t\tprev: number,\r\n\t\tblockSize: number,\r\n\t\tpaddedSize: number,\r\n\t\tisTop: boolean\r\n\t) {\r\n\t\tif(isTop && block + paddedSize > this.end) return 0;\r\n\t\tif(prev) {\r\n\t\t\tthis.unlinkBlock(prev, block);\r\n\t\t} else {\r\n\t\t\tthis._free = this.blockNext(block);\r\n\t\t}\r\n\t\tthis.setBlockNext(block, this._used);\r\n\t\tthis._used = block;\r\n\t\tif(isTop) {\r\n\t\t\tthis.top = block + this.setBlockSize(block, paddedSize);\r\n\t\t} else if(this.doSplit) {\r\n\t\t\tconst excess = blockSize - paddedSize;\r\n\t\t\texcess >= this.minSplit &&\r\n\t\t\t\tthis.splitBlock(block, paddedSize, excess);\r\n\t\t}\r\n\t\treturn blockDataAddress(block);\r\n\t}\r\n\r\n\trealloc(ptr: number, bytes: number) {\r\n\t\tif(bytes <= 0) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\tconst oldAddr = blockSelfAddress(ptr);\r\n\t\tlet newAddr = 0;\r\n\t\tlet block = this._used;\r\n\t\tlet blockEnd = 0;\r\n\t\twhile(block) {\r\n\t\t\tif(block === oldAddr) {\r\n\t\t\t\t[newAddr, blockEnd] = this.reallocBlock(block, bytes);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tblock = this.blockNext(block);\r\n\t\t}\r\n\t\t// copy old block contents to new addr\r\n\t\tif(newAddr && newAddr !== oldAddr) {\r\n\t\t\tthis.u8.copyWithin(\r\n\t\t\t\tblockDataAddress(newAddr),\r\n\t\t\t\tblockDataAddress(oldAddr),\r\n\t\t\t\tblockEnd\r\n\t\t\t);\r\n\t\t}\r\n\t\treturn blockDataAddress(newAddr);\r\n\t}\r\n\r\n\tprivate reallocBlock(block: number, bytes: number) {\r\n\t\tconst blockSize = this.blockSize(block);\r\n\t\tconst blockEnd = block + blockSize;\r\n\t\tconst isTop = blockEnd >= this.top;\r\n\t\tconst paddedSize = align(bytes + SIZEOF_MEM_BLOCK, this.align);\r\n\t\t// shrink & possibly split existing block\r\n\t\tif(paddedSize <= blockSize) {\r\n\t\t\tif(this.doSplit) {\r\n\t\t\t\tconst excess = blockSize - paddedSize;\r\n\t\t\t\tif(excess >= this.minSplit) {\r\n\t\t\t\t\tthis.splitBlock(block, paddedSize, excess);\r\n\t\t\t\t} else if(isTop) {\r\n\t\t\t\t\tthis.top = block + paddedSize;\r\n\t\t\t\t}\r\n\t\t\t} else if(isTop) {\r\n\t\t\t\tthis.top = block + paddedSize;\r\n\t\t\t}\r\n\t\t\treturn [block, blockEnd];\r\n\t\t}\r\n\t\t// try to enlarge block if current top\r\n\t\tif(isTop && block + paddedSize < this.end) {\r\n\t\t\tthis.top = block + this.setBlockSize(block, paddedSize);\r\n\t\t\treturn [block, blockEnd];\r\n\t\t}\r\n\t\t// fallback to free & malloc\r\n\t\tthis.free(block);\r\n\t\treturn [blockSelfAddress(this.malloc(bytes)), blockEnd];\r\n\t}\r\n\r\n\treallocArray<T extends TypedArray>(array: T, num: number): T | undefined {\r\n\t\tif(array.buffer !== this.buf) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst addr = this.realloc(\r\n\t\t\tarray.byteOffset,\r\n\t\t\tnum * array.BYTES_PER_ELEMENT\r\n\t\t);\r\n\t\treturn addr\r\n\t\t\t? new (<any>array.constructor)(this.buf, addr, num)\r\n\t\t\t: undefined;\r\n\t}\r\n\r\n\tbytesFor(ptrOrArray: number | TypedArray): number | undefined {\r\n\t\tlet addr: number;\r\n\t\tif(typeof ptrOrArray !== 'number') {\r\n\t\t\tif(ptrOrArray.buffer !== this.buf) {\r\n\t\t\t\treturn undefined;\r\n\t\t\t}\r\n\t\t\taddr = ptrOrArray.byteOffset;\r\n\t\t} else {\r\n\t\t\taddr = ptrOrArray;\r\n\t\t}\r\n\r\n\t\taddr = blockSelfAddress(addr);\r\n\t\tlet block = this._used;\r\n\t\twhile(block) {\r\n\t\t\tif(block === addr) {\r\n\t\t\t\treturn this.blockSize(addr) - SIZEOF_MEM_BLOCK;\r\n\t\t\t}\r\n\t\t\tblock = this.blockNext(block);\r\n\t\t}\r\n\r\n\t\treturn undefined;\r\n\t}\r\n\tlengthOf(ptrOrArray: number | TypedArray): number | undefined {\r\n\t\tlet bytes = this.bytesFor(ptrOrArray);\r\n\t\tif(bytes) {\r\n\t\t\treturn bytes / this.u32.BYTES_PER_ELEMENT;\r\n\t\t} else {\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\t}\r\n\r\n\tfree(ptrOrArray: number | TypedArray) {\r\n\t\tlet addr: number;\r\n\t\tif(typeof ptrOrArray !== 'number') {\r\n\t\t\tif(ptrOrArray.buffer !== this.buf) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\taddr = ptrOrArray.byteOffset;\r\n\t\t} else {\r\n\t\t\taddr = ptrOrArray;\r\n\t\t}\r\n\t\tlock(this.lock);\r\n\t\taddr = blockSelfAddress(addr);\r\n\t\tlet block = this._used;\r\n\t\tlet prev = 0;\r\n\t\twhile(block) {\r\n\t\t\tif(block === addr) {\r\n\t\t\t\tif(prev) {\r\n\t\t\t\t\tthis.unlinkBlock(prev, block);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis._used = this.blockNext(block);\r\n\t\t\t\t}\r\n\t\t\t\tthis.insert(block);\r\n\t\t\t\tthis.doCompact && this.compact();\r\n\r\n\t\t\t\tunlock(this.lock);\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\tprev = block;\r\n\t\t\tblock = this.blockNext(block);\r\n\t\t}\r\n\r\n\t\tunlock(this.lock);\r\n\t\treturn false;\r\n\t}\r\n\r\n\tfreeAll() {\r\n\t\tthis._free = 0;\r\n\t\tthis._used = 0;\r\n\t\tthis.top = this.initialTop();\r\n\t}\r\n\r\n\trelease() {\r\n\t\tdelete (<any> this).u8;\r\n\t\tdelete (<any> this).u32;\r\n\t\tdelete (<any> this).state;\r\n\t\tdelete (<any> this).buf;\r\n\t\treturn true;\r\n\t}\r\n\r\n\tprotected get align() {\r\n\t\treturn <Pow2> this.state[STATE_ALIGN];\r\n\t}\r\n\r\n\tprotected set align(x: Pow2) {\r\n\t\tthis.state[STATE_ALIGN] = x;\r\n\t}\r\n\r\n\tget end() {\r\n\t\treturn this.state[STATE_END];\r\n\t}\r\n\r\n\tprotected set end(x: number) {\r\n\t\tthis.state[STATE_END] = x;\r\n\t}\r\n\r\n\tget top() {\r\n\t\treturn Atomics.load(this.state, STATE_TOP);\r\n\t}\r\n\r\n\tprotected set top(x: number) {\r\n\t\tAtomics.store(this.state, STATE_TOP, x);\r\n\t}\r\n\r\n\tprotected get _free() {\r\n\t\treturn Atomics.load(this.state, STATE_FREE);\r\n\t}\r\n\r\n\tprotected set _free(block: number) {\r\n\t\tAtomics.store(this.state, STATE_FREE, block);\r\n\t}\r\n\r\n\tprotected get _used() {\r\n\t\treturn Atomics.load(this.state, STATE_USED);\r\n\t}\r\n\r\n\tprotected set _used(block: number) {\r\n\t\tAtomics.store(this.state, STATE_USED, block);\r\n\t}\r\n\r\n\tprotected get doCompact() {\r\n\t\treturn !!(this.state[STATE_FLAGS] & MASK_COMPACT);\r\n\t}\r\n\r\n\tprotected set doCompact(flag: boolean) {\r\n\t\tflag\r\n\t\t\t? (this.state[STATE_FLAGS] |= 1 << (MASK_COMPACT - 1))\r\n\t\t\t: (this.state[STATE_FLAGS] &= ~MASK_COMPACT);\r\n\t}\r\n\r\n\tprotected get doSplit() {\r\n\t\treturn !!(this.state[STATE_FLAGS] & MASK_SPLIT);\r\n\t}\r\n\r\n\tprotected set doSplit(flag: boolean) {\r\n\t\tflag\r\n\t\t\t? (this.state[STATE_FLAGS] |= 1 << (MASK_SPLIT - 1))\r\n\t\t\t: (this.state[STATE_FLAGS] &= ~MASK_SPLIT);\r\n\t}\r\n\r\n\tprotected get minSplit() {\r\n\t\treturn this.state[STATE_MIN_SPLIT];\r\n\t}\r\n\r\n\tprotected set minSplit(x: number) {\r\n\t\tif(x <= SIZEOF_MEM_BLOCK) {\r\n\t\t\tthrow new Error(`illegal min split threshold: ${x}, require at least ${\r\n\t\t\t\tSIZEOF_MEM_BLOCK + 1\r\n\t\t\t}`);\r\n\t\t}\r\n\t\tthis.state[STATE_MIN_SPLIT] = x;\r\n\t}\r\n\r\n\tprotected blockSize(block: number) {\r\n\t\treturn Atomics.load(this.u32, (block >> 2) + MEM_BLOCK_SIZE);\r\n\t}\r\n\r\n\t/**\r\n\t * Sets & returns given block size.\r\n\t *\r\n\t * @param block -\r\n\t * @param size -\r\n\t */\r\n\tprotected setBlockSize(block: number, size: number) {\r\n\t\tAtomics.store(this.u32, (block >> 2) + MEM_BLOCK_SIZE, size);\r\n\t\treturn size;\r\n\t}\r\n\r\n\tprotected blockNext(block: number) {\r\n\t\treturn Atomics.load(this.u32, (block >> 2) + MEM_BLOCK_NEXT);\r\n\t}\r\n\r\n\t/**\r\n\t * Sets block next pointer to `next`. Use zero to indicate list end.\r\n\t *\r\n\t * @param block -\r\n\t */\r\n\tprotected setBlockNext(block: number, next: number) {\r\n\t\tAtomics.store(this.u32, (block >> 2) + MEM_BLOCK_NEXT, next);\r\n\t}\r\n\r\n\t/**\r\n\t * Initializes block header with given `size` and `next` pointer. Returns `block`.\r\n\t *\r\n\t * @param block -\r\n\t * @param size -\r\n\t * @param next -\r\n\t */\r\n\tprotected initBlock(block: number, size: number, next: number) {\r\n\t\tconst idx = block >>> 2;\r\n\t\tAtomics.store(this.u32, idx + MEM_BLOCK_SIZE, size);\r\n\t\tAtomics.store(this.u32, idx + MEM_BLOCK_NEXT, next);\r\n\t\treturn block;\r\n\t}\r\n\r\n\tprotected unlinkBlock(prev: number, block: number) {\r\n\t\tthis.setBlockNext(prev, this.blockNext(block));\r\n\t}\r\n\r\n\tprotected splitBlock(block: number, blockSize: number, excess: number) {\r\n\t\tthis.insert(\r\n\t\t\tthis.initBlock(\r\n\t\t\t\tblock + this.setBlockSize(block, blockSize),\r\n\t\t\t\texcess,\r\n\t\t\t\t0\r\n\t\t\t)\r\n\t\t);\r\n\t\tthis.doCompact && this.compact();\r\n\t}\r\n\r\n\tprotected initialTop(_align = this.align) {\r\n\t\treturn (\r\n\t\t\talign(this.start + SIZEOF_STATE + SIZEOF_MEM_BLOCK, _align) -\r\n\t\t\tSIZEOF_MEM_BLOCK\r\n\t\t);\r\n\t}\r\n\r\n\t/**\r\n\t * Traverses free list and attempts to recursively merge blocks\r\n\t * occupying consecutive memory regions. Returns true if any blocks\r\n\t * have been merged. Only called if `compact` option is enabled.\r\n\t */\r\n\tprotected compact() {\r\n\t\tlet block = this._free;\r\n\t\tlet prev = 0;\r\n\t\tlet scan = 0;\r\n\t\tlet scanPrev: number;\r\n\t\tlet res = false;\r\n\t\twhile(block) {\r\n\t\t\tscanPrev = block;\r\n\t\t\tscan = this.blockNext(block);\r\n\t\t\twhile(scan && scanPrev + this.blockSize(scanPrev) === scan) {\r\n\t\t\t\t// console.log(\"merge:\", scan.addr, scan.size);\r\n\t\t\t\tscanPrev = scan;\r\n\t\t\t\tscan = this.blockNext(scan);\r\n\t\t\t}\r\n\t\t\tif(scanPrev !== block) {\r\n\t\t\t\tconst newSize = scanPrev - block + this.blockSize(scanPrev);\r\n\t\t\t\t// console.log(\"merged size:\", newSize);\r\n\t\t\t\tthis.setBlockSize(block, newSize);\r\n\t\t\t\tconst next = this.blockNext(scanPrev);\r\n\t\t\t\tlet tmp = this.blockNext(block);\r\n\t\t\t\twhile(tmp && tmp !== next) {\r\n\t\t\t\t\t// console.log(\"release:\", tmp.addr);\r\n\t\t\t\t\tconst tn = this.blockNext(tmp);\r\n\t\t\t\t\tthis.setBlockNext(tmp, 0);\r\n\t\t\t\t\ttmp = tn;\r\n\t\t\t\t}\r\n\t\t\t\tthis.setBlockNext(block, next);\r\n\t\t\t\tres = true;\r\n\t\t\t}\r\n\t\t\t// re-adjust top if poss\r\n\t\t\tif(block + this.blockSize(block) >= this.top) {\r\n\t\t\t\tthis.top = block;\r\n\t\t\t\tprev\r\n\t\t\t\t\t? this.unlinkBlock(prev, block)\r\n\t\t\t\t\t: (this._free = this.blockNext(block));\r\n\t\t\t}\r\n\t\t\tprev = block;\r\n\t\t\tblock = this.blockNext(block);\r\n\t\t}\r\n\t\treturn res;\r\n\t}\r\n\r\n\t/**\r\n\t * Inserts given block into list of free blocks, sorted by address.\r\n\t *\r\n\t * @param block -\r\n\t */\r\n\tprotected insert(block: number) {\r\n\t\tlet ptr = this._free;\r\n\t\tlet prev = 0;\r\n\t\twhile(ptr) {\r\n\t\t\tif(block <= ptr) break;\r\n\t\t\tprev = ptr;\r\n\t\t\tptr = this.blockNext(ptr);\r\n\t\t}\r\n\t\tif(prev) {\r\n\t\t\tthis.setBlockNext(prev, block);\r\n\t\t} else {\r\n\t\t\tthis._free = block;\r\n\t\t}\r\n\t\tthis.setBlockNext(block, ptr);\r\n\t}\r\n}\r\n\r\n/**\r\n * Returns a block's data address, based on given alignment.\r\n *\r\n * @param blockAddress -\r\n */\r\nconst blockDataAddress = (blockAddress: number) => blockAddress > 0 ? blockAddress + SIZEOF_MEM_BLOCK : 0;\r\n\r\n/**\r\n * Returns block start address for given data address and alignment.\r\n *\r\n * @param dataAddress -\r\n */\r\nconst blockSelfAddress = (dataAddress: number) => dataAddress > 0 ? dataAddress - SIZEOF_MEM_BLOCK : 0;\r\n\r\nconst align = (addr: number, size: number) => (size--, addr + size & ~size);\r\nconst SIZEOF = {\r\n\tu8: 1,\r\n\tu8c: 1,\r\n\ti8: 1,\r\n\tu16: 2,\r\n\ti16: 2,\r\n\tu32: 4,\r\n\ti32: 4,\r\n\ti64: 8,\r\n\tu64: 8,\r\n\tf32: 4,\r\n\tf64: 8\r\n};\r\ntype Type = 'u8' | 'u8c' | 'i8' | 'u16' | 'i16' | 'u32' | 'i32' | 'f32' | 'f64';\r\n\r\ninterface MemoryBufferConfig {\r\n\t/**\r\n\t * Backing ArrayBuffer (or SharedArrayBuffer). If not given, a new\r\n\t * one will be created with given `size`.\r\n\t */\r\n\tbuf: ArrayBufferLike;\r\n\t/**\r\n\t * Byte size for newly created ArrayBuffers (if `buf` is not given).\r\n\t *\r\n\t * @defaultValue 0x1000 (4KB)\r\n\t */\r\n\tsize: number;\r\n\t/**\r\n\t * Anchor index (byte address) inside the array buffer. The MemPool\r\n\t * stores its internal state from the given address and heap space\r\n\t * starts at least 32 bytes later (depending on chosen `align`\r\n\t * value). Unlike allocator state variables, `start`` cannot be\r\n\t * saved inside the array buffer itself. If the ArrayBuffer is\r\n\t * passed to other consumers they must use the same start value.\r\n\t * MUST be multiple of 4.\r\n\t *\r\n\t * @defaultValue 0\r\n\t */\r\n\tstart: number;\r\n\t/**\r\n\t * Byte address (+1) of the end of the memory region managed by the\r\n\t * {@link MemPool}.\r\n\t *\r\n\t * @defaultValue end of the backing ArrayBuffer\r\n\t */\r\n\tend: number;\r\n\t/**\r\n\t * Number of bytes to align memory blocks to. MUST be a power of 2\r\n\t * and >= 8. Use 16 if the pool is being used for allocating memory\r\n\t * used in SIMD operations.\r\n\t *\r\n\t * @defaultValue 8\r\n\t */\r\n\talign: Pow2;\r\n\t/**\r\n\t * Flag to configure memory block compaction. If true,\r\n\t * adjoining free blocks (in terms of address space) will be merged\r\n\t * to minimize fragementation.\r\n\t *\r\n\t * @defaultValue true\r\n\t */\r\n\tcompact: boolean;\r\n\t/**\r\n\t * Flag to configure memory block splitting. If true, and when the\r\n\t * allocator is re-using a previously freed block larger than the\r\n\t * requested size, the block will be split to minimize wasted/unused\r\n\t * memory. The splitting behavior can further customized via the\r\n\t * `minSplit` option.\r\n\t *\r\n\t * @defaultValue true\r\n\t */\r\n\tsplit: boolean;\r\n\t/**\r\n\t * Only used if `split` behavior is enabled. Defines min number of\r\n\t * excess bytes available in a block for memory block splitting to\r\n\t * occur.\r\n\t *\r\n\t * @defaultValue 16, MUST be > 8\r\n\t */\r\n\tminSplit: number;\r\n\t/**\r\n\t * Only needed when sharing the underlying ArrayBuffer. If true, the\r\n\t * {@link MemPool} constructor will NOT initialize its internal state and\r\n\t * assume the underlying ArrayBuffer has already been initialized by\r\n\t * another {@link MemPool} instance. If this option is used, `buf` MUST be\r\n\t * given.\r\n\t *\r\n\t * @defaultValue false\r\n\t */\r\n\tskipInitialization: boolean;\r\n}\r\ninterface MemoryBufferStats {\r\n\t/**\r\n\t * Free block stats.\r\n\t */\r\n\tfree: { count: number; size: number };\r\n\t/**\r\n\t * Used block stats.\r\n\t */\r\n\tused: { count: number; size: number };\r\n\t/**\r\n\t * Current top address.\r\n\t */\r\n\ttop: number;\r\n\t/**\r\n\t * Bytes available\r\n\t */\r\n\tavailable: number;\r\n\t/**\r\n\t * Total pool size.\r\n\t */\r\n\ttotal: number;\r\n}","const BYTE_UNITS = [\n\t'B',\n\t'kB',\n\t'MB',\n\t'GB',\n\t'TB',\n\t'PB',\n\t'EB',\n\t'ZB',\n\t'YB',\n];\n\nconst BIBYTE_UNITS = [\n\t'B',\n\t'KiB',\n\t'MiB',\n\t'GiB',\n\t'TiB',\n\t'PiB',\n\t'EiB',\n\t'ZiB',\n\t'YiB',\n];\n\nconst BIT_UNITS = [\n\t'b',\n\t'kbit',\n\t'Mbit',\n\t'Gbit',\n\t'Tbit',\n\t'Pbit',\n\t'Ebit',\n\t'Zbit',\n\t'Ybit',\n];\n\nconst BIBIT_UNITS = [\n\t'b',\n\t'kibit',\n\t'Mibit',\n\t'Gibit',\n\t'Tibit',\n\t'Pibit',\n\t'Eibit',\n\t'Zibit',\n\t'Yibit',\n];\n\n/*\nFormats the given number using `Number#toLocaleString`.\n- If locale is a string, the value is expected to be a locale-key (for example: `de`).\n- If locale is true, the system default locale is used for translation.\n- If no value for locale is specified, the number is returned unmodified.\n*/\nconst toLocaleString = (number, locale, options) => {\n\tlet result = number;\n\tif (typeof locale === 'string' || Array.isArray(locale)) {\n\t\tresult = number.toLocaleString(locale, options);\n\t} else if (locale === true || options !== undefined) {\n\t\tresult = number.toLocaleString(undefined, options);\n\t}\n\n\treturn result;\n};\n\nconst log10 = numberOrBigInt => {\n\tif (typeof numberOrBigInt === 'number') {\n\t\treturn Math.log10(numberOrBigInt);\n\t}\n\n\tconst string = numberOrBigInt.toString(10);\n\n\treturn string.length + Math.log10(`0.${string.slice(0, 15)}`);\n};\n\nconst log = numberOrBigInt => {\n\tif (typeof numberOrBigInt === 'number') {\n\t\treturn Math.log(numberOrBigInt);\n\t}\n\n\treturn log10(numberOrBigInt) * Math.log(10);\n};\n\nconst divide = (numberOrBigInt, divisor) => {\n\tif (typeof numberOrBigInt === 'number') {\n\t\treturn numberOrBigInt / divisor;\n\t}\n\n\tconst integerPart = numberOrBigInt / BigInt(divisor);\n\tconst remainder = numberOrBigInt % BigInt(divisor);\n\treturn Number(integerPart) + (Number(remainder) / divisor);\n};\n\nconst applyFixedWidth = (result, fixedWidth) => {\n\tif (fixedWidth === undefined) {\n\t\treturn result;\n\t}\n\n\tif (typeof fixedWidth !== 'number' || !Number.isSafeInteger(fixedWidth) || fixedWidth < 0) {\n\t\tthrow new TypeError(`Expected fixedWidth to be a non-negative integer, got ${typeof fixedWidth}: ${fixedWidth}`);\n\t}\n\n\tif (fixedWidth === 0) {\n\t\treturn result;\n\t}\n\n\treturn result.length < fixedWidth ? result.padStart(fixedWidth, ' ') : result;\n};\n\nconst buildLocaleOptions = options => {\n\tconst {minimumFractionDigits, maximumFractionDigits} = options;\n\n\tif (minimumFractionDigits === undefined && maximumFractionDigits === undefined) {\n\t\treturn undefined;\n\t}\n\n\treturn {\n\t\t...(minimumFractionDigits !== undefined && {minimumFractionDigits}),\n\t\t...(maximumFractionDigits !== undefined && {maximumFractionDigits}),\n\t\troundingMode: 'trunc',\n\t};\n};\n\nexport default function prettyBytes(number, options) {\n\tif (typeof number !== 'bigint' && !Number.isFinite(number)) {\n\t\tthrow new TypeError(`Expected a finite number, got ${typeof number}: ${number}`);\n\t}\n\n\toptions = {\n\t\tbits: false,\n\t\tbinary: false,\n\t\tspace: true,\n\t\tnonBreakingSpace: false,\n\t\t...options,\n\t};\n\n\tconst UNITS = options.bits\n\t\t? (options.binary ? BIBIT_UNITS : BIT_UNITS)\n\t\t: (options.binary ? BIBYTE_UNITS : BYTE_UNITS);\n\n\tconst separator = options.space ? (options.nonBreakingSpace ? '\\u00A0' : ' ') : '';\n\n\t// Handle signed zero case\n\tconst isZero = typeof number === 'number' ? number === 0 : number === 0n;\n\tif (options.signed && isZero) {\n\t\tconst result = ` 0${separator}${UNITS[0]}`;\n\t\treturn applyFixedWidth(result, options.fixedWidth);\n\t}\n\n\tconst isNegative = number < 0;\n\tconst prefix = isNegative ? '-' : (options.signed ? '+' : '');\n\n\tif (isNegative) {\n\t\tnumber = -number;\n\t}\n\n\tconst localeOptions = buildLocaleOptions(options);\n\tlet result;\n\n\tif (number < 1) {\n\t\tconst numberString = toLocaleString(number, options.locale, localeOptions);\n\t\tresult = prefix + numberString + separator + UNITS[0];\n\t} else {\n\t\tconst exponent = Math.min(Math.floor(options.binary ? log(number) / Math.log(1024) : log10(number) / 3), UNITS.length - 1);\n\t\tnumber = divide(number, (options.binary ? 1024 : 1000) ** exponent);\n\n\t\tif (!localeOptions) {\n\t\t\tconst minPrecision = Math.max(3, Math.floor(number).toString().length);\n\t\t\tnumber = number.toPrecision(minPrecision);\n\t\t}\n\n\t\tconst numberString = toLocaleString(Number(number), options.locale, localeOptions);\n\t\tconst unit = UNITS[exponent];\n\t\tresult = prefix + numberString + separator + unit;\n\t}\n\n\treturn applyFixedWidth(result, options.fixedWidth);\n}\n","import AllocatedMemory, { type SharedAllocatedMemory } from './allocated-memory';\r\nimport prettyBytes from 'pretty-bytes';\r\nimport { MAX_BYTE_OFFSET_LENGTH, MAX_POSITION_LENGTH } from './utils/pointer';\r\nimport MemoryBuffer from './memory-buffer';\r\n\r\nconst DEFAULT_BUFFER_SIZE = 8_192;\r\nconst BUFFER_SIZE_INDEX = 0;\r\nconst BUFFER_COUNT_INDEX = 1;\r\nconst BUFFER_AUTO_GROW_INDEX = 2;\r\nexport default class MemoryHeap {\r\n\tbuffers: Array<MemoryBuffer>;\r\n\tprivate onGrowBufferHandlers: Array<OnGrowBuffer> = [];\r\n\tisClone: boolean;\r\n\tprivate memory: AllocatedMemory;\r\n\r\n\tget bufferSize() {\r\n\t\treturn this.memory.data[BUFFER_SIZE_INDEX];\r\n\t}\r\n\r\n\tconstructor(config?: MemoryHeapConfig | MemoryHeapMemory) {\r\n\t\tif(config && 'buffers' in config) {\r\n\t\t\tthis.buffers = config.buffers.map(buffer => {\r\n\t\t\t\treturn new MemoryBuffer({\r\n\t\t\t\t\tbuf: buffer,\r\n\t\t\t\t\tskipInitialization: true\r\n\t\t\t\t});\r\n\t\t\t});\r\n\r\n\t\t\t// TODO: This should be programic instead of hoping the first allocation is always byte 40\r\n\t\t\tthis.memory = new AllocatedMemory(this, {\r\n\t\t\t\tbufferPosition: 0,\r\n\t\t\t\tbufferByteOffset: 40\r\n\t\t\t});\r\n\t\t\tthis.isClone = true;\r\n\t\t} else {\r\n\t\t\tif(!('SharedArrayBuffer' in globalThis)) {\r\n\t\t\t\tconsole.warn('SharedArrayBuffer is not working: falling back to ArrayBuffer');\r\n\t\t\t}\r\n\r\n\t\t\tconst bufferSize = config?.bufferSize ?? DEFAULT_BUFFER_SIZE;\r\n\t\t\tif(bufferSize > MAX_BYTE_OFFSET_LENGTH) {\r\n\t\t\t\tthrow new Error(`Buffer size ${bufferSize} is greater than max ${MAX_BYTE_OFFSET_LENGTH} that we can reference with pointers`);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tlet startBuffer = this.createBuffer(bufferSize);\r\n\t\t\tthis.buffers = [\r\n\t\t\t\tstartBuffer\r\n\t\t\t];\r\n\t\t\tconst data = startBuffer.callocAs('u32', 3);\r\n\t\t\tif(data) {\r\n\t\t\t\tthis.memory = new AllocatedMemory(this, {\r\n\t\t\t\t\tbufferPosition: 0,\r\n\t\t\t\t\tbufferByteOffset: data.byteOffset\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\tthrow new Error('Failed to initialize first byte from buffer');\r\n\t\t\t}\r\n\t\t\tthis.memory.data[BUFFER_SIZE_INDEX] = bufferSize;\r\n\t\t\tthis.memory.data[BUFFER_COUNT_INDEX] = 1;\r\n\t\t\tthis.memory.data[BUFFER_AUTO_GROW_INDEX] = config?.autoGrowSize ?? 100;\r\n\t\t\tthis.isClone = false;\r\n\r\n\t\t\tfor(let i = 1; i < (config?.initialBuffers ?? 1); i++) {\r\n\t\t\t\tthis.buffers.push(this.createBuffer(bufferSize));\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\taddSharedBuffer(data: GrowBufferData) {\r\n\t\tthis.buffers[data.bufferPosition] = new MemoryBuffer({\r\n\t\t\tbuf: data.buffer,\r\n\t\t\tskipInitialization: true\r\n\t\t});\r\n\t}\r\n\r\n\tprivate growBuffer() {\r\n\t\tconst buffer = this.createBuffer();\r\n\t\tlet nextBufferPosition = Atomics.add(this.memory.data, BUFFER_COUNT_INDEX, 1);\r\n\t\t// Setting index set by internal Atomic count so we can create new buffers from multiple threads and keep position consistent\r\n\t\tthis.buffers[nextBufferPosition] = buffer;\r\n\t\tthis.onGrowBufferHandlers.forEach(handler => handler({\r\n\t\t\tbufferPosition: nextBufferPosition,\r\n\t\t\tbuffer: buffer.buf as SharedArrayBuffer\r\n\t\t}));\r\n\r\n\t\treturn buffer;\r\n\t}\r\n\tprivate createBuffer(bufferSize?: number): MemoryBuffer {\r\n\t\tconst usedBufferSize = bufferSize ?? this.bufferSize;\r\n\t\tlet buf: ArrayBuffer | SharedArrayBuffer;\r\n\t\tif('SharedArrayBuffer' in globalThis) {\r\n\t\t\tbuf = new SharedArrayBuffer(usedBufferSize);\r\n\t\t} else {\r\n\t\t\tbuf = new ArrayBuffer(usedBufferSize);\r\n\t\t}\r\n\r\n\t\treturn new MemoryBuffer({\r\n\t\t\tbuf,\r\n\r\n\t\t\t// We can't use this unless we can 100% guarantee that every thread will stop using memory the instant it is freed\r\n\t\t\t// ex: Allocate 16 bytes. Thread A frees that allocation and then allocates 12 bytes and 4 bytes, but Thread B is mid-execution on the old allocation can changes the internal state of the 4-byte allocation breaking everything\r\n\t\t\t// After the internal state is wrong MemoryBuffer will loose track of which blocks are where and how big they are\r\n\t\t\tcompact: false,\r\n\t\t\tsplit: false\r\n\t\t});\r\n\t}\r\n\r\n\taddOnGrowBufferHandlers(handler: OnGrowBuffer) {\r\n\t\tthis.onGrowBufferHandlers.push(handler);\r\n\t}\r\n\r\n\tallocUI32(count: number): AllocatedMemory {\r\n\t\tcount = Math.ceil(count);\r\n\t\tfor(let i = 0; i < this.buffers.length; i++) {\r\n\t\t\tconst buffer = this.buffers[i];\r\n\t\t\t// Should just mean we haven't synced this buffer from another thread yet\r\n\t\t\tif(!buffer) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\t// Should be fine to initialize all values as 0s since unsigned/signed ints and floats all store 0 as all 0s\r\n\t\t\tconst data = buffer.callocAs('u32', count);\r\n\t\t\tif(data) {\r\n\t\t\t\t// Auto grow when nearly full when we need buffer to already be sync'd between threads BEFORE we try to use it\r\n\t\t\t\tif(i === (this.buffers.length - 1) && Atomics.load(this.memory.data, BUFFER_COUNT_INDEX) === this.buffers.length && this.memory.data[BUFFER_AUTO_GROW_INDEX] < 100 && this.memory.data[BUFFER_AUTO_GROW_INDEX] > 0) {\r\n\t\t\t\t\tconst percentFull = buffer.top / buffer.end;\r\n\t\t\t\t\tif(percentFull > (this.memory.data[BUFFER_AUTO_GROW_INDEX] / 100)) {\r\n\t\t\t\t\t\tthis.growBuffer();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn new AllocatedMemory(this, {\r\n\t\t\t\t\tdata,\r\n\t\t\t\t\tbuffer\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif(this.buffers.length >= MAX_POSITION_LENGTH) {\r\n\t\t\tthrow new Error(`Can't initialize a new buffer since it would have a position greater than the max of ${MAX_POSITION_LENGTH}`);\r\n\t\t}\r\n\r\n\t\t// If we get here we need to grow another buffer to continue allocating new memory\r\n\t\tlet buffer = this.growBuffer();\r\n\t\tconst data = buffer.callocAs('u32', count);\r\n\t\tif(data) {\r\n\t\t\treturn new AllocatedMemory(this, {\r\n\t\t\t\tdata,\r\n\t\t\t\tbuffer\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\tthrow new Error(`Unable to allocate ${count} numbers even after adding a new buffer`);\r\n\t\t}\r\n\t}\r\n\r\n\tgetSharedAlloc(shared: SharedAllocatedMemory): AllocatedMemory | undefined {\r\n\t\t// Should just mean it hasn't synced to this thread yet\r\n\t\tif(this.buffers[shared.bufferPosition] === undefined) {\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\r\n\t\treturn new AllocatedMemory(this, shared);\r\n\t}\r\n\r\n\tget currentUsed() {\r\n\t\treturn this.totalAllocated - this.buffers.reduce((total, memPool) => total + memPool.stats().available, 0);\r\n\t}\r\n\tget totalAllocated() {\r\n\t\treturn this.buffers[0].buf.byteLength * this.buffers.length;\r\n\t}\r\n\r\n\tprettyMemory() {\r\n\t\treturn `${myPrettyBytes(this.currentUsed)} / ${myPrettyBytes(this.totalAllocated)}`;\r\n\t}\r\n\r\n\tgetSharedMemory(): MemoryHeapMemory {\r\n\t\treturn {\r\n\t\t\tbuffers: this.buffers.map(buffer => buffer.buf as SharedArrayBuffer)\r\n\t\t};\r\n\t}\r\n}\r\n\r\nfunction myPrettyBytes(bytes: number) {\r\n\treturn prettyBytes(bytes, {\r\n\t\tbinary: true,\r\n\t\tminimumFractionDigits: 1,\r\n\t\tmaximumFractionDigits: 1\r\n\t});\r\n}\r\n\r\ntype OnGrowBuffer = (newBuffer: GrowBufferData) => void;\r\ninterface GrowBufferData {\r\n\tbufferPosition: number\r\n\tbuffer: SharedArrayBuffer\r\n}\r\n\r\ninterface MemoryHeapConfig {\r\n\tbufferSize?: number\r\n\tinitialBuffers?: number\r\n\tautoGrowSize?: number\r\n}\r\ninterface MemoryHeapMemory {\r\n\tbuffers: Array<SharedArrayBuffer>\r\n}\r\n\r\nexport type { MemoryHeapConfig, MemoryHeapMemory, GrowBufferData };","import type { SharedAllocatedMemory } from './allocated-memory';\r\nimport AllocatedMemory from './allocated-memory';\r\nimport type { TypedArrayConstructor } from './interfaces/typed-array-constructor';\r\nimport type MemoryHeap from './memory-heap';\r\nimport { getPointer, loadPointer, loadRawPointer, replaceRawPointer, storePointer, storeRawPointer } from './utils/pointer';\r\n\r\nenum TYPE {\r\n\tuint32,\r\n\tint32,\r\n\tfloat32\r\n}\r\n\r\n// TODO: We need some sort of locking on insert/deletes!\r\nconst FIRST_BLOCK_RECORD_KEEPING_COUNT = 4;\r\nconst DATA_BLOCK_RECORD_KEEPING_COUNT = 1;\r\nconst LENGTH_INDEX = 2;\r\nexport default class SharedList<T extends Uint32Array | Int32Array | Float32Array = Uint32Array> implements Iterable<SharedListIterable<T>> {\r\n\tstatic readonly ALLOCATE_COUNT = FIRST_BLOCK_RECORD_KEEPING_COUNT;\r\n\r\n\tprivate memory: MemoryHeap;\r\n\t/* First block\r\n\t\t32 index 0\r\n\t\tuint16 0 - next buffer position\r\n\t\tuint16 1 - next buffer index\r\n\t\t32 index 1\r\n\t\tuint16 2 - last buffer position\r\n\t\tuint16 3 - last buffer index\r\n\t\t32 index 2\r\n\t\tuint32 4 - length\r\n\t\t32 index 3\r\n\t\tuint16 6 - type\r\n\t\tuint16 7 - data length (defaults to 1 number per data)\r\n\t*/\r\n\t/* Other blocks\r\n\t\t32 index 0\r\n\t\tuint16 0 - next buffer position\r\n\t\tuint16 1 - next buffer index\r\n\t\t32 index 1 => data\r\n\t*/\r\n\tprivate firstBlock: AllocatedMemory;\r\n\tprivate uint16Array: Uint16Array;\r\n\tonDelete?: (data: T) => void;\r\n\r\n\tget length(): number {\r\n\t\treturn Atomics.load(this.firstBlock.data, LENGTH_INDEX);\r\n\t}\r\n\t\r\n\tget type(): number {\r\n\t\treturn Atomics.load(this.uint16Array, 0);\r\n\t}\r\n\tprivate set type(value: number) {\r\n\t\tAtomics.store(this.uint16Array, 0, value);\r\n\t}\r\n\tget dataLength(): number {\r\n\t\t// Can technically be initialized by passing memory without actually every being called - need to make sure dataLength is always at least one\r\n\t\treturn Math.max(1, Atomics.load(this.uint16Array, 1));\r\n\t}\r\n\tprivate set dataLength(value: number) {\r\n\t\tAtomics.store(this.uint16Array, 1, value);\r\n\t}\r\n\r\n\tconstructor(memory: MemoryHeap, config?: SharedListConfig<T> | SharedListMemory) {\r\n\t\tthis.memory = memory;\r\n\r\n\t\tif(config && 'firstBlock' in config) {\r\n\t\t\t// TODO: How to handle referencing memory we don't have access to yet because buffer not synced from worker?\r\n\t\t\tthis.firstBlock = new AllocatedMemory(memory, config.firstBlock);\r\n\t\t\tthis.uint16Array = new Uint16Array(this.firstBlock.data.buffer, this.firstBlock.bufferByteOffset + (LENGTH_INDEX + 1) * Uint32Array.BYTES_PER_ELEMENT, 2);\r\n\t\t} else {\r\n\t\t\tif(config && config.initWithBlock) {\r\n\t\t\t\tthis.firstBlock = new AllocatedMemory(memory, config.initWithBlock);\r\n\t\t\t} else {\r\n\t\t\t\tthis.firstBlock = memory.allocUI32(FIRST_BLOCK_RECORD_KEEPING_COUNT);\r\n\t\t\t}\r\n\t\t\tthis.uint16Array = new Uint16Array(this.firstBlock.data.buffer, this.firstBlock.bufferByteOffset + (LENGTH_INDEX + 1) * Uint32Array.BYTES_PER_ELEMENT, 2);\r\n\r\n\t\t\tconst type = config?.type ?? Uint32Array;\r\n\t\t\tif(type === Uint32Array) {\r\n\t\t\t\tthis.type = TYPE.uint32;\r\n\t\t\t}\r\n\t\t\t// @ts-expect-error\r\n\t\t\telse if(type === Int32Array) {\r\n\t\t\t\tthis.type = TYPE.int32;\r\n\t\t\t}\r\n\t\t\t// @ts-expect-error\r\n\t\t\telse if(type === Float32Array) {\r\n\t\t\t\tthis.type = TYPE.float32;\r\n\t\t\t}\r\n\t\t\tthis.dataLength = config?.dataLength ?? 1;\r\n\t\t}\r\n\t}\r\n\r\n\tinsert(values: number | Array<number>) {\r\n\t\tif(typeof values === 'number') {\r\n\t\t\tvalues = [values];\r\n\t\t}\r\n\r\n\t\tlet dataLength = this.dataLength;\r\n\t\tif(values.length > dataLength) {\r\n\t\t\tthrow new Error(`Can't insert ${values.length} array into shared list of ${dataLength} dataLength`);\r\n\t\t}\r\n\t\tlet newBlock = this.memory.allocUI32(DATA_BLOCK_RECORD_KEEPING_COUNT + dataLength);\r\n\t\tlet newData = this.getDataBlock(newBlock.data);\r\n\t\tlet newBlockPointer = newBlock.pointer;\r\n\t\t\r\n\t\tfor(let i = 0; i < values.length; i++) {\r\n\t\t\tif(newData instanceof Int32Array || newData instanceof Uint32Array) {\r\n\t\t\t\tAtomics.store(newData, i, values[i]);\r\n\t\t\t} else {\r\n\t\t\t\t// TODO: Should we replace with pass thru float32 conversion -> store?\r\n\t\t\t\tnewData[i] = values[i];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tlet lastBlockPointer;\r\n\t\tlet updateWorked = false;\r\n\t\twhile(!updateWorked) {\r\n\t\t\tlastBlockPointer = loadRawPointer(this.firstBlock.data, 1);\r\n\t\t\tupdateWorked = replaceRawPointer(this.firstBlock.data, 1, newBlockPointer, lastBlockPointer);\r\n\t\t}\r\n\r\n\t\tif(lastBlockPointer) {\r\n\t\t\tlet { bufferPosition: lastBlockPosition, bufferByteOffset: lastBlockByteOffset } = getPointer(lastBlockPointer);\r\n\t\t\t// TODO: How to handle referencing memory we don't have access to yet because buffer not synced from worker?\r\n\t\t\tlet lastBlock = new Uint32Array(this.memory.buffers[lastBlockPosition].buf, lastBlockByteOffset, 1);\r\n\t\t\tstoreRawPointer(lastBlock, 0, newBlockPointer);\r\n\t\t} else {\r\n\t\t\t// First item - store on first block\r\n\t\t\tstoreRawPointer(this.firstBlock.data, 0, newBlockPointer);\r\n\t\t}\r\n\t\t\r\n\t\t// Always update new last buffer position and length\r\n\t\tAtomics.add(this.firstBlock.data, LENGTH_INDEX, 1);\r\n\t}\r\n\r\n\tdeleteMatch(callback: (values: T, index: number) => boolean): boolean {\r\n\t\tfor(let { data, index, deleteCurrent } of this) {\r\n\t\t\tif(callback(data, index)) {\r\n\t\t\t\tdeleteCurrent();\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t}\r\n\tdeleteIndex(deleteIndex: number): boolean {\r\n\t\tif(deleteIndex >= this.length || deleteIndex < 0) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn this.deleteMatch((values, index) => index === deleteIndex);\r\n\t}\r\n\tdeleteValue(deleteValues: number | Array<number>) {\r\n\t\tif(typeof deleteValues === 'number') {\r\n\t\t\treturn this.deleteMatch(values => values[0] === deleteValues);\r\n\t\t} else {\r\n\t\t\treturn this.deleteMatch(values => {\r\n\t\t\t\tif(values.length !== deleteValues.length) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tfor(let i = 0; i < values.length; i++) {\r\n\t\t\t\t\t\tif(values[i] !== deleteValues[i]) {\r\n\t\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tclear() {\r\n\t\tlet firstBlockPointer, lastBlockPointer;\r\n\t\tlet updateWorked = false;\r\n\t\twhile(!updateWorked) {\r\n\t\t\tfirstBlockPointer = loadRawPointer(this.firstBlock.data, 0);\r\n\t\t\tlastBlockPointer = loadRawPointer(this.firstBlock.data, 1);\r\n\t\t\t// Already cleared\r\n\t\t\tif(!lastBlockPointer) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tupdateWorked = replaceRawPointer(this.firstBlock.data, 1, 0, lastBlockPointer);\r\n\t\t}\r\n\t\t\r\n\t\t// Shouldn't be possible to hit: making Typescript happy\r\n\t\tif(!firstBlockPointer) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// We only want to update the last block if this is ran before something new was inserted\r\n\t\treplaceRawPointer(this.firstBlock.data, 0, 0, firstBlockPointer);\r\n\r\n\t\t// Iterate through inaccessible nodes and delete them\r\n\t\tlet deletedItems = 0;\r\n\t\tlet nextBlockPointer = firstBlockPointer;\r\n\t\twhile(nextBlockPointer) {\r\n\t\t\tlet { bufferPosition: nextBlockPosition, bufferByteOffset: nextBlockByteOffset } = getPointer(nextBlockPointer);\r\n\t\t\tlet memPool = this.memory.buffers[nextBlockPosition];\r\n\t\t\t// Short circuit iterations if we can't access memory\r\n\t\t\tif(!memPool) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tlet blockRecord = new Uint32Array(memPool.buf, nextBlockByteOffset, 2);\r\n\t\t\tnextBlockPointer = loadRawPointer(blockRecord, 0);\r\n\t\t\tdeletedItems++;\r\n\r\n\t\t\tif(this.onDelete) {\r\n\t\t\t\tthis.onDelete(this.getDataBlock(blockRecord));\r\n\t\t\t}\r\n\r\n\t\t\tmemPool.free(blockRecord.byteOffset);\r\n\t\t}\r\n\t\t\r\n\t\t// Subtract by however many we deleted so that a insert during this operation is accurate\r\n\t\tAtomics.sub(this.firstBlock.data, LENGTH_INDEX, deletedItems);\r\n\t}\r\n\r\n\t*[Symbol.iterator]() {\r\n\t\tlet currentIndex = 0;\r\n\t\tlet { bufferPosition: nextBlockPosition, bufferByteOffset: nextBlockByteOffset } = loadPointer(this.firstBlock.data, 0);\r\n\t\tlet lastBlockData = this.firstBlock.data;\r\n\t\tlet lastBlockPosition = 0;\r\n\t\tlet lastBlockByteOffset = 0;\r\n\t\twhile(nextBlockByteOffset) {\r\n\t\t\tlet memPool = this.memory.buffers[nextBlockPosition];\r\n\t\t\t// Short circuit iterations if we can't access memory\r\n\t\t\tif(!memPool) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tlet blockRecord = new Uint32Array(memPool.buf, nextBlockByteOffset, 2);\r\n\t\t\tlet blockData = this.getDataBlock(blockRecord);\r\n\r\n\t\t\tlet currentBlockPosition = nextBlockPosition;\r\n\t\t\tlet currentBlockByteOffset = nextBlockByteOffset;\r\n\t\t\t({ bufferPosition: nextBlockPosition, bufferByteOffset: nextBlockByteOffset } = loadPointer(blockRecord, 0));\r\n\r\n\t\t\tlet updateLastBlock = true;\r\n\t\t\tyield {\r\n\t\t\t\tdata: blockData,\r\n\t\t\t\tindex: currentIndex,\r\n\t\t\t\tdeleteCurrent: () => {\r\n\t\t\t\t\t// Move previous index to point to one after\r\n\t\t\t\t\tstorePointer(lastBlockData, 0, nextBlockPosition, nextBlockByteOffset);\r\n\r\n\t\t\t\t\t// If this is the last item, update last block to be previous location\r\n\t\t\t\t\tif(!nextBlockByteOffset) {\r\n\t\t\t\t\t\tstorePointer(this.firstBlock.data, 1, lastBlockPosition, lastBlockByteOffset);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif(this.onDelete) {\r\n\t\t\t\t\t\tthis.onDelete(this.getDataBlock(blockRecord));\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tmemPool.free(blockRecord.byteOffset);\r\n\t\t\t\t\tAtomics.sub(this.firstBlock.data, LENGTH_INDEX, 1);\r\n\t\t\t\t\tupdateLastBlock = false;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\tif(updateLastBlock) {\r\n\t\t\t\tlastBlockData = blockRecord;\r\n\t\t\t\tlastBlockPosition = currentBlockPosition;\r\n\t\t\t\tlastBlockByteOffset = currentBlockByteOffset;\r\n\t\t\t\tcurrentIndex++;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tforEach(callback: (data: T) => void) {\r\n\t\tfor(let value of this) {\r\n\t\t\tcallback(value.data);\r\n\t\t}\r\n\t}\r\n\r\n\tgetSharedMemory(): SharedListMemory {\r\n\t\treturn {\r\n\t\t\tfirstBlock: this.firstBlock.getSharedMemory()\r\n\t\t};\r\n\t}\r\n\r\n\tprivate getDataBlock(memory: Uint32Array): T {\r\n\t\tconst startIndex = memory.byteOffset + DATA_BLOCK_RECORD_KEEPING_COUNT * memory.BYTES_PER_ELEMENT;\r\n\r\n\t\tswitch(this.type) {\r\n\t\t\tcase TYPE.int32:\r\n\t\t\t\treturn new Int32Array(memory.buffer, startIndex, this.dataLength) as T;\r\n\t\t\tcase TYPE.uint32:\r\n\t\t\t\treturn new Uint32Array(memory.buffer, startIndex, this.dataLength) as T;\r\n\t\t\tcase TYPE.float32:\r\n\t\t\t\treturn new Float32Array(memory.buffer, startIndex, this.dataLength) as T;\r\n\t\t\tdefault:\r\n\t\t\t\tthrow new Error(`Unknown data block type ${this.type}`);\r\n\t\t}\r\n\t}\r\n\r\n\tfree() {\r\n\t\tlet { bufferPosition: nextBlockPosition, bufferByteOffset: nextBlockByteOffset } = loadPointer(this.firstBlock.data, 0);\r\n\t\twhile(nextBlockByteOffset) {\r\n\t\t\tlet allocatedMemory = new AllocatedMemory(this.memory, {\r\n\t\t\t\tbufferPosition: nextBlockPosition,\r\n\t\t\t\tbufferByteOffset: nextBlockByteOffset\r\n\t\t\t});\r\n\r\n\t\t\t({ bufferPosition: nextBlockPosition, bufferByteOffset: nextBlockByteOffset } = loadPointer(allocatedMemory.data, 0));\r\n\r\n\t\t\tif(this.onDelete) {\r\n\t\t\t\tthis.onDelete(this.getDataBlock(allocatedMemory.data));\r\n\t\t\t}\r\n\r\n\t\t\tallocatedMemory.free();\r\n\t\t}\r\n\r\n\t\tthis.firstBlock.free();\r\n\t}\r\n}\r\n\r\ninterface SharedListConfig<T extends Uint32Array | Int32Array | Float32Array> {\r\n\tinitWithBlock?: SharedAllocatedMemory\r\n\ttype?: TypedArrayConstructor<T>\r\n\tdataLength?: number\r\n}\r\ninterface SharedListMemory {\r\n\tfirstBlock: SharedAllocatedMemory\r\n}\r\n\r\ninterface SharedListIterable<T extends Uint32Array | Int32Array | Float32Array> {\r\n\tdata: T\r\n\tindex: number\r\n\tdeleteCurrent: () => void\r\n}\r\n\r\nexport { type SharedListMemory };","import AllocatedMemory, { type SharedAllocatedMemory } from './allocated-memory';\r\nimport type MemoryHeap from './memory-heap';\r\nimport SharedList from './shared-list';\r\nimport { loadPointer, storePointer } from './utils/pointer';\r\n\r\n// TODO: Grow hashMemory\r\n// TODO: Add iterator\r\n// TODO: Add read/write locks\r\nconst DEFAULT_HASH_SIZE = 10;\r\nexport default class SharedMap<K extends string | number> {\r\n\tstatic readonly ALLOCATE_COUNT = 4;\r\n\r\n\tprivate memory: MemoryHeap;\r\n\t// Memory order: Pointer, Lock, Length, MaxHash\r\n\tprivate pointerMemory: AllocatedMemory;\r\n\tprivate lock: Int32Array;\r\n\tprivate get hashMemory(): AllocatedMemory {\r\n\t\treturn new AllocatedMemory(this.memory, loadPointer(this.pointerMemory.data, 0));\r\n\t}\r\n\r\n\tget length(): number {\r\n\t\treturn Atomics.load(this.pointerMemory.data, 2);\r\n\t}\r\n\tget maxHash(): number {\r\n\t\treturn Atomics.load(this.pointerMemory.data, 3);\r\n\t}\r\n\r\n\tconstructor(memory: MemoryHeap, clone?: SharedMapMemory) {\r\n\t\tthis.memory = memory;\r\n\r\n\t\tif(clone) {\r\n\t\t\tthis.pointerMemory = new AllocatedMemory(memory, clone.firstBlock);\r\n\t\t} else {\r\n\t\t\tthis.pointerMemory = memory.allocUI32(SharedMap.ALLOCATE_COUNT);\r\n\t\t\tlet hashMemory = memory.allocUI32(DEFAULT_HASH_SIZE);\r\n\t\t\tstorePointer(this.pointerMemory.data, 0, hashMemory.bufferPosition, hashMemory.bufferByteOffset);\r\n\t\t\tAtomics.store(this.pointerMemory.data, 3, DEFAULT_HASH_SIZE);\r\n\t\t}\r\n\t\tthis.lock = new Int32Array(this.pointerMemory.data.buffer, this.pointerMemory.bufferByteOffset + Uint32Array.BYTES_PER_ELEMENT, 1);\r\n\t}\r\n\r\n\tset(key: K, value: number) {\r\n\t\tif(this.length >= this.maxHash * 2) {\r\n\t\t\tthis.growHashTable();\r\n\t\t}\r\n\r\n\t\tlet fullHashKey = get32BitHash(key);\r\n\t\tif(this.setHashKey(this.hashMemory, this.maxHash, fullHashKey, value)) {\r\n\t\t\tAtomics.add(this.pointerMemory.data, 2, 1);\r\n\t\t}\r\n\t}\r\n\tprivate setHashKey(hashMemory: AllocatedMemory, maxHash: number, fullHashKey: number, value: number) {\r\n\t\tlet hashKey = this.hash(fullHashKey, maxHash);\r\n\t\t\r\n\t\tlet list: SharedList;\r\n\t\tlet pointer = loadPointer(hashMemory.data, hashKey);\r\n\t\tif(pointer.bufferByteOffset === 0) {\r\n\t\t\t// Initialize a list here\r\n\t\t\tlist = new SharedList(this.memory, {\r\n\t\t\t\tdataLength: 2\r\n\t\t\t});\r\n\r\n\t\t\tlet listMemory = list.getSharedMemory();\r\n\t\t\tstorePointer(hashMemory.data, hashKey, listMemory.firstBlock.bufferPosition, listMemory.firstBlock.bufferByteOffset);\r\n\t\t} else {\r\n\t\t\tlist = new SharedList(this.memory, {\r\n\t\t\t\tfirstBlock: pointer\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// Check if any other items in list have the same key and delete them\r\n\t\tlet inserted = true;\r\n\t\tif(list.deleteValue(fullHashKey)) {\r\n\t\t\tinserted = false;\r\n\t\t}\r\n\t\tlist.insert([fullHashKey, value]);\r\n\t\t\r\n\t\treturn inserted;\r\n\t}\r\n\r\n\tget(key: K): number | undefined {\r\n\t\tlet fullHashKey = get32BitHash(key);\r\n\t\tlet hashKey = this.hash(fullHashKey, this.maxHash);\r\n\r\n\t\tlet pointer = loadPointer(this.hashMemory.data, hashKey);\r\n\t\tif(pointer.bufferByteOffset === 0) {\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\r\n\t\tlet list = new SharedList(this.memory, {\r\n\t\t\tfirstBlock: pointer\r\n\t\t});\r\n\r\n\t\tfor(let { data } of list) {\r\n\t\t\tif(data[0] === fullHashKey) {\r\n\t\t\t\treturn data[1];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn undefined;\r\n\t}\r\n\thas(key: K): boolean {\r\n\t\tlet fullHashKey = get32BitHash(key);\r\n\t\tlet hashKey = this.hash(fullHashKey, this.maxHash);\r\n\r\n\t\tlet pointer = loadPointer(this.hashMemory.data, hashKey);\r\n\t\tif(pointer.bufferByteOffset === 0) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tlet list = new SharedList(this.memory, {\r\n\t\t\tfirstBlock: pointer\r\n\t\t});\r\n\r\n\t\tfor(let { data } of list) {\r\n\t\t\tif(data[0] === fullHashKey) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t}\r\n\r\n\tdelete(key: K): boolean {\r\n\t\tlet fullHashKey = get32BitHash(key);\r\n\t\tlet hashKey = this.hash(fullHashKey, this.maxHash);\r\n\r\n\t\tlet pointer = loadPointer(this.hashMemory.data, hashKey);\r\n\t\tif(pointer.bufferByteOffset === 0) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tlet list = new SharedList(this.memory, {\r\n\t\t\tfirstBlock: pointer\r\n\t\t});\r\n\r\n\t\tfor(let { data, deleteCurrent } of list) {\r\n\t\t\tif(data[0] === fullHashKey) {\r\n\t\t\t\tdeleteCurrent();\r\n\r\n\t\t\t\tAtomics.sub(this.pointerMemory.data, 2, 1);\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t}\r\n\r\n\tprivate growHashTable() {\r\n\t\tlet oldMaxHash = this.maxHash;\r\n\t\tlet newMaxHash = oldMaxHash * 2;\r\n\t\tlet newHashMemory = this.memory.allocUI32(newMaxHash);\r\n\t\tlet oldHashMemory = this.hashMemory;\r\n\r\n\t\t// Copy each old hash value into new hash memory\r\n\t\tfor(let i = 0; i < oldMaxHash; i++) {\r\n\t\t\tlet pointer = loadPointer(oldHashMemory.data, i);\r\n\t\t\tif(pointer.bufferByteOffset === 0) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tlet list = new SharedList(this.memory, {\r\n\t\t\t\tfirstBlock: pointer\r\n\t\t\t});\r\n\t\t\tfor(let { data } of list) {\r\n\t\t\t\tthis.setHashKey(newHashMemory, newMaxHash, data[0], data[1]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstorePointer(this.pointerMemory.data, 0, newHashMemory.bufferPosition, newHashMemory.bufferByteOffset);\r\n\t\tAtomics.store(this.pointerMemory.data, 3, newMaxHash);\r\n\t}\r\n\r\n\tprivate hash(key: number, maxHash: number) {\r\n\t\treturn key % maxHash;\r\n\t}\r\n\r\n\tfree() {\r\n\t\t// Loop through and free lists in hash table first\r\n\t\tfor(let i = 0; i < this.maxHash; i++) {\r\n\t\t\tlet pointer = loadPointer(this.hashMemory.data, i);\r\n\t\t\tif(pointer.bufferByteOffset === 0) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tlet list = new SharedList(this.memory, {\r\n\t\t\t\tfirstBlock: pointer\r\n\t\t\t});\r\n\t\t\tlist.free();\r\n\t\t}\r\n\r\n\t\tthis.hashMemory.free();\r\n\t\tthis.pointerMemory.free();\r\n\t}\r\n\r\n\tgetSharedMemory(): SharedMapMemory {\r\n\t\treturn {\r\n\t\t\tfirstBlock: this.pointerMemory.getSharedMemory()\r\n\t\t};\r\n\t}\r\n}\r\n\r\ninterface SharedMapMemory {\r\n\tfirstBlock: SharedAllocatedMemory\r\n}\r\n\r\nfunction get32BitHash<K extends string | number>(key: K): number {\r\n\tif(typeof key === 'number') {\r\n\t\treturn key;\r\n\t} else if(typeof key === 'string') {\r\n\t\treturn hashString(key as string);\r\n\t} else {\r\n\t\treturn key;\r\n\t}\r\n}\r\n\r\n// Copied from https://github.com/mmomtchev/SharedMap/blob/master/index.js - MurmurHash2\r\nfunction hashString(str: string): number {\r\n\tlet\r\n\t\tl = str.length,\r\n\t\th = 17 ^ l,\r\n\t\ti = 0,\r\n\t\tk;\r\n\twhile(l >= 4) {\r\n\t\tk =\r\n\t\t\t((str.charCodeAt(i) & 0xff)) |\r\n\t\t\t((str.charCodeAt(++i) & 0xff) << 8) |\r\n\t\t\t((str.charCodeAt(++i) & 0xff) << 16) |\r\n\t\t\t((str.charCodeAt(++i) & 0xff) << 14);\r\n\t\tk = (((k & 0xffff) * 0x5bd1e995) + ((((k >>> 16) * 0x5bd1e995) & 0xffff) << 16));\r\n\t\tk ^= k >>> 14;\r\n\t\tk = (((k & 0xffff) * 0x5bd1e995) + ((((k >>> 16) * 0x5bd1e995) & 0xffff) << 16));\r\n\t\th = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16)) ^ k;\r\n\t\tl -= 4;\r\n\t\t++i;\r\n\t}\r\n\t/* eslint-disable no-fallthrough */\r\n\tswitch(l) {\r\n\t\tcase 3: h ^= (str.charCodeAt(i + 2) & 0xff) << 16;\r\n\t\tcase 2: h ^= (str.charCodeAt(i + 1) & 0xff) << 8;\r\n\t\tcase 1: h ^= (str.charCodeAt(i) & 0xff);\r\n\t\t\th = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16));\r\n\t}\r\n\t/* eslint-enable no-fallthrough */\r\n\th ^= h >>> 13;\r\n\th = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16));\r\n\th ^= h >>> 15;\r\n\th = h >>> 0;\r\n\treturn h;\r\n}\r\n\r\nexport type { SharedMapMemory };","import AllocatedMemory from './allocated-memory';\r\nimport type MemoryHeap from './memory-heap';\r\nimport type { SharedListMemory } from './shared-list';\r\nimport SharedList from './shared-list';\r\nimport { createPointer, loadPointer } from './utils/pointer';\r\n\r\nexport default abstract class SharedPointerList<T extends PointerItem> implements Iterable<T> {\r\n\tprivate memory: MemoryHeap;\r\n\tprivate list: SharedList;\r\n\r\n\tconstructor(heap: MemoryHeap, memory?: SharedListMemory) {\r\n\t\tthis.memory = heap;\r\n\r\n\t\tif(memory) {\r\n\t\t\tthis.list = new SharedList(heap, memory);\r\n\t\t} else {\r\n\t\t\tthis.list = new SharedList(heap);\r\n\t\t}\r\n\t}\r\n\r\n\tget length() {\r\n\t\treturn this.list.length;\r\n\t}\r\n\r\n\tinsert(item: T) {\r\n\t\tthis.list.insert(createPointer(item.memory.bufferPosition, item.memory.bufferByteOffset));\r\n\t}\r\n\tdelete(item: T) {\r\n\t\treturn this.list.deleteValue(createPointer(item.memory.bufferPosition, item.memory.bufferByteOffset));\r\n\t}\r\n\r\n\t*[Symbol.iterator]() {\r\n\t\tlet iterator = this.list[Symbol.iterator]();\r\n\r\n\t\tfor(let { data: pointerData } of iterator) {\r\n\t\t\tlet { bufferPosition, bufferByteOffset } = loadPointer(pointerData, 0);\r\n\t\t\tlet allocatedMemory = new AllocatedMemory(this.memory, {\r\n\t\t\t\tbufferPosition,\r\n\t\t\t\tbufferByteOffset\r\n\t\t\t});\r\n\t\t\tyield this.createItem(allocatedMemory);\r\n\t\t}\r\n\t}\r\n\tforEach(callback: (item: T) => void) {\r\n\t\tfor(let value of this) {\r\n\t\t\tcallback(value);\r\n\t\t}\r\n\t}\r\n\r\n\tfind(callback: (item: T) => boolean): T | undefined {\r\n\t\tfor(let value of this) {\r\n\t\t\tif(callback(value)) {\r\n\t\t\t\treturn value;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tgetSharedMemory() {\r\n\t\treturn this.list.getSharedMemory();\r\n\t}\r\n\r\n\tprotected abstract createItem(allocatedMemory: AllocatedMemory): T;\r\n\r\n\tfree() {\r\n\t\tfor(let item of this) {\r\n\t\t\t// NOTE: Anything that allocates it's own memory (ie: type for Item) needs to call free for that class so we can clear all memory recursively\r\n\t\t\tif('free' in item && typeof item.free === 'function') {\r\n\t\t\t\titem.free();\r\n\t\t\t} else {\r\n\t\t\t\titem.memory.free();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.list.free();\r\n\t}\r\n}\r\n\r\ninterface PointerItem {\r\n\treadonly memory: AllocatedMemory\r\n}","import AllocatedMemory from './allocated-memory';\r\nimport type { SharedAllocatedMemory } from './allocated-memory';\r\nimport { lock, unlock } from './lock/simple-lock';\r\nimport type MemoryHeap from './memory-heap';\r\nimport { getPointer, loadPointer, loadRawPointer, storeRawPointer } from './utils/pointer';\r\n\r\nenum CHAR_TYPE {\r\n\tUNDEFINED,\r\n\tASCII,\r\n\tUTF16\r\n}\r\nconst TYPED_ARRAY_MAP = {\r\n\t[CHAR_TYPE.ASCII]: Uint8Array,\r\n\t[CHAR_TYPE.UTF16]: Uint16Array\r\n};\r\n\r\nconst POINTER_INDEX = 0;\r\nconst LENGTH_INDEX = 1;\r\nconst TYPE_INDEX = 2;\r\nconst LOCK_INDEX = 3;\r\nexport default class SharedString {\r\n\tstatic readonly ALLOCATE_COUNT = 4;\r\n\r\n\tprivate memory: MemoryHeap;\r\n\tprivate allocatedMemory: AllocatedMemory;\r\n\tprivate lock: Int32Array;\r\n\r\n\tprivate cachedPointer?: number;\r\n\tprivate cachedString?: string;\r\n\t\r\n\tconstructor(memory: MemoryHeap, value: string | SharedStringConfig | SharedStringMemory) {\r\n\t\tthis.memory = memory;\r\n\r\n\t\tif(typeof value === 'string') {\r\n\t\t\tthis.allocatedMemory = this.memory.allocUI32(SharedString.ALLOCATE_COUNT);\r\n\t\t\tthis.lock = new Int32Array(this.allocatedMemory.data.buffer, this.allocatedMemory.bufferByteOffset + LOCK_INDEX * this.allocatedMemory.data.BYTES_PER_ELEMENT);\r\n\t\t\tthis.updateString(value);\r\n\t\t} else {\r\n\t\t\tthis.allocatedMemory = new AllocatedMemory(memory, value);\r\n\t\t\tthis.lock = new Int32Array(this.allocatedMemory.data.buffer, this.allocatedMemory.bufferByteOffset + LOCK_INDEX * this.allocatedMemory.data.BYTES_PER_ELEMENT);\r\n\r\n\t\t\t// We only allocated memory but didn't initialize the string yet\r\n\t\t\tif('value' in value) {\r\n\t\t\t\tthis.updateString(value.value);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t\r\n\tprivate updateString(value: string) {\r\n\t\tlet stringMemory = this.createString(value);\r\n\r\n\t\tlock(this.lock);\r\n\t\tstoreRawPointer(this.allocatedMemory.data, POINTER_INDEX, stringMemory.pointer);\r\n\t\tAtomics.store(this.allocatedMemory.data, LENGTH_INDEX, value.length);\r\n\t\tAtomics.store(this.allocatedMemory.data, TYPE_INDEX, stringMemory.charType);\r\n\t\tunlock(this.lock);\r\n\r\n\t\tthis.cachedPointer = stringMemory.pointer;\r\n\t\tthis.cachedString = value;\r\n\t}\r\n\tprivate createString(value: string) {\r\n\t\tif(value === '') {\r\n\t\t\treturn {\r\n\t\t\t\tpointer: 0,\r\n\t\t\t\tcharType: CHAR_TYPE.ASCII\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tlet charCodes = [];\r\n\t\tfor(let i = 0; i < value.length; i++) {\r\n\t\t\tcharCodes.push(value.charCodeAt(i));\r\n\t\t}\r\n\r\n\t\tlet maxCharCode = Math.max(...charCodes);\r\n\t\tlet charType = maxCharCode > 255 ? CHAR_TYPE.UTF16 : CHAR_TYPE.ASCII;\r\n\r\n\t\tlet typedArray = TYPED_ARRAY_MAP[charType];\r\n\t\tlet allocatedMemory = this.memory.allocUI32(Math.ceil(value.length / (4 / typedArray.BYTES_PER_ELEMENT)));\r\n\t\tlet data = new typedArray(allocatedMemory.data.buffer as ArrayBuffer, allocatedMemory.data.byteOffset, value.length);\r\n\t\tfor(let i = 0; i < value.length; i++) {\r\n\t\t\tdata[i] = value.charCodeAt(i);\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tpointer: allocatedMemory.pointer,\r\n\t\t\tcharType\r\n\t\t};\r\n\t}\r\n\r\n\tget value(): string {\r\n\t\tlet pointer = loadRawPointer(this.allocatedMemory.data, POINTER_INDEX);\r\n\t\tif(this.cachedPointer === pointer && this.cachedString !== undefined) {\r\n\t\t\treturn this.cachedString;\r\n\t\t} else if(pointer === 0) {\r\n\t\t\treturn '';\r\n\t\t}\r\n\t\tlet { bufferPosition, bufferByteOffset } = getPointer(pointer);\r\n\r\n\t\tlock(this.lock);\r\n\t\tlet charType = Atomics.load(this.allocatedMemory.data, TYPE_INDEX) as number;\r\n\t\t// @ts-expect-error\r\n\t\tlet typedArray = TYPED_ARRAY_MAP[charType];\r\n\t\tlet bufferLength = Atomics.load(this.allocatedMemory.data, LENGTH_INDEX);\r\n\r\n\t\tlet data = new typedArray(this.memory.buffers[bufferPosition].buf, bufferByteOffset, bufferLength);\r\n\t\tlet string = String.fromCharCode.apply(null, data);\r\n\t\t// NOTE: Do not unlock until after transforming the data since the second this is done it can free that memory block\r\n\t\tunlock(this.lock);\r\n\r\n\t\tthis.cachedPointer = pointer;\r\n\t\tthis.cachedString = string;\r\n\r\n\t\treturn string;\r\n\t}\r\n\tset value(value: string) {\r\n\t\tlet { bufferPosition: oldBufferPosition, bufferByteOffset: oldBufferByteOffset } = loadPointer(this.allocatedMemory.data, POINTER_INDEX);\r\n\t\tthis.updateString(value);\r\n\r\n\t\tif(oldBufferByteOffset) {\r\n\t\t\tthis.memory.buffers[oldBufferPosition].free(oldBufferByteOffset);\r\n\t\t}\r\n\t}\r\n\r\n\tgetSharedMemory(): SharedStringMemory {\r\n\t\treturn this.allocatedMemory.getSharedMemory();\r\n\t}\r\n\r\n\tget pointer() {\r\n\t\treturn this.allocatedMemory.pointer;\r\n\t}\r\n\r\n\tfree() {\r\n\t\tlet { bufferPosition, bufferByteOffset } = loadPointer(this.allocatedMemory.data, POINTER_INDEX);\r\n\t\tif(bufferByteOffset) {\r\n\t\t\tthis.memory.buffers[bufferPosition].free(bufferByteOffset);\r\n\t\t}\r\n\t\tthis.allocatedMemory.free();\r\n\t}\r\n}\r\n\r\ninterface SharedStringConfig extends SharedStringMemory {\r\n\tvalue: string\r\n}\r\ntype SharedStringMemory = SharedAllocatedMemory;","import type { SharedAllocatedMemory } from './allocated-memory';\r\nimport AllocatedMemory from './allocated-memory';\r\nimport type { TypedArrayConstructor } from './interfaces/typed-array-constructor';\r\nimport type MemoryHeap from './memory-heap';\r\nimport { getPointer, loadPointer, storePointer } from './utils/pointer';\r\n\r\nenum TYPE {\r\n\tuint32,\r\n\tint32,\r\n\tfloat32\r\n}\r\n\r\nconst VECTOR_INDEX = 0;\r\nconst LENGTH_INDEX = 1;\r\nconst BUFFER_LENGTH_INDEX = 2;\r\nconst TYPE_INDEX = 3;\r\nconst DEFAULT_SIZE = 4;\r\nexport default class SharedVector<T extends Uint32Array | Int32Array | Float32Array = Uint32Array> implements Iterable<T> {\r\n\tstatic readonly ALLOCATE_COUNT = 4;\r\n\tprivate memory: MemoryHeap;\r\n\r\n\t// Pointer, List Length, Buffer Length, Type/DataLength\r\n\tprivate firstBlock: AllocatedMemory;\r\n\tprivate uint16Array: Uint16Array;\r\n\r\n\tget length(): number {\r\n\t\treturn Atomics.load(this.firstBlock.data, LENGTH_INDEX);\r\n\t}\r\n\t\r\n\tget type(): number {\r\n\t\treturn this.uint16Array[0];\r\n\t}\r\n\tprivate set type(value: number) {\r\n\t\tAtomics.store(this.uint16Array, 0, value);\r\n\t}\r\n\tget dataLength(): number {\r\n\t\t// Can technically be initialized by passing memory without actually every being called - need to make sure dataLength is always at least one\r\n\t\treturn Math.max(1, this.uint16Array[1]);\r\n\t}\r\n\tprivate set dataLength(value: number) {\r\n\t\tAtomics.store(this.uint16Array, 1, value);\r\n\t}\r\n\r\n\tget bufferLength(): number {\r\n\t\treturn Atomics.load(this.firstBlock.data, BUFFER_LENGTH_INDEX);\r\n\t}\r\n\tprivate set bufferLength(value: number) {\r\n\t\tAtomics.store(this.firstBlock.data, BUFFER_LENGTH_INDEX, value);\r\n\t}\r\n\r\n\tget pointer() {\r\n\t\treturn this.firstBlock.pointer;\r\n\t}\r\n\r\n\tprivate cachedFullDataBlock?: T;\r\n\tprivate cachedPointer: number;\r\n\r\n\tconstructor(memory: MemoryHeap, config?: SharedVectorConfig<T> | SharedVectorMemory | SharedVectorMemory & SharedVectorConfig<T>) {\r\n\t\tthis.memory = memory;\r\n\r\n\t\tif(config && 'firstBlock' in config) {\r\n\t\t\tthis.firstBlock = new AllocatedMemory(memory, config.firstBlock);\r\n\t\t\tthis.uint16Array = new Uint16Array(this.firstBlock.data.buffer, this.firstBlock.bufferByteOffset + TYPE_INDEX * Uint32Array.BYTES_PER_ELEMENT, 2);\r\n\r\n\t\t\t// Pre-allocating memory and setting up in specific memory location\r\n\t\t\tif('type' in config || 'dataLength' in config) {\r\n\t\t\t\tlet dataBlock = memory.allocUI32(DEFAULT_SIZE * (config.dataLength ?? 1));\r\n\t\t\t\tstorePointer(this.firstBlock.data, VECTOR_INDEX, dataBlock.bufferPosition, dataBlock.bufferByteOffset);\r\n\t\t\t\tthis.bufferLength = DEFAULT_SIZE;\r\n\t\t\t\tthis.dataLength = (config.dataLength ?? 1);\r\n\t\t\t}\r\n\t\t\tif('type' in config) {\r\n\t\t\t\tconst type = config?.type ?? Uint32Array;\r\n\t\t\t\tif(type === Uint32Array) {\r\n\t\t\t\t\tthis.type = TYPE.uint32;\r\n\t\t\t\t}\r\n\t\t\t\t// @ts-expect-error\r\n\t\t\t\telse if(type === Int32Array) {\r\n\t\t\t\t\tthis.type = TYPE.int32;\r\n\t\t\t\t}\r\n\t\t\t\t// @ts-expect-error\r\n\t\t\t\telse if(type === Float32Array) {\r\n\t\t\t\t\tthis.type = TYPE.float32;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tthis.firstBlock = memory.allocUI32(SharedVector.ALLOCATE_COUNT);\r\n\t\t\tthis.uint16Array = new Uint16Array(this.firstBlock.data.buffer, this.firstBlock.bufferByteOffset + TYPE_INDEX * Uint32Array.BYTES_PER_ELEMENT, 2);\r\n\r\n\t\t\tlet dataLength = config?.dataLength ?? 1;\r\n\t\t\tlet bufferLength = config?.bufferLength ?? DEFAULT_SIZE;\r\n\t\t\tlet dataBlock = memory.allocUI32(bufferLength * dataLength);\r\n\t\t\tstorePointer(this.firstBlock.data, VECTOR_INDEX, dataBlock.bufferPosition, dataBlock.bufferByteOffset);\r\n\t\t\tthis.bufferLength = bufferLength;\r\n\r\n\t\t\tconst type = config?.type ?? Uint32Array;\r\n\t\t\tif(type === Uint32Array) {\r\n\t\t\t\tthis.type = TYPE.uint32;\r\n\t\t\t}\r\n\t\t\t// @ts-expect-error\r\n\t\t\telse if(type === Int32Array) {\r\n\t\t\t\tthis.type = TYPE.int32;\r\n\t\t\t}\r\n\t\t\t// @ts-expect-error\r\n\t\t\telse if(type === Float32Array) {\r\n\t\t\t\tthis.type = TYPE.float32;\r\n\t\t\t}\r\n\t\t\tthis.dataLength = dataLength;\r\n\t\t}\r\n\r\n\t\tthis.cachedPointer = this.firstBlock.data[0];\r\n\t\tthis.cachedFullDataBlock = this.getFullDataBlock();\r\n\t}\r\n\r\n\tat(index: number): T {\r\n\t\tlet length = this.length;\r\n\t\tif(index >= length || index < 0) {\r\n\t\t\tthrow new Error(`${index} is out of bounds ${length}`);\r\n\t\t}\r\n\r\n\t\tlet dataBlock = this.getFullDataBlock();\r\n\t\treturn this.getDataBlock(dataBlock, index);\r\n\t}\r\n\tget(index: number, dataIndex = 0): number {\r\n\t\tif(dataIndex >= this.dataLength) {\r\n\t\t\tthrow new Error(`${dataIndex} is out of dataLength bounds ${this.dataLength}`);\r\n\t\t} else if(index >= this.length || index < 0) {\r\n\t\t\tthrow new Error(`${index} is out of bounds ${this.length}`);\r\n\t\t}\r\n\r\n\t\tlet dataBlock = this.getFullDataBlock();\r\n\t\treturn dataBlock[index * this.dataLength + dataIndex];\r\n\t}\r\n\r\n\tpush(values: number | Array<number>): number {\r\n\t\tif(typeof values === 'number') {\r\n\t\t\tvalues = [values];\r\n\t\t}\r\n\r\n\t\tlet dataLength = this.dataLength;\r\n\t\tif(values.length > dataLength) {\r\n\t\t\tthrow new Error(`Can't insert ${values.length} array into shared list of ${dataLength} dataLength`);\r\n\t\t}\r\n\r\n\t\tlet dataBlock = this.getFullDataBlock();\r\n\t\tlet currentLength = this.length;\r\n\t\tdataBlock.set(values, dataLength * currentLength);\r\n\r\n\t\tlet newLength = Atomics.add(this.firstBlock.data, LENGTH_INDEX, 1) + 1;\r\n\t\tif(newLength >= this.bufferLength) {\r\n\t\t\tthis.growBuffer();\r\n\t\t}\r\n\r\n\t\treturn currentLength;\r\n\t}\r\n\r\n\tpop(): T {\r\n\t\tlet oldLength = Atomics.sub(this.firstBlock.data, LENGTH_INDEX, LENGTH_INDEX);\r\n\r\n\t\tlet dataBlock = this.getFullDataBlock();\r\n\t\treturn this.getDataBlock(dataBlock, oldLength - 1);\r\n\t}\r\n\r\n\tdeleteIndex(index: number) {\r\n\t\tlet length = this.length;\r\n\t\tif(index >= length || index < 0) {\r\n\t\t\tthrow new Error(`${index} is out of bounds ${length}`);\r\n\t\t}\r\n\r\n\t\tlet dataLength = this.dataLength;\r\n\t\tlet dataBlock = this.getFullDataBlock();\r\n\t\tfor(let i = index; i < length; i++) {\r\n\t\t\tfor(let j = 0; j < dataLength; j++) {\r\n\t\t\t\tdataBlock[i * dataLength + j] = dataBlock[(i + 1) * dataLength + j];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tAtomics.sub(this.firstBlock.data, LENGTH_INDEX, LENGTH_INDEX);\r\n\t}\r\n\r\n\tclear() {\r\n\t\tthis.firstBlock.data[LENGTH_INDEX] = 0;\r\n\t}\r\n\r\n\t*[Symbol.iterator]() {\r\n\t\tlet dataBlock = this.getFullDataBlock();\r\n\r\n\t\tfor(let i = 0; i < this.length; i++) {\r\n\t\t\tyield this.getDataBlock(dataBlock, i);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate getFullDataBlock(): T {\r\n\t\tlet pointerNumber = Atomics.load(this.firstBlock.data, VECTOR_INDEX);\r\n\t\tif(this.cachedPointer === pointerNumber && this.cachedFullDataBlock) {\r\n\t\t\treturn this.cachedFullDataBlock;\r\n\t\t}\r\n\r\n\t\tlet pointer = getPointer(pointerNumber);\r\n\t\tlet rawData = new AllocatedMemory(this.memory, pointer);\r\n\r\n\t\tlet data: T;\r\n\t\tswitch(this.type) {\r\n\t\t\tcase TYPE.int32:\r\n\t\t\t\tdata = new Int32Array(rawData.data.buffer, rawData.bufferByteOffset, this.dataLength * this.bufferLength) as T;\r\n\t\t\t\tbreak;\r\n\t\t\tcase TYPE.uint32:\r\n\t\t\t\tdata = new Uint32Array(rawData.data.buffer, rawData.bufferByteOffset, this.dataLength * this.bufferLength) as T;\r\n\t\t\t\tbreak;\r\n\t\t\tcase TYPE.float32:\r\n\t\t\t\tdata = new Float32Array(rawData.data.buffer, rawData.bufferByteOffset, this.dataLength * this.bufferLength) as T;\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\tthrow new Error(`Unknown data block type ${this.type}`);\r\n\t\t}\r\n\r\n\t\tthis.cachedPointer = pointerNumber;\r\n\t\tthis.cachedFullDataBlock = data;\r\n\r\n\t\treturn data;\r\n\t}\r\n\tprivate getDataBlock(rawData: T, index: number): T {\r\n\t\tconst start = index * this.dataLength;\r\n\t\treturn rawData.subarray(start, start + this.dataLength) as T;\r\n\t}\r\n\r\n\tprivate growBuffer() {\r\n\t\tlet oldBufferLength = this.bufferLength;\r\n\t\tlet newBufferLength = oldBufferLength * 2;\r\n\t\tlet dataLength = this.dataLength;\r\n\r\n\t\tlet oldPointer = loadPointer(this.firstBlock.data, VECTOR_INDEX);\r\n\t\tlet oldDataMemory = new AllocatedMemory(this.memory, oldPointer);\r\n\t\tlet oldDataBlock = this.getFullDataBlock();\r\n\t\tlet newDataBlock = this.memory.allocUI32(newBufferLength * dataLength);\r\n\r\n\t\tlet newData: T;\r\n\t\tswitch(this.type) {\r\n\t\t\tcase TYPE.int32:\r\n\t\t\t\tnewData = new Int32Array(newDataBlock.data.buffer, newDataBlock.bufferByteOffset, dataLength * this.bufferLength) as T;\r\n\t\t\t\tbreak;\r\n\t\t\tcase TYPE.uint32:\r\n\t\t\t\tnewData = new Uint32Array(newDataBlock.data.buffer, newDataBlock.bufferByteOffset, dataLength * this.bufferLength) as T;\r\n\t\t\t\tbreak;\r\n\t\t\tcase TYPE.float32:\r\n\t\t\t\tnewData = new Float32Array(newDataBlock.data.buffer, newDataBlock.bufferByteOffset, dataLength * this.bufferLength) as T;\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\tthrow new Error(`Unknown data block type ${this.type}`);\r\n\t\t}\r\n\r\n\t\t// Copy old buffer into new buffer\r\n\t\tnewData.set(oldDataBlock);\r\n\r\n\t\tstorePointer(this.firstBlock.data, VECTOR_INDEX, newDataBlock.bufferPosition, newDataBlock.bufferByteOffset);\r\n\t\tthis.bufferLength = newBufferLength;\r\n\t\toldDataMemory.free();\r\n\t}\r\n\r\n\tfree() {\r\n\t\tlet pointer = loadPointer(this.firstBlock.data, VECTOR_INDEX);\r\n\t\tlet dataMemory = new AllocatedMemory(this.memory, pointer);\r\n\r\n\t\tdataMemory.free();\r\n\t\tthis.firstBlock.free();\r\n\t}\r\n\r\n\tgetSharedMemory(): SharedVectorMemory {\r\n\t\treturn {\r\n\t\t\tfirstBlock: this.firstBlock.getSharedMemory()\r\n\t\t};\r\n\t}\r\n}\r\n\r\ninterface SharedVectorConfig<T extends Uint32Array | Int32Array | Float32Array> {\r\n\ttype?: TypedArrayConstructor<T>\r\n\tdataLength?: number\r\n\r\n\tbufferLength?: number\r\n}\r\ninterface SharedVectorMemory {\r\n\tfirstBlock: SharedAllocatedMemory\r\n}\r\n\r\nexport type { SharedVectorConfig, SharedVectorMemory };","import type { SharedAllocatedMemory } from './allocated-memory';\r\nimport type MemoryHeap from './memory-heap';\r\nimport SharedList, { type SharedListMemory } from './shared-list';\r\n\r\nexport default abstract class CachedItemList<T extends Item> implements Iterable<{ item: T, deleteCurrent: () => void }> {\r\n\tstatic readonly ALLOCATE_COUNT = SharedList.ALLOCATE_COUNT;\r\n\r\n\tprotected heap: MemoryHeap;\r\n\tprotected list: SharedList;\r\n\tprotected cache: Map<number, T> = new Map();\r\n\r\n\tconstructor(heap: MemoryHeap, config?: CachedListConfig | SharedListMemory) {\r\n\t\tif(config) {\r\n\t\t\tthis.list = new SharedList(heap, config);\r\n\t\t} else {\r\n\t\t\tthis.list = new SharedList(heap);\r\n\t\t}\r\n\t\tthis.heap = heap;\r\n\r\n\t\tthis.list.onDelete = (pointerData: Uint32Array) => {\r\n\t\t\tlet pointer = Atomics.load(pointerData, 0);\r\n\t\t\tif(pointer) {\r\n\t\t\t\tlet item = this.cache.get(pointer);\r\n\t\t\t\tif(!item) {\r\n\t\t\t\t\titem = this.initItem(pointer);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif(item) {\r\n\t\t\t\t\titem.free();\r\n\t\t\t\t\tthis.cache.delete(pointer);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t}\r\n\r\n\tget length() {\r\n\t\treturn this.list.length;\r\n\t}\r\n\r\n\tclear() {\r\n\t\tthis.list.clear();\r\n\t\tthis.cache.clear();\r\n\t}\r\n\r\n\tinsert(item: T) {\r\n\t\tthis.list.insert(item.pointer);\r\n\t\tthis.cache.set(item.pointer, item);\r\n\t}\r\n\tdelete(item: T) {\r\n\t\tthis.cache.delete(item.pointer);\r\n\t\treturn this.list.deleteValue(item.pointer);\r\n\t}\r\n\r\n\tgetByPointer(pointer: number): T | undefined {\r\n\t\tlet item = this.cache.get(pointer);\r\n\t\tif(!item) {\r\n\t\t\titem = this.initItem(pointer);\r\n\t\t\tif(item) {\r\n\t\t\t\tthis.cache.set(pointer, item);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn item;\r\n\t}\r\n\tprotected abstract initItem(pointer: number): T | undefined\r\n\r\n\t*[Symbol.iterator]() {\r\n\t\tlet iterator = this.list[Symbol.iterator]();\r\n\r\n\t\tfor(let { data: pointerData, deleteCurrent } of iterator) {\r\n\t\t\tlet pointer = Atomics.load(pointerData, 0);\r\n\t\t\tif(!pointer) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tlet item = this.cache.get(pointer);\r\n\t\t\tif(!item) {\r\n\t\t\t\titem = this.initItem(pointer);\r\n\t\t\t\tif(item) {\r\n\t\t\t\t\tthis.cache.set(pointer, item);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif(item) {\r\n\t\t\t\tyield {\r\n\t\t\t\t\titem,\r\n\t\t\t\t\tdeleteCurrent\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tforEach(callback: (item: T) => void, filter?: (item: T) => boolean) {\r\n\t\tfor(let { item } of this) {\r\n\t\t\tif(!filter || filter(item)) {\r\n\t\t\t\tcallback(item);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tfind(callback: (item: T) => boolean): T | undefined {\r\n\t\tfor(let { item } of this) {\r\n\t\t\tif(callback(item)) {\r\n\t\t\t\treturn item;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tfilter(callback: (entity: T) => boolean): Array<T> {\r\n\t\tlet items = [];\r\n\t\tfor(let { item } of this) {\r\n\t\t\tif(callback(item)) {\r\n\t\t\t\titems.push(item);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn items;\r\n\t}\r\n\tmap<X>(callback: (item: T) => X): Array<X> {\r\n\t\tconst array: Array<X> = [];\r\n\t\tfor(let { item } of this) {\r\n\t\t\tarray.push(callback(item));\r\n\t\t}\r\n\r\n\t\treturn array;\r\n\t}\r\n\r\n\tgetSharedMemory() {\r\n\t\treturn this.list.getSharedMemory();\r\n\t}\r\n\r\n\tfree() {\r\n\t\tthis.list.free();\r\n\t\tthis.cache.clear();\r\n\t}\r\n}\r\n\r\nexport interface CachedListConfig {\r\n\tinitWithBlock: SharedAllocatedMemory\r\n}\r\n\r\ninterface Item {\r\n\tpointer: number\r\n\tfree: () => void\r\n}","import type { SharedAllocatedMemory } from './allocated-memory';\r\nimport AllocatedMemory from './allocated-memory';\r\nimport type { TypedArrayConstructor } from './interfaces/typed-array-constructor';\r\nimport type MemoryHeap from './memory-heap';\r\nimport SharedVector from './shared-vector';\r\nimport { getPointer } from './utils/pointer';\r\n\r\nenum TYPE {\r\n\tuint32,\r\n\tint32,\r\n\tfloat32,\r\n\tfloat64\r\n}\r\n\r\nconst LENGTH_INDEX = 0;\r\nconst TYPE_INDEX = 1;\r\nconst MAX_CHUNK_SIZE_INDEX = 2;\r\nconst POINTERS_INDEX = 3;\r\nconst RECYCLE_INDEX = POINTERS_INDEX + SharedVector.ALLOCATE_COUNT;\r\n\r\n// Array with stable indexes and maximum contiguous memory sizes (necessary to fit large data sets into max 1MB buffers)\r\n// https://plflib.org/colony.htm for future enhancements - it seems to be an optimized version of what we were aiming for with this\r\nexport default class SharedPool<T extends Uint32Array | Int32Array | Float32Array | Float64Array = Uint32Array> implements Iterable<T> {\r\n\tstatic readonly ALLOCATE_COUNT = 3 + SharedVector.ALLOCATE_COUNT * 2;\r\n\tprivate memory: MemoryHeap;\r\n\r\n\t// Current Length, Type/DataLength, MaxChunkLength, Pointer vector, Recycle vector\r\n\tprivate firstBlock: AllocatedMemory;\r\n\tprivate uint16Array: Uint16Array;\r\n\tprivate pointerVector: SharedVector<Uint32Array>;\r\n\tprivate recycleVector: SharedVector<Uint32Array>;\r\n\r\n\tprivate cachedFullDataBlock: { [key: number]: T } = {};\r\n\r\n\tget length(): number {\r\n\t\treturn Atomics.load(this.firstBlock.data, LENGTH_INDEX) - this.recycleVector.length;\r\n\t}\r\n\tget maxChunkSize(): number {\r\n\t\treturn this.firstBlock.data[MAX_CHUNK_SIZE_INDEX];\r\n\t}\r\n\tprivate set maxChunkSize(value: number) {\r\n\t\tAtomics.store(this.firstBlock.data, MAX_CHUNK_SIZE_INDEX, value);\r\n\t}\r\n\t\r\n\tget type(): number {\r\n\t\treturn this.uint16Array[0];\r\n\t}\r\n\tprivate set type(value: number) {\r\n\t\tAtomics.store(this.uint16Array, 0, value);\r\n\t}\r\n\tget dataLength(): number {\r\n\t\treturn Math.max(1, this.uint16Array[1]);\r\n\t}\r\n\tprivate set dataLength(value: number) {\r\n\t\tAtomics.store(this.uint16Array, 1, value);\r\n\t}\r\n\r\n\tget bufferLength(): number {\r\n\t\treturn this.maxChunkSize * this.pointerVector.length;\r\n\t}\r\n\tget byteMultipler(): number {\r\n\t\tif(this.type === TYPE.float64) {\r\n\t\t\treturn 2;\r\n\t\t} else {\r\n\t\t\treturn 1;\r\n\t\t}\r\n\t}\r\n\r\n\tconstructor(memory: MemoryHeap, config?: SharedPoolConfig<T> | SharedPoolMemory) {\r\n\t\tthis.memory = memory;\r\n\r\n\t\tif(config && 'firstBlock' in config) {\r\n\t\t\tthis.firstBlock = new AllocatedMemory(memory, config.firstBlock);\r\n\t\t\tthis.uint16Array = new Uint16Array(this.firstBlock.data.buffer, this.firstBlock.bufferByteOffset + TYPE_INDEX * Uint32Array.BYTES_PER_ELEMENT, 2);\r\n\t\t\tthis.pointerVector = new SharedVector(memory, {\r\n\t\t\t\tfirstBlock: {\r\n\t\t\t\t\tbufferPosition: this.firstBlock.bufferPosition,\r\n\t\t\t\t\tbufferByteOffset: this.firstBlock.bufferByteOffset + POINTERS_INDEX * Uint32Array.BYTES_PER_ELEMENT\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\tthis.recycleVector = new SharedVector(memory, {\r\n\t\t\t\tfirstBlock: {\r\n\t\t\t\t\tbufferPosition: this.firstBlock.bufferPosition,\r\n\t\t\t\t\tbufferByteOffset: this.firstBlock.bufferByteOffset + RECYCLE_INDEX * Uint32Array.BYTES_PER_ELEMENT\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\tthis.firstBlock = memory.allocUI32(SharedPool.ALLOCATE_COUNT);\r\n\t\t\tthis.uint16Array = new Uint16Array(this.firstBlock.data.buffer, this.firstBlock.bufferByteOffset + TYPE_INDEX * Uint32Array.BYTES_PER_ELEMENT, 2);\r\n\r\n\t\t\tlet dataLength = config?.dataLength ?? 1;\r\n\t\t\tlet maxLength = config?.maxChunkSize ?? 100;\r\n\r\n\t\t\tthis.pointerVector = new SharedVector(memory, {\r\n\t\t\t\ttype: Uint32Array,\r\n\t\t\t\tfirstBlock: {\r\n\t\t\t\t\tbufferPosition: this.firstBlock.bufferPosition,\r\n\t\t\t\t\tbufferByteOffset: this.firstBlock.bufferByteOffset + POINTERS_INDEX * Uint32Array.BYTES_PER_ELEMENT\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\tthis.recycleVector = new SharedVector(memory, {\r\n\t\t\t\ttype: Uint32Array,\r\n\t\t\t\tfirstBlock: {\r\n\t\t\t\t\tbufferPosition: this.firstBlock.bufferPosition,\r\n\t\t\t\t\tbufferByteOffset: this.firstBlock.bufferByteOffset + RECYCLE_INDEX * Uint32Array.BYTES_PER_ELEMENT\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tconst type = config?.type ?? Uint32Array;\r\n\t\t\tif(type === Uint32Array) {\r\n\t\t\t\tthis.type = TYPE.uint32;\r\n\t\t\t}\r\n\t\t\t// @ts-expect-error\r\n\t\t\telse if(type === Int32Array) {\r\n\t\t\t\tthis.type = TYPE.int32;\r\n\t\t\t}\r\n\t\t\t// @ts-expect-error\r\n\t\t\telse if(type === Float32Array) {\r\n\t\t\t\tthis.type = TYPE.float32;\r\n\t\t\t// @ts-expect-error\r\n\t\t\t} else if(type === Float64Array) {\r\n\t\t\t\tthis.type = TYPE.float64;\r\n\t\t\t}\r\n\t\t\tthis.dataLength = dataLength;\r\n\t\t\tthis.maxChunkSize = maxLength;\r\n\r\n\t\t\tlet firstArray = memory.allocUI32(maxLength * dataLength * this.byteMultipler);\r\n\t\t\tthis.pointerVector.push(firstArray.pointer);\r\n\t\t}\r\n\t}\r\n\r\n\tat(index: number): T {\r\n\t\tlet dataBlock = this.getFullDataBlock(index);\r\n\t\treturn this.getDataBlock(dataBlock, index % this.maxChunkSize);\r\n\t}\r\n\tget(index: number, dataIndex = 0): number {\r\n\t\tconst dataLength = this.dataLength;\r\n\t\tif(dataIndex >= dataLength) {\r\n\t\t\tthrow new Error(`${dataIndex} is out of dataLength bounds ${dataLength}`);\r\n\t\t}\r\n\r\n\t\tlet dataBlock = this.getFullDataBlock(index);\r\n\t\treturn dataBlock[(index % this.maxChunkSize) * dataLength + dataIndex];\r\n\t}\r\n\r\n\tpush(values: number | Array<number>): number {\r\n\t\tif(typeof values === 'number') {\r\n\t\t\tvalues = [values];\r\n\t\t}\r\n\r\n\t\tlet dataLength = this.dataLength;\r\n\t\tif(values.length > dataLength) {\r\n\t\t\tthrow new Error(`Can't insert ${values.length} array into shared list of ${dataLength} dataLength`);\r\n\t\t}\r\n\r\n\t\tlet newIndex;\r\n\t\tif(this.recycleVector.length) {\r\n\t\t\tnewIndex = this.recycleVector.pop()[0];\r\n\t\t} else {\r\n\t\t\tnewIndex = Atomics.add(this.firstBlock.data, LENGTH_INDEX, 1);\r\n\t\t}\r\n\t\t\r\n\t\tlet dataBlock = this.getFullDataBlock(newIndex);\r\n\t\tlet blockIndex = newIndex % this.maxChunkSize;\r\n\t\tdataBlock.set(values, dataLength * blockIndex);\r\n\r\n\t\treturn newIndex;\r\n\t}\r\n\r\n\tdeleteIndex(index: number) {\r\n\t\tthis.recycleVector.push(index);\r\n\t}\r\n\r\n\tclear() {\r\n\t\tthis.firstBlock.data[LENGTH_INDEX] = 0;\r\n\t}\r\n\r\n\t*[Symbol.iterator]() {\r\n\t\tlet recycledValues = [...this.recycleVector].reduce((array, value) => {\r\n\t\t\tarray.push(...value);\r\n\t\t\treturn array;\r\n\t\t}, [] as Array<number>);\r\n\r\n\t\tlet dataBlock = this.getFullDataBlock(0);\r\n\t\tlet dataBlockIndex = 0;\r\n\t\tfor(let i = 0; i < Atomics.load(this.firstBlock.data, LENGTH_INDEX); i++) {\r\n\t\t\tif(!recycledValues.includes(i)) {\r\n\t\t\t\tlet newDataBlockIndex = Math.floor(i / this.maxChunkSize);\r\n\t\t\t\tif(newDataBlockIndex !== dataBlockIndex) {\r\n\t\t\t\t\tdataBlock = this.getFullDataBlock(i);\r\n\t\t\t\t\tdataBlockIndex = newDataBlockIndex;\r\n\t\t\t\t}\r\n\t\t\t\tyield this.getDataBlock(dataBlock, i % this.maxChunkSize);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tprivate getFullDataBlock(index: number) {\r\n\t\tlet pointerIndex = Math.floor(index / this.maxChunkSize);\r\n\t\tlet cachedDataBlock = this.cachedFullDataBlock[pointerIndex];\r\n\t\tif(cachedDataBlock) {\r\n\t\t\treturn cachedDataBlock;\r\n\t\t}\r\n\t\tif(pointerIndex >= this.pointerVector.length) {\r\n\t\t\tlet newArray = this.memory.allocUI32(this.maxChunkSize * this.dataLength * this.byteMultipler);\r\n\t\t\tthis.pointerVector.push(newArray.pointer);\r\n\t\t}\r\n\r\n\t\tlet array = new AllocatedMemory(this.memory, getPointer(this.pointerVector.get(pointerIndex)));\r\n\r\n\t\tlet data: T;\r\n\t\tswitch(this.type) {\r\n\t\t\tcase TYPE.int32:\r\n\t\t\t\tdata = new Int32Array(array.data.buffer, array.bufferByteOffset, this.dataLength * this.maxChunkSize) as T;\r\n\t\t\t\tbreak;\r\n\t\t\tcase TYPE.uint32:\r\n\t\t\t\tdata = new Uint32Array(array.data.buffer, array.bufferByteOffset, this.dataLength * this.maxChunkSize) as T;\r\n\t\t\t\tbreak;\r\n\t\t\tcase TYPE.float32:\r\n\t\t\t\tdata = new Float32Array(array.data.buffer, array.bufferByteOffset, this.dataLength * this.maxChunkSize) as T;\r\n\t\t\t\tbreak;\r\n\t\t\tcase TYPE.float64:\r\n\t\t\t\tdata = new Float64Array(array.data.buffer, array.bufferByteOffset, this.dataLength * this.maxChunkSize) as T;\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\tthrow new Error(`Unknown data block type ${this.type}`);\r\n\t\t}\r\n\r\n\t\tthis.cachedFullDataBlock[pointerIndex] = data;\r\n\t\treturn data;\r\n\t}\r\n\r\n\tprivate getDataBlock(rawData: T, index: number): T {\r\n\t\tconst start = index * this.dataLength;\r\n\t\treturn rawData.subarray(start, start + this.dataLength) as T;\r\n\t}\r\n\r\n\tfree() {\r\n\t\tthis.recycleVector.free();\r\n\r\n\t\tfor(let pointerArray of this.pointerVector) {\r\n\t\t\tlet pointer = pointerArray[0];\r\n\t\t\tlet memory = new AllocatedMemory(this.memory, getPointer(pointer));\r\n\t\t\tmemory.free();\r\n\t\t}\r\n\t\tthis.pointerVector.free();\r\n\t\tthis.firstBlock.free();\r\n\t}\r\n\r\n\tgetSharedMemory(): SharedPoolMemory {\r\n\t\treturn {\r\n\t\t\tfirstBlock: this.firstBlock.getSharedMemory()\r\n\t\t};\r\n\t}\r\n}\r\n\r\ninterface SharedPoolConfig<T extends Uint32Array | Int32Array | Float32Array | Float64Array> {\r\n\tmaxChunkSize?: number\r\n\ttype?: TypedArrayConstructor<T>\r\n\tdataLength?: number\r\n}\r\ninterface SharedPoolMemory {\r\n\tfirstBlock: SharedAllocatedMemory\r\n}\r\n\r\nexport type { SharedPoolConfig, SharedPoolMemory };","const buffer = new ArrayBuffer(4);\r\nconst uint32Array = new Uint32Array(buffer);\r\nconst uint16Array = new Uint16Array(buffer);\r\n\r\nexport function load16From32(data: Uint32Array, index: number): [number, number] {\r\n\treturn convert32To16(Atomics.load(data, index));\r\n}\r\n\r\nexport function store16In32(data: Uint32Array, index: number, value1: number, value2: number) {\r\n\tAtomics.store(data, index, convert16To32(value1, value2));\r\n}\r\n\r\nexport function convert32To16(value: number): [number, number] {\r\n\tuint32Array[0] = value;\r\n\r\n\treturn [uint16Array[0], uint16Array[1]];\r\n}\r\nexport function convert16To32(value1: number, value2: number): number {\r\n\tuint16Array[0] = value1;\r\n\tuint16Array[1] = value2;\r\n\r\n\treturn uint32Array[0];\r\n}","const buffer = new ArrayBuffer(8);\r\nconst uint64Array = new BigUint64Array(buffer);\r\nconst uint16Array = new Uint16Array(buffer);\r\n\r\nexport function load16From64(data: BigUint64Array, index: number): [number, number, number, number] {\r\n\tuint64Array[0] = Atomics.load(data, index);\r\n\t\r\n\treturn [uint16Array[0], uint16Array[1], uint16Array[2], uint16Array[3]];\r\n}\r\n\r\nexport function store16In64(data: BigUint64Array, index: number, value1: number, value2: number, value3: number, value4: number = 0) {\r\n\tuint16Array[0] = value1;\r\n\tuint16Array[1] = value2;\r\n\tuint16Array[2] = value3;\r\n\tuint16Array[3] = value4;\r\n\r\n\tAtomics.store(data, index, uint64Array[0]);\r\n}","// For doing Atomic operations on floats in SharedArrayBuffers\r\nconst buffer = new ArrayBuffer(4);\r\nconst float32 = new Float32Array(buffer);\r\nconst int32 = new Int32Array(buffer);\r\n\r\nexport function loadFloat32(data: Int32Array | Uint32Array | Float32Array, index: number) {\r\n\tif(data instanceof Float32Array) {\r\n\t\tdata = new Int32Array(data.buffer, data.byteOffset, data.length);\r\n\t}\r\n\r\n\treturn convertInt32ToFloat32(Atomics.load(data, index));\r\n}\r\nexport function storeFloat32(data: Int32Array | Uint32Array | Float32Array, index: number, value: number) {\r\n\tif(data instanceof Float32Array) {\r\n\t\tdata = new Int32Array(data.buffer, data.byteOffset, data.length);\r\n\t}\r\n\r\n\tAtomics.store(data, index, convertFloat32ToInt32(value));\r\n}\r\n\r\nexport function convertInt32ToFloat32(value: number) {\r\n\tint32[0] = value;\r\n\r\n\treturn float32[0];\r\n}\r\nexport function convertFloat32ToInt32(value: number) {\r\n\tfloat32[0] = value;\r\n\r\n\treturn int32[0];\r\n}\r\n\r\nexport function exchangeFloat32(data: Int32Array | Uint32Array | Float32Array, index: number, value: number) {\r\n\tif(data instanceof Float32Array) {\r\n\t\tdata = new Int32Array(data.buffer, data.byteOffset, data.length);\r\n\t}\r\n\r\n\treturn convertInt32ToFloat32(Atomics.exchange(data, index, convertFloat32ToInt32(value)));\r\n}\r\n\r\nexport function compareExchangeFloat32(data: Int32Array | Uint32Array | Float32Array, index: number, expectedValue: number, replacementValue: number) {\r\n\tif(data instanceof Float32Array) {\r\n\t\tdata = new Int32Array(data.buffer, data.byteOffset, data.length);\r\n\t}\r\n\r\n\treturn convertInt32ToFloat32(Atomics.compareExchange(data, index, convertFloat32ToInt32(expectedValue), convertFloat32ToInt32(replacementValue)));\r\n}","import { compareExchangeFloat32, loadFloat32 } from './float32-atomics';\r\n\r\nexport function addAtomicInt(array: Uint32Array | Int32Array, index: number, amount: number, max: number) {\r\n\tlet oldValue;\r\n\tlet newValue;\r\n\tdo {\r\n\t\toldValue = Atomics.load(array, index);\r\n\t\tnewValue = Math.min(oldValue + amount, max);\r\n\t} while(Atomics.compareExchange(array, index, oldValue, newValue) !== oldValue);\r\n}\r\n\r\nexport function subtractAtomicInt(array: Uint32Array | Int32Array, index: number, amount: number, min: number) {\r\n\tlet oldValue;\r\n\tlet newValue;\r\n\tdo {\r\n\t\toldValue = Atomics.load(array, index);\r\n\t\tnewValue = Math.max(oldValue - amount, min);\r\n\t} while(Atomics.compareExchange(array, index, oldValue, newValue) !== oldValue);\r\n}\r\n\r\nexport function addAtomicFloat32(array: Float32Array, index: number, amount: number, max: number) {\r\n\tlet oldValue;\r\n\tlet newValue;\r\n\tdo {\r\n\t\toldValue = loadFloat32(array, index);\r\n\t\tnewValue = Math.min(oldValue + amount, max);\r\n\t} while(compareExchangeFloat32(array, index, oldValue, newValue) !== oldValue);\r\n}\r\n\r\nexport function subtractAtomicFloat(array: Float32Array, index: number, amount: number, min: number) {\r\n\tlet oldValue;\r\n\tlet newValue;\r\n\tdo {\r\n\t\toldValue = loadFloat32(array, index);\r\n\t\tnewValue = Math.max(oldValue - amount, min);\r\n\t} while(compareExchangeFloat32(array, index, oldValue, newValue) !== oldValue);\r\n}","// For doing Atomic operations on floats in SharedArrayBuffers\r\nconst buffer = new ArrayBuffer(8);\r\nconst float64 = new Float64Array(buffer);\r\nconst int64 = new BigInt64Array(buffer);\r\n\r\nexport function loadFloat64(data: BigInt64Array | Float64Array, index: number) {\r\n\tif(data instanceof Float64Array) {\r\n\t\tdata = new BigInt64Array(data.buffer, data.byteOffset, data.length);\r\n\t}\r\n\r\n\treturn convertInt64ToFloat64(Atomics.load(data, index));\r\n}\r\nexport function storeFloat64(data: BigInt64Array | Float64Array, index: number, value: number) {\r\n\tif(data instanceof Float64Array) {\r\n\t\tdata = new BigInt64Array(data.buffer, data.byteOffset, data.length);\r\n\t}\r\n\r\n\tAtomics.store(data, index, convertFloat64ToInt64(value));\r\n}\r\n\r\nexport function convertInt64ToFloat64(value: bigint) {\r\n\tint64[0] = value;\r\n\r\n\treturn float64[0];\r\n}\r\nexport function convertFloat64ToInt64(value: number) {\r\n\tfloat64[0] = value;\r\n\r\n\treturn int64[0];\r\n}\r\n\r\nexport function exchangeFloat64(data: BigInt64Array | Float64Array, index: number, value: number) {\r\n\tif(data instanceof Float64Array) {\r\n\t\tdata = new BigInt64Array(data.buffer, data.byteOffset, data.length);\r\n\t}\r\n\r\n\treturn convertInt64ToFloat64(Atomics.exchange(data, index, convertFloat64ToInt64(value)));\r\n}\r\n\r\nexport function compareExchangeFloat64(data: BigInt64Array | Float64Array, index: number, expectedValue: number, replacementValue: number) {\r\n\tif(data instanceof Float64Array) {\r\n\t\tdata = new BigInt64Array(data.buffer, data.byteOffset, data.length);\r\n\t}\r\n\r\n\treturn convertInt64ToFloat64(Atomics.compareExchange(data, index, convertFloat64ToInt64(expectedValue), convertFloat64ToInt64(replacementValue)));\r\n}","const UNLOCKED = 0;\r\nconst READ_LOCKED = 1;\r\nconst WRITE_LOCKED = 2;\r\n\r\nexport function readLock(data: Int32Array, index: number = 0) {\r\n\t// Wait over and over again until we get that it was unlocked or read locked\r\n\twhile(Atomics.compareExchange(data, index, UNLOCKED, READ_LOCKED) === WRITE_LOCKED) {\r\n\t\tAtomics.wait(data, index, WRITE_LOCKED);\r\n\t}\r\n\r\n\tAtomics.add(data, index + 1, 1);\r\n}\r\nexport function writeLock(data: Int32Array, index: number = 0) {\r\n\t// Write lock needs to be exclusive - wait until we were in UNLOCKED to proceed\r\n\tlet oldValue = Atomics.compareExchange(data, index, UNLOCKED, WRITE_LOCKED);\r\n\twhile(oldValue !== UNLOCKED) {\r\n\t\tAtomics.wait(data, index, oldValue);\r\n\t\toldValue = Atomics.compareExchange(data, index, UNLOCKED, WRITE_LOCKED);\r\n\t}\r\n}\r\n\r\nexport function readUnlock(data: Int32Array, index: number = 0) {\r\n\tlet readCount = Atomics.sub(data, index + 1, 1) - 1;\r\n\r\n\tif(readCount <= 0) {\r\n\t\tif(Atomics.compareExchange(data, index, READ_LOCKED, UNLOCKED) !== READ_LOCKED) {\r\n\t\t\tconsole.warn('We are unlocking when it was not read locked!');\r\n\t\t}\r\n\r\n\t\tAtomics.notify(data, index);\r\n\t}\r\n}\r\nexport function writeUnlock(data: Int32Array, index: number = 0) {\r\n\tif(Atomics.compareExchange(data, index, WRITE_LOCKED, UNLOCKED) !== WRITE_LOCKED) {\r\n\t\tconsole.warn('We are unlocking when it was not write locked!');\r\n\t}\r\n\r\n\tAtomics.notify(data, index);\r\n}\r\n\r\nexport const READ_WRITE_LOCK_ALLOCATE_COUNT = 2;"],"names":["MAX_BYTE_OFFSET_LENGTH","MAX_POSITION_LENGTH","loadPointer","data","index","getPointer","loadRawPointer","storePointer","bufferPosition","bufferByteOffset","createPointer","storeRawPointer","pointer","replacePointer","newBufferPosition","newBufferByteOffset","oldBufferPosition","oldBufferByteOffset","oldPointer","replaceRawPointer","newPointer","value","AllocatedMemory","memory","config","type","offset","length","UNLOCKED","LOCKED","lock","unlock","SIMPLE_LOCK_ALLOCATE_COUNT","GL2TYPE","FLOAT_ARRAY_CTORS","INT_ARRAY_CTORS","UINT_ARRAY_CTORS","BIGINT_ARRAY_CTORS","TYPEDARRAY_CTORS","asNativeType","typedArray","xs","ctor","STATE_FREE","STATE_USED","STATE_TOP","STATE_END","STATE_ALIGN","STATE_FLAGS","STATE_MIN_SPLIT","MASK_COMPACT","MASK_SPLIT","SIZEOF_STATE","MEM_BLOCK_SIZE","MEM_BLOCK_NEXT","SIZEOF_MEM_BLOCK","MemoryBuffer","opts","align","_align","top","resolvedEnd","listStats","block","count","size","free","num","fill","addr","SIZEOF","bytes","paddedSize","end","prev","blockSize","isTop","result","blockDataAddress","excess","ptr","oldAddr","blockSelfAddress","newAddr","blockEnd","array","ptrOrArray","x","flag","next","idx","scan","scanPrev","res","newSize","tmp","tn","blockAddress","dataAddress","BYTE_UNITS","BIBYTE_UNITS","BIT_UNITS","BIBIT_UNITS","toLocaleString","number","locale","options","log10","numberOrBigInt","string","log","divide","divisor","integerPart","remainder","applyFixedWidth","fixedWidth","buildLocaleOptions","minimumFractionDigits","maximumFractionDigits","prettyBytes","UNITS","separator","isZero","isNegative","prefix","localeOptions","numberString","exponent","minPrecision","unit","DEFAULT_BUFFER_SIZE","BUFFER_SIZE_INDEX","BUFFER_COUNT_INDEX","BUFFER_AUTO_GROW_INDEX","MemoryHeap","buffer","bufferSize","startBuffer","i","nextBufferPosition","handler","usedBufferSize","buf","shared","total","memPool","myPrettyBytes","FIRST_BLOCK_RECORD_KEEPING_COUNT","DATA_BLOCK_RECORD_KEEPING_COUNT","LENGTH_INDEX","SharedList","values","dataLength","newBlock","newData","newBlockPointer","lastBlockPointer","updateWorked","lastBlockPosition","lastBlockByteOffset","lastBlock","callback","deleteCurrent","deleteIndex","deleteValues","firstBlockPointer","deletedItems","nextBlockPointer","nextBlockPosition","nextBlockByteOffset","blockRecord","currentIndex","lastBlockData","blockData","currentBlockPosition","currentBlockByteOffset","updateLastBlock","startIndex","allocatedMemory","DEFAULT_HASH_SIZE","SharedMap","clone","hashMemory","key","fullHashKey","get32BitHash","maxHash","hashKey","list","listMemory","inserted","oldMaxHash","newMaxHash","newHashMemory","oldHashMemory","hashString","str","l","h","k","SharedPointerList","heap","item","iterator","pointerData","TYPED_ARRAY_MAP","POINTER_INDEX","TYPE_INDEX","LOCK_INDEX","SharedString","stringMemory","charCodes","charType","bufferLength","VECTOR_INDEX","BUFFER_LENGTH_INDEX","DEFAULT_SIZE","SharedVector","dataBlock","dataIndex","currentLength","oldLength","j","pointerNumber","rawData","start","newBufferLength","oldDataMemory","oldDataBlock","newDataBlock","CachedItemList","filter","items","MAX_CHUNK_SIZE_INDEX","POINTERS_INDEX","RECYCLE_INDEX","SharedPool","maxLength","firstArray","newIndex","blockIndex","recycledValues","dataBlockIndex","newDataBlockIndex","pointerIndex","cachedDataBlock","newArray","pointerArray","uint32Array","uint16Array","load16From32","convert32To16","store16In32","value1","value2","convert16To32","uint64Array","load16From64","store16In64","value3","value4","float32","int32","loadFloat32","convertInt32ToFloat32","storeFloat32","convertFloat32ToInt32","exchangeFloat32","compareExchangeFloat32","expectedValue","replacementValue","addAtomicInt","amount","max","oldValue","newValue","subtractAtomicInt","min","addAtomicFloat32","subtractAtomicFloat","float64","int64","loadFloat64","convertInt64ToFloat64","storeFloat64","convertFloat64ToInt64","exchangeFloat64","compareExchangeFloat64","READ_LOCKED","WRITE_LOCKED","readLock","writeLock","readUnlock","writeUnlock","READ_WRITE_LOCK_ALLOCATE_COUNT"],"mappings":"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","x_google_ignoreList":[5]}
|