@eang/core
Version:
eang - model driven enterprise event processing
149 lines (148 loc) • 4.86 kB
TypeScript
import { ConsumerStream, NatsStreamService } from './NatsStreamingService.js';
import { NatsConnection } from '@nats-io/nats-core';
import { JetStreamClient, JetStreamManager, JetStreamPublishOptions } from '@nats-io/jetstream';
import { FunctionStartContext, IFunctionStopContext } from './context.js';
import { EntityEvent } from './entity.js';
import * as v from 'valibot';
export type EangFunctionHandler<TInput extends object = any, TOutput extends object = any, TEnv = {
[key: string]: string;
}, TSecrets = {
[key: string]: string;
}> = (input: TInput, eang: EangFunction<TEnv, TSecrets>, context?: FunctionStartContext) => Promise<IFunctionStopContext<TOutput>>;
export interface IPublishingOptions {
tenant: string;
organizationalUnit?: string;
user: string;
jetStreamOptions?: Partial<JetStreamPublishOptions>;
}
/**
* Configuration for Eang classes with optional type-safe secrets and environment variables.
*
* All fields are optional and will be loaded from environment variables if not provided:
* - tenant: env.EANG_TENANT
* - organizationalUnit: env.EANG_ORGANIZATIONAL_UNIT
* - servers: env.EANG_SERVERS
* - user: env.EANG_USER
* - password: env.EANG_PASSWORD
*
* @example
* // Provide only secretsSchema, everything else from environment
* const publisher = new EangPublisher<never, MySecrets>({
* secretsSchema: MySecretsSchema
* })
*
* @example
* // Type-safe environment variables only
* const publisher = new EangPublisher<MyEnv>({
* envSchema: MyEnvSchema
* })
*
* @example
* // Both type-safe env and secrets
* const publisher = new EangPublisher<MyEnv, MySecrets>({
* envSchema: MyEnvSchema,
* secretsSchema: MySecretsSchema
* })
*/
export interface EangConfig<TEnv = {
[key: string]: string;
}, TSecrets = {
[key: string]: string;
}> {
tenant?: string;
organizationalUnit?: string | undefined;
servers?: string;
user?: string;
password?: string;
secretsFilePath?: string;
secrets?: TSecrets;
secretsSchema?: v.BaseSchema<any, TSecrets, any>;
env?: TEnv;
envSchema?: v.BaseSchema<any, TEnv, any>;
logLevel?: 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'silent';
}
export interface EangFunctionConfig<TEnv = {
[key: string]: string;
}, TSecrets = {
[key: string]: string;
}> extends EangConfig<TEnv, TSecrets> {
instanceOf?: string;
}
export interface EangServiceConfig<TEnv = {
[key: string]: string;
}, TSecrets = {
[key: string]: string;
}> extends EangConfig<TEnv, TSecrets> {
instanceOf?: string;
subscriptions?: string[];
}
export declare abstract class EangBase<TEnv = {
[key: string]: string;
}, TSecrets = {
[key: string]: string;
}> {
tenant: string;
organizationalUnit?: string | undefined;
servers: string;
user: string;
protected _password: string;
protected _secretsFilePath: string | undefined;
protected _secretsSchema: v.BaseSchema<any, TSecrets, any> | undefined;
protected _logLevel: string;
protected _secrets: TSecrets | undefined;
protected _env: TEnv | undefined;
protected _envSchema: v.BaseSchema<any, TEnv, any> | undefined;
protected _nss: NatsStreamService;
protected _natsConnection: {
nc: NatsConnection;
js: JetStreamClient;
jsm: JetStreamManager;
} | undefined;
log: import("pino").Logger<never, boolean>;
get secrets(): TSecrets;
get env(): TEnv;
protected get natConf(): {
servers: string;
user: string;
pass: string;
};
constructor(conf: EangConfig<TEnv, TSecrets>);
ensureStream(streamName: string, subjects: string[]): Promise<{
created: boolean;
streamInfo: import("@nats-io/jetstream").StreamInfo;
}>;
publish(events: EntityEvent[], options?: IPublishingOptions): Promise<import("@nats-io/jetstream").PubAck[]>;
shutdown(): Promise<void>;
}
export declare class EangPublisher<TEnv = {
[key: string]: string;
}, TSecrets = {
[key: string]: string;
}> extends EangBase<TEnv, TSecrets> {
constructor(conf?: EangConfig<TEnv, TSecrets>);
}
export declare class EangFunction<TEnv = {
[key: string]: string;
}, TSecrets = {
[key: string]: string;
}> extends EangBase<TEnv, TSecrets> {
instanceOf: string;
private _subscription;
private _handler;
constructor(options: {
conf?: EangFunctionConfig<TEnv, TSecrets>;
handler: EangFunctionHandler<any, any, TEnv, TSecrets>;
});
start(): Promise<void>;
shutdown(): Promise<void>;
}
export declare class EangService<TEnv = {
[key: string]: string;
}, TSecrets = {
[key: string]: string;
}> extends EangBase<TEnv, TSecrets> {
instanceOf: string;
subscriptions: string[];
constructor(conf?: EangServiceConfig<TEnv, TSecrets>);
start(): Promise<ConsumerStream>;
}