import type { Loadable } from './loadable.ts'; const SHARED = Symbol.for('moroutine.shared'); /** A fixed-size shared byte buffer backed by SharedArrayBuffer. */ export class Bytes implements Loadable> { readonly size: number; readonly view: Uint8Array; static byteAlignment = 1; constructor(size: number, buffer?: SharedArrayBuffer, byteOffset?: number) { this.size = size; const buf = buffer ?? new SharedArrayBuffer(size); const offset = byteOffset ?? 0; this.view = new Uint8Array(buf, offset, size); } /** * Returns a readonly view of the buffer. No copy — mutations via `view` are visible. * @returns A readonly typed array view into the shared buffer. */ load(): Readonly { return this.view as Readonly; } /** * Writes data into the buffer. Must be exact length. * @param value - A Uint8Array whose length must equal the buffer's size. */ store(value: Uint8Array): void { if (value.length !== this.size) { throw new RangeError(`Expected Uint8Array of length ${this.size}, got ${value.length}`); } this.view.set(value); } [SHARED](): { tag: string; buffer: SharedArrayBuffer; byteOffset: number; size: number } { return { tag: 'Bytes', buffer: this.view.buffer as SharedArrayBuffer, byteOffset: this.view.byteOffset, size: this.size, }; } }