injeca 0.2.0 → 0.4.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-B5N-d-TO.mjs","names":["readOwner","effect","invoke","start","stop","provide","resolve","entryOf","scopedResolve","scopedStart","scopedStop"],"sources":["../package.json","../src/diagnostics/logger.ts","../src/helpers/clock.ts","../src/helpers/abort.ts","../src/helpers/cleanup-context.ts","../src/helpers/delivery-queue.ts","../src/reconciler/build-context.ts","../src/reconciler/calls.ts","../src/reconciler/demand.ts","../src/reconciler/holds.ts","../src/reconciler/reentry.ts","../src/reconciler/snapshot.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/rebuild.ts","../src/reconciler/dependency-hooks.ts","../src/reconciler/registration.ts","../src/reconciler/retry.ts","../src/reconciler/reconciler.ts","../src/primitives/container.ts","../src/primitives/withdraw.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/timeout.ts","../src/primitives/transaction.ts","../src/queries/impact.ts","../src/queries/graph.ts","../src/queries/peek.ts","../src/queries/listeners.ts","../src/global.ts"],"sourcesContent":["","import type { Logg as LoggLogger } from '@guiiai/logg'\n\nimport { name } from '../../package.json'\n\n/**\n * The logger of a container. `warn` always writes. The other methods write the lifecycle trace, and injeca calls them only when the `logging` option of the container is `true`.\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 /** A call that injeca handled in another way than the caller asked, for example a re-entrant `dispose()` that resolved at once. */\n warn: (message: string) => void\n}\n\nexport interface LoggerOptions {\n /**\n * Writes the lifecycle trace: `provide`, `invoke`, builds, `start` and `stop` hooks, and `running`. It defaults to `false`.\n * A child container uses the value of its parent, unless it sets its own. `warn` does not depend on it.\n */\n logging?: boolean\n /**\n * The logger. It defaults to the logger of the parent container, then to `createDefaultLogger()`.\n * To also silence the warnings, for example in tests, pass `createNoopLogger()`.\n */\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 warn: (message: string) => {\n console.warn(`[${name}] WARN ${message}`)\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 warn: (message: string) => {\n logg.warn(message)\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 warn: () => {},\n }\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, and `timeout()` uses it for its signal. 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\n/**\n * Calls `callback` after `ms` milliseconds of `clock`, like `clock.setTimeout`. Returns a function that cancels the call.\n *\n * With `systemClock`, the timer does not keep a Node process alive, as for `AbortSignal.timeout()`. Other clocks get a plain `setTimeout` call.\n */\nexport function setWeakTimeout(clock: Clock, callback: () => void, ms: number): () => void {\n if (clock !== systemClock)\n return clock.setTimeout(callback, ms)\n\n const handle: unknown = globalThis.setTimeout(callback, ms)\n // NOTICE:\n // A timer of `timeout()` must not keep a Node process alive, because the caller cannot cancel it when its wait ends early.\n // Node and Bun return a timer object with `unref()`. Browsers return a number. The library has no Node types, so the check is structural.\n // Source: the timer of `AbortSignal.timeout()` is unref'd in Node (https://nodejs.org/api/globals.html#static-method-abortsignaltimeoutdelay).\n // Remove when `Clock` gets its own option for timers that do not keep the process alive.\n if (typeof handle === 'object' && handle !== null && typeof (handle as { readonly unref?: unknown }).unref === 'function')\n (handle as { readonly unref: () => void }).unref()\n\n return () => globalThis.clearTimeout(handle as Parameters<typeof globalThis.clearTimeout>[0])\n}\n","import type { Clock } from './clock'\n\nimport { InvalidArgumentError, WaitTimeoutError } from '../diagnostics/errors'\nimport { setWeakTimeout } from './clock'\nimport { untracked } from './signals'\n\n/** The reason of a timeout signal: a `DOMException` with the name `TimeoutError`, as for `AbortSignal.timeout()`. */\nexport function timeoutReason(message: string): DOMException {\n return new DOMException(message, 'TimeoutError')\n}\n\n/** Returns `true` when `reason` names itself a timeout: `reason.name === 'TimeoutError'`. The reason of `AbortSignal.timeout()` and of `timeout()` passes. */\nexport function isTimeoutReason(reason: unknown): boolean {\n return typeof reason === 'object' && reason !== null && (reason as { readonly name?: unknown }).name === 'TimeoutError'\n}\n\n/** The rejection of a wait for a state that `reason` aborted: `wait-timeout` with the reason as `cause` for a timeout reason, else the reason itself. */\nexport function waitAbortError(reason: unknown, message: string): unknown {\n return isTimeoutReason(reason) ? new WaitTimeoutError(message, { cause: reason }) : reason\n}\n\n/**\n * Aborts `controller` when one of `sources` aborts, with the reason of that source.\n * Returns a function that removes the listeners. The listeners also go when the first source aborts.\n */\nexport function forwardAbort(controller: AbortController, sources: readonly AbortSignal[]): () => void {\n const listeners: Array<readonly [AbortSignal, () => void]> = []\n const release = (): void => {\n for (const [source, listener] of listeners.splice(0))\n source.removeEventListener('abort', listener)\n }\n\n for (const source of sources) {\n if (source.aborted) {\n release()\n controller.abort(source.reason)\n return release\n }\n\n const listener = (): void => {\n release()\n controller.abort(source.reason)\n }\n source.addEventListener('abort', listener, { once: true })\n listeners.push([source, listener])\n }\n\n return release\n}\n\n/** The signals that each combined signal of `anySignal` comes from. A derived signal keeps the origin of its sources. */\nconst parents = new WeakMap<AbortSignal, readonly AbortSignal[]>()\n\n/**\n * Returns a signal that aborts when one of `signals` aborts, with the reason of the first one. `undefined` entries are skipped.\n *\n * It uses `AbortSignal.any` when the runtime has it. Otherwise it forwards the abort, and removes its listeners from all signals when it aborts.\n */\nexport function anySignal(...signals: ReadonlyArray<AbortSignal | undefined>): AbortSignal {\n const sources = signals.filter((signal): signal is AbortSignal => signal !== undefined)\n if (sources.length === 1)\n return sources[0]!\n\n let signal: AbortSignal\n if (typeof AbortSignal.any === 'function') {\n signal = AbortSignal.any(sources)\n }\n else {\n const controller = new AbortController()\n forwardAbort(controller, sources)\n signal = controller.signal\n }\n parents.set(signal, sources)\n return signal\n}\n\n/** Lists `signal` and each signal that it comes from through `anySignal`, `withTimeout` included, nearest first. */\nexport function signalSources(signal: AbortSignal): AbortSignal[] {\n const seen = new Set<AbortSignal>([signal])\n const queue = [signal]\n for (let index = 0; index < queue.length; index++) {\n for (const parent of parents.get(queue[index]!) ?? []) {\n if (!seen.has(parent)) {\n seen.add(parent)\n queue.push(parent)\n }\n }\n }\n\n return queue\n}\n\n/** A signal that aborts after `ms` of `clock`. `cancel` stops the timer, and the signal then never aborts. */\nexport interface TimeoutSignal {\n readonly signal: AbortSignal\n readonly cancel: () => void\n}\n\n/**\n * Creates a signal that aborts after `ms` milliseconds of `clock`, with the result of `reason`.\n *\n * With `weak` and the system clock, the timer does not keep a Node process alive, as for `AbortSignal.timeout()`.\n */\nexport function timeoutSignal(clock: Clock, ms: number, reason: () => unknown, weak = false): TimeoutSignal {\n const controller = new AbortController()\n // The timer callback is an entry point.\n const abort = (): void => untracked(() => controller.abort(reason()))\n const cancel = weak ? setWeakTimeout(clock, abort, ms) : clock.setTimeout(abort, ms)\n\n return { signal: controller.signal, cancel }\n}\n\n/** Reads and checks the `signal` option of `options` once. `action` names the call in errors. */\nexport function readSignal(options: { readonly signal?: unknown } | undefined, action: string): AbortSignal | undefined {\n let signal: unknown\n try {\n signal = options?.signal\n }\n catch (error) {\n throw new InvalidArgumentError(`Cannot read the ${action} options.`, { cause: error })\n }\n if (signal !== undefined && !(signal instanceof AbortSignal))\n throw new InvalidArgumentError(`The signal option of ${action} must be an AbortSignal.`)\n\n return signal\n}\n\n/** Calls `callback` with the reason when `signal` aborts. Returns a function that removes the listener. The callback is an entry point, so it runs untracked. */\nexport function onAbort(signal: AbortSignal | undefined, callback: (reason: unknown) => void): () => void {\n if (!signal)\n return () => {}\n\n const listener = (): void => untracked(() => callback(signal.reason))\n signal.addEventListener('abort', listener, { once: true })\n return () => signal.removeEventListener('abort', listener)\n}\n\n/**\n * Waits for `promise` until `signal` aborts. At the abort, it rejects with the result of `reasonOf`, and nothing waits for `promise` any more.\n *\n * A rejection of `promise` after the abort is not reported. The listener goes when the wait settles.\n */\nexport function abortable<T>(promise: Promise<T>, signal: AbortSignal | undefined, reasonOf: (reason: unknown) => unknown = reason => reason): Promise<T> {\n if (!signal)\n return promise\n if (signal.aborted) {\n promise.catch(() => {})\n return Promise.reject(reasonOf(signal.reason))\n }\n\n return new Promise<T>((resolve, reject) => {\n const remove = onAbort(signal, (reason) => {\n promise.catch(() => {})\n reject(reasonOf(reason))\n })\n promise.then(\n (value) => {\n remove()\n resolve(value)\n },\n (error: unknown) => {\n remove()\n reject(error)\n },\n )\n })\n}\n\n/** The result of `raceAbort`: the value of the promise, or `aborted` when the signal aborted first. */\nexport type RaceResult<T> = { readonly kind: 'settled', readonly value: T } | { readonly kind: 'aborted' }\n\n/**\n * Waits for `promise` until `signal` aborts. An aborted signal gives `aborted` at once.\n *\n * A rejection of `promise` before the abort rejects the result. After the abort, nothing waits for `promise`, and its rejection is not reported.\n */\nexport function raceAbort<T>(promise: Promise<T>, signal: AbortSignal): Promise<RaceResult<T>> {\n return new Promise((resolve, reject) => {\n if (signal.aborted) {\n promise.catch(() => {})\n resolve({ kind: 'aborted' })\n return\n }\n\n const remove = onAbort(signal, () => {\n promise.catch(() => {})\n resolve({ kind: 'aborted' })\n })\n promise.then(\n (value) => {\n remove()\n resolve({ kind: 'settled', value })\n },\n (error: unknown) => {\n remove()\n reject(error)\n },\n )\n })\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","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 { Logger } from '../diagnostics/logger'\nimport type { ServiceNode } from '../graph/graph'\nimport type { Container } from '../types'\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/** The logger of the lifecycle trace of `container`, or `undefined` when its `logging` option is off. `warn` does not use it. */\nexport function traceLoggerOf(container: Container): Logger | undefined {\n return container.logging ? container.logger : undefined\n}\n\n/** Only services with a key write the lifecycle trace. Invocations and resolvers do not. */\nexport function loggerOf(service: ServiceNode): Logger | undefined {\n return service.kind === 'service' ? traceLoggerOf(service.container.api) : 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 { ServiceNode } from '../graph/graph'\n\nimport { ensureConsumerService } from '../graph/nodes'\nimport { candidatesOf } from '../graph/resolvers/resolvers'\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 scope of `service`. The nearest registration of each key is demanded.\n *\n * A pending service demands its providers before it builds. A running service demands them too, so that an optional or a fallback edge to a key that registers later gets its consumer service.\n */\nexport function demandProviders(service: ServiceNode): void {\n for (const edge of service.edges) {\n for (const keyName of edge.candidates) {\n const candidates = candidatesOf(service.scope, keyName, service)\n const providers = candidates.map(registration => registration.perConsumer ? ensureConsumerService(registration, service.scope, service) : registration)\n const [nearest] = providers\n if (nearest && !nearest.signals.serving() && !nearest.signals.demanded())\n nearest.signals.demanded(true)\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 { ContainerNode, InstanceNode, ServiceNode } from '../graph/graph'\nimport type { CleanupContext, CleanupFrame } from '../helpers/cleanup-context'\n\nimport { emitRecord } from '../graph/observers'\nimport { signalSources } from '../helpers/abort'\n\n/** The instance of each signal that injeca gives to a run: the build signal of an instance, and the signal of each hook run. */\nconst signalOrigins = new WeakMap<AbortSignal, InstanceNode>()\n\n/** The service of each cleanup frame of a teardown. */\nconst frameServices = new WeakMap<CleanupFrame, ServiceNode>()\n\n/** Records that `signal` belongs to the runs of `instance`. A signal from `anySignal` or `withTimeout` on top of it keeps this origin. */\nexport function recordSignalOrigin(signal: AbortSignal, instance: InstanceNode): void {\n signalOrigins.set(signal, instance)\n}\n\n/** Creates the cleanup frame of a teardown of `service`, inside `parent`. The teardown sets `active` to `false` when it ends. */\nexport function serviceFrame(service: ServiceNode, parent: CleanupFrame | undefined): CleanupFrame {\n const frame: CleanupFrame = { owner: service, parent, active: true }\n frameServices.set(frame, service)\n\n return frame\n}\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/** A `stop()`, `dispose()`, or `withdraw()` call from a cleanup that the call waits for. `service` is the service of the cleanup, or `undefined` for a container effect. */\nexport interface Reentry {\n readonly service: ServiceNode | undefined\n /** The instance of the cleanup, when the signal tells it. */\n readonly instance?: InstanceNode\n}\n\n/** The calls that find a re-entrant caller. */\nexport type ReentrantCall = 'stop' | 'dispose' | 'withdraw'\n\n/** Finds a cleanup that `covers` names, by the origin of `signal`, then by the synchronous cleanup frames. The instance of a signal counts only while its teardown runs. */\nfunction findCleanup(context: CleanupContext, signal: AbortSignal | undefined, covers: (service: ServiceNode, instance: InstanceNode | undefined) => boolean): Reentry | undefined {\n if (signal) {\n for (const source of signalSources(signal)) {\n const instance = signalOrigins.get(source)\n if (instance && instance.tearingDown && !instance.disposed && covers(instance.service, instance))\n return { service: instance.service, instance }\n }\n }\n\n for (let frame = context.current(); frame; frame = frame.parent) {\n const service = frame.active ? frameServices.get(frame) : undefined\n if (service && covers(service, service.signals.instance()))\n return { service }\n }\n\n return undefined\n}\n\n/**\n * Tells whether the teardown of `instance` is part of a stop that waits for each service that `stops` names.\n * It is when the service of `instance` is such a service, or when `instance` holds an instance of one, directly or through other instances.\n * The teardown of a held instance waits until its holders release it, so it waits for `instance` too.\n */\nfunction waitedFor(instance: InstanceNode, stops: (service: ServiceNode) => boolean): boolean {\n const seen = new Set<InstanceNode>([instance])\n const queue = [instance]\n for (let index = 0; index < queue.length; index++) {\n const current = queue[index]!\n if (stops(current.service))\n return true\n\n for (const provider of current.held) {\n if (!seen.has(provider)) {\n seen.add(provider)\n queue.push(provider)\n }\n }\n }\n\n return false\n}\n\n/** Finds a cleanup whose teardown the wait for the services that `stops` names includes. */\nfunction findWaitedCleanup(context: CleanupContext, signal: AbortSignal | undefined, stops: (service: ServiceNode) => boolean): Reentry | undefined {\n return findCleanup(context, signal, (service, instance) => stops(service) || (instance !== undefined && waitedFor(instance, stops)))\n}\n\n/**\n * Finds out whether a `stop()` or `dispose()` of `target` comes from a cleanup that the call waits for. Such a call cannot wait, because the wait includes the caller.\n *\n * - The cleanup is of a service of the subtree, or of a container effect of the subtree.\n * - Or the cleanup is of a service outside the subtree that holds a service that the call stops, directly or through other instances. That service waits for its holders.\n * `dispose()` also withdraws the consumer services of each `perConsumer` registration of the subtree, so they count for it.\n * - With `signal`: the signal, or a signal that it comes from, belongs to such an instance whose teardown runs.\n * The check uses the instance, not the phase of its service. So the teardown of a successor whose build failed, or of an old instance during a rebuild, counts too.\n * - Without it: the synchronous part of such a teardown makes the call.\n *\n * A call without a signal after an `await` is not found. A configured `stop` timeout ends that cleanup.\n */\nexport function findReentry(target: ContainerNode, call: 'stop' | 'dispose', signal: AbortSignal | undefined): Reentry | undefined {\n const { context } = target.runtime\n const stops = call === 'dispose'\n ? (service: ServiceNode) => within(service.container, target) || (service.template !== undefined && within(service.template.container, target))\n : (service: ServiceNode) => within(service.container, target)\n const found = findWaitedCleanup(context, signal, stops)\n if (found)\n return found\n\n return context.isActive(target) ? { service: undefined } : undefined\n}\n\n/**\n * Finds out whether a `withdraw()` of `target` comes from a cleanup that the withdrawal waits for: of `target`, of a consumer service of it, or of a service that holds one of them, directly or through other instances.\n * The rules are the same as for `findReentry`.\n */\nexport function findWithdrawReentry(target: ServiceNode, signal: AbortSignal | undefined): Reentry | undefined {\n return findWaitedCleanup(target.container.runtime.context, signal, service => service === target || service.template === target)\n}\n\nfunction describeOwner(container: ContainerNode): string {\n return JSON.stringify(container.owner)\n}\n\nconst actions: Readonly<Record<ReentrantCall, string>> = { stop: 'stop', dispose: 'disposal', withdraw: 'withdrawal' }\n\n/**\n * Warns on the logger of `target` and sends a `reentrant-call` record. The call then resolves at once.\n * `subject` names the target of the call. It defaults to the owner of `target`.\n */\nexport function reportReentry(target: ContainerNode, call: ReentrantCall, reentry: Reentry, subject = describeOwner(target)): void {\n const { service } = reentry\n const source = service ? `The cleanup of '${service.name}' in ${describeOwner(service.container)}` : `A container effect in ${describeOwner(target)}`\n const reason = `${source} called ${call}() of ${subject}, and the wait includes that cleanup. injeca resolved the call at once. The ${actions[call]} continues.`\n\n target.api.logger.warn(reason)\n emitRecord(service?.container ?? target, {\n type: 'reentrant-call',\n key: service?.name ?? '',\n owner: (service?.container ?? target).owner,\n instanceId: reentry.instance?.id ?? service?.signals.instance()?.id,\n call,\n reason,\n })\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 { 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 { forwardAbort } from '../helpers/abort'\nimport { messageOf } from '../helpers/error-from'\nimport { untracked } from '../helpers/signals'\nimport { withoutUndefined } from '../helpers/without-undefined'\nimport { createDecide, defaultDecision, validateDecision } from '../primitives/decision'\nimport { invokeUser } from './calls'\nimport { recordSignalOrigin } from './reentry'\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/**\n * Reports a failure of a callback that injeca stopped waiting for, after a timeout or a newer target. Nothing else gets the error, so injeca writes it with `logger.warn`.\n *\n * A failure with the reason of one of `signals` is not reported, because the callback only followed its abort.\n */\nexport function reportLateFailure(service: ServiceNode, source: ServiceHook | 'effect', error: unknown, signals: ReadonlyArray<AbortSignal | undefined>): void {\n if (signals.some(signal => signal?.aborted && signal.reason === error))\n return\n\n const callback = source === 'effect' ? `An effect disposer of '${service.name}'` : `The '${source}' hook of '${service.name}'`\n service.container.api.logger.warn(`${callback} failed after injeca stopped waiting for it: ${messageOf(error)}`)\n}\n\n/** Records the late decision of a hook run that injeca stopped waiting for. A late `fail` is reported with `reportLateFailure`. */\nexport function recordLateDecision(service: ServiceNode, instance: InstanceNode, decision: Decision, signals: ReadonlyArray<AbortSignal | undefined>): void {\n recordDecision(service, instance, decision, true)\n if (decision.kind === 'fail')\n reportLateFailure(service, decision.hook, decision.error, signals)\n}\n\n/**\n * Starts a hook run. Its signal aborts when a newer target supersedes it, when the instance is disposed, or when `timeout` aborts.\n * The signal has the reason of the first one. `end` removes the listeners.\n */\nexport function beginHookRun(instance: InstanceNode, timeout?: AbortSignal): { readonly signal: AbortSignal, readonly end: () => void } {\n const controller = new AbortController()\n const release = forwardAbort(controller, timeout ? [instance.controller.signal, timeout] : [instance.controller.signal])\n recordSignalOrigin(controller.signal, instance)\n instance.hookRun = controller\n\n return {\n signal: controller.signal,\n end: () => {\n release()\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. For `start`, a value that is not a decision of this hook, a promise, or no handler gives `fail` with `hook-timeout`.\n * For `stop`, they give `handled` with the timeout as the reason, so that the stop continues and its callers do not fail. A throw gives `fail` for both hooks.\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 fallback = (): Decision => hook === 'stop' ? decide.handled({ reason: error.message }) : decide.fail(error, { reason: error.message })\n const handler = timeoutHandlerOf(service)\n if (!handler)\n return fallback()\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) ?? fallback()\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 { HookTimeoutError } from '../diagnostics/errors'\nimport { setPhase, timeoutOf } from '../graph/nodes'\nimport { removeDeclaration } from '../graph/resolvers/exclusive'\nimport { anySignal, raceAbort, timeoutSignal } from '../helpers/abort'\nimport { batch } from '../helpers/signals'\nimport { invokeUser, loggerOf } from './calls'\nimport { syncHolds } from './holds'\nimport { callHandler, decideTimeout, finishRun, recordDecision, recordLateDecision, reportLateFailure } from './hook-run'\nimport { serviceFrame } from './reentry'\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/** The warning of a `stop` timeout. During a stop or a disposal of the container, it tells the most common cause. */\nfunction stopTimeoutWarning(service: ServiceNode, timeoutMs: number): string {\n const warning = `The cleanups of '${service.name}' did not settle within the stop timeout of ${timeoutMs}ms. injeca stopped waiting for them, and the stop continues.`\n const { container } = service\n const action = container.state === 'disposing' ? 'disposing' : container.signals.started() ? undefined : 'stopping'\n if (!action)\n return warning\n\n return `${warning} The container is ${action}. A cleanup can be waiting for its own container. It must pass its signal to stop() or dispose().`\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. It is a timeout signal on the container clock. The `stop` handlers get it in their `signal`.\n * When it aborts, injeca records it, warns, applies the `onTimeout` decision, and stops waiting. Without `onTimeout`, the timeout counts as `handled`, so the callers of `stop()` and `dispose()` do not fail.\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 without its signal cannot block that disposal.\n * The late decisions of the abandoned `stop` handlers are recorded as ignored. A late failure of an abandoned callback goes to `logger.warn`, unless it is the abort reason of its signal.\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 `stop()` or `dispose()` from its synchronous part is found.\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\n ? undefined\n : timeoutSignal(clock, timeoutMs, () => new HookTimeoutError(`The 'stop' hook of '${service.name}' timed out.`, 'stop', timeoutMs))\n // A `stop` handler sees the timeout on its signal, and the disposal of the instance.\n const hookSignal = anySignal(instance.controller.signal, deadline?.signal)\n let timedOut = false\n /**\n * Waits for one callback until the deadline. `undefined` means that the deadline passed.\n * After the deadline, `late` gets the value of the callback, and a rejection is reported with `logger.warn`.\n */\n const settle = async <T>(promise: Promise<T>, source: 'stop' | 'effect', late?: (value: T) => void): Promise<{ readonly value: T } | undefined> => {\n const abandon = (): undefined => {\n promise.then(value => late?.(value), (error: unknown) => reportLateFailure(service, source, error, [hookSignal, instance.controller.signal]))\n return undefined\n }\n if (!deadline)\n return { value: await promise }\n if (timedOut)\n return abandon()\n\n const result = await raceAbort(promise, deadline.signal)\n if (result.kind === 'settled')\n return { value: result.value }\n\n abandon()\n timedOut = true\n service.container.api.logger.warn(stopTimeoutWarning(service, timeoutMs!))\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, hookSignal, {}, call), 'stop', late => recordLateDecision(service, instance, late, [hookSignal, instance.controller.signal]))\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), 'effect')\n }\n catch (error) {\n errors.push(error)\n }\n }\n\n deadline?.cancel()\n return errors\n}\n\nexport async function teardown(service: ServiceNode, instance: InstanceNode, stopHooks: boolean, phase?: 'stopping'): Promise<void> {\n service.busy = true\n instance.tearingDown = true\n cancelRequeueWait(instance)\n instance.extraHolds.clear()\n if (phase)\n setPhase(service, phase, { reason: service.stopIntent.reason })\n\n // The frame of the teardown names the service, so that a synchronous `stop()` or `dispose()` from a cleanup is found, also outside a disposal.\n const frame = serviceFrame(service, service.container.frame)\n const errors = await service.container.runtime.context.run(frame, () => runTeardownCallbacks(service, instance, stopHooks, frame))\n frame.active = false\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 { ServiceDefinition, ServiceNode, SwapOutcome } from '../graph/graph'\nimport type { CreateServiceInput } from '../graph/nodes'\n\nimport { createService, publishService, setPhase } from '../graph/nodes'\nimport { createDeferred } from '../helpers/deferred'\nimport { batch } from '../helpers/signals'\n\n/** A new service that waits for its swap, with the outcome of the swap. */\nexport interface PendingSwap {\n readonly service: ServiceNode\n readonly outcome: Promise<SwapOutcome>\n}\n\nexport interface SuccessorOptions {\n /** The `perConsumer` registration of a consumer successor. */\n readonly template?: ServiceNode\n /** Runs when the replacement ends, before the outcome settles. */\n readonly onSettle: (service: ServiceNode, outcome: SwapOutcome) => void\n /** The first phase and the transaction of a successor that a transaction creates. */\n readonly extra?: Pick<CreateServiceInput, 'phase' | 'transaction'>\n /** Set for a consumer successor of a `perConsumer` replacement. See `SwapState.ready`. */\n readonly ready?: (service: ServiceNode) => void\n /** `true` for the successor of a make-before-break rebuild. */\n readonly rebuild?: boolean\n}\n\n/**\n * Creates a new service that replaces `target` after it completes `start`. It is not published before the swap.\n * `target.successor` names it until the replacement ends. It gets the demand of `target`, so that it converges as `target` does.\n */\nexport function createSuccessor(target: ServiceNode, definition: ServiceDefinition, options: SuccessorOptions): 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 exported: target.exported,\n template: options.template,\n consumer: target.consumer,\n registration: target.registration,\n // A rebuild is the same registration, so the successor keeps its place in registration order.\n ...(options.rebuild ? { seq: target.seq } : {}),\n ...options.extra,\n swap: {\n target,\n ready: options.ready,\n held: false,\n ...(options.rebuild ? { rebuild: true } : {}),\n settle: (result) => {\n if (settled)\n return\n\n settled = true\n if (target.successor === service)\n target.successor = undefined\n options.onSettle(service!, result)\n outcome.resolve(result)\n },\n },\n })\n service.signals.demanded(target.signals.demanded())\n service.signals.subscribers(target.signals.subscribers())\n target.container.services.add(service)\n target.successor = service\n })\n\n return { service: service!, outcome: outcome.promise }\n}\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 { raceAbort, timeoutSignal } from '../helpers/abort'\nimport { loggerOf } from './calls'\nimport { beginHookRun, decideTimeout, finishRun, recordDecision, recordLateDecision, runHandlers } from './hook-run'\nimport { exhaustedIntent, scheduleRequeue } from './requeue'\nimport { enterStopping } from './stop'\nimport { completeSwap } from './swap'\n\n/** The decisions of one attempt. `superseded` is `true` when a newer target aborted the run and injeca stopped waiting for it. */\ninterface AttemptResult {\n readonly decisions: readonly Decision[]\n readonly superseded: boolean\n}\n\n/**\n * Runs the `start` handlers of one attempt, from `instance.startFrom`, within the configured `start` timeout.\n *\n * The run signal includes a timeout signal on the container clock. At the timeout, the run signal aborts with `hook-timeout`, later handlers do not run, and the `onTimeout` decision replaces the result.\n * When a newer target aborts the run, for example `stop()` or `dispose()`, injeca does not wait for the handler in progress. The service stops at once.\n * Late decisions are recorded as ignored.\n */\nasync function runAttempt(service: ServiceNode, instance: InstanceNode): Promise<AttemptResult> {\n const timeoutMs = timeoutOf(service, 'start')\n const timer = timeoutMs === undefined\n ? undefined\n : timeoutSignal(service.container.runtime.clock, timeoutMs, () => new HookTimeoutError(`The 'start' hook of '${service.name}' timed out.`, 'start', timeoutMs))\n const run = beginHookRun(instance, timer?.signal)\n const progress = { index: instance.startFrom }\n let abandoned = false\n const running = runHandlers(service, instance, 'start', run.signal, {}, { from: instance.startFrom, progress, stopped: () => abandoned })\n // Without a timeout, `start` waits until it settles or a newer target aborts it.\n const result = await raceAbort(running, run.signal)\n timer?.cancel()\n const timedOut = timer !== undefined && timer.signal.aborted && run.signal.reason === timer.signal.reason\n run.end()\n instance.startFrom = progress.index\n\n if (result.kind === 'settled')\n return { decisions: result.value, superseded: false }\n\n abandoned = true\n // The handler in progress can still return. Its decision is ignored. A late failure is reported, unless it is the abort of the run.\n void running.then((late) => {\n for (const decision of late)\n recordLateDecision(service, instance, decision, [run.signal])\n })\n if (!timedOut)\n return { decisions: [], superseded: true }\n\n return { decisions: [decideTimeout(service, instance, 'start', timeoutMs!)], superseded: false }\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 attempt = handlers.length > instance.startFrom ? await runAttempt(service, instance) : { decisions: [], superseded: false }\n const { decisions } = attempt\n service.busy = false\n\n const ignored = attempt.superseded || 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 // A later failure of a consumer service builds again for each demander.\n service.demanders.clear()\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?.ready) {\n // A consumer service of a `perConsumer` replacement waits until each consumer service completes `start`.\n service.swap.held = true\n service.swap.ready(service)\n }\n else if (service.swap) {\n completeSwap(service)\n }\n else {\n setPhase(service, 'running')\n }\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 { setPhase } from '../graph/nodes'\nimport { inConflict } from '../graph/resolvers/exclusive'\nimport { buildLost, epochOf, requiredAvailable, resolutionOf, resolvedInstance } from '../graph/resolvers/resolvers'\nimport { batch } from '../helpers/signals'\nimport { createBuildContext } from './build-context'\nimport { invokeUser, loggerOf } from './calls'\nimport { demandProviders } from './demand'\nimport { syncHolds } from './holds'\nimport { recordSignalOrigin } from './reentry'\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 * 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 tearingDown: false,\n disposed: false,\n }\n\n recordSignalOrigin(instance.controller.signal, instance)\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 { DependencyEdge, InstanceNode, ServiceNode, TransactionNode } from '../graph/graph'\nimport type { SnapshotEntry } from './snapshot'\n\nimport { releaseReservations } from '../graph/nodes'\nimport { acceptsCandidate } 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, edge: DependencyEdge, members: TransactionMembers, built: ReadonlyMap<ServiceNode, InstanceNode>): SnapshotEntry | undefined {\n const member = members.get(keyName)\n if (member && member !== service) {\n if (inConflict(member) || !acceptsCandidate(service, edge, keyName, member))\n return undefined\n return memberEntry(member, built)\n }\n\n const resolution = resolveKey(service, keyName, edge)\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, 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 releaseReservations(transaction)\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, StopIntent } from '../graph/graph'\n\nimport { resolvedInstance } from '../graph/resolvers/resolvers'\nimport { enterStopping } from './stop'\nimport { createSuccessor } from './swap'\n\n/**\n * Tells whether the old instance of a running service can keep serving while its successor builds and starts.\n *\n * - Only a service with a key rebuilds make-before-break. An invocation has no dependents, so it stops, then runs again.\n * - Each edge that the old instance is bound to still resolves, maybe to a new instance. An edge without a provider has nothing to build against, so the service stops first.\n * - The container is not in disposal.\n *\n * A bound provider instance stays usable until its last holder releases it, so the old instance keeps working with its bindings.\n */\nfunction keepsServing(service: ServiceNode, instance: InstanceNode): boolean {\n if (service.kind !== 'service' || service.container.state !== 'active')\n return false\n\n return service.edges.every(edge => !instance.bindings.has(edge.name) || resolvedInstance(service, edge) !== undefined)\n}\n\n/**\n * Rebuilds a running service, for a changed dependency without a handler, or for a `rebuild` decision.\n *\n * When the old instance can keep serving, the rebuild is make-before-break: a successor with the same options builds and starts against the current dependencies.\n * The old instance serves until the successor completes `start`. Then one batch swaps them, as for `replace()`. The dependents get `dependency-change`, not a withdrawal.\n * If the successor fails, the old instance stops and the service goes to `failed`.\n * Otherwise the service stops first and builds again from `pending`.\n *\n * A replacement in progress, from `replace()` or a transaction, takes precedence. The old instance serves until it ends, and the service reconciles again then.\n */\nexport function rebuild(service: ServiceNode, instance: InstanceNode, intent: StopIntent): void {\n if (service.successor)\n return\n if (!keepsServing(service, instance)) {\n enterStopping(service, intent)\n return\n }\n\n const { registration } = service\n const { service: successor } = createSuccessor(service, service, {\n template: service.template,\n rebuild: true,\n onSettle: (next, outcome) => {\n if (registration?.pending === next)\n registration.pending = undefined\n if (outcome.kind === 'swapped' && registration)\n registration.current = next\n // The old instance stops for the rebuild only now, so the observe stream gets the decision and the reason of the rebuild.\n if (outcome.kind === 'swapped' && service.signals.phase() === 'running')\n enterStopping(service, intent)\n if (outcome.kind === 'failed' && service.signals.present())\n enterStopping(service, { failure: { error: outcome.error }, reason: 'The rebuild failed. The old instance stops.', decision: intent.decision })\n service.container.runtime.reconciler.markDirty(service)\n },\n })\n // `replace()` and `withdraw()` of the registration cancel the rebuild, as they cancel a pending replacement.\n if (registration)\n registration.pending = successor\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 { demandProviders } from './demand'\nimport { releaseExtraHolds, syncHolds } from './holds'\nimport { beginHookRun, finishRun, recordDecision, runHandlers } from './hook-run'\nimport { rebuild } from './rebuild'\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 // An optional or a fallback edge to a key that registers after this service demands its provider now.\n demandProviders(service)\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 // The successor of a make-before-break rebuild builds. The old instance serves unchanged until the swap.\n if (service.successor?.swap?.rebuild)\n return\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 rebuild(service, instance, { 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 rebuild(service, instance, { 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 { enterStopping, 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 'starting':\n // A consumer service that waits for the batch swap of its replacement stops when the replacement is cancelled.\n if (service.swap?.held && service.signals.targetLost())\n enterStopping(service, { reason: 'The replacement was cancelled before the swap.' })\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 } from '../diagnostics/errors'\nimport { createDefaultLogger } from '../diagnostics/logger'\nimport { assertActive, nodeOf, readPolicy, registerNode, releaseService } from '../graph/nodes'\nimport { recordAbortedWait } from '../graph/observers'\nimport { abortable, readSignal } from '../helpers/abort'\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 { findReentry, reportReentry } from '../reconciler/reentry'\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 readLogging(options: ContainerOptions, parent: ContainerNode | undefined): boolean {\n let logging: unknown\n try {\n logging = options.logging\n }\n catch (error) {\n throw new InvalidArgumentError('Cannot read the logging option.', { cause: error })\n }\n if (logging !== undefined && typeof logging !== 'boolean')\n throw new InvalidArgumentError('The logging option must be a boolean.')\n\n return (logging as boolean | undefined) ?? parent?.api.logging ?? false\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 logging = readLogging(options, parent)\n const logger = 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, logging, 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 exports: 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 *\n * When the disposal of the container started or ended, the disposer runs at once after `setup`, so that the resource does not leak.\n * A disposer that throws throws to the caller. A disposer promise that rejects is reported outside the call, as an unhandled error.\n */\nexport function effect(container: Container, setup: EffectSetup): void {\n const node = nodeOf(container)\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 return\n if (node.state === 'active') {\n node.effects.push(disposer)\n return\n }\n\n const result = untracked(disposer)\n if (result instanceof Promise) {\n result.catch((error: unknown) => queueMicrotask(() => {\n throw error\n }))\n }\n}\n\n/**\n * Starts the disposal of `container` and of its descendants. The whole subtree enters `disposing` at once, so nothing new registers in it.\n *\n * The child containers dispose first, one after the other, in reverse creation order. Then the services of the container withdraw in one batch, so that dependents stop without a rebuild.\n * Then the effects of the container run in reverse order. `after` delays the work until an earlier sibling completed its disposal.\n */\nfunction beginDisposal(container: ContainerNode, parentFrame: ContainerNode['frame'], after?: Promise<unknown>): 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 let previous = after\n const children = [...container.children].reverse().map((child) => {\n const disposal = beginDisposal(child, frame, previous)\n // The parent awaits each child later. This branch only stops an early rejection from being reported as unhandled.\n disposal.catch(() => {})\n previous = disposal.then(() => {}, () => {})\n return disposal\n })\n\n const withdrawn = new Set<ServiceNode>()\n const withdrawServices = (): void => untracked(() => batch(() => {\n for (const service of container.services) {\n if (service.signals.present()) {\n releaseService(service)\n withdrawn.add(service)\n }\n }\n }))\n // Without a child or an earlier sibling, the services withdraw in the caller's batch.\n const immediate = after === undefined && children.length === 0\n if (immediate)\n withdrawServices()\n\n container.disposal = context.run(frame, async () => {\n const errors: unknown[] = []\n\n if (after)\n await after\n for (const child of children) {\n try {\n await child\n }\n catch (error) {\n errors.push(error)\n }\n }\n if (!immediate)\n withdrawServices()\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 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\nexport interface DisposeOptions {\n /**\n * Ends the wait when the signal aborts, and rejects with the reason. The disposal continues in the background. There is no default.\n * Each service that did not stop yet gets a `wait-aborted` record in the observe stream.\n */\n signal?: AbortSignal\n}\n\n/** The services of `container` and of its descendants that did not finish their withdrawal. */\nfunction unfinishedServices(container: ContainerNode): ServiceNode[] {\n return [\n ...[...container.services].filter(service => service.kind !== 'resolver' && service.signals.phase() !== 'withdrawn'),\n ...[...container.children].flatMap(unfinishedServices),\n ]\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`. A second call from outside without a signal gets the same promise.\n *\n * A call from the cleanup chain of the container or of a descendant cannot wait, because the disposal waits for that cleanup.\n * The same is true for a cleanup of a service that holds a service of the subtree, directly or through other instances, or a consumer service of a `perConsumer` registration of it.\n * injeca finds such a call by the signal of the cleanup, or by the synchronous part of the cleanup. It warns, sends a `reentrant-call` record, and resolves at once. The disposal continues.\n *\n * When `options.signal` aborts, the call rejects with the reason and stops waiting. The disposal continues: the container stays in `disposing`, and calls on it fail with `build-after-dispose`.\n * A later `dispose()` waits for the same disposal and gets its result. An aborted signal starts the disposal, then rejects at once.\n */\nexport function dispose(container: Container, options?: DisposeOptions): Promise<void> {\n const node = nodeOf(container)\n const abortSignal = readSignal(options, 'dispose')\n const { context } = node.runtime\n const reentry = untracked(() => findReentry(node, 'dispose', abortSignal))\n\n const disposal = node.disposal ?? untracked(() => {\n let started: Promise<void> | undefined\n batch(() => {\n started = beginDisposal(node, context.current())\n })\n\n return started!\n })\n if (reentry) {\n untracked(() => reportReentry(node, 'dispose', reentry))\n // A later `dispose()` gets the result. This call does not report it.\n disposal.catch(() => {})\n return Promise.resolve()\n }\n\n return abortable(disposal, abortSignal, (reason) => {\n recordAbortedWait(unfinishedServices(node), 'dispose', reason)\n return reason\n })\n}\n","import type { RegistrationNode, ServiceNode } from '../graph/graph'\n\nimport { awaitWithdrawal, releasePresent, releaseRegistration } from '../graph/nodes'\nimport { recordAbortedWait } from '../graph/observers'\nimport { abortable, readSignal } from '../helpers/abort'\nimport { untracked } from '../helpers/signals'\nimport { findWithdrawReentry, reportReentry } from '../reconciler/reentry'\n\n/**\n * Runs a `withdraw()` call. `release` releases the service and returns it, or `undefined` when there is nothing to withdraw.\n *\n * - Resolves `true` after the withdrawal, and rejects with the teardown errors.\n * - When `options.signal` aborts, it rejects with the reason and stops waiting. The withdrawal continues. An aborted signal still starts it.\n * - A call from a cleanup that the withdrawal waits for warns, sends a `reentrant-call` record, and resolves `true` at once.\n */\nfunction withdrawWith(release: () => ServiceNode | undefined, options: unknown): Promise<boolean> {\n let signal: AbortSignal | undefined\n try {\n signal = readSignal(options as { readonly signal?: unknown } | undefined, 'withdraw')\n }\n catch (error) {\n return Promise.reject(error)\n }\n\n const service = release()\n if (!service)\n return Promise.resolve(false)\n\n const withdrawal = awaitWithdrawal(service).then(() => true)\n const reentry = untracked(() => findWithdrawReentry(service, signal))\n if (reentry) {\n untracked(() => reportReentry(service.container, 'withdraw', reentry, `'${service.name}' in ${JSON.stringify(service.container.owner)}`))\n // The caller does not get the result. The teardown errors stay in the observe stream and the phase of the service.\n withdrawal.catch(() => {})\n return Promise.resolve(true)\n }\n\n return abortable(withdrawal, signal, (reason) => {\n recordAbortedWait(untracked(() => service.signals.phase()) === 'withdrawn' ? [] : [service], 'withdraw', reason)\n return reason\n })\n}\n\n/** The `withdraw()` of a registration. Resolves `false` for a stale registration. */\nexport function withdrawRegistration(registration: RegistrationNode, options?: unknown): Promise<boolean> {\n return withdrawWith(() => releaseRegistration(registration), options)\n}\n\n/** The `withdraw()` of an invocation. Resolves `false` when it is already withdrawn. */\nexport function withdrawInvocation(service: ServiceNode, options?: unknown): Promise<boolean> {\n return withdrawWith(() => releasePresent(service) ? service : undefined, options)\n}\n","import type { BuildFunction, ServiceNode } from '../graph/graph'\nimport type { Container, DependencyDeclarations, DependencyMap, InvocationHandle, InvokeOption, InvokeOptionWithKeys, WithdrawOptions } from '../types'\n\nimport { InvalidArgumentError } from '../diagnostics/errors'\nimport { assertActive, createService, nodeOf, readEdges } from '../graph/nodes'\nimport { batch, untracked } from '../helpers/signals'\nimport { traceLoggerOf } from '../reconciler/calls'\nimport { withdrawInvocation } from './withdraw'\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 traceLoggerOf(container)?.invoke(edges.map(edge => edge.keyName))\n\n return Object.freeze({ key: name, withdraw: (options?: WithdrawOptions) => withdrawInvocation(registered, options) })\n}\n","import type { ServiceNode } from '../graph/graph'\nimport type { OwnerRecord, ServiceBlocker, ServiceExplanation, StatusCause } from '../types'\n\nimport { resolveKey } from '../graph/resolvers/plain'\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. */\nexport function 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 // A fallback edge that does not resolve names each candidate that a condition rejected.\n if (edge.fallback && resolution.kind !== 'resolved') {\n for (const keyName of edge.candidates) {\n const candidate = resolveKey(service, keyName, edge)\n if (candidate.kind === 'rejected')\n blockers.push({ kind: 'rejected-provider', dependency: edge.name, key: candidate.provider.name, owner: candidate.provider.container.owner, metadata: candidate.provider.metadata })\n }\n if (resolution.kind === 'rejected')\n continue\n }\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 const successor = service.successor\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 ...withoutUndefined({ replacement: successor?.signals.present() ? explainService(successor) : undefined }),\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 const { replacement } = explanation\n if (replacement) {\n const blockers = replacement.blockers.map(describeBlocker)\n reasons.push(`its replacement is ${replacement.phase ?? 'missing'}${blockers.length > 0 ? ` (${blockers.join(', ')})` : ''}`)\n }\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 { StartTimeoutError } from '../diagnostics/errors'\nimport { describeExplanations, explainService } from '../diagnostics/explain'\nimport { affectedContainers, assertActive, nodeOf, setPhase } from '../graph/nodes'\nimport { recordAbortedWait } from '../graph/observers'\nimport { isTimeoutReason, onAbort, readSignal } from '../helpers/abort'\nimport { errorFrom } from '../helpers/error-from'\nimport { batch, untracked } from '../helpers/signals'\nimport { traceLoggerOf } from '../reconciler/calls'\nimport { findReentry, reportReentry } from '../reconciler/reentry'\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 * When `signal` aborts first, it stops checking and rejects with the result of `onAborted`. An aborted signal rejects at once.\n */\nfunction waitUntilSettled(containers: readonly ContainerNode[], check: (services: readonly ServiceNode[]) => SettleCheck, signal: AbortSignal | undefined, onAborted: (reason: unknown) => unknown): Promise<void> {\n const { reconciler } = containers[0]!.runtime\n\n return new Promise((done, fail) => {\n if (signal?.aborted) {\n fail(onAborted(signal.reason))\n return\n }\n\n let removeAbort = () => {}\n const stopListening = reconciler.onDrained(() => {\n const result = check(presentServices(containers))\n if (result === 'waiting')\n return\n\n stopListening()\n removeAbort()\n if (result.kind === 'done')\n done()\n else\n fail(errorFrom(result.errors, 'Start failed.'))\n })\n removeAbort = onAbort(signal, (reason) => {\n stopListening()\n fail(onAborted(reason))\n })\n reconciler.requestDrain()\n })\n}\n\nexport interface StartOptions {\n /**\n * Ends the wait when the signal aborts. The services keep converging.\n * A timeout reason (`name === 'TimeoutError'`) rejects with `start-timeout` and the explanations. Another reason rejects as it is. There is no default.\n */\n signal?: AbortSignal\n}\n\nexport interface StopOptions {\n /**\n * Ends the wait when the signal aborts, and rejects with the reason. The cleanups that did not settle keep running.\n * Each service that did not stop yet gets a `wait-aborted` record in the observe stream. There is no default.\n */\n signal?: AbortSignal\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 `options.signal` aborts.\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 signal = readSignal(options, 'start')\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 }, signal, (reason) => {\n if (!isTimeoutReason(reason))\n return reason\n\n const explanations = presentServices(containers).filter(service => service.signals.phase() !== 'running').map(explainService)\n return new StartTimeoutError(`start() timed out. These services are not running:\\n${describeExplanations(explanations)}`, explanations, { cause: reason })\n })\n })\n\n return settled.then(() => traceLoggerOf(container)?.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 *\n * When `options.signal` aborts, it rejects with the reason and stops waiting. The container stays stopped: a later `start()` builds again.\n * The services that did not stop yet stay in `stopping` until their cleanups settle.\n *\n * A call from the cleanup chain of the container or of a descendant cannot wait, because the stop waits for that cleanup.\n * The same is true for a cleanup of a service that holds a service of the subtree, directly or through other instances.\n * injeca finds such a call by the signal of the cleanup, or by the synchronous part of the cleanup. It warns, sends a `reentrant-call` record, and resolves at once. The stop continues.\n */\nexport function stop(container: Container, options?: StopOptions): Promise<void> {\n let node: ContainerNode\n let signal: AbortSignal | undefined\n try {\n node = nodeOf(container)\n signal = readSignal(options, 'stop')\n }\n catch (error) {\n return Promise.reject(error)\n }\n\n const reentry = untracked(() => findReentry(node, 'stop', signal))\n if (!reentry)\n return stopAndWait(node, signal)\n\n untracked(() => reportReentry(node, 'stop', reentry))\n stopAndWait(node, undefined).catch(() => {})\n return Promise.resolve()\n}\n\nasync function stopAndWait(node: ContainerNode, signal: AbortSignal | undefined): Promise<void> {\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 service.signals.subscribers(new Set())\n }\n })\n\n const stopped = (service: ServiceNode): boolean => service.signals.instance() === undefined && !transitionalPhases.has(service.signals.phase())\n return waitUntilSettled(containers, services => services.every(stopped) ? { kind: 'done' } : 'waiting', signal, (reason) => {\n recordAbortedWait(presentServices(containers).filter(service => !stopped(service)), 'stop', reason)\n return reason\n })\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 { PendingSwap } from '../reconciler/swap'\nimport type { Registration, WithdrawOptions } from '../types'\n\nimport { ReplaceWhileStoppingError } from '../diagnostics/errors'\nimport { cancelPending, cancelSuccessor, createService, currentService, publishService, readDefinition, releaseService } from '../graph/nodes'\nimport { onAbort, readSignal } from '../helpers/abort'\nimport { createDeferred } from '../helpers/deferred'\nimport { batch, untracked } from '../helpers/signals'\nimport { completeSwap, createSuccessor } from '../reconciler/swap'\nimport { withdrawRegistration } from './withdraw'\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 exported: target.exported,\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 * Replaces the `perConsumer` registration `target` with the unpublished registration `template`. Resolves with the outcome.\n *\n * Each running consumer service gets a successor that builds and starts from `definition`. A successor that completes `start` waits.\n * When every successor waits, one batch publishes `template` and swaps in all successors. The other consumer services leave and build again on demand.\n * When one successor fails, all successors leave, `template` leaves, and the old registration and its consumer services do not change.\n * A consumer service that leaves during the replacement, for example with its container, drops out of the batch.\n * A newer `replace` or a withdrawal cancels the replacement.\n */\nexport function replaceTemplate(registration: RegistrationNode, target: ServiceNode, template: ServiceNode): Promise<SwapOutcome> {\n const definition: ServiceDefinition = { edges: template.edges, build: template.build, metadata: template.metadata, perConsumer: true, exported: false, policy: template.policy }\n const outcome = createDeferred<SwapOutcome>()\n const waiting = new Set<ServiceNode>()\n const held = new Set<ServiceNode>()\n let settled = false\n\n const finish = (result: SwapOutcome): void => {\n settled = true\n template.swap = undefined\n if (target.successor === template)\n target.successor = undefined\n if (registration.pending === template)\n registration.pending = undefined\n outcome.resolve(result)\n }\n // The successors leave. A held successor completed `start`, so the reconciler runs its `stop` hooks.\n const abandon = (result: SwapOutcome): void => {\n if (settled)\n return\n\n batch(() => {\n finish(result)\n for (const successor of [...waiting, ...held]) {\n successor.signals.present(false)\n successor.container.runtime.reconciler.markDirty(successor)\n }\n releaseService(template)\n })\n }\n const commitIfReady = (): void => {\n if (settled || waiting.size > 0)\n return\n\n batch(() => {\n finish({ kind: 'swapped' })\n takeOver(registration, target, template)\n for (const successor of held)\n completeSwap(successor)\n })\n }\n\n batch(() => {\n cancelPending(registration)\n // `cancelPending` of a newer replacement, or a withdrawal, cancels this replacement.\n template.swap = { target, held: false, settle: abandon }\n registration.pending = template\n target.successor = template\n\n for (const consumer of target.signals.consumers().values()) {\n if (!consumer.signals.serving())\n continue\n\n // A make-before-break rebuild of the consumer service gives way to the replacement.\n cancelSuccessor(consumer)\n const { service } = createSuccessor(consumer, definition, {\n template,\n onSettle: (successor, result) => {\n waiting.delete(successor)\n held.delete(successor)\n if (result.kind === 'failed')\n abandon(result)\n else if (result.kind !== 'swapped')\n commitIfReady()\n },\n ready: (successor) => {\n waiting.delete(successor)\n held.add(successor)\n commitIfReady()\n },\n })\n waiting.add(service)\n }\n })\n commitIfReady()\n\n return outcome.promise\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, { onSettle: settleRegistration(registration), extra })\n if (!extra?.transaction) {\n cancelPending(registration)\n registration.pending = pending.service\n }\n\n return pending\n}\n\n/**\n * Waits for the outcome of the pending replacement `pending`. When `signal` aborts first, it cancels the replacement, as a newer `replace` does.\n * The cancel settles the outcome as `cancelled`. The listener goes when the outcome settles.\n */\nasync function awaitOutcome(registration: RegistrationNode, pending: ServiceNode, outcome: Promise<SwapOutcome>, signal: AbortSignal | undefined): Promise<boolean> {\n const removeAbort = onAbort(signal, () => {\n if (registration.pending === pending)\n batch(() => cancelPending(registration))\n })\n try {\n return outcomeResult(await outcome, registration.name)\n }\n finally {\n removeAbort()\n }\n}\n\n/** The `replace()` of a registration. */\nasync function replace(registration: RegistrationNode, option: unknown, options: unknown): Promise<boolean> {\n const signal = readSignal(options as { readonly signal?: unknown } | undefined, 'replace')\n const target = untracked(() => currentService(registration))\n if (!target)\n return false\n\n const definition = readDefinition(registration.name, option, target)\n if (signal?.aborted)\n return false\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 let template: ServiceNode | undefined\n const outcome = untracked(() => {\n batch(() => {\n 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 exported: target.exported,\n perConsumer: true,\n registration,\n })\n target.container.services.add(template)\n })\n return replaceTemplate(registration, target, template!)\n })\n return awaitOutcome(registration, template!, outcome, signal)\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 awaitOutcome(registration, pending.service, pending.outcome, signal)\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()`. A transaction passes its own `withdraw`. */\nexport function registrationApi(registration: RegistrationNode, overrides: { readonly withdraw?: (options?: WithdrawOptions) => Promise<boolean> } = {}): Registration<string, unknown, undefined> {\n const api: Registration<string, unknown, undefined> = Object.freeze({\n key: registration.name,\n ...(registration.exclusive ? { exclusive: true } : {}),\n withdraw: overrides.withdraw ?? ((options?: WithdrawOptions) => withdrawRegistration(registration, options)),\n replace: ((option: unknown, options?: unknown) => replace(registration, option, options)) as Registration<string, unknown, undefined>['replace'],\n })\n registrations.set(api, registration)\n\n return api\n}\n","import type { ContainerNode, RegistrationNode, ServiceDefinition, ServiceNode, TransactionNode } 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, reservedBy } from '../graph/nodes'\nimport { emitRecord } from '../graph/observers'\nimport { slotOf } from '../graph/resolvers/resolvers'\nimport { batch, untracked } from '../helpers/signals'\nimport { traceLoggerOf } from '../reconciler/calls'\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/**\n * Throws `duplicate-service` when a started container already has a registration for `name`,\n * or when an open transaction of the container, other than `except`, declares or provides `name`.\n */\nexport function assertNoDuplicate(container: ContainerNode, name: string, except?: TransactionNode): void {\n if (slotOf(container, name)() && container.signals.started())\n throw new DuplicateServiceError(`The started container already has a registration for '${name}'.`)\n if (reservedBy(container.transactions, name, except))\n throw new DuplicateServiceError(`An open transaction of the container reserves '${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 exported: definition.exported,\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 traceLoggerOf(container)?.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 { onAbort, readSignal, waitAbortError } from '../helpers/abort'\nimport { batch, untracked } from '../helpers/signals'\n\nexport interface ResolveOptions {\n /**\n * Ends the wait when the signal aborts. A timeout reason (`name === 'TimeoutError'`) rejects with `wait-timeout`, with the reason as `cause`.\n * Another reason rejects as it is. Use `timeout(container, ms)` for a timeout on the container clock. There is no default.\n */\n signal?: AbortSignal\n}\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. With `options.signal`, it rejects when the signal aborts. An aborted signal rejects at once.\n * Each rejection removes the hidden resolver of the call. 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, options?: ResolveOptions): Promise<ResolveDependencyDeclaration<Deps>> {\n const node = nodeOf(container)\n assertActive(node, 'resolve')\n\n const edges = readEdges('resolve', dependsOn)\n const signal = readSignal(options, 'resolve')\n if (signal?.aborted)\n return Promise.reject(waitAbortError(signal.reason, 'resolve() timed out.'))\n\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 let disarm = () => {}\n\n const finish = (outcome: () => void): void => {\n if (settled)\n return\n\n settled = true\n stopListening()\n disarm()\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 disarm = onAbort(signal, reason => finish(() => fail(waitAbortError(reason, 'resolve() timed out.'))))\n void service!.withdrawal.promise.then(() => finish(() => fail(new BuildAfterDisposeError('The container was disposed before resolve() got its dependencies.'))))\n }))\n}\n","import type { Container } from '../types'\n\nimport { InvalidArgumentError } from '../diagnostics/errors'\nimport { nodeOf } from '../graph/nodes'\nimport { anySignal, readSignal, timeoutReason, timeoutSignal } from '../helpers/abort'\n\nfunction readMilliseconds(ms: unknown, action: string): number {\n if (typeof ms !== 'number' || !Number.isFinite(ms) || ms < 0)\n throw new InvalidArgumentError(`The milliseconds of ${action} must be a finite number of 0 or more. Got ${String(ms)}.`)\n\n return ms\n}\n\n/**\n * Returns a signal that aborts after `ms` milliseconds of the clock of `container`.\n *\n * The reason is a `DOMException` with the name `TimeoutError`, as for `AbortSignal.timeout()`. Use it in place of `AbortSignal.timeout()`, because that one does not use the container clock.\n * With the system clock, the timer does not keep a Node process alive.\n */\nexport function timeout(container: Container, ms: number): AbortSignal {\n const { clock } = nodeOf(container).runtime\n const milliseconds = readMilliseconds(ms, 'timeout')\n\n return timeoutSignal(clock, milliseconds, () => timeoutReason(`The operation timed out after ${milliseconds}ms.`), true).signal\n}\n\n/** Returns a signal that aborts when `signal` aborts, or after `ms` milliseconds of the clock of `container`. Without `signal`, it is `timeout(container, ms)`. */\nexport function withTimeout(signal: AbortSignal | undefined, ms: number, container: Container): AbortSignal {\n const source = readSignal({ signal }, 'withTimeout')\n return anySignal(source, timeout(container, ms))\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, TransactionCommitOptions, TransactionProvide, TransactionReplace, WithdrawOptions } from '../types'\n\nimport { DuplicateServiceError, InvalidArgumentError, ReplaceWhileStoppingError, StaleRegistrationError, TransactionIncompleteError } from '../diagnostics/errors'\nimport { assertActive, cancelPending, createRegistration, currentService, nodeOf, readDefinition, readEdges, releaseReservation, releaseReservations, reservedBy, reserveKey, setPhase } from '../graph/nodes'\nimport { slotOf } from '../graph/resolvers/resolvers'\nimport { onAbort, readSignal } from '../helpers/abort'\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 { registrationApi, registrationOf, replaceRunning, replaceTemplate, takeOver } from './replace'\nimport { withdrawRegistration } from './withdraw'\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, transaction)\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, exported: target.exported }, 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`. The reservations end in the same batch. */\nfunction publishMembers(transaction: TransactionNode, members: readonly Member[], built: ReadonlySet<ServiceNode>): void {\n batch(() => {\n releaseReservations(transaction)\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 // The commit does not wait for the swap, as for a running service.\n void replaceTemplate(registration, target, service)\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(transaction, 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\n/**\n * Commits `transaction`. When `signal` aborts before the publish, the transaction aborts with the reason, and the result rejects at once.\n * The rollback continues: the build in progress gets the abort on its `signal`, and the key reservations end when the rollback settles.\n */\nfunction startCommit(transaction: TransactionNode, options: unknown): Promise<void> {\n let signal: AbortSignal | undefined\n try {\n signal = readSignal(options as { readonly signal?: unknown } | undefined, 'commit')\n }\n catch (error) {\n return Promise.reject(error)\n }\n if (transaction.state !== 'open')\n return Promise.reject(new InvalidArgumentError(`The transaction is ${transaction.state === 'aborted' ? 'aborted' : 'already committed'}.`))\n if (signal?.aborted) {\n void abortTransaction(transaction, signal.reason)\n return Promise.reject(signal.reason)\n }\n\n transaction.state = 'committing'\n const committed = commit(transaction).catch((error: unknown) => {\n if (transaction.state !== 'done') {\n transaction.state = 'aborted'\n transaction.container.transactions.delete(transaction)\n untracked(() => releaseReservations(transaction))\n }\n throw error\n })\n transaction.settled = committed.then(() => {}, () => {})\n if (!signal)\n return committed\n\n return new Promise((resolve, reject) => {\n const removeAbort = onAbort(signal, (reason) => {\n // After the publish, the abort has no effect.\n if (transaction.state !== 'committing')\n return\n\n void abortTransaction(transaction, reason)\n reject(reason)\n })\n committed.then((value) => {\n removeAbort()\n resolve(value)\n }, (error: unknown) => {\n removeAbort()\n reject(error)\n })\n })\n}\n\n/** Throws `duplicate-service` when another open transaction of the container declares or provides `name`. */\nfunction assertNotReserved(transaction: TransactionNode, name: string): void {\n if (reservedBy(transaction.container.transactions, name, transaction))\n throw new DuplicateServiceError(`Another open transaction of the container reserves '${name}'.`)\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, exported: false, reservation: undefined }\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 assertNotReserved(state, name)\n const declared = readEdges(name, dependsOn)\n const entry = entryOf(state, name, false)\n entry.exclusive ||= isExclusiveKey(key)\n entry.declared = declared\n entry.optional = optional\n untracked(() => reserveKey(state, entry))\n }\n\n /**\n * The `withdraw()` of a registration from `tx.provide`. Before the commit, it removes the provide from the transaction and resolves `true`.\n * A declaration of the key stays, so the commit fails with `transaction-incomplete` unless the declaration is optional.\n * During the commit, it waits for the commit, then withdraws the published service with `options`.\n */\n const withdrawEntry = async (entry: TransactionEntry, registration: RegistrationNode, options: WithdrawOptions | undefined): Promise<boolean> => {\n if (state.state === 'open') {\n if (entry.registration !== registration)\n return false\n\n entry.definition = undefined\n entry.registration = undefined\n entry.exported = false\n untracked(() => {\n if (!entry.declared) {\n state.entries.delete(entry.name)\n releaseReservation(entry)\n }\n else {\n // The declaration stays, in the resolution area of the container itself.\n reserveKey(state, entry)\n }\n })\n return true\n }\n if (state.state === 'committing')\n await state.settled\n\n return withdrawRegistration(registration, options)\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 assertNotReserved(state, name)\n const read = readDefinition(name, option)\n const entry = entryOf(state, name, false)\n entry.exclusive ||= isExclusiveKey(key)\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 entry.exported = definition.exported\n untracked(() => reserveKey(state, entry))\n\n return registrationApi(registration, { withdraw: options => withdrawEntry(entry, registration, options) })\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 // A replacement keeps the current registration of the key, so it reserves nothing.\n untracked(() => releaseReservation(entry))\n }) as TransactionReplace\n\n return Object.freeze({\n declare,\n provide,\n replace,\n commit: (options?: TransactionCommitOptions) => untracked(() => startCommit(state, options)),\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.scope, keyName, consumer).some((registration) => {\n const provider = serviceFor(registration, consumer.scope)\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 exported: service.exported,\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 exported: entry.exported,\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.scope, 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 || edge.candidateConditions !== 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 and the exports of its children, then from each ancestor and the exports of its children.\n * 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 => 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 if (declared)\n return Object.freeze({ name, kind: 'service', owner: declared.container.owner, phase: 'declared', blockers: Object.freeze([]) })\n\n // No service exists for the key. A consumer in the container waits for a provider.\n return Object.freeze({ name, kind: 'service', owner: scope.owner, phase: undefined, blockers: Object.freeze([Object.freeze({ kind: 'missing-provider', dependency: name, key: name })]) })\n }),\n })\n}\n","import type { Resolution } from '../graph/graph'\nimport type { Container, PeekDependency, PeekResult, PeekValue } from '../types'\n\nimport { InvalidArgumentError } from '../diagnostics/errors'\nimport { ownersOf } from '../diagnostics/explain'\nimport { nodeOf, readEdges } from '../graph/nodes'\nimport { resolveFallback } from '../graph/resolvers/fallback'\nimport { resolvePlain } from '../graph/resolvers/plain'\nimport { untracked } from '../helpers/signals'\nimport { withoutUndefined } from '../helpers/without-undefined'\n\nfunction resultOf(resolution: Resolution, fallbackKey: string): PeekResult<unknown> {\n switch (resolution.kind) {\n case 'missing':\n return Object.freeze({ kind: 'missing', key: fallbackKey })\n case 'conflict':\n return Object.freeze({ kind: 'conflict', key: resolution.provider.name, owners: ownersOf([resolution.provider, ...resolution.rivals]) })\n case 'rejected':\n return Object.freeze({ kind: 'rejected', key: resolution.provider.name, owner: resolution.provider.container.owner, metadata: resolution.provider.metadata })\n case 'not-running': {\n const { provider } = resolution\n const phase = provider.signals.phase()\n // A `perConsumer` registration without a service for the container is `pending`. `peek` does not create one.\n const owner = (provider.template ?? provider).container.owner\n return Object.freeze({ kind: 'not-running', key: provider.name, owner, phase, ...(phase === 'failed' ? { error: provider.failure?.error } : {}) })\n }\n case 'resolved': {\n const { provider, instance } = resolution\n const owner = (provider.template ?? provider).container.owner\n const status = provider.signals.effective()\n if (!status || status.status === 'unavailable')\n return Object.freeze({ kind: 'unavailable', key: provider.name, owner, instanceId: instance.id, ...withoutUndefined({ reason: status?.reason, cause: status?.cause }) })\n\n return Object.freeze({ kind: 'resolved', key: provider.name, owner, value: instance.value, status: status.status, instanceId: instance.id })\n }\n }\n}\n\n/**\n * Reads the value of a dependency now, without a wait. It is a pure read: it does not demand, build, or start a service.\n *\n * The dependency resolves as for a consumer in `container`: a key, `where(key, condition)`, or `firstAvailable(...)`. An `optional` marker has no effect.\n * The result is the value with its status, or the reason why no value is available now. A `perConsumer` key has a value only after something demanded its service for `container`.\n */\nexport function peek<D extends PeekDependency>(container: Container, dependency: D): PeekResult<PeekValue<D>> {\n const node = nodeOf(container)\n const [edge] = readEdges('peek', { dependency })\n if (!edge)\n throw new InvalidArgumentError('peek() needs a dependency.')\n\n return untracked(() => {\n const consumer = { container: node, scope: node, name: 'peek', template: undefined }\n const resolution = edge.fallback ? resolveFallback(consumer, edge) : resolvePlain(consumer, edge)\n return resultOf(resolution, edge.candidates[0] ?? edge.keyName) as PeekResult<PeekValue<D>>\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, ResolveOptions, StartOptions, StopOptions } 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, options?: ResolveOptions): Promise<ResolveDependencyDeclaration<Deps>> {\n return scopedResolve(globalContainer, dependsOn, options)\n}\n\nexport function start(options?: StartOptions): Promise<void> {\n return scopedStart(globalContainer, options)\n}\n\nexport function stop(options?: StopOptions): Promise<void> {\n return scopedStop(globalContainer, options)\n}\n"],"mappings":"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"}