@actuallab/core 12.3.29 → 12.3.33

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/polyfills.ts","../src/async-context.ts","../src/async-lock.ts","../src/disposable.ts","../src/promise-source.ts","../src/events.ts","../src/ring-buffer.ts","../src/result.ts","../src/retry-delay-seq.ts","../src/retry-delayer.ts"],"sourcesContent":["import './polyfills.js';\r\nexport {\r\n AsyncContext,\r\n AsyncContextKey,\r\n abortSignalKey,\r\n} from './async-context.js';\r\nexport { AsyncLock } from './async-lock.js';\r\nexport type { Disposable, AsyncDisposable } from './disposable.js';\r\nexport { DisposableBag } from './disposable.js';\r\nexport { EventHandlerSet } from './events.js';\r\nexport { PromiseSource, resolvedVoidPromise } from './promise-source.js';\r\nexport { RingBuffer } from './ring-buffer.js';\r\nexport type { IResult } from './result.js';\r\nexport {\r\n Result,\r\n result,\r\n errorResult,\r\n resultFrom,\r\n resultFromAsync,\r\n} from './result.js';\r\nexport { RetryDelaySeq } from './retry-delay-seq.js';\r\nexport type { RetryDelay } from './retry-delayer.js';\r\nexport {\r\n RetryDelayer,\r\n RetryDelayNone,\r\n RetryDelayLimitExceeded,\r\n} from './retry-delayer.js';\r\n","// TC39 decorator metadata polyfill — required for Symbol.metadata support\r\n// in runtimes that don't yet implement it natively.\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\r\n(Symbol as any).metadata ??= Symbol('Symbol.metadata');\r\n","import type { Disposable } from './disposable.js';\r\n\r\n/** Typed key for values stored in AsyncContext — each subsystem defines its own keys. */\r\nexport class AsyncContextKey<T> {\r\n readonly id: symbol;\r\n readonly defaultValue: T;\r\n\r\n constructor(name: string, defaultValue: T) {\r\n this.id = Symbol(name);\r\n this.defaultValue = defaultValue;\r\n }\r\n}\r\n\r\n/** General-purpose typed context container — named for forward-compatibility with TC39 AsyncContext proposal. */\r\nexport const abortSignalKey = new AsyncContextKey<AbortSignal | undefined>(\r\n 'AbortSignal',\r\n undefined\r\n);\r\n\r\nexport class AsyncContext {\r\n static current: AsyncContext | undefined = undefined;\r\n\r\n /** Immutable empty singleton — avoids allocating new AsyncContext(). */\r\n static readonly empty: AsyncContext = new AsyncContext();\r\n\r\n private static _defaults = new Map<symbol, unknown>();\r\n\r\n private _values: Map<symbol, unknown>;\r\n\r\n constructor(values?: Map<symbol, unknown>) {\r\n this._values = values ?? new Map<symbol, unknown>();\r\n }\r\n\r\n get<T>(key: AsyncContextKey<T>): T {\r\n if (this._values.has(key.id)) return this._values.get(key.id) as T;\r\n if (AsyncContext._defaults.has(key.id))\r\n return AsyncContext._defaults.get(key.id) as T;\r\n return key.defaultValue;\r\n }\r\n\r\n with<T>(key: AsyncContextKey<T>, value: T): AsyncContext {\r\n const copy = new Map(this._values);\r\n copy.set(key.id, value);\r\n return new AsyncContext(copy);\r\n }\r\n\r\n activate(): Disposable {\r\n const prev = AsyncContext.current;\r\n AsyncContext.current = this;\r\n return {\r\n dispose: () => {\r\n AsyncContext.current = prev;\r\n },\r\n };\r\n }\r\n\r\n run<R>(fn: () => R): R {\r\n const prev = AsyncContext.current;\r\n AsyncContext.current = this;\r\n try {\r\n return fn();\r\n } finally {\r\n AsyncContext.current = prev;\r\n }\r\n }\r\n\r\n /** Strip THIS exact instance from args if it's the last element (reference equality). */\r\n stripFromArgs(args: unknown[]): unknown[] {\r\n return args[args.length - 1] === this ? args.slice(0, -1) : args;\r\n }\r\n\r\n /** Resolve: return ctx if provided, otherwise AsyncContext.current. */\r\n static from(ctx: AsyncContext | undefined): AsyncContext | undefined {\r\n return ctx ?? AsyncContext.current;\r\n }\r\n\r\n /** Extract AsyncContext from last arg if instanceof AsyncContext, else fall back to .current. */\r\n static fromArgs(args: unknown[]): AsyncContext | undefined {\r\n const last = args[args.length - 1];\r\n return last instanceof AsyncContext ? last : AsyncContext.current;\r\n }\r\n\r\n static setDefault<T>(key: AsyncContextKey<T>, value: T): void {\r\n AsyncContext._defaults.set(key.id, value);\r\n }\r\n\r\n static getOrCreate(): AsyncContext {\r\n return AsyncContext.current ?? AsyncContext.empty;\r\n }\r\n}\r\n","/** Promise-based mutual exclusion lock for serializing async operations. */\r\nexport class AsyncLock {\r\n private _queue: (() => void)[] = [];\r\n private _locked = false;\r\n\r\n get isLocked(): boolean {\r\n return this._locked;\r\n }\r\n\r\n async acquire(): Promise<void> {\r\n if (!this._locked) {\r\n this._locked = true;\r\n return;\r\n }\r\n return new Promise<void>(resolve => {\r\n this._queue.push(resolve);\r\n });\r\n }\r\n\r\n release(): void {\r\n if (!this._locked) throw new Error('AsyncLock is not locked.');\r\n\r\n const next = this._queue.shift();\r\n if (next !== undefined) {\r\n // Transfer lock to the next waiter\r\n next();\r\n } else {\r\n this._locked = false;\r\n }\r\n }\r\n\r\n async run<T>(fn: () => T | Promise<T>): Promise<T> {\r\n await this.acquire();\r\n try {\r\n return await fn();\r\n } finally {\r\n this.release();\r\n }\r\n }\r\n}\r\n","/** Synchronous dispose pattern, similar to .NET's IDisposable. */\r\nexport interface Disposable {\r\n dispose(): void;\r\n}\r\n\r\n/** Asynchronous dispose pattern, similar to .NET's IAsyncDisposable. */\r\nexport interface AsyncDisposable {\r\n disposeAsync(): Promise<void>;\r\n}\r\n\r\n/** Aggregates multiple disposables and disposes them together. */\r\nexport class DisposableBag implements Disposable, AsyncDisposable {\r\n private _items: (Disposable | AsyncDisposable)[] = [];\r\n private _disposed = false;\r\n\r\n get isDisposed(): boolean {\r\n return this._disposed;\r\n }\r\n\r\n add(item: Disposable | AsyncDisposable): void {\r\n if (this._disposed)\r\n throw new Error('DisposableBag is already disposed.');\r\n this._items.push(item);\r\n }\r\n\r\n dispose(): void {\r\n if (this._disposed) return;\r\n this._disposed = true;\r\n const items = this._items;\r\n this._items = [];\r\n // Dispose in reverse order (LIFO)\r\n for (let i = items.length - 1; i >= 0; i--) {\r\n const item = items[i];\r\n if ('dispose' in item) item.dispose();\r\n }\r\n }\r\n\r\n async disposeAsync(): Promise<void> {\r\n if (this._disposed) return;\r\n this._disposed = true;\r\n const items = this._items;\r\n this._items = [];\r\n for (let i = items.length - 1; i >= 0; i--) {\r\n const item = items[i];\r\n if ('disposeAsync' in item) await item.disposeAsync();\r\n else if ('dispose' in item) item.dispose();\r\n }\r\n }\r\n}\r\n","/** Externally-resolvable promise — similar to .NET's TaskCompletionSource<T>. */\r\nexport class PromiseSource<T> {\r\n readonly promise: Promise<T>;\r\n private _resolve!: (value: T | PromiseLike<T>) => void;\r\n private _reject!: (reason?: unknown) => void;\r\n private _isCompleted = false;\r\n\r\n constructor() {\r\n this.promise = new Promise<T>((resolve, reject) => {\r\n this._resolve = resolve;\r\n this._reject = reject;\r\n });\r\n }\r\n\r\n get isCompleted(): boolean {\r\n return this._isCompleted;\r\n }\r\n\r\n resolve(value: T): boolean {\r\n if (this._isCompleted) return false;\r\n this._isCompleted = true;\r\n this._resolve(value);\r\n return true;\r\n }\r\n\r\n reject(reason?: unknown): boolean {\r\n if (this._isCompleted) return false;\r\n this._isCompleted = true;\r\n this._reject(reason);\r\n return true;\r\n }\r\n}\r\n\r\nexport const resolvedVoidPromise: Promise<void> = Promise.resolve();\r\n","import { PromiseSource } from './promise-source.js';\r\n\r\n/** Typed pub/sub event handler set — similar to .NET's EventHandler<T> multicast delegate. */\r\nexport class EventHandlerSet<T> {\r\n private _handlers = new Set<(arg: T) => void>();\r\n\r\n get count(): number {\r\n return this._handlers.size;\r\n }\r\n\r\n add(handler: (arg: T) => void): void {\r\n this._handlers.add(handler);\r\n }\r\n\r\n remove(handler: (arg: T) => void): void {\r\n this._handlers.delete(handler);\r\n }\r\n\r\n trigger(arg: T): void {\r\n for (const handler of this._handlers) handler(arg);\r\n }\r\n\r\n clear(): void {\r\n this._handlers.clear();\r\n }\r\n\r\n whenNext(): Promise<T> {\r\n const ps = new PromiseSource<T>();\r\n const handler = (arg: T) => {\r\n this._handlers.delete(handler);\r\n ps.resolve(arg);\r\n };\r\n this._handlers.add(handler);\r\n return ps.promise;\r\n }\r\n}\r\n","/**\n * A fixed-capacity circular buffer supporting efficient push/pull at both\n * head and tail.\n *\n * Direct port of .NET `ActualLab.Collections.RingBuffer<T>` at\n * src/ActualLab.Core/Collections/RingBuffer.cs (simplified — TS uses plain\n * modulo instead of the power-of-two-minus-one bit-mask trick, since the\n * performance difference is negligible in JavaScript).\n */\nexport class RingBuffer<T> {\n private _buffer: (T | undefined)[];\n private _start = 0;\n private _end = 0;\n private _count = 0;\n\n readonly capacity: number;\n\n get count(): number { return this._count; }\n get isEmpty(): boolean { return this._count === 0; }\n get isFull(): boolean { return this._count === this.capacity; }\n get remainingCapacity(): number { return this.capacity - this._count; }\n get hasRemainingCapacity(): boolean { return this._count < this.capacity; }\n\n constructor(capacity: number) {\n if (capacity < 1)\n throw new RangeError(`RingBuffer capacity must be >= 1 (was ${capacity}).`);\n this.capacity = capacity;\n this._buffer = new Array<T | undefined>(capacity);\n }\n\n /** Read the item at `index` (0-indexed, from head). */\n get(index: number): T {\n if (index < 0 || index >= this._count)\n throw new RangeError(`Index ${index} out of range [0, ${this._count}).`);\n return this._buffer[(this._start + index) % this.capacity] as T;\n }\n\n /** Add an item at the tail. Throws if the buffer is full. */\n pushTail(item: T): void {\n if (this._count >= this.capacity)\n throw new Error('RingBuffer is full.');\n this._buffer[this._end] = item;\n this._end = (this._end + 1) % this.capacity;\n this._count++;\n }\n\n /** Add an item at the tail, evicting the head item if the buffer is full. */\n pushTailAndMoveHeadIfFull(item: T): void {\n if (this._count >= this.capacity) {\n this._buffer[this._start] = undefined;\n this._start = (this._start + 1) % this.capacity;\n this._count--;\n }\n this.pushTail(item);\n }\n\n /** Remove the head item. Throws if the buffer is empty. */\n pullHead(): T {\n if (this._count === 0)\n throw new Error('RingBuffer is empty.');\n const head = this._buffer[this._start] as T;\n this._buffer[this._start] = undefined;\n this._start = (this._start + 1) % this.capacity;\n this._count--;\n return head;\n }\n\n /**\n * Advance the head by `skipCount` slots, releasing references to skipped\n * items so they can be garbage-collected.\n */\n moveHead(skipCount: number): void {\n if (skipCount === 0) return;\n if (skipCount < 0 || skipCount > this._count)\n throw new RangeError(`skipCount ${skipCount} out of range [0, ${this._count}].`);\n for (let k = 0; k < skipCount; k++) {\n this._buffer[(this._start + k) % this.capacity] = undefined;\n }\n this._start = (this._start + skipCount) % this.capacity;\n this._count -= skipCount;\n }\n\n /** Remove all items. */\n clear(): void {\n for (let i = 0; i < this.capacity; i++) this._buffer[i] = undefined;\n this._start = 0;\n this._end = 0;\n this._count = 0;\n }\n\n /** Copy the buffer's contents to a new array, head-first. */\n toArray(): T[] {\n const out = new Array<T>(this._count);\n for (let i = 0; i < this._count; i++) {\n out[i] = this._buffer[(this._start + i) % this.capacity] as T;\n }\n return out;\n }\n}\n","/** Common interface for types that carry a value-or-error outcome. */\r\nexport interface IResult<T> {\r\n readonly hasValue: boolean;\r\n readonly hasError: boolean;\r\n readonly value: T;\r\n readonly error: unknown;\r\n readonly valueOrUndefined: T | undefined;\r\n}\r\n\r\n/** Immutable value-or-error container — similar to .NET's Result<T>. */\r\nexport class Result<T> implements IResult<T> {\r\n readonly hasValue: boolean;\r\n readonly hasError: boolean;\r\n private readonly _value: T | undefined;\r\n private readonly _error: unknown;\r\n\r\n public constructor(value: T | undefined, error?: unknown) {\r\n this.hasValue = error === undefined;\r\n this.hasError = !this.hasValue;\r\n this._value = value;\r\n this._error = error;\r\n }\r\n\r\n get value(): T {\r\n if (this.hasError) throw this._error;\r\n return this._value as T;\r\n }\r\n\r\n get error(): unknown {\r\n return this._error;\r\n }\r\n\r\n get valueOrUndefined(): T | undefined {\r\n return this.hasValue ? this._value : undefined;\r\n }\r\n\r\n static ok<T>(value: T): Result<T> {\r\n return new Result<T>(value);\r\n }\r\n\r\n static error<T>(error: unknown): Result<T> {\r\n return new Result<T>(undefined, error);\r\n }\r\n}\r\n\r\nexport function result<T>(value: T, error?: unknown): Result<T> {\r\n return new Result<T>(value, error);\r\n}\r\n\r\nexport function errorResult<T>(error: unknown): Result<T> {\r\n return Result.error(error);\r\n}\r\n\r\nexport function resultFrom<T>(fn: () => T): Result<T> {\r\n try {\r\n return result(fn());\r\n } catch (e) {\r\n return errorResult(e);\r\n }\r\n}\r\n\r\nexport async function resultFromAsync<T>(\r\n fn: () => Promise<T>\r\n): Promise<Result<T>> {\r\n try {\r\n return result(await fn());\r\n } catch (e) {\r\n return errorResult(e);\r\n }\r\n}\r\n","// .NET counterpart: ActualLab.Time.RetryDelaySeq\r\n\r\nconst DefaultSpread = 0.1;\r\nconst DefaultMultiplier = 1.41421356237; // Math.sqrt(2)\r\n\r\nfunction applySpread(origin: number, spread: number): number {\r\n if (spread <= 0) return origin;\r\n const delta = origin * spread;\r\n return origin + (Math.random() * 2 - 1) * delta;\r\n}\r\n\r\nexport class RetryDelaySeq {\r\n readonly min: number;\r\n readonly max: number;\r\n readonly spread: number;\r\n readonly multiplier: number;\r\n\r\n constructor(\r\n min: number,\r\n max: number,\r\n spread: number = DefaultSpread,\r\n multiplier: number = DefaultMultiplier\r\n ) {\r\n this.min = min;\r\n this.max = max;\r\n this.spread = spread;\r\n this.multiplier = multiplier;\r\n }\r\n\r\n static fixed(\r\n delayMs: number,\r\n spread: number = DefaultSpread\r\n ): RetryDelaySeq {\r\n return new RetryDelaySeq(delayMs, delayMs, spread, 1);\r\n }\r\n\r\n static exp(\r\n minMs: number,\r\n maxMs: number,\r\n spread: number = DefaultSpread,\r\n multiplier: number = DefaultMultiplier\r\n ): RetryDelaySeq {\r\n return new RetryDelaySeq(minMs, maxMs, spread, multiplier);\r\n }\r\n\r\n getDelay(failureCount: number): number {\r\n if (this.min < 0)\r\n throw new Error('RetryDelaySeq.min must be non-negative.');\r\n if (failureCount <= 0) return 0;\r\n\r\n if (this.multiplier <= 1) {\r\n // Fixed — no exponential component\r\n return Math.max(\r\n 0,\r\n this.spread <= 0 ? this.min : applySpread(this.min, this.spread)\r\n );\r\n }\r\n\r\n const multiplier = Math.pow(this.multiplier, failureCount - 1);\r\n const raw = Math.min(this.max, this.min * multiplier);\r\n return Math.max(0, applySpread(raw, this.spread));\r\n }\r\n}\r\n","// .NET counterparts: ActualLab.Net.RetryDelayer, ActualLab.Net.RetryDelay\r\n\r\nimport { EventHandlerSet } from './events.js';\r\nimport { RetryDelaySeq } from './retry-delay-seq.js';\r\n\r\nexport interface RetryDelay {\r\n readonly promise: Promise<void>;\r\n readonly endsAt: number; // Date.now()-based timestamp, 0 = no delay\r\n readonly isLimitExceeded: boolean;\r\n}\r\n\r\nexport const RetryDelayNone: RetryDelay = {\r\n promise: Promise.resolve(),\r\n endsAt: 0,\r\n isLimitExceeded: false,\r\n};\r\n\r\nexport const RetryDelayLimitExceeded: RetryDelay = {\r\n promise: Promise.resolve(),\r\n endsAt: 0,\r\n isLimitExceeded: true,\r\n};\r\n\r\nexport class RetryDelayer {\r\n private _cancelController = new AbortController();\r\n\r\n delays: RetryDelaySeq = RetryDelaySeq.fixed(1000);\r\n limit: number | undefined = undefined;\r\n\r\n readonly cancelDelaysChanged = new EventHandlerSet<void>();\r\n\r\n getDelay(tryIndex: number, cancellationSignal?: AbortSignal): RetryDelay {\r\n if (this.limit !== undefined && tryIndex >= this.limit)\r\n return RetryDelayLimitExceeded;\r\n\r\n const delayMs = this.delays.getDelay(tryIndex);\r\n if (tryIndex === 0 || delayMs <= 0) return RetryDelayNone;\r\n\r\n const actualDelayMs = Math.max(1, delayMs);\r\n const endsAt = Date.now() + actualDelayMs;\r\n\r\n const cancelSignal = this._cancelController.signal;\r\n const promise = new Promise<void>((resolve, reject) => {\r\n const timer = setTimeout(() => {\r\n cleanup();\r\n resolve();\r\n }, actualDelayMs);\r\n\r\n const onCancel = () => {\r\n clearTimeout(timer);\r\n cleanup();\r\n resolve(); // cancelDelays resolves, does NOT reject\r\n };\r\n\r\n const onAbort = () => {\r\n clearTimeout(timer);\r\n cleanup();\r\n reject(new Error('Retry delay aborted.'));\r\n };\r\n\r\n const cleanup = () => {\r\n cancelSignal.removeEventListener('abort', onCancel);\r\n cancellationSignal?.removeEventListener('abort', onAbort);\r\n };\r\n\r\n cancelSignal.addEventListener('abort', onCancel, { once: true });\r\n cancellationSignal?.addEventListener('abort', onAbort, {\r\n once: true,\r\n });\r\n });\r\n\r\n return { promise, endsAt, isLimitExceeded: false };\r\n }\r\n\r\n cancelDelays(): void {\r\n const old = this._cancelController;\r\n this._cancelController = new AbortController();\r\n old.abort();\r\n this.cancelDelaysChanged.trigger();\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/polyfills.ts","../src/disposable.ts","../src/logging-init.ts","../src/logging.ts","../src/result.ts","../src/async-context.ts","../src/async-lock.ts","../src/promise-source.ts","../src/events.ts","../src/ring-buffer.ts","../src/retry-delay-seq.ts","../src/retry-delayer.ts"],"sourcesContent":["import './polyfills.js';\r\n\r\n// Disposable\r\nexport type { Disposable, AsyncDisposable } from './disposable.js';\r\nexport { DisposableBag } from './disposable.js';\r\n\r\n// Logging\r\nexport type { LogRef, LogScopeFns } from './logging.js';\r\nexport { Log, LogLevel, createLogProvider } from './logging.js';\r\nexport { initLogging, LogLevelController } from './logging-init.js';\r\n\r\n// Result & IResult\r\nexport type { IResult } from './result.js';\r\nexport {\r\n Result,\r\n result,\r\n errorResult,\r\n resultFrom,\r\n resultFromAsync,\r\n} from './result.js';\r\n\r\n// Async-related\r\nexport {\r\n AsyncContext,\r\n AsyncContextKey,\r\n abortSignalKey,\r\n} from './async-context.js';\r\nexport { AsyncLock } from './async-lock.js';\r\n\r\n// Event handling, primises\r\nexport { EventHandlerSet } from './events.js';\r\nexport { PromiseSource, resolvedVoidPromise } from './promise-source.js';\r\n\r\n// Collections\r\nexport { RingBuffer } from './ring-buffer.js';\r\n\r\n// Resilience\r\nexport { RetryDelaySeq } from './retry-delay-seq.js';\r\nexport type { RetryDelay } from './retry-delayer.js';\r\nexport {\r\n RetryDelayer,\r\n RetryDelayNone,\r\n RetryDelayLimitExceeded,\r\n} from './retry-delayer.js';\r\n","// TC39 decorator metadata polyfill — required for Symbol.metadata support\r\n// in runtimes that don't yet implement it natively.\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\r\n(Symbol as any).metadata ??= Symbol('Symbol.metadata');\r\n","/** Synchronous dispose pattern, similar to .NET's IDisposable. */\r\nexport interface Disposable {\r\n dispose(): void;\r\n}\r\n\r\n/** Asynchronous dispose pattern, similar to .NET's IAsyncDisposable. */\r\nexport interface AsyncDisposable {\r\n disposeAsync(): Promise<void>;\r\n}\r\n\r\n/** Aggregates multiple disposables and disposes them together. */\r\nexport class DisposableBag implements Disposable, AsyncDisposable {\r\n private _items: (Disposable | AsyncDisposable)[] = [];\r\n private _disposed = false;\r\n\r\n get isDisposed(): boolean {\r\n return this._disposed;\r\n }\r\n\r\n add(item: Disposable | AsyncDisposable): void {\r\n if (this._disposed)\r\n throw new Error('DisposableBag is already disposed.');\r\n this._items.push(item);\r\n }\r\n\r\n dispose(): void {\r\n if (this._disposed) return;\r\n this._disposed = true;\r\n const items = this._items;\r\n this._items = [];\r\n // Dispose in reverse order (LIFO)\r\n for (let i = items.length - 1; i >= 0; i--) {\r\n const item = items[i];\r\n if ('dispose' in item) item.dispose();\r\n }\r\n }\r\n\r\n async disposeAsync(): Promise<void> {\r\n if (this._disposed) return;\r\n this._disposed = true;\r\n const items = this._items;\r\n this._items = [];\r\n for (let i = items.length - 1; i >= 0; i--) {\r\n const item = items[i];\r\n if ('disposeAsync' in item) await item.disposeAsync();\r\n else if ('dispose' in item) item.dispose();\r\n }\r\n }\r\n}\r\n","// Initialization helpers for the logging system.\n//\n// The Log class uses a single Map<string, LogLevel> to determine the minimum\n// level for each scope. This module is responsible for:\n// - Persisting the map across page reloads via sessionStorage.\n// - Exposing a globally accessible LogLevelController so developers can tweak\n// levels at runtime from the browser dev console (globalThis.logLevels).\n//\n// initLogging() is idempotent and called automatically on the first Log.get().\n//\n// Runtime override examples (paste into browser dev console):\n// logLevels.override('rpc.RpcPeer', 1) // set Debug for one scope\n// logLevels.overrideAll('rpc.', 1) // set Debug for all rpc.* scopes\n// logLevels.overrideAll('fusion.', 2) // set Info for all fusion.* scopes\n// logLevels.reset() // reset to package defaults\n// logLevels.clear() // clear all overrides\n\nimport { Log, LogLevel } from './logging.js';\n\nconst GlobalThisKey = 'logLevels';\nconst StorageKey = 'logLevels';\nconst DateStorageKey = `${StorageKey}.date`;\nconst MaxStorageAge = 86_400_000 * 3; // 3 days\n\nconst sessionStorage: Storage | null = (typeof globalThis !== 'undefined' && 'sessionStorage' in globalThis)\n ? (globalThis as { sessionStorage: Storage }).sessionStorage\n : null;\n\n// Workers, worklets, and service workers run in separate JS realms with\n// their own globalThis. Within one realm, esbuild can also produce multiple\n// chunks that each carry their own copy of @actuallab/core (so multiple\n// distinct `Log` classes exist). We want the install + restore + console\n// message to happen exactly once per realm — gate via globalThis.logLevels.\nconst isMainThread = typeof window !== 'undefined';\n\nexport function initLogging(): void {\n // Warn is the global baseline — packages set per-scope defaults\n // (typically Info or Warn) via createLogProvider.\n Log.defaultMinLevel = LogLevel.Warn;\n const minLevels = Log.minLevels;\n const g = globalThis as Record<string, unknown>;\n const existing = g[GlobalThisKey] as LogLevelController | undefined;\n\n if (existing !== undefined) {\n // Another chunk in this realm already initialized. Mirror its\n // overrides into our local Log.minLevels so this Log class observes\n // the same effective levels. (Each chunk has its own Log class with\n // its own static minLevels Map — they only converge through this\n // one-shot copy at init time.)\n for (const [k, v] of existing.getMinLevels())\n minLevels.set(k, v);\n return;\n }\n\n g[GlobalThisKey] = new LogLevelController(minLevels);\n const wasRestored = restore(minLevels);\n if (wasRestored) {\n if (isMainThread)\n console.log('Logging: logLevels are restored');\n }\n else {\n if (isMainThread)\n console.log('Logging: logLevels are reset');\n reset(minLevels);\n }\n}\n\nexport class LogLevelController {\n constructor(private minLevels: Map<string, LogLevel>)\n { }\n\n /** Internal: used by initLogging() in secondary bundles to share the\n * primary bundle's minLevels map. */\n public getMinLevels(): Map<string, LogLevel> {\n return this.minLevels;\n }\n\n /** List the current set of overrides. */\n public list(): Record<string, LogLevel> {\n return Object.fromEntries(this.minLevels);\n }\n\n /** Print every known scope's effective level to the console as a table.\n * Shows: scope, effective level, the source ('override' / 'default-key' /\n * 'package-default' / 'baseline'), and the package default for reference.\n * Use this from the dev console to discover what to pass to override(). */\n public dump(): void {\n const baseline = Log.defaultMinLevel;\n const globalOverride = this.minLevels.get('default');\n const allScopes = new Set<string>([\n ...Log.knownScopes,\n ...Log.scopeDefaults.keys(),\n ...this.minLevels.keys(),\n ]);\n // Drop the special 'default' bucket — surfaced separately below.\n allScopes.delete('default');\n const rows: Record<string, {\n level: string;\n source: string;\n packageDefault: string;\n }> = {};\n const sorted = [...allScopes].sort();\n for (const scope of sorted) {\n const override = this.minLevels.get(scope);\n const pkgDefault = Log.scopeDefaults.get(scope);\n let level: LogLevel;\n let source: string;\n if (override !== undefined) {\n level = override;\n source = 'override';\n }\n else if (globalOverride !== undefined) {\n level = globalOverride;\n source = \"minLevels.get('default')\";\n }\n else if (pkgDefault !== undefined) {\n level = pkgDefault;\n source = 'package-default';\n }\n else {\n level = baseline;\n source = 'baseline';\n }\n rows[scope] = {\n level: LogLevel[level],\n source,\n packageDefault: pkgDefault === undefined ? '-' : LogLevel[pkgDefault],\n };\n }\n console.table(rows);\n console.log(\n `Baseline: ${LogLevel[baseline]}` +\n (globalOverride === undefined ? '' : `, default override: ${LogLevel[globalOverride]}`),\n );\n }\n\n /** Override the level for a single scope. Persisted to sessionStorage. */\n public override(scope: string, newLevel: LogLevel): void {\n this.minLevels.set(scope, newLevel);\n persist(this.minLevels);\n }\n\n /** Override the level for every scope whose name starts with scopePrefix\n * (e.g. 'rpc.' to enable verbose RPC logging). Persisted. */\n public overrideAll(scopePrefix: string, newLevel: LogLevel): void {\n // Capture all currently-known scopes (both user overrides and package\n // defaults) that match the prefix, then apply. Package defaults live\n // in Log.scopeDefaults; this method also accounts for them so calling\n // overrideAll('rpc.', Debug) flips every scope the rpc package\n // registered, not only the ones already overridden.\n const matched = new Set<string>();\n for (const [scope] of this.minLevels)\n if (scope.startsWith(scopePrefix)) matched.add(scope);\n for (const [scope] of Log.scopeDefaults)\n if (scope.startsWith(scopePrefix)) matched.add(scope);\n for (const scope of matched)\n this.minLevels.set(scope, newLevel);\n persist(this.minLevels);\n }\n\n /** Reset all overrides; package defaults take effect again. Persisted. */\n public reset(): void {\n reset(this.minLevels);\n persist(this.minLevels);\n }\n\n /** Clear all overrides (no global default unless `defaultLevel` is given). */\n public clear(defaultLevel?: LogLevel): void {\n this.minLevels.clear();\n if (defaultLevel !== undefined)\n this.minLevels.set('default', defaultLevel);\n persist(this.minLevels);\n }\n}\n\nfunction restore(minLevels: Map<string, LogLevel>): boolean {\n if (!sessionStorage)\n return false;\n\n const dateJson = sessionStorage.getItem(DateStorageKey);\n if (!dateJson)\n return false;\n if (Date.now() - (JSON.parse(dateJson) as number) > MaxStorageAge)\n return false;\n\n const readJson = sessionStorage.getItem(StorageKey);\n if (!readJson)\n return false;\n\n const readMinLevels = new Map(JSON.parse(readJson) as [string, LogLevel][]);\n if (typeof readMinLevels.size !== 'number')\n return false;\n\n minLevels.clear();\n readMinLevels.forEach((value, key) => minLevels.set(key, value));\n return true;\n}\n\nfunction persist(minLevels: Map<string, LogLevel>): boolean {\n if (!sessionStorage)\n return false;\n\n sessionStorage.setItem(DateStorageKey, JSON.stringify(Date.now()));\n sessionStorage.setItem(StorageKey, JSON.stringify(Array.from(minLevels.entries())));\n return true;\n}\n\nfunction reset(minLevels: Map<string, LogLevel>): void {\n minLevels.clear();\n // Add per-scope defaults here for development.\n // Use prefix conventions: 'rpc.', 'fusion.', 'app.', etc.\n\n // minLevels.set('rpc.RpcPeer', LogLevel.Debug);\n // minLevels.set('fusion.Computed', LogLevel.Debug);\n\n persist(minLevels);\n}\n","// Lightweight logging primitives shared by all ActualLab TypeScript packages.\n//\n// Design:\n// - Log.get(scope) returns a bag of optional loggers ({ debugLog, infoLog,\n// warnLog, errorLog }). Each is null when its level is below the scope's\n// minimum level, so the typical call site looks like:\n//\n// debugLog?.log('something happened', value);\n//\n// The optional chaining short-circuits before evaluating the arguments —\n// so the cost of disabled logs is just one nullish check.\n//\n// - Scopes are plain strings. Each package defines its own typed scope union\n// and uses createLogProvider<TScope>(prefix) to get a typed helper that keeps\n// scope names short at call sites while ensuring globally unique keys\n// ('rpc.RpcPeer', 'fusion.Computed', etc.).\n//\n// - Minimum levels live in Log.minLevels (a Map<string, LogLevel>). An\n// entry 'default' acts as a fallback before Log.defaultMinLevel.\n//\n// - initLogging() is invoked lazily on the first Log.get() call. It restores\n// levels from sessionStorage and installs globalThis.logLevels so devs can\n// tweak levels at runtime.\n\nimport { initLogging } from './logging-init.js';\n\nexport enum LogLevel {\n Debug = 1,\n Info,\n Warn,\n Error,\n None = 1000,\n}\n\nexport interface LogRef {\n target: unknown;\n id: number;\n}\n\ninterface LogRefSetItem {\n ref: LogRef;\n touchedAt: number;\n}\n\ninterface LogRefData {\n __logRefId?: number;\n}\n\nclass LogRefSet {\n private items: LogRefSetItem[] = [];\n private idSeed = 0;\n\n constructor(private capacity: number)\n { }\n\n public ref(data: object): LogRef {\n const itemIndex = this.items.findIndex(el => el.ref.target === data);\n if (itemIndex >= 0) {\n const existing = this.items[itemIndex];\n existing.touchedAt = Date.now();\n return existing.ref;\n }\n const id = (data as LogRefData).__logRefId ?? this.idSeed++;\n const newRef: LogRef = { target: data, id };\n (data as LogRefData).__logRefId = id;\n if (this.items.length >= this.capacity)\n this.removeOldest();\n this.items.push({ ref: newRef, touchedAt: Date.now() });\n return newRef;\n }\n\n private removeOldest(): void {\n let indexToEvict = 0;\n let itemToEvict = this.items[0];\n for (let i = 1; i < this.items.length; i++) {\n const item = this.items[i];\n if (item.touchedAt < itemToEvict.touchedAt) {\n itemToEvict = item;\n indexToEvict = i;\n }\n }\n this.items.splice(indexToEvict, 1);\n // Replace the live target with its string form so we don't keep the\n // object alive purely for log identity reasons.\n const ref = itemToEvict.ref;\n ref.target = ref.target?.toString();\n }\n}\n\nexport class Log {\n private static isInitialized = false;\n private static logRefs = new LogRefSet(10);\n /** User-set overrides (persisted to sessionStorage). Empty by default. */\n public static readonly minLevels = new Map<string, LogLevel>();\n /** Per-scope defaults registered by packages via createLogProvider(). */\n public static readonly scopeDefaults = new Map<string, LogLevel>();\n /** Every scope ever requested via Log.get(). Used by logLevels.dump()\n * so devs can discover what's available to override at runtime. */\n public static readonly knownScopes = new Set<string>();\n /** Global baseline for any scope without a default or override. */\n public static defaultMinLevel = LogLevel.Warn;\n public static loggerFactory: (scope: string, level: LogLevel) => Log = (scope, level) => new Log(scope, level);\n\n public log: (...data: unknown[]) => void;\n public trace: (...data: unknown[]) => void;\n\n constructor(\n public readonly scope: string,\n public readonly level: LogLevel,\n ) {\n const prefix = `[${scope}]`;\n switch (level) {\n case LogLevel.Debug:\n this.log = (...data: unknown[]) => console.debug(prefix, ...data);\n break;\n case LogLevel.Info:\n this.log = (...data: unknown[]) => console.log(prefix, ...data);\n break;\n case LogLevel.Warn:\n this.log = (...data: unknown[]) => console.warn(prefix, ...data);\n break;\n case LogLevel.Error:\n this.log = (...data: unknown[]) => console.error(prefix, ...data);\n break;\n case LogLevel.None:\n throw new Error('LogLevel.None cannot be used here');\n }\n this.trace = (...data: unknown[]) => console.trace(prefix, ...data);\n }\n\n public static get(scope: string): LogScopeFns {\n if (!this.isInitialized) {\n this.isInitialized = true;\n initLogging();\n }\n this.knownScopes.add(scope);\n\n const minLevels = this.minLevels;\n // Resolution order:\n // 1. User override for this scope (sessionStorage-persisted)\n // 2. User-set global override (minLevels.get('default'))\n // 3. Package default for this scope (registered via createLogProvider)\n // 4. Framework baseline (Log.defaultMinLevel, Warn)\n const minLevel = minLevels.get(scope)\n ?? minLevels.get('default')\n ?? this.scopeDefaults.get(scope)\n ?? this.defaultMinLevel;\n\n const getLogger = (level: LogLevel): Log | null =>\n level >= minLevel ? this.loggerFactory(scope, level) : null;\n\n return {\n logScope: scope,\n debugLog: getLogger(LogLevel.Debug),\n infoLog: getLogger(LogLevel.Info),\n warnLog: getLogger(LogLevel.Warn),\n errorLog: getLogger(LogLevel.Error),\n };\n }\n\n public static ref(data: object | null | undefined): object | null | undefined {\n if (!data)\n return data;\n return this.logRefs.ref(data);\n }\n\n public assert(predicate?: boolean, ...data: unknown[]): void {\n if (!predicate)\n this.log(...data);\n }\n}\n\nexport interface LogScopeFns {\n logScope: string;\n debugLog: Log | null;\n infoLog: Log | null;\n warnLog: Log | null;\n errorLog: Log | null;\n}\n\n// Per-package factory: creates a typed getLogs(scope) that prepends the package\n// prefix to the scope name before delegating to Log.get. Keeps call sites\n// concise while ensuring globally unique scope keys.\n//\n// `defaults` is required (not Partial) so that every scope in TScope has an\n// explicit default level — TypeScript will refuse to compile if a scope is\n// missing. Defaults register into Log.scopeDefaults and act as the fallback\n// when no user override is set.\n//\n// All declared scopes are also pre-registered in Log.knownScopes so that\n// logLevels.dump() (in dev console) can list them even before they're first\n// touched at runtime.\nexport function createLogProvider<TScope extends string>(\n prefix: string,\n defaults: Record<TScope, LogLevel>,\n): (scope: TScope) => LogScopeFns {\n for (const [scope, level] of Object.entries(defaults) as [TScope, LogLevel][]) {\n const fullName = prefix + scope;\n Log.scopeDefaults.set(fullName, level);\n Log.knownScopes.add(fullName);\n }\n return scope => Log.get(prefix + scope);\n}\n","/** Common interface for types that carry a value-or-error outcome. */\r\nexport interface IResult<T> {\r\n readonly hasValue: boolean;\r\n readonly hasError: boolean;\r\n readonly value: T;\r\n readonly error: unknown;\r\n readonly valueOrUndefined: T | undefined;\r\n}\r\n\r\n/** Immutable value-or-error container — similar to .NET's Result<T>. */\r\nexport class Result<T> implements IResult<T> {\r\n readonly hasValue: boolean;\r\n readonly hasError: boolean;\r\n private readonly _value: T | undefined;\r\n private readonly _error: unknown;\r\n\r\n public constructor(value: T | undefined, error?: unknown) {\r\n this.hasValue = error === undefined;\r\n this.hasError = !this.hasValue;\r\n this._value = value;\r\n this._error = error;\r\n }\r\n\r\n get value(): T {\r\n if (this.hasError) throw this._error;\r\n return this._value as T;\r\n }\r\n\r\n get error(): unknown {\r\n return this._error;\r\n }\r\n\r\n get valueOrUndefined(): T | undefined {\r\n return this.hasValue ? this._value : undefined;\r\n }\r\n\r\n static ok<T>(value: T): Result<T> {\r\n return new Result<T>(value);\r\n }\r\n\r\n static error<T>(error: unknown): Result<T> {\r\n return new Result<T>(undefined, error);\r\n }\r\n}\r\n\r\nexport function result<T>(value: T, error?: unknown): Result<T> {\r\n return new Result<T>(value, error);\r\n}\r\n\r\nexport function errorResult<T>(error: unknown): Result<T> {\r\n return Result.error(error);\r\n}\r\n\r\nexport function resultFrom<T>(fn: () => T): Result<T> {\r\n try {\r\n return result(fn());\r\n } catch (e) {\r\n return errorResult(e);\r\n }\r\n}\r\n\r\nexport async function resultFromAsync<T>(\r\n fn: () => Promise<T>\r\n): Promise<Result<T>> {\r\n try {\r\n return result(await fn());\r\n } catch (e) {\r\n return errorResult(e);\r\n }\r\n}\r\n","import type { Disposable } from './disposable.js';\r\n\r\n/** Typed key for values stored in AsyncContext — each subsystem defines its own keys. */\r\nexport class AsyncContextKey<T> {\r\n readonly id: symbol;\r\n readonly defaultValue: T;\r\n\r\n constructor(name: string, defaultValue: T) {\r\n this.id = Symbol(name);\r\n this.defaultValue = defaultValue;\r\n }\r\n}\r\n\r\n/** General-purpose typed context container — named for forward-compatibility with TC39 AsyncContext proposal. */\r\nexport const abortSignalKey = new AsyncContextKey<AbortSignal | undefined>(\r\n 'AbortSignal',\r\n undefined\r\n);\r\n\r\nexport class AsyncContext {\r\n static current: AsyncContext | undefined = undefined;\r\n\r\n /** Immutable empty singleton — avoids allocating new AsyncContext(). */\r\n static readonly empty: AsyncContext = new AsyncContext();\r\n\r\n private static _defaults = new Map<symbol, unknown>();\r\n\r\n private _values: Map<symbol, unknown>;\r\n\r\n constructor(values?: Map<symbol, unknown>) {\r\n this._values = values ?? new Map<symbol, unknown>();\r\n }\r\n\r\n get<T>(key: AsyncContextKey<T>): T {\r\n if (this._values.has(key.id)) return this._values.get(key.id) as T;\r\n if (AsyncContext._defaults.has(key.id))\r\n return AsyncContext._defaults.get(key.id) as T;\r\n return key.defaultValue;\r\n }\r\n\r\n with<T>(key: AsyncContextKey<T>, value: T): AsyncContext {\r\n const copy = new Map(this._values);\r\n copy.set(key.id, value);\r\n return new AsyncContext(copy);\r\n }\r\n\r\n activate(): Disposable {\r\n const prev = AsyncContext.current;\r\n AsyncContext.current = this;\r\n return {\r\n dispose: () => {\r\n AsyncContext.current = prev;\r\n },\r\n };\r\n }\r\n\r\n run<R>(fn: () => R): R {\r\n const prev = AsyncContext.current;\r\n AsyncContext.current = this;\r\n try {\r\n return fn();\r\n } finally {\r\n AsyncContext.current = prev;\r\n }\r\n }\r\n\r\n /** Strip THIS exact instance from args if it's the last element (reference equality). */\r\n stripFromArgs(args: unknown[]): unknown[] {\r\n return args[args.length - 1] === this ? args.slice(0, -1) : args;\r\n }\r\n\r\n /** Resolve: return ctx if provided, otherwise AsyncContext.current. */\r\n static from(ctx: AsyncContext | undefined): AsyncContext | undefined {\r\n return ctx ?? AsyncContext.current;\r\n }\r\n\r\n /** Extract AsyncContext from last arg if instanceof AsyncContext, else fall back to .current. */\r\n static fromArgs(args: unknown[]): AsyncContext | undefined {\r\n const last = args[args.length - 1];\r\n return last instanceof AsyncContext ? last : AsyncContext.current;\r\n }\r\n\r\n static setDefault<T>(key: AsyncContextKey<T>, value: T): void {\r\n AsyncContext._defaults.set(key.id, value);\r\n }\r\n\r\n static getOrCreate(): AsyncContext {\r\n return AsyncContext.current ?? AsyncContext.empty;\r\n }\r\n}\r\n","/** Promise-based mutual exclusion lock for serializing async operations. */\r\nexport class AsyncLock {\r\n private _queue: (() => void)[] = [];\r\n private _locked = false;\r\n\r\n get isLocked(): boolean {\r\n return this._locked;\r\n }\r\n\r\n async acquire(): Promise<void> {\r\n if (!this._locked) {\r\n this._locked = true;\r\n return;\r\n }\r\n return new Promise<void>(resolve => {\r\n this._queue.push(resolve);\r\n });\r\n }\r\n\r\n release(): void {\r\n if (!this._locked) throw new Error('AsyncLock is not locked.');\r\n\r\n const next = this._queue.shift();\r\n if (next !== undefined) {\r\n // Transfer lock to the next waiter\r\n next();\r\n } else {\r\n this._locked = false;\r\n }\r\n }\r\n\r\n async run<T>(fn: () => T | Promise<T>): Promise<T> {\r\n await this.acquire();\r\n try {\r\n return await fn();\r\n } finally {\r\n this.release();\r\n }\r\n }\r\n}\r\n","/** Externally-resolvable promise — similar to .NET's TaskCompletionSource<T>. */\r\nexport class PromiseSource<T> {\r\n readonly promise: Promise<T>;\r\n private _resolve!: (value: T | PromiseLike<T>) => void;\r\n private _reject!: (reason?: unknown) => void;\r\n private _isCompleted = false;\r\n\r\n constructor() {\r\n this.promise = new Promise<T>((resolve, reject) => {\r\n this._resolve = resolve;\r\n this._reject = reject;\r\n });\r\n }\r\n\r\n get isCompleted(): boolean {\r\n return this._isCompleted;\r\n }\r\n\r\n resolve(value: T): boolean {\r\n if (this._isCompleted) return false;\r\n this._isCompleted = true;\r\n this._resolve(value);\r\n return true;\r\n }\r\n\r\n reject(reason?: unknown): boolean {\r\n if (this._isCompleted) return false;\r\n this._isCompleted = true;\r\n this._reject(reason);\r\n return true;\r\n }\r\n}\r\n\r\nexport const resolvedVoidPromise: Promise<void> = Promise.resolve();\r\n","import { PromiseSource } from './promise-source.js';\r\n\r\n/** Typed pub/sub event handler set — similar to .NET's EventHandler<T> multicast delegate. */\r\nexport class EventHandlerSet<T> {\r\n private _handlers = new Set<(arg: T) => void>();\r\n\r\n get count(): number {\r\n return this._handlers.size;\r\n }\r\n\r\n add(handler: (arg: T) => void): void {\r\n this._handlers.add(handler);\r\n }\r\n\r\n remove(handler: (arg: T) => void): void {\r\n this._handlers.delete(handler);\r\n }\r\n\r\n trigger(arg: T): void {\r\n for (const handler of this._handlers) handler(arg);\r\n }\r\n\r\n clear(): void {\r\n this._handlers.clear();\r\n }\r\n\r\n whenNext(): Promise<T> {\r\n const ps = new PromiseSource<T>();\r\n const handler = (arg: T) => {\r\n this._handlers.delete(handler);\r\n ps.resolve(arg);\r\n };\r\n this._handlers.add(handler);\r\n return ps.promise;\r\n }\r\n}\r\n","/**\n * A fixed-capacity circular buffer supporting efficient push/pull at both\n * head and tail.\n *\n * Direct port of .NET `ActualLab.Collections.RingBuffer<T>` at\n * src/ActualLab.Core/Collections/RingBuffer.cs (simplified — TS uses plain\n * modulo instead of the power-of-two-minus-one bit-mask trick, since the\n * performance difference is negligible in JavaScript).\n */\nexport class RingBuffer<T> {\n private _buffer: (T | undefined)[];\n private _start = 0;\n private _end = 0;\n private _count = 0;\n\n readonly capacity: number;\n\n get count(): number { return this._count; }\n get isEmpty(): boolean { return this._count === 0; }\n get isFull(): boolean { return this._count === this.capacity; }\n get remainingCapacity(): number { return this.capacity - this._count; }\n get hasRemainingCapacity(): boolean { return this._count < this.capacity; }\n\n constructor(capacity: number) {\n if (capacity < 1)\n throw new RangeError(`RingBuffer capacity must be >= 1 (was ${capacity}).`);\n this.capacity = capacity;\n this._buffer = new Array<T | undefined>(capacity);\n }\n\n /** Read the item at `index` (0-indexed, from head). */\n get(index: number): T {\n if (index < 0 || index >= this._count)\n throw new RangeError(`Index ${index} out of range [0, ${this._count}).`);\n return this._buffer[(this._start + index) % this.capacity] as T;\n }\n\n /** Add an item at the tail. Throws if the buffer is full. */\n pushTail(item: T): void {\n if (this._count >= this.capacity)\n throw new Error('RingBuffer is full.');\n this._buffer[this._end] = item;\n this._end = (this._end + 1) % this.capacity;\n this._count++;\n }\n\n /** Add an item at the tail, evicting the head item if the buffer is full. */\n pushTailAndMoveHeadIfFull(item: T): void {\n if (this._count >= this.capacity) {\n this._buffer[this._start] = undefined;\n this._start = (this._start + 1) % this.capacity;\n this._count--;\n }\n this.pushTail(item);\n }\n\n /** Remove the head item. Throws if the buffer is empty. */\n pullHead(): T {\n if (this._count === 0)\n throw new Error('RingBuffer is empty.');\n const head = this._buffer[this._start] as T;\n this._buffer[this._start] = undefined;\n this._start = (this._start + 1) % this.capacity;\n this._count--;\n return head;\n }\n\n /**\n * Advance the head by `skipCount` slots, releasing references to skipped\n * items so they can be garbage-collected.\n */\n moveHead(skipCount: number): void {\n if (skipCount === 0) return;\n if (skipCount < 0 || skipCount > this._count)\n throw new RangeError(`skipCount ${skipCount} out of range [0, ${this._count}].`);\n for (let k = 0; k < skipCount; k++) {\n this._buffer[(this._start + k) % this.capacity] = undefined;\n }\n this._start = (this._start + skipCount) % this.capacity;\n this._count -= skipCount;\n }\n\n /** Remove all items. */\n clear(): void {\n for (let i = 0; i < this.capacity; i++) this._buffer[i] = undefined;\n this._start = 0;\n this._end = 0;\n this._count = 0;\n }\n\n /** Copy the buffer's contents to a new array, head-first. */\n toArray(): T[] {\n const out = new Array<T>(this._count);\n for (let i = 0; i < this._count; i++) {\n out[i] = this._buffer[(this._start + i) % this.capacity] as T;\n }\n return out;\n }\n}\n","// .NET counterpart: ActualLab.Time.RetryDelaySeq\r\n\r\nconst DefaultSpread = 0.1;\r\nconst DefaultMultiplier = 1.41421356237; // Math.sqrt(2)\r\n\r\nfunction applySpread(origin: number, spread: number): number {\r\n if (spread <= 0) return origin;\r\n const delta = origin * spread;\r\n return origin + (Math.random() * 2 - 1) * delta;\r\n}\r\n\r\nexport class RetryDelaySeq {\r\n readonly min: number;\r\n readonly max: number;\r\n readonly spread: number;\r\n readonly multiplier: number;\r\n\r\n constructor(\r\n min: number,\r\n max: number,\r\n spread: number = DefaultSpread,\r\n multiplier: number = DefaultMultiplier\r\n ) {\r\n this.min = min;\r\n this.max = max;\r\n this.spread = spread;\r\n this.multiplier = multiplier;\r\n }\r\n\r\n static fixed(\r\n delayMs: number,\r\n spread: number = DefaultSpread\r\n ): RetryDelaySeq {\r\n return new RetryDelaySeq(delayMs, delayMs, spread, 1);\r\n }\r\n\r\n static exp(\r\n minMs: number,\r\n maxMs: number,\r\n spread: number = DefaultSpread,\r\n multiplier: number = DefaultMultiplier\r\n ): RetryDelaySeq {\r\n return new RetryDelaySeq(minMs, maxMs, spread, multiplier);\r\n }\r\n\r\n getDelay(failureCount: number): number {\r\n if (this.min < 0)\r\n throw new Error('RetryDelaySeq.min must be non-negative.');\r\n if (failureCount <= 0) return 0;\r\n\r\n if (this.multiplier <= 1) {\r\n // Fixed — no exponential component\r\n return Math.max(\r\n 0,\r\n this.spread <= 0 ? this.min : applySpread(this.min, this.spread)\r\n );\r\n }\r\n\r\n const multiplier = Math.pow(this.multiplier, failureCount - 1);\r\n const raw = Math.min(this.max, this.min * multiplier);\r\n return Math.max(0, applySpread(raw, this.spread));\r\n }\r\n}\r\n","// .NET counterparts: ActualLab.Net.RetryDelayer, ActualLab.Net.RetryDelay\r\n\r\nimport { EventHandlerSet } from './events.js';\r\nimport { RetryDelaySeq } from './retry-delay-seq.js';\r\n\r\nexport interface RetryDelay {\r\n readonly promise: Promise<void>;\r\n readonly endsAt: number; // Date.now()-based timestamp, 0 = no delay\r\n readonly isLimitExceeded: boolean;\r\n}\r\n\r\nexport const RetryDelayNone: RetryDelay = {\r\n promise: Promise.resolve(),\r\n endsAt: 0,\r\n isLimitExceeded: false,\r\n};\r\n\r\nexport const RetryDelayLimitExceeded: RetryDelay = {\r\n promise: Promise.resolve(),\r\n endsAt: 0,\r\n isLimitExceeded: true,\r\n};\r\n\r\nexport class RetryDelayer {\r\n private _cancelController = new AbortController();\r\n\r\n delays: RetryDelaySeq = RetryDelaySeq.fixed(1000);\r\n limit: number | undefined = undefined;\r\n\r\n readonly cancelDelaysChanged = new EventHandlerSet<void>();\r\n\r\n getDelay(tryIndex: number, cancellationSignal?: AbortSignal): RetryDelay {\r\n if (this.limit !== undefined && tryIndex >= this.limit)\r\n return RetryDelayLimitExceeded;\r\n\r\n const delayMs = this.delays.getDelay(tryIndex);\r\n if (tryIndex === 0 || delayMs <= 0) return RetryDelayNone;\r\n\r\n const actualDelayMs = Math.max(1, delayMs);\r\n const endsAt = Date.now() + actualDelayMs;\r\n\r\n const cancelSignal = this._cancelController.signal;\r\n const promise = new Promise<void>((resolve, reject) => {\r\n const timer = setTimeout(() => {\r\n cleanup();\r\n resolve();\r\n }, actualDelayMs);\r\n\r\n const onCancel = () => {\r\n clearTimeout(timer);\r\n cleanup();\r\n resolve(); // cancelDelays resolves, does NOT reject\r\n };\r\n\r\n const onAbort = () => {\r\n clearTimeout(timer);\r\n cleanup();\r\n reject(new Error('Retry delay aborted.'));\r\n };\r\n\r\n const cleanup = () => {\r\n cancelSignal.removeEventListener('abort', onCancel);\r\n cancellationSignal?.removeEventListener('abort', onAbort);\r\n };\r\n\r\n cancelSignal.addEventListener('abort', onCancel, { once: true });\r\n cancellationSignal?.addEventListener('abort', onAbort, {\r\n once: true,\r\n });\r\n });\r\n\r\n return { promise, endsAt, isLimitExceeded: false };\r\n }\r\n\r\n cancelDelays(): void {\r\n const old = this._cancelController;\r\n this._cancelController = new AbortController();\r\n old.abort();\r\n this.cancelDelaysChanged.trigger();\r\n }\r\n}\r\n"],"mappings":"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","names":["LogLevel"]}
package/dist/index.d.cts CHANGED
@@ -16,6 +16,99 @@ declare class DisposableBag implements Disposable, AsyncDisposable {
16
16
  disposeAsync(): Promise<void>;
17
17
  }
18
18
 
19
+ declare enum LogLevel {
20
+ Debug = 1,
21
+ Info = 2,
22
+ Warn = 3,
23
+ Error = 4,
24
+ None = 1000
25
+ }
26
+ interface LogRef {
27
+ target: unknown;
28
+ id: number;
29
+ }
30
+ declare class Log {
31
+ readonly scope: string;
32
+ readonly level: LogLevel;
33
+ private static isInitialized;
34
+ private static logRefs;
35
+ /** User-set overrides (persisted to sessionStorage). Empty by default. */
36
+ static readonly minLevels: Map<string, LogLevel>;
37
+ /** Per-scope defaults registered by packages via createLogProvider(). */
38
+ static readonly scopeDefaults: Map<string, LogLevel>;
39
+ /** Every scope ever requested via Log.get(). Used by logLevels.dump()
40
+ * so devs can discover what's available to override at runtime. */
41
+ static readonly knownScopes: Set<string>;
42
+ /** Global baseline for any scope without a default or override. */
43
+ static defaultMinLevel: LogLevel;
44
+ static loggerFactory: (scope: string, level: LogLevel) => Log;
45
+ log: (...data: unknown[]) => void;
46
+ trace: (...data: unknown[]) => void;
47
+ constructor(scope: string, level: LogLevel);
48
+ static get(scope: string): LogScopeFns;
49
+ static ref(data: object | null | undefined): object | null | undefined;
50
+ assert(predicate?: boolean, ...data: unknown[]): void;
51
+ }
52
+ interface LogScopeFns {
53
+ logScope: string;
54
+ debugLog: Log | null;
55
+ infoLog: Log | null;
56
+ warnLog: Log | null;
57
+ errorLog: Log | null;
58
+ }
59
+ declare function createLogProvider<TScope extends string>(prefix: string, defaults: Record<TScope, LogLevel>): (scope: TScope) => LogScopeFns;
60
+
61
+ declare function initLogging(): void;
62
+ declare class LogLevelController {
63
+ private minLevels;
64
+ constructor(minLevels: Map<string, LogLevel>);
65
+ /** Internal: used by initLogging() in secondary bundles to share the
66
+ * primary bundle's minLevels map. */
67
+ getMinLevels(): Map<string, LogLevel>;
68
+ /** List the current set of overrides. */
69
+ list(): Record<string, LogLevel>;
70
+ /** Print every known scope's effective level to the console as a table.
71
+ * Shows: scope, effective level, the source ('override' / 'default-key' /
72
+ * 'package-default' / 'baseline'), and the package default for reference.
73
+ * Use this from the dev console to discover what to pass to override(). */
74
+ dump(): void;
75
+ /** Override the level for a single scope. Persisted to sessionStorage. */
76
+ override(scope: string, newLevel: LogLevel): void;
77
+ /** Override the level for every scope whose name starts with scopePrefix
78
+ * (e.g. 'rpc.' to enable verbose RPC logging). Persisted. */
79
+ overrideAll(scopePrefix: string, newLevel: LogLevel): void;
80
+ /** Reset all overrides; package defaults take effect again. Persisted. */
81
+ reset(): void;
82
+ /** Clear all overrides (no global default unless `defaultLevel` is given). */
83
+ clear(defaultLevel?: LogLevel): void;
84
+ }
85
+
86
+ /** Common interface for types that carry a value-or-error outcome. */
87
+ interface IResult<T> {
88
+ readonly hasValue: boolean;
89
+ readonly hasError: boolean;
90
+ readonly value: T;
91
+ readonly error: unknown;
92
+ readonly valueOrUndefined: T | undefined;
93
+ }
94
+ /** Immutable value-or-error container — similar to .NET's Result<T>. */
95
+ declare class Result<T> implements IResult<T> {
96
+ readonly hasValue: boolean;
97
+ readonly hasError: boolean;
98
+ private readonly _value;
99
+ private readonly _error;
100
+ constructor(value: T | undefined, error?: unknown);
101
+ get value(): T;
102
+ get error(): unknown;
103
+ get valueOrUndefined(): T | undefined;
104
+ static ok<T>(value: T): Result<T>;
105
+ static error<T>(error: unknown): Result<T>;
106
+ }
107
+ declare function result<T>(value: T, error?: unknown): Result<T>;
108
+ declare function errorResult<T>(error: unknown): Result<T>;
109
+ declare function resultFrom<T>(fn: () => T): Result<T>;
110
+ declare function resultFromAsync<T>(fn: () => Promise<T>): Promise<Result<T>>;
111
+
19
112
  /** Typed key for values stored in AsyncContext — each subsystem defines its own keys. */
20
113
  declare class AsyncContextKey<T> {
21
114
  readonly id: symbol;
@@ -119,32 +212,6 @@ declare class RingBuffer<T> {
119
212
  toArray(): T[];
120
213
  }
121
214
 
122
- /** Common interface for types that carry a value-or-error outcome. */
123
- interface IResult<T> {
124
- readonly hasValue: boolean;
125
- readonly hasError: boolean;
126
- readonly value: T;
127
- readonly error: unknown;
128
- readonly valueOrUndefined: T | undefined;
129
- }
130
- /** Immutable value-or-error container — similar to .NET's Result<T>. */
131
- declare class Result<T> implements IResult<T> {
132
- readonly hasValue: boolean;
133
- readonly hasError: boolean;
134
- private readonly _value;
135
- private readonly _error;
136
- constructor(value: T | undefined, error?: unknown);
137
- get value(): T;
138
- get error(): unknown;
139
- get valueOrUndefined(): T | undefined;
140
- static ok<T>(value: T): Result<T>;
141
- static error<T>(error: unknown): Result<T>;
142
- }
143
- declare function result<T>(value: T, error?: unknown): Result<T>;
144
- declare function errorResult<T>(error: unknown): Result<T>;
145
- declare function resultFrom<T>(fn: () => T): Result<T>;
146
- declare function resultFromAsync<T>(fn: () => Promise<T>): Promise<Result<T>>;
147
-
148
215
  declare class RetryDelaySeq {
149
216
  readonly min: number;
150
217
  readonly max: number;
@@ -172,4 +239,4 @@ declare class RetryDelayer {
172
239
  cancelDelays(): void;
173
240
  }
174
241
 
175
- export { AsyncContext, AsyncContextKey, type AsyncDisposable, AsyncLock, type Disposable, DisposableBag, EventHandlerSet, type IResult, PromiseSource, Result, type RetryDelay, RetryDelayLimitExceeded, RetryDelayNone, RetryDelaySeq, RetryDelayer, RingBuffer, abortSignalKey, errorResult, resolvedVoidPromise, result, resultFrom, resultFromAsync };
242
+ export { AsyncContext, AsyncContextKey, type AsyncDisposable, AsyncLock, type Disposable, DisposableBag, EventHandlerSet, type IResult, Log, LogLevel, LogLevelController, type LogRef, type LogScopeFns, PromiseSource, Result, type RetryDelay, RetryDelayLimitExceeded, RetryDelayNone, RetryDelaySeq, RetryDelayer, RingBuffer, abortSignalKey, createLogProvider, errorResult, initLogging, resolvedVoidPromise, result, resultFrom, resultFromAsync };
package/dist/index.d.ts CHANGED
@@ -16,6 +16,99 @@ declare class DisposableBag implements Disposable, AsyncDisposable {
16
16
  disposeAsync(): Promise<void>;
17
17
  }
18
18
 
19
+ declare enum LogLevel {
20
+ Debug = 1,
21
+ Info = 2,
22
+ Warn = 3,
23
+ Error = 4,
24
+ None = 1000
25
+ }
26
+ interface LogRef {
27
+ target: unknown;
28
+ id: number;
29
+ }
30
+ declare class Log {
31
+ readonly scope: string;
32
+ readonly level: LogLevel;
33
+ private static isInitialized;
34
+ private static logRefs;
35
+ /** User-set overrides (persisted to sessionStorage). Empty by default. */
36
+ static readonly minLevels: Map<string, LogLevel>;
37
+ /** Per-scope defaults registered by packages via createLogProvider(). */
38
+ static readonly scopeDefaults: Map<string, LogLevel>;
39
+ /** Every scope ever requested via Log.get(). Used by logLevels.dump()
40
+ * so devs can discover what's available to override at runtime. */
41
+ static readonly knownScopes: Set<string>;
42
+ /** Global baseline for any scope without a default or override. */
43
+ static defaultMinLevel: LogLevel;
44
+ static loggerFactory: (scope: string, level: LogLevel) => Log;
45
+ log: (...data: unknown[]) => void;
46
+ trace: (...data: unknown[]) => void;
47
+ constructor(scope: string, level: LogLevel);
48
+ static get(scope: string): LogScopeFns;
49
+ static ref(data: object | null | undefined): object | null | undefined;
50
+ assert(predicate?: boolean, ...data: unknown[]): void;
51
+ }
52
+ interface LogScopeFns {
53
+ logScope: string;
54
+ debugLog: Log | null;
55
+ infoLog: Log | null;
56
+ warnLog: Log | null;
57
+ errorLog: Log | null;
58
+ }
59
+ declare function createLogProvider<TScope extends string>(prefix: string, defaults: Record<TScope, LogLevel>): (scope: TScope) => LogScopeFns;
60
+
61
+ declare function initLogging(): void;
62
+ declare class LogLevelController {
63
+ private minLevels;
64
+ constructor(minLevels: Map<string, LogLevel>);
65
+ /** Internal: used by initLogging() in secondary bundles to share the
66
+ * primary bundle's minLevels map. */
67
+ getMinLevels(): Map<string, LogLevel>;
68
+ /** List the current set of overrides. */
69
+ list(): Record<string, LogLevel>;
70
+ /** Print every known scope's effective level to the console as a table.
71
+ * Shows: scope, effective level, the source ('override' / 'default-key' /
72
+ * 'package-default' / 'baseline'), and the package default for reference.
73
+ * Use this from the dev console to discover what to pass to override(). */
74
+ dump(): void;
75
+ /** Override the level for a single scope. Persisted to sessionStorage. */
76
+ override(scope: string, newLevel: LogLevel): void;
77
+ /** Override the level for every scope whose name starts with scopePrefix
78
+ * (e.g. 'rpc.' to enable verbose RPC logging). Persisted. */
79
+ overrideAll(scopePrefix: string, newLevel: LogLevel): void;
80
+ /** Reset all overrides; package defaults take effect again. Persisted. */
81
+ reset(): void;
82
+ /** Clear all overrides (no global default unless `defaultLevel` is given). */
83
+ clear(defaultLevel?: LogLevel): void;
84
+ }
85
+
86
+ /** Common interface for types that carry a value-or-error outcome. */
87
+ interface IResult<T> {
88
+ readonly hasValue: boolean;
89
+ readonly hasError: boolean;
90
+ readonly value: T;
91
+ readonly error: unknown;
92
+ readonly valueOrUndefined: T | undefined;
93
+ }
94
+ /** Immutable value-or-error container — similar to .NET's Result<T>. */
95
+ declare class Result<T> implements IResult<T> {
96
+ readonly hasValue: boolean;
97
+ readonly hasError: boolean;
98
+ private readonly _value;
99
+ private readonly _error;
100
+ constructor(value: T | undefined, error?: unknown);
101
+ get value(): T;
102
+ get error(): unknown;
103
+ get valueOrUndefined(): T | undefined;
104
+ static ok<T>(value: T): Result<T>;
105
+ static error<T>(error: unknown): Result<T>;
106
+ }
107
+ declare function result<T>(value: T, error?: unknown): Result<T>;
108
+ declare function errorResult<T>(error: unknown): Result<T>;
109
+ declare function resultFrom<T>(fn: () => T): Result<T>;
110
+ declare function resultFromAsync<T>(fn: () => Promise<T>): Promise<Result<T>>;
111
+
19
112
  /** Typed key for values stored in AsyncContext — each subsystem defines its own keys. */
20
113
  declare class AsyncContextKey<T> {
21
114
  readonly id: symbol;
@@ -119,32 +212,6 @@ declare class RingBuffer<T> {
119
212
  toArray(): T[];
120
213
  }
121
214
 
122
- /** Common interface for types that carry a value-or-error outcome. */
123
- interface IResult<T> {
124
- readonly hasValue: boolean;
125
- readonly hasError: boolean;
126
- readonly value: T;
127
- readonly error: unknown;
128
- readonly valueOrUndefined: T | undefined;
129
- }
130
- /** Immutable value-or-error container — similar to .NET's Result<T>. */
131
- declare class Result<T> implements IResult<T> {
132
- readonly hasValue: boolean;
133
- readonly hasError: boolean;
134
- private readonly _value;
135
- private readonly _error;
136
- constructor(value: T | undefined, error?: unknown);
137
- get value(): T;
138
- get error(): unknown;
139
- get valueOrUndefined(): T | undefined;
140
- static ok<T>(value: T): Result<T>;
141
- static error<T>(error: unknown): Result<T>;
142
- }
143
- declare function result<T>(value: T, error?: unknown): Result<T>;
144
- declare function errorResult<T>(error: unknown): Result<T>;
145
- declare function resultFrom<T>(fn: () => T): Result<T>;
146
- declare function resultFromAsync<T>(fn: () => Promise<T>): Promise<Result<T>>;
147
-
148
215
  declare class RetryDelaySeq {
149
216
  readonly min: number;
150
217
  readonly max: number;
@@ -172,4 +239,4 @@ declare class RetryDelayer {
172
239
  cancelDelays(): void;
173
240
  }
174
241
 
175
- export { AsyncContext, AsyncContextKey, type AsyncDisposable, AsyncLock, type Disposable, DisposableBag, EventHandlerSet, type IResult, PromiseSource, Result, type RetryDelay, RetryDelayLimitExceeded, RetryDelayNone, RetryDelaySeq, RetryDelayer, RingBuffer, abortSignalKey, errorResult, resolvedVoidPromise, result, resultFrom, resultFromAsync };
242
+ export { AsyncContext, AsyncContextKey, type AsyncDisposable, AsyncLock, type Disposable, DisposableBag, EventHandlerSet, type IResult, Log, LogLevel, LogLevelController, type LogRef, type LogScopeFns, PromiseSource, Result, type RetryDelay, RetryDelayLimitExceeded, RetryDelayNone, RetryDelaySeq, RetryDelayer, RingBuffer, abortSignalKey, createLogProvider, errorResult, initLogging, resolvedVoidPromise, result, resultFrom, resultFromAsync };