nope-js-node
Version:
NoPE Runtime for Nodejs. For Browser-Support please use nope-browser
133 lines (132 loc) • 6.59 kB
TypeScript
import { IHost, INopeINopeConnectivityOptions } from "./nopeConnectivityManager.interface";
import { INopeCore } from "./nopeCore.interface";
import { INopeDescriptor } from "./nopeDescriptor.interface";
import { IEventAdditionalData, IEventCallback, INopeEventEmitter, INopeObserver } from "./nopeEventEmitter.interface";
import { INopeModule, INopeModuleDescription } from "./nopeModule.interface";
import { INopeObservable } from "./nopeObservable.interface";
import { INopePromise } from "./nopePromise.interface";
import { ValidDefaultSelectors } from "./nopeRpcManager.interface";
export type IGenerateInstanceCallback<I extends INopeModule> = () => Promise<I>;
export type IGenerateRemoteInstanceCallback<I extends INopeModule> = (dispatcher: INopeDispatcher, description: INopeModuleDescription, ...args: any[]) => Promise<I>;
export type IGenerateRemoteInstanceForOtherDispatcherCallback<I extends INopeModule> = (dispatcher: INopeDispatcher, identifier: string, ...args: any[]) => Promise<I>;
export type IValidPromise<T> = Promise<T> | INopePromise<T>;
export type INopeDispatcherOptions = {
/**
* The Id of the Dispatcher
*
* @author M.Karkowski
* @type {string}
*/
id?: string;
/**
* The default-selector to select the service providers
*
* @author M.Karkowski
* @type {ValidDefaultSelectors}
*/
defaultSelector?: ValidDefaultSelectors;
/**
* Flag to force using the service provider selector
* functionalities.
*
* @author M.Karkowski
* @type {boolean}
*/
forceUsingSelectors?: boolean;
/**
* Flag to ensure, that every path used is corrcet and could be
* used as variable in another system.
*
* @author M.Karkowski
* @type {boolean}
*/
forceUsingValidVarNames?: boolean;
/**
* Flag to indicate, whether methodes with the call {@link nope.exportAsNopeService} are
* provided by the instance or not.
*/
useExportedServices?: boolean;
} & INopeINopeConnectivityOptions;
export interface IHostOverview extends IHost {
dispatchers: {
id: string;
pid: number | string;
}[];
instances: INopeModuleDescription[];
services: {
name: string;
schema: INopeDescriptor;
}[];
}
export interface IDispatcherConstructor {
new (options: INopeDispatcherOptions, _generateEmitter: <T>() => INopeEventEmitter<T>, _generateObservable: <T>() => INopeObservable<T>): INopeDispatcher;
}
/**
* # NoPE - Dispatcher
*
* The NoPE-Dispatcher is designed as Layer between the different Modules / Dispatchers. They allow distributed computing or just a simple ***Service oriented Architecture*** (*SOA*). A dispatcher is used to link the modules, share data and events and provide a remote procedure call (rpc) interface.
*
* ## Building Blocks of a Dispatcher:
*
* | element | description |
* |-|-|
* | `connectivityManager` | establishes a connection to other dispatchers and manages the status of the remotely connected dispatchers. It checks their health and removes dead dispatchers. |
* | `eventDistributor` | shares events accross the network (or internally). You can use this element to listen for specific events. The subscription to those events allows `mqtt`-patterns. Additionaly, you are allowed to emit event on specific topics, or pattern based topics |
* | `dataDistributor` | shares data accross the network (or internally). In comperisson to events, data is persistent and is available all the time. You can use this sub-module to listen for specific data-changes (install data-hooks), pull specific data or push data. You can pull / push data using a `mqtt`-pattern based path. |
* | `rpcManager` | Used to perform `remote procedure calls` (see [here](https://de.wikipedia.org/wiki/Remote_Procedure_Call)). The manager keeps track of the available services. You must use the sub-module to register/unregister (new) services. |
* | `instanceManager` | Used to create/dispose (remote) instances. The manager keeps track of the available instances in the network, allows to create `wrappers` for those instances. You must use the sub-module to register/unregister (new) instances. To allow the system to provide a service for creating instances of as specific type, you can provide a generator and provide it as `service`. |
* @export
* @interface INopeDispatcher
*/
export interface INopeDispatcher extends INopeCore {
readonly options: INopeDispatcherOptions;
/**
* Pushs the desired data into the system.
* @param path The path to the Data.
* @param content The Content to Push
* @param options The Options during pushing
*/
pushData<T = unknown>(path: string, content: T, options: IEventAdditionalData): void;
/**
* Helper to pull some data from the system.
* @param path The path to the Data.
* @param _default The value to use if no data has been found. If not provided an error is thrown. Defaults to None.
*/
pullData<T = unknown, D = null>(path: string, _default?: D): T;
/**
* Helper to subscribe to specific events.
* @param event Name of the relevant event
* @param subscription the Callback to use.
*/
subscribeToEvent<T = unknown>(event: string, subscription: IEventCallback<T>): INopeObserver;
/**
* Emits an event with the given name. All
* event-subscriber, where the topic matches
* will receive this notification.
* @param eventName
* @param data
*/
emitEvent(eventName: string, data: any): any;
/**
* Receive the "instances" | "services" | "properties" | "events"
* which matches with the given pattern. Therefore the user provides
* the pattern and tyle.
*
* @author M.Karkowski
* @param {string} pattern Pattern to query the provided type.
* @param {("instances" | "services" | "properties" | "events")} type Type which should be querried
* @return {string[]} List of the matching items.
* @memberof INopeDispatcher
*/
query(pattern: string, type: "instances" | "services" | "properties" | "events"): string[];
/**
* Function used to dispose the Dispatcher. This will
* dispose all instances an remove the them. They wont
* be available in the NoPE-Network.
*
* @author M.Karkowski
* @return {Promise<void>}
* @memberof INopeDispatcher
*/
dispose(): Promise<void>;
}