UNPKG

moleculer

Version:

Fast & powerful microservices framework for Node.JS

539 lines (426 loc) 13.8 kB
import type { EventEmitter2 } from "eventemitter2"; import type { Base as BaseCacher } from "./cachers"; import type { ContextParentSpan } from "./context"; import type { Regenerator as ErrorRegenerator, MoleculerError, MoleculerRetryableError } from "./errors"; import type { Base as BaseLogger, LogLevels } from "./loggers"; import type { Logger, LoggerConfig } from "./logger-factory"; import type { MetricRegistry, MetricRegistryOptions } from "./metrics"; import type { Middleware, MiddlewareCallHandlerOptions } from "./middleware"; import type { BulkheadOptions } from "./middlewares"; import type ServiceRegistry = require("./registry"); import type { Base as BaseSerializer } from "./serializers"; import type { ServiceSchema, ServiceSettingSchema } from "./service"; import type { Tracer, TracerOptions } from "./tracing"; import type Transit = require("./transit"); import type { Base as BaseTransporter } from "./transporters"; import type { Base as BaseValidator, ValidatorNames, ValidatorOptions } from "./validators"; import type Context = require("./context"); import type MiddlewareHandler = require("./middleware"); import type ActionEndpoint = require("./registry/endpoint-action"); import type EventEndpoint = require("./registry/endpoint-event"); import type Service = require("./service"); import type Runner = require("./runner"); import type { ServiceDependency } from "./service"; import type { LoggerOptions } from "./loggers/base"; import type { TcpTransporterOptions } from "./transporters/tcp"; import type { NatsTransporterOptions } from "./transporters/nats"; import type { AmqpTransporterOptions } from "./transporters/amqp"; import type { Amqp10TransporterOptions } from "./transporters/amqp10"; import type { MqttTransporterOptions } from "./transporters/mqtt"; import type { KafkaTransporterOptions } from "./transporters/kafka"; import type { RedisTransporterOptions } from "./transporters/redis"; import type { MemoryCacherOptions } from "./cachers/memory"; import type { MemoryLRUCacherOptions } from "./cachers/memory-lru"; import type { RedisCacherOptions } from "./cachers/redis"; import type { UserInfo, type } from "os"; import type { JSONExtSerializerOptions } from "./serializers/json-extended"; import type { CborSerializerOptions } from "./serializers/cbor"; import type ServiceItem = require("./registry/service-item"); import type { Readable } from "stream"; declare namespace ServiceBroker { type BrokerSyncLifecycleHandler = (broker: ServiceBroker) => void; type BrokerAsyncLifecycleHandler = (broker: ServiceBroker) => void | Promise<void>; interface BrokerErrorHandlerInfoAction { ctx: Context; service: Context["service"]; action: Context["action"]; } interface BrokerErrorHandlerInfoBroker { actionName: string; params: unknown; opts: CallingOptions; nodeId?: string; } type BrokerErrorHandlerInfo = BrokerErrorHandlerInfoAction | BrokerErrorHandlerInfoBroker; type BrokerErrorHandler = ( this: ServiceBroker, err: Error, info: BrokerErrorHandlerInfo ) => void; type TransporterConfig = | { type: "AMQP"; options?: AmqpTransporterOptions; } | { type: "AMQP10"; options?: Amqp10TransporterOptions; } | { type: "Fake"; } | { type: "Kafka"; options?: KafkaTransporterOptions; } | { type: "MQTT"; options?: MqttTransporterOptions; } | { type: "NATS"; options?: NatsTransporterOptions; } | { type: "Redis"; options?: RedisTransporterOptions; } | { type: "TCP"; options?: TcpTransporterOptions; }; type TransporterType = TransporterConfig["type"]; type CacherConfig = | { type: "Memory"; options?: MemoryCacherOptions; } | { type: "MemoryLRU"; options?: MemoryLRUCacherOptions; } | { type: "Redis"; options?: RedisCacherOptions; }; type CacherType = CacherConfig["type"]; type SerializerConfig = | { type: "JSON"; } | { type: "JSONExt"; options?: JSONExtSerializerOptions; } | { type: "MsgPack"; } | { type: "Notepack"; } | { type: "CBOR"; options?: CborSerializerOptions; }; type SerializerType = SerializerConfig["type"]; export interface BrokerOptions { namespace?: string | null; nodeID?: string | null; logger?: BaseLogger<LoggerOptions> | LoggerConfig | LoggerConfig[] | boolean | null; logLevel?: LogLevels | LogLevelConfig | null; transporter?: BaseTransporter | TransporterType | TransporterConfig | null; requestTimeout?: number; retryPolicy?: RetryPolicyOptions; contextParamsCloning?: boolean; maxCallLevel?: number; heartbeatInterval?: number; heartbeatTimeout?: number; tracking?: BrokerTrackingOptions; disableBalancer?: boolean; registry?: ServiceRegistry.RegistryOptions; circuitBreaker?: BrokerCircuitBreakerOptions; bulkhead?: BulkheadOptions; transit?: Transit.TransitOptions; uidGenerator?: () => string; errorHandler?: BrokerErrorHandler | null; cacher?: boolean | BaseCacher<any> | CacherType | CacherConfig | null; serializer?: BaseSerializer | SerializerType | SerializerConfig | null; validator?: boolean | BaseValidator | ValidatorNames | ValidatorOptions | null; errorRegenerator?: ErrorRegenerator | null; metrics?: boolean | MetricRegistryOptions; tracing?: boolean | TracerOptions; internalServices?: | boolean | { $node: Partial<ServiceSchema>; }; internalMiddlewares?: boolean; dependencyInterval?: number; dependencyTimeout?: number; hotReload?: boolean | HotReloadOptions; middlewares?: (Middleware | string)[]; replOptions?: ReplOptions | null; metadata?: Record<string, any>; ServiceFactory?: typeof Service; ContextFactory?: typeof Context; Promise?: PromiseConstructor; created?: BrokerSyncLifecycleHandler; started?: BrokerAsyncLifecycleHandler; stopped?: BrokerAsyncLifecycleHandler; skipProcessEventRegistration?: boolean; maxSafeObjectSize?: number | null; } export interface ReplCustomCommand { command: string; description?: string | null; alias?: string | string[] | null; allowUnknownParams?: boolean | null; parse?: Function | null; options?: Array<{ option?: string | null; description?: string | null; }>; action: (broker: ServiceBroker, args: string[], helpers: any) => Promise<void> | void; } export interface ReplOptions { customCommands?: ReplCustomCommand[]; delimiter?: string; } export interface BrokerCircuitBreakerOptions { enabled?: boolean; threshold?: number; windowTime?: number; minRequestCount?: number; halfOpenTime?: number; check?: CheckRetryable; } export interface PongResponse { nodeID: string; elapsedTime: number; timeDiff: number; } export interface PongResponses { [name: string]: PongResponse; } export interface HotReloadOptions { modules?: string[]; } export interface LogLevelConfig { [module: string]: boolean | LogLevels; } export interface BrokerTrackingOptions { enabled?: boolean; shutdownTimeout?: number; } export interface NodeHealthStatus { cpu: { load1: number; load5: number; load15: number; cores: number; utilization: number; }; mem: { free: number; total: number; percent: number; }; os: { uptime: number; type: string; release: string; hostname: string; arch: string; platform: string; user: UserInfo<string> | {}; }; process: { pid: NodeJS.Process["pid"]; memory: NodeJS.MemoryUsage; uptime: number; argv: string[]; }; client: { type: string; version: string; langVersion: NodeJS.Process["version"]; }; net: { ip: string[]; }; time: { now: number; iso: string; utc: string; }; } export type CheckRetryable = (err: MoleculerError | Error) => boolean; export interface RetryPolicyOptions { enabled?: boolean; retries?: number; delay?: number; maxDelay?: number; factor?: number; check?: CheckRetryable; } export type FallbackHandler = (ctx: Context, err: MoleculerError) => Promise<any>; export type FallbackResponse = string | number | Record<string, any>; export type FallbackResponseHandler = (ctx: Context, err: MoleculerError) => Promise<any>; export interface CallingOptions { timeout?: number | null; retries?: number | null; fallbackResponse?: FallbackResponse | FallbackResponse[] | FallbackResponseHandler; nodeID?: string; meta?: Record<string, any>; parentSpan?: ContextParentSpan; parentCtx?: Context; requestID?: string; tracking?: boolean; paramsCloning?: boolean; caller?: string; headers?: Record<string, any>; stream?: Readable; ctx?: Context; } export interface MCallCallingOptions extends CallingOptions { settled?: boolean; } export interface CallDefinition<P extends Record<string, any> = Record<string, any>> { action: string; params: P; } export interface MCallDefinition<P extends Record<string, any> = Record<string, any>> extends CallDefinition<P> { options?: CallingOptions; } } declare class ServiceBroker { static MOLECULER_VERSION: string; static PROTOCOL_VERSION: string; static INTERNAL_MIDDLEWARES: string[]; static defaultOptions: ServiceBroker.BrokerOptions; MOLECULER_VERSION: string; PROTOCOL_VERSION: string; options: ServiceBroker.BrokerOptions; Promise: PromiseConstructor; ServiceFactory: typeof Service; ContextFactory: typeof Context; namespace: string; metadata: Record<string, any>; nodeID: string; instanceID: string; logger: Logger; services: Service[]; localBus: EventEmitter2; // scope: AsyncStorage; metrics: MetricRegistry; middlewares: MiddlewareHandler; registry: ServiceRegistry; cacher?: BaseCacher<any>; serializer?: BaseSerializer; validator?: BaseValidator; errorRegenerator?: ErrorRegenerator; tracer: Tracer; transit?: Transit; started: boolean; servicesStarting: boolean; stopping: boolean; runner?: Runner; constructor(options?: ServiceBroker.BrokerOptions); registerMiddlewares(userMiddlewares: MiddlewareHandler.Middleware[]): void; registerMoleculerMetrics(): void; start(): Promise<void>; stop(): Promise<void>; repl(): void; errorHandler(err: Error, info: ServiceBroker.BrokerErrorHandlerInfo): void; wrapMethod( name: string, handler: Function, bindTo?: any, opts?: MiddlewareCallHandlerOptions ): any; callMiddlewareHook( name: string, args: any[], opts?: MiddlewareCallHandlerOptions ): Promise<void>; callMiddlewareHookSync(name: string, args: any[], opts?: MiddlewareCallHandlerOptions): void; isMetricsEnabled(): boolean; isTracingEnabled(): boolean; getLogger(module: string, props?: Record<string, any>): Logger; fatal(message: string, err?: Error, needExit?: boolean): void; loadServices(folder?: string, fileMask?: string): number; loadService(filePath: string): Service; getLocalService(name: string | ServiceDependency): Service; createService(schema: ServiceSchema<any, any, any>, schemaMods?: Partial<ServiceSchema>): Service; createService<TSettings = ServiceSettingSchema, TMethods = Record<string, any>, TVars = Record<string, any>, TThis = Service<TSettings> & TVars & TMethods >(schema: ServiceSchema<TSettings, TMethods, TVars>, schemaMods?: Partial<ServiceSchema>): TThis; _restartService(service: Service): Promise<void>; addLocalService(service: Service): void; registerLocalService(registryItem: ServiceItem): void; destroyService(service: Service | string | ServiceDependency): Promise<void>; servicesChanged(localService?: boolean): void; localServiceChanged(): void; registerInternalServices(opts?: object): void; waitForServices( serviceNames: string | ServiceDependency | (string | ServiceDependency)[], timeout?: number, interval?: number, logger?: Logger ): Promise<void>; findNextActionEndpoint( actionName: string | ActionEndpoint, opts?: Record<string, any>, ctx?: Context ): ActionEndpoint | MoleculerRetryableError; call<TReturn>(actionName: string): Promise<TReturn>; call<TReturn, TParams>( actionName: string, params: TParams, opts?: ServiceBroker.CallingOptions ): Promise<TReturn>; callWithoutBalancer<TReturn>(actionName: string): Promise<TReturn>; callWithoutBalancer<TReturn, TParams>( actionName: string, params: TParams, opts?: ServiceBroker.CallingOptions ): Promise<TReturn>; _getLocalActionEndpoint(actionName: string, ctx?: Context): ActionEndpoint; mcall<TResult>( def: Record<string, ServiceBroker.MCallDefinition>, opts?: ServiceBroker.MCallCallingOptions ): Promise<Record<string, TResult>>; mcall<TResult>( def: ServiceBroker.MCallDefinition[], opts?: ServiceBroker.MCallCallingOptions ): Promise<TResult[]>; emit<TData>(eventName: string, data?: TData, opts?: Record<string, any>): Promise<void>; emit(eventName: string): Promise<void>; broadcast<TData>(eventName: string, data?: TData, opts?: Record<string, any>): Promise<void>; broadcast(eventName: string): Promise<void>; broadcastLocal<TData>( eventName: string, data?: TData, opts?: Record<string, any> ): Promise<void>; broadcastLocal(eventName: string): Promise<void>; ping(nodeID?: string | string[], timeout?: number): Promise<ServiceBroker.PongResponse>; getHealthStatus(): ServiceBroker.NodeHealthStatus; getLocalNodeInfo(): ServiceRegistry.NodeRawInfo; getEventGroups(eventName: string): string[]; hasEventListener(eventName: string): boolean; getEventListeners(eventName: string): EventEndpoint[]; emitLocalServices(ctx: Context): Promise<void>; getCpuUsage(): Promise<Record<string, any>>; generateUid(): string; getConstructorName(obj: Record<string, any>): string; normalizeSchemaConstructor(schema: ServiceSchema): ServiceSchema; } export = ServiceBroker;