Skip to content
conduit logoConduitInfrastructure
Dependency-first asynchronous dependency injection with typed tokens, child-container scoping, startup validation, and deterministic disposal.
Version
v3.0.0
Size
2.2 KB gzip
Dependencies
Zero dependencies
BrowserNode ≥22SSRDeno
createContainervalueProviderfactoryProviderdisposalSignalTokentoken

Why Conduit? ​

Conduit makes service wiring explicit. Typed builders create immutable providers, static graphs are validated at construction, and dependency tuples drive creation and disposal. Resolve one root token or a typed composition map.

ts
// Before
const service = createService(createApi(config), logger);

// After
const container = createContainer([
  valueProvider(Config, config),
  factoryProvider(Api, [Config], (config) => createApi(config)),
  factoryProvider(Service, [Api, Logger], (api, logger) => createService(api, logger)),
]);
const services = await container.resolve({ service: Service });
FeatureConduitInversifytsyringe
DependenciesExplicit token tuplesDecorators/runtime metadataDecorators/runtime metadata
Async factoriesPartialPartial
Lifecycle scopes
Runtime dependencies0

Use Conduit when application services need explicit wiring and owned lifecycle cleanup.

Consider direct imports when dependencies are static, small, and need no replacement or disposal boundary.

Installation ​

sh
pnpm add @vielzeug/conduit
sh
npm install @vielzeug/conduit
sh
yarn add @vielzeug/conduit

Quick Start ​

ts
import { createContainer, factoryProvider, token, valueProvider } from '@vielzeug/conduit';

const Config = token<{ baseUrl: string }>('Config');
const Client = token<{ url: string }>('Client');

const container = createContainer([
  valueProvider(Config, { baseUrl: '/api' }),
  factoryProvider(Client, [Config], (config) => ({ url: `${config.baseUrl}/users` })),
]);

const services = await container.resolve({ client: Client });
console.log(services.client);
await container.dispose();

Features ​

  • token: typed dependency identity
  • valueProvider / factoryProvider: token-safe immutable registrations
  • createContainer: validated provider graph
  • resolve: direct service or typed composition map
  • createScope: child containers for request and job ownership
  • dispose: in-flight-safe resource cleanup

Documentation ​

See Also ​

  • Courier — inject HTTP clients into application services.
  • Vault — inject persistence adapters with scoped ownership.
  • Rune — provide application logging services.