← stitchkitDocumentation

ADR 0121 — Managed server factories receive resource context

Context

ADR 0114 makes dependency values available through ManagedResourceContext.use(resource). ADR 0115 makes managedServerResource invoke its server factory during start, after declared dependencies are ready. The two decisions must compose: route construction often needs the database, service or socket value that the graph just made ready.

A zero-argument factory discards that context. The application can preserve the value only through an outer mutable variable or by overriding the resource’s start, which creates a second lifecycle owner and defeats the graph boundary.

Decision

The server factory receives ManagedResourceContext:

managedServerResource({
  id: 'http',
  dependsOn: [database],
  server: (context) => {
    const db = context.use(database)
    return createServer({ port, services: createServices(db) })
  },
})

The context is the one used for this resource’s startup. Its signal is the application startup/lifetime signal, and use enforces the resource’s declared dependencies. Sync and async factories receive the same context.

A zero-argument function remains assignable and behaves unchanged. An already created handle remains valid. Once factory invocation begins, any rejection is a single startup failure: rollback never calls the factory again.

Consequences

  • Server construction can consume typed dependency values without an outer handoff.
  • A failed or undeclared dependency prevents binding before the server factory can become a second source of lifecycle state.
  • The managed adapter remains the sole owner of server start and shutdown.
  • Factory cancellation follows the resource graph’s existing signal semantics; no server-specific signal channel is introduced.