nope/lib/dispatcher/index.ts

81 lines
4.3 KiB
TypeScript
Raw Permalink Normal View History

2021-08-30 04:40:28 +00:00
/**
2022-01-19 17:38:43 +00:00
* @module dispatcher
2021-08-30 04:40:28 +00:00
* @author Martin Karkowski
* @email m.karkowski@zema.de
2022-01-19 17:38:43 +00:00
* # 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`: {@link 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`: {@link PubSubSystem} | 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`: {@link DataPubSubSystem} | 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`: {@link 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`: {@link 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`. |
*
*## Create a Dispatcher
*
*To start exploring the capabilities of the dispatcher we will firstly create a dispatcher with the code below:
*
*
*```javascript
* // First lets install nope using npm
* const nope = require("../dist-nodejs/index.nodejs")
*
* // Lets create our dispatcher
* const dispatcher = nope.dispatcher.getDispatcher({
* // We will use the event layer (which just runs internally)
* communicator: nope.getLayer("event"),
*
* // We will adapt the timings (normally, we send a hartbeat and check for dead dispatchers)
* timings: {
*
* // Interval for the alive message given in [ms]. If "0" is provided,
* // no alive messages are provided
* sendAliveInterval: 0,
*
* // Interval, to check the other dispatcher for being slow, dead, etc..
* // should be lager then the "sendAliveInterval". The value is given in [ms]
* // If "0" is provided, no alive messages are provided
* checkInterval: 0
*
* }
* });
*```
*
*## Settings for creating:
*
*The relevant Settings are described by the {@link INopeDispatcherOptions}. This options allows to define:
* * the communication bridge. (use `getLayer` to receive a bridge with the specified layer)
* * define a specific `id`
* * provide a logger (otherwise the dispatcher wont log anything)
* * define the timings for `heartbeats` and `checks` (see {@link INopeINopeConnectivityTimeOptions} for more details)
* * a `defaultSelector` which is used as selector for a service provide
*
*## Playing with the dispatcher:
*
*To play with a dispatcher, you can use the `nope-js` repl tool. this tool creates a `dispatcher` and you are able to interact with the dispatcher in an interactive console.
*
*
2021-08-30 04:40:28 +00:00
*/
2022-01-19 17:38:43 +00:00
import * as baseServices from "./baseServices";
import * as connectivityManager from "./ConnectivityManager";
import * as instanceManager from "./InstanceManager";
import * as rpcManager from "./RpcManager";
2021-08-30 04:40:28 +00:00
export {
exportAsNopeService,
IexportAsNopeServiceParameters,
2022-01-10 06:52:05 +00:00
nopeEmitter,
nopeMethod,
2022-01-19 17:38:43 +00:00
nopeProperty,
2021-08-30 04:40:28 +00:00
} from "../decorators/index";
2021-09-04 11:45:52 +00:00
export * from "../types/nope/nopeDispatcher.interface";
2021-08-30 04:40:28 +00:00
export { getDispatcher } from "./getDispatcher";
export { getLinkedDispatcher } from "./getLinkedDispatcher";
2022-01-19 17:38:43 +00:00
export { baseServices, connectivityManager, instanceManager, rpcManager };