moleculer
Version:
Fast & powerful microservices framework for Node.JS
376 lines (323 loc) • 10.7 kB
TypeScript
import Context = require("./context");
import ServiceBroker = require("./service-broker");
import Strategy = require("./strategies/base");
import type { MoleculerError } from "./errors";
import type { Logger } from "./logger-factory";
import type { CacherKeygen } from "./cachers/base";
import type { BulkheadOptions } from "./middlewares";
import type {
BrokerCircuitBreakerOptions,
CallingOptions,
FallbackHandler,
RetryPolicyOptions
} from "./service-broker";
import type { TracingActionTags, TracingEventTags } from "./tracing/tracer";
declare namespace Service {
export type ServiceSyncLifecycleHandler<TThis = Service> = (this: TThis) => void;
export type ServiceAsyncLifecycleHandler<TThis = Service> = (
this: TThis
) => void | Promise<void>;
export interface ServiceSearchObj {
name?: string;
version?: string | number;
}
export interface ServiceSchema<
TSettings = ServiceSettingSchema,
TMethods = Record<string, any>,
TVars = Record<string, any>,
TThis = Service<TSettings> & TVars & TMethods
> {
name: string;
version?: string | number;
settings?: TSettings;
dependencies?: string | ServiceDependency | (string | ServiceDependency)[];
metadata?: any;
actions?: ServiceActionsSchema<TThis>;
mixins?: Partial<ServiceSchema>[];
methods?: ServiceMethods & ThisType<TThis>;
hooks?: ServiceHooks<TThis>;
events?: EventSchemas<TThis>;
created?: ServiceSyncLifecycleHandler<TThis> | ServiceSyncLifecycleHandler<TThis>[];
started?: ServiceAsyncLifecycleHandler<TThis> | ServiceAsyncLifecycleHandler<TThis>[];
stopped?: ServiceAsyncLifecycleHandler<TThis> | ServiceAsyncLifecycleHandler<TThis>[];
}
export interface ServiceSettingSchema {
$noVersionPrefix?: boolean;
$noServiceNamePrefix?: boolean;
$dependencyTimeout?: number;
$shutdownTimeout?: number;
$secureSettings?: string[];
}
export type ServiceAction = <
T = Promise<any>,
P extends Record<string, any> = Record<string, any>
>(
params?: P,
opts?: CallingOptions
) => T;
export interface ServiceActions {
[name: string]: ServiceAction;
}
export type ActionVisibility = "published" | "public" | "protected" | "private";
export type ActionParamTypes =
| "any"
| "array"
| "boolean"
| "custom"
| "date"
| "email"
| "enum"
| "forbidden"
| "function"
| "number"
| "object"
| "string"
| "url"
| "uuid"
| boolean
| string
| Record<string, any>;
export type ActionParams = { [key: string]: ActionParamTypes };
export type ActionCacheEnabledFunc = (ctx: Context<any, any>) => boolean;
export interface ActionCacheOptions<TParams = unknown, TMeta extends object = object> {
enabled?: boolean | ActionCacheEnabledFunc;
ttl?: number;
keys?: string[];
keygen?: CacherKeygen<TParams, TMeta>;
lock?: {
enabled?: boolean;
staleTime?: number;
};
}
export interface ActionSchema<TThis = Service> {
name?: string;
visibility?: ActionVisibility;
params?: ActionParams;
service?: Service;
cache?: boolean | ActionCacheOptions;
handler?: ActionHandler<TThis>;
tracing?: boolean | TracingActionOptions;
bulkhead?: BulkheadOptions;
circuitBreaker?: BrokerCircuitBreakerOptions;
retryPolicy?: RetryPolicyOptions;
fallback?: string | FallbackHandler;
hooks?: ActionHooks & ThisType<TThis>;
strategy?: string | typeof Strategy;
strategyOptions?: Record<string, any>;
// For internal purposes only!
remoteHandler?: ActionHandler<TThis>;
}
export type ActionHandler<TThis = Service> = (
this: TThis,
ctx: Context<any, any>
) => Promise<any> | any;
export type ServiceActionsSchema<TThis = Service> = {
[key: string]: ActionSchema<TThis> | ActionHandler<TThis> | boolean;
};
export type ServiceMethod = (...args: any[]) => any;
export type ServiceMethods = { [key: string]: ServiceMethod };
export interface ServiceDependency {
name: string;
version?: string | number;
}
export type ActionHookBefore = (ctx: Context<any, any>) => Promise<void> | void;
export type ActionHookAfter = (ctx: Context<any, any>, res: any) => Promise<any> | any;
export type ActionHookError = (ctx: Context<any, any>, err: Error) => Promise<void> | void;
export interface ActionHooks {
before?: string | ActionHookBefore | (string | ActionHookBefore)[];
after?: string | ActionHookAfter | (string | ActionHookAfter)[];
error?: string | ActionHookError | (string | ActionHookError)[];
}
export interface ServiceHooksBefore {
[key: string]: string | ActionHookBefore | (string | ActionHookBefore)[];
}
export interface ServiceHooksAfter {
[key: string]: string | ActionHookAfter | (string | ActionHookAfter)[];
}
export interface ServiceHooksError {
[key: string]: string | ActionHookError | (string | ActionHookError)[];
}
export interface ServiceHooks<TThis = Service> {
before?: ServiceHooksBefore & ThisType<TThis>;
after?: ServiceHooksAfter & ThisType<TThis>;
error?: ServiceHooksError & ThisType<TThis>;
}
export type EventSchemaHandler = (ctx: Context<any, any>) => void | Promise<void>;
export interface EventSchema {
name?: string;
group?: string;
params?: ActionParams;
service?: Service;
context?: boolean;
debounce?: number;
throttle?: number;
strategy?: string | typeof Strategy;
strategyOptions?: Record<string, any>;
handler?: EventSchemaHandler;
// [key: string]: any;
}
export type EventSchemas<TThis = Service> = {
[key: string]: EventSchemaHandler | EventSchema;
} & ThisType<TThis>;
export interface WaitForServicesResult {
services: string[];
statuses: { name: string; available: boolean }[];
}
export type TracingSpanNameOption = string | ((ctx: Context) => string);
export interface TracingOptions {
enabled?: boolean;
tags?: TracingActionTags | TracingEventTags;
spanName?: TracingSpanNameOption;
safetyTags?: boolean;
}
export interface TracingActionOptions extends TracingOptions {
tags?: TracingActionTags;
}
export interface TracingEventOptions extends TracingOptions {
tags?: TracingEventTags;
}
}
declare class Service<S = Service.ServiceSettingSchema> {
constructor(broker: ServiceBroker, schema?: Partial<Service.ServiceSchema<S>>);
parseServiceSchema(schema: Partial<Service.ServiceSchema<S>>): void;
name: string;
fullName: string;
version?: string | number;
settings: S;
metadata: Record<string, any>;
dependencies?: string | Service.ServiceDependency | (string | Service.ServiceDependency)[];
schema: Service.ServiceSchema<S>;
originalSchema: Service.ServiceSchema<S>;
broker: ServiceBroker;
logger: Logger;
actions: Service.ServiceActions;
Promise: PromiseConstructor;
_init(): void;
_start(): Promise<void>;
_stop(): Promise<void>;
/**
* Call a local event handler. Useful for unit tests.
*
* @param eventName The event name
* @param params The event parameters
* @param opts The event options
*/
emitLocalEventHandler(eventName: string, params?: any, opts?: any): any;
/**
* Wait for the specified services to become available/registered with this broker.
*
* @param serviceNames The service, or services, we are waiting for.
* @param timeout The total time this call may take. If this time has passed and the service(s)
* are not available an error will be thrown. (In milliseconds)
* @param interval The time we will wait before once again checking if the service(s) are available (In milliseconds)
*/
waitForServices(
serviceNames: string | Service.ServiceDependency | (string | Service.ServiceDependency)[],
timeout?: number,
interval?: number
): Promise<Service.WaitForServicesResult>;
// [key: string]: any;
/**
* Apply `mixins` list in schema. Merge the schema with mixins schemas. Returns with the mixed schema
*
* @param schema Schema containing the mixins to merge
*/
applyMixins(schema: Partial<Service.ServiceSchema>): Partial<Service.ServiceSchema>;
/**
* Merge two Service schema
*
* @param mixinSchema Mixin schema
* @param svcSchema Service schema
*/
mergeSchemas(
mixinSchema: Partial<Service.ServiceSchema>,
svcSchema: Partial<Service.ServiceSchema>
): Partial<Service.ServiceSchema>;
/**
* Merge `settings` property in schema
*
* @param src Source schema property
* @param target Target schema property
*/
mergeSchemaSettings(src: Record<string, any>, target: Record<string, any>): Record<string, any>;
/**
* Merge `metadata` property in schema
*
* @param src Source schema property
* @param target Target schema property
*/
mergeSchemaMetadata(src: Record<string, any>, target: Record<string, any>): Record<string, any>;
/**
* Merge `mixins` property in schema
*
* @param src Source schema property
* @param target Target schema property
*/
mergeSchemaUniqArray(
src: Record<string, any>,
target: Record<string, any>
): Record<string, any>;
/**
* Merge `dependencies` property in schema
*
* @param src Source schema property
* @param target Target schema property
*/
mergeSchemaDependencies(
src: Record<string, any>,
target: Record<string, any>
): Record<string, any>;
/**
* Merge `hooks` property in schema
*
* @param src Source schema property
* @param target Target schema property
*/
mergeSchemaHooks(src: Record<string, any>, target: Record<string, any>): Record<string, any>;
/**
* Merge `actions` property in schema
*
* @param src Source schema property
* @param target Target schema property
*/
mergeSchemaActions(src: Record<string, any>, target: Record<string, any>): Record<string, any>;
/**
* Merge `methods` property in schema
*
* @param src Source schema property
* @param target Target schema property
*/
mergeSchemaMethods(src: Record<string, any>, target: Record<string, any>): Record<string, any>;
/**
* Merge `events` property in schema
*
* @param src Source schema property
* @param target Target schema property
*/
mergeSchemaEvents(src: Record<string, any>, target: Record<string, any>): Record<string, any>;
/**
* Merge `started`, `stopped`, `created` event handler properties in schema
*
* @param src Source schema property
* @param target Target schema property
*/
mergeSchemaLifecycleHandlers(
src: Record<string, any>,
target: Record<string, any>
): Record<string, any>;
/**
* Merge unknown properties in schema
*
* @param src Source schema property
* @param target Target schema property
*/
mergeSchemaUnknown(src: Record<string, any>, target: Record<string, any>): Record<string, any>;
/**
* Return a versioned full service name.
*
* @param name The name
* @param version The version
*/
static getVersionedFullName(name: string, version?: string | number): string;
}
export = Service;