@cosystem/core 0.0.0 → 1.0.0

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,"file":"index.mjs","names":["createCoactionStore"],"sources":["../src/errors.ts","../src/token.ts","../src/inject.ts","../src/provider.ts","../src/container.ts","../src/metadata.ts","../src/app.ts","../src/decorators.ts","../src/testApp.ts","../src/worker.ts"],"sourcesContent":["export class CosystemError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"CosystemError\";\n }\n}\n\nexport class FrozenContainerError extends CosystemError {\n constructor() {\n super(\"Container provider graph is frozen and can no longer be mutated.\");\n this.name = \"FrozenContainerError\";\n }\n}\n\nexport class MissingProviderError extends CosystemError {\n constructor(token: string, path: readonly string[]) {\n super(\n [\n `Missing provider for ${token}.`,\n path.length > 0 ? \"Resolution path:\" : \"\",\n ...path.map((entry) => ` ${entry}`),\n ]\n .filter(Boolean)\n .join(\"\\n\"),\n );\n this.name = \"MissingProviderError\";\n }\n}\n\nexport class DuplicateProviderError extends CosystemError {\n constructor(token: string) {\n super(`Duplicate non-multi provider for ${token}. Use override() or mark providers as multi.`);\n this.name = \"DuplicateProviderError\";\n }\n}\n\nexport class AmbiguousProviderError extends CosystemError {\n constructor(token: string) {\n super(`Multiple providers registered for ${token}. Use getAll() instead of get().`);\n this.name = \"AmbiguousProviderError\";\n }\n}\n\nexport class CircularDependencyError extends CosystemError {\n constructor(path: readonly string[]) {\n super([\"Circular dependency detected:\", ...path.map((entry) => ` ${entry}`)].join(\"\\n\"));\n this.name = \"CircularDependencyError\";\n }\n}\n\nexport class AsyncProviderInSyncResolutionError extends CosystemError {\n constructor(token: string) {\n super(`Provider for ${token} resolved asynchronously. Use getAsync() instead of get().`);\n this.name = \"AsyncProviderInSyncResolutionError\";\n }\n}\n\nexport class LifetimeLeakError extends CosystemError {\n constructor(parent: string, parentScope: string, child: string, childScope: string) {\n super(`${parent} (${parentScope}) cannot depend on ${child} (${childScope}) without leakSafe.`);\n this.name = \"LifetimeLeakError\";\n }\n}\n\nexport class InjectContextError extends CosystemError {\n constructor(token: string) {\n super(`${token} can only be injected while resolving a provider or running an app hook.`);\n this.name = \"InjectContextError\";\n }\n}\n","import type { InjectionToken, Token } from \"./types.js\";\n\nexport function token<T>(description?: string): Token<T> {\n const id = Symbol(description);\n\n if (description === undefined) {\n return { id };\n }\n\n return { id, description };\n}\n\nexport function tokenName(tokenValue: InjectionToken): string {\n if (typeof tokenValue === \"string\") {\n return tokenValue;\n }\n\n if (typeof tokenValue === \"symbol\") {\n return tokenValue.description ?? tokenValue.toString();\n }\n\n if (typeof tokenValue === \"function\") {\n return tokenValue.name || \"<anonymous class>\";\n }\n\n return tokenValue.description ?? tokenValue.id.description ?? tokenValue.id.toString();\n}\n","import { InjectContextError } from \"./errors.js\";\nimport { tokenName } from \"./token.js\";\nimport type { InjectionToken, ResolutionContext, TokenValue } from \"./types.js\";\n\nlet activeResolutionContext: ResolutionContext | undefined;\n\nexport function inject<TToken extends InjectionToken>(token: TToken): TokenValue<TToken> {\n if (activeResolutionContext === undefined) {\n throw new InjectContextError(tokenName(token));\n }\n\n return activeResolutionContext.requestContainer.get(token) as TokenValue<TToken>;\n}\n\nexport function runWithInjectContext<T>(context: ResolutionContext, callback: () => T): T {\n const previousContext = activeResolutionContext;\n activeResolutionContext = context;\n\n try {\n return callback();\n } finally {\n activeResolutionContext = previousContext;\n }\n}\n","import type {\n ClassProvideOptions,\n ClassProvider,\n DependencySpec,\n ExistingProvideOptions,\n ExistingProvider,\n FactoryProvideOptions,\n FactoryProvider,\n InjectionToken,\n ProviderInput,\n ProviderRecord,\n ResolvedDeps,\n ValueProvideOptions,\n ValueProvider,\n} from \"./types.js\";\nimport { tokenName } from \"./token.js\";\n\nexport function provide<T>(\n token: InjectionToken<T>,\n options: ClassProvideOptions<T>,\n): ClassProvider<T>;\n\nexport function provide<T>(\n token: InjectionToken<T>,\n options: ValueProvideOptions<T>,\n): ValueProvider<T>;\n\nexport function provide<T, const TDeps extends readonly DependencySpec[]>(\n token: InjectionToken<T>,\n options: FactoryProvideOptions<T, TDeps>,\n): FactoryProvider<T, TDeps>;\n\nexport function provide<T>(\n token: InjectionToken<T>,\n options: ExistingProvideOptions<T>,\n): ExistingProvider<T>;\n\nexport function provide<T>(\n providerToken: InjectionToken<T>,\n options:\n | ClassProvideOptions<T>\n | ValueProvideOptions<T>\n | FactoryProvideOptions<T, readonly DependencySpec[]>\n | ExistingProvideOptions<T>,\n): ClassProvider<T> | ValueProvider<T> | FactoryProvider<T> | ExistingProvider<T> {\n return {\n provide: providerToken,\n ...options,\n };\n}\n\nexport function normalizeProvider(input: ProviderInput): ProviderRecord {\n if (typeof input === \"function\") {\n return normalizeProvider({\n provide: input,\n useClass: input,\n });\n }\n\n const token = input.provide;\n const base = {\n token,\n tokenName: tokenName(token),\n multi: input.multi ?? false,\n leakSafe: input.leakSafe ?? false,\n };\n\n if (\"useClass\" in input) {\n return {\n ...base,\n provider: {\n kind: \"class\",\n useClass: input.useClass,\n },\n scope: input.scope ?? \"singleton\",\n deps:\n input.deps ??\n (input.useClass as { readonly inject?: readonly DependencySpec[] }).inject ??\n [],\n eager: input.eager ?? false,\n ...eraseDispose(input.dispose),\n };\n }\n\n if (\"useValue\" in input) {\n return {\n ...base,\n provider: {\n kind: \"value\",\n useValue: input.useValue,\n },\n scope: \"singleton\",\n deps: [],\n eager: true,\n ...eraseDispose(input.dispose),\n };\n }\n\n if (\"useFactory\" in input) {\n return {\n ...base,\n provider: {\n kind: \"factory\",\n useFactory: input.useFactory as (...deps: readonly unknown[]) => unknown,\n },\n scope: input.scope ?? \"singleton\",\n deps: input.deps ?? [],\n eager: input.eager ?? false,\n ...eraseDispose(input.dispose),\n };\n }\n\n return {\n ...base,\n provider: {\n kind: \"existing\",\n useExisting: input.useExisting,\n },\n scope: \"singleton\",\n deps: [input.useExisting],\n eager: false,\n };\n}\n\nexport type { ResolvedDeps };\n\nfunction eraseDispose<T>(dispose: ((value: T) => void | Promise<void>) | undefined): {\n readonly dispose?: (value: unknown) => void | Promise<void>;\n} {\n if (dispose === undefined) {\n return {};\n }\n\n return {\n dispose: dispose as (value: unknown) => void | Promise<void>,\n };\n}\n","import {\n AmbiguousProviderError,\n AsyncProviderInSyncResolutionError,\n CircularDependencyError,\n DuplicateProviderError,\n FrozenContainerError,\n LifetimeLeakError,\n MissingProviderError,\n} from \"./errors.js\";\nimport { runWithInjectContext } from \"./inject.js\";\nimport { normalizeProvider } from \"./provider.js\";\nimport { tokenName } from \"./token.js\";\nimport type {\n BuildOptions,\n Constructor,\n Container,\n ContainerImpl,\n ContainerOptions,\n DependencySpec,\n DisposableInstance,\n InjectionToken,\n ProviderInput,\n ProviderRecord,\n ResolutionContext,\n Scope,\n ScopeOptions,\n} from \"./types.js\";\n\nconst asyncDisposeSymbol: symbol | undefined = Symbol.asyncDispose;\nconst disposeSymbol: symbol | undefined = Symbol.dispose;\n\nexport function createContainer(options: ContainerOptions = {}): Container {\n return new RuntimeContainer(options);\n}\n\nclass RuntimeContainer implements ContainerImpl {\n readonly parent: ContainerImpl | undefined;\n readonly strictScopes: boolean;\n readonly records = new Map<InjectionToken, ProviderRecord[]>();\n readonly scopedCache = new Map<ProviderRecord, unknown>();\n readonly created: DisposableInstance[] = [];\n readonly root: ContainerImpl;\n readonly singletonCache = new Map<ProviderRecord, unknown>();\n frozen = false;\n\n constructor(options: ContainerOptions = {}) {\n this.parent = options.parent as ContainerImpl | undefined;\n this.strictScopes = options.strictScopes ?? this.parent?.strictScopes ?? true;\n this.root = this.parent?.root ?? this;\n }\n\n get<T>(token: InjectionToken<T>): T;\n get<T>(token: InjectionToken<T>, options: { readonly optional: true }): T | undefined;\n get<T>(token: InjectionToken<T>, options?: { readonly optional: true }): T | undefined {\n const record =\n options?.optional === true\n ? this.getSingleRecord(token, true)\n : this.getSingleRecord(token, false);\n\n if (record === undefined) {\n return undefined;\n }\n\n const context = this.createResolutionContext(\"sync\");\n const value = this.resolveRecord(record, context);\n\n if (isPromiseLike(value)) {\n throw new AsyncProviderInSyncResolutionError(record.tokenName);\n }\n\n return value as T;\n }\n\n getAll<T>(token: InjectionToken<T>): T[] {\n const records = this.getAllRecords(token);\n const context = this.createResolutionContext(\"sync\");\n\n return records.map((record) => {\n const value = this.resolveRecord(record, context);\n\n if (isPromiseLike(value)) {\n throw new AsyncProviderInSyncResolutionError(record.tokenName);\n }\n\n return value as T;\n });\n }\n\n async getAsync<T>(token: InjectionToken<T>): Promise<T> {\n const record = this.getSingleRecord(token, false);\n const context = this.createResolutionContext(\"async\");\n return (await this.resolveRecord(record, context)) as T;\n }\n\n has(token: InjectionToken): boolean {\n return this.findRecords(token).length > 0;\n }\n\n provide(provider: ProviderInput): void {\n this.assertMutable();\n const record = normalizeProvider(provider);\n const existing = this.records.get(record.token) ?? [];\n\n if (!record.multi && existing.some((candidate) => !candidate.multi)) {\n throw new DuplicateProviderError(record.tokenName);\n }\n\n this.records.set(record.token, [...existing, record]);\n }\n\n override(provider: ProviderInput): void {\n this.assertMutable();\n const record = normalizeProvider(provider);\n const existing = this.records.get(record.token) ?? [];\n const kept = existing.filter((candidate) => candidate.multi && !record.multi);\n this.records.set(record.token, [...kept, record]);\n }\n\n createScope(options: ScopeOptions = {}): Container {\n return new RuntimeContainer({\n parent: this,\n strictScopes: options.strictScopes ?? this.strictScopes,\n });\n }\n\n build<T>(target: Constructor<T>, options: BuildOptions = {}): T {\n const deps =\n options.deps ?? (target as { readonly inject?: readonly DependencySpec[] }).inject ?? [];\n const context = this.createResolutionContext(\"sync\");\n const values = this.resolveDependencies(deps, context);\n\n if (isPromiseLike(values)) {\n throw new AsyncProviderInSyncResolutionError(target.name);\n }\n\n return Reflect.construct(target, values) as T;\n }\n\n freeze(): void {\n this.frozen = true;\n }\n\n async dispose(): Promise<void> {\n const errors: unknown[] = [];\n\n for (const entry of [...this.created].toReversed()) {\n if (entry.disposed) {\n continue;\n }\n\n entry.disposed = true;\n\n try {\n await disposeValue(entry.value, entry.record);\n } catch (error) {\n errors.push(error);\n }\n }\n\n this.created.length = 0;\n this.scopedCache.clear();\n\n if (this.root === this) {\n this.singletonCache.clear();\n }\n\n if (errors.length > 0) {\n throw new AggregateError(errors, \"One or more providers failed to dispose.\");\n }\n }\n\n private assertMutable(): void {\n if (this.frozen) {\n throw new FrozenContainerError();\n }\n }\n\n private createResolutionContext(mode: \"sync\" | \"async\"): ResolutionContext {\n return {\n stack: [],\n resolutionCache: new Map(),\n mode,\n requestContainer: this,\n };\n }\n\n private getSingleRecord(token: InjectionToken, optional: false): ProviderRecord;\n private getSingleRecord(token: InjectionToken, optional: true): ProviderRecord | undefined;\n private getSingleRecord(token: InjectionToken, optional: boolean): ProviderRecord | undefined {\n const records = this.findRecords(token);\n\n if (records.length === 0) {\n if (optional) {\n return undefined;\n }\n\n throw new MissingProviderError(tokenName(token), []);\n }\n\n const nonMultiRecords = records.filter((record) => !record.multi);\n\n if (nonMultiRecords.length === 1) {\n return nonMultiRecords[0]!;\n }\n\n if (records.length === 1) {\n return records[0]!;\n }\n\n throw new AmbiguousProviderError(tokenName(token));\n }\n\n private getAllRecords(token: InjectionToken): ProviderRecord[] {\n return this.getAllRecordsFromHierarchy(token);\n }\n\n findRecords(token: InjectionToken): ProviderRecord[] {\n const localRecords = this.records.get(token);\n\n if (localRecords !== undefined && localRecords.length > 0) {\n return localRecords;\n }\n\n return this.parent?.findRecords(token) ?? [];\n }\n\n getAllRecordsFromHierarchy(token: InjectionToken): ProviderRecord[] {\n const parentRecords = this.parent?.getAllRecordsFromHierarchy(token) ?? [];\n const localRecords = this.records.get(token) ?? [];\n return [...parentRecords, ...localRecords];\n }\n\n private resolveRecord(\n record: ProviderRecord,\n context: ResolutionContext,\n ): unknown | Promise<unknown> {\n const cached = this.getCached(record, context);\n\n if (cached.found) {\n return cached.value;\n }\n\n this.assertNoCycle(record, context);\n this.assertLifetimeSafe(record, context);\n\n context.stack.push(record);\n\n const finalize = (value: unknown): unknown => {\n context.stack.pop();\n this.setCached(record, value, context);\n return value;\n };\n\n const fail = (error: unknown): never => {\n context.stack.pop();\n throw error;\n };\n\n try {\n const value = this.createValue(record, context);\n\n if (isPromiseLike(value)) {\n if (context.mode === \"sync\") {\n throw new AsyncProviderInSyncResolutionError(record.tokenName);\n }\n\n return Promise.resolve(value).then(finalize, fail);\n }\n\n return finalize(value);\n } catch (error) {\n return fail(error);\n }\n }\n\n private createValue(\n record: ProviderRecord,\n context: ResolutionContext,\n ): unknown | Promise<unknown> {\n switch (record.provider.kind) {\n case \"class\": {\n const provider = record.provider;\n const deps = this.resolveDependencies(record.deps, context);\n\n if (isPromiseLike(deps)) {\n return Promise.resolve(deps).then((values) =>\n Reflect.construct(provider.useClass, values),\n );\n }\n\n return Reflect.construct(provider.useClass, deps);\n }\n\n case \"value\":\n return record.provider.useValue;\n\n case \"factory\": {\n const provider = record.provider;\n const deps = this.resolveDependencies(record.deps, context);\n\n if (isPromiseLike(deps)) {\n return Promise.resolve(deps).then((values) =>\n runWithInjectContext(context, () => provider.useFactory(...values)),\n );\n }\n\n return runWithInjectContext(context, () => provider.useFactory(...deps));\n }\n\n case \"existing\":\n return this.resolveDependency(record.provider.useExisting, context);\n }\n }\n\n private resolveDependencies(\n deps: readonly DependencySpec[],\n context: ResolutionContext,\n ): unknown[] | Promise<unknown[]> {\n const values: unknown[] = Array.from({ length: deps.length });\n const asyncValues: Promise<unknown>[] = [];\n\n for (const [index, dep] of deps.entries()) {\n const value = this.resolveDependency(dep, context);\n\n if (isPromiseLike(value)) {\n asyncValues.push(\n Promise.resolve(value).then((resolved) => {\n values[index] = resolved;\n return resolved;\n }),\n );\n } else {\n values[index] = value;\n }\n }\n\n if (asyncValues.length === 0) {\n return values;\n }\n\n return Promise.all(asyncValues).then(() => values);\n }\n\n private resolveDependency(\n dep: DependencySpec,\n context: ResolutionContext,\n ): unknown | Promise<unknown> {\n if (isDependencyObject(dep)) {\n if (dep.many === true) {\n const records = this.getAllRecords(dep.token);\n return this.resolveAllRecords(records, context);\n }\n\n const record =\n dep.optional === true\n ? this.getSingleRecord(dep.token, true)\n : this.getSingleRecord(dep.token, false);\n\n if (record === undefined) {\n return undefined;\n }\n\n return this.resolveRecord(record, context);\n }\n\n const record = this.getSingleRecord(dep, false);\n return this.resolveRecord(record, context);\n }\n\n private resolveAllRecords(\n records: readonly ProviderRecord[],\n context: ResolutionContext,\n ): unknown[] | Promise<unknown[]> {\n const values = records.map((record) => this.resolveRecord(record, context));\n\n if (values.some(isPromiseLike)) {\n return Promise.all(values);\n }\n\n return values;\n }\n\n private getCached(\n record: ProviderRecord,\n context: ResolutionContext,\n ): { readonly found: boolean; readonly value?: unknown } {\n const cache = this.cacheFor(record, context);\n\n if (cache === undefined || !cache.has(record)) {\n return { found: false };\n }\n\n return { found: true, value: cache.get(record) };\n }\n\n private setCached<T>(record: ProviderRecord, value: T, context: ResolutionContext): void {\n const cache = this.cacheFor(record, context);\n\n if (cache === undefined) {\n this.trackCreated(record, value, context);\n return;\n }\n\n if (!cache.has(record)) {\n cache.set(record, value);\n this.trackCreated(record, value, context);\n }\n }\n\n private cacheFor(\n record: ProviderRecord,\n context: ResolutionContext,\n ): Map<ProviderRecord, unknown> | undefined {\n switch (record.scope) {\n case \"singleton\":\n return this.root.singletonCache;\n case \"scoped\":\n return context.requestContainer.scopedCache;\n case \"resolution\":\n return context.resolutionCache;\n case \"transient\":\n return undefined;\n }\n }\n\n private trackCreated<T>(record: ProviderRecord, value: T, context: ResolutionContext): void {\n if (value === null || (typeof value !== \"object\" && typeof value !== \"function\")) {\n return;\n }\n\n const owner = record.scope === \"singleton\" ? this.root : context.requestContainer;\n owner.created.push({ record, value, disposed: false });\n }\n\n private assertNoCycle(record: ProviderRecord, context: ResolutionContext): void {\n const existingIndex = context.stack.indexOf(record);\n\n if (existingIndex === -1) {\n return;\n }\n\n const cycle = [...context.stack.slice(existingIndex), record].map((entry) => entry.tokenName);\n throw new CircularDependencyError(cycle);\n }\n\n private assertLifetimeSafe(record: ProviderRecord, context: ResolutionContext): void {\n if (!this.strictScopes || record.leakSafe || context.stack.length === 0) {\n return;\n }\n\n const parent = context.stack.at(-1);\n\n if (parent === undefined) {\n return;\n }\n\n if (isLifetimeLeak(parent.scope, record.scope)) {\n throw new LifetimeLeakError(parent.tokenName, parent.scope, record.tokenName, record.scope);\n }\n }\n}\n\nfunction isDependencyObject(dep: DependencySpec): dep is {\n readonly token: InjectionToken;\n readonly optional?: boolean;\n readonly many?: boolean;\n} {\n return typeof dep === \"object\" && dep !== null && \"token\" in dep;\n}\n\nfunction isPromiseLike<T = unknown>(value: unknown): value is PromiseLike<T> {\n return (\n (typeof value === \"object\" || typeof value === \"function\") &&\n value !== null &&\n \"then\" in value &&\n typeof value.then === \"function\"\n );\n}\n\nfunction isLifetimeLeak(parentScope: Scope, childScope: Scope): boolean {\n if (parentScope === \"singleton\") {\n return childScope === \"scoped\" || childScope === \"resolution\" || childScope === \"transient\";\n }\n\n if (parentScope === \"scoped\") {\n return childScope === \"resolution\" || childScope === \"transient\";\n }\n\n return false;\n}\n\nasync function disposeValue(value: unknown, record: ProviderRecord): Promise<void> {\n if (record.dispose !== undefined) {\n await record.dispose(value);\n }\n\n if (value === null || (typeof value !== \"object\" && typeof value !== \"function\")) {\n return;\n }\n\n const maybeDisposable = value as Record<PropertyKey, unknown>;\n\n if (\n asyncDisposeSymbol !== undefined &&\n typeof maybeDisposable[asyncDisposeSymbol] === \"function\"\n ) {\n await (maybeDisposable[asyncDisposeSymbol] as () => Promise<void> | void)();\n return;\n }\n\n if (disposeSymbol !== undefined && typeof maybeDisposable[disposeSymbol] === \"function\") {\n (maybeDisposable[disposeSymbol] as () => void)();\n return;\n }\n\n if (typeof maybeDisposable.dispose === \"function\") {\n await (maybeDisposable.dispose as () => Promise<void> | void)();\n return;\n }\n\n if (typeof maybeDisposable.destroy === \"function\") {\n await (maybeDisposable.destroy as () => Promise<void> | void)();\n }\n}\n","import type { Constructor, DependencySpec, Scope } from \"./types.js\";\n\nexport interface ModuleOptions {\n readonly name?: string;\n readonly deps?: readonly DependencySpec[];\n readonly scope?: Scope;\n}\n\nexport interface DefineModuleOptions extends ModuleOptions {\n readonly state?: readonly PropertyKey[];\n readonly actions?: readonly PropertyKey[];\n readonly computed?: readonly PropertyKey[];\n}\n\nexport interface ModuleMetadata {\n readonly kind: \"module\";\n name?: string;\n deps?: readonly DependencySpec[];\n scope?: Scope;\n readonly state: Set<PropertyKey>;\n readonly actions: Set<PropertyKey>;\n readonly computed: Set<PropertyKey>;\n}\n\nconst moduleMetadata = new WeakMap<Function, ModuleMetadata>();\n\nexport function defineModule<T extends Constructor>(\n target: T,\n options: DefineModuleOptions = {},\n): T {\n const metadata = ensureModuleMetadata(target);\n applyModuleOptions(metadata, options);\n addProperties(metadata.state, options.state);\n addProperties(metadata.actions, options.actions);\n addProperties(metadata.computed, options.computed);\n return target;\n}\n\nexport function getModuleMetadata(target: Function): ModuleMetadata | undefined {\n return moduleMetadata.get(target);\n}\n\nexport function addModuleState(target: Function, property: PropertyKey): void {\n ensureModuleMetadata(target).state.add(property);\n}\n\nexport function addModuleAction(target: Function, property: PropertyKey): void {\n ensureModuleMetadata(target).actions.add(property);\n}\n\nexport function addModuleComputed(target: Function, property: PropertyKey): void {\n ensureModuleMetadata(target).computed.add(property);\n}\n\nexport function applyModuleOptions(metadata: ModuleMetadata, options: ModuleOptions): void {\n if (options.name !== undefined) {\n metadata.name = options.name;\n }\n\n if (options.deps !== undefined) {\n metadata.deps = options.deps;\n }\n\n if (options.scope !== undefined) {\n metadata.scope = options.scope;\n }\n}\n\nexport function ensureModuleMetadata(target: Function): ModuleMetadata {\n let metadata = moduleMetadata.get(target);\n\n if (metadata !== undefined) {\n return metadata;\n }\n\n metadata = {\n kind: \"module\",\n state: new Set(),\n actions: new Set(),\n computed: new Set(),\n };\n moduleMetadata.set(target, metadata);\n return metadata;\n}\n\nfunction addProperties(target: Set<PropertyKey>, properties: readonly PropertyKey[] | undefined) {\n for (const property of properties ?? []) {\n target.add(property);\n }\n}\n","import { create as createCoactionStore, createReactiveTracker, type Store } from \"coaction\";\n\nimport { createContainer } from \"./container.js\";\nimport { CosystemError, DuplicateProviderError } from \"./errors.js\";\nimport { getModuleMetadata, type ModuleMetadata } from \"./metadata.js\";\nimport { provide } from \"./provider.js\";\nimport { tokenName } from \"./token.js\";\nimport type {\n ClassProvideOptions,\n Constructor,\n Container,\n InjectionToken,\n Provider,\n ProviderInput,\n ScopeOptions,\n} from \"./types.js\";\n\nexport interface EngineOptions {\n readonly patches?: boolean;\n readonly devtools?: boolean;\n readonly transport?: unknown;\n}\n\nexport interface AppDevOptions {\n readonly strictActions?: boolean;\n}\n\nexport interface CreateAppOptions {\n readonly providers?: readonly ProviderInput[];\n readonly plugins?: readonly Plugin[];\n readonly parent?: App | Container;\n readonly devOptions?: AppDevOptions;\n readonly engine?: EngineOptions;\n}\n\nexport interface InternalCreateAppOptions extends CreateAppOptions {\n readonly overrides?: readonly ProviderInput[];\n readonly testInspector?: MutableTestInspector;\n}\n\nexport interface AppState {\n readonly version: number;\n}\n\nexport interface AppScope {\n readonly container: Container;\n}\n\nexport interface App {\n readonly container: Container;\n readonly state: AppState;\n readonly started: boolean;\n readonly store: Store<RootState>;\n\n get<T>(token: InjectionToken<T>): T;\n getAsync<T>(token: InjectionToken<T>): Promise<T>;\n getAll<T>(token: InjectionToken<T>): T[];\n getModule<T>(token: InjectionToken<T>): T;\n getModuleByName<T = unknown>(name: string): T;\n watch<T>(\n read: () => T,\n listener: (value: T, previous: T) => void,\n options?: WatchOptions<T>,\n ): () => void;\n start(): Promise<void>;\n stop(): Promise<void>;\n dispose(): Promise<void>;\n createScope(options?: ScopeOptions): AppScope;\n}\n\nexport interface WatchOptions<T> {\n readonly equals?: (value: T, previous: T) => boolean;\n readonly immediate?: boolean;\n}\n\nexport interface Plugin {\n readonly name?: string;\n setup?(app: App): void | Promise<void>;\n onModuleCreated?(event: ModuleCreatedEvent): void;\n onActionStart?(event: ActionEvent): void;\n onActionEnd?(event: ActionEvent): void;\n onStateChange?(event: StateChangeEvent): void;\n onError?(error: unknown, context: ErrorContext): void;\n dispose?(): void | Promise<void>;\n}\n\nexport interface ModuleCreatedEvent {\n readonly name: string;\n readonly token: InjectionToken;\n readonly instance: unknown;\n}\n\nexport interface ActionEvent {\n readonly module: string;\n readonly method: string;\n readonly args: readonly unknown[];\n readonly startedAt: number;\n readonly endedAt?: number;\n readonly error?: unknown;\n}\n\nexport interface StateChangeEvent {\n readonly state: unknown;\n}\n\nexport interface ErrorContext {\n readonly phase: string;\n}\n\nexport interface TestAppInspector {\n getActions(): readonly ActionEvent[];\n getState(): unknown;\n getPatches(): readonly unknown[];\n clearActions(): void;\n clearPatches(): void;\n flushEffects(): Promise<void>;\n}\n\nexport interface MutableTestInspector extends TestAppInspector {\n recordAction(event: ActionEvent): void;\n recordPatch(patch: unknown): void;\n}\n\ntype RootState = Record<string, Record<PropertyKey, unknown>>;\n\ninterface ModuleBinding {\n readonly name: string;\n readonly token: InjectionToken;\n readonly instance: Record<PropertyKey, unknown>;\n readonly metadata: ModuleMetadata;\n readonly originalActions: Map<PropertyKey, (...args: unknown[]) => unknown>;\n readonly originalComputed: Map<PropertyKey, () => unknown>;\n activeDraft: Record<PropertyKey, unknown> | undefined;\n actionDepth: number;\n}\n\ninterface LifecycleModule {\n onInit?(): void | Promise<void>;\n onStart?(): void | Promise<void>;\n onStop?(): void | Promise<void>;\n onDispose?(): void | Promise<void>;\n}\n\nexport function createApp(options: CreateAppOptions = {}): App {\n return createAppInternal(options);\n}\n\nexport function createAppInternal(options: InternalCreateAppOptions = {}): App {\n const parent = isApp(options.parent) ? options.parent.container : options.parent;\n const container = parent === undefined ? createContainer() : createContainer({ parent });\n const moduleTokens: InjectionToken[] = [];\n\n for (const provider of options.providers ?? []) {\n const normalized = normalizeAppProvider(provider);\n container.provide(normalized.provider);\n\n if (normalized.moduleToken !== undefined) {\n moduleTokens.push(normalized.moduleToken);\n }\n }\n\n for (const override of options.overrides ?? []) {\n container.override(normalizeAppProvider(override).provider);\n }\n\n container.freeze();\n\n const modules = instantiateModules(container, moduleTokens);\n const rootState = createRootState(modules);\n const store = createCoactionStore(rootState, {\n name: \"cosystem\",\n sliceMode: \"single\",\n });\n const state: { version: number } = { version: 0 };\n const app = new RuntimeApp({\n container,\n devOptions: options.devOptions ?? {},\n modules,\n plugins: options.plugins ?? [],\n state,\n store,\n ...(options.testInspector === undefined ? {} : { testInspector: options.testInspector }),\n });\n\n app.bindModules();\n app.runModuleCreatedHooks();\n app.init();\n\n return app;\n}\n\nclass RuntimeApp implements App {\n readonly container: Container;\n readonly state: AppState;\n readonly store: Store<RootState>;\n\n private readonly devOptions: AppDevOptions;\n private readonly modules: ModuleBinding[];\n private readonly moduleByToken = new Map<InjectionToken, ModuleBinding>();\n private readonly moduleByName = new Map<string, ModuleBinding>();\n private readonly plugins: readonly Plugin[];\n private readonly testInspector: MutableTestInspector | undefined;\n private initPromise: Promise<void> = Promise.resolve();\n private isStarted = false;\n private isDisposed = false;\n\n constructor(options: {\n readonly container: Container;\n readonly devOptions: AppDevOptions;\n readonly modules: ModuleBinding[];\n readonly plugins: readonly Plugin[];\n readonly state: AppState;\n readonly store: Store<RootState>;\n readonly testInspector?: MutableTestInspector;\n }) {\n this.container = options.container;\n this.devOptions = options.devOptions;\n this.modules = options.modules;\n this.plugins = options.plugins;\n this.state = options.state;\n this.store = options.store;\n this.testInspector = options.testInspector;\n\n for (const moduleBinding of options.modules) {\n this.moduleByToken.set(moduleBinding.token, moduleBinding);\n this.moduleByName.set(moduleBinding.name, moduleBinding);\n }\n\n this.store.subscribe(() => {\n (this.state as { version: number }).version += 1;\n const state = this.store.getPureState();\n this.testInspector?.recordPatch(state);\n this.emitStateChange({ state });\n });\n }\n\n get started(): boolean {\n return this.isStarted;\n }\n\n get<T>(token: InjectionToken<T>): T {\n return this.container.get(token);\n }\n\n getAsync<T>(token: InjectionToken<T>): Promise<T> {\n return this.container.getAsync(token);\n }\n\n getAll<T>(token: InjectionToken<T>): T[] {\n return this.container.getAll(token);\n }\n\n getModule<T>(token: InjectionToken<T>): T {\n const value = this.get(token);\n\n if (!this.moduleByToken.has(token)) {\n throw new CosystemError(`${tokenName(token)} is not a CoSystem module.`);\n }\n\n return value;\n }\n\n getModuleByName<T = unknown>(name: string): T {\n const moduleBinding = this.moduleByName.get(name);\n\n if (moduleBinding === undefined) {\n throw new CosystemError(`${name} is not a CoSystem module.`);\n }\n\n return moduleBinding.instance as T;\n }\n\n watch<T>(\n read: () => T,\n listener: (value: T, previous: T) => void,\n options: WatchOptions<T> = {},\n ): () => void {\n const equals = options.equals ?? Object.is;\n const tracker = createReactiveTracker();\n let previous = tracker.track(read);\n\n if (options.immediate === true) {\n listener(previous, previous);\n }\n\n const publish = () => {\n const next = tracker.track(read);\n\n if (equals(next, previous)) {\n return;\n }\n\n const last = previous;\n previous = next;\n listener(next, last);\n };\n\n const unsubscribeStore = this.store.subscribe(publish);\n const unsubscribeTracker = tracker.subscribe(publish);\n\n return () => {\n unsubscribeStore();\n unsubscribeTracker();\n tracker.dispose();\n };\n }\n\n async start(): Promise<void> {\n if (this.isStarted) {\n return;\n }\n\n await this.initPromise;\n await this.runLifecycle(\"onStart\");\n this.isStarted = true;\n }\n\n async stop(): Promise<void> {\n if (!this.isStarted) {\n return;\n }\n\n await this.runLifecycle(\"onStop\", true);\n this.isStarted = false;\n }\n\n async dispose(): Promise<void> {\n if (this.isDisposed) {\n return;\n }\n\n await this.stop();\n await this.runLifecycle(\"onDispose\", true);\n await Promise.all(this.plugins.map((plugin) => plugin.dispose?.()));\n await this.container.dispose();\n this.store.destroy();\n this.isDisposed = true;\n }\n\n createScope(options?: ScopeOptions): AppScope {\n return {\n container: this.container.createScope(options),\n };\n }\n\n bindModules(): void {\n for (const moduleBinding of this.modules) {\n this.bindState(moduleBinding);\n this.bindComputed(moduleBinding);\n this.bindActions(moduleBinding);\n }\n }\n\n runModuleCreatedHooks(): void {\n for (const moduleBinding of this.modules) {\n const event: ModuleCreatedEvent = {\n name: moduleBinding.name,\n token: moduleBinding.token,\n instance: moduleBinding.instance,\n };\n\n for (const plugin of this.plugins) {\n plugin.onModuleCreated?.(event);\n }\n }\n }\n\n init(): void {\n this.initPromise = (async () => {\n await Promise.all(this.plugins.map((plugin) => plugin.setup?.(this)));\n await this.runLifecycle(\"onInit\");\n })();\n }\n\n private bindState(moduleBinding: ModuleBinding): void {\n for (const property of moduleBinding.metadata.state) {\n Object.defineProperty(moduleBinding.instance, property, {\n configurable: true,\n enumerable: true,\n get: () => this.readModuleState(moduleBinding, property),\n set: (value: unknown) => this.writeModuleState(moduleBinding, property, value),\n });\n }\n }\n\n private bindActions(moduleBinding: ModuleBinding): void {\n for (const property of moduleBinding.metadata.actions) {\n const action = getMethod(moduleBinding.instance, property);\n moduleBinding.originalActions.set(property, action);\n\n Object.defineProperty(moduleBinding.instance, property, {\n configurable: true,\n value: (...args: unknown[]) => this.runAction(moduleBinding, property, args),\n });\n }\n }\n\n private bindComputed(moduleBinding: ModuleBinding): void {\n for (const property of moduleBinding.metadata.computed) {\n const getter = getGetter(moduleBinding.instance, property);\n moduleBinding.originalComputed.set(property, getter);\n\n Object.defineProperty(moduleBinding.instance, property, {\n configurable: true,\n enumerable: true,\n get: () => getter.call(moduleBinding.instance),\n });\n }\n }\n\n private readModuleState(moduleBinding: ModuleBinding, property: PropertyKey): unknown {\n return this.store.getState()[moduleBinding.name]?.[property];\n }\n\n private writeModuleState(\n moduleBinding: ModuleBinding,\n property: PropertyKey,\n value: unknown,\n ): void {\n if (moduleBinding.activeDraft !== undefined) {\n moduleBinding.activeDraft[property] = value;\n return;\n }\n\n if (this.devOptions.strictActions === true && moduleBinding.actionDepth === 0) {\n throw new CosystemError(\n `Cannot write ${moduleBinding.name}.${String(property)} outside an action.`,\n );\n }\n\n this.store.setState((draft) => {\n draft[moduleBinding.name] ??= {};\n draft[moduleBinding.name]![property] = value;\n });\n }\n\n private runAction(\n moduleBinding: ModuleBinding,\n property: PropertyKey,\n args: readonly unknown[],\n ): unknown {\n const action = moduleBinding.originalActions.get(property);\n\n if (action === undefined) {\n throw new CosystemError(`${moduleBinding.name}.${String(property)} is not an action.`);\n }\n\n const event: ActionEvent = {\n args,\n method: String(property),\n module: moduleBinding.name,\n startedAt: Date.now(),\n };\n this.emitActionStart(event);\n\n let result: unknown;\n let error: unknown;\n\n try {\n moduleBinding.actionDepth += 1;\n this.store.setState((draft) => {\n const previousDraft = moduleBinding.activeDraft;\n moduleBinding.activeDraft = draft[moduleBinding.name] ?? {};\n draft[moduleBinding.name] = moduleBinding.activeDraft;\n\n try {\n result = action.apply(moduleBinding.instance, [...args]);\n } finally {\n moduleBinding.activeDraft = previousDraft;\n }\n });\n } catch (caught) {\n error = caught;\n } finally {\n moduleBinding.actionDepth -= 1;\n }\n\n const endedEvent: ActionEvent = {\n ...event,\n endedAt: Date.now(),\n ...(error === undefined ? {} : { error }),\n };\n this.testInspector?.recordAction(endedEvent);\n this.emitActionEnd(endedEvent);\n\n if (error !== undefined) {\n throw error;\n }\n\n return result;\n }\n\n private async runLifecycle(method: keyof LifecycleModule, reverse = false): Promise<void> {\n const modules = reverse ? this.modules.toReversed() : this.modules;\n\n for (const moduleBinding of modules) {\n const lifecycle = moduleBinding.instance as LifecycleModule;\n await lifecycle[method]?.();\n }\n }\n\n private emitActionStart(event: ActionEvent): void {\n for (const plugin of this.plugins) {\n plugin.onActionStart?.(event);\n }\n }\n\n private emitActionEnd(event: ActionEvent): void {\n for (const plugin of this.plugins) {\n plugin.onActionEnd?.(event);\n }\n }\n\n private emitStateChange(event: StateChangeEvent): void {\n for (const plugin of this.plugins) {\n plugin.onStateChange?.(event);\n }\n }\n}\n\nfunction normalizeAppProvider(provider: ProviderInput): {\n readonly provider: ProviderInput;\n readonly moduleToken?: InjectionToken;\n} {\n if (typeof provider === \"function\") {\n const metadata = getModuleMetadata(provider);\n\n if (metadata !== undefined) {\n return {\n provider: provide(provider, createModuleClassProviderOptions(provider, metadata)),\n moduleToken: provider,\n };\n }\n\n return { provider };\n }\n\n if (\"useClass\" in provider) {\n const metadata = getModuleMetadata(provider.useClass);\n\n if (metadata !== undefined) {\n return {\n provider: {\n ...provider,\n ...mergeModuleClassProviderOptions(provider, metadata),\n },\n moduleToken: provider.provide,\n };\n }\n }\n\n return { provider };\n}\n\nfunction createModuleClassProviderOptions<T>(\n useClass: Constructor<T>,\n metadata: ModuleMetadata,\n): ClassProvideOptions<T> {\n return {\n useClass,\n ...(metadata.deps === undefined ? {} : { deps: metadata.deps }),\n ...(metadata.scope === undefined ? {} : { scope: metadata.scope }),\n };\n}\n\nfunction mergeModuleClassProviderOptions<T>(\n provider: Provider<T>,\n metadata: ModuleMetadata,\n): Partial<ClassProvideOptions<T>> {\n return {\n ...(\"deps\" in provider || metadata.deps === undefined ? {} : { deps: metadata.deps }),\n ...(\"scope\" in provider || metadata.scope === undefined ? {} : { scope: metadata.scope }),\n };\n}\n\nfunction instantiateModules(container: Container, moduleTokens: readonly InjectionToken[]) {\n const modules: ModuleBinding[] = [];\n\n for (const moduleToken of moduleTokens) {\n const instance = container.get(moduleToken) as Record<PropertyKey, unknown>;\n const metadata = getModuleMetadata(instance.constructor);\n\n if (metadata === undefined) {\n continue;\n }\n\n const name = metadata.name ?? stableModuleName(moduleToken);\n\n if (modules.some((moduleBinding) => moduleBinding.name === name)) {\n throw new DuplicateProviderError(name);\n }\n\n modules.push({\n actionDepth: 0,\n activeDraft: undefined,\n instance,\n metadata,\n name,\n originalActions: new Map(),\n originalComputed: new Map(),\n token: moduleToken,\n });\n }\n\n return modules;\n}\n\nfunction createRootState(modules: readonly ModuleBinding[]): RootState {\n const rootState: RootState = {};\n\n for (const moduleBinding of modules) {\n const state: Record<PropertyKey, unknown> = {};\n\n for (const property of moduleBinding.metadata.state) {\n state[property] = moduleBinding.instance[property];\n }\n\n rootState[moduleBinding.name] = state;\n }\n\n return rootState;\n}\n\nfunction stableModuleName(token: InjectionToken): string {\n const name = tokenName(token);\n return `${name.slice(0, 1).toLowerCase()}${name.slice(1)}`;\n}\n\nfunction getMethod(\n instance: Record<PropertyKey, unknown>,\n property: PropertyKey,\n): (...args: unknown[]) => unknown {\n const descriptor = getDescriptor(instance, property);\n\n if (descriptor?.value === undefined || typeof descriptor.value !== \"function\") {\n throw new CosystemError(`${String(property)} is not a method.`);\n }\n\n return descriptor.value as (...args: unknown[]) => unknown;\n}\n\nfunction getGetter(instance: Record<PropertyKey, unknown>, property: PropertyKey): () => unknown {\n const descriptor = getDescriptor(instance, property);\n\n if (descriptor?.get === undefined) {\n throw new CosystemError(`${String(property)} is not a getter.`);\n }\n\n return descriptor.get;\n}\n\nfunction getDescriptor(\n instance: Record<PropertyKey, unknown>,\n property: PropertyKey,\n): PropertyDescriptor | undefined {\n let current: object | null = instance;\n\n while (current !== null) {\n const descriptor = Object.getOwnPropertyDescriptor(current, property);\n\n if (descriptor !== undefined) {\n return descriptor;\n }\n\n current = Object.getPrototypeOf(current);\n }\n\n return undefined;\n}\n\nfunction isApp(value: unknown): value is App {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"get\" in value &&\n \"start\" in value &&\n \"dispose\" in value\n );\n}\n","import {\n addModuleAction,\n addModuleComputed,\n addModuleState,\n applyModuleOptions,\n defineModule,\n ensureModuleMetadata,\n type ModuleOptions,\n} from \"./metadata.js\";\nimport type { Constructor } from \"./types.js\";\n\nexport function module(options: ModuleOptions = {}) {\n return function moduleDecorator<T extends Constructor>(\n target: T,\n _context?: ClassDecoratorContext<T>,\n ): T {\n defineModule(target, options);\n return target;\n };\n}\n\nexport function state<This extends object, Value>(\n _value: ClassAccessorDecoratorTarget<This, Value>,\n context: ClassAccessorDecoratorContext<This, Value>,\n): void {\n if (context.kind !== \"accessor\") {\n throw new TypeError(\"@state only supports standard accessor decorators.\");\n }\n\n context.addInitializer(function initializeState(this: This) {\n addModuleState(this.constructor, context.name);\n });\n}\n\nexport function action<This extends object, Args extends unknown[], Return>(\n _value: (this: This, ...args: Args) => Return,\n context: ClassMethodDecoratorContext<This, (this: This, ...args: Args) => Return>,\n): void {\n if (context.kind !== \"method\") {\n throw new TypeError(\"@action only supports method decorators.\");\n }\n\n context.addInitializer(function initializeAction(this: This) {\n addModuleAction(this.constructor, context.name);\n });\n}\n\nexport function computed<This extends object, Value>(\n _value: (this: This) => Value,\n context: ClassGetterDecoratorContext<This, Value>,\n): void {\n if (context.kind !== \"getter\") {\n throw new TypeError(\"@computed only supports getter decorators.\");\n }\n\n context.addInitializer(function initializeComputed(this: This) {\n addModuleComputed(this.constructor, context.name);\n });\n}\n\nexport function effect<This extends object, Args extends unknown[], Return>(\n _value: (this: This, ...args: Args) => Return,\n _context: ClassMethodDecoratorContext<This, (this: This, ...args: Args) => Return>,\n): void {\n // Effect scheduling is intentionally deferred until the app runtime has real\n // lifecycle semantics for reactive side effects.\n}\n\nexport function moduleOptions(target: Constructor, options: ModuleOptions): void {\n applyModuleOptions(ensureModuleMetadata(target), options);\n}\n","import { createAppInternal, type MutableTestInspector } from \"./app.js\";\nimport type { ActionEvent, CreateAppOptions, TestAppInspector } from \"./app.js\";\nimport type { ProviderInput } from \"./types.js\";\n\nexport interface TestAppOptions extends Omit<CreateAppOptions, \"providers\"> {\n readonly providers?: readonly ProviderInput[];\n readonly overrides?: readonly ProviderInput[];\n readonly autoStart?: boolean;\n readonly strictActions?: boolean;\n}\n\nexport interface TestApp extends ReturnType<typeof createAppInternal> {\n readonly test: TestAppInspector;\n}\n\nexport interface AutoStartedTestAppOptions extends Omit<TestAppOptions, \"autoStart\"> {\n readonly autoStart: true;\n}\n\nexport interface ManualTestAppOptions extends Omit<TestAppOptions, \"autoStart\"> {\n readonly autoStart?: false;\n}\n\nexport function testApp(options: AutoStartedTestAppOptions): Promise<TestApp>;\nexport function testApp(options?: ManualTestAppOptions): TestApp;\nexport function testApp(options: TestAppOptions = {}): TestApp | Promise<TestApp> {\n const inspector = createTestInspector();\n const { autoStart, overrides, strictActions, ...createOptions } = options;\n const app = createAppInternal({\n ...createOptions,\n devOptions: {\n ...createOptions.devOptions,\n ...(strictActions === undefined ? {} : { strictActions }),\n },\n ...(overrides === undefined ? {} : { overrides }),\n testInspector: inspector,\n }) as TestApp;\n\n Object.defineProperty(app, \"test\", {\n configurable: false,\n enumerable: false,\n value: inspector,\n });\n\n if (autoStart === true) {\n return app.start().then(() => app);\n }\n\n return app;\n}\n\nfunction createTestInspector(): MutableTestInspector {\n const actions: ActionEvent[] = [];\n const patches: unknown[] = [];\n let lastState: unknown;\n\n return {\n clearActions() {\n actions.length = 0;\n },\n clearPatches() {\n patches.length = 0;\n },\n flushEffects() {\n return Promise.resolve();\n },\n getActions() {\n return actions;\n },\n getPatches() {\n return patches;\n },\n getState() {\n return lastState;\n },\n recordAction(event) {\n actions.push(event);\n },\n recordPatch(patch) {\n lastState = patch;\n patches.push(patch);\n },\n };\n}\n","import { CosystemError } from \"./errors.js\";\nimport { createApp, type App, type CreateAppOptions } from \"./app.js\";\n\nexport interface WorkerTransport {\n post(message: WorkerMessage): void;\n subscribe(listener: (message: WorkerMessage) => void): () => void;\n}\n\nexport type WorkerMessage =\n | WorkerCallMessage\n | WorkerResultMessage\n | WorkerStateMessage\n | WorkerReadyMessage;\n\nexport interface WorkerCallMessage {\n readonly id: number;\n readonly type: \"call\";\n readonly module: string;\n readonly method: string;\n readonly args: readonly unknown[];\n}\n\nexport interface WorkerResultMessage {\n readonly id: number;\n readonly type: \"result\";\n readonly value?: unknown;\n readonly error?: SerializedWorkerError;\n}\n\nexport interface WorkerStateMessage {\n readonly type: \"state\";\n readonly state: unknown;\n readonly version: number;\n}\n\nexport interface WorkerReadyMessage {\n readonly type: \"ready\";\n}\n\nexport interface SerializedWorkerError {\n readonly name: string;\n readonly message: string;\n readonly stack?: string;\n}\n\nexport interface CreateWorkerAppOptions extends CreateAppOptions {\n readonly transport: WorkerTransport;\n}\n\nexport interface WorkerAppHost {\n readonly app: App;\n dispose(): Promise<void>;\n}\n\nexport interface CreateWorkerClientOptions {\n readonly transport: WorkerTransport;\n}\n\nexport type AsyncMethodProxy<T extends object> = {\n readonly [Key in keyof T as T[Key] extends (...args: any[]) => unknown\n ? Key\n : never]: T[Key] extends (...args: infer Args) => infer Return\n ? (...args: Args) => Promise<Awaited<Return>>\n : never;\n};\n\nexport interface WorkerClient {\n readonly state: {\n readonly version: number;\n };\n getState(): unknown;\n call(module: string, method: string, ...args: readonly unknown[]): Promise<unknown>;\n module<T extends object>(name: string): AsyncMethodProxy<T>;\n subscribe(listener: (message: WorkerStateMessage) => void): () => void;\n dispose(): void;\n}\n\nexport function createWorkerApp(options: CreateWorkerAppOptions): WorkerAppHost {\n const { transport, ...appOptions } = options;\n const app = createApp(appOptions);\n const unsubscribeTransport = transport.subscribe((message) => {\n if (message.type !== \"call\") {\n return;\n }\n\n void handleCall(app, transport, message);\n });\n const unsubscribeStore = app.store.subscribe(() => {\n publishState(app, transport);\n });\n\n transport.post({ type: \"ready\" });\n publishState(app, transport);\n\n return {\n app,\n async dispose() {\n unsubscribeTransport();\n unsubscribeStore();\n await app.dispose();\n },\n };\n}\n\nexport function createWorkerClient(options: CreateWorkerClientOptions): WorkerClient {\n const { transport } = options;\n const listeners = new Set<(message: WorkerStateMessage) => void>();\n const pending = new Map<\n number,\n {\n readonly resolve: (value: unknown) => void;\n readonly reject: (error: unknown) => void;\n }\n >();\n const state = { version: 0 };\n let nextId = 1;\n let snapshot: unknown;\n\n const unsubscribe = transport.subscribe((message) => {\n if (message.type === \"state\") {\n state.version = message.version;\n snapshot = message.state;\n\n for (const listener of listeners) {\n listener(message);\n }\n\n return;\n }\n\n if (message.type !== \"result\") {\n return;\n }\n\n const entry = pending.get(message.id);\n\n if (entry === undefined) {\n return;\n }\n\n pending.delete(message.id);\n\n if (message.error !== undefined) {\n entry.reject(createRemoteError(message.error));\n return;\n }\n\n entry.resolve(message.value);\n });\n\n const client: WorkerClient = {\n state,\n call(module, method, ...args) {\n const id = nextId;\n nextId += 1;\n\n return new Promise((resolve, reject) => {\n pending.set(id, { reject, resolve });\n transport.post({\n args,\n id,\n method,\n module,\n type: \"call\",\n });\n });\n },\n dispose() {\n unsubscribe();\n\n for (const entry of pending.values()) {\n entry.reject(new CosystemError(\"Worker client disposed before response.\"));\n }\n\n pending.clear();\n listeners.clear();\n },\n getState() {\n return snapshot;\n },\n module<T extends object>(name: string): AsyncMethodProxy<T> {\n return new Proxy(\n {},\n {\n get(_target, property) {\n if (typeof property !== \"string\") {\n return undefined;\n }\n\n return (...args: readonly unknown[]) => client.call(name, property, ...args);\n },\n },\n ) as AsyncMethodProxy<T>;\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n };\n\n return client;\n}\n\nexport function createMemoryWorkerTransportPair(): readonly [WorkerTransport, WorkerTransport] {\n const leftListeners = new Set<(message: WorkerMessage) => void>();\n const rightListeners = new Set<(message: WorkerMessage) => void>();\n\n return [\n createMemoryWorkerTransport(leftListeners, rightListeners),\n createMemoryWorkerTransport(rightListeners, leftListeners),\n ];\n}\n\nasync function handleCall(\n app: App,\n transport: WorkerTransport,\n message: WorkerCallMessage,\n): Promise<void> {\n try {\n const module = app.getModuleByName<Record<string, unknown>>(message.module);\n const method = module[message.method];\n\n if (typeof method !== \"function\") {\n throw new CosystemError(`${message.module}.${message.method} is not callable.`);\n }\n\n const value = await method.apply(module, message.args);\n transport.post({\n id: message.id,\n type: \"result\",\n value,\n });\n } catch (error) {\n transport.post({\n error: serializeError(error),\n id: message.id,\n type: \"result\",\n });\n }\n}\n\nfunction publishState(app: App, transport: WorkerTransport): void {\n transport.post({\n state: app.store.getPureState(),\n type: \"state\",\n version: app.state.version,\n });\n}\n\nfunction createMemoryWorkerTransport(\n inbox: Set<(message: WorkerMessage) => void>,\n outbox: Set<(message: WorkerMessage) => void>,\n): WorkerTransport {\n return {\n post(message) {\n for (const listener of outbox) {\n listener(message);\n }\n },\n subscribe(listener) {\n inbox.add(listener);\n return () => {\n inbox.delete(listener);\n };\n },\n };\n}\n\nfunction serializeError(error: unknown): SerializedWorkerError {\n if (error instanceof Error) {\n return {\n message: error.message,\n name: error.name,\n ...(error.stack === undefined ? {} : { stack: error.stack }),\n };\n }\n\n return {\n message: String(error),\n name: \"Error\",\n };\n}\n\nfunction createRemoteError(error: SerializedWorkerError): CosystemError {\n const remoteError = new CosystemError(`Remote worker error: ${error.message}`);\n remoteError.name = error.name;\n\n if (error.stack !== undefined) {\n remoteError.stack = error.stack;\n }\n\n return remoteError;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["isPromiseLike","createCoactionStore","#container","createCoactionComputed","#listeners","#closed"],"sources":["../src/errors.ts","../src/token.ts","../src/inject.ts","../src/provider.ts","../src/container.ts","../src/lazyModule.ts","../src/metadata.ts","../src/app.ts","../src/decorators.ts","../src/loggerPlugin.ts","../src/testApp.ts","../src/worker.ts"],"sourcesContent":["export class CosystemError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"CosystemError\";\n }\n}\n\nexport class FrozenContainerError extends CosystemError {\n constructor() {\n super(\"Container provider graph is frozen and can no longer be mutated.\");\n this.name = \"FrozenContainerError\";\n }\n}\n\nexport class MissingProviderError extends CosystemError {\n constructor(token: string, path: readonly string[]) {\n super(\n [\n `Missing provider for ${token}.`,\n path.length > 0 ? \"Resolution path:\" : \"\",\n ...path.map((entry) => ` ${entry}`),\n ]\n .filter(Boolean)\n .join(\"\\n\"),\n );\n this.name = \"MissingProviderError\";\n }\n}\n\nexport class DuplicateProviderError extends CosystemError {\n constructor(token: string) {\n super(`Duplicate non-multi provider for ${token}. Use override() or mark providers as multi.`);\n this.name = \"DuplicateProviderError\";\n }\n}\n\nexport class AmbiguousProviderError extends CosystemError {\n constructor(token: string) {\n super(`Multiple providers registered for ${token}. Use getAll() instead of get().`);\n this.name = \"AmbiguousProviderError\";\n }\n}\n\nexport class CircularDependencyError extends CosystemError {\n constructor(path: readonly string[]) {\n super([\"Circular dependency detected:\", ...path.map((entry) => ` ${entry}`)].join(\"\\n\"));\n this.name = \"CircularDependencyError\";\n }\n}\n\nexport class AsyncProviderInSyncResolutionError extends CosystemError {\n constructor(token: string) {\n super(`Provider for ${token} resolved asynchronously. Use getAsync() instead of get().`);\n this.name = \"AsyncProviderInSyncResolutionError\";\n }\n}\n\nexport class LifetimeLeakError extends CosystemError {\n constructor(parent: string, parentScope: string, child: string, childScope: string) {\n super(`${parent} (${parentScope}) cannot depend on ${child} (${childScope}) without leakSafe.`);\n this.name = \"LifetimeLeakError\";\n }\n}\n\nexport class InjectContextError extends CosystemError {\n constructor(token: string) {\n super(`${token} can only be injected while resolving a provider or running an app hook.`);\n this.name = \"InjectContextError\";\n }\n}\n","import type { InjectionToken, Token } from \"./types.js\";\n\nexport function token<T>(description?: string): Token<T> {\n const id = Symbol(description);\n\n if (description === undefined) {\n return { id };\n }\n\n return { id, description };\n}\n\nexport function tokenName(tokenValue: InjectionToken): string {\n if (typeof tokenValue === \"string\") {\n return tokenValue;\n }\n\n if (typeof tokenValue === \"symbol\") {\n return tokenValue.description ?? tokenValue.toString();\n }\n\n if (typeof tokenValue === \"function\") {\n return tokenValue.name || \"<anonymous class>\";\n }\n\n return tokenValue.description ?? tokenValue.id.description ?? tokenValue.id.toString();\n}\n","import { InjectContextError } from \"./errors.js\";\nimport { tokenName } from \"./token.js\";\nimport type { InjectionToken, ResolutionContext, TokenValue } from \"./types.js\";\n\nlet activeResolutionContext: ResolutionContext | undefined;\n\nexport function inject<TToken extends InjectionToken>(token: TToken): TokenValue<TToken> {\n if (activeResolutionContext === undefined) {\n throw new InjectContextError(tokenName(token));\n }\n\n return activeResolutionContext.requestContainer.get(token) as TokenValue<TToken>;\n}\n\nexport function runWithInjectContext<T>(context: ResolutionContext, callback: () => T): T {\n const previousContext = activeResolutionContext;\n activeResolutionContext = context;\n\n try {\n return callback();\n } finally {\n activeResolutionContext = previousContext;\n }\n}\n","import type {\n ClassProvideOptions,\n ClassProvider,\n DependencySpec,\n ExistingProvideOptions,\n ExistingProvider,\n FactoryProvideOptions,\n FactoryProvider,\n InjectionToken,\n ProviderInput,\n ProviderRecord,\n ResolvedDeps,\n ValueProvideOptions,\n ValueProvider,\n} from \"./types.js\";\nimport { tokenName } from \"./token.js\";\n\nexport function provide<T>(\n token: InjectionToken<T>,\n options: ClassProvideOptions<T>,\n): ClassProvider<T>;\n\nexport function provide<T>(\n token: InjectionToken<T>,\n options: ValueProvideOptions<T>,\n): ValueProvider<T>;\n\nexport function provide<T, const TDeps extends readonly DependencySpec[]>(\n token: InjectionToken<T>,\n options: FactoryProvideOptions<T, TDeps>,\n): FactoryProvider<T, TDeps>;\n\nexport function provide<T>(\n token: InjectionToken<T>,\n options: ExistingProvideOptions<T>,\n): ExistingProvider<T>;\n\nexport function provide<T>(\n providerToken: InjectionToken<T>,\n options:\n | ClassProvideOptions<T>\n | ValueProvideOptions<T>\n | FactoryProvideOptions<T, readonly DependencySpec[]>\n | ExistingProvideOptions<T>,\n): ClassProvider<T> | ValueProvider<T> | FactoryProvider<T> | ExistingProvider<T> {\n return {\n provide: providerToken,\n ...options,\n };\n}\n\nexport function normalizeProvider(input: ProviderInput): ProviderRecord {\n if (typeof input === \"function\") {\n return normalizeProvider({\n provide: input,\n useClass: input,\n });\n }\n\n const token = input.provide;\n const base = {\n token,\n tokenName: tokenName(token),\n multi: input.multi ?? false,\n leakSafe: input.leakSafe ?? false,\n };\n\n if (\"useClass\" in input) {\n return {\n ...base,\n provider: {\n kind: \"class\",\n useClass: input.useClass,\n },\n scope: input.scope ?? \"singleton\",\n deps:\n input.deps ??\n (input.useClass as { readonly inject?: readonly DependencySpec[] }).inject ??\n [],\n eager: input.eager ?? false,\n ...eraseDispose(input.dispose),\n };\n }\n\n if (\"useValue\" in input) {\n return {\n ...base,\n provider: {\n kind: \"value\",\n useValue: input.useValue,\n },\n scope: \"singleton\",\n deps: [],\n eager: true,\n ...eraseDispose(input.dispose),\n };\n }\n\n if (\"useFactory\" in input) {\n return {\n ...base,\n provider: {\n kind: \"factory\",\n useFactory: input.useFactory as (...deps: readonly unknown[]) => unknown,\n },\n scope: input.scope ?? \"singleton\",\n deps: input.deps ?? [],\n eager: input.eager ?? false,\n ...eraseDispose(input.dispose),\n };\n }\n\n return {\n ...base,\n provider: {\n kind: \"existing\",\n useExisting: input.useExisting,\n },\n scope: \"singleton\",\n deps: [input.useExisting],\n eager: false,\n };\n}\n\nexport type { ResolvedDeps };\n\nfunction eraseDispose<T>(dispose: ((value: T) => void | Promise<void>) | undefined): {\n readonly dispose?: (value: unknown) => void | Promise<void>;\n} {\n if (dispose === undefined) {\n return {};\n }\n\n return {\n dispose: dispose as (value: unknown) => void | Promise<void>,\n };\n}\n","import {\n AmbiguousProviderError,\n AsyncProviderInSyncResolutionError,\n CircularDependencyError,\n DuplicateProviderError,\n FrozenContainerError,\n LifetimeLeakError,\n MissingProviderError,\n} from \"./errors.js\";\nimport { runWithInjectContext } from \"./inject.js\";\nimport { normalizeProvider } from \"./provider.js\";\nimport { tokenName } from \"./token.js\";\nimport type {\n BuildOptions,\n Constructor,\n Container,\n ContainerImpl,\n ContainerOptions,\n DependencySpec,\n DisposableInstance,\n InjectionToken,\n ProviderInput,\n ProviderRecord,\n ResolutionContext,\n Scope,\n ScopeOptions,\n} from \"./types.js\";\n\nconst asyncDisposeSymbol: symbol | undefined = Symbol.asyncDispose;\nconst disposeSymbol: symbol | undefined = Symbol.dispose;\n\nexport function createContainer(options: ContainerOptions = {}): Container {\n return new RuntimeContainer(options);\n}\n\nclass RuntimeContainer implements ContainerImpl {\n readonly parent: ContainerImpl | undefined;\n readonly strictScopes: boolean;\n readonly records = new Map<InjectionToken, ProviderRecord[]>();\n readonly scopedCache = new Map<ProviderRecord, unknown>();\n readonly created: DisposableInstance[] = [];\n readonly root: ContainerImpl;\n readonly singletonCache = new Map<ProviderRecord, unknown>();\n frozen = false;\n\n constructor(options: ContainerOptions = {}) {\n this.parent = options.parent as ContainerImpl | undefined;\n this.strictScopes = options.strictScopes ?? this.parent?.strictScopes ?? true;\n this.root = this.parent?.root ?? this;\n }\n\n get<T>(token: InjectionToken<T>): T;\n get<T>(token: InjectionToken<T>, options: { readonly optional: true }): T | undefined;\n get<T>(token: InjectionToken<T>, options?: { readonly optional: true }): T | undefined {\n const record =\n options?.optional === true\n ? this.getSingleRecord(token, true)\n : this.getSingleRecord(token, false);\n\n if (record === undefined) {\n return undefined;\n }\n\n const context = this.createResolutionContext(\"sync\");\n const value = this.resolveRecord(record, context);\n\n if (isPromiseLike(value)) {\n throw new AsyncProviderInSyncResolutionError(record.tokenName);\n }\n\n return value as T;\n }\n\n getAll<T>(token: InjectionToken<T>): T[] {\n const records = this.getAllRecords(token);\n const context = this.createResolutionContext(\"sync\");\n\n return records.map((record) => {\n const value = this.resolveRecord(record, context);\n\n if (isPromiseLike(value)) {\n throw new AsyncProviderInSyncResolutionError(record.tokenName);\n }\n\n return value as T;\n });\n }\n\n async getAsync<T>(token: InjectionToken<T>): Promise<T> {\n const record = this.getSingleRecord(token, false);\n const context = this.createResolutionContext(\"async\");\n return (await this.resolveRecord(record, context)) as T;\n }\n\n has(token: InjectionToken): boolean {\n return this.findRecords(token).length > 0;\n }\n\n provide(provider: ProviderInput): void {\n this.assertMutable();\n const record = normalizeProvider(provider);\n const existing = this.records.get(record.token) ?? [];\n\n if (!record.multi && existing.some((candidate) => !candidate.multi)) {\n throw new DuplicateProviderError(record.tokenName);\n }\n\n this.records.set(record.token, [...existing, record]);\n }\n\n override(provider: ProviderInput): void {\n this.assertMutable();\n const record = normalizeProvider(provider);\n const existing = this.records.get(record.token) ?? [];\n const kept = existing.filter((candidate) => candidate.multi && !record.multi);\n this.records.set(record.token, [...kept, record]);\n }\n\n createScope(options: ScopeOptions = {}): Container {\n return new RuntimeContainer({\n parent: this,\n strictScopes: options.strictScopes ?? this.strictScopes,\n });\n }\n\n build<T>(target: Constructor<T>, options: BuildOptions = {}): T {\n const deps =\n options.deps ?? (target as { readonly inject?: readonly DependencySpec[] }).inject ?? [];\n const context = this.createResolutionContext(\"sync\");\n const values = this.resolveDependencies(deps, context);\n\n if (isPromiseLike(values)) {\n throw new AsyncProviderInSyncResolutionError(target.name);\n }\n\n return Reflect.construct(target, values) as T;\n }\n\n async buildAsync<T>(target: Constructor<T>, options: BuildOptions = {}): Promise<T> {\n const deps =\n options.deps ?? (target as { readonly inject?: readonly DependencySpec[] }).inject ?? [];\n const context = this.createResolutionContext(\"async\");\n const values = await this.resolveDependencies(deps, context);\n return Reflect.construct(target, values) as T;\n }\n\n freeze(): void {\n this.frozen = true;\n }\n\n async dispose(): Promise<void> {\n const errors: unknown[] = [];\n\n for (const entry of [...this.created].toReversed()) {\n if (entry.disposed) {\n continue;\n }\n\n entry.disposed = true;\n\n try {\n // eslint-disable-next-line no-await-in-loop -- disposal order is observable and must remain sequential.\n await disposeValue(entry.value, entry.record);\n } catch (error) {\n errors.push(error);\n }\n }\n\n this.created.length = 0;\n this.scopedCache.clear();\n\n if (this.root === this) {\n this.singletonCache.clear();\n }\n\n if (errors.length > 0) {\n throw new AggregateError(errors, \"One or more providers failed to dispose.\");\n }\n }\n\n private assertMutable(): void {\n if (this.frozen) {\n throw new FrozenContainerError();\n }\n }\n\n private createResolutionContext(mode: \"sync\" | \"async\"): ResolutionContext {\n return {\n stack: [],\n resolutionCache: new Map(),\n mode,\n requestContainer: this,\n };\n }\n\n private getSingleRecord(token: InjectionToken, optional: false): ProviderRecord;\n private getSingleRecord(token: InjectionToken, optional: true): ProviderRecord | undefined;\n private getSingleRecord(token: InjectionToken, optional: boolean): ProviderRecord | undefined {\n const records = this.findRecords(token);\n\n if (records.length === 0) {\n if (optional) {\n return undefined;\n }\n\n throw new MissingProviderError(tokenName(token), []);\n }\n\n const nonMultiRecords = records.filter((record) => !record.multi);\n\n if (nonMultiRecords.length === 1) {\n return nonMultiRecords[0]!;\n }\n\n if (records.length === 1) {\n return records[0]!;\n }\n\n throw new AmbiguousProviderError(tokenName(token));\n }\n\n private getAllRecords(token: InjectionToken): ProviderRecord[] {\n return this.getAllRecordsFromHierarchy(token);\n }\n\n findRecords(token: InjectionToken): ProviderRecord[] {\n const localRecords = this.records.get(token);\n\n if (localRecords !== undefined && localRecords.length > 0) {\n return localRecords;\n }\n\n return this.parent?.findRecords(token) ?? [];\n }\n\n getAllRecordsFromHierarchy(token: InjectionToken): ProviderRecord[] {\n const parentRecords = this.parent?.getAllRecordsFromHierarchy(token) ?? [];\n const localRecords = this.records.get(token) ?? [];\n return [...parentRecords, ...localRecords];\n }\n\n private resolveRecord(\n record: ProviderRecord,\n context: ResolutionContext,\n ): unknown | Promise<unknown> {\n const cached = this.getCached(record, context);\n\n if (cached.found) {\n return cached.value;\n }\n\n this.assertNoCycle(record, context);\n this.assertLifetimeSafe(record, context);\n\n context.stack.push(record);\n\n const finalize = (value: unknown): unknown => {\n context.stack.pop();\n this.setCached(record, value, context);\n return value;\n };\n\n const fail = (error: unknown): never => {\n context.stack.pop();\n throw error;\n };\n\n try {\n const value = this.createValue(record, context);\n\n if (isPromiseLike(value)) {\n if (context.mode === \"sync\") {\n throw new AsyncProviderInSyncResolutionError(record.tokenName);\n }\n\n return Promise.resolve(value).then(finalize, fail);\n }\n\n return finalize(value);\n } catch (error) {\n return fail(error);\n }\n }\n\n private createValue(\n record: ProviderRecord,\n context: ResolutionContext,\n ): unknown | Promise<unknown> {\n switch (record.provider.kind) {\n case \"class\": {\n const provider = record.provider;\n const deps = this.resolveDependencies(record.deps, context);\n\n if (isPromiseLike(deps)) {\n return Promise.resolve(deps).then((values) =>\n Reflect.construct(provider.useClass, values),\n );\n }\n\n return Reflect.construct(provider.useClass, deps);\n }\n\n case \"value\":\n return record.provider.useValue;\n\n case \"factory\": {\n const provider = record.provider;\n const deps = this.resolveDependencies(record.deps, context);\n\n if (isPromiseLike(deps)) {\n return Promise.resolve(deps).then((values) =>\n runWithInjectContext(context, () => provider.useFactory(...values)),\n );\n }\n\n return runWithInjectContext(context, () => provider.useFactory(...deps));\n }\n\n case \"existing\":\n return this.resolveDependency(record.provider.useExisting, context);\n }\n }\n\n private resolveDependencies(\n deps: readonly DependencySpec[],\n context: ResolutionContext,\n ): unknown[] | Promise<unknown[]> {\n const values: unknown[] = Array.from({ length: deps.length });\n const asyncValues: Promise<unknown>[] = [];\n\n for (const [index, dep] of deps.entries()) {\n const value = this.resolveDependency(dep, context);\n\n if (isPromiseLike(value)) {\n asyncValues.push(\n Promise.resolve(value).then((resolved) => {\n values[index] = resolved;\n return resolved;\n }),\n );\n } else {\n values[index] = value;\n }\n }\n\n if (asyncValues.length === 0) {\n return values;\n }\n\n return Promise.all(asyncValues).then(() => values);\n }\n\n private resolveDependency(\n dep: DependencySpec,\n context: ResolutionContext,\n ): unknown | Promise<unknown> {\n if (isDependencyObject(dep)) {\n if (dep.many === true) {\n const records = this.getAllRecords(dep.token);\n return this.resolveAllRecords(records, context);\n }\n\n const record =\n dep.optional === true\n ? this.getSingleRecord(dep.token, true)\n : this.getRequiredRecord(dep.token, context);\n\n if (record === undefined) {\n return undefined;\n }\n\n return this.resolveRecord(record, context);\n }\n\n const record = this.getRequiredRecord(dep, context);\n return this.resolveRecord(record, context);\n }\n\n private getRequiredRecord(token: InjectionToken, context: ResolutionContext): ProviderRecord {\n const record = this.getSingleRecord(token, true);\n\n if (record === undefined) {\n throw new MissingProviderError(\n tokenName(token),\n context.stack.map((entry) => entry.tokenName),\n );\n }\n\n return record;\n }\n\n private resolveAllRecords(\n records: readonly ProviderRecord[],\n context: ResolutionContext,\n ): unknown[] | Promise<unknown[]> {\n const values = records.map((record) => this.resolveRecord(record, context));\n\n if (values.some(isPromiseLike)) {\n return Promise.all(values);\n }\n\n return values;\n }\n\n private getCached(\n record: ProviderRecord,\n context: ResolutionContext,\n ): { readonly found: boolean; readonly value?: unknown } {\n const cache = this.cacheFor(record, context);\n\n if (cache === undefined || !cache.has(record)) {\n return { found: false };\n }\n\n return { found: true, value: cache.get(record) };\n }\n\n private setCached<T>(record: ProviderRecord, value: T, context: ResolutionContext): void {\n const cache = this.cacheFor(record, context);\n\n if (cache === undefined) {\n this.trackCreated(record, value, context);\n return;\n }\n\n if (!cache.has(record)) {\n cache.set(record, value);\n this.trackCreated(record, value, context);\n }\n }\n\n private cacheFor(\n record: ProviderRecord,\n context: ResolutionContext,\n ): Map<ProviderRecord, unknown> | undefined {\n switch (record.scope) {\n case \"singleton\":\n return this.root.singletonCache;\n case \"scoped\":\n return context.requestContainer.scopedCache;\n case \"resolution\":\n return context.resolutionCache;\n case \"transient\":\n return undefined;\n }\n }\n\n private trackCreated<T>(record: ProviderRecord, value: T, context: ResolutionContext): void {\n if (value === null || (typeof value !== \"object\" && typeof value !== \"function\")) {\n return;\n }\n\n const owner = record.scope === \"singleton\" ? this.root : context.requestContainer;\n owner.created.push({ record, value, disposed: false });\n }\n\n private assertNoCycle(record: ProviderRecord, context: ResolutionContext): void {\n const existingIndex = context.stack.indexOf(record);\n\n if (existingIndex === -1) {\n return;\n }\n\n const cycle = [...context.stack.slice(existingIndex), record].map((entry) => entry.tokenName);\n throw new CircularDependencyError(cycle);\n }\n\n private assertLifetimeSafe(record: ProviderRecord, context: ResolutionContext): void {\n if (!this.strictScopes || record.leakSafe || context.stack.length === 0) {\n return;\n }\n\n const parent = context.stack.at(-1);\n\n if (parent === undefined) {\n return;\n }\n\n if (isLifetimeLeak(parent.scope, record.scope)) {\n throw new LifetimeLeakError(parent.tokenName, parent.scope, record.tokenName, record.scope);\n }\n }\n}\n\nfunction isDependencyObject(dep: DependencySpec): dep is {\n readonly token: InjectionToken;\n readonly optional?: boolean;\n readonly many?: boolean;\n} {\n return typeof dep === \"object\" && dep !== null && \"token\" in dep;\n}\n\nfunction isPromiseLike<T = unknown>(value: unknown): value is PromiseLike<T> {\n return (\n (typeof value === \"object\" || typeof value === \"function\") &&\n value !== null &&\n \"then\" in value &&\n typeof value.then === \"function\"\n );\n}\n\nfunction isLifetimeLeak(parentScope: Scope, childScope: Scope): boolean {\n if (parentScope === \"singleton\") {\n return childScope === \"scoped\" || childScope === \"resolution\" || childScope === \"transient\";\n }\n\n if (parentScope === \"scoped\") {\n return childScope === \"resolution\" || childScope === \"transient\";\n }\n\n return false;\n}\n\nasync function disposeValue(value: unknown, record: ProviderRecord): Promise<void> {\n if (record.dispose !== undefined) {\n await record.dispose(value);\n }\n\n if (value === null || (typeof value !== \"object\" && typeof value !== \"function\")) {\n return;\n }\n\n const maybeDisposable = value as Record<PropertyKey, unknown>;\n\n if (\n asyncDisposeSymbol !== undefined &&\n typeof maybeDisposable[asyncDisposeSymbol] === \"function\"\n ) {\n await (maybeDisposable[asyncDisposeSymbol] as () => Promise<void> | void)();\n return;\n }\n\n if (disposeSymbol !== undefined && typeof maybeDisposable[disposeSymbol] === \"function\") {\n (maybeDisposable[disposeSymbol] as () => void)();\n return;\n }\n\n if (typeof maybeDisposable.dispose === \"function\") {\n await (maybeDisposable.dispose as () => Promise<void> | void)();\n return;\n }\n\n if (typeof maybeDisposable.destroy === \"function\") {\n await (maybeDisposable.destroy as () => Promise<void> | void)();\n }\n}\n","import { CosystemError } from \"./errors.js\";\nimport type { ProviderInput } from \"./types.js\";\n\nexport interface LazyModule {\n readonly kind: \"lazyModule\";\n load(): LazyModuleLoadInput | Promise<LazyModuleLoadInput>;\n}\n\nexport interface LazyModuleExports {\n readonly default?: ProviderInput | readonly ProviderInput[];\n readonly providers?: readonly ProviderInput[];\n}\n\nexport type LazyModuleLoadInput = ProviderInput | readonly ProviderInput[] | LazyModuleExports;\n\nexport type AppProviderInput = ProviderInput | LazyModule;\n\nexport function lazyModule(\n load: () => LazyModuleLoadInput | Promise<LazyModuleLoadInput>,\n): LazyModule {\n return {\n kind: \"lazyModule\",\n load,\n };\n}\n\nexport function isLazyModule(input: AppProviderInput): input is LazyModule {\n return (\n typeof input === \"object\" &&\n input !== null &&\n \"kind\" in input &&\n input.kind === \"lazyModule\" &&\n \"load\" in input &&\n typeof input.load === \"function\"\n );\n}\n\nexport function normalizeLazyModuleProviders(input: LazyModuleLoadInput): readonly ProviderInput[] {\n if (isProviderInput(input)) {\n return [input];\n }\n\n if (Array.isArray(input)) {\n assertProviderArray(input);\n return input;\n }\n\n if (typeof input === \"object\" && input !== null) {\n const exports = input as LazyModuleExports;\n const providers: ProviderInput[] = [];\n\n if (exports.providers !== undefined) {\n assertProviderArray(exports.providers);\n providers.push(...exports.providers);\n }\n\n if (exports.default !== undefined) {\n if (Array.isArray(exports.default)) {\n assertProviderArray(exports.default);\n providers.push(...exports.default);\n } else if (isProviderInput(exports.default)) {\n providers.push(exports.default);\n } else {\n throw new CosystemError(\"Lazy module default export must be a provider or provider array.\");\n }\n }\n\n if (providers.length > 0) {\n return providers;\n }\n }\n\n throw new CosystemError(\n \"Lazy module loader must return a provider, provider array, or module exports with providers/default.\",\n );\n}\n\nfunction assertProviderArray(\n values: readonly unknown[],\n): asserts values is readonly ProviderInput[] {\n if (values.every(isProviderInput)) {\n return;\n }\n\n throw new CosystemError(\"Lazy module provider arrays may only contain provider entries.\");\n}\n\nfunction isProviderInput(value: unknown): value is ProviderInput {\n if (typeof value === \"function\") {\n return true;\n }\n\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"provide\" in value &&\n (\"useClass\" in value || \"useValue\" in value || \"useFactory\" in value || \"useExisting\" in value)\n );\n}\n","import type { Constructor, DependencySpec, Scope } from \"./types.js\";\n\nexport interface ModuleOptions {\n readonly name?: string;\n readonly deps?: readonly DependencySpec[];\n readonly scope?: Scope;\n}\n\nexport interface DefineModuleOptions extends ModuleOptions {\n readonly state?: readonly PropertyKey[];\n readonly actions?: readonly PropertyKey[];\n readonly computed?: readonly PropertyKey[];\n readonly effects?: readonly PropertyKey[];\n}\n\nexport interface ModuleMetadata {\n readonly kind: \"module\";\n name?: string;\n deps?: readonly DependencySpec[];\n scope?: Scope;\n readonly state: Set<PropertyKey>;\n readonly actions: Set<PropertyKey>;\n readonly computed: Set<PropertyKey>;\n readonly effects: Set<PropertyKey>;\n}\n\nconst moduleMetadata = new WeakMap<Function, ModuleMetadata>();\nconst moduleMetadataKey = Symbol.for(\"@cosystem/core/moduleMetadata\");\nconst symbolMetadataKey: symbol | undefined = (\n Symbol as SymbolConstructor & { readonly metadata?: symbol }\n).metadata;\n\nexport interface MetadataContext {\n readonly metadata?: Record<PropertyKey, unknown> | undefined;\n}\n\nexport function defineModule<T extends Constructor>(\n target: T,\n options: DefineModuleOptions = {},\n context?: MetadataContext,\n): T {\n const metadata = ensureModuleMetadata(target);\n mergeModuleMetadata(metadata, readContextMetadata(context));\n applyModuleOptions(metadata, options);\n addProperties(metadata.state, options.state);\n addProperties(metadata.actions, options.actions);\n addProperties(metadata.computed, options.computed);\n addProperties(metadata.effects, options.effects);\n writeContextMetadata(context, metadata);\n return target;\n}\n\nexport function getModuleMetadata(target: Function): ModuleMetadata | undefined {\n const existing = moduleMetadata.get(target);\n\n if (existing !== undefined) {\n return existing;\n }\n\n const metadata = readSymbolMetadata(target);\n\n if (metadata === undefined) {\n return undefined;\n }\n\n moduleMetadata.set(target, metadata);\n return metadata;\n}\n\nexport function addModuleState(target: Function, property: PropertyKey): void {\n ensureModuleMetadata(target).state.add(property);\n}\n\nexport function addModuleAction(target: Function, property: PropertyKey): void {\n ensureModuleMetadata(target).actions.add(property);\n}\n\nexport function addModuleComputed(target: Function, property: PropertyKey): void {\n ensureModuleMetadata(target).computed.add(property);\n}\n\nexport function addModuleEffect(target: Function, property: PropertyKey): void {\n ensureModuleMetadata(target).effects.add(property);\n}\n\nexport function applyModuleOptions(metadata: ModuleMetadata, options: ModuleOptions): void {\n if (options.name !== undefined) {\n metadata.name = options.name;\n }\n\n if (options.deps !== undefined) {\n metadata.deps = options.deps;\n }\n\n if (options.scope !== undefined) {\n metadata.scope = options.scope;\n }\n}\n\nexport function ensureModuleMetadata(target: Function): ModuleMetadata {\n let metadata = moduleMetadata.get(target);\n\n if (metadata !== undefined) {\n return metadata;\n }\n\n metadata = {\n kind: \"module\",\n state: new Set(),\n actions: new Set(),\n computed: new Set(),\n effects: new Set(),\n };\n moduleMetadata.set(target, metadata);\n return metadata;\n}\n\nexport function ensureContextModuleMetadata(\n context: MetadataContext | undefined,\n): ModuleMetadata | undefined {\n if (context?.metadata === undefined) {\n return undefined;\n }\n\n const existing = readContextMetadata(context);\n\n if (existing !== undefined) {\n return existing;\n }\n\n const metadata = createModuleMetadata();\n writeContextMetadata(context, metadata);\n return metadata;\n}\n\nfunction addProperties(target: Set<PropertyKey>, properties: readonly PropertyKey[] | undefined) {\n for (const property of properties ?? []) {\n target.add(property);\n }\n}\n\nfunction createModuleMetadata(): ModuleMetadata {\n return {\n kind: \"module\",\n state: new Set(),\n actions: new Set(),\n computed: new Set(),\n effects: new Set(),\n };\n}\n\nfunction readContextMetadata(context: MetadataContext | undefined): ModuleMetadata | undefined {\n const value = context?.metadata?.[moduleMetadataKey];\n return isModuleMetadata(value) ? value : undefined;\n}\n\nfunction writeContextMetadata(\n context: MetadataContext | undefined,\n metadata: ModuleMetadata,\n): void {\n if (context?.metadata === undefined) {\n return;\n }\n\n context.metadata[moduleMetadataKey] = metadata;\n}\n\nfunction readSymbolMetadata(target: Function): ModuleMetadata | undefined {\n if (symbolMetadataKey === undefined) {\n return undefined;\n }\n\n const metadata = (target as unknown as Record<PropertyKey, unknown>)[symbolMetadataKey];\n\n if (metadata === undefined || metadata === null || typeof metadata !== \"object\") {\n return undefined;\n }\n\n const value = (metadata as Record<PropertyKey, unknown>)[moduleMetadataKey];\n return isModuleMetadata(value) ? value : undefined;\n}\n\nfunction mergeModuleMetadata(target: ModuleMetadata, source: ModuleMetadata | undefined): void {\n if (source === undefined || source === target) {\n return;\n }\n\n applyModuleOptions(target, source);\n addProperties(target.state, [...source.state]);\n addProperties(target.actions, [...source.actions]);\n addProperties(target.computed, [...source.computed]);\n addProperties(target.effects, [...source.effects]);\n}\n\nfunction isModuleMetadata(value: unknown): value is ModuleMetadata {\n return (\n typeof value === \"object\" &&\n value !== null &&\n (value as ModuleMetadata).kind === \"module\" &&\n value instanceof Object &&\n (value as ModuleMetadata).state instanceof Set &&\n (value as ModuleMetadata).actions instanceof Set &&\n (value as ModuleMetadata).computed instanceof Set &&\n (value as ModuleMetadata).effects instanceof Set\n );\n}\n","import {\n computed as createCoactionComputed,\n create as createCoactionStore,\n createReactiveTracker,\n type Store,\n} from \"coaction\";\n\nimport { createContainer } from \"./container.js\";\nimport { CosystemError, DuplicateProviderError } from \"./errors.js\";\nimport { runWithInjectContext } from \"./inject.js\";\nimport {\n isLazyModule,\n normalizeLazyModuleProviders,\n type AppProviderInput,\n type LazyModule,\n} from \"./lazyModule.js\";\nimport { getModuleMetadata, type ModuleMetadata } from \"./metadata.js\";\nimport { provide } from \"./provider.js\";\nimport { tokenName } from \"./token.js\";\nimport type {\n ClassProvideOptions,\n Constructor,\n Container,\n ContainerImpl,\n InjectionToken,\n Provider,\n ProviderInput,\n ResolutionContext,\n ScopeOptions,\n} from \"./types.js\";\n\nexport interface EngineOptions {\n readonly patches?: boolean;\n readonly transport?: unknown;\n}\n\nexport interface AppDevOptions {\n readonly strictActions?: boolean;\n}\n\nexport interface CreateAppOptions {\n readonly providers?: readonly AppProviderInput[];\n readonly plugins?: readonly Plugin[];\n readonly parent?: App | Container;\n readonly devOptions?: AppDevOptions;\n readonly engine?: EngineOptions;\n}\n\nexport interface InternalCreateAppOptions extends CreateAppOptions {\n readonly overrides?: readonly ProviderInput[];\n readonly testInspector?: MutableTestInspector;\n}\n\nexport interface AppState {\n readonly version: number;\n}\n\nexport interface AppScope {\n readonly container: Container;\n}\n\nexport interface App {\n readonly state: AppState;\n readonly started: boolean;\n readonly store: Store<RootState>;\n\n get<T>(token: InjectionToken<T>): T;\n getAsync<T>(token: InjectionToken<T>): Promise<T>;\n getAll<T>(token: InjectionToken<T>): T[];\n getModule<T>(token: InjectionToken<T>): T;\n getModuleByName<T = unknown>(name: string): T;\n watch<T>(\n read: () => T,\n listener: (value: T, previous: T) => void,\n options?: WatchOptions<T>,\n ): () => void;\n runInAction<T>(module: RunInActionTarget, callback: () => T, options?: RunInActionOptions): T;\n start(): Promise<void>;\n stop(): Promise<void>;\n dispose(): Promise<void>;\n createScope(options?: ScopeOptions): AppScope;\n load(module: LazyModule): Promise<LazyModuleLoadResult>;\n load(): Promise<readonly LazyModuleLoadResult[]>;\n}\n\nexport interface WatchOptions<T> {\n readonly equals?: (value: T, previous: T) => boolean;\n readonly immediate?: boolean;\n}\n\nexport type RunInActionTarget<T extends object = object> = InjectionToken<T> | T;\n\nexport interface RunInActionOptions {\n readonly name?: string;\n readonly args?: readonly unknown[];\n}\n\nexport interface Plugin {\n readonly name?: string;\n setup?(app: App): void | Promise<void>;\n onModuleCreated?(event: ModuleCreatedEvent): void;\n onActionStart?(event: ActionEvent): void;\n onActionEnd?(event: ActionEvent): void;\n onPatch?(event: PatchEvent): void;\n onStateChange?(event: StateChangeEvent): void;\n onError?(error: unknown, context: ErrorContext): void;\n dispose?(): void | Promise<void>;\n}\n\nexport interface ModuleCreatedEvent {\n readonly name: string;\n readonly token: InjectionToken;\n readonly instance: unknown;\n}\n\nexport interface LazyModuleLoadResult {\n readonly scope: AppScope;\n readonly modules: readonly ModuleCreatedEvent[];\n}\n\nexport interface ActionEvent {\n readonly module: string;\n readonly method: string;\n readonly args: readonly unknown[];\n readonly startedAt: number;\n readonly endedAt?: number;\n readonly error?: unknown;\n}\n\nexport interface StateChangeEvent {\n readonly state: unknown;\n}\n\nexport interface PatchEvent {\n readonly patches: readonly unknown[];\n readonly inversePatches: readonly unknown[];\n}\n\nexport interface ErrorContext {\n readonly phase: string;\n}\n\nexport interface TestAppInspector {\n getActions(): readonly ActionEvent[];\n getState(): unknown;\n getPatches(): readonly unknown[];\n clearActions(): void;\n clearPatches(): void;\n flushEffects(): Promise<void>;\n}\n\nexport interface MutableTestInspector extends TestAppInspector {\n recordAction(event: ActionEvent): void;\n recordPatch(patch: unknown): void;\n recordState(state: unknown): void;\n setFlushEffects(callback: () => Promise<void>): void;\n}\n\ntype RootState = Record<string, Record<PropertyKey, unknown>>;\ntype StoreSetState = Store<RootState>[\"setState\"];\n\ninterface CoactionStoreOptions {\n readonly name: string;\n readonly sliceMode: \"single\";\n readonly enablePatches?: boolean;\n readonly transport?: unknown;\n}\n\ninterface ModuleBinding {\n readonly name: string;\n readonly token: InjectionToken;\n readonly instance: Record<PropertyKey, unknown>;\n readonly metadata: ModuleMetadata;\n readonly originalActions: Map<PropertyKey, (...args: unknown[]) => unknown>;\n readonly originalComputed: Map<PropertyKey, () => unknown>;\n readonly computedAccessors: Map<PropertyKey, () => unknown>;\n readonly reactiveSlice: boolean;\n activeDraft: Record<PropertyKey, unknown> | undefined;\n actionDepth: number;\n}\n\ninterface RuntimeModuleMetadata {\n readonly app: App;\n readonly name: string;\n readonly token: InjectionToken;\n}\n\ninterface LifecycleModule {\n onInit?(): void | Promise<void>;\n onStart?(): void | Promise<void>;\n onStop?(): void | Promise<void>;\n onDispose?(): void | Promise<void>;\n}\n\nconst runtimeModuleMetadataKey = Symbol.for(\"@cosystem/core/runtimeModule\");\nconst appContainerMap = new WeakMap<App, Container>();\n\nexport function createApp(options: CreateAppOptions = {}): App {\n return createAppInternal(options);\n}\n\nexport function runInAction<T>(module: object, callback: () => T, options?: RunInActionOptions): T {\n const metadata = getRuntimeModuleMetadata(module);\n\n if (metadata === undefined) {\n throw new CosystemError(\"runInAction() target is not a CoSystem module instance.\");\n }\n\n return metadata.app.runInAction(module, callback, options);\n}\n\nexport function createAppInternal(options: InternalCreateAppOptions = {}): App {\n const parent = isApp(options.parent) ? getAppContainer(options.parent) : options.parent;\n const container = parent === undefined ? createContainer() : createContainer({ parent });\n const moduleTokens: InjectionToken[] = [];\n const lazyModules: LazyModule[] = [];\n\n for (const provider of options.providers ?? []) {\n if (isLazyModule(provider)) {\n lazyModules.push(provider);\n continue;\n }\n\n const normalized = normalizeAppProvider(provider);\n container.provide(normalized.provider);\n\n if (normalized.moduleToken !== undefined) {\n moduleTokens.push(normalized.moduleToken);\n }\n }\n\n for (const override of options.overrides ?? []) {\n const normalized = normalizeAppProvider(override);\n\n if (\n normalized.moduleToken !== undefined &&\n !moduleTokens.some((moduleToken) => moduleToken === normalized.moduleToken)\n ) {\n throw new CosystemError(\n `Cannot add ${tokenName(normalized.moduleToken)} as a new CoSystem module through overrides.`,\n );\n }\n\n container.override(normalized.provider);\n }\n\n container.freeze();\n\n const modules = instantiateModules(container, moduleTokens);\n const rootState = createRootState(modules);\n const store = createCoactionStore(\n rootState,\n createStoreOptions(options.engine, shouldEnablePatches(options)) as never,\n );\n const state: { version: number } = { version: 0 };\n const app = new RuntimeApp({\n container,\n devOptions: options.devOptions ?? {},\n lazyModules,\n modules,\n plugins: options.plugins ?? [],\n state,\n store,\n ...(options.testInspector === undefined ? {} : { testInspector: options.testInspector }),\n });\n\n app.bindModules();\n app.attachRuntimeMetadata();\n instantiateEagerProviders(container);\n app.runModuleCreatedHooks();\n app.init();\n appContainerMap.set(app, container);\n\n return app;\n}\n\nclass RuntimeApp implements App {\n readonly state: AppState;\n readonly store: Store<RootState>;\n\n readonly #container: Container;\n private readonly devOptions: AppDevOptions;\n private readonly modules: ModuleBinding[];\n private readonly pendingLazyModules: LazyModule[];\n private readonly moduleByToken = new Map<InjectionToken, ModuleBinding>();\n private readonly moduleByName = new Map<string, ModuleBinding>();\n private readonly plugins: readonly Plugin[];\n private readonly testInspector: MutableTestInspector | undefined;\n private readonly effectDisposers: (() => void)[] = [];\n private readonly pendingEffects = new Set<Promise<void>>();\n private readonly loadedLazyModules = new WeakMap<LazyModule, LazyModuleLoadResult>();\n private readonly dynamicScopes: Container[] = [];\n private initPromise: Promise<void> = Promise.resolve();\n private isStarted = false;\n private isDisposed = false;\n\n constructor(options: {\n readonly container: Container;\n readonly devOptions: AppDevOptions;\n readonly lazyModules: readonly LazyModule[];\n readonly modules: ModuleBinding[];\n readonly plugins: readonly Plugin[];\n readonly state: AppState;\n readonly store: Store<RootState>;\n readonly testInspector?: MutableTestInspector;\n }) {\n this.#container = options.container;\n this.devOptions = options.devOptions;\n this.pendingLazyModules = [...options.lazyModules];\n this.modules = options.modules;\n this.plugins = options.plugins;\n this.state = options.state;\n this.store = options.store;\n this.testInspector = options.testInspector;\n\n for (const moduleBinding of options.modules) {\n this.moduleByToken.set(moduleBinding.token, moduleBinding);\n this.moduleByName.set(moduleBinding.name, moduleBinding);\n }\n\n this.wrapStoreSetState();\n\n this.store.subscribe(() => {\n (this.state as { version: number }).version += 1;\n const state = this.store.getPureState();\n this.testInspector?.recordState(state);\n this.emitStateChange({ state });\n });\n\n this.testInspector?.setFlushEffects(() => this.flushEffects());\n }\n\n get started(): boolean {\n return this.isStarted;\n }\n\n get<T>(token: InjectionToken<T>): T {\n const moduleBinding = this.moduleByToken.get(token);\n\n if (moduleBinding !== undefined) {\n return moduleBinding.instance as T;\n }\n\n return this.#container.get(token);\n }\n\n getAsync<T>(token: InjectionToken<T>): Promise<T> {\n const moduleBinding = this.moduleByToken.get(token);\n\n if (moduleBinding !== undefined) {\n return Promise.resolve(moduleBinding.instance as T);\n }\n\n return this.#container.getAsync(token);\n }\n\n getAll<T>(token: InjectionToken<T>): T[] {\n return this.#container.getAll(token);\n }\n\n getModule<T>(token: InjectionToken<T>): T {\n const moduleBinding = this.moduleByToken.get(token);\n\n if (moduleBinding === undefined) {\n throw new CosystemError(`${tokenName(token)} is not a CoSystem module.`);\n }\n\n return moduleBinding.instance as T;\n }\n\n getModuleByName<T = unknown>(name: string): T {\n const moduleBinding = this.moduleByName.get(name);\n\n if (moduleBinding === undefined) {\n throw new CosystemError(`${name} is not a CoSystem module.`);\n }\n\n return moduleBinding.instance as T;\n }\n\n watch<T>(\n read: () => T,\n listener: (value: T, previous: T) => void,\n options: WatchOptions<T> = {},\n ): () => void {\n const equals = options.equals ?? Object.is;\n const tracker = createReactiveTracker();\n let previous = tracker.track(read);\n\n if (options.immediate === true) {\n listener(previous, previous);\n }\n\n const publish = () => {\n const next = tracker.track(read);\n\n if (equals(next, previous)) {\n return;\n }\n\n const last = previous;\n previous = next;\n listener(next, last);\n };\n\n const unsubscribeStore = this.store.subscribe(publish);\n const unsubscribeTracker = tracker.subscribe(publish);\n\n return () => {\n unsubscribeStore();\n unsubscribeTracker();\n tracker.dispose();\n };\n }\n\n runInAction<T>(\n module: RunInActionTarget,\n callback: () => T,\n options: RunInActionOptions = {},\n ): T {\n const moduleBinding = this.resolveModuleBinding(module);\n\n return this.runActionCallback(\n moduleBinding,\n options.name ?? \"runInAction\",\n options.args ?? [],\n callback,\n ) as T;\n }\n\n async start(): Promise<void> {\n if (this.isStarted) {\n return;\n }\n\n await this.initPromise;\n\n try {\n await this.runLifecycle(\"onStart\");\n this.isStarted = true;\n } catch (error) {\n this.emitError(error, { phase: \"start\" });\n throw error;\n }\n }\n\n async stop(): Promise<void> {\n if (!this.isStarted) {\n return;\n }\n\n try {\n await this.runLifecycle(\"onStop\", true);\n this.isStarted = false;\n } catch (error) {\n this.emitError(error, { phase: \"stop\" });\n throw error;\n }\n }\n\n async dispose(): Promise<void> {\n if (this.isDisposed) {\n return;\n }\n\n await this.stop();\n\n try {\n this.stopEffects();\n await this.waitForPendingEffects();\n await this.runLifecycle(\"onDispose\", true);\n for (const scope of this.dynamicScopes.toReversed()) {\n // eslint-disable-next-line no-await-in-loop -- dynamic scopes are disposed in reverse load order.\n await scope.dispose();\n }\n await Promise.all(this.plugins.map((plugin) => plugin.dispose?.()));\n await this.#container.dispose();\n this.store.destroy();\n this.isDisposed = true;\n } catch (error) {\n this.emitError(error, { phase: \"dispose\" });\n throw error;\n }\n }\n\n createScope(options?: ScopeOptions): AppScope {\n return {\n container: this.#container.createScope(options),\n };\n }\n\n async load(module: LazyModule): Promise<LazyModuleLoadResult>;\n async load(): Promise<readonly LazyModuleLoadResult[]>;\n async load(module?: LazyModule): Promise<LazyModuleLoadResult | readonly LazyModuleLoadResult[]> {\n if (module === undefined) {\n const modules = this.pendingLazyModules.splice(0);\n const results: LazyModuleLoadResult[] = [];\n\n for (const pendingModule of modules) {\n // eslint-disable-next-line no-await-in-loop -- pending lazy modules load in registration order.\n results.push(await this.load(pendingModule));\n }\n\n return results;\n }\n\n const existing = this.loadedLazyModules.get(module);\n\n if (existing !== undefined) {\n return existing;\n }\n\n if (this.isDisposed) {\n throw new CosystemError(\"Cannot load a lazy module after app disposal.\");\n }\n\n await this.initPromise;\n\n try {\n const providers = normalizeLazyModuleProviders(await module.load());\n const scopeContainer = this.#container.createScope();\n const moduleTokens: InjectionToken[] = [];\n\n for (const provider of providers) {\n const normalized = normalizeAppProvider(provider);\n scopeContainer.provide(normalized.provider);\n\n if (normalized.moduleToken !== undefined) {\n moduleTokens.push(normalized.moduleToken);\n }\n }\n\n scopeContainer.freeze();\n\n const loadedModules = instantiateModules(scopeContainer, moduleTokens, false);\n this.assertNewModules(loadedModules);\n this.installModuleState(loadedModules);\n this.registerModules(loadedModules);\n this.bindModules(loadedModules);\n this.attachRuntimeMetadata(loadedModules);\n instantiateEagerProviders(scopeContainer);\n this.dynamicScopes.push(scopeContainer);\n this.runModuleCreatedHooks(loadedModules);\n await this.runLifecycle(\"onInit\", false, loadedModules);\n this.startEffects(loadedModules);\n\n if (this.isStarted) {\n await this.runLifecycle(\"onStart\", false, loadedModules);\n }\n\n const result: LazyModuleLoadResult = {\n modules: loadedModules.map(toModuleCreatedEvent),\n scope: {\n container: scopeContainer,\n },\n };\n\n this.loadedLazyModules.set(module, result);\n return result;\n } catch (error) {\n this.emitError(error, { phase: \"load\" });\n throw error;\n }\n }\n\n bindModules(modules: readonly ModuleBinding[] = this.modules): void {\n for (const moduleBinding of modules) {\n this.bindState(moduleBinding);\n this.bindComputed(moduleBinding);\n this.bindActions(moduleBinding);\n }\n }\n\n attachRuntimeMetadata(modules: readonly ModuleBinding[] = this.modules): void {\n for (const moduleBinding of modules) {\n Object.defineProperty(moduleBinding.instance, runtimeModuleMetadataKey, {\n configurable: false,\n enumerable: false,\n value: {\n app: this,\n name: moduleBinding.name,\n token: moduleBinding.token,\n } satisfies RuntimeModuleMetadata,\n });\n }\n }\n\n runModuleCreatedHooks(modules: readonly ModuleBinding[] = this.modules): void {\n for (const moduleBinding of modules) {\n const event = toModuleCreatedEvent(moduleBinding);\n\n for (const plugin of this.plugins) {\n plugin.onModuleCreated?.(event);\n }\n }\n }\n\n init(): void {\n this.initPromise = (async () => {\n try {\n await Promise.all(\n this.plugins.map((plugin) => this.runWithAppInjectContext(() => plugin.setup?.(this))),\n );\n await this.runLifecycle(\"onInit\");\n this.startEffects();\n } catch (error) {\n this.emitError(error, { phase: \"init\" });\n throw error;\n }\n })();\n }\n\n private bindState(moduleBinding: ModuleBinding): void {\n for (const property of moduleBinding.metadata.state) {\n Object.defineProperty(moduleBinding.instance, property, {\n configurable: true,\n enumerable: true,\n get: () => this.readModuleState(moduleBinding, property),\n set: (value: unknown) => this.writeModuleState(moduleBinding, property, value),\n });\n }\n }\n\n private bindActions(moduleBinding: ModuleBinding): void {\n for (const property of moduleBinding.metadata.actions) {\n const action = getMethod(moduleBinding.instance, property);\n moduleBinding.originalActions.set(property, action);\n\n Object.defineProperty(moduleBinding.instance, property, {\n configurable: true,\n value: (...args: unknown[]) => this.runAction(moduleBinding, property, args),\n });\n }\n }\n\n private bindComputed(moduleBinding: ModuleBinding): void {\n for (const property of moduleBinding.metadata.computed) {\n const getter = getGetter(moduleBinding.instance, property);\n const accessor = createCoactionComputed(() => getter.call(moduleBinding.instance));\n moduleBinding.originalComputed.set(property, getter);\n moduleBinding.computedAccessors.set(property, accessor);\n\n Object.defineProperty(moduleBinding.instance, property, {\n configurable: true,\n enumerable: true,\n get: () => {\n if (moduleBinding.activeDraft !== undefined || !moduleBinding.reactiveSlice) {\n return getter.call(moduleBinding.instance);\n }\n\n return accessor();\n },\n });\n }\n }\n\n private readModuleState(moduleBinding: ModuleBinding, property: PropertyKey): unknown {\n if (!moduleBinding.reactiveSlice) {\n return this.store.getPureState()[moduleBinding.name]?.[property];\n }\n\n return this.store.getState()[moduleBinding.name]?.[property];\n }\n\n private writeModuleState(\n moduleBinding: ModuleBinding,\n property: PropertyKey,\n value: unknown,\n ): void {\n if (moduleBinding.activeDraft !== undefined) {\n moduleBinding.activeDraft[property] = value;\n return;\n }\n\n if (this.devOptions.strictActions === true && moduleBinding.actionDepth === 0) {\n throw new CosystemError(\n `Cannot write ${moduleBinding.name}.${String(property)} outside an action.`,\n );\n }\n\n if (!moduleBinding.reactiveSlice) {\n const state = this.store.getPureState();\n const slice = state[moduleBinding.name] ?? {};\n\n this.store.setState({\n ...state,\n [moduleBinding.name]: {\n ...slice,\n [property]: value,\n },\n });\n return;\n }\n\n this.store.setState((draft) => {\n draft[moduleBinding.name] ??= {};\n draft[moduleBinding.name]![property] = value;\n });\n }\n\n private runAction(\n moduleBinding: ModuleBinding,\n property: PropertyKey,\n args: readonly unknown[],\n ): unknown {\n const action = moduleBinding.originalActions.get(property);\n\n if (action === undefined) {\n throw new CosystemError(`${moduleBinding.name}.${String(property)} is not an action.`);\n }\n\n return this.runActionCallback(moduleBinding, property, args, () =>\n action.apply(moduleBinding.instance, [...args]),\n );\n }\n\n private runActionCallback(\n moduleBinding: ModuleBinding,\n property: PropertyKey,\n args: readonly unknown[],\n callback: () => unknown,\n ): unknown {\n const event: ActionEvent = {\n args,\n method: String(property),\n module: moduleBinding.name,\n startedAt: Date.now(),\n };\n this.emitActionStart(event);\n\n let result: unknown;\n let error: unknown;\n\n try {\n moduleBinding.actionDepth += 1;\n if (moduleBinding.reactiveSlice) {\n this.store.setState((draft) => {\n const previousDraft = moduleBinding.activeDraft;\n moduleBinding.activeDraft = draft[moduleBinding.name] ?? {};\n draft[moduleBinding.name] = moduleBinding.activeDraft;\n\n try {\n result = callback();\n } finally {\n moduleBinding.activeDraft = previousDraft;\n }\n });\n } else {\n const state = this.store.getPureState();\n const slice = state[moduleBinding.name];\n const previousDraft = moduleBinding.activeDraft;\n moduleBinding.activeDraft = slice === undefined ? {} : { ...slice };\n\n try {\n result = callback();\n this.store.setState({\n ...state,\n [moduleBinding.name]: moduleBinding.activeDraft,\n });\n } finally {\n moduleBinding.activeDraft = previousDraft;\n }\n }\n } catch (caught) {\n error = caught;\n this.emitError(caught, { phase: \"action\" });\n } finally {\n moduleBinding.actionDepth -= 1;\n }\n\n if (error !== undefined) {\n this.finishAction(event, error);\n throw error;\n }\n\n if (isPromiseLike(result)) {\n return Promise.resolve(result).then(\n (value) => {\n this.finishAction(event);\n return value;\n },\n (caught) => {\n this.emitError(caught, { phase: \"action\" });\n this.finishAction(event, caught);\n throw caught;\n },\n );\n }\n\n this.finishAction(event);\n\n return result;\n }\n\n private resolveModuleBinding(target: RunInActionTarget): ModuleBinding {\n if (typeof target === \"object\" && target !== null) {\n const metadata = getRuntimeModuleMetadata(target);\n\n if (metadata !== undefined) {\n if (metadata.app !== this) {\n throw new CosystemError(\"runInAction() target belongs to another CoSystem app.\");\n }\n\n const moduleBinding = this.moduleByToken.get(metadata.token);\n\n if (moduleBinding !== undefined) {\n return moduleBinding;\n }\n }\n\n if (isTokenObject(target)) {\n const moduleBinding = this.moduleByToken.get(target);\n\n if (moduleBinding !== undefined) {\n return moduleBinding;\n }\n }\n\n throw new CosystemError(\"runInAction() target is not a CoSystem module.\");\n }\n\n if (typeof target === \"string\") {\n const moduleBinding = this.moduleByName.get(target) ?? this.moduleByToken.get(target);\n\n if (moduleBinding !== undefined) {\n return moduleBinding;\n }\n\n throw new CosystemError(`${target} is not a CoSystem module.`);\n }\n\n const moduleBinding = this.moduleByToken.get(target);\n\n if (moduleBinding !== undefined) {\n return moduleBinding;\n }\n\n throw new CosystemError(`${tokenName(target)} is not a CoSystem module.`);\n }\n\n private finishAction(event: ActionEvent, error?: unknown): void {\n const endedEvent: ActionEvent = {\n ...event,\n endedAt: Date.now(),\n ...(error === undefined ? {} : { error }),\n };\n this.testInspector?.recordAction(endedEvent);\n this.emitActionEnd(endedEvent);\n }\n\n private async runLifecycle(\n method: keyof LifecycleModule,\n reverse = false,\n modules: readonly ModuleBinding[] = this.modules,\n ): Promise<void> {\n const orderedModules = reverse ? modules.toReversed() : modules;\n\n for (const moduleBinding of orderedModules) {\n const lifecycle = moduleBinding.instance as LifecycleModule;\n // eslint-disable-next-line no-await-in-loop -- lifecycle hooks run in deterministic module order.\n await this.runWithAppInjectContext(() => lifecycle[method]?.());\n }\n }\n\n private startEffects(modules: readonly ModuleBinding[] = this.modules): void {\n for (const moduleBinding of modules) {\n for (const property of moduleBinding.metadata.effects) {\n this.startEffect(moduleBinding, property);\n }\n }\n }\n\n private startEffect(moduleBinding: ModuleBinding, property: PropertyKey): void {\n const method = getMethod(moduleBinding.instance, property);\n const tracker = createReactiveTracker();\n let disposed = false;\n\n const run = () => {\n if (disposed) {\n return;\n }\n\n try {\n tracker.track(() => this.runEffect(moduleBinding, property, method));\n } catch (error) {\n this.emitError(error, { phase: \"effect\" });\n throw error;\n }\n };\n\n const unsubscribe = tracker.subscribe(() => {\n try {\n run();\n } catch {\n // The error has already been emitted through plugin hooks.\n }\n });\n\n run();\n\n this.effectDisposers.push(() => {\n disposed = true;\n unsubscribe();\n tracker.dispose();\n });\n }\n\n private runEffect(\n moduleBinding: ModuleBinding,\n property: PropertyKey,\n method: (...args: unknown[]) => unknown,\n ): void {\n const result = this.runWithAppInjectContext(() => method.call(moduleBinding.instance));\n\n if (!isPromiseLike(result)) {\n return;\n }\n\n const pending = Promise.resolve(result)\n .then(() => undefined)\n .catch((error) => {\n this.emitError(error, {\n phase: `effect:${moduleBinding.name}.${String(property)}`,\n });\n throw error;\n })\n .finally(() => {\n this.pendingEffects.delete(pending);\n });\n\n this.pendingEffects.add(pending);\n pending.catch(() => undefined);\n }\n\n private stopEffects(): void {\n for (const dispose of this.effectDisposers.splice(0).toReversed()) {\n dispose();\n }\n }\n\n private async flushEffects(): Promise<void> {\n await this.initPromise;\n await this.waitForPendingEffects();\n }\n\n private async waitForPendingEffects(): Promise<void> {\n while (this.pendingEffects.size > 0) {\n // eslint-disable-next-line no-await-in-loop -- async effects may enqueue follow-up effects while settling.\n await Promise.all(this.pendingEffects);\n }\n }\n\n private emitActionStart(event: ActionEvent): void {\n for (const plugin of this.plugins) {\n plugin.onActionStart?.(event);\n }\n }\n\n private emitActionEnd(event: ActionEvent): void {\n for (const plugin of this.plugins) {\n plugin.onActionEnd?.(event);\n }\n }\n\n private emitStateChange(event: StateChangeEvent): void {\n for (const plugin of this.plugins) {\n plugin.onStateChange?.(event);\n }\n }\n\n private emitPatch(event: PatchEvent): void {\n for (const plugin of this.plugins) {\n plugin.onPatch?.(event);\n }\n }\n\n private emitError(error: unknown, context: ErrorContext): void {\n for (const plugin of this.plugins) {\n plugin.onError?.(error, context);\n }\n }\n\n private runWithAppInjectContext<T>(callback: () => T): T {\n return runWithInjectContext(\n {\n mode: \"sync\",\n requestContainer: this.#container as ResolutionContext[\"requestContainer\"],\n resolutionCache: new Map(),\n stack: [],\n },\n callback,\n );\n }\n\n private wrapStoreSetState(): void {\n const originalSetState = this.store.setState.bind(this.store) as (\n ...args: Parameters<StoreSetState>\n ) => unknown;\n\n this.store.setState = ((...args: Parameters<StoreSetState>) => {\n const result = originalSetState(...args);\n this.recordMutationResult(result);\n return result as never;\n }) as StoreSetState;\n }\n\n private recordMutationResult(result: unknown): void {\n if (!Array.isArray(result) || result.length < 3) {\n return;\n }\n\n const patches = result[1] as readonly unknown[];\n\n if (patches.length === 0) {\n return;\n }\n\n this.testInspector?.recordPatch(patches);\n this.emitPatch({\n inversePatches: result[2] as readonly unknown[],\n patches,\n });\n }\n\n private assertNewModules(modules: readonly ModuleBinding[]): void {\n for (const moduleBinding of modules) {\n if (this.moduleByToken.has(moduleBinding.token)) {\n throw new DuplicateProviderError(tokenName(moduleBinding.token));\n }\n\n if (this.moduleByName.has(moduleBinding.name)) {\n throw new DuplicateProviderError(moduleBinding.name);\n }\n }\n }\n\n private installModuleState(modules: readonly ModuleBinding[]): void {\n if (modules.length === 0) {\n return;\n }\n\n const rootState = createRootState(modules);\n\n this.store.setState({\n ...this.store.getPureState(),\n ...rootState,\n });\n }\n\n private registerModules(modules: readonly ModuleBinding[]): void {\n for (const moduleBinding of modules) {\n this.modules.push(moduleBinding);\n this.moduleByToken.set(moduleBinding.token, moduleBinding);\n this.moduleByName.set(moduleBinding.name, moduleBinding);\n }\n }\n}\n\nfunction normalizeAppProvider(provider: ProviderInput): {\n readonly provider: ProviderInput;\n readonly moduleToken?: InjectionToken;\n} {\n if (typeof provider === \"function\") {\n const metadata = getModuleMetadata(provider);\n\n if (metadata !== undefined) {\n return {\n provider: provide(provider, createModuleClassProviderOptions(provider, metadata)),\n moduleToken: provider,\n };\n }\n\n return { provider };\n }\n\n if (\"useClass\" in provider) {\n const metadata = getModuleMetadata(provider.useClass);\n\n if (metadata !== undefined) {\n return {\n provider: {\n ...provider,\n ...mergeModuleClassProviderOptions(provider, metadata),\n },\n moduleToken: provider.provide,\n };\n }\n }\n\n return { provider };\n}\n\nfunction createStoreOptions(\n engine: EngineOptions | undefined,\n enablePatches: boolean,\n): CoactionStoreOptions {\n return {\n name: \"cosystem\",\n sliceMode: \"single\",\n enablePatches,\n ...(engine?.transport === undefined ? {} : { transport: engine.transport }),\n } as CoactionStoreOptions;\n}\n\nfunction shouldEnablePatches(options: InternalCreateAppOptions): boolean {\n if (options.engine?.patches !== undefined) {\n return options.engine.patches;\n }\n\n return (\n options.testInspector !== undefined ||\n (options.plugins ?? []).some((plugin) => plugin.onPatch !== undefined)\n );\n}\n\nfunction createModuleClassProviderOptions<T>(\n useClass: Constructor<T>,\n metadata: ModuleMetadata,\n): ClassProvideOptions<T> {\n return {\n useClass,\n ...(metadata.deps === undefined ? {} : { deps: metadata.deps }),\n ...(metadata.scope === undefined ? {} : { scope: metadata.scope }),\n };\n}\n\nfunction mergeModuleClassProviderOptions<T>(\n provider: Provider<T>,\n metadata: ModuleMetadata,\n): Partial<ClassProvideOptions<T>> {\n return {\n ...(\"deps\" in provider || metadata.deps === undefined ? {} : { deps: metadata.deps }),\n ...(\"scope\" in provider || metadata.scope === undefined ? {} : { scope: metadata.scope }),\n };\n}\n\nfunction instantiateModules(\n container: Container,\n moduleTokens: readonly InjectionToken[],\n reactiveSlice = true,\n) {\n const modules: ModuleBinding[] = [];\n\n for (const moduleToken of moduleTokens) {\n const instance = container.get(moduleToken) as Record<PropertyKey, unknown>;\n const metadata = getModuleMetadata(instance.constructor);\n\n if (metadata === undefined) {\n continue;\n }\n\n const name = metadata.name ?? stableModuleName(moduleToken);\n\n if (modules.some((moduleBinding) => moduleBinding.name === name)) {\n throw new DuplicateProviderError(name);\n }\n\n modules.push({\n actionDepth: 0,\n activeDraft: undefined,\n computedAccessors: new Map(),\n instance,\n metadata,\n name,\n originalActions: new Map(),\n originalComputed: new Map(),\n reactiveSlice,\n token: moduleToken,\n });\n }\n\n return modules;\n}\n\nfunction toModuleCreatedEvent(moduleBinding: ModuleBinding): ModuleCreatedEvent {\n return {\n instance: moduleBinding.instance,\n name: moduleBinding.name,\n token: moduleBinding.token,\n };\n}\n\nfunction instantiateEagerProviders(container: Container): void {\n const internalContainer = container as ContainerImpl;\n\n for (const [token, records] of internalContainer.records) {\n if (!records.some((record) => record.eager)) {\n continue;\n }\n\n if (records.some((record) => record.multi)) {\n container.getAll(token);\n continue;\n }\n\n container.get(token);\n }\n}\n\nfunction createRootState(modules: readonly ModuleBinding[]): RootState {\n const rootState: RootState = {};\n\n for (const moduleBinding of modules) {\n const state: Record<PropertyKey, unknown> = {};\n\n for (const property of moduleBinding.metadata.state) {\n state[property] = moduleBinding.instance[property];\n }\n\n rootState[moduleBinding.name] = state;\n }\n\n return rootState;\n}\n\nfunction stableModuleName(token: InjectionToken): string {\n const name = tokenName(token);\n return `${name.slice(0, 1).toLowerCase()}${name.slice(1)}`;\n}\n\nfunction getMethod(\n instance: Record<PropertyKey, unknown>,\n property: PropertyKey,\n): (...args: unknown[]) => unknown {\n const descriptor = getDescriptor(instance, property);\n\n if (descriptor?.value === undefined || typeof descriptor.value !== \"function\") {\n throw new CosystemError(`${String(property)} is not a method.`);\n }\n\n return descriptor.value as (...args: unknown[]) => unknown;\n}\n\nfunction getGetter(instance: Record<PropertyKey, unknown>, property: PropertyKey): () => unknown {\n const descriptor = getDescriptor(instance, property);\n\n if (descriptor?.get === undefined) {\n throw new CosystemError(`${String(property)} is not a getter.`);\n }\n\n return descriptor.get;\n}\n\nfunction getRuntimeModuleMetadata(module: object): RuntimeModuleMetadata | undefined {\n return (module as { readonly [runtimeModuleMetadataKey]?: RuntimeModuleMetadata })[\n runtimeModuleMetadataKey\n ];\n}\n\nfunction isTokenObject(value: object): value is Extract<InjectionToken, object> {\n return \"id\" in value && typeof (value as { readonly id?: unknown }).id === \"symbol\";\n}\n\nfunction getDescriptor(\n instance: Record<PropertyKey, unknown>,\n property: PropertyKey,\n): PropertyDescriptor | undefined {\n let current: object | null = instance;\n\n while (current !== null) {\n const descriptor = Object.getOwnPropertyDescriptor(current, property);\n\n if (descriptor !== undefined) {\n return descriptor;\n }\n\n current = Object.getPrototypeOf(current);\n }\n\n return undefined;\n}\n\nfunction isApp(value: unknown): value is App {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"get\" in value &&\n \"start\" in value &&\n \"dispose\" in value\n );\n}\n\nfunction isPromiseLike<T = unknown>(value: unknown): value is PromiseLike<T> {\n return (\n (typeof value === \"object\" || typeof value === \"function\") &&\n value !== null &&\n \"then\" in value &&\n typeof value.then === \"function\"\n );\n}\n\nfunction getAppContainer(app: App): Container {\n const container = appContainerMap.get(app);\n\n if (container === undefined) {\n throw new CosystemError(\"Parent app was not created by CoSystem.\");\n }\n\n return container;\n}\n","import {\n addModuleAction,\n addModuleComputed,\n addModuleEffect,\n addModuleState,\n applyModuleOptions,\n defineModule,\n ensureContextModuleMetadata,\n ensureModuleMetadata,\n type ModuleOptions,\n} from \"./metadata.js\";\nimport type { Constructor } from \"./types.js\";\n\nexport function module(options: ModuleOptions = {}) {\n return function moduleDecorator<T extends Constructor>(\n target: T,\n context?: ClassDecoratorContext<T>,\n ): T {\n defineModule(target, options, context);\n return target;\n };\n}\n\nexport function state<This extends object, Value>(\n _value: ClassAccessorDecoratorTarget<This, Value>,\n context: ClassAccessorDecoratorContext<This, Value>,\n): void {\n if (context.kind !== \"accessor\") {\n throw new TypeError(\"@state only supports standard accessor decorators.\");\n }\n\n ensureContextModuleMetadata(context)?.state.add(context.name);\n\n context.addInitializer(function initializeState(this: This) {\n addModuleState(this.constructor, context.name);\n });\n}\n\nexport function action<This extends object, Args extends unknown[], Return>(\n _value: (this: This, ...args: Args) => Return,\n context: ClassMethodDecoratorContext<This, (this: This, ...args: Args) => Return>,\n): void {\n if (context.kind !== \"method\") {\n throw new TypeError(\"@action only supports method decorators.\");\n }\n\n ensureContextModuleMetadata(context)?.actions.add(context.name);\n\n context.addInitializer(function initializeAction(this: This) {\n addModuleAction(this.constructor, context.name);\n });\n}\n\nexport function computed<This extends object, Value>(\n _value: (this: This) => Value,\n context: ClassGetterDecoratorContext<This, Value>,\n): void {\n if (context.kind !== \"getter\") {\n throw new TypeError(\"@computed only supports getter decorators.\");\n }\n\n ensureContextModuleMetadata(context)?.computed.add(context.name);\n\n context.addInitializer(function initializeComputed(this: This) {\n addModuleComputed(this.constructor, context.name);\n });\n}\n\nexport function effect<This extends object, Args extends unknown[], Return>(\n _value: (this: This, ...args: Args) => Return,\n context: ClassMethodDecoratorContext<This, (this: This, ...args: Args) => Return>,\n): void {\n if (context.kind !== \"method\") {\n throw new TypeError(\"@effect only supports method decorators.\");\n }\n\n ensureContextModuleMetadata(context)?.effects.add(context.name);\n\n context.addInitializer(function initializeEffect(this: This) {\n addModuleEffect(this.constructor, context.name);\n });\n}\n\nexport function moduleOptions(target: Constructor, options: ModuleOptions): void {\n applyModuleOptions(ensureModuleMetadata(target), options);\n}\n","import type { Plugin } from \"./app.js\";\n\nexport interface LoggerPluginLogger {\n info(message: string, details?: unknown): void;\n error(message: string, details?: unknown): void;\n}\n\nexport interface LoggerPluginOptions {\n readonly logger?: LoggerPluginLogger;\n}\n\nexport function createLoggerPlugin(options: LoggerPluginOptions = {}): Plugin {\n const logger = options.logger ?? console;\n\n return {\n name: \"cosystem:logger\",\n onActionEnd(event) {\n if (event.error !== undefined) {\n logger.error(`Action failed: ${event.module}.${event.method}`, event);\n return;\n }\n\n logger.info(`Action completed: ${event.module}.${event.method}`, event);\n },\n onError(error, context) {\n logger.error(`Runtime error during ${context.phase}`, error);\n },\n onModuleCreated(event) {\n logger.info(`Module created: ${event.name}`, event);\n },\n };\n}\n","import { createAppInternal, type MutableTestInspector } from \"./app.js\";\nimport type { ActionEvent, CreateAppOptions, TestAppInspector } from \"./app.js\";\nimport type { ProviderInput } from \"./types.js\";\n\nexport interface TestAppOptions extends Omit<CreateAppOptions, \"providers\"> {\n readonly providers?: readonly ProviderInput[];\n readonly overrides?: readonly ProviderInput[];\n readonly autoStart?: boolean;\n readonly strictActions?: boolean;\n}\n\nexport interface TestApp extends ReturnType<typeof createAppInternal> {\n readonly test: TestAppInspector;\n}\n\nexport interface AutoStartedTestAppOptions extends Omit<TestAppOptions, \"autoStart\"> {\n readonly autoStart: true;\n}\n\nexport interface ManualTestAppOptions extends Omit<TestAppOptions, \"autoStart\"> {\n readonly autoStart?: false;\n}\n\nexport function testApp(options: AutoStartedTestAppOptions): Promise<TestApp>;\nexport function testApp(options?: ManualTestAppOptions): TestApp;\nexport function testApp(options: TestAppOptions = {}): TestApp | Promise<TestApp> {\n const inspector = createTestInspector();\n const { autoStart, overrides, strictActions, ...createOptions } = options;\n const app = createAppInternal({\n ...createOptions,\n devOptions: {\n ...createOptions.devOptions,\n ...(strictActions === undefined ? {} : { strictActions }),\n },\n ...(overrides === undefined ? {} : { overrides }),\n testInspector: inspector,\n }) as TestApp;\n\n Object.defineProperty(app, \"test\", {\n configurable: false,\n enumerable: false,\n value: inspector,\n });\n\n if (autoStart === true) {\n return app.start().then(() => app);\n }\n\n return app;\n}\n\nfunction defaultFlushEffects(): Promise<void> {\n return Promise.resolve();\n}\n\nfunction createTestInspector(): MutableTestInspector {\n const actions: ActionEvent[] = [];\n const patches: unknown[] = [];\n let flushEffects = defaultFlushEffects;\n let lastState: unknown;\n\n return {\n clearActions() {\n actions.length = 0;\n },\n clearPatches() {\n patches.length = 0;\n },\n flushEffects() {\n return flushEffects();\n },\n getActions() {\n return actions;\n },\n getPatches() {\n return patches;\n },\n getState() {\n return lastState;\n },\n recordAction(event) {\n actions.push(event);\n },\n recordPatch(patch) {\n patches.push(patch);\n },\n recordState(state) {\n lastState = state;\n },\n setFlushEffects(callback) {\n flushEffects = callback;\n },\n };\n}\n","import { CosystemError } from \"./errors.js\";\nimport { createApp, type App, type CreateAppOptions, type Plugin } from \"./app.js\";\n\nexport interface WorkerTransport {\n post(message: WorkerMessage): void;\n subscribe(listener: (message: WorkerMessage) => void): () => void;\n}\n\nexport type DataTransportEmitOptions =\n | WorkerMessage[\"type\"]\n | {\n readonly name: WorkerMessage[\"type\"];\n readonly respond?: boolean;\n readonly timeout?: number;\n readonly silent?: boolean;\n readonly skipBeforeEmit?: boolean;\n };\n\nexport interface DataTransportLike {\n emit(options: DataTransportEmitOptions, message: WorkerMessage): Promise<unknown>;\n listen(\n name: WorkerMessage[\"type\"],\n listener: (message: WorkerMessage) => unknown,\n ): (() => void) | void;\n}\n\nexport interface DataTransportWorkerTransportOptions {\n readonly onError?: (error: unknown, message: WorkerMessage) => void;\n}\n\nexport interface PostMessageTarget {\n postMessage(message: WorkerMessage): void;\n}\n\nexport interface PostMessageEventLike {\n readonly data?: unknown;\n}\n\nexport interface PostMessageSource {\n addEventListener(type: \"message\", listener: (event: PostMessageEventLike) => void): void;\n removeEventListener(type: \"message\", listener: (event: PostMessageEventLike) => void): void;\n}\n\nexport interface PostMessageEndpoint extends PostMessageTarget, PostMessageSource {}\n\nexport interface PostMessageWorkerTransportOptions {\n readonly source?: PostMessageSource;\n readonly target?: PostMessageTarget;\n readonly onError?: (error: unknown, message: WorkerMessage) => void;\n}\n\nexport interface BroadcastMessageEventLike {\n readonly data?: unknown;\n}\n\nexport interface BroadcastChannelLike {\n postMessage(message: unknown): void;\n addEventListener(type: \"message\", listener: (event: BroadcastMessageEventLike) => void): void;\n removeEventListener(type: \"message\", listener: (event: BroadcastMessageEventLike) => void): void;\n close?(): void;\n}\n\nexport interface BroadcastWorkerTransportOptions {\n readonly channel?: string;\n readonly peerId?: string;\n readonly targetPeerId?: string;\n readonly onError?: (error: unknown, message: WorkerMessage) => void;\n}\n\nexport interface BroadcastWorkerMessageEnvelope {\n readonly type: \"cosystem:worker\";\n readonly channel: string;\n readonly source: string;\n readonly target?: string;\n readonly message: WorkerMessage;\n}\n\nexport type WorkerMessage =\n | WorkerCallMessage\n | WorkerResultMessage\n | WorkerStateMessage\n | WorkerReadyMessage;\n\nexport interface WorkerCallMessage {\n readonly id: number;\n readonly type: \"call\";\n readonly module: string;\n readonly method: string;\n readonly args: readonly unknown[];\n}\n\nexport interface WorkerResultMessage {\n readonly id: number;\n readonly type: \"result\";\n readonly value?: unknown;\n readonly error?: SerializedWorkerError;\n}\n\nexport interface WorkerStateMessage {\n readonly type: \"state\";\n readonly state?: unknown;\n readonly patches?: readonly unknown[];\n readonly sections?: readonly WorkerStateSection[];\n readonly sync: \"patch\" | \"snapshot\";\n readonly version: number;\n}\n\nexport interface WorkerReadyMessage {\n readonly type: \"ready\";\n}\n\nexport interface SerializedWorkerError {\n readonly name: string;\n readonly message: string;\n readonly stack?: string;\n}\n\nexport interface CreateWorkerAppOptions extends CreateAppOptions {\n readonly transport: WorkerTransport;\n readonly sync?: WorkerStateSyncMode;\n readonly stateSections?: readonly WorkerStateSection[];\n}\n\nexport type WorkerStateSyncMode = \"snapshot\" | \"patch\";\nexport type WorkerStateSection = string;\n\nexport interface WorkerAppHost {\n readonly app: App;\n readonly ready: Promise<void>;\n dispose(): Promise<void>;\n}\n\nexport interface CreateWorkerClientOptions {\n readonly transport: WorkerTransport;\n readonly onConflict?: (event: WorkerConflictEvent) => void;\n}\n\nexport type WorkerConflictReason =\n | \"missing-snapshot\"\n | \"patch-apply-failed\"\n | \"stale-message\"\n | \"version-gap\";\n\nexport interface WorkerConflictEvent {\n readonly reason: WorkerConflictReason;\n readonly currentVersion: number;\n readonly incomingVersion: number;\n readonly message: WorkerStateMessage;\n readonly error?: unknown;\n}\n\nexport type AsyncMethodProxy<T extends object> = {\n readonly [Key in keyof T as T[Key] extends (...args: any[]) => unknown\n ? Key\n : never]: T[Key] extends (...args: infer Args) => infer Return\n ? (...args: Args) => Promise<Awaited<Return>>\n : never;\n};\n\nexport type WorkerStateSelector<T> = (state: unknown, client: WorkerClient) => T;\n\nexport interface WorkerWatchOptions<T> {\n readonly equals?: (value: T, previous: T) => boolean;\n readonly immediate?: boolean;\n}\n\nexport interface WorkerClient {\n readonly ready: Promise<void>;\n readonly state: {\n readonly version: number;\n };\n getState(): unknown;\n select<T>(selector: WorkerStateSelector<T>): T;\n watch<T>(\n selector: WorkerStateSelector<T>,\n listener: (value: T, previous: T) => void,\n options?: WorkerWatchOptions<T>,\n ): () => void;\n call(module: string, method: string, ...args: readonly unknown[]): Promise<unknown>;\n module<T extends object>(name: string): AsyncMethodProxy<T>;\n subscribe(listener: (message: WorkerStateMessage) => void): () => void;\n dispose(): void;\n}\n\ninterface WorkerSelectorWatcher<T> {\n readonly selector: WorkerStateSelector<T>;\n readonly listener: (value: T, previous: T) => void;\n readonly equals: (value: T, previous: T) => boolean;\n readonly immediate: boolean;\n initialized: boolean;\n previous: T | undefined;\n}\n\ntype PatchPathSegment = string | number;\ntype PatchContainer = Record<string, unknown> | unknown[];\n\ninterface BroadcastCallRoute {\n readonly id: number;\n readonly source: string;\n}\n\ninterface WorkerPatch {\n readonly op: \"add\" | \"replace\" | \"remove\";\n readonly path: unknown;\n readonly value?: unknown;\n}\n\nexport function createWorkerApp(options: CreateWorkerAppOptions): WorkerAppHost {\n const { stateSections, sync = \"snapshot\", transport, ...appOptions } = options;\n let stateSyncVersion = 0;\n let publishPatches = false;\n const patchPlugin: Plugin = {\n name: \"cosystem:worker-patches\",\n onPatch(event) {\n if (publishPatches) {\n const version = stateSections === undefined ? app.state.version : stateSyncVersion + 1;\n\n if (publishState(app, transport, event.patches, sync, stateSections, version)) {\n stateSyncVersion = version;\n }\n }\n },\n };\n const app = createApp({\n ...appOptions,\n engine: {\n ...appOptions.engine,\n patches: true,\n },\n plugins: [...(appOptions.plugins ?? []), patchPlugin],\n });\n const ready = app.start().then(() => {\n publishPatches = true;\n transport.post({ type: \"ready\" });\n const version = stateSections === undefined ? app.state.version : stateSyncVersion;\n\n if (publishState(app, transport, [], \"snapshot\", stateSections, version)) {\n stateSyncVersion = version;\n }\n return undefined;\n });\n const unsubscribeTransport = transport.subscribe((message) => {\n if (message.type !== \"call\") {\n return;\n }\n\n void handleCall(app, transport, message, ready);\n });\n\n return {\n app,\n ready,\n async dispose() {\n unsubscribeTransport();\n await ready.catch(() => undefined);\n await app.dispose();\n },\n };\n}\n\nexport function createWorkerClient(options: CreateWorkerClientOptions): WorkerClient {\n const { onConflict, transport } = options;\n const listeners = new Set<(message: WorkerStateMessage) => void>();\n const selectorWatchers = new Set<WorkerSelectorWatcher<unknown>>();\n const pending = new Map<\n number,\n {\n readonly resolve: (value: unknown) => void;\n readonly reject: (error: unknown) => void;\n }\n >();\n const state = { version: 0 };\n let nextId = 1;\n let snapshot: unknown;\n let readySettled = false;\n let resolveReady!: () => void;\n let rejectReady!: (error: unknown) => void;\n const ready = new Promise<void>((resolve, reject) => {\n resolveReady = resolve;\n rejectReady = reject;\n });\n\n ready.catch(() => undefined);\n\n let unsubscribe = noop;\n const client: WorkerClient = {\n ready,\n state,\n call(module, method, ...args) {\n const id = nextId;\n nextId += 1;\n\n return new Promise((resolve, reject) => {\n pending.set(id, { reject, resolve });\n transport.post({\n args,\n id,\n method,\n module,\n type: \"call\",\n });\n });\n },\n dispose() {\n unsubscribe();\n\n if (!readySettled) {\n readySettled = true;\n rejectReady(new CosystemError(\"Worker client disposed before initial state.\"));\n }\n\n for (const entry of pending.values()) {\n entry.reject(new CosystemError(\"Worker client disposed before response.\"));\n }\n\n pending.clear();\n listeners.clear();\n selectorWatchers.clear();\n },\n getState() {\n return snapshot;\n },\n module<T extends object>(name: string): AsyncMethodProxy<T> {\n return new Proxy(\n {},\n {\n get(_target, property) {\n if (typeof property !== \"string\") {\n return undefined;\n }\n\n return (...args: readonly unknown[]) => client.call(name, property, ...args);\n },\n },\n ) as AsyncMethodProxy<T>;\n },\n select<T>(selector: WorkerStateSelector<T>): T {\n if (snapshot === undefined) {\n throw new CosystemError(\"Worker client state is not ready.\");\n }\n\n return selector(snapshot, client);\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n watch<T>(\n selector: WorkerStateSelector<T>,\n listener: (value: T, previous: T) => void,\n watchOptions: WorkerWatchOptions<T> = {},\n ): () => void {\n const watcher: WorkerSelectorWatcher<T> = {\n equals: watchOptions.equals ?? Object.is,\n immediate: watchOptions.immediate ?? false,\n initialized: false,\n listener,\n previous: undefined,\n selector,\n };\n\n if (snapshot !== undefined) {\n const value = selector(snapshot, client);\n watcher.initialized = true;\n watcher.previous = value;\n\n if (watcher.immediate) {\n listener(value, value);\n }\n }\n\n selectorWatchers.add(watcher as WorkerSelectorWatcher<unknown>);\n\n return () => {\n selectorWatchers.delete(watcher as WorkerSelectorWatcher<unknown>);\n };\n },\n };\n\n const publishSelectorWatchers = () => {\n if (snapshot === undefined) {\n return;\n }\n\n for (const watcher of selectorWatchers) {\n const value = watcher.selector(snapshot, client);\n\n if (!watcher.initialized) {\n watcher.initialized = true;\n watcher.previous = value;\n\n if (watcher.immediate) {\n watcher.listener(value, value);\n }\n\n continue;\n }\n\n const previous = watcher.previous as never;\n\n if (watcher.equals(value, previous)) {\n continue;\n }\n\n watcher.previous = value;\n watcher.listener(value, previous as never);\n }\n };\n\n unsubscribe = transport.subscribe((message) => {\n if (message.type === \"state\") {\n if (readySettled && message.version <= state.version) {\n reportWorkerConflict(onConflict, {\n currentVersion: state.version,\n incomingVersion: message.version,\n message,\n reason: \"stale-message\",\n });\n return;\n }\n\n const isPatchOnly = message.state === undefined && message.sync === \"patch\";\n\n if (isPatchOnly && snapshot === undefined) {\n reportWorkerConflict(onConflict, {\n currentVersion: state.version,\n incomingVersion: message.version,\n message,\n reason: \"missing-snapshot\",\n });\n return;\n }\n\n if (isPatchOnly && readySettled && message.version !== state.version + 1) {\n reportWorkerConflict(onConflict, {\n currentVersion: state.version,\n incomingVersion: message.version,\n message,\n reason: \"version-gap\",\n });\n return;\n }\n\n try {\n snapshot = isPatchOnly\n ? applyWorkerPatches(snapshot, message.patches ?? [])\n : message.state;\n } catch (error) {\n reportWorkerConflict(onConflict, {\n currentVersion: state.version,\n error,\n incomingVersion: message.version,\n message,\n reason: \"patch-apply-failed\",\n });\n return;\n }\n\n state.version = message.version;\n\n if (!readySettled) {\n readySettled = true;\n resolveReady();\n }\n\n for (const listener of listeners) {\n listener(message);\n }\n\n publishSelectorWatchers();\n\n return;\n }\n\n if (message.type !== \"result\") {\n return;\n }\n\n const entry = pending.get(message.id);\n\n if (entry === undefined) {\n return;\n }\n\n pending.delete(message.id);\n\n if (message.error !== undefined) {\n entry.reject(createRemoteError(message.error));\n return;\n }\n\n entry.resolve(message.value);\n });\n\n return client;\n}\n\nfunction reportWorkerConflict(\n onConflict: ((event: WorkerConflictEvent) => void) | undefined,\n event: WorkerConflictEvent,\n): void {\n onConflict?.(event);\n}\n\nexport function createMemoryWorkerTransportPair(): readonly [WorkerTransport, WorkerTransport] {\n const leftListeners = new Set<(message: WorkerMessage) => void>();\n const rightListeners = new Set<(message: WorkerMessage) => void>();\n\n return [\n createMemoryWorkerTransport(leftListeners, rightListeners),\n createMemoryWorkerTransport(rightListeners, leftListeners),\n ];\n}\n\nexport function createPostMessageWorkerTransport(\n endpoint: PostMessageEndpoint,\n options: PostMessageWorkerTransportOptions = {},\n): WorkerTransport {\n const source = options.source ?? endpoint;\n const target = options.target ?? endpoint;\n\n return {\n post(message) {\n try {\n // eslint-disable-next-line unicorn/require-post-message-target-origin -- Worker and MessagePort endpoints do not consistently accept targetOrigin.\n target.postMessage(message);\n } catch (error) {\n options.onError?.(error, message);\n }\n },\n subscribe(listener) {\n const handleMessage = (event: PostMessageEventLike) => {\n if (!isWorkerMessage(event.data)) {\n return;\n }\n\n listener(event.data);\n };\n\n source.addEventListener(\"message\", handleMessage);\n\n return () => {\n source.removeEventListener(\"message\", handleMessage);\n };\n },\n };\n}\n\nexport function createBroadcastWorkerTransport(\n broadcast: BroadcastChannelLike,\n options: BroadcastWorkerTransportOptions = {},\n): WorkerTransport {\n const channel = options.channel ?? defaultBroadcastWorkerChannel;\n const peerId = options.peerId ?? createWorkerPeerId();\n const callRoutes = new Map<number, BroadcastCallRoute>();\n let nextRoutedCallId = 1;\n\n return {\n post(message) {\n try {\n const routed = routeBroadcastWorkerMessage(message, callRoutes);\n const target = routed.target ?? getBroadcastWorkerTarget(message, options);\n const envelope: BroadcastWorkerMessageEnvelope = {\n channel,\n message: routed.message,\n source: peerId,\n type: \"cosystem:worker\",\n ...(target === undefined ? {} : { target }),\n };\n\n // eslint-disable-next-line unicorn/require-post-message-target-origin -- BroadcastChannel-style endpoints do not accept targetOrigin.\n broadcast.postMessage(envelope);\n } catch (error) {\n options.onError?.(error, message);\n }\n },\n subscribe(listener) {\n const handleMessage = (event: BroadcastMessageEventLike) => {\n const envelope = event.data;\n\n if (\n !isBroadcastWorkerMessageEnvelope(envelope) ||\n envelope.channel !== channel ||\n envelope.source === peerId ||\n (envelope.target !== undefined && envelope.target !== peerId)\n ) {\n return;\n }\n\n if (envelope.message.type === \"call\") {\n const routedCallId = nextRoutedCallId;\n nextRoutedCallId += 1;\n callRoutes.set(routedCallId, {\n id: envelope.message.id,\n source: envelope.source,\n });\n listener({\n ...envelope.message,\n id: routedCallId,\n });\n return;\n }\n\n listener(envelope.message);\n };\n\n broadcast.addEventListener(\"message\", handleMessage);\n\n return () => {\n broadcast.removeEventListener(\"message\", handleMessage);\n };\n },\n };\n}\n\nexport function createMemoryBroadcastChannel(\n name: string = defaultBroadcastWorkerChannel,\n): BroadcastChannelLike {\n return new MemoryBroadcastChannel(name);\n}\n\nexport function createDataTransportWorkerTransport(\n dataTransport: DataTransportLike,\n options: DataTransportWorkerTransportOptions = {},\n): WorkerTransport {\n const listeners = new Set<(message: WorkerMessage) => void>();\n const disposers: (() => void)[] = [];\n let listening = false;\n\n const start = () => {\n if (listening) {\n return;\n }\n\n listening = true;\n\n for (const type of workerMessageTypes) {\n const dispose = dataTransport.listen(type, (message) => {\n if (!isWorkerMessage(message)) {\n return;\n }\n\n for (const listener of listeners) {\n listener(message);\n }\n });\n\n if (typeof dispose === \"function\") {\n disposers.push(dispose);\n }\n }\n };\n\n const stop = () => {\n if (!listening) {\n return;\n }\n\n listening = false;\n\n for (const dispose of disposers.splice(0)) {\n dispose();\n }\n };\n\n return {\n post(message) {\n void dataTransport\n .emit(\n {\n name: message.type,\n respond: false,\n },\n message,\n )\n .catch((error: unknown) => {\n options.onError?.(error, message);\n });\n },\n subscribe(listener) {\n start();\n listeners.add(listener);\n\n return () => {\n listeners.delete(listener);\n\n if (listeners.size === 0) {\n stop();\n }\n };\n },\n };\n}\n\nfunction getBroadcastWorkerTarget(\n message: WorkerMessage,\n options: BroadcastWorkerTransportOptions,\n): string | undefined {\n return message.type === \"call\" ? options.targetPeerId : undefined;\n}\n\nfunction routeBroadcastWorkerMessage(\n message: WorkerMessage,\n callRoutes: Map<number, BroadcastCallRoute>,\n): { readonly message: WorkerMessage; readonly target?: string } {\n if (message.type !== \"result\") {\n return { message };\n }\n\n const route = callRoutes.get(message.id);\n\n if (route === undefined) {\n return { message };\n }\n\n callRoutes.delete(message.id);\n\n return {\n message: {\n ...message,\n id: route.id,\n },\n target: route.source,\n };\n}\n\nasync function handleCall(\n app: App,\n transport: WorkerTransport,\n message: WorkerCallMessage,\n ready: Promise<void>,\n): Promise<void> {\n try {\n await ready;\n const module = app.getModuleByName<Record<string, unknown>>(message.module);\n const method = module[message.method];\n\n if (typeof method !== \"function\") {\n throw new CosystemError(`${message.module}.${message.method} is not callable.`);\n }\n\n const value = await method.apply(module, message.args);\n transport.post({\n id: message.id,\n type: \"result\",\n value,\n });\n } catch (error) {\n transport.post({\n error: serializeError(error),\n id: message.id,\n type: \"result\",\n });\n }\n}\n\nfunction publishState(\n app: App,\n transport: WorkerTransport,\n patches: readonly unknown[] = [],\n mode: WorkerStateSyncMode = \"snapshot\",\n sections?: readonly WorkerStateSection[],\n version: number = app.state.version,\n): boolean {\n const filteredPatches = filterWorkerPatches(patches, sections);\n const isPatch = filteredPatches.length > 0;\n\n if (patches.length > 0 && filteredPatches.length === 0) {\n return false;\n }\n\n const state = filterWorkerState(app.store.getPureState(), sections);\n const message: WorkerStateMessage = {\n ...(isPatch && mode === \"patch\" ? {} : { state }),\n ...(sections === undefined ? {} : { sections }),\n sync: isPatch ? \"patch\" : \"snapshot\",\n type: \"state\",\n version,\n ...(isPatch ? { patches: filteredPatches } : {}),\n };\n\n transport.post(message);\n return true;\n}\n\nfunction filterWorkerState(state: unknown, sections?: readonly WorkerStateSection[]): unknown {\n if (sections === undefined || !isRecord(state)) {\n return state;\n }\n\n const filtered: Record<string, unknown> = {};\n\n for (const section of sections) {\n if (section in state) {\n filtered[section] = state[section];\n }\n }\n\n return filtered;\n}\n\nfunction filterWorkerPatches(\n patches: readonly unknown[],\n sections?: readonly WorkerStateSection[],\n): readonly unknown[] {\n if (sections === undefined) {\n return patches;\n }\n\n const sectionSet = new Set(sections);\n\n return patches.filter((patch) => {\n if (!isWorkerPatch(patch)) {\n throw new CosystemError(\"Worker state patch is invalid.\");\n }\n\n const section = getWorkerPatchSection(patch);\n return section !== undefined && sectionSet.has(String(section));\n });\n}\n\nfunction getWorkerPatchSection(patch: WorkerPatch): PatchPathSegment | undefined {\n const path = normalizePatchPath(patch.path);\n return path[0];\n}\n\nfunction applyWorkerPatches(state: unknown, patches: readonly unknown[]): unknown {\n let next = state;\n\n for (const patch of patches) {\n next = applyWorkerPatch(next, patch);\n }\n\n return next;\n}\n\nfunction applyWorkerPatch(state: unknown, patch: unknown): unknown {\n if (!isWorkerPatch(patch)) {\n throw new CosystemError(\"Worker state patch is invalid.\");\n }\n\n const path = normalizePatchPath(patch.path);\n\n if (path.length === 0) {\n if (patch.op === \"remove\") {\n return undefined;\n }\n\n return patch.value;\n }\n\n return applyPatchAtPath(state, path, patch);\n}\n\nfunction applyPatchAtPath(\n state: unknown,\n path: readonly PatchPathSegment[],\n patch: WorkerPatch,\n): unknown {\n const [segment, ...rest] = path;\n\n if (segment === undefined) {\n throw new CosystemError(\"Worker state patch path is invalid.\");\n }\n\n const container = clonePatchContainer(state, segment);\n\n if (rest.length === 0) {\n if (patch.op === \"remove\") {\n removePatchValue(container, segment);\n return container;\n }\n\n setPatchValue(container, segment, patch.value);\n return container;\n }\n\n setPatchValue(\n container,\n segment,\n applyPatchAtPath(getPatchValue(container, segment), rest, patch),\n );\n\n return container;\n}\n\nfunction clonePatchContainer(state: unknown, nextSegment: PatchPathSegment): PatchContainer {\n if (Array.isArray(state)) {\n return [...state];\n }\n\n if (isRecord(state)) {\n return { ...state };\n }\n\n return typeof nextSegment === \"number\" ? [] : {};\n}\n\nfunction getPatchValue(container: PatchContainer, segment: PatchPathSegment): unknown {\n if (Array.isArray(container)) {\n return container[toArrayIndex(segment)];\n }\n\n return container[String(segment)];\n}\n\nfunction setPatchValue(container: PatchContainer, segment: PatchPathSegment, value: unknown): void {\n if (Array.isArray(container)) {\n container[toArrayIndex(segment)] = value;\n return;\n }\n\n container[String(segment)] = value;\n}\n\nfunction removePatchValue(container: PatchContainer, segment: PatchPathSegment): void {\n if (Array.isArray(container)) {\n container.splice(toArrayIndex(segment), 1);\n return;\n }\n\n delete container[String(segment)];\n}\n\nfunction toArrayIndex(segment: PatchPathSegment): number {\n if (typeof segment === \"number\") {\n return segment;\n }\n\n return Number(segment);\n}\n\nfunction normalizePatchPath(path: unknown): readonly PatchPathSegment[] {\n if (Array.isArray(path)) {\n return path.map((segment) => normalizePatchPathSegment(segment));\n }\n\n if (typeof path === \"string\") {\n if (path === \"\" || path === \"/\") {\n return [];\n }\n\n return path\n .split(\"/\")\n .slice(1)\n .map((segment) =>\n normalizePatchPathSegment(segment.replaceAll(\"~1\", \"/\").replaceAll(\"~0\", \"~\")),\n );\n }\n\n throw new CosystemError(\"Worker state patch path is invalid.\");\n}\n\nfunction normalizePatchPathSegment(segment: unknown): PatchPathSegment {\n if (typeof segment === \"number\" || typeof segment === \"string\") {\n return segment;\n }\n\n throw new CosystemError(\"Worker state patch path segment is invalid.\");\n}\n\nfunction isWorkerPatch(value: unknown): value is WorkerPatch {\n if (!isRecord(value)) {\n return false;\n }\n\n return (\n (value.op === \"add\" || value.op === \"replace\" || value.op === \"remove\") &&\n (Array.isArray(value.path) || typeof value.path === \"string\")\n );\n}\n\nfunction createMemoryWorkerTransport(\n inbox: Set<(message: WorkerMessage) => void>,\n outbox: Set<(message: WorkerMessage) => void>,\n): WorkerTransport {\n return {\n post(message) {\n for (const listener of outbox) {\n listener(message);\n }\n },\n subscribe(listener) {\n inbox.add(listener);\n return () => {\n inbox.delete(listener);\n };\n },\n };\n}\n\nconst workerMessageTypes = [\"call\", \"result\", \"state\", \"ready\"] as const;\nconst defaultBroadcastWorkerChannel = \"cosystem:worker\";\nconst memoryBroadcastChannels = new Map<string, Set<MemoryBroadcastChannel>>();\nlet nextWorkerPeerId = 1;\n\nclass MemoryBroadcastChannel implements BroadcastChannelLike {\n readonly name: string;\n readonly #listeners = new Set<(event: BroadcastMessageEventLike) => void>();\n #closed = false;\n\n constructor(name: string) {\n this.name = name;\n\n let channels = memoryBroadcastChannels.get(name);\n\n if (channels === undefined) {\n channels = new Set();\n memoryBroadcastChannels.set(name, channels);\n }\n\n channels.add(this);\n }\n\n postMessage(message: unknown): void {\n if (this.#closed) {\n return;\n }\n\n const channels = memoryBroadcastChannels.get(this.name);\n\n if (channels === undefined) {\n return;\n }\n\n for (const channel of channels) {\n if (channel === this || channel.#closed) {\n continue;\n }\n\n channel.dispatch({ data: message });\n }\n }\n\n addEventListener(_type: \"message\", listener: (event: BroadcastMessageEventLike) => void): void {\n if (!this.#closed) {\n this.#listeners.add(listener);\n }\n }\n\n removeEventListener(\n _type: \"message\",\n listener: (event: BroadcastMessageEventLike) => void,\n ): void {\n this.#listeners.delete(listener);\n }\n\n close(): void {\n if (this.#closed) {\n return;\n }\n\n this.#closed = true;\n this.#listeners.clear();\n\n const channels = memoryBroadcastChannels.get(this.name);\n\n if (channels === undefined) {\n return;\n }\n\n channels.delete(this);\n\n if (channels.size === 0) {\n memoryBroadcastChannels.delete(this.name);\n }\n }\n\n private dispatch(event: BroadcastMessageEventLike): void {\n for (const listener of this.#listeners) {\n listener(event);\n }\n }\n}\n\nfunction createWorkerPeerId(): string {\n const id = nextWorkerPeerId;\n nextWorkerPeerId += 1;\n return `peer:${id}`;\n}\n\nfunction isWorkerMessage(message: unknown): message is WorkerMessage {\n if (typeof message !== \"object\" || message === null || !(\"type\" in message)) {\n return false;\n }\n\n return workerMessageTypes.includes(\n (message as { readonly type?: unknown }).type as WorkerMessage[\"type\"],\n );\n}\n\nfunction isBroadcastWorkerMessageEnvelope(\n message: unknown,\n): message is BroadcastWorkerMessageEnvelope {\n if (!isRecord(message)) {\n return false;\n }\n\n return (\n message.type === \"cosystem:worker\" &&\n typeof message.channel === \"string\" &&\n typeof message.source === \"string\" &&\n (message.target === undefined || typeof message.target === \"string\") &&\n isWorkerMessage(message.message)\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction serializeError(error: unknown): SerializedWorkerError {\n if (error instanceof Error) {\n return {\n message: error.message,\n name: error.name,\n ...(error.stack === undefined ? {} : { stack: error.stack }),\n };\n }\n\n return {\n message: String(error),\n name: \"Error\",\n };\n}\n\nfunction createRemoteError(error: SerializedWorkerError): CosystemError {\n const remoteError = new CosystemError(`Remote worker error: ${error.message}`);\n remoteError.name = error.name;\n\n if (error.stack !== undefined) {\n remoteError.stack = error.stack;\n }\n\n return remoteError;\n}\n\nfunction noop(): void {}\n"],"mappings":"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"}