Skip to content
conduit logoConduitInfrastructure
Dependency-first asynchronous dependency injection with typed tokens, lifecycle scopes, startup validation, and deterministic disposal.
Version
v2.0.1
Size
1.7 KB gzip
Dependencies
Zero dependencies
BrowserNode ≥22SSRDeno
createContainertokenscope

Why Conduit?

Conduit makes service wiring explicit. Factory dependency tuples are source of truth for creation, startup validation, and disposal order.

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

// After
container.factory(Service, [Api, Logger], (api, logger) => createService(api, logger));
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, token } from '@vielzeug/conduit';

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

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

console.log(await container.resolve(Client));
await container.dispose();

Features

  • token: typed dependency identity
  • factory: static dependency-first creation
  • validate: startup graph validation
  • 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.