@cosystem/core 0.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.
- package/LICENSE +21 -0
- package/dist/index.d.mts +358 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +1056 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +39 -0
|
@@ -0,0 +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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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@cosystem/core",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"description": "Core utilities for CoSystem.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"files": [
|
|
7
|
+
"dist"
|
|
8
|
+
],
|
|
9
|
+
"type": "module",
|
|
10
|
+
"sideEffects": false,
|
|
11
|
+
"module": "./dist/index.mjs",
|
|
12
|
+
"types": "./dist/index.d.mts",
|
|
13
|
+
"exports": {
|
|
14
|
+
".": {
|
|
15
|
+
"types": "./dist/index.d.mts",
|
|
16
|
+
"import": "./dist/index.mjs"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"publishConfig": {
|
|
20
|
+
"access": "public"
|
|
21
|
+
},
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"coaction": "2.0.0"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"tsdown": "0.22.3",
|
|
27
|
+
"typescript": "6.0.3",
|
|
28
|
+
"vitest": "4.1.9",
|
|
29
|
+
"@cosystem/tsconfig": "0.0.0"
|
|
30
|
+
},
|
|
31
|
+
"scripts": {
|
|
32
|
+
"build": "tsdown",
|
|
33
|
+
"clean": "rm -rf coverage dist .turbo",
|
|
34
|
+
"dev": "tsdown --watch",
|
|
35
|
+
"test": "cd ../.. && vitest run --project @cosystem/core",
|
|
36
|
+
"test:coverage": "cd ../.. && vitest run --coverage --project @cosystem/core",
|
|
37
|
+
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
38
|
+
}
|
|
39
|
+
}
|