Skip to content
conduit logoConduitInfrastructure
Dependency-first asynchronous dependency injection with typed tokens, lifecycle scopes, startup validation, and deterministic disposal.
Version
v3.0.0
Size
2.4 KB gzip
Dependencies
Zero dependencies
BrowserNode ≥22SSRDeno
createContainervalueProviderfactoryProviderdisposalSignalTokentoken View all 6 exports

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
  • scope: explicit 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.