injeca 0.2.0 → 0.3.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/README.md +359 -32
- package/dist/decision-odiPb2Au.mjs +194 -0
- package/dist/decision-odiPb2Au.mjs.map +1 -0
- package/dist/global-B9Bk2EG2.d.mts +153 -0
- package/dist/global-C0Nk0pU8.mjs +3790 -0
- package/dist/global-C0Nk0pU8.mjs.map +1 -0
- package/dist/global.d.mts +2 -2
- package/dist/global.mjs +1 -3
- package/dist/index-DXguNx2M.d.mts +643 -0
- package/dist/index.d.mts +174 -2
- package/dist/index.mjs +210 -2
- package/dist/index.mjs.map +1 -0
- package/dist/testing.d.mts +31 -0
- package/dist/testing.mjs +45 -0
- package/dist/testing.mjs.map +1 -0
- package/package.json +12 -25
- package/dist/builtin-BPDNf8Z-.mjs +0 -25
- package/dist/builtin-BPDNf8Z-.mjs.map +0 -1
- package/dist/global-BLY6_SI_.d.mts +0 -130
- package/dist/src-UXkTj4Np.mjs +0 -294
- package/dist/src-UXkTj4Np.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-C0Nk0pU8.mjs","names":["targetsOf","emptyMetadata","emptyPolicy","readTimeout","emptyMetadata","readOwner","effect","invoke","start","stop","provide","resolve","entryOf","scopedResolve","scopedStart","scopedStop"],"sources":["../package.json","../src/diagnostics/logger.ts","../src/helpers/signals.ts","../src/helpers/error-from.ts","../src/graph/resolvers/exclusive.ts","../src/graph/resolvers/resolvers.ts","../src/graph/nodes/container.ts","../src/helpers/deferred.ts","../src/helpers/without-undefined.ts","../src/graph/observers.ts","../src/graph/resolvers/condition.ts","../src/graph/resolvers/plain.ts","../src/graph/resolvers/fallback.ts","../src/graph/status.ts","../src/graph/nodes/service.ts","../src/graph/nodes/consumer.ts","../src/types/keys.ts","../src/primitives/keys.ts","../src/graph/nodes/edge.ts","../src/graph/nodes/policy.ts","../src/graph/nodes/definition.ts","../src/graph/nodes/registration.ts","../src/helpers/cleanup-context.ts","../src/helpers/clock.ts","../src/helpers/delivery-queue.ts","../src/reconciler/build-context.ts","../src/reconciler/calls.ts","../src/reconciler/holds.ts","../src/reconciler/snapshot.ts","../src/helpers/timeout.ts","../src/reconciler/hook-run.ts","../src/reconciler/requeue.ts","../src/reconciler/stop.ts","../src/reconciler/swap.ts","../src/reconciler/start.ts","../src/reconciler/build.ts","../src/reconciler/commit.ts","../src/reconciler/conflict.ts","../src/reconciler/dependency-hooks.ts","../src/reconciler/registration.ts","../src/reconciler/retry.ts","../src/reconciler/reconciler.ts","../src/primitives/container.ts","../src/primitives/invoke.ts","../src/diagnostics/explain.ts","../src/primitives/lifecycle.ts","../src/primitives/listen.ts","../src/primitives/replace.ts","../src/primitives/provide.ts","../src/primitives/resolve.ts","../src/primitives/transaction.ts","../src/queries/impact.ts","../src/queries/graph.ts","../src/queries/listeners.ts","../src/global.ts"],"sourcesContent":["","import type { Logg as LoggLogger } from '@guiiai/logg'\n\nimport { name } from '../../package.json'\n\nexport interface Logger {\n provide: (name: string, dependencies: string[]) => void\n invoke: (dependencies: string[]) => void\n beforeRun: (name: string) => void\n run: (name: string, duration: number) => void\n hookOnStart: (name: string) => void\n hookOnStartComplete: (name: string, duration: number) => void\n hookOnStop: (name: string) => void\n hookOnStopComplete: (name: string, duration: number) => void\n running: () => void\n}\n\nexport interface LoggerOptions {\n enabled?: boolean\n logger?: Logger\n}\n\nfunction formatDuration(ms: number): string {\n if (ms < 1) {\n return `${(ms * 1000).toFixed(3)}µs`\n }\n if (ms < 1000) {\n return `${ms.toFixed(3)}ms`\n }\n return `${(ms / 1000).toFixed(3)}s`\n}\n\nexport function createDefaultLogger(): Logger {\n return {\n provide: (name: string, dependencies: string[]) => {\n const depsStr = dependencies.length > 0 ? ` (depends on: ${dependencies.join(', ')})` : ''\n // eslint-disable-next-line no-console\n console.log(`[${name}] PROVIDE ${name}${depsStr}`)\n },\n\n invoke: (dependencies: string[]) => {\n const depsStr = dependencies.length > 0 ? ` (depends on: ${dependencies.join(', ')})` : ''\n // eslint-disable-next-line no-console\n console.log(`[${name}] INVOKE${depsStr}`)\n },\n\n beforeRun: (name: string) => {\n // eslint-disable-next-line no-console\n console.log(`[${name}] BEFORE RUN provide: ${name}()`)\n },\n\n run: (name: string, duration: number) => {\n // eslint-disable-next-line no-console\n console.log(`[${name}] RUN provide: ${name}() in ${formatDuration(duration)}`)\n },\n\n hookOnStart: (name: string) => {\n // eslint-disable-next-line no-console\n console.log(`[${name}] HOOK OnStart ${name}() executing`)\n },\n\n hookOnStartComplete: (name: string, duration: number) => {\n // eslint-disable-next-line no-console\n console.log(`[${name}] HOOK OnStart ${name}() ran successfully in ${formatDuration(duration)}`)\n },\n\n hookOnStop: (name: string) => {\n // eslint-disable-next-line no-console\n console.log(`[${name}] HOOK OnStop ${name}() executing`)\n },\n\n hookOnStopComplete: (name: string, duration: number) => {\n // eslint-disable-next-line no-console\n console.log(`[${name}] HOOK OnStop ${name}() ran successfully in ${formatDuration(duration)}`)\n },\n\n running: () => {\n // eslint-disable-next-line no-console\n console.log(`[${name}] RUNNING`)\n },\n }\n}\n\nexport function createLoggLogger(logg: LoggLogger): Logger {\n return {\n provide: (name: string, dependencies: string[]) => {\n const depsStr = dependencies.length > 0 ? ` (depends on: ${dependencies.join(', ')})` : ''\n logg.log(`PROVIDE ${name}${depsStr}`)\n },\n\n invoke: (dependencies: string[]) => {\n const depsStr = dependencies.length > 0 ? ` (depends on: ${dependencies.join(', ')})` : ''\n logg.log(`INVOKE${depsStr}`)\n },\n\n beforeRun: (name: string) => {\n logg.log(`BEFORE RUN provide: ${name}()`)\n },\n\n run: (name: string, duration: number) => {\n logg.log(`RUN provide: ${name}() in ${formatDuration(duration)}`)\n },\n\n hookOnStart: (name: string) => {\n logg.log(`HOOK OnStart ${name}() executing`)\n },\n\n hookOnStartComplete: (name: string, duration: number) => {\n logg.log(`HOOK OnStart ${name}() ran successfully in ${formatDuration(duration)}`)\n },\n\n hookOnStop: (name: string) => {\n logg.log(`HOOK OnStop ${name}() executing`)\n },\n\n hookOnStopComplete: (name: string, duration: number) => {\n logg.log(`HOOK OnStop ${name}() ran successfully in ${formatDuration(duration)}`)\n },\n\n running: () => {\n logg.log(`RUNNING`)\n },\n }\n}\n\nexport function createNoopLogger(): Logger {\n return {\n provide: () => {},\n invoke: () => {},\n beforeRun: () => {},\n run: () => {},\n hookOnStart: () => {},\n hookOnStartComplete: () => {},\n hookOnStop: () => {},\n hookOnStopComplete: () => {},\n running: () => {},\n }\n}\n","import { endBatch, setActiveSub, startBatch } from 'alien-signals'\n\nexport type ReactiveOwner = ReturnType<typeof setActiveSub>\n\nexport interface WritableSignal<T> {\n (): T\n (value: T): void\n}\n\n/**\n * Runs `fn` with tracking paused.\n *\n * The tracking rule: each entry point pauses tracking once. The entry points are the public API calls, the reconciler drain, timer callbacks, and the calls of user callbacks.\n * Code inside an entry point reads signals directly. Only the bodies of `computed` and `effect` track.\n * A promise continuation starts with no active subscriber, so it needs no extra pause.\n */\nexport function untracked<T>(fn: () => T): T {\n const previous = setActiveSub(undefined)\n try {\n return fn()\n }\n finally {\n setActiveSub(previous)\n }\n}\n\n/** Writes signals in one batch. Effects see one consistent change. */\nexport function batch(fn: () => void): void {\n startBatch()\n try {\n fn()\n }\n finally {\n endBatch()\n }\n}\n\n/** Runs `fn` with `owner` as the active subscriber, so effects that `fn` creates belong to `owner`. */\nexport function withOwner<T>(owner: ReactiveOwner, fn: () => T): T {\n const previous = setActiveSub(owner)\n try {\n return fn()\n }\n finally {\n setActiveSub(previous)\n }\n}\n","/**\n * Makes one error from collected errors. One error keeps its identity. More than one error becomes an `AggregateError`.\n *\n * The result is `unknown`, because a thrown value is not always an `Error`.\n */\nexport function errorFrom(errors: readonly unknown[], message: string): unknown {\n return errors.length === 1 ? errors[0] : new AggregateError(errors, message)\n}\n","import type { WritableSignal } from '../../helpers/signals'\nimport type { ContainerNode, Runtime, ServiceNode } from '../graph'\n\nimport { computed, signal } from 'alien-signals'\n\n/** Tells whether `ancestor` is `container` or an ancestor of it, with no container in between that isolates `keyName`. */\nfunction reaches(container: ContainerNode, ancestor: ContainerNode, keyName: string): boolean {\n for (let current: ContainerNode | undefined = container; current; current = current.parent) {\n if (current === ancestor)\n return true\n if (current.isolated.has(keyName))\n return false\n }\n\n return false\n}\n\n/**\n * Tells whether two containers share a resolution area of `keyName`.\n * A resolution area is the container that has the key, with its descendants that do not isolate the key.\n */\nexport function sameArea(a: ContainerNode, b: ContainerNode, keyName: string): boolean {\n return reaches(a, b, keyName) || reaches(b, a, keyName)\n}\n\n/** The published services of `keyName` in all containers of the runtime. */\nexport function declarationsOf(runtime: Runtime, keyName: string): WritableSignal<ReadonlySet<ServiceNode>> {\n let declarations = runtime.declarations.get(keyName)\n if (!declarations) {\n declarations = signal<ReadonlySet<ServiceNode>>(new Set())\n runtime.declarations.set(keyName, declarations)\n }\n\n return declarations\n}\n\nexport function addDeclaration(service: ServiceNode): void {\n const declarations = declarationsOf(service.container.runtime, service.name)\n if (!declarations().has(service))\n declarations(new Set([...declarations(), service]))\n}\n\nexport function removeDeclaration(service: ServiceNode): void {\n const declarations = declarationsOf(service.container.runtime, service.name)\n if (declarations().has(service))\n declarations(new Set([...declarations()].filter(other => other !== service)))\n}\n\nfunction sameList(a: readonly ServiceNode[], b: readonly ServiceNode[]): boolean {\n return a.length === b.length && a.every((service, index) => service === b[index])\n}\n\nconst none: readonly ServiceNode[] = Object.freeze([])\n\n/**\n * Creates the conflict of a service: the other present declarations of its key in the same resolution area, when the key is exclusive.\n *\n * The result depends only on the set of declarations. The order of the registrations has no effect.\n * Only one registration of a key exists in one container, so a rival is always in another container.\n * A service of a `perConsumer` registration has no conflict of its own. It follows the conflict of its registration.\n */\nexport function createRivals(service: ServiceNode): () => readonly ServiceNode[] {\n if (service.template)\n return () => service.template?.signals.rivals() ?? none\n if (service.kind !== 'service')\n return () => none\n\n return computed<readonly ServiceNode[]>((previous) => {\n const rivals = [...declarationsOf(service.container.runtime, service.name)()]\n .filter(other => other.container !== service.container\n && other.signals.present()\n && (service.exclusive || other.exclusive)\n && sameArea(service.container, other.container, service.name))\n .sort((a, b) => a.seq - b.seq)\n\n return previous && sameList(previous, rivals) ? previous : rivals\n })\n}\n\n/** Tells whether the key of the service has more than one declaration in its resolution area. */\nexport function inConflict(service: ServiceNode): boolean {\n return service.signals.rivals().length > 0\n}\n","import type { WritableSignal } from '../../helpers/signals'\nimport type { ContainerNode, DependencyEdge, InstanceNode, Resolution, ServiceNode } from '../graph'\n\nimport { signal } from 'alien-signals'\n\n/** Returns the slot signal of `keyName` in `container`. It creates the slot on first read, so that resolution can track it. */\nexport function slotOf(container: ContainerNode, keyName: string): WritableSignal<ServiceNode | undefined> {\n let slot = container.signals.slots.get(keyName)\n if (!slot) {\n slot = signal<ServiceNode | undefined>(undefined)\n container.signals.slots.set(keyName, slot)\n }\n\n return slot\n}\n\n/**\n * Lists the registrations of `keyName` that a consumer in `container` can see, nearest first.\n * The walk ends at a container that isolates the key. A service does not resolve itself.\n */\nexport function candidatesOf(container: ContainerNode, keyName: string, consumer?: ServiceNode): ServiceNode[] {\n const candidates: ServiceNode[] = []\n for (let current: ContainerNode | undefined = container; current; current = current.parent) {\n const candidate = slotOf(current, keyName)()\n if (candidate && candidate !== consumer)\n candidates.push(candidate)\n if (current.isolated.has(keyName))\n break\n }\n\n return candidates\n}\n\n/** The service that serves `registration` for a consumer in `container`. A `perConsumer` registration has one for each consumer container, or none yet. */\nexport function serviceFor(registration: ServiceNode, container: ContainerNode): ServiceNode | undefined {\n return registration.perConsumer ? registration.signals.consumers().get(container) : registration\n}\n\n/** A selected provider: the registration that a consumer sees, and the service that serves it. */\nexport interface Selection {\n readonly registration: ServiceNode\n /** The service of a `perConsumer` registration for the consumer container. It is `undefined` until the reconciler creates it. */\n readonly provider: ServiceNode | undefined\n}\n\n/**\n * Selects the provider of `keyName` for a consumer in `container`.\n *\n * A nearer registration shadows an ancestor only while it is `running`. Until then, the first serving registration wins.\n * If no registration serves, the nearest one is selected. So shadowing never leaves a gap.\n */\nexport function selectProvider(container: ContainerNode, keyName: string, consumer?: ServiceNode): Selection | undefined {\n const candidates = candidatesOf(container, keyName, consumer)\n for (const registration of candidates) {\n const provider = serviceFor(registration, container)\n if (provider?.signals.serving())\n return { registration, provider }\n }\n\n const [nearest] = candidates\n return nearest ? { registration: nearest, provider: serviceFor(nearest, container) } : undefined\n}\n\n/** Finds the service for `keyName` that a consumer in `container` sees. A `perConsumer` registration without a service for the container gives the registration. */\nexport function findProvider(container: ContainerNode, keyName: string, consumer?: ServiceNode): ServiceNode | undefined {\n const selection = selectProvider(container, keyName, consumer)\n return selection && (selection.provider ?? selection.registration)\n}\n\n/** `ready` and `degraded` count as available. A provider outside `running` has no status and is not available. */\nexport function isAvailable(provider: ServiceNode): boolean {\n const status = provider.signals.effective()\n return status !== undefined && status.status !== 'unavailable'\n}\n\n/** The current resolution of the edge. */\nexport function resolutionOf(service: ServiceNode, edge: DependencyEdge): Resolution {\n return service.signals.resolutions.get(edge.name)?.() ?? { kind: 'missing' }\n}\n\n/** The instance of the edge, when it resolves. */\nexport function resolvedInstance(service: ServiceNode, edge: DependencyEdge): InstanceNode | undefined {\n const resolution = resolutionOf(service, edge)\n return resolution.kind === 'resolved' ? resolution.instance : undefined\n}\n\n/** Tells whether each required edge resolves to an available provider. A pending service builds only then. */\nexport function requiredAvailable(service: ServiceNode): boolean {\n return service.edges.every((edge) => {\n if (edge.optional)\n return true\n\n const resolution = resolutionOf(service, edge)\n return resolution.kind === 'resolved' && isAvailable(resolution.provider)\n })\n}\n\n/** Tells whether a required edge no longer resolves: its provider was withdrawn, or it does not run. */\nexport function requiredWithdrawn(service: ServiceNode): boolean {\n return service.edges.some(edge => !edge.optional && resolvedInstance(service, edge) === undefined)\n}\n\n/** Tells whether the current resolution of a required edge differs from the bindings of `instance`. */\nexport function requiredChanged(service: ServiceNode, instance: InstanceNode): boolean {\n return service.edges.some(edge => !edge.optional && resolvedInstance(service, edge) !== instance.bindings.get(edge.name))\n}\n\n/** A build is discarded when its target is lost, a required dependency changed during the build, or the key went into conflict. */\nexport function buildLost(service: ServiceNode, instance: InstanceNode): boolean {\n return !service.signals.present() || !service.signals.active() || service.signals.rivals().length > 0 || requiredChanged(service, instance)\n}\n\n/** The identity of the dependency set: the revision and the instance id of each resolved required dependency. */\nexport function epochOf(service: ServiceNode, pick: (edge: DependencyEdge) => InstanceNode | undefined): string {\n const ids = service.edges\n .filter(edge => !edge.optional)\n .map(edge => `${edge.name}=${pick(edge)?.id ?? ''}`)\n\n return [String(service.revision), ...ids].join('|')\n}\n\n/**\n * Finds the failure that blocks a pending service: a required provider in `failed`, directly or through pending providers.\n */\nexport function blockingFailure(service: ServiceNode, visited = new Set<ServiceNode>()): { readonly error: unknown } | undefined {\n visited.add(service)\n for (const edge of service.edges) {\n if (edge.optional)\n continue\n\n const resolution = resolutionOf(service, edge)\n if (resolution.kind !== 'not-running' || visited.has(resolution.provider))\n continue\n\n const provider = resolution.provider\n const phase = provider.signals.phase()\n if (phase === 'failed')\n return provider.failure\n if (phase === 'pending') {\n const failure = blockingFailure(provider, visited)\n if (failure)\n return failure\n }\n }\n\n return undefined\n}\n","import type { Container } from '../../types'\nimport type { ContainerNode, ServiceNode } from '../graph'\n\nimport { BuildAfterDisposeError, InvalidArgumentError } from '../../diagnostics/errors'\nimport { errorFrom } from '../../helpers/error-from'\nimport { batch, untracked } from '../../helpers/signals'\nimport { addDeclaration } from '../resolvers/exclusive'\nimport { slotOf } from '../resolvers/resolvers'\n\nconst nodes = new WeakMap<Container, ContainerNode>()\n\n/** Connects the public container object to its node. `createContainer` calls it once. */\nexport function registerNode(container: Container, node: ContainerNode): void {\n nodes.set(container, node)\n}\n\n/** Returns the internal node of a container from `createContainer`. */\nexport function nodeOf(container: Container): ContainerNode {\n const node = typeof container === 'object' && container !== null ? nodes.get(container) : undefined\n if (!node)\n throw new InvalidArgumentError('The value is not a container from createContainer.')\n\n return node\n}\n\nexport function assertActive(container: ContainerNode, action: string): void {\n if (container.state !== 'active')\n throw new BuildAfterDisposeError(`Cannot ${action} after the container disposal started.`)\n}\n\n/** Lists `container` and its descendants that were started, through started containers only. `start()` and `stop()` apply to them. */\nexport function affectedContainers(container: ContainerNode): ContainerNode[] {\n const result = [container]\n for (const child of container.children) {\n if (child.enrolled)\n result.push(...affectedContainers(child))\n }\n\n return result\n}\n\n/** Lists `container` and all its descendants. */\nexport function subtreeOf(container: ContainerNode): ContainerNode[] {\n return [container, ...[...container.children].flatMap(subtreeOf)]\n}\n\n/**\n * Makes `service` visible to consumers: the slot of its key, or the consumer map of its `perConsumer` registration.\n * An exclusive conflict counts each published service with a key.\n */\nexport function publishService(service: ServiceNode): void {\n const { template } = service\n if (template) {\n const consumers = template.signals.consumers()\n if (consumers.get(service.container) !== service)\n template.signals.consumers(new Map([...consumers, [service.container, service]]))\n return\n }\n\n slotOf(service.container, service.name)(service)\n addDeclaration(service)\n}\n\n/**\n * Clears the slot and marks the service absent. The reconciler stops it after its holders release it.\n * A `perConsumer` registration also releases the service of each consumer container.\n */\nexport function releaseService(service: ServiceNode): void {\n service.signals.present(false)\n if (service.kind !== 'service' || service.template)\n return\n\n for (const consumer of service.signals.consumers().values())\n consumer.signals.present(false)\n\n const slot = slotOf(service.container, service.name)\n if (slot() === service)\n slot(undefined)\n}\n\n/** Waits until `service` is `withdrawn`. Rejects with its teardown errors. */\nexport async function awaitWithdrawal(service: ServiceNode): Promise<void> {\n const errors = await service.withdrawal.promise\n if (errors.length > 0)\n throw errorFrom(errors, `Withdrawal of '${service.name}' failed.`)\n}\n\n/** Withdraws a service or an invocation. Resolves `false` when it is already withdrawn. It is the `withdraw()` entry point. */\nexport async function withdrawService(service: ServiceNode): Promise<boolean> {\n const released = untracked(() => {\n // A stale registration cannot change the service or a newer service in the same slot.\n if (!service.signals.present())\n return false\n\n batch(() => releaseService(service))\n return true\n })\n if (!released)\n return false\n\n await awaitWithdrawal(service)\n return true\n}\n","export interface Deferred<T> {\n readonly promise: Promise<T>\n resolve: (value: T) => void\n}\n\nexport function createDeferred<T>(): Deferred<T> {\n let resolve!: (value: T) => void\n const promise = new Promise<T>((done) => {\n resolve = done\n })\n\n return { promise, resolve }\n}\n","import { isUndefined, omitBy } from 'es-toolkit'\n\n/** The fields of `T` that are not `undefined`, each one optional. */\nexport type DefinedFields<T> = { [K in keyof T]?: Exclude<T[K], undefined> }\n\n/** Copies `fields` without the fields that are `undefined`. Spread the result to add optional fields to a record. */\nexport function withoutUndefined<T extends Record<string, unknown>>(fields: T): DefinedFields<T> {\n return omitBy(fields, isUndefined) as DefinedFields<T>\n}\n","import type { ErrorObserveRecord, ObserveRecord } from '../types'\nimport type { ContainerNode, Observer } from './graph'\n\nfunction within(container: ContainerNode, ancestor: ContainerNode): boolean {\n for (let current: ContainerNode | undefined = container; current; current = current.parent) {\n if (current === ancestor)\n return true\n }\n\n return false\n}\n\n/** The active observers of `container`: the observers of the container and of its ancestors. */\nfunction targetsOf(container: ContainerNode, source?: Observer): Observer[] {\n return [...container.runtime.observers].filter(observer => observer !== source && observer.active && within(container, observer.container))\n}\n\nfunction send(container: ContainerNode, targets: readonly Observer[], record: ObserveRecord): void {\n container.runtime.deliveries.deliver(targets.map(observer => ({\n run: () => {\n if (observer.active && observer.container.state !== 'disposed')\n observer.callback(record)\n },\n onError: (error: unknown) => {\n // An error about an error record is dropped. Else a failing observer can loop forever.\n if (record.type !== 'error')\n reportCallbackError(observer.container, record.key, error, 'An observe callback threw.', observer)\n },\n })))\n}\n\n/** Sends `record` to the observers of `container`. */\nexport function emitRecord(container: ContainerNode, record: ObserveRecord): void {\n // The targets are fixed now. An observer that subscribes later gets its replay, not this record.\n const targets = targetsOf(container)\n if (targets.length === 0)\n return\n\n send(container, targets, Object.freeze(record))\n}\n\n/** Reports a callback error as an `error` record. An error from an observe callback does not go back to that callback. */\nexport function reportCallbackError(container: ContainerNode, key: string, error: unknown, reason: string, source?: Observer): void {\n const record: ErrorObserveRecord = { type: 'error', key, owner: container.owner, instanceId: undefined, reason, error }\n send(container, targetsOf(container, source), record)\n}\n","import type { ProviderInfo, ResolutionCondition } from '../../types'\nimport type { ServiceNode } from '../graph'\n\nimport { untracked } from '../../helpers/signals'\nimport { reportCallbackError } from '../observers'\n\n/**\n * The verdict of each condition for each provider registration.\n * The input of a condition is frozen, and a condition must be pure. So each pair runs once, and a throw is reported once.\n */\nconst verdicts = new WeakMap<ResolutionCondition, WeakMap<ServiceNode, boolean>>()\n\n/** The read-only information about a provider registration that a condition gets. */\nexport function providerInfo(registration: ServiceNode): ProviderInfo {\n return Object.freeze({ key: registration.name, owner: registration.container.owner, metadata: registration.metadata })\n}\n\n/**\n * Tells whether `condition` accepts the provider registration.\n * A thrown error counts as `false` and goes to the observe stream of the consumer.\n */\nexport function acceptsProvider(consumer: ServiceNode, keyName: string, condition: ResolutionCondition, registration: ServiceNode): boolean {\n let byProvider = verdicts.get(condition)\n if (!byProvider) {\n byProvider = new WeakMap()\n verdicts.set(condition, byProvider)\n }\n\n const known = byProvider.get(registration)\n if (known !== undefined)\n return known\n\n let verdict: boolean\n try {\n // A condition is a user callback.\n verdict = untracked(() => condition(providerInfo(registration))) === true\n }\n catch (error) {\n verdict = false\n // The resolution runs inside a computed value. The record goes out after it, so that no observer runs inside the computation.\n queueMicrotask(() => reportCallbackError(consumer.container, consumer.name, error, `A resolution condition for '${keyName}' threw. It counts as false.`))\n }\n byProvider.set(registration, verdict)\n\n return verdict\n}\n","import type { ResolutionCondition } from '../../types'\nimport type { DependencyEdge, Resolution, ServiceNode } from '../graph'\n\nimport { acceptsProvider } from './condition'\nimport { selectProvider } from './resolvers'\n\n/**\n * Resolves one key name: the selected provider, and its instance when the provider serves.\n * A provider in conflict, or one that `condition` rejects, does not resolve.\n */\nexport function resolveKey(consumer: ServiceNode, keyName: string, condition?: ResolutionCondition): Resolution {\n const selection = selectProvider(consumer.container, keyName, consumer)\n if (!selection)\n return { kind: 'missing' }\n\n const { registration, provider } = selection\n const rivals = registration.signals.rivals()\n if (rivals.length > 0)\n return { kind: 'conflict', provider: registration, rivals }\n if (condition && !acceptsProvider(consumer, keyName, condition, registration))\n return { kind: 'rejected', provider: registration }\n if (!provider)\n return { kind: 'not-running', provider: registration }\n\n const instance = provider.signals.instance()\n if (!provider.signals.serving() || !instance)\n return { kind: 'not-running', provider }\n\n return { kind: 'resolved', provider, instance }\n}\n\n/** Resolves a plain or an optional edge. It has one candidate key. */\nexport function resolvePlain(consumer: ServiceNode, edge: DependencyEdge): Resolution {\n const [keyName] = edge.candidates\n return keyName === undefined ? { kind: 'missing' } : resolveKey(consumer, keyName, edge.condition)\n}\n","import type { DependencyEdge, Resolution, ServiceNode } from '../graph'\n\nimport { resolveKey } from './plain'\nimport { isAvailable } from './resolvers'\n\n/**\n * Resolves a `firstAvailable` edge. The first serving and available candidate wins.\n * If no serving candidate is available, the first serving candidate stays selected, so that a running dependent does not lose it.\n * Without a serving candidate, the edge reports the first candidate that exists.\n */\nexport function resolveFallback(consumer: ServiceNode, edge: DependencyEdge): Resolution {\n let firstUnresolved: Resolution | undefined\n let firstServing: Resolution | undefined\n for (const keyName of edge.candidates) {\n const resolution = resolveKey(consumer, keyName, edge.condition)\n if (resolution.kind === 'missing')\n continue\n if (resolution.kind !== 'resolved') {\n firstUnresolved ??= resolution\n continue\n }\n\n if (isAvailable(resolution.provider))\n return resolution\n firstServing ??= resolution\n }\n\n return firstServing ?? firstUnresolved ?? { kind: 'missing' }\n}\n","import type { ServicePhase, ServiceStatus, StatusCause } from '../types'\nimport type { DependencyEdge, InstanceNode, Resolution, ServiceNode, StatusValue } from './graph'\n\nimport { computed } from 'alien-signals'\n\nimport { withoutUndefined } from '../helpers/without-undefined'\nimport { emitRecord } from './observers'\n\nconst statusRank: Readonly<Record<ServiceStatus, number>> = { ready: 0, degraded: 1, unavailable: 2 }\n\n/** Tells whether `a` is worse than `b`. The order is `ready`, then `degraded`, then `unavailable`. */\nexport function worseThan(a: ServiceStatus, b: ServiceStatus): boolean {\n return statusRank[a] > statusRank[b]\n}\n\nfunction sameCause(a: StatusCause | undefined, b: StatusCause | undefined): boolean {\n if (a === b)\n return true\n if (!a || !b)\n return false\n\n return a.key === b.key && a.owner === b.owner && a.status === b.status && a.reason === b.reason && sameCause(a.cause, b.cause)\n}\n\n/** Tells whether two status values have the same status, reason, and cause. */\nexport function sameStatus(a: StatusValue | undefined, b: StatusValue | undefined): boolean {\n if (a === b)\n return true\n if (!a || !b)\n return false\n\n return a.status === b.status && a.reason === b.reason && sameCause(a.cause, b.cause)\n}\n\nexport function statusFields(status: StatusValue): { reason?: string, cause?: StatusCause } {\n return withoutUndefined({ reason: status.reason, cause: status.cause })\n}\n\n/** The cause that a dependent reports when `provider` makes its effective status worse. */\nexport function causeOf(provider: ServiceNode, status: StatusValue): StatusCause {\n return Object.freeze({\n key: provider.name,\n owner: provider.container.owner,\n status: status.status,\n ...withoutUndefined({ reason: status.reason, cause: status.cause }),\n })\n}\n\nexport interface EffectiveStatusInput {\n readonly phase: () => ServicePhase\n readonly instance: () => InstanceNode | undefined\n readonly edges: readonly DependencyEdge[]\n readonly resolutions: ReadonlyMap<string, () => Resolution>\n}\n\n/**\n * Creates the effective status of a service: the worst of the own status and the effective status of each required dependency.\n * An optional dependency does not count. It is `undefined` outside `running`.\n */\nexport function createEffectiveStatus(input: EffectiveStatusInput): () => StatusValue | undefined {\n const { phase, instance, edges, resolutions } = input\n\n return computed<StatusValue | undefined>((previous) => {\n const current = instance()\n if (phase() !== 'running' || !current)\n return undefined\n\n let result: StatusValue = current.signals.own()\n for (const edge of edges) {\n if (edge.optional)\n continue\n\n const resolution = resolutions.get(edge.name)?.()\n if (resolution?.kind !== 'resolved')\n continue\n\n const dependency = resolution.provider.signals.effective()\n if (dependency && worseThan(dependency.status, result.status))\n result = { status: dependency.status, cause: causeOf(resolution.provider, dependency) }\n }\n\n return previous && sameStatus(previous, result) ? previous : result\n })\n}\n\n/** Reports a change of the effective status. The status effect of each service calls it. */\nexport function reportStatus(service: ServiceNode, next: StatusValue | undefined): void {\n const previous = service.reportedStatus\n service.reportedStatus = next\n if (!next || sameStatus(previous, next))\n return\n\n emitRecord(service.container, {\n type: 'status',\n key: service.name,\n owner: service.container.owner,\n instanceId: service.signals.instance()?.id,\n from: previous?.status,\n to: next.status,\n ...statusFields(next),\n })\n}\n","import type { DecisionKind } from '../../primitives/decision'\nimport type { OwnerRecord, ServiceMetadata, ServicePhase } from '../../types'\nimport type { BuildFunction, ContainerNode, DependencyEdge, InstanceNode, Policy, RegistrationNode, Resolution, ServiceKind, ServiceNode, SwapState, TransactionNode } from '../graph'\n\nimport { computed, effect, signal } from 'alien-signals'\n\nimport { createDeferred } from '../../helpers/deferred'\nimport { batch, untracked, withOwner } from '../../helpers/signals'\nimport { withoutUndefined } from '../../helpers/without-undefined'\nimport { emitRecord } from '../observers'\nimport { createRivals } from '../resolvers/exclusive'\nimport { resolveFallback } from '../resolvers/fallback'\nimport { resolvePlain } from '../resolvers/plain'\nimport { requiredWithdrawn } from '../resolvers/resolvers'\nimport { createEffectiveStatus, reportStatus } from '../status'\n\nexport interface PhaseDetails {\n readonly reason?: string\n readonly decision?: DecisionKind\n}\n\n/** Writes the phase and sends the change to the observe stream. */\nexport function setPhase(service: ServiceNode, to: ServicePhase, details: PhaseDetails = {}): void {\n const from = service.signals.phase()\n if (from === to)\n return\n\n batch(() => {\n service.signals.phase(to)\n if (service.kind === 'resolver')\n return\n\n emitRecord(service.container, {\n type: 'phase',\n key: service.name,\n owner: service.container.owner,\n instanceId: service.signals.instance()?.id,\n from,\n to,\n ...withoutUndefined({ reason: details.reason, decision: details.decision }),\n })\n })\n}\n\nfunction sameResolution(a: Resolution, b: Resolution): boolean {\n if (a.kind !== b.kind)\n return false\n\n switch (a.kind) {\n case 'missing':\n return true\n case 'not-running':\n case 'rejected':\n return 'provider' in b && a.provider === b.provider\n case 'conflict':\n return b.kind === 'conflict' && a.provider === b.provider && a.rivals === b.rivals\n case 'resolved':\n return b.kind === 'resolved' && a.provider === b.provider && a.instance === b.instance\n }\n}\n\n/** Creates the resolution of one declared edge. It keeps the previous value when nothing changed. */\nfunction resolveEdge(consumer: ServiceNode, edge: DependencyEdge): () => Resolution {\n return computed<Resolution>((previous) => {\n const next = edge.fallback ? resolveFallback(consumer, edge) : resolvePlain(consumer, edge)\n return previous && sameResolution(previous, next) ? previous : next\n })\n}\n\nexport interface CreateServiceInput {\n readonly container: ContainerNode\n readonly kind: ServiceKind\n readonly name: string\n readonly edges: readonly DependencyEdge[]\n readonly build: BuildFunction\n readonly metadata?: ServiceMetadata\n /** The retry and timeout options of the registration. An invocation has none. */\n readonly policy?: Policy\n readonly exclusive?: boolean\n readonly perConsumer?: boolean\n readonly template?: ServiceNode\n readonly consumer?: OwnerRecord\n readonly transaction?: TransactionNode\n readonly registration?: RegistrationNode\n /** Set for a new service that replaces another service after it completes `start`. */\n readonly swap?: SwapState\n /** The first phase. It defaults to `pending`. A transaction starts its services in `declared`. */\n readonly phase?: ServicePhase\n}\n\nconst emptyMetadata = Object.freeze({})\nconst emptyPolicy: Policy = Object.freeze({})\n\n/**\n * Creates a service with its signals, its derived values, and its effects.\n *\n * The main effect reads the derived values of the service and only marks the service dirty.\n * The status effect sends each change of the effective status to the observe stream.\n */\nexport function createService(input: CreateServiceInput): ServiceNode {\n const { container } = input\n const { runtime } = container\n const present = signal(true)\n const phase = signal<ServicePhase>(input.phase ?? 'pending')\n const instance = signal<InstanceNode | undefined>(undefined)\n // A resolver always converges. It exists only while its `resolve` call waits.\n const demanded = signal(input.kind === 'resolver')\n const resolutions = new Map<string, () => Resolution>()\n\n const effective = createEffectiveStatus({ phase, instance, edges: input.edges, resolutions })\n // The conflict reads the service, so it is created after the service object.\n let rivals: () => readonly ServiceNode[] = () => []\n\n const service: ServiceNode = {\n seq: runtime.nextSeq(),\n kind: input.kind,\n name: input.name,\n container,\n edges: input.edges,\n build: input.build,\n metadata: input.metadata ?? emptyMetadata,\n policy: input.policy ?? emptyPolicy,\n exclusive: input.exclusive ?? false,\n perConsumer: input.perConsumer ?? false,\n template: input.template,\n consumer: input.consumer,\n registration: input.registration,\n swap: input.swap,\n replacedBy: undefined,\n transaction: input.transaction,\n revision: 0,\n signals: {\n present,\n phase,\n instance,\n demanded,\n // Only a service with a key can be demanded. An invocation waits for `start()`.\n active: computed(() => container.signals.started() || (input.kind !== 'invocation' && demanded())),\n serving: computed(() => present() && phase() === 'running'),\n resolutions,\n effective,\n rivals: () => rivals(),\n consumers: signal<ReadonlyMap<ContainerNode, ServiceNode>>(new Map()),\n targetLost: computed(() => !present() || !service.signals.active() || service.signals.rivals().length > 0 || requiredWithdrawn(service)),\n },\n busy: false,\n stopIntent: {},\n parkedEpoch: undefined,\n failure: undefined,\n teardownErrors: [],\n withdrawal: createDeferred<readonly unknown[]>(),\n reportedStatus: undefined,\n disposeEffects: () => {},\n }\n\n for (const edge of input.edges)\n resolutions.set(edge.name, resolveEdge(service, edge))\n rivals = createRivals(service)\n\n const stopMain = withOwner(container.reactiveOwner, () => effect(() => {\n present()\n phase()\n service.signals.active()\n service.signals.rivals()\n instance()?.signals.holders()\n // A new service that waits to replace another one follows the old service.\n service.swap?.target.signals.present()\n for (const resolution of resolutions.values()) {\n const current = resolution()\n // A provider that is not running yet can still fail. A pending `resolve` call needs to see that.\n if (current.kind === 'not-running')\n current.provider.signals.phase()\n // A pending service waits for an available provider. A running one handles status changes.\n if (current.kind === 'resolved')\n current.provider.signals.effective()\n }\n\n runtime.reconciler.markDirty(service)\n }))\n\n const stopStatus = input.kind === 'resolver'\n ? () => {}\n : withOwner(container.reactiveOwner, () => effect(() => {\n const status = effective()\n // The report reads the instance. It must not track it.\n untracked(() => reportStatus(service, status))\n }))\n\n service.disposeEffects = () => {\n stopMain()\n stopStatus()\n }\n\n return service\n}\n","import type { ContainerNode, ServiceNode } from '../graph'\n\nimport { batch } from '../../helpers/signals'\nimport { publishService } from './container'\nimport { createService } from './service'\n\n/**\n * Returns the service of a `perConsumer` registration for one consumer container. It creates the service on first use.\n *\n * The service lives in the consumer container, so it disposes with that container. Its build context has the owner of the container as `consumer`.\n * It returns `undefined` when the registration is withdrawn or the container disposal started.\n */\nexport function ensureConsumerService(registration: ServiceNode, container: ContainerNode): ServiceNode | undefined {\n const existing = registration.signals.consumers().get(container)\n if (existing)\n return existing\n if (!registration.signals.present() || container.state !== 'active')\n return undefined\n\n let service: ServiceNode | undefined\n batch(() => {\n service = createService({\n container,\n kind: 'service',\n name: registration.name,\n edges: registration.edges,\n build: registration.build,\n metadata: registration.metadata,\n policy: registration.policy,\n exclusive: registration.exclusive,\n template: registration,\n consumer: container.owner,\n })\n container.services.add(service)\n publishService(service)\n })\n\n return service\n}\n","import type { OwnerRecord, ServiceStatus } from './service'\n\ndeclare const providedType: unique symbol\ndeclare const optionalType: unique symbol\ndeclare const fallbackType: unique symbol\ndeclare const conditionalType: unique symbol\n\nexport const optionalBrand: unique symbol = Symbol('injeca.optional')\nexport const fallbackBrand: unique symbol = Symbol('injeca.fallback')\nexport const conditionBrand: unique symbol = Symbol('injeca.condition')\n\nexport type DependencyMap = Record<string, any>\n\n/**\n * A typed identity for a service. `provide` and `defineKey` return one.\n */\nexport interface ProvidedKey<Key, T, _D extends DependencyMap | undefined> {\n key: Key\n /** `true` for a key from `defineKey(name, { exclusive: true })`. Only one provider can exist in its resolution area. */\n readonly exclusive?: boolean\n /** Carries the value type. It has no value at run time. */\n readonly [providedType]?: T\n}\n\n/** A key name, a key from `defineKey`, or the result of `provide`. */\nexport type KeyReference = string | ProvidedKey<string, unknown, DependencyMap | undefined>\n\nexport interface KeyOptions {\n /** Makes an exclusive key. Two or more providers in one resolution area all go to `conflict`. */\n readonly exclusive?: boolean\n}\n\n/** A frozen record on a registration. Resolution conditions and graph queries read it. */\nexport type ServiceMetadata = Readonly<Record<string, unknown>>\n\n/** The read-only information about a provider that a resolution condition gets. */\nexport interface ProviderInfo {\n /** The key name of the provider. */\n readonly key: string\n /** The owner record of the container of the provider. */\n readonly owner: OwnerRecord\n readonly metadata: ServiceMetadata\n}\n\n/** A resolution condition from `where`. It must be pure and synchronous. A thrown error counts as `false`. */\nexport type ResolutionCondition = (provider: ProviderInfo) => boolean\n\nexport type ProvidedBy<T> = string & { __providedType?: T }\n\n/** A dependency marker from `optional(key)`. A missing provider gives `undefined` and does not keep the dependent `pending`. */\nexport interface OptionalDependency<T> {\n readonly [optionalBrand]: true\n /** The names of the keys, in order. More than one name comes from `optional(firstAvailable(...))`. */\n readonly dependencies: readonly string[]\n /** The resolution condition from `where`, when the marker has one. */\n readonly condition?: ResolutionCondition\n /** Carries the value type. It has no value at run time. */\n readonly [optionalType]?: T\n}\n\n/** A required dependency marker from `where(key, condition)`. A provider that the condition rejects does not resolve. */\nexport interface ConditionalDependency<T> {\n readonly [conditionBrand]: true\n /** The name of the key. */\n readonly dependencies: readonly string[]\n readonly condition: ResolutionCondition\n /** Carries the value type. It has no value at run time. */\n readonly [conditionalType]?: T\n}\n\n/** A fallback dependency marker from `firstAvailable(...keys)`. It resolves to the first available provider in the list. */\nexport interface FallbackDependency<T> {\n readonly [fallbackBrand]: true\n /** The names of the keys, in order of preference. */\n readonly dependencies: readonly string[]\n /** Carries the value type. It has no value at run time. */\n readonly [fallbackType]?: T\n}\n\n/** One value of a `dependsOn` declaration: a name, a key, an optional marker, a fallback marker, or a condition marker. */\nexport type DependencyDeclaration = string | ProvidedKey<string, unknown, DependencyMap | undefined> | OptionalDependency<unknown> | FallbackDependency<unknown> | ConditionalDependency<unknown>\n\nexport type DependencyDeclarations = Record<string, DependencyDeclaration>\n\n/** The resolved value of an optional dependency. */\nexport interface OptionalValue<T> {\n readonly value: T\n readonly status: ServiceStatus\n}\n\nexport type InferProvided<T>\n = T extends ProvidedKey<any, infer P, any>\n ? P\n : T extends ProvidedBy<infer P>\n ? P\n : never\n\n/** A required dependency is its value. An optional dependency is `{ value, status }` or `undefined`. */\nexport type ResolveDependencyDeclaration<Deps extends DependencyDeclarations> = {\n [K in keyof Deps]: Deps[K] extends OptionalDependency<infer T>\n ? OptionalValue<T> | undefined\n : Deps[K] extends FallbackDependency<infer T>\n ? T\n : Deps[K] extends ConditionalDependency<infer T>\n ? T\n : Deps[K] extends ProvidedKey<any, infer T, any>\n ? T\n : Deps[K] extends ProvidedBy<infer T>\n ? T\n : any\n}\n","import type { ConditionalDependency, DependencyMap, FallbackDependency, InferProvided, KeyOptions, OptionalDependency, ProvidedBy, ProvidedKey, ResolutionCondition } from '../types'\n\nimport { InvalidArgumentError } from '../diagnostics/errors'\nimport { conditionBrand, fallbackBrand, optionalBrand } from '../types'\n\ntype KeyLike<T = unknown> = ProvidedKey<string, T, DependencyMap | undefined> | ProvidedBy<T>\n\nfunction assertName(name: unknown): asserts name is string {\n if (typeof name !== 'string' || name.length === 0 || name.trim() !== name)\n throw new InvalidArgumentError(`A key name must be a non-empty string without outer whitespace. Got ${JSON.stringify(name)}.`)\n}\n\nfunction readKeyOptions(options: unknown): boolean {\n if (options === undefined)\n return false\n if (typeof options !== 'object' || options === null)\n throw new InvalidArgumentError('The options of defineKey must be an object.')\n\n let exclusive: unknown\n try {\n exclusive = (options as KeyOptions).exclusive\n }\n catch (error) {\n throw new InvalidArgumentError('Cannot read the options of defineKey.', { cause: error })\n }\n if (exclusive !== undefined && typeof exclusive !== 'boolean')\n throw new InvalidArgumentError('The exclusive option of defineKey must be a boolean.')\n\n return exclusive === true\n}\n\n/**\n * Creates a typed key without a provider. A consumer can depend on it now. `provide(key, ...)` registers a provider later.\n *\n * With `options.exclusive`, the key can have only one provider in its resolution area. Two or more providers all go to `conflict`.\n */\nexport function defineKey<T>(name: string, options?: KeyOptions): ProvidedKey<string, T, undefined> {\n assertName(name)\n return readKeyOptions(options) ? Object.freeze({ key: name, exclusive: true }) : Object.freeze({ key: name })\n}\n\n/** Tells whether a key from `provide` or `defineKey` is exclusive. A name is not. Reading a caller-owned property happens once, inside a narrow `try`. */\nexport function isExclusiveKey(key: unknown): boolean {\n if (typeof key !== 'object' || key === null)\n return false\n\n try {\n return (key as KeyOptions).exclusive === true\n }\n catch (error) {\n throw new InvalidArgumentError('Cannot read the exclusive property of the key.', { cause: error })\n }\n}\n\nexport function normalizeName(nameOrProvidedKey: string | ProvidedKey<any, any, any>): string {\n if (typeof nameOrProvidedKey === 'object' && nameOrProvidedKey !== null && 'key' in nameOrProvidedKey) {\n return (nameOrProvidedKey as ProvidedKey<any, any, any>).key as string\n }\n\n return nameOrProvidedKey as string\n}\n\nconst optionalMarkers = new WeakSet<object>()\nconst fallbackMarkers = new WeakSet<object>()\nconst conditionMarkers = new WeakSet<object>()\n\nexport function isConditionalDependency(value: unknown): value is ConditionalDependency<unknown> {\n return typeof value === 'object' && value !== null && conditionMarkers.has(value)\n}\n\nexport function isFallbackDependency(value: unknown): value is FallbackDependency<unknown> {\n return typeof value === 'object' && value !== null && fallbackMarkers.has(value)\n}\n\n/**\n * Marks a fallback dependency. It resolves to the first provider in the list whose effective status is available.\n *\n * A change of the selection is a change of identity: the dependent gets `dependency-change`.\n * It is required, unless it is wrapped in `optional()`.\n */\nexport function firstAvailable<const Keys extends readonly KeyLike[]>(...keys: Keys): FallbackDependency<InferProvided<Keys[number]>> {\n if (keys.length === 0)\n throw new InvalidArgumentError('firstAvailable() needs at least one key.')\n\n const dependencies = keys.map((key) => {\n const name = normalizeName(key)\n assertName(name)\n return name\n })\n if (new Set(dependencies).size !== dependencies.length)\n throw new InvalidArgumentError(`firstAvailable() got the same key more than once: ${dependencies.join(', ')}.`)\n\n const marker: FallbackDependency<InferProvided<Keys[number]>> = Object.freeze({ [fallbackBrand]: true as const, dependencies: Object.freeze(dependencies) })\n fallbackMarkers.add(marker)\n\n return marker\n}\n\nfunction optionalMarker<T>(dependencies: readonly string[], condition: ResolutionCondition | undefined): OptionalDependency<T> {\n const marker: OptionalDependency<T> = Object.freeze({ [optionalBrand]: true as const, dependencies, ...(condition ? { condition } : {}) })\n optionalMarkers.add(marker)\n\n return marker\n}\n\n/**\n * Marks an optional dependency. The dependent gets `{ value, status }`, or `undefined` when no provider runs.\n * It also accepts a `firstAvailable` marker and a `where` marker.\n */\nexport function optional<T>(dependency: KeyLike<T> | FallbackDependency<T> | ConditionalDependency<T>): OptionalDependency<T> {\n if (isFallbackDependency(dependency))\n return optionalMarker(dependency.dependencies, undefined)\n if (isConditionalDependency(dependency))\n return optionalMarker(dependency.dependencies, dependency.condition)\n\n const name = normalizeName(dependency as KeyLike<T>)\n assertName(name)\n return optionalMarker(Object.freeze([name]), undefined)\n}\n\n/**\n * Adds a resolution condition to a dependency. The condition gets the key, the owner, and the metadata of the provider.\n *\n * If it returns `false`, the dependency does not resolve. A required dependency keeps the dependent `pending`. An optional one is `undefined`.\n * The condition must be pure and synchronous. A thrown error counts as `false` and goes to the observe stream.\n * Wrap the result in `optional()`, or pass an `optional()` marker, to combine the two.\n */\nexport function where<T>(dependency: OptionalDependency<T>, condition: ResolutionCondition): OptionalDependency<T>\nexport function where<T>(dependency: KeyLike<T>, condition: ResolutionCondition): ConditionalDependency<T>\nexport function where<T>(dependency: KeyLike<T> | OptionalDependency<T>, condition: ResolutionCondition): ConditionalDependency<T> | OptionalDependency<T> {\n if (typeof condition !== 'function')\n throw new InvalidArgumentError('The condition of where() is not a function.')\n if (isOptionalDependency(dependency)) {\n if (dependency.condition)\n throw new InvalidArgumentError('The optional dependency already has a condition.')\n return optionalMarker<T>(dependency.dependencies, condition)\n }\n if (isFallbackDependency(dependency) || isConditionalDependency(dependency))\n throw new InvalidArgumentError('where() accepts a key, a name, or an optional() marker.')\n\n const name = normalizeName(dependency as KeyLike<T>)\n assertName(name)\n const marker: ConditionalDependency<T> = Object.freeze({ [conditionBrand]: true as const, dependencies: Object.freeze([name]), condition })\n conditionMarkers.add(marker)\n\n return marker\n}\n\nexport function isOptionalDependency(value: unknown): value is OptionalDependency<unknown> {\n return typeof value === 'object' && value !== null && optionalMarkers.has(value)\n}\n","import type { ProvidedKey, ResolutionCondition } from '../../types'\nimport type { DependencyEdge } from '../graph'\n\nimport { InvalidArgumentError } from '../../diagnostics/errors'\nimport { isConditionalDependency, isFallbackDependency, isOptionalDependency, normalizeName } from '../../primitives/keys'\n\nfunction edgeOf(name: string, candidates: readonly string[], optional: boolean, fallback: boolean, condition?: ResolutionCondition): DependencyEdge {\n return Object.freeze({ name, keyName: candidates.join(' | '), candidates, optional, fallback, ...(condition ? { condition } : {}) })\n}\n\n/**\n * Reads a `dependsOn` declaration into edges. Reading a caller-owned property happens once, inside a narrow `try`.\n */\nexport function readEdges(owner: string, dependsOn: unknown): readonly DependencyEdge[] {\n if (dependsOn === undefined || dependsOn === null)\n return Object.freeze([])\n if (typeof dependsOn !== 'object')\n throw new InvalidArgumentError(`The dependsOn option of '${owner}' is not an object.`)\n\n let entries: [string, unknown][]\n try {\n entries = Object.entries(dependsOn)\n }\n catch (error) {\n throw new InvalidArgumentError(`Cannot read the dependsOn option of '${owner}'.`, { cause: error })\n }\n\n return Object.freeze(entries.map(([name, dependency]): DependencyEdge => {\n if (isOptionalDependency(dependency))\n return edgeOf(name, dependency.dependencies, true, dependency.dependencies.length > 1, dependency.condition)\n if (isConditionalDependency(dependency))\n return edgeOf(name, dependency.dependencies, false, false, dependency.condition)\n if (isFallbackDependency(dependency))\n return edgeOf(name, dependency.dependencies, false, true)\n if (typeof dependency === 'string' || (typeof dependency === 'object' && dependency !== null && 'key' in dependency)) {\n const keyName = normalizeName(dependency as string | ProvidedKey<string, unknown, undefined>)\n if (typeof keyName === 'string' && keyName.length > 0)\n return edgeOf(name, Object.freeze([keyName]), false, false)\n }\n\n throw new InvalidArgumentError(`The dependency '${name}' of '${owner}' is not a name, a key, an optional marker, a fallback marker, or a condition marker.`)\n }))\n}\n","import type { TimeoutHandler } from '../../types'\nimport type { ContainerNode, Policy, ServiceNode } from '../graph'\n\nimport { InvalidArgumentError } from '../../diagnostics/errors'\n\nconst emptyPolicy: Policy = Object.freeze({})\n\n/** The policy option fields as read from the caller, before the checks. */\nexport interface PolicyFields {\n readonly maxAttempts: unknown\n readonly timeouts: unknown\n readonly onTimeout: unknown\n}\n\nfunction readMaxAttempts(owner: string, value: unknown): number | undefined {\n if (value !== undefined && (typeof value !== 'number' || !Number.isInteger(value) || value < 1))\n throw new InvalidArgumentError(`The maxAttempts option of ${owner} must be an integer of 1 or more. Got ${String(value)}.`)\n\n return value\n}\n\nfunction readTimeout(owner: string, hook: 'start' | 'stop', value: unknown): number | undefined {\n if (value !== undefined && (typeof value !== 'number' || !Number.isFinite(value) || value < 0))\n throw new InvalidArgumentError(`The timeouts.${hook} option of ${owner} must be a finite number of 0 or more. Got ${String(value)}.`)\n\n return value\n}\n\nfunction readTimeouts(owner: string, value: unknown): Policy['timeouts'] {\n if (value === undefined)\n return undefined\n if (typeof value !== 'object' || value === null)\n throw new InvalidArgumentError(`The timeouts option of ${owner} must be an object.`)\n\n let fields: { start: unknown, stop: unknown }\n try {\n const source = value as Record<string, unknown>\n fields = { start: source.start, stop: source.stop }\n }\n catch (error) {\n throw new InvalidArgumentError(`Cannot read the timeouts option of ${owner}.`, { cause: error })\n }\n\n const start = readTimeout(owner, 'start', fields.start)\n const stop = readTimeout(owner, 'stop', fields.stop)\n return Object.freeze({ ...(start === undefined ? {} : { start }), ...(stop === undefined ? {} : { stop }) })\n}\n\n/**\n * Checks the retry and timeout options that a caller gave. `owner` names the caller in the messages, for example `'voice.speech'`.\n * A field that is `undefined` takes the value of `inherit`, so that a replacement keeps it.\n */\nexport function readPolicy(owner: string, fields: PolicyFields, inherit?: Policy): Policy {\n const maxAttempts = readMaxAttempts(owner, fields.maxAttempts) ?? inherit?.maxAttempts\n const timeouts = readTimeouts(owner, fields.timeouts) ?? inherit?.timeouts\n if (fields.onTimeout !== undefined && typeof fields.onTimeout !== 'function')\n throw new InvalidArgumentError(`The onTimeout option of ${owner} must be a function.`)\n const onTimeout = (fields.onTimeout as TimeoutHandler | undefined) ?? inherit?.onTimeout\n\n if (maxAttempts === undefined && timeouts === undefined && onTimeout === undefined)\n return emptyPolicy\n\n return Object.freeze({\n ...(maxAttempts === undefined ? {} : { maxAttempts }),\n ...(timeouts === undefined ? {} : { timeouts }),\n ...(onTimeout === undefined ? {} : { onTimeout }),\n })\n}\n\n/** The value of the nearest container, from `container` up to the root, that sets it. */\nfunction fromContainers<T>(container: ContainerNode | undefined, pick: (policy: Policy) => T | undefined): T | undefined {\n for (let current = container; current; current = current.parent) {\n const value = pick(current.policy)\n if (value !== undefined)\n return value\n }\n\n return undefined\n}\n\n/** The attempt limit of a requeue: the decision, then the service, then the containers. `undefined` means no limit. */\nexport function maxAttemptsOf(service: ServiceNode, fromDecision: number | undefined): number | undefined {\n return fromDecision ?? service.policy.maxAttempts ?? fromContainers(service.container, policy => policy.maxAttempts)\n}\n\n/** The timeout of a hook: the service, then the containers. `undefined` means no timeout. */\nexport function timeoutOf(service: ServiceNode, hook: 'start' | 'stop'): number | undefined {\n return service.policy.timeouts?.[hook] ?? fromContainers(service.container, policy => policy.timeouts?.[hook])\n}\n\n/** The `onTimeout` handler: the service, then the containers. */\nexport function timeoutHandlerOf(service: ServiceNode): TimeoutHandler | undefined {\n return service.policy.onTimeout ?? fromContainers(service.container, policy => policy.onTimeout)\n}\n","import type { ServiceMetadata } from '../../types'\nimport type { BuildFunction, Policy, ServiceDefinition } from '../graph'\n\nimport { InvalidArgumentError } from '../../diagnostics/errors'\nimport { readEdges } from './edge'\nimport { readPolicy } from './policy'\n\nconst emptyMetadata: ServiceMetadata = Object.freeze({})\n\nfunction readMetadata(name: string, metadata: unknown, fallback: ServiceMetadata | undefined): ServiceMetadata {\n if (metadata === undefined)\n return fallback ?? emptyMetadata\n if (typeof metadata !== 'object' || metadata === null || Array.isArray(metadata))\n throw new InvalidArgumentError(`The metadata option of '${name}' must be a record.`)\n\n try {\n return Object.freeze({ ...metadata })\n }\n catch (error) {\n throw new InvalidArgumentError(`Cannot read the metadata option of '${name}'.`, { cause: error })\n }\n}\n\n/**\n * Reads the options of one registration once: the function shorthand, or the object form.\n * Reading caller-owned properties happens inside a narrow `try`. `inherit` gives the metadata and each policy field when the options have none.\n */\nexport function readDefinition(name: string, option: unknown, inherit?: { readonly metadata: ServiceMetadata, readonly policy: Policy }): ServiceDefinition {\n let build: unknown\n let dependsOn: unknown\n let metadata: unknown\n let perConsumer: unknown\n let policy: { maxAttempts: unknown, timeouts: unknown, onTimeout: unknown }\n try {\n const object: { build?: unknown, dependsOn?: unknown, metadata?: unknown, perConsumer?: unknown, maxAttempts?: unknown, timeouts?: unknown, onTimeout?: unknown } = typeof option === 'function'\n ? { build: option }\n : typeof option === 'object' && option !== null ? option : {}\n build = object.build\n dependsOn = object.dependsOn\n metadata = object.metadata\n perConsumer = object.perConsumer\n policy = { maxAttempts: object.maxAttempts, timeouts: object.timeouts, onTimeout: object.onTimeout }\n }\n catch (error) {\n throw new InvalidArgumentError(`Cannot read the provide options of '${name}'.`, { cause: error })\n }\n if (typeof build !== 'function')\n throw new InvalidArgumentError(`The build option of '${name}' is not a function.`)\n if (perConsumer !== undefined && typeof perConsumer !== 'boolean')\n throw new InvalidArgumentError(`The perConsumer option of '${name}' must be a boolean.`)\n\n return {\n edges: readEdges(name, dependsOn),\n build: build as BuildFunction,\n metadata: readMetadata(name, metadata, inherit?.metadata),\n perConsumer: perConsumer === true,\n policy: readPolicy(`'${name}'`, policy, inherit?.policy),\n }\n}\n","import type { ContainerNode, RegistrationNode, ServiceNode } from '../graph'\n\nimport { batch, untracked } from '../../helpers/signals'\nimport { awaitWithdrawal, releaseService } from './container'\n\nexport function createRegistration(container: ContainerNode, name: string, exclusive: boolean): RegistrationNode {\n return { container, name, exclusive, current: undefined, pending: undefined }\n}\n\n/**\n * The published service of a registration that is still current, or `undefined` for a stale registration.\n * A registration is stale after its own withdrawal, or after a newer `provide` of the same key in the same container.\n */\nexport function currentService(registration: RegistrationNode): ServiceNode | undefined {\n const service = registration.current\n return service?.signals.present() ? service : undefined\n}\n\n/** Cancels the replacement that waits for its swap. The old service does not change. */\nexport function cancelPending(registration: RegistrationNode): void {\n const pending = registration.pending\n if (!pending)\n return\n\n registration.pending = undefined\n pending.swap?.settle({ kind: 'cancelled' })\n releaseService(pending)\n}\n\n/** The `withdraw()` of a registration. Resolves `false` for a stale registration. Rejects with the teardown errors. */\nexport async function withdrawRegistration(registration: RegistrationNode): Promise<boolean> {\n const service = untracked(() => {\n const current = currentService(registration)\n if (current) {\n batch(() => {\n cancelPending(registration)\n releaseService(current)\n })\n }\n\n return current\n })\n if (!service)\n return false\n\n await awaitWithdrawal(service)\n return true\n}\n","/**\n * One frame of a container cleanup chain. A frame stays active until the disposal of its container settles.\n */\nexport interface CleanupFrame {\n readonly owner: object\n readonly parent: CleanupFrame | undefined\n active: boolean\n}\n\n/**\n * Tracks the active cleanup frames of synchronous calls.\n */\nexport interface CleanupContext {\n current: () => CleanupFrame | undefined\n /** Runs `fn` inside `frame`. Without a frame, runs `fn` outside all frames. */\n run: <T>(frame: CleanupFrame | undefined, fn: () => T) => T\n /** Tells whether the current call descends from the active cleanup of `owner`. */\n isActive: (owner: object) => boolean\n}\n\nfunction activeIn(frame: CleanupFrame | undefined, owner: object): boolean {\n for (let current = frame; current; current = current.parent) {\n if (current.active && current.owner === owner)\n return true\n }\n\n return false\n}\n\n// This context sees only the synchronous part of each cleanup callback, in every runtime.\n// A cleanup must not await the disposal of its own container or of an ancestor.\n// injeca does not detect that case after an `await`. A configured stop timeout ends it.\nfunction createSynchronousContext(): CleanupContext {\n let currentFrame: CleanupFrame | undefined\n\n return {\n current: () => currentFrame,\n run: (frame, fn) => {\n const previous = currentFrame\n currentFrame = frame\n try {\n return fn()\n }\n finally {\n currentFrame = previous\n }\n },\n isActive: owner => activeIn(currentFrame, owner),\n }\n}\n\nexport function createCleanupContext(): CleanupContext {\n return createSynchronousContext()\n}\n","/**\n * The time source of a container. Pass a custom clock to control time in tests.\n *\n * The reconciler uses it for requeue delays and hook timeouts. The work queue does not use it. It drains on microtasks.\n */\nexport interface Clock {\n now: () => number\n /** Calls `callback` after `ms` milliseconds. Returns a function that cancels the call. */\n setTimeout: (callback: () => void, ms: number) => () => void\n}\n\nexport const systemClock: Clock = Object.freeze({\n now: () => Date.now(),\n setTimeout: (callback: () => void, ms: number) => {\n const handle = globalThis.setTimeout(callback, ms)\n return () => globalThis.clearTimeout(handle)\n },\n})\n","import { untracked } from './signals'\n\n/** One callback call in the queue. An error from `run` goes to `onError`. */\nexport interface Delivery {\n readonly run: () => void\n readonly onError: (error: unknown) => void\n}\n\n/**\n * Runs callback calls in FIFO order.\n *\n * A delivery that a callback causes does not run inside that callback. It waits in the queue. So the deliveries of one source arrive in order.\n */\nexport interface DeliveryQueue {\n /** Runs `deliveries` in order, after the deliveries that are already in the queue. */\n readonly deliver: (deliveries: readonly Delivery[]) => void\n}\n\nexport function createDeliveryQueue(): DeliveryQueue {\n const queue: Delivery[] = []\n let draining = false\n\n function deliver(deliveries: readonly Delivery[]): void {\n queue.push(...deliveries)\n if (draining)\n return\n\n draining = true\n try {\n // Each delivery calls a user callback. It is an entry point.\n while (queue.length > 0) {\n const { run, onError } = queue.shift()!\n untracked(() => {\n try {\n run()\n }\n catch (error) {\n onError(error)\n }\n })\n }\n }\n finally {\n draining = false\n }\n }\n\n return { deliver }\n}\n","import type { InstanceNode, RawBuildContext, RawHookHandler, ServiceNode, StatusValue } from '../graph/graph'\nimport type { ServiceHook } from '../primitives/decision'\nimport type { EffectSetup, OwnerRecord, ServiceStatus, StatusCause } from '../types'\n\nimport { BuildAfterDisposeError, HookOutsideBuildError, InvalidArgumentError } from '../diagnostics/errors'\nimport { emitRecord } from '../graph/observers'\nimport { sameStatus } from '../graph/status'\nimport { untracked } from '../helpers/signals'\nimport { withoutUndefined } from '../helpers/without-undefined'\n\nconst serviceHooks: ReadonlySet<string> = new Set<ServiceHook>(['start', 'stop', 'dependency-change', 'dependency-status-change'])\nconst statuses: ReadonlySet<string> = new Set<ServiceStatus>(['ready', 'degraded', 'unavailable'])\n\n/** A cause chain longer than this is cut. It protects against a cyclic cause object. */\nconst maxCauseDepth = 32\n\nfunction readOwner(value: unknown): OwnerRecord {\n try {\n const copy: unknown = structuredClone(value)\n if (typeof copy === 'object' && copy !== null && !Array.isArray(copy))\n return Object.freeze(copy as OwnerRecord)\n }\n catch (error) {\n throw new InvalidArgumentError('The owner of a status cause must be a serializable record.', { cause: error })\n }\n\n throw new InvalidArgumentError('The owner of a status cause must be a serializable record.')\n}\n\nfunction readStatusValue(value: unknown, what: string): ServiceStatus {\n if (typeof value !== 'string' || !statuses.has(value))\n throw new InvalidArgumentError(`${what} must be 'ready', 'degraded', or 'unavailable'. Got ${String(value)}.`)\n\n return value as ServiceStatus\n}\n\nfunction readReason(value: unknown, what: string): string | undefined {\n if (value !== undefined && typeof value !== 'string')\n throw new InvalidArgumentError(`${what} must be a string.`)\n\n return value\n}\n\n/** Reads a caller-owned cause chain once, into frozen records. */\nfunction readCause(value: unknown, depth = 0): StatusCause | undefined {\n if (value === undefined || depth >= maxCauseDepth)\n return undefined\n if (typeof value !== 'object' || value === null)\n throw new InvalidArgumentError('A status cause must be an object with key, owner, and status.')\n\n let fields: { key: unknown, owner: unknown, status: unknown, reason: unknown, cause: unknown }\n try {\n const source = value as Record<string, unknown>\n fields = { key: source.key, owner: source.owner, status: source.status, reason: source.reason, cause: source.cause }\n }\n catch (error) {\n throw new InvalidArgumentError('Cannot read the status cause.', { cause: error })\n }\n if (typeof fields.key !== 'string' || fields.key.length === 0)\n throw new InvalidArgumentError('The key of a status cause must be a non-empty string.')\n\n const reason = readReason(fields.reason, 'The reason of a status cause')\n const cause = readCause(fields.cause, depth + 1)\n\n return Object.freeze({\n key: fields.key,\n owner: readOwner(fields.owner ?? {}),\n status: readStatusValue(fields.status, 'The status of a status cause'),\n ...withoutUndefined({ reason, cause }),\n })\n}\n\n/** Reads the arguments of `setStatus` once. */\nfunction readOwnStatus(service: ServiceNode, status: unknown, reasonOrOptions: unknown): StatusValue {\n const checked = readStatusValue(status, `The status of '${service.name}'`)\n if (reasonOrOptions === undefined || typeof reasonOrOptions === 'string')\n return Object.freeze({ status: checked, ...withoutUndefined({ reason: reasonOrOptions }) })\n if (typeof reasonOrOptions !== 'object' || reasonOrOptions === null)\n throw new InvalidArgumentError(`The second argument of setStatus for '${service.name}' must be a string or an object.`)\n\n let fields: { reason: unknown, cause: unknown }\n try {\n const options = reasonOrOptions as Record<string, unknown>\n fields = { reason: options.reason, cause: options.cause }\n }\n catch (error) {\n throw new InvalidArgumentError(`Cannot read the setStatus options of '${service.name}'.`, { cause: error })\n }\n\n const reason = readReason(fields.reason, `The setStatus reason of '${service.name}'`)\n const cause = readCause(fields.cause)\n\n return Object.freeze({\n status: checked,\n ...withoutUndefined({ reason, cause }),\n })\n}\n\n/** Creates the context that `build` gets. `on` is valid only while the build runs. `setStatus` stays valid after it. */\nexport function createBuildContext(service: ServiceNode, instance: InstanceNode): RawBuildContext {\n const dependsOn: Record<string, unknown> = {}\n for (const edge of service.edges) {\n const binding = instance.bindings.get(edge.name)\n const state = instance.handled.get(edge.name)\n dependsOn[edge.name] = edge.optional\n ? (binding && state ? Object.freeze({ value: binding.value, status: state.status }) : undefined)\n : binding?.value\n }\n\n return Object.freeze({\n container: service.container.api,\n name: service.name,\n instanceId: instance.id,\n ...withoutUndefined({ consumer: service.consumer }),\n dependsOn: Object.freeze(dependsOn),\n on: (hook: unknown, handler: RawHookHandler) => {\n if (!instance.building)\n throw new HookOutsideBuildError(`'on' was called for '${service.name}' after its build settled.`)\n if (typeof hook !== 'string' || !serviceHooks.has(hook))\n throw new InvalidArgumentError(`'${String(hook)}' is not a service hook.`)\n if (typeof handler !== 'function')\n throw new InvalidArgumentError(`The '${hook}' handler of '${service.name}' is not a function.`)\n\n instance.hooks[hook as ServiceHook].push(handler)\n },\n effect: (setup: EffectSetup) => {\n if (instance.disposed)\n throw new BuildAfterDisposeError(`'effect' was called for '${service.name}' after its instance was disposed.`)\n if (typeof setup !== 'function')\n throw new InvalidArgumentError(`The effect setup of '${service.name}' is not a function.`)\n\n // The setup is a user callback.\n const disposer = untracked(setup)\n if (typeof disposer === 'function')\n instance.effects.push(disposer)\n },\n signal: instance.controller.signal,\n // `setStatus` stays valid after `build`, so it is an entry point.\n setStatus: (status: unknown, reasonOrOptions?: unknown) => untracked(() => {\n const next = readOwnStatus(service, status, reasonOrOptions)\n if (instance.disposed) {\n emitRecord(service.container, {\n type: 'ignored',\n call: 'setStatus',\n key: service.name,\n owner: service.container.owner,\n instanceId: instance.id,\n reason: `setStatus('${next.status}') was called after the instance was disposed.`,\n })\n return\n }\n if (!sameStatus(instance.signals.own(), next))\n instance.signals.own(next)\n }),\n })\n}\n","import type { ServiceNode } from '../graph/graph'\n\nimport { untracked } from '../helpers/signals'\n\n/** Calls a user callback with tracking paused. A synchronous throw becomes a rejection. */\nexport function invokeUser<T>(fn: () => T | Promise<T>): Promise<T> {\n try {\n return Promise.resolve(untracked(fn))\n }\n catch (error) {\n return Promise.reject(error)\n }\n}\n\n/** Only services with a key write to the logger. Invocations and resolvers do not. */\nexport function loggerOf(service: ServiceNode) {\n return service.kind === 'service' ? service.container.api.logger : undefined\n}\n\nexport function callListeners<A extends unknown[]>(listeners: ReadonlySet<(...args: A) => void>, ...args: A): void {\n for (const listener of [...listeners]) {\n try {\n listener(...args)\n }\n catch (error) {\n // A listener error does not stop the reconciler. Report it outside the current call stack.\n queueMicrotask(() => {\n throw error\n })\n }\n }\n}\n","import type { InstanceNode, ServiceNode } from '../graph/graph'\n\nimport { batch } from '../helpers/signals'\n\nfunction addHolder(provider: InstanceNode, holder: ServiceNode): void {\n const holders = provider.signals.holders()\n if (!holders.has(holder))\n provider.signals.holders(new Set([...holders, holder]))\n}\n\nfunction removeHolder(provider: InstanceNode, holder: ServiceNode): void {\n const holders = provider.signals.holders()\n if (holders.has(holder))\n provider.signals.holders(new Set([...holders].filter(service => service !== holder)))\n}\n\n/** Registers `service` as a holder of each bound instance and of each extra hold, and releases the rest. */\nexport function syncHolds(service: ServiceNode, instance: InstanceNode): void {\n const wanted = new Set([...instance.bindings.values(), ...instance.extraHolds])\n for (const provider of [...instance.held]) {\n if (!wanted.has(provider)) {\n removeHolder(provider, service)\n instance.held.delete(provider)\n }\n }\n for (const provider of wanted) {\n if (!instance.held.has(provider)) {\n addHolder(provider, service)\n instance.held.add(provider)\n }\n }\n}\n\nexport function releaseExtraHolds(service: ServiceNode, instance: InstanceNode): void {\n instance.extraHolds.clear()\n batch(() => syncHolds(service, instance))\n}\n","import type { InstanceNode, ServiceNode } from '../graph/graph'\nimport type { DependencyChange, DependencyState } from '../types'\n\nimport { resolutionOf } from '../graph/resolvers/resolvers'\nimport { batch } from '../helpers/signals'\nimport { syncHolds } from './holds'\n\n/** One dependency of the current snapshot: its state for the handler, and the instance that a binding holds. */\nexport interface SnapshotEntry {\n readonly state: DependencyState\n readonly instance: InstanceNode\n}\n\nexport type Snapshot = ReadonlyMap<string, SnapshotEntry | undefined>\n\n/** The current snapshot of all dependencies. */\nexport function currentSnapshot(service: ServiceNode): Map<string, SnapshotEntry | undefined> {\n const snapshot = new Map<string, SnapshotEntry | undefined>()\n for (const edge of service.edges) {\n const resolution = resolutionOf(service, edge)\n snapshot.set(edge.name, resolution.kind === 'resolved'\n ? {\n state: Object.freeze({\n provider: resolution.provider.name,\n instanceId: resolution.instance.id,\n status: resolution.provider.signals.effective()?.status ?? 'unavailable',\n }),\n instance: resolution.instance,\n }\n : undefined)\n }\n\n return snapshot\n}\n\n/** The difference between the last handled snapshot and `snapshot`. An identity change wins over a status change. */\nexport function diffSnapshot(service: ServiceNode, handled: InstanceNode['handled'], snapshot: Snapshot): DependencyChange[] {\n const changes: DependencyChange[] = []\n for (const edge of service.edges) {\n const from = handled.get(edge.name)\n const to = snapshot.get(edge.name)?.state\n if (from?.instanceId !== to?.instanceId || (from && to && from.status !== to.status))\n changes.push(Object.freeze({ key: edge.name, from, to }))\n }\n\n return changes\n}\n\nexport function isIdentityChange(change: DependencyChange): boolean {\n return change.from?.instanceId !== change.to?.instanceId\n}\n\nexport function describeChanges(changes: readonly DependencyChange[]): string {\n return changes\n .map(change => `${change.key}: ${change.from ? `${change.from.instanceId}/${change.from.status}` : '-'} -> ${change.to ? `${change.to.instanceId}/${change.to.status}` : '-'}`)\n .join(', ')\n}\n\nexport function hookDependsOn(service: ServiceNode, snapshot: Snapshot): Readonly<Record<string, unknown>> {\n const dependsOn: Record<string, unknown> = {}\n for (const edge of service.edges) {\n const entry = snapshot.get(edge.name)\n dependsOn[edge.name] = entry ? Object.freeze({ ...entry.state, value: entry.instance.value }) : undefined\n }\n\n return Object.freeze(dependsOn)\n}\n\n/** Marks `snapshot` as handled and moves the bindings to its instances. */\nexport function acceptSnapshot(service: ServiceNode, instance: InstanceNode, snapshot: Snapshot): void {\n instance.extraHolds.clear()\n instance.handled = new Map([...snapshot].map(([name, entry]) => [name, entry?.state]))\n instance.bindings.clear()\n for (const [name, entry] of snapshot) {\n if (entry)\n instance.bindings.set(name, entry.instance)\n }\n batch(() => syncHolds(service, instance))\n}\n","import type { Clock } from './clock'\n\nimport { untracked } from './signals'\n\n/** The result of `raceTimeout`: the value of the promise, or `timeout` when the time passed first. */\nexport type TimedResult<T> = { readonly kind: 'settled', readonly value: T } | { readonly kind: 'timeout' }\n\n/**\n * Waits for `promise` until `ms` milliseconds of `clock` pass.\n *\n * A rejection of `promise` before the timeout rejects the result. After the timeout, nothing waits for `promise`, and its rejection is not reported.\n */\nexport function raceTimeout<T>(clock: Clock, promise: Promise<T>, ms: number): Promise<TimedResult<T>> {\n return new Promise((resolve, reject) => {\n let done = false\n // The timer callback is an entry point.\n const cancel = clock.setTimeout(() => untracked(() => {\n if (done)\n return\n\n done = true\n promise.catch(() => {})\n resolve({ kind: 'timeout' })\n }), ms)\n promise.then(\n (value) => {\n if (done)\n return\n\n done = true\n cancel()\n resolve({ kind: 'settled', value })\n },\n (error: unknown) => {\n if (done)\n return\n\n done = true\n cancel()\n reject(error)\n },\n )\n })\n}\n","import type { HookState, InstanceNode, RawHookHandler, ServiceNode } from '../graph/graph'\nimport type { Decision, HookRun, ServiceHook } from '../primitives/decision'\nimport type { TimeoutContext } from '../types'\n\nimport { HookTimeoutError } from '../diagnostics/errors'\nimport { timeoutHandlerOf } from '../graph/nodes'\nimport { emitRecord } from '../graph/observers'\nimport { untracked } from '../helpers/signals'\nimport { withoutUndefined } from '../helpers/without-undefined'\nimport { createDecide, defaultDecision, validateDecision } from '../primitives/decision'\nimport { invokeUser } from './calls'\n\nfunction hookStateOf(instance: InstanceNode, hook: ServiceHook): HookState {\n let state = instance.hookStates.get(hook)\n if (!state) {\n state = { attempt: 1, previous: undefined }\n instance.hookStates.set(hook, state)\n }\n\n return state\n}\n\n/** A requeue keeps the attempt count. Any other decision resets it. */\nexport function finishRun(instance: InstanceNode, hook: ServiceHook, decision: Decision): void {\n const state = hookStateOf(instance, hook)\n state.previous = decision\n state.attempt = decision.kind === 'requeue' ? state.attempt + 1 : 1\n}\n\nexport function recordDecision(service: ServiceNode, instance: InstanceNode, decision: Decision, ignored: boolean): void {\n emitRecord(service.container, {\n type: 'decision',\n key: service.name,\n owner: service.container.owner,\n instanceId: instance.id,\n hook: decision.hook,\n decision: decision.kind,\n attempt: decision.attempt,\n ignored,\n ...withoutUndefined({ reason: decision.reason }),\n })\n}\n\n/** Starts a hook run. Its signal aborts when a newer target supersedes it, when it times out, or when the instance is disposed. */\nexport function beginHookRun(instance: InstanceNode): { readonly signal: AbortSignal, readonly abort: (reason: unknown) => void, readonly end: () => void } {\n const controller = new AbortController()\n const parent = instance.controller.signal\n const forward = () => controller.abort(parent.reason)\n if (parent.aborted)\n forward()\n else\n parent.addEventListener('abort', forward, { once: true })\n instance.hookRun = controller\n\n return {\n signal: controller.signal,\n abort: reason => controller.abort(reason),\n end: () => {\n parent.removeEventListener('abort', forward)\n if (instance.hookRun === controller)\n instance.hookRun = undefined\n },\n }\n}\n\n/** Calls one handler with a new hook context. A throw becomes `fail`. A value that is not a decision counts as `undefined`. A decision from another run, or of a kind that the hook does not accept, becomes `fail` with `invalid-decision`. */\nexport async function callHandler(\n service: ServiceNode,\n instance: InstanceNode,\n hook: ServiceHook,\n handler: RawHookHandler,\n runSignal: AbortSignal,\n extras: object,\n call: <T>(fn: () => T | Promise<T>) => Promise<T> = invokeUser,\n): Promise<Decision> {\n const state = hookStateOf(instance, hook)\n const run: HookRun = { service: service.name, instanceId: instance.id, hook, attempt: state.attempt, now: () => service.container.runtime.clock.now() }\n const hookContext = Object.freeze({\n decide: createDecide(run),\n attempt: run.attempt,\n previous: state.previous,\n signal: runSignal,\n ...extras,\n })\n\n try {\n const value = await call(() => handler(hookContext))\n return validateDecision(run, value) ?? defaultDecision(run)\n }\n catch (error) {\n return createDecide(run).fail(error)\n }\n}\n\nexport interface RunHandlersOptions {\n /** Runs every handler, also after a decision that is not `handled`. */\n readonly all?: boolean\n /** The index of the first handler to run. */\n readonly from?: number\n /** Gets the index of the handler that runs now, or that gave the last decision. */\n readonly progress?: { index: number }\n /** Ends the run before the next handler when it returns `true`. */\n readonly stopped?: () => boolean\n}\n\n/** Runs the handlers of `hook` in order. It stops at the first decision that is not `handled`, unless `all` is set. */\nexport async function runHandlers(service: ServiceNode, instance: InstanceNode, hook: ServiceHook, runSignal: AbortSignal, extras: object, options: RunHandlersOptions = {}): Promise<Decision[]> {\n const decisions: Decision[] = []\n const handlers = [...instance.hooks[hook]]\n for (let index = options.from ?? 0; index < handlers.length; index++) {\n if (options.stopped?.())\n break\n if (options.progress)\n options.progress.index = index\n\n const decision = await callHandler(service, instance, hook, handlers[index]!, runSignal, extras)\n decisions.push(decision)\n if (!options.all && decision.kind !== 'handled')\n break\n }\n\n return decisions\n}\n\n/**\n * Records a timeout of a `start` or `stop` hook in the observe stream, and returns the decision of the `onTimeout` handler.\n *\n * The handler runs synchronously. A value that is not a decision of this hook, a promise, a throw, or no handler gives `fail` with `hook-timeout`.\n */\nexport function decideTimeout(service: ServiceNode, instance: InstanceNode, hook: 'start' | 'stop', timeoutMs: number): Decision {\n const state = hookStateOf(instance, hook)\n const run: HookRun = { service: service.name, instanceId: instance.id, hook, attempt: state.attempt, now: () => service.container.runtime.clock.now() }\n const decide = createDecide(run)\n const error = new HookTimeoutError(`The '${hook}' hook of '${service.name}' did not settle within ${timeoutMs}ms.`, hook, timeoutMs)\n emitRecord(service.container, {\n type: 'timeout',\n key: service.name,\n owner: service.container.owner,\n instanceId: instance.id,\n hook,\n timeoutMs,\n attempt: state.attempt,\n reason: error.message,\n })\n\n const handler = timeoutHandlerOf(service)\n if (!handler)\n return decide.fail(error, { reason: error.message })\n\n try {\n const value = untracked(() => handler(Object.freeze({ hook, timeoutMs, attempt: state.attempt, previous: state.previous, decide }) as TimeoutContext))\n return validateDecision(run, value) ?? decide.fail(error, { reason: error.message })\n }\n catch (handlerError) {\n return decide.fail(handlerError, { reason: `The onTimeout handler of '${service.name}' threw.` })\n }\n}\n","import type { InstanceNode, ServiceNode, StopIntent } from '../graph/graph'\nimport type { RequeueDecision } from '../primitives/decision'\n\nimport { maxAttemptsOf } from '../graph/nodes'\n\n/**\n * The delay of a requeue in milliseconds.\n *\n * `after` is a fixed delay. An exponential backoff doubles `initial` for each attempt, up to `max`.\n * `jitter` is a fraction from 0 to 1. It takes a random part of that size away from the delay, so the delay is between `delay * (1 - jitter)` and `delay`.\n */\nexport function requeueDelay(decision: RequeueDecision, random: () => number): number {\n if (decision.after !== undefined)\n return Math.max(0, decision.after)\n if (decision.backoff) {\n const { initial, max, jitter } = decision.backoff\n const delay = Math.max(0, Math.min(max, initial * 2 ** (decision.attempt - 1)))\n if (jitter === undefined)\n return delay\n\n const fraction = Math.min(1, Math.max(0, jitter))\n return delay * (1 - fraction * random())\n }\n\n return 0\n}\n\n/**\n * The stop intent of a requeue that reached its attempt limit. The service stops, then goes to `failed` with the last reason.\n * The limit comes from the decision, then the service, then the containers. It is `undefined` when the requeue can wait.\n */\nexport function exhaustedIntent(service: ServiceNode, decision: RequeueDecision): StopIntent | undefined {\n const maxAttempts = maxAttemptsOf(service, decision.maxAttempts)\n if (maxAttempts === undefined || decision.attempt < maxAttempts)\n return undefined\n\n const message = decision.reason ?? `The '${decision.hook}' hook of '${service.name}' reached maxAttempts (${maxAttempts}).`\n return { failure: { error: new Error(message, { cause: decision }) }, reason: message, decision: 'requeue' }\n}\n\n/** Waits before the next run of a requeued hook. When the wait ends, the service goes back to the work queue. */\nexport function scheduleRequeue(service: ServiceNode, instance: InstanceNode, decision: RequeueDecision): void {\n const { clock, random, reconciler } = service.container.runtime\n const wait: { cancel: () => void } = { cancel: () => {} }\n wait.cancel = clock.setTimeout(() => {\n if (instance.requeueWait !== wait)\n return\n\n instance.requeueWait = undefined\n reconciler.markDirty(service)\n }, requeueDelay(decision, random))\n instance.requeueWait = wait\n}\n\nexport function cancelRequeueWait(instance: InstanceNode): void {\n instance.requeueWait?.cancel()\n instance.requeueWait = undefined\n}\n","import type { InstanceNode, ServiceNode, StopIntent } from '../graph/graph'\nimport type { CleanupFrame } from '../helpers/cleanup-context'\n\nimport { setPhase, timeoutOf } from '../graph/nodes'\nimport { removeDeclaration } from '../graph/resolvers/exclusive'\nimport { batch } from '../helpers/signals'\nimport { raceTimeout } from '../helpers/timeout'\nimport { invokeUser, loggerOf } from './calls'\nimport { syncHolds } from './holds'\nimport { callHandler, decideTimeout, finishRun, recordDecision } from './hook-run'\nimport { cancelRequeueWait } from './requeue'\n\nexport function mergeIntent(current: StopIntent, next: StopIntent): StopIntent {\n // A failure wins over a park. The first failure is kept.\n if (current.failure)\n return current\n if (next.failure)\n return next\n\n return {\n parkEpoch: next.parkEpoch ?? current.parkEpoch,\n reason: next.reason ?? current.reason,\n decision: next.decision ?? current.decision,\n }\n}\n\nexport function enterStopping(service: ServiceNode, intent: StopIntent): void {\n service.stopIntent = mergeIntent(service.stopIntent, intent)\n setPhase(service, 'stopping', { reason: service.stopIntent.reason, decision: service.stopIntent.decision })\n service.container.runtime.reconciler.markDirty(service)\n}\n\nexport function reconcileStopping(service: ServiceNode): void {\n const instance = service.signals.instance()\n if (!instance) {\n settleAfterStop(service, [])\n return\n }\n // A provider waits until all its holders release it.\n if (instance.signals.holders().size > 0)\n return\n\n void teardown(service, instance, true)\n}\n\n/**\n * Runs the `stop` hooks in reverse order, then the effect disposers in reverse order.\n *\n * A configured `stop` timeout covers all of them. When it passes, injeca records it, applies the `onTimeout` decision, and stops waiting.\n * The callback in progress is abandoned. The remaining callbacks still run, but injeca does not wait for them. So a cleanup that awaits the disposal of its own container cannot block that disposal.\n */\nasync function runTeardownCallbacks(service: ServiceNode, instance: InstanceNode, stopHooks: boolean, frame: CleanupFrame | undefined): Promise<unknown[]> {\n const errors: unknown[] = []\n const { clock, context } = service.container.runtime\n // Each callback runs inside the cleanup frame, so that a re-entrant dispose from it is detected.\n const call = <T>(fn: () => T | Promise<T>): Promise<T> => context.run(frame, () => invokeUser(fn))\n\n const timeoutMs = timeoutOf(service, 'stop')\n const deadline = timeoutMs === undefined ? undefined : clock.now() + timeoutMs\n let timedOut = false\n /** Waits for one callback until the deadline. `undefined` means that the deadline passed. */\n const settle = async <T>(promise: Promise<T>): Promise<{ readonly value: T } | undefined> => {\n if (deadline === undefined)\n return { value: await promise }\n if (timedOut) {\n promise.catch(() => {})\n return undefined\n }\n\n const result = await raceTimeout(clock, promise, Math.max(0, deadline - clock.now()))\n if (result.kind === 'settled')\n return { value: result.value }\n\n timedOut = true\n const decision = decideTimeout(service, instance, 'stop', timeoutMs!)\n recordDecision(service, instance, decision, false)\n finishRun(instance, 'stop', decision)\n if (decision.kind === 'fail')\n errors.push(decision.error)\n return undefined\n }\n\n if (stopHooks && instance.hooks.stop.length > 0) {\n const logger = loggerOf(service)\n logger?.hookOnStop(service.name)\n const startTime = performance.now()\n for (const handler of [...instance.hooks.stop].reverse()) {\n const settled = await settle(callHandler(service, instance, 'stop', handler, instance.controller.signal, {}, call))\n if (!settled)\n continue\n\n const decision = settled.value\n recordDecision(service, instance, decision, false)\n finishRun(instance, 'stop', decision)\n if (decision.kind === 'fail')\n errors.push(decision.error)\n }\n logger?.hookOnStopComplete(service.name, performance.now() - startTime)\n }\n\n const effects = instance.effects.splice(0).reverse()\n for (const disposer of effects) {\n try {\n await settle(call(disposer))\n }\n catch (error) {\n errors.push(error)\n }\n }\n\n return errors\n}\n\nexport async function teardown(service: ServiceNode, instance: InstanceNode, stopHooks: boolean, phase?: 'stopping'): Promise<void> {\n service.busy = true\n cancelRequeueWait(instance)\n instance.extraHolds.clear()\n if (phase)\n setPhase(service, phase, { reason: service.stopIntent.reason })\n\n const frame = service.container.frame\n const errors = await service.container.runtime.context.run(frame, () => runTeardownCallbacks(service, instance, stopHooks, frame))\n\n instance.disposed = true\n instance.controller.abort(new Error(`The instance '${instance.id}' of '${service.name}' was disposed.`))\n service.busy = false\n\n service.container.runtime.reconciler.notifyTeardown(service, errors)\n batch(() => {\n instance.bindings.clear()\n syncHolds(service, instance)\n // The phase record still names the stopped instance. The instance is cleared after it.\n settleAfterStop(service, errors)\n service.signals.instance(undefined)\n })\n}\n\nfunction settleAfterStop(service: ServiceNode, errors: readonly unknown[]): void {\n const intent = service.stopIntent\n service.stopIntent = {}\n\n // A new service that did not reach its swap leaves. The old service does not change.\n const { swap } = service\n if (swap) {\n const failure = intent.failure ?? (errors.length > 0 ? { error: errors[0] } : undefined)\n service.swap = undefined\n if (failure) {\n service.failure = failure\n setPhase(service, 'failed', { reason: intent.reason ?? 'The replacement failed. The old instance stays.', decision: intent.decision })\n swap.settle({ kind: 'failed', error: failure.error })\n }\n else {\n swap.settle(service.signals.active() ? { kind: 'cancelled' } : { kind: 'stopping' })\n }\n service.signals.present(false)\n service.teardownErrors.push(...errors)\n finalize(service)\n return\n }\n\n if (!service.signals.present()) {\n service.teardownErrors.push(...errors)\n finalize(service)\n return\n }\n if (intent.failure || errors.length > 0) {\n service.failure = intent.failure ?? { error: errors[0] }\n setPhase(service, 'failed', { reason: intent.reason, decision: intent.decision })\n return\n }\n\n service.parkedEpoch = intent.parkEpoch\n setPhase(service, 'pending', { reason: intent.reason, decision: intent.decision })\n service.container.runtime.reconciler.markDirty(service)\n}\n\nexport function finalize(service: ServiceNode): void {\n const { swap, template } = service\n service.swap = undefined\n swap?.settle({ kind: 'cancelled' })\n service.disposeEffects()\n service.container.services.delete(service)\n batch(() => {\n removeDeclaration(service)\n if (template) {\n const consumers = template.signals.consumers()\n if (consumers.get(service.container) === service)\n template.signals.consumers(new Map([...consumers].filter(([, consumer]) => consumer !== service)))\n }\n setPhase(service, 'withdrawn')\n })\n service.withdrawal.resolve([...service.teardownErrors])\n // A withdrawn `perConsumer` registration finalizes after its last consumer service.\n if (template)\n service.container.runtime.reconciler.markDirty(template)\n // The effect is gone, so no phase change requests a drain. Request one for the drained listeners.\n service.container.runtime.reconciler.requestDrain()\n}\n","import type { ServiceNode } from '../graph/graph'\n\nimport { publishService, setPhase } from '../graph/nodes'\nimport { batch } from '../helpers/signals'\n\n/**\n * Cancels a replacement that cannot complete: the old service was withdrawn, or the container stopped.\n * The new service leaves. The old service does not change.\n */\nexport function checkSwap(service: ServiceNode): void {\n const { swap } = service\n if (!swap || !service.signals.present())\n return\n\n if (!swap.target.signals.present()) {\n swap.settle({ kind: 'cancelled' })\n service.signals.present(false)\n }\n else if (!service.signals.active()) {\n swap.settle({ kind: 'stopping' })\n service.signals.present(false)\n }\n}\n\n/**\n * Swaps a new service that completed `start` in for the old one, in one batch.\n *\n * The new service takes the slot and goes to `running`. The old service leaves.\n * It stops and disposes after each holder releases it. Dependents follow the rule for a replaced dependency.\n */\nexport function completeSwap(service: ServiceNode): void {\n const swap = service.swap\n if (!swap)\n return\n\n const { target } = swap\n service.swap = undefined\n batch(() => {\n target.replacedBy = service\n publishService(service)\n target.signals.present(false)\n setPhase(service, 'running', { reason: `The new instance replaced '${target.signals.instance()?.id ?? target.name}'.` })\n })\n swap.settle({ kind: 'swapped' })\n}\n","import type { InstanceNode, ServiceNode } from '../graph/graph'\nimport type { Decision } from '../primitives/decision'\n\nimport { HookTimeoutError } from '../diagnostics/errors'\nimport { setPhase, timeoutOf } from '../graph/nodes'\nimport { epochOf } from '../graph/resolvers/resolvers'\nimport { raceTimeout } from '../helpers/timeout'\nimport { loggerOf } from './calls'\nimport { beginHookRun, decideTimeout, finishRun, recordDecision, runHandlers } from './hook-run'\nimport { exhaustedIntent, scheduleRequeue } from './requeue'\nimport { enterStopping } from './stop'\nimport { completeSwap } from './swap'\n\n/**\n * Runs the `start` handlers of one attempt, from `instance.startFrom`, within the configured `start` timeout.\n * At the timeout, the run aborts, later handlers do not run, and the `onTimeout` decision replaces the result. Late decisions are recorded as ignored.\n */\nasync function runAttempt(service: ServiceNode, instance: InstanceNode): Promise<Decision[]> {\n const run = beginHookRun(instance)\n const progress = { index: instance.startFrom }\n let timedOut = false\n const running = runHandlers(service, instance, 'start', run.signal, {}, { from: instance.startFrom, progress, stopped: () => timedOut })\n const timeoutMs = timeoutOf(service, 'start')\n // Without a timeout, `start` waits until it settles.\n const result = timeoutMs === undefined\n ? { kind: 'settled' as const, value: await running }\n : await raceTimeout(service.container.runtime.clock, running, timeoutMs)\n instance.startFrom = progress.index\n\n if (result.kind === 'settled') {\n run.end()\n return result.value\n }\n\n timedOut = true\n run.abort(new HookTimeoutError(`The 'start' hook of '${service.name}' timed out.`, 'start', timeoutMs!))\n run.end()\n void running.then((late) => {\n for (const decision of late)\n recordDecision(service, instance, decision, true)\n })\n return [decideTimeout(service, instance, 'start', timeoutMs!)]\n}\n\n/**\n * Runs the `start` hooks of a built instance. The service moves to `running`, waits in `retrying` for a requeue, or stops.\n *\n * A requeue keeps the instance and its bindings. The next attempt runs the requeued handler again, then the later ones. `build` does not run again.\n */\nexport async function runStart(service: ServiceNode, instance: InstanceNode): Promise<void> {\n service.busy = true\n const handlers = instance.hooks.start\n const logger = handlers.length > 0 ? loggerOf(service) : undefined\n if (instance.startFrom === 0)\n logger?.hookOnStart(service.name)\n const startTime = performance.now()\n\n const decisions = handlers.length > instance.startFrom ? await runAttempt(service, instance) : []\n service.busy = false\n\n const ignored = service.signals.targetLost()\n for (const decision of decisions)\n recordDecision(service, instance, decision, ignored)\n if (ignored) {\n enterStopping(service, { reason: 'A newer target superseded the start.' })\n return\n }\n\n const decision = decisions.at(-1)\n if (!decision || decision.kind === 'handled') {\n if (decision)\n finishRun(instance, 'start', decision)\n logger?.hookOnStartComplete(service.name, performance.now() - startTime)\n // A dependency that changed during the start is a change for the running service.\n // A new service of a replacement swaps in only now, so the old instance serves until here.\n if (service.swap)\n completeSwap(service)\n else\n setPhase(service, 'running')\n return\n }\n\n finishRun(instance, 'start', decision)\n switch (decision.kind) {\n case 'stop':\n enterStopping(service, { parkEpoch: epochOf(service, edge => instance.bindings.get(edge.name)), reason: decision.reason, decision: 'stop' })\n return\n case 'fail':\n enterStopping(service, { failure: { error: decision.error }, reason: decision.reason, decision: 'fail' })\n return\n case 'requeue': {\n const exhausted = exhaustedIntent(service, decision)\n if (exhausted) {\n enterStopping(service, exhausted)\n return\n }\n // The service keeps its instance and holds its dependencies. It is not available until a later attempt completes.\n setPhase(service, 'retrying', { reason: decision.reason, decision: 'requeue' })\n scheduleRequeue(service, instance, decision)\n }\n }\n}\n","import type { InstanceNode, ServiceNode, StatusValue } from '../graph/graph'\nimport type { DependencyState } from '../types'\nimport type { Snapshot } from './snapshot'\n\nimport { signal } from 'alien-signals'\n\nimport { ensureConsumerService, setPhase } from '../graph/nodes'\nimport { inConflict } from '../graph/resolvers/exclusive'\nimport { buildLost, candidatesOf, epochOf, requiredAvailable, resolutionOf, resolvedInstance } from '../graph/resolvers/resolvers'\nimport { batch } from '../helpers/signals'\nimport { createBuildContext } from './build-context'\nimport { invokeUser, loggerOf } from './calls'\nimport { syncHolds } from './holds'\nimport { currentSnapshot } from './snapshot'\nimport { runStart } from './start'\nimport { finalize, mergeIntent, teardown } from './stop'\n\nexport type BuildResult = { readonly ok: true, readonly value: unknown } | { readonly ok: false, readonly error: unknown }\n\n/**\n * An active service makes the providers of its edges converge too, before `start()`. A fallback edge demands each candidate.\n * A `perConsumer` registration gets a service for the container of `service`. The nearest registration of each key is demanded.\n */\nfunction demandProviders(service: ServiceNode): void {\n for (const edge of service.edges) {\n for (const keyName of edge.candidates) {\n const candidates = candidatesOf(service.container, keyName, service)\n const providers = candidates.map(registration => registration.perConsumer ? ensureConsumerService(registration, service.container) : registration)\n const [nearest] = providers\n if (nearest && !nearest.signals.serving() && !nearest.signals.demanded())\n nearest.signals.demanded(true)\n }\n }\n}\n\n/**\n * Tells whether each optional edge has a final answer for a `resolve` call: no provider, a running provider, or a failed one.\n * A service does not wait for optional edges. A `resolve` call does, so that it does not miss a provider that is still starting.\n */\nfunction optionalSettled(service: ServiceNode): boolean {\n return service.edges.every((edge) => {\n if (!edge.optional)\n return true\n\n const resolution = resolutionOf(service, edge)\n return resolution.kind !== 'not-running' || resolution.provider.signals.phase() === 'failed'\n })\n}\n\n/** Builds a pending service when it is active and its required dependencies are available. An absent one is withdrawn. */\nexport function reconcilePending(service: ServiceNode): void {\n if (!service.signals.present()) {\n finalize(service)\n return\n }\n if (inConflict(service)) {\n setPhase(service, 'conflict', { reason: `The exclusive key '${service.name}' has more than one declaration.` })\n return\n }\n if (!service.signals.active())\n return\n\n demandProviders(service)\n if (!requiredAvailable(service) || (service.kind === 'resolver' && !optionalSettled(service)))\n return\n if (service.parkedEpoch !== undefined) {\n if (epochOf(service, edge => resolvedInstance(service, edge)) === service.parkedEpoch)\n return\n service.parkedEpoch = undefined\n }\n\n beginBuild(service)\n}\n\nfunction beginBuild(service: ServiceNode): void {\n const instance = prepareInstance(service, currentSnapshot(service))\n void runBuild(service, instance).then(result => completeBuild(service, instance, result))\n}\n\n/** Creates the instance of a build from a snapshot of its dependencies, and moves the service to `building`. The service holds each bound provider. */\nexport function prepareInstance(service: ServiceNode, snapshot: Snapshot): InstanceNode {\n const bindings = new Map<string, InstanceNode>()\n const handled = new Map<string, DependencyState | undefined>()\n for (const [name, entry] of snapshot) {\n handled.set(name, entry?.state)\n if (entry)\n bindings.set(name, entry.instance)\n }\n\n const instance: InstanceNode = {\n id: service.container.runtime.nextInstanceId(),\n service,\n bindings,\n extraHolds: new Set(),\n held: new Set(),\n hooks: { 'start': [], 'stop': [], 'dependency-change': [], 'dependency-status-change': [] },\n hookStates: new Map(),\n handled,\n effects: [],\n controller: new AbortController(),\n signals: {\n holders: signal<ReadonlySet<ServiceNode>>(new Set()),\n own: signal<StatusValue>(Object.freeze({ status: 'ready' })),\n },\n hookRun: undefined,\n requeueWait: undefined,\n startFrom: 0,\n value: undefined,\n building: true,\n disposed: false,\n }\n\n service.busy = true\n batch(() => {\n syncHolds(service, instance)\n service.signals.instance(instance)\n setPhase(service, 'building')\n })\n\n return instance\n}\n\n/** Runs `build` for a prepared instance. It never rejects. */\nexport function runBuild(service: ServiceNode, instance: InstanceNode): Promise<BuildResult> {\n const logger = loggerOf(service)\n logger?.beforeRun(service.name)\n const startTime = performance.now()\n const buildContext = createBuildContext(service, instance)\n\n return invokeUser(() => service.build(buildContext)).then(\n (value): BuildResult => {\n logger?.run(service.name, performance.now() - startTime)\n return { ok: true, value }\n },\n (error: unknown): BuildResult => ({ ok: false, error }),\n )\n}\n\nfunction completeBuild(service: ServiceNode, instance: InstanceNode, result: BuildResult): void {\n instance.building = false\n service.busy = false\n\n if (!result.ok) {\n service.stopIntent = mergeIntent(service.stopIntent, { failure: { error: result.error }, reason: 'The build failed.' })\n void teardown(service, instance, false)\n return\n }\n // The target changed during the build. Discard the result now. No `start` hook ran, so no `stop` hook runs.\n if (buildLost(service, instance)) {\n service.stopIntent = mergeIntent(service.stopIntent, { reason: 'The target changed during the build. The result is discarded.' })\n void teardown(service, instance, false, 'stopping')\n return\n }\n\n instance.value = result.value\n setPhase(service, 'starting')\n void runStart(service, instance)\n}\n","import type { InstanceNode, ServiceNode, TransactionNode } from '../graph/graph'\nimport type { ResolutionCondition } from '../types'\nimport type { SnapshotEntry } from './snapshot'\n\nimport { acceptsProvider } from '../graph/resolvers/condition'\nimport { inConflict } from '../graph/resolvers/exclusive'\nimport { resolveKey } from '../graph/resolvers/plain'\nimport { requiredChanged } from '../graph/resolvers/resolvers'\nimport { prepareInstance, runBuild } from './build'\nimport { runStart } from './start'\nimport { finalize, teardown } from './stop'\n\n/** The members of a transaction by key name, in the order of their registration. */\nexport type TransactionMembers = ReadonlyMap<string, ServiceNode>\n\n/**\n * Orders the members so that each member comes after the members that it depends on.\n * Members in a cycle come last, in registration order. They cannot build in the transaction.\n */\nexport function orderMembers(members: TransactionMembers): ServiceNode[] {\n const order: ServiceNode[] = []\n const placed = new Set<ServiceNode>()\n const remaining = [...members.values()]\n\n let progress = true\n while (progress) {\n progress = false\n for (const member of remaining) {\n if (placed.has(member))\n continue\n\n const ready = member.edges.every(edge => edge.candidates.every((keyName) => {\n const provider = members.get(keyName)\n return !provider || provider === member || placed.has(provider)\n }))\n if (ready) {\n placed.add(member)\n order.push(member)\n progress = true\n }\n }\n }\n\n return [...order, ...remaining.filter(member => !placed.has(member))]\n}\n\nfunction memberEntry(member: ServiceNode, built: ReadonlyMap<ServiceNode, InstanceNode>): SnapshotEntry | undefined {\n const instance = built.get(member)\n if (!instance)\n return undefined\n\n return {\n state: Object.freeze({ provider: member.name, instanceId: instance.id, status: instance.signals.own().status }),\n instance,\n }\n}\n\n/** Resolves one key inside a transaction: a built member first, then the published providers. */\nfunction resolveInTransaction(service: ServiceNode, keyName: string, condition: ResolutionCondition | undefined, members: TransactionMembers, built: ReadonlyMap<ServiceNode, InstanceNode>): SnapshotEntry | undefined {\n const member = members.get(keyName)\n if (member && member !== service) {\n if (inConflict(member) || (condition && !acceptsProvider(service, keyName, condition, member)))\n return undefined\n return memberEntry(member, built)\n }\n\n const resolution = resolveKey(service, keyName, condition)\n if (resolution.kind !== 'resolved')\n return undefined\n\n return {\n state: Object.freeze({ provider: resolution.provider.name, instanceId: resolution.instance.id, status: resolution.provider.signals.effective()?.status ?? 'unavailable' }),\n instance: resolution.instance,\n }\n}\n\n/** The snapshot of a member for its build in the transaction. It is `undefined` when a required dependency is not available. */\nfunction transactionSnapshot(service: ServiceNode, members: TransactionMembers, built: ReadonlyMap<ServiceNode, InstanceNode>): Map<string, SnapshotEntry | undefined> | undefined {\n const snapshot = new Map<string, SnapshotEntry | undefined>()\n for (const edge of service.edges) {\n const entries = edge.candidates.map(keyName => resolveInTransaction(service, keyName, edge.condition, members, built))\n const entry = entries.find(candidate => candidate !== undefined && candidate.state.status !== 'unavailable') ?? entries.find(candidate => candidate !== undefined)\n if (!edge.optional && (!entry || entry.state.status === 'unavailable'))\n return undefined\n\n snapshot.set(edge.name, entry)\n }\n\n return snapshot\n}\n\nexport type BuildOutcome\n = | { readonly kind: 'built', readonly built: ReadonlyMap<ServiceNode, InstanceNode> }\n | { readonly kind: 'failed', readonly error: unknown, readonly built: ReadonlyMap<ServiceNode, InstanceNode> }\n | { readonly kind: 'aborted', readonly built: ReadonlyMap<ServiceNode, InstanceNode> }\n\n/**\n * Builds the members of a transaction in `order`. Nothing is published, and no `start` hook runs.\n *\n * A member whose required dependencies are not available, that is not active, or whose key is in conflict, does not build. It goes to `pending` at the publish.\n * The first failed build ends the loop. An abort ends it after the build in progress settles.\n */\nexport async function buildMembers(transaction: TransactionNode, order: readonly ServiceNode[], members: TransactionMembers): Promise<BuildOutcome> {\n const built = new Map<ServiceNode, InstanceNode>()\n for (const member of order) {\n if (transaction.state === 'aborted')\n return { kind: 'aborted', built }\n if (member.perConsumer || !member.signals.active() || inConflict(member))\n continue\n\n const snapshot = transactionSnapshot(member, members, built)\n if (!snapshot)\n continue\n\n const instance = prepareInstance(member, snapshot)\n transaction.controllers.add(instance.controller)\n const result = await runBuild(member, instance)\n transaction.controllers.delete(instance.controller)\n instance.building = false\n built.set(member, instance)\n\n if (!result.ok)\n return { kind: 'failed', error: result.error, built }\n instance.value = result.value\n }\n\n return transaction.state === 'aborted' ? { kind: 'aborted', built } : { kind: 'built', built }\n}\n\n/**\n * Removes all members after a failed build or an abort. A built instance runs its effect disposers. No `stop` hook runs, because no `start` hook ran.\n * Resolves when each member is `withdrawn`.\n */\nexport async function rollbackMembers(members: TransactionMembers, built: ReadonlyMap<ServiceNode, InstanceNode>): Promise<void> {\n for (const member of members.values())\n member.signals.present(false)\n\n await Promise.all([...members.values()].map((member) => {\n const instance = built.get(member)\n if (instance)\n return teardown(member, instance, false)\n\n finalize(member)\n return undefined\n }))\n}\n\n/**\n * Runs the `start` hooks of the built members after the publish, in dependency order.\n * A member whose target changed, or whose dependency did not reach `running`, is discarded without its `stop` hooks. It builds again later.\n */\nexport async function startMembers(order: readonly ServiceNode[], built: ReadonlyMap<ServiceNode, InstanceNode>): Promise<void> {\n for (const member of order) {\n const instance = built.get(member)\n if (!instance)\n continue\n\n if (member.signals.targetLost() || requiredChanged(member, instance))\n await teardown(member, instance, false, 'stopping')\n else\n await runStart(member, instance)\n }\n}\n\n/**\n * Aborts a transaction. Before the commit, it drops the transaction. During the commit, it aborts the builds in progress, and the commit rolls back.\n * Resolves when the transaction ended.\n */\nexport function abortTransaction(transaction: TransactionNode, error: unknown): Promise<void> {\n if (transaction.state === 'done' || transaction.state === 'aborted')\n return transaction.settled ?? Promise.resolve()\n\n const committing = transaction.state === 'committing'\n transaction.state = 'aborted'\n transaction.abortError = error\n for (const controller of transaction.controllers)\n controller.abort(error)\n if (!committing) {\n transaction.container.transactions.delete(transaction)\n transaction.settled = Promise.resolve()\n }\n\n return transaction.settled ?? Promise.resolve()\n}\n","import type { ServiceNode } from '../graph/graph'\n\nimport { setPhase } from '../graph/nodes'\nimport { inConflict } from '../graph/resolvers/exclusive'\nimport { finalize } from './stop'\n\n/** A service in `conflict` runs no code. It goes back to `pending` when only one declaration remains. */\nexport function reconcileConflict(service: ServiceNode): void {\n if (!service.signals.present()) {\n finalize(service)\n return\n }\n if (inConflict(service))\n return\n\n setPhase(service, 'pending', { reason: `Only one declaration of the exclusive key '${service.name}' remains.` })\n service.container.runtime.reconciler.markDirty(service)\n}\n","import type { InstanceNode, ServiceNode } from '../graph/graph'\nimport type { ServiceHook } from '../primitives/decision'\nimport type { DependencyChange } from '../types'\nimport type { Snapshot } from './snapshot'\n\nimport { inConflict } from '../graph/resolvers/exclusive'\nimport { epochOf, requiredWithdrawn } from '../graph/resolvers/resolvers'\nimport { batch } from '../helpers/signals'\nimport { releaseExtraHolds, syncHolds } from './holds'\nimport { beginHookRun, finishRun, recordDecision, runHandlers } from './hook-run'\nimport { cancelRequeueWait, exhaustedIntent, scheduleRequeue } from './requeue'\nimport { acceptSnapshot, currentSnapshot, describeChanges, diffSnapshot, hookDependsOn, isIdentityChange } from './snapshot'\nimport { enterStopping } from './stop'\n\n/** Handles a running service: it stops it, or it runs a dependency hook for the changes since the last handled snapshot. */\nexport function reconcileRunning(service: ServiceNode): void {\n const instance = service.signals.instance()\n if (!instance) {\n enterStopping(service, {})\n return\n }\n if (!service.signals.present() || !service.signals.active()) {\n cancelRequeueWait(instance)\n enterStopping(service, { reason: service.signals.present() ? 'The container stopped.' : service.replacedBy ? 'The service was replaced.' : 'The service was withdrawn.' })\n return\n }\n if (inConflict(service)) {\n cancelRequeueWait(instance)\n enterStopping(service, { reason: `The exclusive key '${service.name}' got another declaration.` })\n return\n }\n\n const snapshot = currentSnapshot(service)\n // A required dependency is withdrawn. The service stops, also during a requeue wait. A handler gets a notice only.\n if (requiredWithdrawn(service)) {\n cancelRequeueWait(instance)\n if (instance.hooks['dependency-change'].length > 0)\n void runNotice(service, instance, snapshot)\n else\n enterStopping(service, { reason: 'A required dependency was withdrawn.' })\n return\n }\n\n const changes = diffSnapshot(service, instance.handled, snapshot)\n // A waiting requeue merges the new changes. Its run reads the latest snapshot.\n if (changes.length === 0 || instance.requeueWait)\n return\n\n const identity = changes.some(isIdentityChange)\n const hook: ServiceHook = identity ? 'dependency-change' : 'dependency-status-change'\n if (instance.hooks[hook].length === 0) {\n if (identity)\n enterStopping(service, { reason: `A dependency changed without a handler: ${describeChanges(changes)}.`, decision: 'rebuild' })\n else\n acceptSnapshot(service, instance, snapshot)\n return\n }\n\n void runDependencyHook(service, instance, hook, snapshot, changes)\n}\n\n/** Calls `dependency-change` as a notice before the service stops for a withdrawn required dependency. The decisions are ignored. */\nasync function runNotice(service: ServiceNode, instance: InstanceNode, snapshot: Snapshot): Promise<void> {\n service.busy = true\n const changes = diffSnapshot(service, instance.handled, snapshot)\n // The withdrawn provider waits for this holder, so its bound value is still usable during the notice.\n const view = new Map(snapshot)\n for (const [name, binding] of instance.bindings) {\n if (!view.get(name))\n view.set(name, { state: Object.freeze({ provider: binding.service.name, instanceId: binding.id, status: 'unavailable' }), instance: binding })\n }\n\n const decisions = await runHandlers(service, instance, 'dependency-change', instance.controller.signal, {\n dependsOn: hookDependsOn(service, view),\n changes: Object.freeze(changes),\n }, { all: true })\n service.busy = false\n\n for (const decision of decisions)\n recordDecision(service, instance, decision, true)\n enterStopping(service, { reason: `A required dependency was withdrawn: ${describeChanges(changes)}.` })\n}\n\nasync function runDependencyHook(service: ServiceNode, instance: InstanceNode, hook: ServiceHook, snapshot: Snapshot, changes: readonly DependencyChange[]): Promise<void> {\n service.busy = true\n // The handler can use the new instances, so the run holds them until it ends.\n for (const entry of snapshot.values()) {\n if (entry)\n instance.extraHolds.add(entry.instance)\n }\n batch(() => syncHolds(service, instance))\n\n const run = beginHookRun(instance)\n const decisions = await runHandlers(service, instance, hook, run.signal, {\n dependsOn: hookDependsOn(service, snapshot),\n changes: Object.freeze([...changes]),\n })\n run.end()\n service.busy = false\n\n const ignored = service.signals.targetLost()\n for (const decision of decisions)\n recordDecision(service, instance, decision, ignored)\n if (ignored) {\n releaseExtraHolds(service, instance)\n service.container.runtime.reconciler.markDirty(service)\n return\n }\n\n const decision = decisions.at(-1)!\n finishRun(instance, hook, decision)\n switch (decision.kind) {\n case 'handled':\n acceptSnapshot(service, instance, snapshot)\n // Changes that arrived during the run are not handled yet.\n service.container.runtime.reconciler.markDirty(service)\n return\n case 'requeue': {\n releaseExtraHolds(service, instance)\n const exhausted = exhaustedIntent(service, decision)\n if (exhausted)\n enterStopping(service, exhausted)\n else\n scheduleRequeue(service, instance, decision)\n return\n }\n case 'rebuild':\n releaseExtraHolds(service, instance)\n enterStopping(service, { reason: decision.reason, decision: 'rebuild' })\n return\n case 'stop':\n releaseExtraHolds(service, instance)\n enterStopping(service, { parkEpoch: epochOf(service, edge => snapshot.get(edge.name)?.instance), reason: decision.reason, decision: 'stop' })\n return\n case 'fail':\n releaseExtraHolds(service, instance)\n enterStopping(service, { failure: { error: decision.error }, reason: decision.reason, decision: 'fail' })\n }\n}\n","import type { ServiceNode } from '../graph/graph'\n\nimport { setPhase } from '../graph/nodes'\nimport { inConflict } from '../graph/resolvers/exclusive'\nimport { finalize } from './stop'\n\n/**\n * Handles a `perConsumer` registration. It never builds. The service of each consumer container builds.\n * A withdrawn registration finalizes after its last consumer service.\n */\nexport function reconcileRegistration(service: ServiceNode): void {\n const phase = service.signals.phase()\n if (!service.signals.present()) {\n if (service.signals.consumers().size === 0)\n finalize(service)\n return\n }\n\n if (phase === 'pending' && inConflict(service))\n setPhase(service, 'conflict', { reason: `The exclusive key '${service.name}' has more than one declaration.` })\n else if (phase === 'conflict' && !inConflict(service))\n setPhase(service, 'pending', { reason: `Only one declaration of the exclusive key '${service.name}' remains.` })\n}\n","import type { ServiceNode } from '../graph/graph'\n\nimport { setPhase } from '../graph/nodes'\nimport { requiredWithdrawn } from '../graph/resolvers/resolvers'\nimport { cancelRequeueWait } from './requeue'\nimport { runStart } from './start'\nimport { enterStopping } from './stop'\n\nfunction lostReason(service: ServiceNode): string {\n if (!service.signals.present())\n return service.replacedBy ? 'The service was replaced during a start requeue.' : 'The service was withdrawn during a start requeue.'\n if (!service.signals.active())\n return 'The container stopped during a start requeue.'\n if (requiredWithdrawn(service))\n return 'A required dependency was withdrawn during a start requeue.'\n\n return `The exclusive key '${service.name}' got another declaration during a start requeue.`\n}\n\n/**\n * Handles a service in `retrying`: a `start` hook returned `requeue`.\n *\n * Changes during the wait merge into the next attempt. When the wait ends, `start` runs again with the same instance.\n * A requeue cannot keep a service alive. A lost target, for example a withdrawn required dependency, cancels the wait and stops the service at once.\n */\nexport function reconcileRetrying(service: ServiceNode): void {\n const instance = service.signals.instance()\n if (!instance) {\n enterStopping(service, {})\n return\n }\n if (service.signals.targetLost()) {\n cancelRequeueWait(instance)\n enterStopping(service, { reason: lostReason(service) })\n return\n }\n if (instance.requeueWait)\n return\n\n setPhase(service, 'starting', { reason: 'The requeue wait ended.' })\n void runStart(service, instance)\n}\n","import type { Reconciler, ServiceNode } from '../graph/graph'\nimport type { CleanupContext } from '../helpers/cleanup-context'\n\nimport { buildLost } from '../graph/resolvers/resolvers'\nimport { untracked } from '../helpers/signals'\nimport { reconcilePending } from './build'\nimport { callListeners } from './calls'\nimport { reconcileConflict } from './conflict'\nimport { reconcileRunning } from './dependency-hooks'\nimport { reconcileRegistration } from './registration'\nimport { reconcileRetrying } from './retry'\nimport { finalize, reconcileStopping } from './stop'\nimport { checkSwap } from './swap'\n\nexport interface ReconcilerOptions {\n /** The cleanup context of the runtime. A drain starts outside all of its frames. */\n readonly context: CleanupContext\n}\n\n/**\n * Creates the execution layer.\n *\n * A work queue holds dirty services, each at most once. The reconciler runs one transition at a time for each service.\n * Each transition reads the latest derived values when it starts and when it ends.\n */\nexport function createReconciler(options: ReconcilerOptions): Reconciler {\n const { context } = options\n const queue = new Set<ServiceNode>()\n const drainedListeners = new Set<() => void>()\n const teardownListeners = new Set<(service: ServiceNode, errors: readonly unknown[]) => void>()\n let drainRequested = false\n let draining = false\n\n function requestDrain(): void {\n if (drainRequested || draining)\n return\n\n drainRequested = true\n queueMicrotask(drain)\n }\n\n function markDirty(service: ServiceNode): void {\n queue.add(service)\n requestDrain()\n }\n\n function drain(): void {\n drainRequested = false\n // The drain is an entry point. Transitions start outside all cleanup frames. A teardown enters the frame of its container.\n untracked(() => context.run(undefined, () => {\n draining = true\n try {\n for (const service of queue) {\n queue.delete(service)\n reconcile(service)\n }\n }\n finally {\n draining = false\n if (queue.size > 0)\n requestDrain()\n else\n callListeners(drainedListeners)\n }\n }))\n }\n\n function reconcile(service: ServiceNode): void {\n // A service of an open transaction belongs to the transaction.\n if (service.transaction)\n return\n const phase = service.signals.phase()\n if (phase === 'withdrawn')\n return\n if (service.perConsumer) {\n reconcileRegistration(service)\n return\n }\n\n checkSwap(service)\n\n if (service.busy) {\n // A transition is in progress. Do not interrupt it. Only abort the signal of a superseded build or hook run.\n const instance = service.signals.instance()\n if (!instance)\n return\n if (phase === 'building') {\n if (buildLost(service, instance))\n instance.controller.abort(new Error(`The build of '${service.name}' was superseded.`))\n }\n else if (instance.hookRun && service.signals.targetLost()) {\n instance.hookRun.abort(new Error(`A newer target superseded the hook run of '${service.name}'.`))\n }\n return\n }\n\n switch (phase) {\n case 'pending':\n reconcilePending(service)\n return\n case 'conflict':\n reconcileConflict(service)\n return\n case 'failed':\n if (!service.signals.present())\n finalize(service)\n return\n case 'running':\n reconcileRunning(service)\n return\n case 'retrying':\n reconcileRetrying(service)\n return\n case 'stopping':\n reconcileStopping(service)\n }\n }\n\n return {\n markDirty,\n onDrained: (listener) => {\n drainedListeners.add(listener)\n return () => drainedListeners.delete(listener)\n },\n onTeardown: (listener) => {\n teardownListeners.add(listener)\n return () => teardownListeners.delete(listener)\n },\n notifyTeardown: (service, errors) => callListeners(teardownListeners, service, errors),\n requestDrain,\n }\n}\n","import type { ContainerNode, Policy, Runtime, ServiceNode } from '../graph/graph'\nimport type { Container, ContainerOptions, EffectSetup, OwnerRecord } from '../types'\n\nimport { effectScope, getActiveSub, signal } from 'alien-signals'\n\nimport { BuildAfterDisposeError, InvalidArgumentError, ReentrantDisposeError } from '../diagnostics/errors'\nimport { createDefaultLogger, createNoopLogger } from '../diagnostics/logger'\nimport { assertActive, nodeOf, readPolicy, registerNode, releaseService } from '../graph/nodes'\nimport { createCleanupContext } from '../helpers/cleanup-context'\nimport { systemClock } from '../helpers/clock'\nimport { createDeliveryQueue } from '../helpers/delivery-queue'\nimport { errorFrom } from '../helpers/error-from'\nimport { batch, untracked, withOwner } from '../helpers/signals'\nimport { abortTransaction } from '../reconciler/commit'\nimport { createReconciler } from '../reconciler/reconciler'\nimport { normalizeName } from './keys'\n\nfunction deepFreeze<T>(value: T): T {\n if (typeof value === 'object' && value !== null && !Object.isFrozen(value)) {\n Object.freeze(value)\n for (const child of Object.values(value))\n deepFreeze(child)\n }\n\n return value\n}\n\nfunction readOwner(owner: unknown): OwnerRecord {\n if (owner === undefined)\n return Object.freeze({})\n\n let copy: unknown\n try {\n copy = structuredClone(owner)\n }\n catch (error) {\n throw new InvalidArgumentError('The container owner must be a serializable record.', { cause: error })\n }\n if (typeof copy !== 'object' || copy === null || Array.isArray(copy))\n throw new InvalidArgumentError('The container owner must be a serializable record.')\n\n return deepFreeze(copy as OwnerRecord)\n}\n\nfunction readIsolated(options: ContainerOptions): ReadonlySet<string> {\n let isolate: unknown\n try {\n isolate = options.isolate\n }\n catch (error) {\n throw new InvalidArgumentError('Cannot read the isolate option.', { cause: error })\n }\n if (isolate === undefined)\n return new Set()\n if (!Array.isArray(isolate))\n throw new InvalidArgumentError('The isolate option must be a list of keys or names.')\n\n return new Set(isolate.map((key: unknown) => {\n let name: unknown\n try {\n name = normalizeName(key as string)\n }\n catch (error) {\n throw new InvalidArgumentError('Cannot read a key of the isolate option.', { cause: error })\n }\n if (typeof name !== 'string' || name.length === 0)\n throw new InvalidArgumentError('Each entry of the isolate option must be a key or a non-empty name.')\n\n return name\n }))\n}\n\nfunction readContainerPolicy(options: ContainerOptions): Policy {\n let fields: { maxAttempts: unknown, timeouts: unknown, onTimeout: unknown }\n try {\n fields = { maxAttempts: options.maxAttempts, timeouts: options.timeouts, onTimeout: options.onTimeout }\n }\n catch (error) {\n throw new InvalidArgumentError('Cannot read the container options.', { cause: error })\n }\n\n return readPolicy('the container', fields)\n}\n\nfunction readRandom(options: ContainerOptions): () => number {\n let random: unknown\n try {\n random = options.random\n }\n catch (error) {\n throw new InvalidArgumentError('Cannot read the random option.', { cause: error })\n }\n if (random !== undefined && typeof random !== 'function')\n throw new InvalidArgumentError('The random option must be a function.')\n\n return (random as (() => number) | undefined) ?? Math.random\n}\n\nfunction createRuntime(options: ContainerOptions): Runtime {\n let seq = 0\n let instanceSeq = 0\n const context = createCleanupContext()\n\n return {\n clock: options.clock ?? systemClock,\n random: readRandom(options),\n context,\n deliveries: createDeliveryQueue(),\n observers: new Set(),\n declarations: new Map(),\n reconciler: createReconciler({ context }),\n nextSeq: () => ++seq,\n nextInstanceId: () => `i${++instanceSeq}`,\n }\n}\n\n/**\n * Creates a container. With `options.parent`, the container is a child of that container.\n *\n * A child container does not start when it is created, even under a started parent. It waits for `start(child)`.\n */\nexport function createContainer(options: ContainerOptions = {}): Container {\n const parent = options.parent === undefined ? undefined : nodeOf(options.parent)\n if (parent)\n assertActive(parent, 'create a child container')\n\n const owner = readOwner(options.owner)\n const isolated = readIsolated(options)\n const policy = readContainerPolicy(options)\n const logger = options.enabled === false\n ? createNoopLogger()\n : (options.logger ?? parent?.api.logger ?? createDefaultLogger())\n const runtime = parent?.runtime ?? createRuntime(options)\n\n let reactiveOwner: ContainerNode['reactiveOwner']\n const stopReactive = withOwner(parent?.reactiveOwner, () => effectScope(() => {\n reactiveOwner = getActiveSub()\n }))\n\n const api: Container = { logger, owner, parent: parent?.api }\n const node: ContainerNode = {\n seq: runtime.nextSeq(),\n api,\n owner,\n parent,\n runtime,\n children: new Set(),\n services: new Set(),\n signals: {\n started: signal(false),\n slots: new Map(),\n },\n isolated,\n policy,\n listeners: new Map(),\n transactions: new Set(),\n effects: [],\n reactiveOwner: reactiveOwner!,\n stopReactive,\n enrolled: false,\n state: 'active',\n frame: undefined,\n disposal: undefined,\n disposedListeners: new Set(),\n }\n parent?.children.add(node)\n registerNode(api, node)\n\n return api\n}\n\n/**\n * Runs `setup` and stores the returned disposer on the container. `dispose(container)` runs the disposers in reverse order.\n */\nexport function effect(container: Container, setup: EffectSetup): void {\n const node = nodeOf(container)\n assertActive(node, 'add an effect')\n if (typeof setup !== 'function')\n throw new InvalidArgumentError('The effect setup is not a function.')\n\n const disposer = untracked(setup)\n if (typeof disposer === 'function')\n node.effects.push(disposer)\n}\n\n/**\n * Starts the disposal of `container` and of its descendants.\n *\n * The synchronous part withdraws all services of the subtree in the caller's batch, so that dependents stop without a rebuild.\n */\nfunction beginDisposal(container: ContainerNode, parentFrame: ContainerNode['frame']): Promise<void> {\n if (container.disposal)\n return container.disposal\n\n const { context } = container.runtime\n const frame = { owner: container, parent: parentFrame, active: true }\n container.state = 'disposing'\n container.frame = frame\n\n // A pending transaction aborts. A build that settles later cannot publish.\n for (const transaction of [...container.transactions])\n void abortTransaction(transaction, new BuildAfterDisposeError('The container was disposed before the transaction committed.'))\n\n const withdrawn = new Set<ServiceNode>()\n for (const service of container.services) {\n if (service.signals.present()) {\n releaseService(service)\n withdrawn.add(service)\n }\n }\n\n const children = [...container.children].reverse().map((child) => {\n const disposal = beginDisposal(child, frame)\n // The parent awaits each child later. This branch only stops an early rejection from being reported as unhandled.\n disposal.catch(() => {})\n return disposal\n })\n\n container.disposal = context.run(frame, async () => {\n const errors: unknown[] = []\n\n for (const service of [...container.services]) {\n const serviceErrors = await service.withdrawal.promise\n if (withdrawn.has(service))\n errors.push(...serviceErrors)\n }\n\n for (const child of children) {\n try {\n await child\n }\n catch (error) {\n errors.push(error)\n }\n }\n\n for (const disposer of container.effects.splice(0).reverse()) {\n try {\n // A disposer is a user callback.\n await context.run(frame, () => untracked(disposer))\n }\n catch (error) {\n errors.push(error)\n }\n }\n\n if (errors.length > 0)\n throw errorFrom(errors, 'Container disposal failed.')\n }).finally(() => {\n frame.active = false\n container.state = 'disposed'\n container.listeners.clear()\n container.stopReactive()\n container.parent?.children.delete(container)\n for (const listener of [...container.disposedListeners]) {\n try {\n listener()\n }\n catch (error) {\n // A subscription cleanup does not change the disposal result. Report it outside the current call stack.\n queueMicrotask(() => {\n throw error\n })\n }\n }\n container.disposedListeners.clear()\n })\n\n return container.disposal\n}\n\n/**\n * Withdraws the registrations and invocations of the container, disposes the child containers, and runs the container effects in reverse order.\n *\n * One error keeps its identity. More than one error becomes an `AggregateError`.\n * A call from the cleanup chain of the same container rejects with `reentrant-dispose`. A second call from outside gets the same promise.\n */\nexport function dispose(container: Container): Promise<void> {\n const node = nodeOf(container)\n const { context } = node.runtime\n if (context.isActive(node))\n return Promise.reject(new ReentrantDisposeError('dispose() was called from the cleanup chain of the same container.'))\n if (node.disposal)\n return node.disposal\n\n return untracked(() => {\n let disposal: Promise<void> | undefined\n batch(() => {\n disposal = beginDisposal(node, context.current())\n })\n\n return disposal!\n })\n}\n","import type { BuildFunction, ServiceNode } from '../graph/graph'\nimport type { Container, DependencyDeclarations, DependencyMap, InvocationHandle, InvokeOption, InvokeOptionWithKeys } from '../types'\n\nimport { InvalidArgumentError } from '../diagnostics/errors'\nimport { assertActive, createService, nodeOf, readEdges, withdrawService } from '../graph/nodes'\nimport { batch, untracked } from '../helpers/signals'\n\n/** The loose shape of all invoke forms. The overloads check the types. */\nexport type InvokeAnyOption = ((dependencies: never, context: never) => unknown) | { callback: (dependencies: never, context: never) => unknown, dependsOn?: unknown }\n\n/**\n * Registers an invocation: a service without a value. The callback runs when the required dependencies are available.\n * Before `start()`, it waits for `start()`.\n */\nexport function invoke<Deps extends DependencyDeclarations>(container: Container, option: InvokeOptionWithKeys<Deps>): InvocationHandle\nexport function invoke<D extends DependencyMap>(container: Container, option: InvokeOption<D>): InvocationHandle\nexport function invoke(container: Container, option: InvokeAnyOption): InvocationHandle {\n return invokeIn(container, option)\n}\n\n/** Registers an invocation. The public `invoke` functions call it. */\nexport function invokeIn(container: Container, option: InvokeAnyOption): InvocationHandle {\n const node = nodeOf(container)\n assertActive(node, 'invoke')\n\n let callback: unknown\n let dependsOn: unknown\n try {\n const invocationObject: { callback?: unknown, dependsOn?: unknown } = typeof option === 'function' ? { callback: option } : option\n callback = invocationObject.callback\n dependsOn = invocationObject.dependsOn\n }\n catch (error) {\n throw new InvalidArgumentError('Cannot read the invoke options.', { cause: error })\n }\n if (typeof callback !== 'function')\n throw new InvalidArgumentError('The callback option of invoke is not a function.')\n\n const name = `invocation:${node.runtime.nextSeq()}`\n const edges = readEdges(name, dependsOn)\n const userCallback = callback as (dependencies: unknown, context: unknown) => unknown\n const build: BuildFunction = context => userCallback(context.dependsOn, Object.freeze({ on: context.on, effect: context.effect, signal: context.signal }))\n\n const registered = untracked(() => {\n let service: ServiceNode | undefined\n batch(() => {\n service = createService({ container: node, kind: 'invocation', name, edges, build })\n node.services.add(service)\n })\n\n return service!\n })\n\n container.logger.invoke(edges.map(edge => edge.keyName))\n\n return Object.freeze({ withdraw: () => withdrawService(registered) })\n}\n","import type { ServiceNode } from '../graph/graph'\nimport type { OwnerRecord, ServiceBlocker, ServiceExplanation, StatusCause } from '../types'\n\nimport { resolutionOf } from '../graph/resolvers/resolvers'\nimport { causeOf } from '../graph/status'\nimport { withoutUndefined } from '../helpers/without-undefined'\n\n/** The owners of conflicting declarations, in container order. The order of the registrations has no effect. */\nfunction ownersOf(declarations: readonly ServiceNode[]): readonly OwnerRecord[] {\n return Object.freeze([...declarations].sort((a, b) => a.container.seq - b.container.seq).map(declaration => declaration.container.owner))\n}\n\n/** Explains one service from its current resolution data. It is a pure read. */\nexport function explainService(service: ServiceNode): ServiceExplanation {\n const blockers: ServiceBlocker[] = []\n const phase = service.signals.phase()\n\n if (phase === 'failed')\n blockers.push({ kind: 'failed', error: service.failure?.error })\n if (phase === 'retrying') {\n const previous = service.signals.instance()?.hookStates.get('start')?.previous\n blockers.push({ kind: 'retrying', attempt: previous?.attempt ?? 1, ...withoutUndefined({ reason: previous?.reason }) })\n }\n const rivals = service.signals.rivals()\n if (rivals.length > 0) {\n const registration = service.template ?? service\n blockers.push({ kind: 'conflict', key: service.name, owners: ownersOf([registration, ...rivals]) })\n }\n if (!service.signals.active() && !service.perConsumer)\n blockers.push({ kind: 'not-started' })\n\n for (const edge of service.edges) {\n if (edge.optional)\n continue\n\n const resolution = resolutionOf(service, edge)\n switch (resolution.kind) {\n case 'missing':\n blockers.push({ kind: 'missing-provider', dependency: edge.name, key: edge.keyName })\n continue\n case 'rejected':\n blockers.push({ kind: 'rejected-provider', dependency: edge.name, key: resolution.provider.name, owner: resolution.provider.container.owner, metadata: resolution.provider.metadata })\n continue\n case 'conflict':\n blockers.push({ kind: 'conflicting-dependency', dependency: edge.name, key: resolution.provider.name, owners: ownersOf([resolution.provider, ...resolution.rivals]) })\n continue\n case 'resolved': {\n const status = resolution.provider.signals.effective()\n // A running service keeps an unavailable dependency. Its own status reports it. Only a waiting service lists it as a blocker.\n if (phase !== 'running' && status?.status === 'unavailable')\n blockers.push({ kind: 'unavailable-dependency', dependency: edge.name, key: resolution.provider.name, cause: causeOf(resolution.provider, status) })\n continue\n }\n case 'not-running': {\n const providerPhase = resolution.provider.signals.phase()\n blockers.push(providerPhase === 'failed'\n ? { kind: 'failed-dependency', dependency: edge.name, key: edge.keyName, error: resolution.provider.failure?.error }\n : { kind: 'pending-dependency', dependency: edge.name, key: edge.keyName, phase: providerPhase })\n }\n }\n }\n\n const status = service.signals.effective()\n return Object.freeze({\n name: service.name,\n kind: service.kind === 'invocation' ? 'invocation' : 'service',\n owner: service.container.owner,\n phase,\n ...withoutUndefined({ status: status?.status, reason: status?.reason, cause: status?.cause }),\n blockers: Object.freeze(blockers),\n })\n}\n\n/** Formats a cause chain, for example `'airi.llm' is unavailable (reason), because 'gateway/store' is unavailable`. */\nexport function describeCause(cause: StatusCause): string {\n const parts: string[] = []\n for (let current: StatusCause | undefined = cause; current; current = current.cause)\n parts.push(`'${current.key}' is ${current.status}${current.reason === undefined ? '' : ` (${current.reason})`}`)\n\n return parts.join(', because ')\n}\n\nfunction describeOwners(owners: readonly OwnerRecord[]): string {\n return owners.map(owner => JSON.stringify(owner)).join(', ')\n}\n\nfunction describeBlocker(blocker: ServiceBlocker): string {\n switch (blocker.kind) {\n case 'missing-provider':\n return `no provider for '${blocker.key}' (${blocker.dependency})`\n case 'failed-dependency':\n return `'${blocker.key}' (${blocker.dependency}) failed`\n case 'pending-dependency':\n return `'${blocker.key}' (${blocker.dependency}) is ${blocker.phase}`\n case 'unavailable-dependency':\n return `${describeCause(blocker.cause)} (${blocker.dependency})`\n case 'rejected-provider':\n return `a resolution condition rejected the provider of '${blocker.key}' from ${JSON.stringify(blocker.owner)} (${blocker.dependency})`\n case 'conflicting-dependency':\n return `the exclusive key '${blocker.key}' (${blocker.dependency}) has more than one declaration: ${describeOwners(blocker.owners)}`\n case 'conflict':\n return `the exclusive key '${blocker.key}' has more than one declaration: ${describeOwners(blocker.owners)}`\n case 'failed':\n return 'the service failed'\n case 'retrying':\n return `its start hook requeued after attempt ${blocker.attempt}${blocker.reason === undefined ? '' : ` (${blocker.reason})`}`\n case 'not-started':\n return 'its container is not started'\n }\n}\n\n/** Formats explanations as one line for each service. */\nexport function describeExplanations(explanations: readonly ServiceExplanation[]): string {\n return explanations\n .map((explanation) => {\n const reasons = explanation.blockers.map(describeBlocker)\n if (explanation.cause)\n reasons.push(`it is ${explanation.status ?? 'unavailable'}, because ${describeCause(explanation.cause)}`)\n return `- ${explanation.name} is ${explanation.phase}${reasons.length > 0 ? `: ${reasons.join(', ')}` : ''}`\n })\n .join('\\n')\n}\n","import type { ContainerNode, ServiceNode } from '../graph/graph'\nimport type { Container } from '../types'\n\nimport { InvalidArgumentError, StartTimeoutError } from '../diagnostics/errors'\nimport { describeExplanations, explainService } from '../diagnostics/explain'\nimport { affectedContainers, assertActive, nodeOf, setPhase } from '../graph/nodes'\nimport { errorFrom } from '../helpers/error-from'\nimport { batch, untracked } from '../helpers/signals'\n\nconst visibleKinds: ReadonlySet<ServiceNode['kind']> = new Set(['service', 'invocation'])\n\nconst transitionalPhases: ReadonlySet<string> = new Set(['building', 'starting', 'retrying', 'stopping'])\n\n/** The result of one settle check. `'waiting'` checks again at the next drain. */\ntype SettleCheck = 'waiting' | { readonly kind: 'done' } | { readonly kind: 'failed', readonly errors: readonly unknown[] }\n\n/** Lists the present services and invocations of `containers`. A `perConsumer` registration never runs, so it is not in the list. Its consumer services are. */\nfunction presentServices(containers: readonly ContainerNode[]): ServiceNode[] {\n return containers.flatMap(container => [...container.services].filter(service => visibleKinds.has(service.kind) && service.signals.present() && !service.perConsumer))\n}\n\n/**\n * Runs `check` each time the work queue drains, until the result is not `'waiting'`.\n * With `timeoutMs`, it rejects with `start-timeout` and the explanation of each service that is not `running`.\n */\nfunction waitUntilSettled(containers: readonly ContainerNode[], check: (services: readonly ServiceNode[]) => SettleCheck, timeoutMs?: number): Promise<void> {\n const { clock, reconciler } = containers[0]!.runtime\n\n return new Promise((done, fail) => {\n let cancelTimeout = () => {}\n const stopListening = reconciler.onDrained(() => {\n const result = check(presentServices(containers))\n if (result === 'waiting')\n return\n\n stopListening()\n cancelTimeout()\n if (result.kind === 'done')\n done()\n else\n fail(errorFrom(result.errors, 'Start failed.'))\n })\n\n if (timeoutMs !== undefined) {\n // The timer callback is an entry point.\n cancelTimeout = clock.setTimeout(() => untracked(() => {\n stopListening()\n const explanations = presentServices(containers).filter(service => service.signals.phase() !== 'running').map(explainService)\n fail(new StartTimeoutError(`start() timed out after ${timeoutMs}ms. These services are not running:\\n${describeExplanations(explanations)}`, explanations))\n }), timeoutMs)\n }\n reconciler.requestDrain()\n })\n}\n\nexport interface StartOptions {\n /** Rejects with `start-timeout` when not every service runs after this many milliseconds. There is no default. */\n timeoutMs?: number\n}\n\nfunction readTimeout(options: StartOptions | undefined): number | undefined {\n let timeoutMs: unknown\n try {\n timeoutMs = options?.timeoutMs\n }\n catch (error) {\n throw new InvalidArgumentError('Cannot read the start options.', { cause: error })\n }\n if (timeoutMs !== undefined && (typeof timeoutMs !== 'number' || !Number.isFinite(timeoutMs) || timeoutMs < 0))\n throw new InvalidArgumentError(`The timeoutMs option of start must be a finite number of 0 or more. Got ${String(timeoutMs)}.`)\n\n return timeoutMs\n}\n\n/**\n * Begins convergence of the container and of each child container that was started.\n *\n * Resolves when all their services and invocations are `running`. Rejects with the build and start errors.\n * A service in `failed` tries again. A required key without a provider keeps the promise pending, unless `timeoutMs` is set.\n * A child container that was never started does not start. Call `start(child)` for it.\n */\nexport function start(container: Container, options?: StartOptions): Promise<void> {\n const node = nodeOf(container)\n assertActive(node, 'start')\n const timeoutMs = readTimeout(options)\n\n node.enrolled = true\n const containers = affectedContainers(node)\n const settled = untracked(() => {\n batch(() => {\n for (const current of containers)\n current.signals.started(true)\n for (const service of presentServices(containers)) {\n if (service.signals.phase() === 'failed') {\n service.failure = undefined\n setPhase(service, 'pending', { reason: 'start() tries the failed service again.' })\n }\n }\n })\n\n return waitUntilSettled(containers, (services) => {\n if (services.every(service => service.signals.phase() === 'running'))\n return { kind: 'done' }\n if (services.some(service => transitionalPhases.has(service.signals.phase())))\n return 'waiting'\n\n const errors = services.flatMap(service => service.signals.phase() === 'failed' && service.failure ? [service.failure.error] : [])\n return errors.length > 0 ? { kind: 'failed', errors } : 'waiting'\n }, timeoutMs)\n })\n\n return settled.then(() => container.logger.running())\n}\n\n/**\n * Stops all instances of the container and of each child container that was started. Dependents stop before their providers.\n *\n * The registrations stay. The container stays usable, and a later `start()` builds them again. `dispose()` clears the container.\n * Rejects with the teardown errors.\n */\nexport async function stop(container: Container): Promise<void> {\n const node = nodeOf(container)\n const containers = affectedContainers(node)\n const affected = new Set(containers)\n // The container that the caller stops leaves the start set of its parent. Its started children stay in its own start set.\n node.enrolled = false\n\n const errors: unknown[] = []\n const stopTeardown = node.runtime.reconciler.onTeardown((service, teardownErrors) => {\n if (service.kind !== 'resolver' && affected.has(service.container))\n errors.push(...teardownErrors)\n })\n\n const settled = untracked(() => {\n batch(() => {\n for (const current of containers)\n current.signals.started(false)\n for (const service of presentServices(containers))\n service.signals.demanded(false)\n })\n\n return waitUntilSettled(containers, services => services.every(service => service.signals.instance() === undefined && !transitionalPhases.has(service.signals.phase()))\n ? { kind: 'done' }\n : 'waiting')\n })\n\n try {\n await settled\n }\n finally {\n stopTeardown()\n }\n\n if (errors.length > 0)\n throw errorFrom(errors, 'Stop failed.')\n}\n","import type { Container, EventKey, ListenerMetadata } from '../types'\n\nimport { InvalidArgumentError } from '../diagnostics/errors'\nimport { assertActive, nodeOf } from '../graph/nodes'\n\n/** Reads the `id` of an event key once. Any object with a non-empty string `id` is an event key. */\nexport function readEventId(eventKey: unknown): string {\n let id: unknown\n try {\n id = typeof eventKey === 'object' && eventKey !== null ? (eventKey as EventKey).id : undefined\n }\n catch (error) {\n throw new InvalidArgumentError('Cannot read the id of the event key.', { cause: error })\n }\n if (typeof id !== 'string' || id.length === 0)\n throw new InvalidArgumentError('An event key must be an object with a non-empty string id.')\n\n return id\n}\n\nfunction readListenerMetadata(metadata: unknown): ListenerMetadata {\n if (metadata === undefined)\n return Object.freeze({})\n if (typeof metadata !== 'object' || metadata === null || Array.isArray(metadata))\n throw new InvalidArgumentError('The metadata of a listener must be a record.')\n\n try {\n return Object.freeze({ ...metadata })\n }\n catch (error) {\n throw new InvalidArgumentError('Cannot read the metadata of the listener.', { cause: error })\n }\n}\n\n/**\n * Stores a listener for `eventKey`. The container owns it: `dispose(container)` removes it.\n *\n * injeca does not call the listener. The consumer reads the listeners with `listeners()` and runs them by its own rules.\n * Returns a function that removes the listener.\n */\nexport function listen<H extends (...args: never[]) => unknown>(container: Container, eventKey: EventKey, handler: H, metadata?: ListenerMetadata): () => void {\n const node = nodeOf(container)\n assertActive(node, 'listen')\n const id = readEventId(eventKey)\n if (typeof handler !== 'function')\n throw new InvalidArgumentError(`The listener for '${id}' is not a function.`)\n\n const record = Object.freeze({ seq: node.runtime.nextSeq(), handler, metadata: readListenerMetadata(metadata) })\n const records = node.listeners.get(id) ?? []\n node.listeners.set(id, [...records, record])\n\n return () => {\n const current = node.listeners.get(id)\n if (!current?.includes(record))\n return\n\n const rest = current.filter(entry => entry !== record)\n if (rest.length > 0)\n node.listeners.set(id, rest)\n else\n node.listeners.delete(id)\n }\n}\n","import type { RegistrationNode, ServiceDefinition, ServiceNode, SwapOutcome } from '../graph/graph'\nimport type { Registration } from '../types'\n\nimport { ReplaceWhileStoppingError } from '../diagnostics/errors'\nimport { cancelPending, createService, currentService, publishService, readDefinition, releaseService, withdrawRegistration } from '../graph/nodes'\nimport { createDeferred } from '../helpers/deferred'\nimport { errorFrom } from '../helpers/error-from'\nimport { batch, untracked } from '../helpers/signals'\n\n/** A new service that waits for its swap, with the outcome of the swap. */\ninterface PendingSwap {\n readonly service: ServiceNode\n readonly outcome: Promise<SwapOutcome>\n}\n\n/**\n * Creates a new service that replaces `target` after it completes `start`. It is not published before the swap.\n * `onSwap` runs at the swap, before the outcome settles.\n */\nexport function createSuccessor(target: ServiceNode, definition: ServiceDefinition, template: ServiceNode | undefined, onSettle: (service: ServiceNode, outcome: SwapOutcome) => void, extra: Pick<Parameters<typeof createService>[0], 'phase' | 'transaction'> = {}): PendingSwap {\n const outcome = createDeferred<SwapOutcome>()\n let settled = false\n let service: ServiceNode | undefined\n\n batch(() => {\n service = createService({\n container: target.container,\n kind: 'service',\n name: target.name,\n edges: definition.edges,\n build: definition.build,\n metadata: definition.metadata,\n policy: definition.policy,\n exclusive: target.exclusive,\n template,\n consumer: target.consumer,\n registration: target.registration,\n ...extra,\n swap: {\n target,\n settle: (result) => {\n if (settled)\n return\n\n settled = true\n onSettle(service!, result)\n outcome.resolve(result)\n },\n },\n })\n service.signals.demanded(target.signals.demanded())\n target.container.services.add(service)\n })\n\n return { service: service!, outcome: outcome.promise }\n}\n\nfunction outcomeResult(outcome: SwapOutcome, name: string): boolean {\n switch (outcome.kind) {\n case 'swapped':\n return true\n case 'cancelled':\n return false\n case 'failed':\n throw outcome.error\n case 'stopping':\n throw new ReplaceWhileStoppingError(`'${name}' started to stop before its replacement completed.`)\n }\n}\n\n/** Makes `service` the current registration in place of `target`, in the caller's batch. */\nexport function takeOver(registration: RegistrationNode, target: ServiceNode, service: ServiceNode): void {\n cancelPending(registration)\n target.replacedBy = service\n releaseService(target)\n publishService(service)\n registration.current = service\n}\n\n/** Replaces a service that has no serving instance. The new service takes the slot at once. */\nexport function replaceAtOnce(registration: RegistrationNode, target: ServiceNode, definition: ServiceDefinition): ServiceNode {\n let service: ServiceNode | undefined\n batch(() => {\n service = createService({\n container: target.container,\n kind: 'service',\n name: target.name,\n edges: definition.edges,\n build: definition.build,\n metadata: definition.metadata,\n policy: definition.policy,\n exclusive: target.exclusive,\n perConsumer: target.perConsumer,\n registration,\n })\n service.signals.demanded(target.signals.demanded())\n target.container.services.add(service)\n takeOver(registration, target, service)\n })\n\n return service!\n}\n\n/**\n * Moves the consumer services of the `perConsumer` registration `target` to `template`, in the caller's batch.\n * Each running consumer service gets a new service that swaps in after it completes `start`. The others leave and build again on demand.\n */\nexport function moveConsumers(registration: RegistrationNode, target: ServiceNode, template: ServiceNode, definition: ServiceDefinition): PendingSwap[] {\n const consumers = target.signals.consumers()\n target.signals.consumers(new Map())\n takeOver(registration, target, template)\n\n const swaps: PendingSwap[] = []\n const kept = new Map<ServiceNode['container'], ServiceNode>()\n for (const [container, consumer] of consumers) {\n consumer.template = template\n if (consumer.signals.serving()) {\n kept.set(container, consumer)\n swaps.push(createSuccessor(consumer, definition, template, () => {}))\n }\n else {\n consumer.signals.present(false)\n }\n }\n template.signals.consumers(kept)\n\n return swaps\n}\n\n/** Replaces a `perConsumer` registration. The new registration takes the slot at once. Its consumer services swap in one by one. */\nexport function replaceRegistrationTemplate(registration: RegistrationNode, target: ServiceNode, definition: ServiceDefinition): readonly PendingSwap[] {\n let swaps: PendingSwap[] = []\n batch(() => {\n const template = createService({\n container: target.container,\n kind: 'service',\n name: target.name,\n edges: definition.edges,\n build: definition.build,\n metadata: definition.metadata,\n policy: definition.policy,\n exclusive: target.exclusive,\n perConsumer: true,\n registration,\n })\n target.container.services.add(template)\n swaps = moveConsumers(registration, target, template, definition)\n })\n\n return swaps\n}\n\n/** Settles a replacement for its registration. */\nfunction settleRegistration(registration: RegistrationNode): (service: ServiceNode, outcome: SwapOutcome) => void {\n return (service, outcome) => {\n if (registration.pending === service)\n registration.pending = undefined\n if (outcome.kind === 'swapped')\n registration.current = service\n }\n}\n\n/**\n * Starts the replacement of a running service. The old instance serves until the new one completes `start`.\n * A transaction passes `extra`, and it sets `registration.pending` at its publish.\n */\nexport function replaceRunning(registration: RegistrationNode, target: ServiceNode, definition: ServiceDefinition, extra?: Pick<Parameters<typeof createService>[0], 'phase' | 'transaction'>): PendingSwap {\n const pending = createSuccessor(target, definition, undefined, settleRegistration(registration), extra)\n if (!extra?.transaction) {\n cancelPending(registration)\n registration.pending = pending.service\n }\n\n return pending\n}\n\n/** The `replace()` of a registration. */\nasync function replace(registration: RegistrationNode, option: unknown): Promise<boolean> {\n const target = untracked(() => currentService(registration))\n if (!target)\n return false\n\n const definition = readDefinition(registration.name, option, target)\n const phase = untracked(() => target.signals.phase())\n if (phase === 'stopping')\n throw new ReplaceWhileStoppingError(`'${registration.name}' is stopping. Wait until it stops, then call provide.`)\n\n if (target.perConsumer) {\n const swaps = untracked(() => replaceRegistrationTemplate(registration, target, definition))\n const outcomes = await Promise.all(swaps.map(swap => swap.outcome))\n const errors = outcomes.flatMap(outcome => outcome.kind === 'failed' ? [outcome.error] : [])\n if (errors.length > 0)\n throw errorFrom(errors, `The replacement of '${registration.name}' failed for some consumers.`)\n return true\n }\n if (phase !== 'running') {\n untracked(() => replaceAtOnce(registration, target, definition))\n return true\n }\n\n const pending = untracked(() => replaceRunning(registration, target, definition))\n return outcomeResult(await pending.outcome, registration.name)\n}\n\nconst registrations = new WeakMap<object, RegistrationNode>()\n\n/** The registration behind a result of `provide`, or `undefined` for any other value. */\nexport function registrationOf(key: unknown): RegistrationNode | undefined {\n return typeof key === 'object' && key !== null ? registrations.get(key) : undefined\n}\n\n/** Creates the public result of `provide`: the typed key with `withdraw()` and `replace()`. */\nexport function registrationApi(registration: RegistrationNode): Registration<string, unknown, undefined> {\n const api: Registration<string, unknown, undefined> = Object.freeze({\n key: registration.name,\n ...(registration.exclusive ? { exclusive: true } : {}),\n withdraw: () => withdrawRegistration(registration),\n replace: ((option: unknown) => replace(registration, option)) as Registration<string, unknown, undefined>['replace'],\n })\n registrations.set(api, registration)\n\n return api\n}\n","import type { ContainerNode, RegistrationNode, ServiceDefinition, ServiceNode } from '../graph/graph'\nimport type { Container, DependencyDeclarations, DependencyMap, ProvidedKey, ProvideOption, ProvideOptionObject, ProvideOptionWithKeys, Registration, ResolveDependencyDeclaration } from '../types'\n\nimport ErrorStackParser from 'error-stack-parser'\n\nimport { nanoid } from 'nanoid'\n\nimport { DuplicateServiceError, InvalidArgumentError } from '../diagnostics/errors'\nimport { assertActive, createRegistration, createService, nodeOf, publishService, readDefinition, releaseService } from '../graph/nodes'\nimport { emitRecord } from '../graph/observers'\nimport { slotOf } from '../graph/resolvers/resolvers'\nimport { batch, untracked } from '../helpers/signals'\nimport { isExclusiveKey, normalizeName } from './keys'\nimport { registrationApi } from './replace'\n\nexport function normalizeProvideOption<D extends DependencyMap | undefined, T = any, Key extends string = string>(nameOrOption: Key | ProvidedKey<Key, T, D> | ProvideOption<T, D> | ProvideOptionWithKeys<T, any>, option?: (ProvideOption<T, D> | ProvideOptionWithKeys<T, any>) & { autoNameStackIndex?: number }): ProvideOptionObject<T, D> {\n if (typeof nameOrOption === 'string') {\n if (option == null || (!('build' in option) && typeof option !== 'function')) {\n throw new Error('When using provide(...) as named callback, the second argument must be either a valid ProvideOptionObject<T, D> or a ProvideOptionFunc<T, D>.')\n }\n if (typeof option === 'function') {\n return { build: option } as ProvideOptionObject<T, D>\n }\n\n return option as ProvideOptionObject<T, D>\n }\n if (typeof nameOrOption === 'object' && 'key' in nameOrOption) {\n if (option == null || (!('build' in option) && typeof option !== 'function')) {\n throw new Error('When using provide(...) as typed ProvideOptionWithKeys<T, D, Key> callback, the second argument must be either a valid ProvideOptionObject<T, D> or a ProvideOptionFunc<T, D>.')\n }\n if (typeof option === 'function') {\n return { build: option } as ProvideOptionObject<T, D>\n }\n\n return option as ProvideOptionObject<T, D>\n }\n\n if (typeof nameOrOption === 'function') {\n return { build: nameOrOption } as ProvideOptionObject<T, D>\n }\n\n return nameOrOption as ProvideOptionObject<T, D>\n}\n\n/** The loose shape of all provide options. The overloads check the types. */\nexport type ProvideSecondOption = ((context: never) => unknown) | { build: (context: never) => unknown, dependsOn?: unknown, autoNameStackIndex?: number }\n/** The loose shape of the first provide argument. The overloads check the types. */\nexport type ProvideNameOrOption = string | ProvidedKey<string, unknown, DependencyMap | undefined> | ProvideSecondOption\n\nfunction isProvidedKey(value: unknown): value is ProvidedKey<string, unknown, undefined> {\n return typeof value === 'object' && value !== null && 'key' in value && !('build' in value)\n}\n\nfunction autoName(stackIndex: number, nameOrOption: ProvideNameOrOption, option: ProvideSecondOption | undefined): string {\n const fromFirst = typeof nameOrOption === 'object' && 'autoNameStackIndex' in nameOrOption ? nameOrOption.autoNameStackIndex : undefined\n const fromSecond = typeof option === 'object' ? option.autoNameStackIndex : undefined\n const requested = fromSecond ?? fromFirst\n // `stackIndex` is the frame of the caller of the public `provide`, counted from this function.\n // `autoNameStackIndex` counts from the frame of the public `provide`, as in 0.2.\n const index = typeof requested === 'number' ? requested + stackIndex - 1 : stackIndex\n const parentFile = ErrorStackParser.parse(new Error('providing'))[index]\n\n return `${parentFile?.fileName ?? `unknown-${nanoid()}`}:${parentFile?.lineNumber ?? 0}:${parentFile?.columnNumber ?? 0}`\n}\n\n/** Throws `duplicate-service` when a started container already has a registration for `name`. */\nexport function assertNoDuplicate(container: ContainerNode, name: string): void {\n if (slotOf(container, name)() && container.signals.started())\n throw new DuplicateServiceError(`The started container already has a registration for '${name}'.`)\n}\n\n/**\n * Publishes `service` as the current registration of its key. Call it inside a batch.\n * Before `start()`, a second provide of the same name replaces the first registration, as in 0.2.\n */\nexport function publishRegistration(container: ContainerNode, service: ServiceNode): void {\n const previous = slotOf(container, service.name)()\n if (previous) {\n releaseService(previous)\n emitRecord(container, {\n type: 'registration-replaced',\n key: service.name,\n owner: container.owner,\n instanceId: previous.signals.instance()?.id,\n reason: `A second provide of '${service.name}' replaced the registration before start().`,\n })\n }\n\n publishService(service)\n}\n\n/** Creates the service of one registration. It is not published yet. */\nexport function serviceOf(container: ContainerNode, name: string, definition: ServiceDefinition, exclusive: boolean, extra: Pick<Parameters<typeof createService>[0], 'phase' | 'transaction' | 'registration'> = {}): ServiceNode {\n const service = createService({\n container,\n kind: 'service',\n name,\n edges: definition.edges,\n build: definition.build,\n metadata: definition.metadata,\n policy: definition.policy,\n exclusive,\n perConsumer: definition.perConsumer,\n ...extra,\n })\n container.services.add(service)\n\n return service\n}\n\n/** Makes the service of one `provide` call the current registration of its key. */\nfunction register(container: ContainerNode, name: string, definition: ServiceDefinition, exclusive: boolean): RegistrationNode {\n assertNoDuplicate(container, name)\n\n const registration = createRegistration(container, name, exclusive)\n batch(() => {\n const service = serviceOf(container, name, definition, exclusive, { registration })\n publishRegistration(container, service)\n registration.current = service\n })\n\n return registration\n}\n\n/**\n * Registers a provider. The public `provide` functions call it directly and pass `stackIndex` 3: this function, the auto-name helper, and the public function come before their caller.\n */\nexport function provideIn(container: Container, stackIndex: number, nameOrOption: ProvideNameOrOption, option?: ProvideSecondOption): Registration<string, unknown, undefined> {\n const node = nodeOf(container)\n assertActive(node, 'provide')\n\n const name = typeof nameOrOption === 'string'\n ? nameOrOption\n : isProvidedKey(nameOrOption) ? normalizeName(nameOrOption) : autoName(stackIndex, nameOrOption, option)\n if (typeof name !== 'string' || name.length === 0)\n throw new InvalidArgumentError('A provider name must be a non-empty string.')\n\n const providerObject = normalizeProvideOption(nameOrOption as Parameters<typeof normalizeProvideOption>[0], option as Parameters<typeof normalizeProvideOption>[1])\n const definition = readDefinition(name, providerObject)\n const exclusive = isExclusiveKey(nameOrOption)\n // The name is read above, outside this entry point, so that the stack index of `autoName` stays the same.\n const registration = untracked(() => register(node, name, definition, exclusive))\n\n container.logger.provide(name, definition.edges.map(edge => edge.keyName))\n\n return registrationApi(registration)\n}\n\n/**\n * Registers a provider and returns its typed key with `withdraw()` and `replace()`.\n *\n * Before `start()`, a second provide of the same name replaces the first registration. After `start()`, it throws `duplicate-service`.\n * After `start()`, a new service builds and starts when its dependencies are available.\n */\nexport function provide<T, Key extends string, Deps extends DependencyDeclarations>(container: Container, name: Key, option: ProvideOptionWithKeys<T, Deps>): Registration<Key, T, ResolveDependencyDeclaration<Deps>>\nexport function provide<T, Key extends string, Deps extends DependencyDeclarations>(container: Container, option: ProvideOptionWithKeys<T, Deps> & { autoNameStackIndex?: number }): Registration<Key, T, ResolveDependencyDeclaration<Deps>>\nexport function provide<D extends DependencyMap | undefined, T = any, Key extends string = string>(container: Container, name: Key, option: ProvideOption<T, D>): Registration<Key, T, D>\nexport function provide<D extends DependencyMap | undefined, T = any, Key extends string = string>(container: Container, option: ProvideOption<T, D> & { autoNameStackIndex?: number }): Registration<Key, T, D>\nexport function provide<T, Key extends string, Deps extends DependencyDeclarations>(container: Container, key: ProvidedKey<Key, T, DependencyMap | undefined>, option: ProvideOptionWithKeys<NoInfer<T>, Deps>): Registration<Key, T, ResolveDependencyDeclaration<Deps>>\nexport function provide<T, Key extends string>(container: Container, key: ProvidedKey<Key, T, DependencyMap | undefined>, option: ProvideOption<NoInfer<T>, undefined>): Registration<Key, T, undefined>\nexport function provide(container: Container, nameOrOption: ProvideNameOrOption, option?: ProvideSecondOption): Registration<string, unknown, undefined> {\n return provideIn(container, 3, nameOrOption, option)\n}\n","import type { BuildFunction, ServiceNode } from '../graph/graph'\nimport type { Container, DependencyDeclarations, ResolveDependencyDeclaration } from '../types'\n\nimport { BuildAfterDisposeError } from '../diagnostics/errors'\nimport { assertActive, createService, nodeOf, readEdges, releaseService } from '../graph/nodes'\nimport { blockingFailure } from '../graph/resolvers/resolvers'\nimport { batch, untracked } from '../helpers/signals'\n\n/**\n * Waits until the dependencies are available and returns their values. Before `start()`, it builds and starts them.\n *\n * Rejects when a required dependency fails. The values can become stale after a run-time change. Use it for one-time code.\n */\nexport function resolve<Deps extends DependencyDeclarations>(container: Container, dependsOn: Deps): Promise<ResolveDependencyDeclaration<Deps>> {\n const node = nodeOf(container)\n assertActive(node, 'resolve')\n\n const edges = readEdges('resolve', dependsOn)\n const { reconciler } = node.runtime\n\n return new Promise((done, fail) => untracked(() => {\n let settled = false\n let service: ServiceNode | undefined\n let stopListening = () => {}\n\n const finish = (outcome: () => void): void => {\n if (settled)\n return\n\n settled = true\n stopListening()\n batch(() => releaseService(service!))\n outcome()\n }\n\n // The resolver reads its dependencies in `build`, then withdraws itself. It never starts.\n const build: BuildFunction = context => finish(() => done({ ...context.dependsOn } as ResolveDependencyDeclaration<Deps>))\n\n batch(() => {\n service = createService({ container: node, kind: 'resolver', name: 'resolve', edges, build })\n node.services.add(service)\n })\n\n // A required dependency that failed, directly or through a pending provider, rejects the call.\n stopListening = reconciler.onDrained(() => {\n const failure = blockingFailure(service!)\n if (failure)\n finish(() => fail(failure.error))\n })\n void service!.withdrawal.promise.then(() => finish(() => fail(new BuildAfterDisposeError('The container was disposed before resolve() got its dependencies.'))))\n }))\n}\n","import type { ContainerNode, RegistrationNode, ServiceDefinition, ServiceNode, TransactionEntry, TransactionNode } from '../graph/graph'\nimport type { TransactionMembers } from '../reconciler/commit'\nimport type { Container, DeclareOptions, KeyReference, Registration, Transaction, TransactionProvide, TransactionReplace } from '../types'\n\nimport { DuplicateServiceError, InvalidArgumentError, ReplaceWhileStoppingError, StaleRegistrationError, TransactionIncompleteError } from '../diagnostics/errors'\nimport { assertActive, cancelPending, createRegistration, currentService, nodeOf, readDefinition, readEdges, setPhase } from '../graph/nodes'\nimport { slotOf } from '../graph/resolvers/resolvers'\nimport { batch, untracked } from '../helpers/signals'\nimport { abortTransaction, buildMembers, orderMembers, rollbackMembers, startMembers } from '../reconciler/commit'\nimport { isExclusiveKey, normalizeName } from './keys'\nimport { assertNoDuplicate, publishRegistration, serviceOf } from './provide'\nimport { moveConsumers, registrationApi, registrationOf, replaceRunning, takeOver } from './replace'\n\nfunction readName(key: unknown, action: string): string {\n let name: unknown\n try {\n name = normalizeName(key as string)\n }\n catch (error) {\n throw new InvalidArgumentError(`Cannot read the key of ${action}.`, { cause: error })\n }\n if (typeof name !== 'string' || name.length === 0)\n throw new InvalidArgumentError(`The key of ${action} must be a name or a key.`)\n\n return name\n}\n\nfunction readDeclareOptions(name: string, options: DeclareOptions | undefined): { readonly dependsOn: unknown, readonly optional: boolean } {\n let dependsOn: unknown\n let optional: unknown\n try {\n dependsOn = options?.dependsOn\n optional = options?.optional\n }\n catch (error) {\n throw new InvalidArgumentError(`Cannot read the declare options of '${name}'.`, { cause: error })\n }\n if (optional !== undefined && typeof optional !== 'boolean')\n throw new InvalidArgumentError(`The optional option of '${name}' must be a boolean.`)\n\n return { dependsOn, optional: optional === true }\n}\n\n/** One member of a commit, with what its publish does. */\ninterface Member {\n readonly entry: TransactionEntry\n readonly service: ServiceNode\n /** The service that a `tx.replace` replaces. */\n readonly target?: ServiceNode\n}\n\n/** The service that a `tx.replace` names now. A stale registration, or a key without a registration, fails. */\nfunction replaceTarget(container: ContainerNode, entry: TransactionEntry): ServiceNode {\n const target = entry.target ? currentService(entry.target) : slotOf(container, entry.name)()\n if (!target || !target.signals.present())\n throw new StaleRegistrationError(`The transaction replaces '${entry.name}', but the container has no current registration for it.`)\n if (target.signals.phase() === 'stopping')\n throw new ReplaceWhileStoppingError(`The transaction replaces '${entry.name}', but it is stopping.`)\n\n return target\n}\n\n/** Checks the entries and creates the services of a commit. The services are not published. */\nfunction createMembers(transaction: TransactionNode): Member[] {\n const { container } = transaction\n assertActive(container, 'commit a transaction')\n\n const incomplete = [...transaction.entries.values()].filter(entry => !entry.definition && !entry.optional)\n if (incomplete.length > 0)\n throw new TransactionIncompleteError(`These declared services have no provide: ${incomplete.map(entry => `'${entry.name}'`).join(', ')}.`)\n\n const entries = [...transaction.entries.values()].filter(entry => entry.definition)\n const targets = new Map<TransactionEntry, ServiceNode>()\n for (const entry of entries) {\n if (entry.replace)\n targets.set(entry, replaceTarget(container, entry))\n else\n assertNoDuplicate(container, entry.name)\n }\n\n const members: Member[] = []\n batch(() => {\n for (const entry of entries) {\n const definition = entry.definition!\n const target = targets.get(entry)\n const extra = { phase: 'declared' as const, transaction }\n if (!target) {\n members.push({ entry, service: serviceOf(container, entry.name, definition, entry.exclusive, { ...extra, registration: entry.registration }) })\n continue\n }\n\n const registration = target.registration ?? createRegistration(container, entry.name, target.exclusive)\n const service = target.signals.phase() === 'running' && !target.perConsumer\n ? replaceRunning(registration, target, definition, extra).service\n : serviceOf(container, entry.name, { ...definition, perConsumer: target.perConsumer }, target.exclusive, { ...extra, registration })\n members.push({ entry, service, target })\n }\n })\n\n return members\n}\n\n/** Publishes the members in one batch. A built member goes to `starting`, the others to `pending`. */\nfunction publishMembers(members: readonly Member[], built: ReadonlySet<ServiceNode>): void {\n batch(() => {\n for (const { service, target } of members) {\n service.transaction = undefined\n const registration = service.registration\n if (target && registration && service.swap) {\n // The new service swaps in after it completes `start`.\n cancelPending(registration)\n registration.pending = service\n }\n else if (target && registration && target.perConsumer) {\n moveConsumers(registration, target, service, { edges: service.edges, build: service.build, metadata: service.metadata, perConsumer: true, policy: service.policy })\n }\n else if (target && registration) {\n takeOver(registration, target, service)\n }\n else {\n publishRegistration(service.container, service)\n if (registration)\n registration.current = service\n }\n\n if (service.signals.present())\n setPhase(service, built.has(service) ? 'starting' : 'pending', { reason: built.has(service) ? 'The transaction committed.' : 'The transaction committed. The service waits for its dependencies.' })\n }\n })\n}\n\nasync function commit(transaction: TransactionNode): Promise<void> {\n const members = untracked(() => createMembers(transaction))\n const byName: TransactionMembers = new Map(members.map(member => [member.service.name, member.service]))\n const order = orderMembers(byName)\n\n const outcome = await buildMembers(transaction, order, byName)\n if (outcome.kind !== 'built') {\n await untracked(() => rollbackMembers(byName, outcome.built))\n throw outcome.kind === 'failed' ? outcome.error : transaction.abortError\n }\n\n untracked(() => publishMembers(members, new Set(outcome.built.keys())))\n transaction.state = 'done'\n transaction.container.transactions.delete(transaction)\n // The `start` hooks run after the publish. The commit does not wait for them.\n void startMembers(order, outcome.built)\n}\n\nfunction startCommit(transaction: TransactionNode): Promise<void> {\n if (transaction.state !== 'open')\n return Promise.reject(new InvalidArgumentError(`The transaction is ${transaction.state === 'aborted' ? 'aborted' : 'already committed'}.`))\n\n transaction.state = 'committing'\n const result = commit(transaction).catch((error: unknown) => {\n if (transaction.state !== 'done') {\n transaction.state = 'aborted'\n transaction.container.transactions.delete(transaction)\n }\n throw error\n })\n transaction.settled = result.then(() => {}, () => {})\n\n return result\n}\n\nfunction assertOpen(transaction: TransactionNode, action: string): void {\n if (transaction.state !== 'open')\n throw new InvalidArgumentError(`Cannot ${action} after the transaction committed or aborted.`)\n}\n\nfunction entryOf(transaction: TransactionNode, name: string, exclusive: boolean): TransactionEntry {\n let entry = transaction.entries.get(name)\n if (!entry) {\n entry = { name, declared: undefined, optional: false, definition: undefined, replace: false, target: undefined, registration: undefined, exclusive }\n transaction.entries.set(name, entry)\n }\n\n return entry\n}\n\n/**\n * Creates a transaction for `container`.\n *\n * `declare` reserves services. `provide` and `replace` add services. Nothing is visible to consumers before `commit()`.\n * `commit()` builds the services in dependency order and publishes them in one batch. Then the `start` hooks run.\n * A failed build publishes nothing. A disposal of the container during the transaction aborts it.\n */\nexport function transaction(container: Container): Transaction {\n const node = nodeOf(container)\n assertActive(node, 'create a transaction')\n\n const state: TransactionNode = {\n container: node,\n state: 'open',\n entries: new Map(),\n abortError: undefined,\n controllers: new Set(),\n settled: undefined,\n }\n node.transactions.add(state)\n\n const declare = (key: KeyReference, options?: DeclareOptions): void => {\n assertOpen(state, 'declare')\n const name = readName(key, 'declare')\n const { dependsOn, optional } = readDeclareOptions(name, options)\n const entry = entryOf(state, name, isExclusiveKey(key))\n entry.declared = readEdges(name, dependsOn)\n entry.optional = optional\n }\n\n const provide = ((key: KeyReference, option: unknown): Registration<string, unknown, undefined> => {\n assertOpen(state, 'provide')\n const name = readName(key, 'provide')\n const existing = state.entries.get(name)\n if (existing?.definition)\n throw new DuplicateServiceError(`The transaction already provides '${name}'.`)\n\n const read = readDefinition(name, option)\n const entry = entryOf(state, name, isExclusiveKey(key) || existing?.exclusive === true)\n // A provide without its own edges uses the edges of the declaration.\n const definition: ServiceDefinition = read.edges.length === 0 && entry.declared ? { ...read, edges: entry.declared } : read\n const registration: RegistrationNode = createRegistration(node, name, entry.exclusive)\n entry.definition = definition\n entry.registration = registration\n\n return registrationApi(registration)\n }) as TransactionProvide\n\n const replace = ((key: KeyReference, option: unknown): void => {\n assertOpen(state, 'replace')\n const name = readName(key, 'replace')\n if (state.entries.get(name)?.definition)\n throw new DuplicateServiceError(`The transaction already provides or replaces '${name}'.`)\n\n const target = registrationOf(key)\n const entry = entryOf(state, name, target?.exclusive ?? false)\n entry.definition = readDefinition(name, option, untracked(() => (target ? currentService(target) : slotOf(node, name)())))\n entry.replace = true\n entry.target = target\n }) as TransactionReplace\n\n return Object.freeze({\n declare,\n provide,\n replace,\n commit: () => untracked(() => startCommit(state)),\n abort: () => untracked(() => abortTransaction(state, new TransactionIncompleteError('The transaction was aborted before the commit completed.'))),\n })\n}\n","import type { ContainerNode, ServiceNode } from '../graph/graph'\n\nimport { subtreeOf } from '../graph/nodes'\nimport { candidatesOf, resolutionOf, serviceFor } from '../graph/resolvers/resolvers'\n\n/** The plain result of an impact run, before it becomes graph entries. */\nexport interface ImpactSets {\n readonly stopped: ReadonlySet<ServiceNode>\n readonly rebuilt: ReadonlySet<ServiceNode>\n readonly notified: ReadonlySet<ServiceNode>\n}\n\n/** The proposed change as sets of services. */\nexport interface ProposedChange {\n /** The services that leave: a withdrawal or a disposal. */\n readonly removed: ReadonlySet<ServiceNode>\n /** The services that get a new instance: a replacement. */\n readonly renewed: ReadonlySet<ServiceNode>\n}\n\nconst livePhases: ReadonlySet<string> = new Set(['building', 'starting', 'retrying', 'running'])\n\n/** A service with an instance that a change can stop or rebuild. A new service that waits for its swap does not count. */\nfunction isLive(service: ServiceNode): boolean {\n return service.kind !== 'resolver' && !service.swap && service.signals.instance() !== undefined && livePhases.has(service.signals.phase())\n}\n\nfunction rootOf(container: ContainerNode): ContainerNode {\n let root = container\n while (root.parent)\n root = root.parent\n\n return root\n}\n\n/** The services of a `perConsumer` registration, with the registration. */\nfunction withConsumers(service: ServiceNode): ServiceNode[] {\n return [service, ...service.signals.consumers().values()]\n}\n\n/** Lists the services that leave when `container` and its descendants are disposed. */\nexport function disposedServices(container: ContainerNode): Set<ServiceNode> {\n return new Set(subtreeOf(container).flatMap(current => [...current.services]).flatMap(withConsumers))\n}\n\n/** Lists the services that leave when `service` is withdrawn. */\nexport function withdrawnServices(service: ServiceNode): Set<ServiceNode> {\n return new Set(withConsumers(service))\n}\n\n/**\n * Computes what a proposed change does, on a copy of the graph state. It reads the real graph and never writes it.\n *\n * - A dependent that loses a required dependency without an alternative provider stops. Its dependents follow.\n * - A dependent whose dependency gets another instance gets `dependency-change`. With a handler, it is notified. Without one, it rebuilds, and its dependents follow.\n * - An alternative provider is an ancestor registration that serves, or another `firstAvailable` candidate.\n */\nexport function computeImpact(scope: ContainerNode, change: ProposedChange): ImpactSets {\n const services = subtreeOf(rootOf(scope)).flatMap(container => [...container.services]).filter(isLive)\n const stopped = new Set<ServiceNode>([...change.removed].filter(isLive))\n const rebuilt = new Set<ServiceNode>()\n const notified = new Set<ServiceNode>()\n const gone = (service: ServiceNode): boolean => change.removed.has(service) || stopped.has(service)\n const renewed = (service: ServiceNode): boolean => change.renewed.has(service) || rebuilt.has(service)\n\n /** Tells whether another candidate of the edge serves after the change. */\n const alternative = (consumer: ServiceNode, keyNames: readonly string[]): boolean => keyNames.some(keyName =>\n candidatesOf(consumer.container, keyName, consumer).some((registration) => {\n const provider = serviceFor(registration, consumer.container)\n return provider !== undefined && !gone(provider) && !gone(registration) && provider.signals.serving()\n }))\n\n let changed = true\n while (changed) {\n changed = false\n for (const service of services) {\n if (stopped.has(service) || change.removed.has(service))\n continue\n\n let lost = false\n let identity = false\n for (const edge of service.edges) {\n const resolution = resolutionOf(service, edge)\n if (resolution.kind !== 'resolved')\n continue\n\n const provider = resolution.provider\n if (gone(provider)) {\n if (alternative(service, edge.candidates))\n identity = true\n else if (edge.optional)\n identity = true\n else\n lost = true\n }\n else if (renewed(provider)) {\n identity = true\n }\n }\n\n if (lost) {\n rebuilt.delete(service)\n notified.delete(service)\n stopped.add(service)\n changed = true\n }\n else if (identity && !rebuilt.has(service) && !notified.has(service)) {\n const instance = service.signals.instance()\n if (instance && instance.hooks['dependency-change'].length > 0) {\n notified.add(service)\n }\n else {\n rebuilt.add(service)\n changed = true\n }\n }\n }\n }\n\n return { stopped, rebuilt, notified }\n}\n","import type { ContainerNode, DependencyEdge, ServiceNode, TransactionEntry } from '../graph/graph'\nimport type { Container, Graph, GraphDependency, GraphResolution, GraphService, ImpactChange, ImpactResult, KeyReference, ServiceExplanation } from '../types'\nimport type { ProposedChange } from './impact'\n\nimport { InvalidArgumentError } from '../diagnostics/errors'\nimport { explainService } from '../diagnostics/explain'\nimport { nodeOf, subtreeOf } from '../graph/nodes'\nimport { findProvider, resolutionOf, selectProvider } from '../graph/resolvers/resolvers'\nimport { untracked } from '../helpers/signals'\nimport { withoutUndefined } from '../helpers/without-undefined'\nimport { normalizeName } from '../primitives/keys'\nimport { computeImpact, disposedServices, withdrawnServices } from './impact'\n\nconst emptyMetadata = Object.freeze({})\n\nfunction readKey(key: unknown, action: string): string {\n let name: unknown\n try {\n name = normalizeName(key as string)\n }\n catch (error) {\n throw new InvalidArgumentError(`Cannot read the key of ${action}.`, { cause: error })\n }\n if (typeof name !== 'string' || name.length === 0)\n throw new InvalidArgumentError(`The key of ${action} must be a name or a key.`)\n\n return name\n}\n\nfunction entryOf(service: ServiceNode): GraphService {\n const status = service.signals.effective()\n return Object.freeze({\n key: service.name,\n kind: service.kind === 'invocation' ? 'invocation' : 'service',\n owner: service.container.owner,\n phase: service.signals.phase(),\n ...withoutUndefined({ status: status?.status, instanceId: service.signals.instance()?.id, consumer: service.consumer }),\n metadata: service.metadata,\n exclusive: service.exclusive,\n perConsumer: service.perConsumer,\n })\n}\n\nfunction declaredEntryOf(container: ContainerNode, entry: TransactionEntry): GraphService {\n return Object.freeze({\n key: entry.name,\n kind: 'service',\n owner: container.owner,\n phase: 'declared',\n metadata: entry.definition?.metadata ?? emptyMetadata,\n exclusive: entry.exclusive,\n perConsumer: entry.definition?.perConsumer ?? false,\n })\n}\n\n/** The services and invocations of the scope that are not `withdrawn`, in registration order. */\nfunction servicesOf(scope: ContainerNode): ServiceNode[] {\n return subtreeOf(scope)\n .flatMap(container => [...container.services])\n .filter(service => service.kind !== 'resolver' && service.signals.phase() !== 'withdrawn')\n .sort((a, b) => a.seq - b.seq)\n}\n\n/** The keys that open transactions declared and did not publish yet. */\nfunction declaredOf(scope: ContainerNode): { readonly container: ContainerNode, readonly entry: TransactionEntry }[] {\n return subtreeOf(scope).flatMap(container => [...container.transactions]\n .filter(transaction => transaction.state === 'open')\n .flatMap(transaction => [...transaction.entries.values()].map(entry => ({ container, entry }))))\n}\n\n/** Finds the service of `name`: the provider that a consumer in `scope` sees, then the first service of that name in the scope. */\nfunction lookup(scope: ContainerNode, name: string): ServiceNode | undefined {\n return findProvider(scope, name) ?? servicesOf(scope).find(service => service.name === name)\n}\n\n/** The providers that the edges of `service` select now, served or not. */\nfunction targetsOf(service: ServiceNode): ServiceNode[] {\n return service.edges.flatMap(edge => edge.candidates.flatMap((keyName) => {\n const provider = findProvider(service.container, keyName, service)\n return provider ? [provider] : []\n }))\n}\n\nfunction resolutionKind(service: ServiceNode, edge: DependencyEdge): { readonly kind: GraphResolution, readonly provider?: ServiceNode } {\n const resolution = resolutionOf(service, edge)\n return resolution.kind === 'missing' ? { kind: 'missing' } : { kind: resolution.kind, provider: resolution.provider }\n}\n\nfunction dependencyOf(edge: DependencyEdge, resolution: { readonly kind: GraphResolution, readonly provider?: ServiceNode }): GraphDependency {\n return Object.freeze({\n name: edge.name,\n keys: edge.candidates,\n optional: edge.optional,\n fallback: edge.fallback,\n conditional: edge.condition !== undefined,\n resolution: resolution.kind,\n ...withoutUndefined({ provider: resolution.provider && entryOf(resolution.provider) }),\n })\n}\n\n/** The resolution of a declared edge, which has no computed resolution yet. */\nfunction declaredResolution(container: ContainerNode, edge: DependencyEdge): { readonly kind: GraphResolution, readonly provider?: ServiceNode } {\n for (const keyName of edge.candidates) {\n const selection = selectProvider(container, keyName)\n if (!selection)\n continue\n const provider = selection.provider ?? selection.registration\n return { kind: provider.signals.serving() ? 'resolved' : 'not-running', provider }\n }\n\n return { kind: 'missing' }\n}\n\n/**\n * Orders `services` so that each provider comes before its dependents. It is Tarjan's algorithm: each cycle comes out as one group.\n * Returns the groups in order.\n */\nfunction components(services: readonly ServiceNode[]): ServiceNode[][] {\n const inScope = new Set(services)\n const index = new Map<ServiceNode, number>()\n const low = new Map<ServiceNode, number>()\n const stack: ServiceNode[] = []\n const onStack = new Set<ServiceNode>()\n const groups: ServiceNode[][] = []\n let counter = 0\n\n const visit = (service: ServiceNode): void => {\n index.set(service, counter)\n low.set(service, counter)\n counter++\n stack.push(service)\n onStack.add(service)\n\n for (const target of targetsOf(service)) {\n if (!inScope.has(target))\n continue\n if (!index.has(target)) {\n visit(target)\n low.set(service, Math.min(low.get(service)!, low.get(target)!))\n }\n else if (onStack.has(target)) {\n low.set(service, Math.min(low.get(service)!, index.get(target)!))\n }\n }\n\n if (low.get(service) === index.get(service)) {\n const group: ServiceNode[] = []\n let member: ServiceNode | undefined\n do {\n member = stack.pop()!\n onStack.delete(member)\n group.push(member)\n } while (member !== service)\n groups.push(group.sort((a, b) => a.seq - b.seq))\n }\n }\n\n for (const service of services) {\n if (!index.has(service))\n visit(service)\n }\n\n return groups\n}\n\n/** The services of `roots` and their transitive dependencies. */\nfunction closure(roots: readonly ServiceNode[]): ServiceNode[] {\n const seen = new Set<ServiceNode>()\n const queue = [...roots]\n while (queue.length > 0) {\n const service = queue.shift()!\n if (seen.has(service))\n continue\n\n seen.add(service)\n queue.push(...targetsOf(service))\n }\n\n return [...seen].sort((a, b) => a.seq - b.seq)\n}\n\nfunction sorted(services: ReadonlySet<ServiceNode>): readonly GraphService[] {\n return Object.freeze([...services].sort((a, b) => a.seq - b.seq).map(entryOf))\n}\n\nfunction proposedChange(scope: ContainerNode, change: ImpactChange): ProposedChange {\n let kind: unknown\n let key: unknown\n let container: unknown\n try {\n kind = change.kind\n key = 'key' in change ? change.key : undefined\n container = 'container' in change ? change.container : undefined\n }\n catch (error) {\n throw new InvalidArgumentError('Cannot read the impact change.', { cause: error })\n }\n\n switch (kind) {\n case 'withdraw':\n case 'replace': {\n const service = lookup(scope, readKey(key, 'impact'))\n if (!service)\n return { removed: new Set(), renewed: new Set() }\n const registration = service.template ?? service\n return kind === 'withdraw'\n ? { removed: withdrawnServices(registration), renewed: new Set() }\n : { removed: new Set(), renewed: withdrawnServices(registration) }\n }\n case 'dispose':\n return { removed: disposedServices(nodeOf(container as Container)), renewed: new Set() }\n default:\n throw new InvalidArgumentError(`The impact change kind must be 'withdraw', 'replace', or 'dispose'. Got ${String(kind)}.`)\n }\n}\n\n/**\n * Returns the graph queries of `container`. They cover the container and its descendants. Each query is a pure read.\n *\n * A key resolves as for a consumer in the container: from the container, then from its ancestors. A key that only a descendant has resolves to the first such service.\n */\nexport function graph(container: Container): Graph {\n const scope = nodeOf(container)\n\n return Object.freeze({\n services: () => untracked(() => Object.freeze([\n ...servicesOf(scope).map(entryOf),\n ...declaredOf(scope).map(({ container: owner, entry }) => declaredEntryOf(owner, entry)),\n ])),\n\n dependencies: (key: KeyReference) => untracked(() => {\n const name = readKey(key, 'dependencies')\n const service = lookup(scope, name)\n if (service)\n return Object.freeze(service.edges.map(edge => dependencyOf(edge, resolutionKind(service, edge))))\n\n const declared = declaredOf(scope).find(({ entry }) => entry.name === name)\n const edges = declared?.entry.definition?.edges ?? declared?.entry.declared ?? []\n return Object.freeze(edges.map(edge => dependencyOf(edge, declaredResolution(declared!.container, edge))))\n }),\n\n dependents: (key: KeyReference) => untracked(() => {\n const target = lookup(scope, readKey(key, 'dependents'))\n if (!target)\n return Object.freeze([])\n\n const registration = target.template ?? target\n return Object.freeze(servicesOf(scope)\n .filter(service => service.edges.some((edge) => {\n const resolution = resolutionOf(service, edge)\n return resolution.kind !== 'missing' && (resolution.provider === target || (resolution.provider.template ?? resolution.provider) === registration)\n }))\n .map(entryOf))\n }),\n\n order: (keys?: readonly KeyReference[]) => untracked(() => {\n const services = keys === undefined\n ? servicesOf(scope)\n : closure(keys.flatMap((key) => {\n const service = lookup(scope, readKey(key, 'order'))\n return service ? [service] : []\n }))\n\n return Object.freeze(components(services).flat().map(entryOf))\n }),\n\n cycles: () => untracked(() => Object.freeze(components(servicesOf(scope))\n .filter(group => group.length > 1)\n .map(group => Object.freeze(group.map(entryOf))))),\n\n impact: (change: ImpactChange): ImpactResult => untracked(() => {\n const result = computeImpact(scope, proposedChange(scope, change))\n return Object.freeze({ stopped: sorted(result.stopped), rebuilt: sorted(result.rebuilt), notified: sorted(result.notified) })\n }),\n\n explain: (key: KeyReference): ServiceExplanation | undefined => untracked(() => {\n const name = readKey(key, 'explain')\n const service = lookup(scope, name)\n if (service)\n return explainService(service)\n\n const declared = declaredOf(scope).find(({ entry }) => entry.name === name)\n return declared && Object.freeze({ name, kind: 'service', owner: declared.container.owner, phase: 'declared', blockers: Object.freeze([]) })\n }),\n })\n}\n","import type { Container, EventKey, ListenerEntry } from '../types'\n\nimport { nodeOf, subtreeOf } from '../graph/nodes'\nimport { readEventId } from '../primitives/listen'\n\n/**\n * Returns the current listeners for `eventKey` in `container` and its descendants, in registration order.\n *\n * Each entry has the handler, the owner record of the container that owns it, and its metadata.\n * `H` is the handler type that the caller expects. injeca does not check it.\n */\nexport function listeners<H = (...args: never[]) => unknown>(container: Container, eventKey: EventKey): readonly ListenerEntry<H>[] {\n const id = readEventId(eventKey)\n\n return Object.freeze(subtreeOf(nodeOf(container))\n .filter(node => node.state !== 'disposed')\n .flatMap(node => (node.listeners.get(id) ?? []).map(record => ({ record, owner: node.owner })))\n .sort((a, b) => a.record.seq - b.record.seq)\n .map(({ record, owner }): ListenerEntry<H> => Object.freeze({ handler: record.handler as H, owner, metadata: record.metadata })))\n}\n","import type { Logger } from './diagnostics/logger'\nimport type { InvokeAnyOption, ProvideNameOrOption, ProvideSecondOption, StartOptions } from './scoped'\nimport type {\n Container,\n DependencyDeclarations,\n DependencyMap,\n InvocationHandle,\n InvokeOption,\n InvokeOptionWithKeys,\n ProvidedKey,\n ProvideOption,\n ProvideOptionWithKeys,\n Registration,\n ResolveDependencyDeclaration,\n} from './types'\n\nimport { createContainer } from './primitives/container'\nimport { invokeIn, provideIn, resolve as scopedResolve, start as scopedStart, stop as scopedStop } from './scoped'\n\nlet globalContainer = createContainer()\n\nexport function setLogger(logger: Logger) {\n globalContainer.logger = logger\n}\n\n/** Returns the root container of the global functions. Pass it as `parent` to make a child container. */\nexport function getContainer(): Container {\n return globalContainer\n}\n\n/** Replaces the global container with a new one. `getContainer()` then returns the new one. It does not stop or dispose the old container. */\nexport function resetContainer() {\n globalContainer = createContainer()\n}\n\nexport function provide<T, Key extends string, Deps extends DependencyDeclarations>(name: Key, option: ProvideOptionWithKeys<T, Deps>): Registration<Key, T, ResolveDependencyDeclaration<Deps>>\nexport function provide<D extends DependencyMap | undefined, T = any, Key extends string = string>(name: Key, option: ProvideOption<T, D>): Registration<Key, T, D>\nexport function provide<T, Key extends string, Deps extends DependencyDeclarations>(option: ProvideOptionWithKeys<T, Deps>): Registration<Key, T, ResolveDependencyDeclaration<Deps>>\nexport function provide<D extends DependencyMap | undefined, T = any, Key extends string = string>(option: ProvideOption<T, D>): Registration<Key, T, D>\nexport function provide<T, Key extends string, Deps extends DependencyDeclarations>(key: ProvidedKey<Key, T, DependencyMap | undefined>, option: ProvideOptionWithKeys<NoInfer<T>, Deps>): Registration<Key, T, ResolveDependencyDeclaration<Deps>>\nexport function provide<T, Key extends string>(key: ProvidedKey<Key, T, DependencyMap | undefined>, option: ProvideOption<NoInfer<T>, undefined>): Registration<Key, T, undefined>\nexport function provide(nameOrOption: ProvideNameOrOption, option?: ProvideSecondOption): Registration<string, unknown, undefined> {\n return provideIn(globalContainer, 3, nameOrOption, option)\n}\n\nexport function invoke<Deps extends DependencyDeclarations>(option: InvokeOptionWithKeys<Deps>): InvocationHandle\nexport function invoke<D extends DependencyMap>(option: InvokeOption<D>): InvocationHandle\nexport function invoke(option: InvokeAnyOption): InvocationHandle {\n return invokeIn(globalContainer, option)\n}\n\nexport function resolve<Deps extends DependencyDeclarations>(dependsOn: Deps): Promise<ResolveDependencyDeclaration<Deps>> {\n return scopedResolve(globalContainer, dependsOn)\n}\n\nexport function start(options?: StartOptions): Promise<void> {\n return scopedStart(globalContainer, options)\n}\n\nexport function stop(): Promise<void> {\n return scopedStop(globalContainer)\n}\n"],"mappings":"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"}
|