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.
Files changed (249) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +130 -0
  3. package/dist/cjs/eimer/Eimer.d.ts +102 -0
  4. package/dist/cjs/eimer/Eimer.d.ts.map +1 -0
  5. package/dist/cjs/eimer/Eimer.js +175 -0
  6. package/dist/cjs/eimer/Eimer.js.map +1 -0
  7. package/dist/cjs/eimer/EimerDependencies.d.ts +17 -0
  8. package/dist/cjs/eimer/EimerDependencies.d.ts.map +1 -0
  9. package/dist/cjs/eimer/EimerDependencies.js +4 -0
  10. package/dist/cjs/eimer/EimerDependencies.js.map +1 -0
  11. package/dist/cjs/eimer/EimerMessage.d.ts +31 -0
  12. package/dist/cjs/eimer/EimerMessage.d.ts.map +1 -0
  13. package/dist/cjs/eimer/EimerMessage.js +42 -0
  14. package/dist/cjs/eimer/EimerMessage.js.map +1 -0
  15. package/dist/cjs/eimer/EimerOptions.d.ts +12 -0
  16. package/dist/cjs/eimer/EimerOptions.d.ts.map +1 -0
  17. package/dist/cjs/eimer/EimerOptions.js +4 -0
  18. package/dist/cjs/eimer/EimerOptions.js.map +1 -0
  19. package/dist/cjs/eimer/IdGenerator.d.ts +12 -0
  20. package/dist/cjs/eimer/IdGenerator.d.ts.map +1 -0
  21. package/dist/cjs/eimer/IdGenerator.js +3 -0
  22. package/dist/cjs/eimer/IdGenerator.js.map +1 -0
  23. package/dist/cjs/eimer/LogLevel.d.ts +16 -0
  24. package/dist/cjs/eimer/LogLevel.d.ts.map +1 -0
  25. package/dist/cjs/eimer/LogLevel.js +21 -0
  26. package/dist/cjs/eimer/LogLevel.js.map +1 -0
  27. package/dist/cjs/eimer/Logger.d.ts +70 -0
  28. package/dist/cjs/eimer/Logger.d.ts.map +1 -0
  29. package/dist/cjs/eimer/Logger.js +3 -0
  30. package/dist/cjs/eimer/Logger.js.map +1 -0
  31. package/dist/cjs/eimer/MagicMessageMarker.d.ts +18 -0
  32. package/dist/cjs/eimer/MagicMessageMarker.d.ts.map +1 -0
  33. package/dist/cjs/eimer/MagicMessageMarker.js +3 -0
  34. package/dist/cjs/eimer/MagicMessageMarker.js.map +1 -0
  35. package/dist/cjs/eimer/MessageBus.d.ts +65 -0
  36. package/dist/cjs/eimer/MessageBus.d.ts.map +1 -0
  37. package/dist/cjs/eimer/MessageBus.js +3 -0
  38. package/dist/cjs/eimer/MessageBus.js.map +1 -0
  39. package/dist/cjs/eimer/MessageHandler.d.ts +14 -0
  40. package/dist/cjs/eimer/MessageHandler.d.ts.map +1 -0
  41. package/dist/cjs/eimer/MessageHandler.js +3 -0
  42. package/dist/cjs/eimer/MessageHandler.js.map +1 -0
  43. package/dist/cjs/eimer/MessageId.d.ts +8 -0
  44. package/dist/cjs/eimer/MessageId.d.ts.map +1 -0
  45. package/dist/cjs/eimer/MessageId.js +3 -0
  46. package/dist/cjs/eimer/MessageId.js.map +1 -0
  47. package/dist/cjs/eimer/NodeId.d.ts +5 -0
  48. package/dist/cjs/eimer/NodeId.d.ts.map +1 -0
  49. package/dist/cjs/eimer/NodeId.js +3 -0
  50. package/dist/cjs/eimer/NodeId.js.map +1 -0
  51. package/dist/cjs/eimer/PayloadHandler.d.ts +7 -0
  52. package/dist/cjs/eimer/PayloadHandler.d.ts.map +1 -0
  53. package/dist/cjs/eimer/PayloadHandler.js +3 -0
  54. package/dist/cjs/eimer/PayloadHandler.js.map +1 -0
  55. package/dist/cjs/eimer/RpcHandler.d.ts +6 -0
  56. package/dist/cjs/eimer/RpcHandler.d.ts.map +1 -0
  57. package/dist/cjs/eimer/RpcHandler.js +3 -0
  58. package/dist/cjs/eimer/RpcHandler.js.map +1 -0
  59. package/dist/cjs/eimer/RpcManager.d.ts +48 -0
  60. package/dist/cjs/eimer/RpcManager.d.ts.map +1 -0
  61. package/dist/cjs/eimer/RpcManager.js +3 -0
  62. package/dist/cjs/eimer/RpcManager.js.map +1 -0
  63. package/dist/cjs/eimer/RpcMethod.d.ts +5 -0
  64. package/dist/cjs/eimer/RpcMethod.d.ts.map +1 -0
  65. package/dist/cjs/eimer/RpcMethod.js +3 -0
  66. package/dist/cjs/eimer/RpcMethod.js.map +1 -0
  67. package/dist/cjs/eimer/StructuredCloneable.d.ts +21 -0
  68. package/dist/cjs/eimer/StructuredCloneable.d.ts.map +1 -0
  69. package/dist/cjs/eimer/StructuredCloneable.js +3 -0
  70. package/dist/cjs/eimer/StructuredCloneable.js.map +1 -0
  71. package/dist/cjs/eimer/Topic.d.ts +5 -0
  72. package/dist/cjs/eimer/Topic.d.ts.map +1 -0
  73. package/dist/cjs/eimer/Topic.js +3 -0
  74. package/dist/cjs/eimer/Topic.js.map +1 -0
  75. package/dist/cjs/eimer/Transport.d.ts +36 -0
  76. package/dist/cjs/eimer/Transport.d.ts.map +1 -0
  77. package/dist/cjs/eimer/Transport.js +3 -0
  78. package/dist/cjs/eimer/Transport.js.map +1 -0
  79. package/dist/cjs/eimer/index.d.ts +20 -0
  80. package/dist/cjs/eimer/index.d.ts.map +1 -0
  81. package/dist/cjs/eimer/index.js +36 -0
  82. package/dist/cjs/eimer/index.js.map +1 -0
  83. package/dist/cjs/id-generator/EimerIdGenerator.d.ts +13 -0
  84. package/dist/cjs/id-generator/EimerIdGenerator.d.ts.map +1 -0
  85. package/dist/cjs/id-generator/EimerIdGenerator.js +17 -0
  86. package/dist/cjs/id-generator/EimerIdGenerator.js.map +1 -0
  87. package/dist/cjs/id-generator/index.d.ts +2 -0
  88. package/dist/cjs/id-generator/index.d.ts.map +1 -0
  89. package/dist/cjs/id-generator/index.js +18 -0
  90. package/dist/cjs/id-generator/index.js.map +1 -0
  91. package/dist/cjs/index.d.ts +7 -0
  92. package/dist/cjs/index.d.ts.map +1 -0
  93. package/dist/cjs/index.js +23 -0
  94. package/dist/cjs/index.js.map +1 -0
  95. package/dist/cjs/logger/EimerLogger.d.ts +28 -0
  96. package/dist/cjs/logger/EimerLogger.d.ts.map +1 -0
  97. package/dist/cjs/logger/EimerLogger.js +68 -0
  98. package/dist/cjs/logger/EimerLogger.js.map +1 -0
  99. package/dist/cjs/logger/index.d.ts +2 -0
  100. package/dist/cjs/logger/index.d.ts.map +1 -0
  101. package/dist/cjs/logger/index.js +18 -0
  102. package/dist/cjs/logger/index.js.map +1 -0
  103. package/dist/cjs/message-bus/EimerMessageBus.d.ts +30 -0
  104. package/dist/cjs/message-bus/EimerMessageBus.d.ts.map +1 -0
  105. package/dist/cjs/message-bus/EimerMessageBus.js +120 -0
  106. package/dist/cjs/message-bus/EimerMessageBus.js.map +1 -0
  107. package/dist/cjs/message-bus/index.d.ts +2 -0
  108. package/dist/cjs/message-bus/index.d.ts.map +1 -0
  109. package/dist/cjs/message-bus/index.js +18 -0
  110. package/dist/cjs/message-bus/index.js.map +1 -0
  111. package/dist/cjs/rpc/EimerRpcManager.d.ts +76 -0
  112. package/dist/cjs/rpc/EimerRpcManager.d.ts.map +1 -0
  113. package/dist/cjs/rpc/EimerRpcManager.js +162 -0
  114. package/dist/cjs/rpc/EimerRpcManager.js.map +1 -0
  115. package/dist/cjs/rpc/EimerRpcRequestMessage.d.ts +28 -0
  116. package/dist/cjs/rpc/EimerRpcRequestMessage.d.ts.map +1 -0
  117. package/dist/cjs/rpc/EimerRpcRequestMessage.js +38 -0
  118. package/dist/cjs/rpc/EimerRpcRequestMessage.js.map +1 -0
  119. package/dist/cjs/rpc/EimerRpcRequestPayload.d.ts +38 -0
  120. package/dist/cjs/rpc/EimerRpcRequestPayload.d.ts.map +1 -0
  121. package/dist/cjs/rpc/EimerRpcRequestPayload.js +33 -0
  122. package/dist/cjs/rpc/EimerRpcRequestPayload.js.map +1 -0
  123. package/dist/cjs/rpc/EimerRpcResponseMessage.d.ts +30 -0
  124. package/dist/cjs/rpc/EimerRpcResponseMessage.d.ts.map +1 -0
  125. package/dist/cjs/rpc/EimerRpcResponseMessage.js +40 -0
  126. package/dist/cjs/rpc/EimerRpcResponseMessage.js.map +1 -0
  127. package/dist/cjs/rpc/EimerRpcResponsePayload.d.ts +30 -0
  128. package/dist/cjs/rpc/EimerRpcResponsePayload.d.ts.map +1 -0
  129. package/dist/cjs/rpc/EimerRpcResponsePayload.js +32 -0
  130. package/dist/cjs/rpc/EimerRpcResponsePayload.js.map +1 -0
  131. package/dist/cjs/rpc/RpcRequestId.d.ts +6 -0
  132. package/dist/cjs/rpc/RpcRequestId.d.ts.map +1 -0
  133. package/dist/cjs/rpc/RpcRequestId.js +3 -0
  134. package/dist/cjs/rpc/RpcRequestId.js.map +1 -0
  135. package/dist/cjs/rpc/index.d.ts +7 -0
  136. package/dist/cjs/rpc/index.d.ts.map +1 -0
  137. package/dist/cjs/rpc/index.js +23 -0
  138. package/dist/cjs/rpc/index.js.map +1 -0
  139. package/dist/cjs/transports/EimerBrowserTransport.d.ts +39 -0
  140. package/dist/cjs/transports/EimerBrowserTransport.d.ts.map +1 -0
  141. package/dist/cjs/transports/EimerBrowserTransport.js +74 -0
  142. package/dist/cjs/transports/EimerBrowserTransport.js.map +1 -0
  143. package/dist/cjs/transports/EimerIpcMainTransport.d.ts +38 -0
  144. package/dist/cjs/transports/EimerIpcMainTransport.d.ts.map +1 -0
  145. package/dist/cjs/transports/EimerIpcMainTransport.js +65 -0
  146. package/dist/cjs/transports/EimerIpcMainTransport.js.map +1 -0
  147. package/dist/cjs/transports/EimerIpcRendererTransport.d.ts +43 -0
  148. package/dist/cjs/transports/EimerIpcRendererTransport.d.ts.map +1 -0
  149. package/dist/cjs/transports/EimerIpcRendererTransport.js +64 -0
  150. package/dist/cjs/transports/EimerIpcRendererTransport.js.map +1 -0
  151. package/dist/cjs/transports/EimerMessagePortTransport.d.ts +40 -0
  152. package/dist/cjs/transports/EimerMessagePortTransport.d.ts.map +1 -0
  153. package/dist/cjs/transports/EimerMessagePortTransport.js +56 -0
  154. package/dist/cjs/transports/EimerMessagePortTransport.js.map +1 -0
  155. package/dist/cjs/transports/EimerMockTransport.d.ts +35 -0
  156. package/dist/cjs/transports/EimerMockTransport.d.ts.map +1 -0
  157. package/dist/cjs/transports/EimerMockTransport.js +60 -0
  158. package/dist/cjs/transports/EimerMockTransport.js.map +1 -0
  159. package/dist/cjs/transports/EimerWorkerThreadTransport.d.ts +15 -0
  160. package/dist/cjs/transports/EimerWorkerThreadTransport.d.ts.map +1 -0
  161. package/dist/cjs/transports/EimerWorkerThreadTransport.js +16 -0
  162. package/dist/cjs/transports/EimerWorkerThreadTransport.js.map +1 -0
  163. package/dist/cjs/transports/index.d.ts +7 -0
  164. package/dist/cjs/transports/index.d.ts.map +1 -0
  165. package/dist/cjs/transports/index.js +23 -0
  166. package/dist/cjs/transports/index.js.map +1 -0
  167. package/dist/esm/eimer/Eimer.js +171 -0
  168. package/dist/esm/eimer/Eimer.js.map +1 -0
  169. package/dist/esm/eimer/EimerDependencies.js +3 -0
  170. package/dist/esm/eimer/EimerDependencies.js.map +1 -0
  171. package/dist/esm/eimer/EimerMessage.js +38 -0
  172. package/dist/esm/eimer/EimerMessage.js.map +1 -0
  173. package/dist/esm/eimer/EimerOptions.js +3 -0
  174. package/dist/esm/eimer/EimerOptions.js.map +1 -0
  175. package/dist/esm/eimer/IdGenerator.js +2 -0
  176. package/dist/esm/eimer/IdGenerator.js.map +1 -0
  177. package/dist/esm/eimer/LogLevel.js +18 -0
  178. package/dist/esm/eimer/LogLevel.js.map +1 -0
  179. package/dist/esm/eimer/Logger.js +2 -0
  180. package/dist/esm/eimer/Logger.js.map +1 -0
  181. package/dist/esm/eimer/MagicMessageMarker.js +2 -0
  182. package/dist/esm/eimer/MagicMessageMarker.js.map +1 -0
  183. package/dist/esm/eimer/MessageBus.js +2 -0
  184. package/dist/esm/eimer/MessageBus.js.map +1 -0
  185. package/dist/esm/eimer/MessageHandler.js +2 -0
  186. package/dist/esm/eimer/MessageHandler.js.map +1 -0
  187. package/dist/esm/eimer/MessageId.js +2 -0
  188. package/dist/esm/eimer/MessageId.js.map +1 -0
  189. package/dist/esm/eimer/NodeId.js +2 -0
  190. package/dist/esm/eimer/NodeId.js.map +1 -0
  191. package/dist/esm/eimer/PayloadHandler.js +2 -0
  192. package/dist/esm/eimer/PayloadHandler.js.map +1 -0
  193. package/dist/esm/eimer/RpcHandler.js +2 -0
  194. package/dist/esm/eimer/RpcHandler.js.map +1 -0
  195. package/dist/esm/eimer/RpcManager.js +2 -0
  196. package/dist/esm/eimer/RpcManager.js.map +1 -0
  197. package/dist/esm/eimer/RpcMethod.js +2 -0
  198. package/dist/esm/eimer/RpcMethod.js.map +1 -0
  199. package/dist/esm/eimer/StructuredCloneable.js +2 -0
  200. package/dist/esm/eimer/StructuredCloneable.js.map +1 -0
  201. package/dist/esm/eimer/Topic.js +2 -0
  202. package/dist/esm/eimer/Topic.js.map +1 -0
  203. package/dist/esm/eimer/Transport.js +2 -0
  204. package/dist/esm/eimer/Transport.js.map +1 -0
  205. package/dist/esm/eimer/index.js +20 -0
  206. package/dist/esm/eimer/index.js.map +1 -0
  207. package/dist/esm/id-generator/EimerIdGenerator.js +13 -0
  208. package/dist/esm/id-generator/EimerIdGenerator.js.map +1 -0
  209. package/dist/esm/id-generator/index.js +2 -0
  210. package/dist/esm/id-generator/index.js.map +1 -0
  211. package/dist/esm/index.js +7 -0
  212. package/dist/esm/index.js.map +1 -0
  213. package/dist/esm/logger/EimerLogger.js +64 -0
  214. package/dist/esm/logger/EimerLogger.js.map +1 -0
  215. package/dist/esm/logger/index.js +2 -0
  216. package/dist/esm/logger/index.js.map +1 -0
  217. package/dist/esm/message-bus/EimerMessageBus.js +116 -0
  218. package/dist/esm/message-bus/EimerMessageBus.js.map +1 -0
  219. package/dist/esm/message-bus/index.js +2 -0
  220. package/dist/esm/message-bus/index.js.map +1 -0
  221. package/dist/esm/rpc/EimerRpcManager.js +158 -0
  222. package/dist/esm/rpc/EimerRpcManager.js.map +1 -0
  223. package/dist/esm/rpc/EimerRpcRequestMessage.js +34 -0
  224. package/dist/esm/rpc/EimerRpcRequestMessage.js.map +1 -0
  225. package/dist/esm/rpc/EimerRpcRequestPayload.js +29 -0
  226. package/dist/esm/rpc/EimerRpcRequestPayload.js.map +1 -0
  227. package/dist/esm/rpc/EimerRpcResponseMessage.js +36 -0
  228. package/dist/esm/rpc/EimerRpcResponseMessage.js.map +1 -0
  229. package/dist/esm/rpc/EimerRpcResponsePayload.js +28 -0
  230. package/dist/esm/rpc/EimerRpcResponsePayload.js.map +1 -0
  231. package/dist/esm/rpc/RpcRequestId.js +2 -0
  232. package/dist/esm/rpc/RpcRequestId.js.map +1 -0
  233. package/dist/esm/rpc/index.js +7 -0
  234. package/dist/esm/rpc/index.js.map +1 -0
  235. package/dist/esm/transports/EimerBrowserTransport.js +70 -0
  236. package/dist/esm/transports/EimerBrowserTransport.js.map +1 -0
  237. package/dist/esm/transports/EimerIpcMainTransport.js +61 -0
  238. package/dist/esm/transports/EimerIpcMainTransport.js.map +1 -0
  239. package/dist/esm/transports/EimerIpcRendererTransport.js +60 -0
  240. package/dist/esm/transports/EimerIpcRendererTransport.js.map +1 -0
  241. package/dist/esm/transports/EimerMessagePortTransport.js +52 -0
  242. package/dist/esm/transports/EimerMessagePortTransport.js.map +1 -0
  243. package/dist/esm/transports/EimerMockTransport.js +56 -0
  244. package/dist/esm/transports/EimerMockTransport.js.map +1 -0
  245. package/dist/esm/transports/EimerWorkerThreadTransport.js +12 -0
  246. package/dist/esm/transports/EimerWorkerThreadTransport.js.map +1 -0
  247. package/dist/esm/transports/index.js +7 -0
  248. package/dist/esm/transports/index.js.map +1 -0
  249. 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,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ ;
4
+ //# sourceMappingURL=EimerDependencies.js.map
@@ -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,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ ;
4
+ //# sourceMappingURL=EimerOptions.js.map
@@ -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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=IdGenerator.js.map
@@ -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"}