import type { Env } from './env'; import type { ProviderFor, ProviderKey } from './providers'; /** * Shared token for cross-module state */ export type SharedToken = symbol & { __sharedToken?: T }; /** * Context provided to modules during registration */ export interface RegisterContext { env: Env; getProvider(key: TKey): Promise>; getShared(token: SharedToken): T | undefined; setShared(token: SharedToken, value: T): void; } /** * SDK Module - Generic module interface * * Base interface for all SDK modules. Modules are thin factories that * instantiate services and register them with the SDK. * * Use this for non-chain-specific modules (e.g., apiModule). * * @template TId - Unique module identifier * @template TService - Service interface the module provides * * @example * ```typescript * function apiModule(): SdkModule<'api', ApiService> { * return { * id: 'api', * register(ctx) { * return new ApiService(ctx.env); * }, * }; * } * ``` */ export interface SdkModule { /** Unique module identifier */ id: TId; /** Provider keys required by this module */ requiresProviders?: ProviderKey[]; /** Factory function that creates the service */ register(ctx: RegisterContext): TService; } /** * Chain Module - Module interface for blockchain-specific services * * Extension of SdkModule for chain-specific modules. Adds a `chain` field * to identify the blockchain type. * * Use this for chain-specific modules (e.g., btcModule, evmModule, solanaModule). * * @template TChain - Chain type identifier (e.g., 'btc', 'evm', 'solana') * @template TService - Service interface the module provides * * @example * ```typescript * function evmModule(): ChainModule<'evm', EvmService> { * return { * id: 'evm', * chain: 'evm', * register(ctx) { * return new EvmService(ctx.env); * }, * }; * } * ``` */ export interface ChainModule< TChain extends string = string, TService = unknown, > extends SdkModule { /** Chain type this module provides services for */ chain: TChain; } /** * Any module type (either SdkModule or ChainModule) */ export type AnyModule = | SdkModule | ChainModule; /** * Extract module ID type from a module */ export type ModuleId = TModule extends SdkModule ? TId : never; /** * Extract service type from a module by ID */ export type ServiceOf< TModule extends SdkModule, TId extends string, > = TModule extends SdkModule ? TService : never; /** * @deprecated Use ServiceOf instead */ export type CapabilitiesOf< TModule extends ChainModule, TId extends string, > = TModule extends ChainModule & { id: TId } ? TCapabilities : never;