eimer 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +130 -0
- package/dist/cjs/eimer/Eimer.d.ts +102 -0
- package/dist/cjs/eimer/Eimer.d.ts.map +1 -0
- package/dist/cjs/eimer/Eimer.js +175 -0
- package/dist/cjs/eimer/Eimer.js.map +1 -0
- package/dist/cjs/eimer/EimerDependencies.d.ts +17 -0
- package/dist/cjs/eimer/EimerDependencies.d.ts.map +1 -0
- package/dist/cjs/eimer/EimerDependencies.js +4 -0
- package/dist/cjs/eimer/EimerDependencies.js.map +1 -0
- package/dist/cjs/eimer/EimerMessage.d.ts +31 -0
- package/dist/cjs/eimer/EimerMessage.d.ts.map +1 -0
- package/dist/cjs/eimer/EimerMessage.js +42 -0
- package/dist/cjs/eimer/EimerMessage.js.map +1 -0
- package/dist/cjs/eimer/EimerOptions.d.ts +12 -0
- package/dist/cjs/eimer/EimerOptions.d.ts.map +1 -0
- package/dist/cjs/eimer/EimerOptions.js +4 -0
- package/dist/cjs/eimer/EimerOptions.js.map +1 -0
- package/dist/cjs/eimer/IdGenerator.d.ts +12 -0
- package/dist/cjs/eimer/IdGenerator.d.ts.map +1 -0
- package/dist/cjs/eimer/IdGenerator.js +3 -0
- package/dist/cjs/eimer/IdGenerator.js.map +1 -0
- package/dist/cjs/eimer/LogLevel.d.ts +16 -0
- package/dist/cjs/eimer/LogLevel.d.ts.map +1 -0
- package/dist/cjs/eimer/LogLevel.js +21 -0
- package/dist/cjs/eimer/LogLevel.js.map +1 -0
- package/dist/cjs/eimer/Logger.d.ts +70 -0
- package/dist/cjs/eimer/Logger.d.ts.map +1 -0
- package/dist/cjs/eimer/Logger.js +3 -0
- package/dist/cjs/eimer/Logger.js.map +1 -0
- package/dist/cjs/eimer/MagicMessageMarker.d.ts +18 -0
- package/dist/cjs/eimer/MagicMessageMarker.d.ts.map +1 -0
- package/dist/cjs/eimer/MagicMessageMarker.js +3 -0
- package/dist/cjs/eimer/MagicMessageMarker.js.map +1 -0
- package/dist/cjs/eimer/MessageBus.d.ts +65 -0
- package/dist/cjs/eimer/MessageBus.d.ts.map +1 -0
- package/dist/cjs/eimer/MessageBus.js +3 -0
- package/dist/cjs/eimer/MessageBus.js.map +1 -0
- package/dist/cjs/eimer/MessageHandler.d.ts +14 -0
- package/dist/cjs/eimer/MessageHandler.d.ts.map +1 -0
- package/dist/cjs/eimer/MessageHandler.js +3 -0
- package/dist/cjs/eimer/MessageHandler.js.map +1 -0
- package/dist/cjs/eimer/MessageId.d.ts +8 -0
- package/dist/cjs/eimer/MessageId.d.ts.map +1 -0
- package/dist/cjs/eimer/MessageId.js +3 -0
- package/dist/cjs/eimer/MessageId.js.map +1 -0
- package/dist/cjs/eimer/NodeId.d.ts +5 -0
- package/dist/cjs/eimer/NodeId.d.ts.map +1 -0
- package/dist/cjs/eimer/NodeId.js +3 -0
- package/dist/cjs/eimer/NodeId.js.map +1 -0
- package/dist/cjs/eimer/PayloadHandler.d.ts +7 -0
- package/dist/cjs/eimer/PayloadHandler.d.ts.map +1 -0
- package/dist/cjs/eimer/PayloadHandler.js +3 -0
- package/dist/cjs/eimer/PayloadHandler.js.map +1 -0
- package/dist/cjs/eimer/RpcHandler.d.ts +6 -0
- package/dist/cjs/eimer/RpcHandler.d.ts.map +1 -0
- package/dist/cjs/eimer/RpcHandler.js +3 -0
- package/dist/cjs/eimer/RpcHandler.js.map +1 -0
- package/dist/cjs/eimer/RpcManager.d.ts +48 -0
- package/dist/cjs/eimer/RpcManager.d.ts.map +1 -0
- package/dist/cjs/eimer/RpcManager.js +3 -0
- package/dist/cjs/eimer/RpcManager.js.map +1 -0
- package/dist/cjs/eimer/RpcMethod.d.ts +5 -0
- package/dist/cjs/eimer/RpcMethod.d.ts.map +1 -0
- package/dist/cjs/eimer/RpcMethod.js +3 -0
- package/dist/cjs/eimer/RpcMethod.js.map +1 -0
- package/dist/cjs/eimer/StructuredCloneable.d.ts +21 -0
- package/dist/cjs/eimer/StructuredCloneable.d.ts.map +1 -0
- package/dist/cjs/eimer/StructuredCloneable.js +3 -0
- package/dist/cjs/eimer/StructuredCloneable.js.map +1 -0
- package/dist/cjs/eimer/Topic.d.ts +5 -0
- package/dist/cjs/eimer/Topic.d.ts.map +1 -0
- package/dist/cjs/eimer/Topic.js +3 -0
- package/dist/cjs/eimer/Topic.js.map +1 -0
- package/dist/cjs/eimer/Transport.d.ts +36 -0
- package/dist/cjs/eimer/Transport.d.ts.map +1 -0
- package/dist/cjs/eimer/Transport.js +3 -0
- package/dist/cjs/eimer/Transport.js.map +1 -0
- package/dist/cjs/eimer/index.d.ts +20 -0
- package/dist/cjs/eimer/index.d.ts.map +1 -0
- package/dist/cjs/eimer/index.js +36 -0
- package/dist/cjs/eimer/index.js.map +1 -0
- package/dist/cjs/id-generator/EimerIdGenerator.d.ts +13 -0
- package/dist/cjs/id-generator/EimerIdGenerator.d.ts.map +1 -0
- package/dist/cjs/id-generator/EimerIdGenerator.js +17 -0
- package/dist/cjs/id-generator/EimerIdGenerator.js.map +1 -0
- package/dist/cjs/id-generator/index.d.ts +2 -0
- package/dist/cjs/id-generator/index.d.ts.map +1 -0
- package/dist/cjs/id-generator/index.js +18 -0
- package/dist/cjs/id-generator/index.js.map +1 -0
- package/dist/cjs/index.d.ts +7 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +23 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/logger/EimerLogger.d.ts +28 -0
- package/dist/cjs/logger/EimerLogger.d.ts.map +1 -0
- package/dist/cjs/logger/EimerLogger.js +68 -0
- package/dist/cjs/logger/EimerLogger.js.map +1 -0
- package/dist/cjs/logger/index.d.ts +2 -0
- package/dist/cjs/logger/index.d.ts.map +1 -0
- package/dist/cjs/logger/index.js +18 -0
- package/dist/cjs/logger/index.js.map +1 -0
- package/dist/cjs/message-bus/EimerMessageBus.d.ts +30 -0
- package/dist/cjs/message-bus/EimerMessageBus.d.ts.map +1 -0
- package/dist/cjs/message-bus/EimerMessageBus.js +120 -0
- package/dist/cjs/message-bus/EimerMessageBus.js.map +1 -0
- package/dist/cjs/message-bus/index.d.ts +2 -0
- package/dist/cjs/message-bus/index.d.ts.map +1 -0
- package/dist/cjs/message-bus/index.js +18 -0
- package/dist/cjs/message-bus/index.js.map +1 -0
- package/dist/cjs/rpc/EimerRpcManager.d.ts +76 -0
- package/dist/cjs/rpc/EimerRpcManager.d.ts.map +1 -0
- package/dist/cjs/rpc/EimerRpcManager.js +162 -0
- package/dist/cjs/rpc/EimerRpcManager.js.map +1 -0
- package/dist/cjs/rpc/EimerRpcRequestMessage.d.ts +28 -0
- package/dist/cjs/rpc/EimerRpcRequestMessage.d.ts.map +1 -0
- package/dist/cjs/rpc/EimerRpcRequestMessage.js +38 -0
- package/dist/cjs/rpc/EimerRpcRequestMessage.js.map +1 -0
- package/dist/cjs/rpc/EimerRpcRequestPayload.d.ts +38 -0
- package/dist/cjs/rpc/EimerRpcRequestPayload.d.ts.map +1 -0
- package/dist/cjs/rpc/EimerRpcRequestPayload.js +33 -0
- package/dist/cjs/rpc/EimerRpcRequestPayload.js.map +1 -0
- package/dist/cjs/rpc/EimerRpcResponseMessage.d.ts +30 -0
- package/dist/cjs/rpc/EimerRpcResponseMessage.d.ts.map +1 -0
- package/dist/cjs/rpc/EimerRpcResponseMessage.js +40 -0
- package/dist/cjs/rpc/EimerRpcResponseMessage.js.map +1 -0
- package/dist/cjs/rpc/EimerRpcResponsePayload.d.ts +30 -0
- package/dist/cjs/rpc/EimerRpcResponsePayload.d.ts.map +1 -0
- package/dist/cjs/rpc/EimerRpcResponsePayload.js +32 -0
- package/dist/cjs/rpc/EimerRpcResponsePayload.js.map +1 -0
- package/dist/cjs/rpc/RpcRequestId.d.ts +6 -0
- package/dist/cjs/rpc/RpcRequestId.d.ts.map +1 -0
- package/dist/cjs/rpc/RpcRequestId.js +3 -0
- package/dist/cjs/rpc/RpcRequestId.js.map +1 -0
- package/dist/cjs/rpc/index.d.ts +7 -0
- package/dist/cjs/rpc/index.d.ts.map +1 -0
- package/dist/cjs/rpc/index.js +23 -0
- package/dist/cjs/rpc/index.js.map +1 -0
- package/dist/cjs/transports/EimerBrowserTransport.d.ts +39 -0
- package/dist/cjs/transports/EimerBrowserTransport.d.ts.map +1 -0
- package/dist/cjs/transports/EimerBrowserTransport.js +74 -0
- package/dist/cjs/transports/EimerBrowserTransport.js.map +1 -0
- package/dist/cjs/transports/EimerIpcMainTransport.d.ts +38 -0
- package/dist/cjs/transports/EimerIpcMainTransport.d.ts.map +1 -0
- package/dist/cjs/transports/EimerIpcMainTransport.js +65 -0
- package/dist/cjs/transports/EimerIpcMainTransport.js.map +1 -0
- package/dist/cjs/transports/EimerIpcRendererTransport.d.ts +43 -0
- package/dist/cjs/transports/EimerIpcRendererTransport.d.ts.map +1 -0
- package/dist/cjs/transports/EimerIpcRendererTransport.js +64 -0
- package/dist/cjs/transports/EimerIpcRendererTransport.js.map +1 -0
- package/dist/cjs/transports/EimerMessagePortTransport.d.ts +40 -0
- package/dist/cjs/transports/EimerMessagePortTransport.d.ts.map +1 -0
- package/dist/cjs/transports/EimerMessagePortTransport.js +56 -0
- package/dist/cjs/transports/EimerMessagePortTransport.js.map +1 -0
- package/dist/cjs/transports/EimerMockTransport.d.ts +35 -0
- package/dist/cjs/transports/EimerMockTransport.d.ts.map +1 -0
- package/dist/cjs/transports/EimerMockTransport.js +60 -0
- package/dist/cjs/transports/EimerMockTransport.js.map +1 -0
- package/dist/cjs/transports/EimerWorkerThreadTransport.d.ts +15 -0
- package/dist/cjs/transports/EimerWorkerThreadTransport.d.ts.map +1 -0
- package/dist/cjs/transports/EimerWorkerThreadTransport.js +16 -0
- package/dist/cjs/transports/EimerWorkerThreadTransport.js.map +1 -0
- package/dist/cjs/transports/index.d.ts +7 -0
- package/dist/cjs/transports/index.d.ts.map +1 -0
- package/dist/cjs/transports/index.js +23 -0
- package/dist/cjs/transports/index.js.map +1 -0
- package/dist/esm/eimer/Eimer.js +171 -0
- package/dist/esm/eimer/Eimer.js.map +1 -0
- package/dist/esm/eimer/EimerDependencies.js +3 -0
- package/dist/esm/eimer/EimerDependencies.js.map +1 -0
- package/dist/esm/eimer/EimerMessage.js +38 -0
- package/dist/esm/eimer/EimerMessage.js.map +1 -0
- package/dist/esm/eimer/EimerOptions.js +3 -0
- package/dist/esm/eimer/EimerOptions.js.map +1 -0
- package/dist/esm/eimer/IdGenerator.js +2 -0
- package/dist/esm/eimer/IdGenerator.js.map +1 -0
- package/dist/esm/eimer/LogLevel.js +18 -0
- package/dist/esm/eimer/LogLevel.js.map +1 -0
- package/dist/esm/eimer/Logger.js +2 -0
- package/dist/esm/eimer/Logger.js.map +1 -0
- package/dist/esm/eimer/MagicMessageMarker.js +2 -0
- package/dist/esm/eimer/MagicMessageMarker.js.map +1 -0
- package/dist/esm/eimer/MessageBus.js +2 -0
- package/dist/esm/eimer/MessageBus.js.map +1 -0
- package/dist/esm/eimer/MessageHandler.js +2 -0
- package/dist/esm/eimer/MessageHandler.js.map +1 -0
- package/dist/esm/eimer/MessageId.js +2 -0
- package/dist/esm/eimer/MessageId.js.map +1 -0
- package/dist/esm/eimer/NodeId.js +2 -0
- package/dist/esm/eimer/NodeId.js.map +1 -0
- package/dist/esm/eimer/PayloadHandler.js +2 -0
- package/dist/esm/eimer/PayloadHandler.js.map +1 -0
- package/dist/esm/eimer/RpcHandler.js +2 -0
- package/dist/esm/eimer/RpcHandler.js.map +1 -0
- package/dist/esm/eimer/RpcManager.js +2 -0
- package/dist/esm/eimer/RpcManager.js.map +1 -0
- package/dist/esm/eimer/RpcMethod.js +2 -0
- package/dist/esm/eimer/RpcMethod.js.map +1 -0
- package/dist/esm/eimer/StructuredCloneable.js +2 -0
- package/dist/esm/eimer/StructuredCloneable.js.map +1 -0
- package/dist/esm/eimer/Topic.js +2 -0
- package/dist/esm/eimer/Topic.js.map +1 -0
- package/dist/esm/eimer/Transport.js +2 -0
- package/dist/esm/eimer/Transport.js.map +1 -0
- package/dist/esm/eimer/index.js +20 -0
- package/dist/esm/eimer/index.js.map +1 -0
- package/dist/esm/id-generator/EimerIdGenerator.js +13 -0
- package/dist/esm/id-generator/EimerIdGenerator.js.map +1 -0
- package/dist/esm/id-generator/index.js +2 -0
- package/dist/esm/id-generator/index.js.map +1 -0
- package/dist/esm/index.js +7 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/logger/EimerLogger.js +64 -0
- package/dist/esm/logger/EimerLogger.js.map +1 -0
- package/dist/esm/logger/index.js +2 -0
- package/dist/esm/logger/index.js.map +1 -0
- package/dist/esm/message-bus/EimerMessageBus.js +116 -0
- package/dist/esm/message-bus/EimerMessageBus.js.map +1 -0
- package/dist/esm/message-bus/index.js +2 -0
- package/dist/esm/message-bus/index.js.map +1 -0
- package/dist/esm/rpc/EimerRpcManager.js +158 -0
- package/dist/esm/rpc/EimerRpcManager.js.map +1 -0
- package/dist/esm/rpc/EimerRpcRequestMessage.js +34 -0
- package/dist/esm/rpc/EimerRpcRequestMessage.js.map +1 -0
- package/dist/esm/rpc/EimerRpcRequestPayload.js +29 -0
- package/dist/esm/rpc/EimerRpcRequestPayload.js.map +1 -0
- package/dist/esm/rpc/EimerRpcResponseMessage.js +36 -0
- package/dist/esm/rpc/EimerRpcResponseMessage.js.map +1 -0
- package/dist/esm/rpc/EimerRpcResponsePayload.js +28 -0
- package/dist/esm/rpc/EimerRpcResponsePayload.js.map +1 -0
- package/dist/esm/rpc/RpcRequestId.js +2 -0
- package/dist/esm/rpc/RpcRequestId.js.map +1 -0
- package/dist/esm/rpc/index.js +7 -0
- package/dist/esm/rpc/index.js.map +1 -0
- package/dist/esm/transports/EimerBrowserTransport.js +70 -0
- package/dist/esm/transports/EimerBrowserTransport.js.map +1 -0
- package/dist/esm/transports/EimerIpcMainTransport.js +61 -0
- package/dist/esm/transports/EimerIpcMainTransport.js.map +1 -0
- package/dist/esm/transports/EimerIpcRendererTransport.js +60 -0
- package/dist/esm/transports/EimerIpcRendererTransport.js.map +1 -0
- package/dist/esm/transports/EimerMessagePortTransport.js +52 -0
- package/dist/esm/transports/EimerMessagePortTransport.js.map +1 -0
- package/dist/esm/transports/EimerMockTransport.js +56 -0
- package/dist/esm/transports/EimerMockTransport.js.map +1 -0
- package/dist/esm/transports/EimerWorkerThreadTransport.js +12 -0
- package/dist/esm/transports/EimerWorkerThreadTransport.js.map +1 -0
- package/dist/esm/transports/index.js +7 -0
- package/dist/esm/transports/index.js.map +1 -0
- package/package.json +57 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright © 2025 Jan Hapke <https://janhapke.com>
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
|
+
of this software and associated documentation files (the “Software”), to deal
|
|
8
|
+
in the Software without restriction, including without limitation the rights
|
|
9
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
10
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
11
|
+
furnished to do so, subject to the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be included in
|
|
14
|
+
all copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
17
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
18
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
19
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
20
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
21
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
22
|
+
THE SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
<p align="center"><img src="eimer.png" alt="eimer logo" width="128"/></p>
|
|
2
|
+
|
|
3
|
+
# eimer.js
|
|
4
|
+
eimer.js (**E**lectron **I**nterprocess **ME**ssage **R**outer) is an inter-process communication (IPC) library for [electron.js](https://www.electronjs.org/) applications, which greatly reduces the amount of boilerplate code needed to interact between different processes.
|
|
5
|
+
|
|
6
|
+
It is written in [TypeScript](https://www.typescriptlang.org/) and comes with minimal dependencies. It has been developed for *modern* versions of Electron.js (>= 28).
|
|
7
|
+
|
|
8
|
+
⚠️ This library is in pre-beta stage and not yet production ready ⚠️
|
|
9
|
+
|
|
10
|
+
## Table of Contents
|
|
11
|
+
- [What problem(s) does it solve?](#what-problems-does-it-solve)
|
|
12
|
+
- [Features](#features)
|
|
13
|
+
- [Getting Started](#getting-started)
|
|
14
|
+
- [Install eimer.js](#install-eimerjs)
|
|
15
|
+
- [Add eimer.js to the Main Process](#add-eimerjs-to-the-main-process)
|
|
16
|
+
- [Add eimer.js to the Preload Script](#add-eimerjs-to-the-preload-script)
|
|
17
|
+
- [Add eimer.js to the Browser Window](#add-eimerjs-to-the-browser-window)
|
|
18
|
+
- [Build Process Considerations](#build-process-considerations)
|
|
19
|
+
- [Limitations](#limitations)
|
|
20
|
+
- [Authors](#authors)
|
|
21
|
+
- [License](#license)
|
|
22
|
+
|
|
23
|
+
## What problem(s) does it solve?
|
|
24
|
+
Even simple Electron applications are naturally [split into two different processes](https://www.electronjs.org/docs/latest/tutorial/process-model) (main and renderer), which have to be linked through a "preload script". Exchanging data and calling functions across these process boundaries is already non-trivial and the [interfaces provided by Electron](https://www.electronjs.org/docs/latest/tutorial/ipc) make it difficult to keep a growing code base maintainable.
|
|
25
|
+
|
|
26
|
+
As applications grow in functionality and complexity, even more processes become involved - [multiple windows](https://www.electronjs.org/docs/latest/api/base-window) on the rendering side, each potentially with [web workers](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API) or iframes and the main process can start [worker threads](https://nodejs.org/api/worker_threads.html) or spawn [utility processes](https://www.electronjs.org/docs/latest/api/utility-process) which themselves can spawn more processes and threads.
|
|
27
|
+
|
|
28
|
+
All of the different process-like concepts in Electron have slightly different APIs for inter-process communication and while [MessagePorts](https://www.electronjs.org/docs/latest/tutorial/message-ports) can be used to unify these concepts, even these are limited to point-to-point communication between at most *two* processes at a time.
|
|
29
|
+
|
|
30
|
+
## Features
|
|
31
|
+
* **Transports** unify different IPC APIs under a single, common interface
|
|
32
|
+
* ipcMain, ipcRenderer, MessagePort, window.postMessage, node:worker_threads
|
|
33
|
+
* **Message Bus** transparently forwards IPC messages across *all* connected processes
|
|
34
|
+
* **Publish/Subscribe** pattern to broadcast and listen to events across processes
|
|
35
|
+
* **Remote Procedure Call (RPC)** pattern to invoke methods in different processes with a promise-based interface
|
|
36
|
+
|
|
37
|
+
## Getting Started
|
|
38
|
+
We'll assume that you already have an Electron.js project that is written in TypeScript and it can be compiled / started.
|
|
39
|
+
|
|
40
|
+
If not, check out the [examples](./examples) directory! It also contains examples that show how to implement a [basic counter](./examples/basic-counter/) with RPC and publish/subscribe and how to extend that to [multiple windows](./examples/multi-window/) or [worker threads](./examples/worker-thread/).
|
|
41
|
+
|
|
42
|
+
### Install eimer.js
|
|
43
|
+
```shell
|
|
44
|
+
npm install eimer
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Note that the following examples have been stripped down for brevity. Add best practices and coding style on your own. Also, you can find full source code, including build configurations, in the [examples](./examples) directory.
|
|
48
|
+
|
|
49
|
+
### Add eimer.js to the *Main Process*
|
|
50
|
+
The Main Process sets up an instance of eimer.js which uses Electron's [ipcMain](https://www.electronjs.org/docs/latest/api/ipc-main) to communicate with the renderer process. It also registers a simple "Hello World" RPC Handler. Every instance of Eimer has a unique "node id", which is passed to its constructor.
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
import { app, BrowserWindow, ipcMain } from 'electron';
|
|
54
|
+
import { Eimer, EimerIpcMainTransport } from 'eimer';
|
|
55
|
+
|
|
56
|
+
const eimer = new Eimer('main');
|
|
57
|
+
eimer.registerRpcHandler('hello', async () => 'world');
|
|
58
|
+
|
|
59
|
+
app.whenReady().then(() => {
|
|
60
|
+
const mainWindow = new BrowserWindow({
|
|
61
|
+
width: 800, height: 600, webPreferences: { preload: __dirname + '/preload.js' }
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
eimer.connect(new EimerIpcMainTransport(ipcMain, mainWindow.webContents));
|
|
65
|
+
|
|
66
|
+
mainWindow.loadFile('index.html');
|
|
67
|
+
mainWindow.webContents.openDevTools();
|
|
68
|
+
|
|
69
|
+
app.on('window-all-closed', () => { app.quit() });
|
|
70
|
+
});
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Add eimer.js to the *Preload Script*
|
|
74
|
+
The purpose of the [Preload Script](https://www.electronjs.org/docs/latest/tutorial/tutorial-preload) is to set up communication between the main process and the "browser" window, without exposing too many APIs of the main process in the browser context.
|
|
75
|
+
|
|
76
|
+
We set up another instance of eimer.js in the preload script, which simply forwards messages. It uses Electron's [ipcRenderer](https://www.electronjs.org/docs/latest/api/ipc-renderer) to communicate with the main process and [window.postMessage](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) to communicate with the browser window.
|
|
77
|
+
```typescript
|
|
78
|
+
import { ipcRenderer } from 'electron';
|
|
79
|
+
import { Eimer, EimerIpcRendererTransport, EimerBrowserTransport } from 'eimer';
|
|
80
|
+
|
|
81
|
+
const eimer = new Eimer('preload');
|
|
82
|
+
eimer.connect(new EimerIpcRendererTransport(ipcRenderer));
|
|
83
|
+
eimer.connect(new EimerBrowserTransport(window, { targetOrigin: '*' }));
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Add eimer.js to the *Browser Window*
|
|
87
|
+
The Browser Window sets up an instance of eimer.js, which uses [window.postMessage](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) to communicate with the preload script.
|
|
88
|
+
```typescript
|
|
89
|
+
import { Eimer, EimerBrowserTransport } from 'eimer';
|
|
90
|
+
|
|
91
|
+
const eimer = new Eimer('renderer');
|
|
92
|
+
eimer.connect(new EimerBrowserTransport(window));
|
|
93
|
+
|
|
94
|
+
eimer.callRpc<string>('hello').then(value => { console.log('hello ' + value) });
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Build Process Considerations
|
|
98
|
+
* The Preload Script as well as the Renderer / Browser Code run inside separate browser environments and need to be separately compiled and bundled with the eimer.js library.
|
|
99
|
+
* This is not specific to eimer.js but a general pitfall of Electron Applications
|
|
100
|
+
* You can add extra build scripts to the `package.json` that rely on esbuild (`npm install esbuild`)
|
|
101
|
+
```json
|
|
102
|
+
"scripts": {
|
|
103
|
+
"build": "tsc && npm run build:preload && npm run build:renderer",
|
|
104
|
+
"build:preload": "esbuild src/preload.ts --bundle --outfile=dist/preload.js --external:electron",
|
|
105
|
+
"build:renderer": "esbuild src/renderer.ts --bundle --outfile=dist/renderer.js",
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
* Be sure to call the `npm run build:preload` and the `npm run build:renderer` scripts in your build process!
|
|
109
|
+
* Additional options for esbuild (build:preload and build:renderer) that could be useful
|
|
110
|
+
* `--platform=browser`
|
|
111
|
+
* `--target=es2020`
|
|
112
|
+
* `--format=cjs`
|
|
113
|
+
* Check out the [examples](./examples) directory for complete projects including build configurations.
|
|
114
|
+
|
|
115
|
+
## Limitations
|
|
116
|
+
This library is in pre-beta stage.
|
|
117
|
+
|
|
118
|
+
Existing functionality mostly works and is well tested. However, performance is not optimized at all
|
|
119
|
+
(for example, all messages are broadcast to all connected processes, the ids of all messages ever sent
|
|
120
|
+
is kept in memory indefinitely) and features are limited (security and extensibility need improvement).
|
|
121
|
+
|
|
122
|
+
Also the documentation is lacking.
|
|
123
|
+
|
|
124
|
+
Therefore, this library cannot be considered ready for production use just yet.
|
|
125
|
+
|
|
126
|
+
## Authors
|
|
127
|
+
* [Jan Hapke](https://janhapke.com)
|
|
128
|
+
|
|
129
|
+
## License
|
|
130
|
+
[MIT](LICENSE)
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import type { EimerDependencies } from './EimerDependencies';
|
|
2
|
+
import type { EimerOptions } from './EimerOptions';
|
|
3
|
+
import type { NodeId } from './NodeId';
|
|
4
|
+
import type { PayloadHandler } from './PayloadHandler';
|
|
5
|
+
import type { RpcHandler } from './RpcHandler';
|
|
6
|
+
import type { RpcMethod } from './RpcMethod';
|
|
7
|
+
import type { Topic } from './Topic';
|
|
8
|
+
import type { Transport } from './Transport';
|
|
9
|
+
export interface EimerInterface {
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Eimer main class
|
|
13
|
+
* This class represents an instance of a "node" on the Eimer "network".
|
|
14
|
+
* It encapsulates all user-facing functionality in a single class.
|
|
15
|
+
* Allows connecting one or more transports.
|
|
16
|
+
* Provides Publish/Subscribe and remote procedure call patterns.
|
|
17
|
+
*
|
|
18
|
+
* To use it, create an instance with a unique node id and connect a transport
|
|
19
|
+
* After that, publish/subscribe and RPC can be used.
|
|
20
|
+
*/
|
|
21
|
+
export declare class Eimer implements EimerInterface {
|
|
22
|
+
private readonly nodeId;
|
|
23
|
+
private readonly idGenerator;
|
|
24
|
+
private readonly messageBus;
|
|
25
|
+
private readonly rpcManager;
|
|
26
|
+
private readonly logger;
|
|
27
|
+
private handlerMap;
|
|
28
|
+
/**
|
|
29
|
+
*
|
|
30
|
+
* @param nodeId id of the node this instance belongs to. should be unique across all instances
|
|
31
|
+
* @param options
|
|
32
|
+
* @param dependencies optionally inject dependencies
|
|
33
|
+
*/
|
|
34
|
+
constructor(nodeId: NodeId, options?: EimerOptions, dependencies?: EimerDependencies);
|
|
35
|
+
/**
|
|
36
|
+
* Connect this Eimer instance to a `Transport`
|
|
37
|
+
* @param transport
|
|
38
|
+
*/
|
|
39
|
+
connect(transport: Transport): void;
|
|
40
|
+
/**
|
|
41
|
+
* Disconnect from a `Transport`
|
|
42
|
+
* @param transport
|
|
43
|
+
*/
|
|
44
|
+
disconnect(transport: Transport): void;
|
|
45
|
+
/**
|
|
46
|
+
* Call an RPC method
|
|
47
|
+
* Will time out if no handler exists or handler does not respond
|
|
48
|
+
* Will throw on errors from handler
|
|
49
|
+
* @param method name of method / rpc handler
|
|
50
|
+
* @param params optional params object
|
|
51
|
+
* @param timeout override timeout from constructor options for this single call
|
|
52
|
+
* @returns result from invoked handler
|
|
53
|
+
*/
|
|
54
|
+
callRpc<T>(method: RpcMethod, params?: unknown, timeout?: number): Promise<T>;
|
|
55
|
+
/**
|
|
56
|
+
* Register an RPC handler
|
|
57
|
+
* Will be called if callRpc is called on any connected Eimer instance
|
|
58
|
+
* If there is already a registered handler, it will be replaced
|
|
59
|
+
* @param method name of method / rpc handler
|
|
60
|
+
* @param handler async function to be invoked
|
|
61
|
+
*/
|
|
62
|
+
registerRpcHandler(method: RpcMethod, handler: RpcHandler): void;
|
|
63
|
+
/**
|
|
64
|
+
* Unregister an RPC handler
|
|
65
|
+
* @param method name of method / rpc handler
|
|
66
|
+
*/
|
|
67
|
+
unregisterRpcHandler(method: RpcMethod): void;
|
|
68
|
+
/**
|
|
69
|
+
* Publish a payload to a topic
|
|
70
|
+
* Will send payload to all subscribers on the topic
|
|
71
|
+
* @param topic name of topic - subscribers can subscribe to it
|
|
72
|
+
* @param payload payload will be sent to subscribers
|
|
73
|
+
*/
|
|
74
|
+
publish(topic: Topic, payload?: unknown): void;
|
|
75
|
+
/**
|
|
76
|
+
* Subscribe a handler function to a topic
|
|
77
|
+
* The handler function will be called with the payload everytime a message is published
|
|
78
|
+
* @param topic name of topic
|
|
79
|
+
* @param payloadHandler handler function
|
|
80
|
+
* @returns a function that can be called to unsubscribe the handler from the topic
|
|
81
|
+
*/
|
|
82
|
+
subscribe(topic: Topic, payloadHandler: PayloadHandler): () => void;
|
|
83
|
+
/**
|
|
84
|
+
* Unsubscribe a handler function from a topic
|
|
85
|
+
* This has the same effect as calling the unsubscriber function that was returned from subscribe
|
|
86
|
+
* @param topic name of topic
|
|
87
|
+
* @param payloadHandler handler function (must be exact same variable that was used to subscribe)
|
|
88
|
+
*/
|
|
89
|
+
unsubscribe(topic: Topic, payloadHandler: PayloadHandler): void;
|
|
90
|
+
/**
|
|
91
|
+
* Unsubscribe all handlers from a topic
|
|
92
|
+
* @param topic name of topic
|
|
93
|
+
*/
|
|
94
|
+
unsubscribeAll(topic: Topic): void;
|
|
95
|
+
/**
|
|
96
|
+
* Shutdown this Eimer instance
|
|
97
|
+
* Will reject all RPC requests that are still waiting for a response
|
|
98
|
+
* and shutdown the MessageBus
|
|
99
|
+
*/
|
|
100
|
+
shutdown(): void;
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=Eimer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Eimer.d.ts","sourceRoot":"","sources":["../../../src/eimer/Eimer.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAKnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,WAAW,cAAc;CAAG;AAElC;;;;;;;;;GASG;AACH,qBAAa,KAAM,YAAW,cAAc;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAGhC,OAAO,CAAC,UAAU,CAA8D;IAEhF;;;;;OAKG;gBACS,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,EAAE,YAAY,CAAC,EAAE,iBAAiB;IAQpF;;;OAGG;IACH,OAAO,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAKnC;;;OAGG;IACH,UAAU,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAKtC;;;;;;;;OAQG;IACG,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAKnF;;;;;;OAMG;IACH,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,GAAG,IAAI;IAKhE;;;OAGG;IACH,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI;IAK7C;;;;;OAKG;IACH,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI;IAY9C;;;;;;OAMG;IACH,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,cAAc,GAAG,MAAM,IAAI;IA4BnE;;;;;OAKG;IACH,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,cAAc,GAAG,IAAI;IAgB/D;;;OAGG;IACH,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAalC;;;;OAIG;IACH,QAAQ,IAAI,IAAI;CAKnB"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Eimer = void 0;
|
|
4
|
+
const EimerMessage_1 = require("./EimerMessage");
|
|
5
|
+
const LogLevel_1 = require("./LogLevel");
|
|
6
|
+
const EimerIdGenerator_1 = require("../id-generator/EimerIdGenerator");
|
|
7
|
+
const EimerLogger_1 = require("../logger/EimerLogger");
|
|
8
|
+
const EimerMessageBus_1 = require("../message-bus/EimerMessageBus");
|
|
9
|
+
const EimerRpcManager_1 = require("../rpc/EimerRpcManager");
|
|
10
|
+
/**
|
|
11
|
+
* Eimer main class
|
|
12
|
+
* This class represents an instance of a "node" on the Eimer "network".
|
|
13
|
+
* It encapsulates all user-facing functionality in a single class.
|
|
14
|
+
* Allows connecting one or more transports.
|
|
15
|
+
* Provides Publish/Subscribe and remote procedure call patterns.
|
|
16
|
+
*
|
|
17
|
+
* To use it, create an instance with a unique node id and connect a transport
|
|
18
|
+
* After that, publish/subscribe and RPC can be used.
|
|
19
|
+
*/
|
|
20
|
+
class Eimer {
|
|
21
|
+
/**
|
|
22
|
+
*
|
|
23
|
+
* @param nodeId id of the node this instance belongs to. should be unique across all instances
|
|
24
|
+
* @param options
|
|
25
|
+
* @param dependencies optionally inject dependencies
|
|
26
|
+
*/
|
|
27
|
+
constructor(nodeId, options, dependencies) {
|
|
28
|
+
// Map to track user handler to wrapped handler for correct unsubscribe
|
|
29
|
+
// Nested map: topic -> payloadHandler -> messageHandler
|
|
30
|
+
this.handlerMap = new Map();
|
|
31
|
+
this.nodeId = nodeId;
|
|
32
|
+
this.idGenerator = dependencies?.idGenerator ?? new EimerIdGenerator_1.EimerIdGenerator();
|
|
33
|
+
this.logger = dependencies?.logger ?? new EimerLogger_1.EimerLogger(options?.logLevel ?? LogLevel_1.LogLevel.DEBUG, options?.logModuleName ?? 'Eimer', this.nodeId);
|
|
34
|
+
this.messageBus = dependencies?.messageBus ?? new EimerMessageBus_1.EimerMessageBus(this.nodeId, options);
|
|
35
|
+
this.rpcManager = dependencies?.rpcManager ?? new EimerRpcManager_1.EimerRpcManager(this.nodeId, this.messageBus, options);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Connect this Eimer instance to a `Transport`
|
|
39
|
+
* @param transport
|
|
40
|
+
*/
|
|
41
|
+
connect(transport) {
|
|
42
|
+
this.logger.debug('Connecting Transport', { transport });
|
|
43
|
+
this.messageBus.connectTransport(transport);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Disconnect from a `Transport`
|
|
47
|
+
* @param transport
|
|
48
|
+
*/
|
|
49
|
+
disconnect(transport) {
|
|
50
|
+
this.logger.debug('Disconnecting Transport', { transport });
|
|
51
|
+
this.messageBus.disconnectTransport(transport);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Call an RPC method
|
|
55
|
+
* Will time out if no handler exists or handler does not respond
|
|
56
|
+
* Will throw on errors from handler
|
|
57
|
+
* @param method name of method / rpc handler
|
|
58
|
+
* @param params optional params object
|
|
59
|
+
* @param timeout override timeout from constructor options for this single call
|
|
60
|
+
* @returns result from invoked handler
|
|
61
|
+
*/
|
|
62
|
+
async callRpc(method, params, timeout) {
|
|
63
|
+
this.logger.debug('Making RPC call', { method, params });
|
|
64
|
+
return this.rpcManager.call(method, params, timeout);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Register an RPC handler
|
|
68
|
+
* Will be called if callRpc is called on any connected Eimer instance
|
|
69
|
+
* If there is already a registered handler, it will be replaced
|
|
70
|
+
* @param method name of method / rpc handler
|
|
71
|
+
* @param handler async function to be invoked
|
|
72
|
+
*/
|
|
73
|
+
registerRpcHandler(method, handler) {
|
|
74
|
+
this.logger.debug('Registering RPC handler for method', { method });
|
|
75
|
+
this.rpcManager.registerHandler(method, handler);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Unregister an RPC handler
|
|
79
|
+
* @param method name of method / rpc handler
|
|
80
|
+
*/
|
|
81
|
+
unregisterRpcHandler(method) {
|
|
82
|
+
this.logger.debug('Unregistering RPC handler for method', { method });
|
|
83
|
+
this.rpcManager.unregisterHandler(method);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Publish a payload to a topic
|
|
87
|
+
* Will send payload to all subscribers on the topic
|
|
88
|
+
* @param topic name of topic - subscribers can subscribe to it
|
|
89
|
+
* @param payload payload will be sent to subscribers
|
|
90
|
+
*/
|
|
91
|
+
publish(topic, payload) {
|
|
92
|
+
this.logger.debug('Publishing message', { topic });
|
|
93
|
+
this.messageBus.publish(new EimerMessage_1.EimerMessage(this.idGenerator.generateId(), this.nodeId, topic, payload));
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Subscribe a handler function to a topic
|
|
97
|
+
* The handler function will be called with the payload everytime a message is published
|
|
98
|
+
* @param topic name of topic
|
|
99
|
+
* @param payloadHandler handler function
|
|
100
|
+
* @returns a function that can be called to unsubscribe the handler from the topic
|
|
101
|
+
*/
|
|
102
|
+
subscribe(topic, payloadHandler) {
|
|
103
|
+
this.logger.debug('Subscribing to topic', { topic });
|
|
104
|
+
const messageHandler = (message) => {
|
|
105
|
+
payloadHandler(message.payload);
|
|
106
|
+
};
|
|
107
|
+
// Get or create the topic's handler map
|
|
108
|
+
let topicHandlerMap = this.handlerMap.get(topic);
|
|
109
|
+
if (!topicHandlerMap) {
|
|
110
|
+
topicHandlerMap = new Map();
|
|
111
|
+
this.handlerMap.set(topic, topicHandlerMap);
|
|
112
|
+
}
|
|
113
|
+
topicHandlerMap.set(payloadHandler, messageHandler);
|
|
114
|
+
const unsubscribe = this.messageBus.subscribe(topic, messageHandler);
|
|
115
|
+
return () => {
|
|
116
|
+
unsubscribe();
|
|
117
|
+
const topicMap = this.handlerMap.get(topic);
|
|
118
|
+
if (topicMap) {
|
|
119
|
+
topicMap.delete(payloadHandler);
|
|
120
|
+
// Clean up empty topic maps
|
|
121
|
+
if (topicMap.size === 0) {
|
|
122
|
+
this.handlerMap.delete(topic);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Unsubscribe a handler function from a topic
|
|
129
|
+
* This has the same effect as calling the unsubscriber function that was returned from subscribe
|
|
130
|
+
* @param topic name of topic
|
|
131
|
+
* @param payloadHandler handler function (must be exact same variable that was used to subscribe)
|
|
132
|
+
*/
|
|
133
|
+
unsubscribe(topic, payloadHandler) {
|
|
134
|
+
this.logger.debug('Unsubscribing from topic', { topic });
|
|
135
|
+
const topicHandlerMap = this.handlerMap.get(topic);
|
|
136
|
+
if (topicHandlerMap) {
|
|
137
|
+
const messageHandler = topicHandlerMap.get(payloadHandler);
|
|
138
|
+
if (messageHandler) {
|
|
139
|
+
this.messageBus.unsubscribe(topic, messageHandler);
|
|
140
|
+
topicHandlerMap.delete(payloadHandler);
|
|
141
|
+
// Clean up empty topic maps
|
|
142
|
+
if (topicHandlerMap.size === 0) {
|
|
143
|
+
this.handlerMap.delete(topic);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Unsubscribe all handlers from a topic
|
|
150
|
+
* @param topic name of topic
|
|
151
|
+
*/
|
|
152
|
+
unsubscribeAll(topic) {
|
|
153
|
+
this.logger.debug('Unsubscribing all handlers from topic', { topic });
|
|
154
|
+
const topicHandlerMap = this.handlerMap.get(topic);
|
|
155
|
+
if (topicHandlerMap) {
|
|
156
|
+
// Unsubscribe all message handlers from the message bus
|
|
157
|
+
for (const messageHandler of topicHandlerMap.values()) {
|
|
158
|
+
this.messageBus.unsubscribe(topic, messageHandler);
|
|
159
|
+
}
|
|
160
|
+
// Remove the topic from the handler map
|
|
161
|
+
this.handlerMap.delete(topic);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Shutdown this Eimer instance
|
|
166
|
+
* Will reject all RPC requests that are still waiting for a response
|
|
167
|
+
* and shutdown the MessageBus
|
|
168
|
+
*/
|
|
169
|
+
shutdown() {
|
|
170
|
+
this.rpcManager.shutdown();
|
|
171
|
+
this.messageBus.shutdown();
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
exports.Eimer = Eimer;
|
|
175
|
+
//# sourceMappingURL=Eimer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Eimer.js","sourceRoot":"","sources":["../../../src/eimer/Eimer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { IdGenerator } from "./IdGenerator";
|
|
2
|
+
import type { Logger } from "./Logger";
|
|
3
|
+
import type { MessageBus } from "./MessageBus";
|
|
4
|
+
import type { RpcManager } from "./RpcManager";
|
|
5
|
+
/**
|
|
6
|
+
* Base Interface for dependencies injected into constructors
|
|
7
|
+
*
|
|
8
|
+
* Extensions of this interface are used by Eimer classes
|
|
9
|
+
* to allow constructor-based dependency injection.
|
|
10
|
+
*/
|
|
11
|
+
export interface EimerDependencies {
|
|
12
|
+
idGenerator?: IdGenerator;
|
|
13
|
+
messageBus?: MessageBus;
|
|
14
|
+
rpcManager?: RpcManager;
|
|
15
|
+
logger?: Logger;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=EimerDependencies.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EimerDependencies.d.ts","sourceRoot":"","sources":["../../../src/eimer/EimerDependencies.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAC9B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EimerDependencies.js","sourceRoot":"","sources":["../../../src/eimer/EimerDependencies.ts"],"names":[],"mappings":";;AAgBC,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { MagicMessageMarker } from './MagicMessageMarker';
|
|
2
|
+
import type { MessageId } from './MessageId';
|
|
3
|
+
import type { NodeId } from './NodeId';
|
|
4
|
+
import type { StructuredCloneable } from './StructuredCloneable';
|
|
5
|
+
import type { Topic } from './Topic';
|
|
6
|
+
/**
|
|
7
|
+
* Base class for Eimer Messages
|
|
8
|
+
*/
|
|
9
|
+
export declare class EimerMessage implements StructuredCloneable {
|
|
10
|
+
readonly marker: MagicMessageMarker;
|
|
11
|
+
readonly id: MessageId;
|
|
12
|
+
readonly from: NodeId;
|
|
13
|
+
readonly topic: Topic;
|
|
14
|
+
readonly payload?: unknown;
|
|
15
|
+
/**
|
|
16
|
+
*
|
|
17
|
+
* @param id globally unique id of this message - for example generated by an `IdGenerator`
|
|
18
|
+
* @param from nodeId that sent this message
|
|
19
|
+
* @param topic topic this message was sent on
|
|
20
|
+
* @param payload optional payload
|
|
21
|
+
*/
|
|
22
|
+
constructor(id: MessageId, from: NodeId, topic: Topic, payload?: unknown);
|
|
23
|
+
/**
|
|
24
|
+
* User-defined Type Guard to ensure the message is an Eimer Request
|
|
25
|
+
* Similar to `Array.isArray()`, this static method can be used to check if an object is an `EimerMessage`
|
|
26
|
+
* @param message the message to test
|
|
27
|
+
* @returns true if the message looks like an Eimer Message
|
|
28
|
+
*/
|
|
29
|
+
static isEimerMessage(message: any): message is EimerMessage;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=EimerMessage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EimerMessage.d.ts","sourceRoot":"","sources":["../../../src/eimer/EimerMessage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAErC;;GAEG;AACH,qBAAa,YAAa,YAAW,mBAAmB;IAEpD,SAAgB,MAAM,EAAE,kBAAkB,CAAU;IACpD,SAAgB,EAAE,EAAE,SAAS,CAAC;IAC9B,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,SAAgB,KAAK,EAAE,KAAK,CAAC;IAC7B,SAAgB,OAAO,CAAC,EAAE,OAAO,CAAC;IAElC;;;;;;OAMG;gBAEC,EAAE,EAAE,SAAS,EACb,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,KAAK,EACZ,OAAO,CAAC,EAAE,OAAO;IAQrB;;;;;OAKG;IACH,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,IAAI,YAAY;CAY/D"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EimerMessage = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Base class for Eimer Messages
|
|
6
|
+
*/
|
|
7
|
+
class EimerMessage {
|
|
8
|
+
/**
|
|
9
|
+
*
|
|
10
|
+
* @param id globally unique id of this message - for example generated by an `IdGenerator`
|
|
11
|
+
* @param from nodeId that sent this message
|
|
12
|
+
* @param topic topic this message was sent on
|
|
13
|
+
* @param payload optional payload
|
|
14
|
+
*/
|
|
15
|
+
constructor(id, from, topic, payload) {
|
|
16
|
+
this.marker = 'EM.1';
|
|
17
|
+
this.id = id;
|
|
18
|
+
this.from = from;
|
|
19
|
+
this.topic = topic;
|
|
20
|
+
this.payload = payload;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* User-defined Type Guard to ensure the message is an Eimer Request
|
|
24
|
+
* Similar to `Array.isArray()`, this static method can be used to check if an object is an `EimerMessage`
|
|
25
|
+
* @param message the message to test
|
|
26
|
+
* @returns true if the message looks like an Eimer Message
|
|
27
|
+
*/
|
|
28
|
+
static isEimerMessage(message) {
|
|
29
|
+
if (message === null || message === undefined || typeof message !== 'object') {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
if (!('marker' in message) || !('id' in message) || !('from' in message) || !('topic' in message)) {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
if (message.marker != 'EM.1') {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
exports.EimerMessage = EimerMessage;
|
|
42
|
+
//# sourceMappingURL=EimerMessage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EimerMessage.js","sourceRoot":"","sources":["../../../src/eimer/EimerMessage.ts"],"names":[],"mappings":";;;AAMA;;GAEG;AACH,MAAa,YAAY;IAQrB;;;;;;OAMG;IACH,YACI,EAAa,EACb,IAAY,EACZ,KAAY,EACZ,OAAiB;QAjBL,WAAM,GAAuB,MAAM,CAAC;QAmBhD,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,cAAc,CAAC,OAAY;QAC9B,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC3E,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,IAAI,CAAC,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,EAAE,CAAC;YAChG,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,IAAI,MAAM,EAAE,CAAC;YAC3B,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AA7CD,oCA6CC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { LogLevel } from "./LogLevel";
|
|
2
|
+
/**
|
|
3
|
+
* Base Interface for options injected into constructors
|
|
4
|
+
*
|
|
5
|
+
* Extensions of this interface are used by Eimer classes
|
|
6
|
+
* to allow passing options to constructors.
|
|
7
|
+
*/
|
|
8
|
+
export interface EimerOptions {
|
|
9
|
+
logModuleName?: string;
|
|
10
|
+
logLevel?: LogLevel;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=EimerOptions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EimerOptions.d.ts","sourceRoot":"","sources":["../../../src/eimer/EimerOptions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACvB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EimerOptions.js","sourceRoot":"","sources":["../../../src/eimer/EimerOptions.ts"],"names":[],"mappings":";;AAWC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { MessageId } from "./MessageId";
|
|
2
|
+
/**
|
|
3
|
+
* IdGenerator Interface
|
|
4
|
+
*
|
|
5
|
+
* Every message in an Eimer "network" needs a unique id.
|
|
6
|
+
*
|
|
7
|
+
* An `IdGenerator` can generate unique message ids.
|
|
8
|
+
*/
|
|
9
|
+
export interface IdGenerator {
|
|
10
|
+
generateId: () => MessageId;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=IdGenerator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IdGenerator.d.ts","sourceRoot":"","sources":["../../../src/eimer/IdGenerator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IACxB,UAAU,EAAE,MAAM,SAAS,CAAC;CAC/B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IdGenerator.js","sourceRoot":"","sources":["../../../src/eimer/IdGenerator.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Log Levels
|
|
3
|
+
*
|
|
4
|
+
* Defines Log Levels and their order.
|
|
5
|
+
*
|
|
6
|
+
* Based on the log levels provided by `console.log`
|
|
7
|
+
*/
|
|
8
|
+
export declare enum LogLevel {
|
|
9
|
+
TRACE = 2,
|
|
10
|
+
DEBUG = 4,
|
|
11
|
+
INFO = 8,
|
|
12
|
+
WARNING = 16,
|
|
13
|
+
ERROR = 32,
|
|
14
|
+
NONE = 99999
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=LogLevel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LogLevel.d.ts","sourceRoot":"","sources":["../../../src/eimer/LogLevel.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,oBAAY,QAAQ;IAChB,KAAK,IAAI;IACT,KAAK,IAAI;IACT,IAAI,IAAI;IACR,OAAO,KAAK;IACZ,KAAK,KAAK;IACV,IAAI,QAAQ;CACf"}
|