@hotmeshio/hotmesh 0.4.0 → 0.4.2

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 (284) hide show
  1. package/README.md +39 -14
  2. package/build/modules/enums.d.ts +110 -0
  3. package/build/modules/enums.js +134 -0
  4. package/build/modules/errors.d.ts +124 -0
  5. package/build/modules/errors.js +191 -0
  6. package/build/modules/key.d.ts +66 -0
  7. package/build/modules/key.js +190 -0
  8. package/build/modules/storage.d.ts +3 -0
  9. package/build/modules/storage.js +5 -0
  10. package/build/modules/utils.d.ts +119 -0
  11. package/build/modules/utils.js +374 -0
  12. package/build/package.json +1 -1
  13. package/build/services/activities/activity.d.ts +104 -0
  14. package/build/services/activities/activity.js +549 -0
  15. package/build/services/activities/await.d.ts +12 -0
  16. package/build/services/activities/await.js +114 -0
  17. package/build/services/activities/cycle.d.ts +19 -0
  18. package/build/services/activities/cycle.js +112 -0
  19. package/build/services/activities/hook.d.ts +27 -0
  20. package/build/services/activities/hook.js +168 -0
  21. package/build/services/activities/index.d.ts +19 -0
  22. package/build/services/activities/index.js +20 -0
  23. package/build/services/activities/interrupt.d.ts +16 -0
  24. package/build/services/activities/interrupt.js +158 -0
  25. package/build/services/activities/signal.d.ts +20 -0
  26. package/build/services/activities/signal.js +134 -0
  27. package/build/services/activities/trigger.d.ts +37 -0
  28. package/build/services/activities/trigger.js +246 -0
  29. package/build/services/activities/worker.d.ts +12 -0
  30. package/build/services/activities/worker.js +106 -0
  31. package/build/services/collator/index.d.ts +111 -0
  32. package/build/services/collator/index.js +293 -0
  33. package/build/services/compiler/deployer.d.ts +40 -0
  34. package/build/services/compiler/deployer.js +488 -0
  35. package/build/services/compiler/index.d.ts +32 -0
  36. package/build/services/compiler/index.js +112 -0
  37. package/build/services/compiler/validator.d.ts +34 -0
  38. package/build/services/compiler/validator.js +147 -0
  39. package/build/services/connector/factory.d.ts +22 -0
  40. package/build/services/connector/factory.js +99 -0
  41. package/build/services/connector/index.d.ts +30 -0
  42. package/build/services/connector/index.js +54 -0
  43. package/build/services/connector/providers/ioredis.d.ts +9 -0
  44. package/build/services/connector/providers/ioredis.js +26 -0
  45. package/build/services/connector/providers/nats.d.ts +9 -0
  46. package/build/services/connector/providers/nats.js +34 -0
  47. package/build/services/connector/providers/postgres.d.ts +20 -0
  48. package/build/services/connector/providers/postgres.js +102 -0
  49. package/build/services/connector/providers/redis.d.ts +9 -0
  50. package/build/services/connector/providers/redis.js +38 -0
  51. package/build/services/engine/index.d.ts +264 -0
  52. package/build/services/engine/index.js +761 -0
  53. package/build/services/exporter/index.d.ts +44 -0
  54. package/build/services/exporter/index.js +126 -0
  55. package/build/services/hotmesh/index.d.ts +483 -0
  56. package/build/services/hotmesh/index.js +622 -0
  57. package/build/services/logger/index.d.ts +16 -0
  58. package/build/services/logger/index.js +54 -0
  59. package/build/services/mapper/index.d.ts +28 -0
  60. package/build/services/mapper/index.js +81 -0
  61. package/build/services/memflow/client.d.ts +108 -0
  62. package/build/services/memflow/client.js +372 -0
  63. package/build/services/memflow/connection.d.ts +23 -0
  64. package/build/services/memflow/connection.js +33 -0
  65. package/build/services/memflow/context.d.ts +143 -0
  66. package/build/services/memflow/context.js +299 -0
  67. package/build/services/memflow/exporter.d.ts +51 -0
  68. package/build/services/memflow/exporter.js +215 -0
  69. package/build/services/memflow/handle.d.ts +90 -0
  70. package/build/services/memflow/handle.js +176 -0
  71. package/build/services/memflow/index.d.ts +116 -0
  72. package/build/services/memflow/index.js +122 -0
  73. package/build/services/memflow/schemas/factory.d.ts +29 -0
  74. package/build/services/memflow/schemas/factory.js +2492 -0
  75. package/build/services/memflow/search.d.ts +142 -0
  76. package/build/services/memflow/search.js +320 -0
  77. package/build/services/memflow/worker.d.ts +124 -0
  78. package/build/services/memflow/worker.js +514 -0
  79. package/build/services/memflow/workflow/all.d.ts +7 -0
  80. package/build/services/memflow/workflow/all.js +15 -0
  81. package/build/services/memflow/workflow/common.d.ts +20 -0
  82. package/build/services/memflow/workflow/common.js +47 -0
  83. package/build/services/memflow/workflow/context.d.ts +6 -0
  84. package/build/services/memflow/workflow/context.js +45 -0
  85. package/build/services/memflow/workflow/contextMethods.d.ts +14 -0
  86. package/build/services/memflow/workflow/contextMethods.js +33 -0
  87. package/build/services/memflow/workflow/didRun.d.ts +7 -0
  88. package/build/services/memflow/workflow/didRun.js +22 -0
  89. package/build/services/memflow/workflow/emit.d.ts +11 -0
  90. package/build/services/memflow/workflow/emit.js +29 -0
  91. package/build/services/memflow/workflow/enrich.d.ts +9 -0
  92. package/build/services/memflow/workflow/enrich.js +17 -0
  93. package/build/services/memflow/workflow/execChild.d.ts +18 -0
  94. package/build/services/memflow/workflow/execChild.js +102 -0
  95. package/build/services/memflow/workflow/execHook.d.ts +65 -0
  96. package/build/services/memflow/workflow/execHook.js +73 -0
  97. package/build/services/memflow/workflow/hook.d.ts +9 -0
  98. package/build/services/memflow/workflow/hook.js +56 -0
  99. package/build/services/memflow/workflow/index.d.ts +74 -0
  100. package/build/services/memflow/workflow/index.js +87 -0
  101. package/build/services/memflow/workflow/interrupt.d.ts +9 -0
  102. package/build/services/memflow/workflow/interrupt.js +24 -0
  103. package/build/services/memflow/workflow/isSideEffectAllowed.d.ts +10 -0
  104. package/build/services/memflow/workflow/isSideEffectAllowed.js +33 -0
  105. package/build/services/memflow/workflow/proxyActivities.d.ts +20 -0
  106. package/build/services/memflow/workflow/proxyActivities.js +97 -0
  107. package/build/services/memflow/workflow/random.d.ts +6 -0
  108. package/build/services/memflow/workflow/random.js +16 -0
  109. package/build/services/memflow/workflow/searchMethods.d.ts +6 -0
  110. package/build/services/memflow/workflow/searchMethods.js +25 -0
  111. package/build/services/memflow/workflow/signal.d.ts +29 -0
  112. package/build/services/memflow/workflow/signal.js +50 -0
  113. package/build/services/memflow/workflow/sleepFor.d.ts +24 -0
  114. package/build/services/memflow/workflow/sleepFor.js +51 -0
  115. package/build/services/memflow/workflow/trace.d.ts +14 -0
  116. package/build/services/memflow/workflow/trace.js +33 -0
  117. package/build/services/memflow/workflow/waitFor.d.ts +29 -0
  118. package/build/services/memflow/workflow/waitFor.js +56 -0
  119. package/build/services/meshcall/index.d.ts +194 -0
  120. package/build/services/meshcall/index.js +452 -0
  121. package/build/services/meshcall/schemas/factory.d.ts +9 -0
  122. package/build/services/meshcall/schemas/factory.js +189 -0
  123. package/build/services/meshdata/index.d.ts +795 -0
  124. package/build/services/meshdata/index.js +1235 -0
  125. package/build/services/meshos/index.d.ts +293 -0
  126. package/build/services/meshos/index.js +547 -0
  127. package/build/services/pipe/functions/array.d.ts +17 -0
  128. package/build/services/pipe/functions/array.js +74 -0
  129. package/build/services/pipe/functions/bitwise.d.ts +9 -0
  130. package/build/services/pipe/functions/bitwise.js +24 -0
  131. package/build/services/pipe/functions/conditional.d.ts +13 -0
  132. package/build/services/pipe/functions/conditional.js +36 -0
  133. package/build/services/pipe/functions/cron.d.ts +12 -0
  134. package/build/services/pipe/functions/cron.js +40 -0
  135. package/build/services/pipe/functions/date.d.ts +58 -0
  136. package/build/services/pipe/functions/date.js +171 -0
  137. package/build/services/pipe/functions/index.d.ts +29 -0
  138. package/build/services/pipe/functions/index.js +30 -0
  139. package/build/services/pipe/functions/json.d.ts +5 -0
  140. package/build/services/pipe/functions/json.js +12 -0
  141. package/build/services/pipe/functions/logical.d.ts +5 -0
  142. package/build/services/pipe/functions/logical.js +12 -0
  143. package/build/services/pipe/functions/math.d.ts +42 -0
  144. package/build/services/pipe/functions/math.js +184 -0
  145. package/build/services/pipe/functions/number.d.ts +21 -0
  146. package/build/services/pipe/functions/number.js +60 -0
  147. package/build/services/pipe/functions/object.d.ts +25 -0
  148. package/build/services/pipe/functions/object.js +81 -0
  149. package/build/services/pipe/functions/string.d.ts +23 -0
  150. package/build/services/pipe/functions/string.js +69 -0
  151. package/build/services/pipe/functions/symbol.d.ts +12 -0
  152. package/build/services/pipe/functions/symbol.js +33 -0
  153. package/build/services/pipe/functions/unary.d.ts +7 -0
  154. package/build/services/pipe/functions/unary.js +18 -0
  155. package/build/services/pipe/index.d.ts +48 -0
  156. package/build/services/pipe/index.js +242 -0
  157. package/build/services/quorum/index.d.ts +90 -0
  158. package/build/services/quorum/index.js +263 -0
  159. package/build/services/reporter/index.d.ts +50 -0
  160. package/build/services/reporter/index.js +348 -0
  161. package/build/services/router/config/index.d.ts +11 -0
  162. package/build/services/router/config/index.js +36 -0
  163. package/build/services/router/consumption/index.d.ts +34 -0
  164. package/build/services/router/consumption/index.js +395 -0
  165. package/build/services/router/error-handling/index.d.ts +8 -0
  166. package/build/services/router/error-handling/index.js +98 -0
  167. package/build/services/router/index.d.ts +57 -0
  168. package/build/services/router/index.js +121 -0
  169. package/build/services/router/lifecycle/index.d.ts +27 -0
  170. package/build/services/router/lifecycle/index.js +80 -0
  171. package/build/services/router/telemetry/index.d.ts +11 -0
  172. package/build/services/router/telemetry/index.js +32 -0
  173. package/build/services/router/throttling/index.d.ts +23 -0
  174. package/build/services/router/throttling/index.js +76 -0
  175. package/build/services/search/factory.d.ts +7 -0
  176. package/build/services/search/factory.js +24 -0
  177. package/build/services/search/index.d.ts +23 -0
  178. package/build/services/search/index.js +10 -0
  179. package/build/services/search/providers/postgres/postgres.d.ts +25 -0
  180. package/build/services/search/providers/postgres/postgres.js +149 -0
  181. package/build/services/search/providers/redis/ioredis.d.ts +19 -0
  182. package/build/services/search/providers/redis/ioredis.js +121 -0
  183. package/build/services/search/providers/redis/redis.d.ts +19 -0
  184. package/build/services/search/providers/redis/redis.js +134 -0
  185. package/build/services/serializer/index.d.ts +42 -0
  186. package/build/services/serializer/index.js +282 -0
  187. package/build/services/store/cache.d.ts +67 -0
  188. package/build/services/store/cache.js +128 -0
  189. package/build/services/store/factory.d.ts +8 -0
  190. package/build/services/store/factory.js +24 -0
  191. package/build/services/store/index.d.ts +89 -0
  192. package/build/services/store/index.js +9 -0
  193. package/build/services/store/providers/postgres/kvsql.d.ts +168 -0
  194. package/build/services/store/providers/postgres/kvsql.js +198 -0
  195. package/build/services/store/providers/postgres/kvtables.d.ts +20 -0
  196. package/build/services/store/providers/postgres/kvtables.js +441 -0
  197. package/build/services/store/providers/postgres/kvtransaction.d.ts +36 -0
  198. package/build/services/store/providers/postgres/kvtransaction.js +248 -0
  199. package/build/services/store/providers/postgres/kvtypes/hash.d.ts +60 -0
  200. package/build/services/store/providers/postgres/kvtypes/hash.js +1287 -0
  201. package/build/services/store/providers/postgres/kvtypes/list.d.ts +33 -0
  202. package/build/services/store/providers/postgres/kvtypes/list.js +194 -0
  203. package/build/services/store/providers/postgres/kvtypes/string.d.ts +20 -0
  204. package/build/services/store/providers/postgres/kvtypes/string.js +115 -0
  205. package/build/services/store/providers/postgres/kvtypes/zset.d.ts +41 -0
  206. package/build/services/store/providers/postgres/kvtypes/zset.js +214 -0
  207. package/build/services/store/providers/postgres/postgres.d.ts +178 -0
  208. package/build/services/store/providers/postgres/postgres.js +1244 -0
  209. package/build/services/store/providers/redis/_base.d.ts +137 -0
  210. package/build/services/store/providers/redis/_base.js +980 -0
  211. package/build/services/store/providers/redis/ioredis.d.ts +20 -0
  212. package/build/services/store/providers/redis/ioredis.js +180 -0
  213. package/build/services/store/providers/redis/redis.d.ts +18 -0
  214. package/build/services/store/providers/redis/redis.js +199 -0
  215. package/build/services/store/providers/store-initializable.d.ts +5 -0
  216. package/build/services/store/providers/store-initializable.js +2 -0
  217. package/build/services/stream/factory.d.ts +8 -0
  218. package/build/services/stream/factory.js +37 -0
  219. package/build/services/stream/index.d.ts +69 -0
  220. package/build/services/stream/index.js +11 -0
  221. package/build/services/stream/providers/nats/nats.d.ts +60 -0
  222. package/build/services/stream/providers/nats/nats.js +225 -0
  223. package/build/services/stream/providers/postgres/kvtables.d.ts +3 -0
  224. package/build/services/stream/providers/postgres/kvtables.js +146 -0
  225. package/build/services/stream/providers/postgres/postgres.d.ts +107 -0
  226. package/build/services/stream/providers/postgres/postgres.js +519 -0
  227. package/build/services/stream/providers/redis/ioredis.d.ts +61 -0
  228. package/build/services/stream/providers/redis/ioredis.js +272 -0
  229. package/build/services/stream/providers/redis/redis.d.ts +61 -0
  230. package/build/services/stream/providers/redis/redis.js +305 -0
  231. package/build/services/stream/providers/stream-initializable.d.ts +4 -0
  232. package/build/services/stream/providers/stream-initializable.js +2 -0
  233. package/build/services/sub/factory.d.ts +7 -0
  234. package/build/services/sub/factory.js +29 -0
  235. package/build/services/sub/index.d.ts +22 -0
  236. package/build/services/sub/index.js +10 -0
  237. package/build/services/sub/providers/nats/nats.d.ts +19 -0
  238. package/build/services/sub/providers/nats/nats.js +105 -0
  239. package/build/services/sub/providers/postgres/postgres.d.ts +19 -0
  240. package/build/services/sub/providers/postgres/postgres.js +92 -0
  241. package/build/services/sub/providers/redis/ioredis.d.ts +17 -0
  242. package/build/services/sub/providers/redis/ioredis.js +81 -0
  243. package/build/services/sub/providers/redis/redis.d.ts +17 -0
  244. package/build/services/sub/providers/redis/redis.js +72 -0
  245. package/build/services/task/index.d.ts +48 -0
  246. package/build/services/task/index.js +253 -0
  247. package/build/services/telemetry/index.d.ts +52 -0
  248. package/build/services/telemetry/index.js +306 -0
  249. package/build/services/worker/index.d.ts +77 -0
  250. package/build/services/worker/index.js +197 -0
  251. package/package.json +1 -1
  252. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -38
  253. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
  254. package/typedoc.json +0 -47
  255. package/types/activity.ts +0 -268
  256. package/types/app.ts +0 -20
  257. package/types/async.ts +0 -6
  258. package/types/cache.ts +0 -1
  259. package/types/collator.ts +0 -9
  260. package/types/error.ts +0 -56
  261. package/types/exporter.ts +0 -102
  262. package/types/hook.ts +0 -44
  263. package/types/hotmesh.ts +0 -314
  264. package/types/index.ts +0 -306
  265. package/types/job.ts +0 -233
  266. package/types/logger.ts +0 -8
  267. package/types/manifest.ts +0 -70
  268. package/types/map.ts +0 -5
  269. package/types/memflow.ts +0 -645
  270. package/types/meshcall.ts +0 -235
  271. package/types/meshdata.ts +0 -278
  272. package/types/ms.d.ts +0 -7
  273. package/types/nats.ts +0 -270
  274. package/types/pipe.ts +0 -90
  275. package/types/postgres.ts +0 -114
  276. package/types/provider.ts +0 -161
  277. package/types/quorum.ts +0 -167
  278. package/types/redis.ts +0 -404
  279. package/types/serializer.ts +0 -40
  280. package/types/stats.ts +0 -117
  281. package/types/stream.ts +0 -231
  282. package/types/task.ts +0 -7
  283. package/types/telemetry.ts +0 -16
  284. package/types/transition.ts +0 -20
@@ -0,0 +1,22 @@
1
+ import { KeyStoreParams, KeyType } from '../../modules/key';
2
+ import { ILogger } from '../logger';
3
+ import { SubscriptionCallback } from '../../types/quorum';
4
+ import { ProviderClient, ProviderTransaction } from '../../types/provider';
5
+ declare abstract class SubService<ClientProvider extends ProviderClient> {
6
+ protected eventClient: ClientProvider;
7
+ protected storeClient: ProviderClient;
8
+ protected namespace: string;
9
+ protected engineId: string;
10
+ protected logger: ILogger;
11
+ protected appId: string;
12
+ constructor(eventClient: ClientProvider, storeClient: ProviderClient);
13
+ abstract init(namespace: string, appId: string, engineId: string, logger: ILogger): Promise<void>;
14
+ abstract transact(): ProviderTransaction;
15
+ abstract mintKey(type: KeyType, params: KeyStoreParams): string;
16
+ abstract subscribe(keyType: KeyType.QUORUM, callback: SubscriptionCallback, appId: string, topic?: string): Promise<void>;
17
+ abstract unsubscribe(keyType: KeyType.QUORUM, appId: string, topic?: string): Promise<void>;
18
+ abstract psubscribe(keyType: KeyType.QUORUM, callback: SubscriptionCallback, appId: string, topic?: string): Promise<void>;
19
+ abstract punsubscribe(keyType: KeyType.QUORUM, appId: string, topic?: string): Promise<void>;
20
+ abstract publish(keyType: KeyType, message: Record<string, any>, appId: string, topic?: string): Promise<boolean>;
21
+ }
22
+ export { SubService };
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SubService = void 0;
4
+ class SubService {
5
+ constructor(eventClient, storeClient) {
6
+ this.eventClient = eventClient;
7
+ this.storeClient = storeClient;
8
+ }
9
+ }
10
+ exports.SubService = SubService;
@@ -0,0 +1,19 @@
1
+ import { KeyStoreParams, KeyType } from '../../../../modules/key';
2
+ import { ILogger } from '../../../logger';
3
+ import { SubService } from '../../index';
4
+ import { SubscriptionCallback } from '../../../../types/quorum';
5
+ import { NatsClientType } from '../../../../types/nats';
6
+ import { ProviderClient, ProviderTransaction } from '../../../../types/provider';
7
+ declare class NatsSubService extends SubService<NatsClientType & ProviderClient> {
8
+ private subscriptions;
9
+ constructor(eventClient: NatsClientType, storeClient: NatsClientType);
10
+ init(namespace: string, appId: string, engineId: string, logger: ILogger): Promise<void>;
11
+ transact(): ProviderTransaction;
12
+ mintKey(type: KeyType, params: KeyStoreParams): string;
13
+ subscribe(keyType: KeyType.QUORUM, callback: SubscriptionCallback, appId: string, topic?: string): Promise<void>;
14
+ unsubscribe(keyType: KeyType.QUORUM, appId: string, engineId?: string): Promise<void>;
15
+ psubscribe(keyType: KeyType.QUORUM, callback: SubscriptionCallback, appId: string, topic?: string): Promise<void>;
16
+ punsubscribe(keyType: KeyType.QUORUM, appId: string, topic?: string): Promise<void>;
17
+ publish(keyType: KeyType.QUORUM, message: Record<string, any>, appId: string, topic?: string): Promise<boolean>;
18
+ }
19
+ export { NatsSubService };
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NatsSubService = void 0;
4
+ const key_1 = require("../../../../modules/key");
5
+ const index_1 = require("../../index");
6
+ class NatsSubService extends index_1.SubService {
7
+ constructor(eventClient, storeClient) {
8
+ super(eventClient, storeClient);
9
+ this.subscriptions = new Map();
10
+ }
11
+ async init(namespace = key_1.HMNS, appId, engineId, logger) {
12
+ this.namespace = namespace;
13
+ this.logger = logger;
14
+ this.appId = appId;
15
+ this.engineId = engineId;
16
+ }
17
+ transact() {
18
+ // NATS does not support transactions like Redis.
19
+ // Return an empty object or throw an error if not supported.
20
+ return {};
21
+ }
22
+ mintKey(type, params) {
23
+ if (!this.namespace)
24
+ throw new Error('namespace not set');
25
+ return key_1.KeyService.mintKey(this.namespace, type, params)
26
+ .replace(/:/g, '.')
27
+ .replace(/\.$/g, '.X');
28
+ }
29
+ async subscribe(keyType, callback, appId, topic) {
30
+ const subject = this.mintKey(keyType, { appId, engineId: topic });
31
+ const subscription = this.eventClient.subscribe(subject);
32
+ this.subscriptions.set(subject, subscription);
33
+ this.logger.debug(`nats-subscribe ${subject}`);
34
+ (async () => {
35
+ for await (const msg of subscription) {
36
+ try {
37
+ const payload = JSON.parse(msg.data.toString());
38
+ callback(subject, payload);
39
+ }
40
+ catch (e) {
41
+ this.logger.error(`nats-subscribe-message-parse-error: ${msg.data.toString()}`, e);
42
+ }
43
+ }
44
+ })().catch((err) => {
45
+ this.logger.error(`nats-subscribe-error ${subject}`, err);
46
+ });
47
+ }
48
+ async unsubscribe(keyType, appId, engineId) {
49
+ const subject = this.mintKey(keyType, { appId, engineId });
50
+ const subscription = this.subscriptions.get(subject);
51
+ if (subscription) {
52
+ subscription.unsubscribe();
53
+ this.subscriptions.delete(subject);
54
+ this.logger.debug(`nats-unsubscribe ${subject}`);
55
+ }
56
+ else {
57
+ this.logger.warn(`nats-unsubscribe-error ${subject}`);
58
+ }
59
+ }
60
+ async psubscribe(keyType, callback, appId, topic) {
61
+ const subject = this.mintKey(keyType, { appId, engineId: topic });
62
+ const subscription = this.eventClient.subscribe(subject);
63
+ this.subscriptions.set(subject, subscription);
64
+ this.logger.debug(`nats-psubscribe ${subject}`);
65
+ (async () => {
66
+ for await (const msg of subscription) {
67
+ try {
68
+ const payload = JSON.parse(msg.data.toString());
69
+ callback(msg.subject, payload);
70
+ }
71
+ catch (e) {
72
+ this.logger.error(`nats-parse-psubscription-message-error ${msg.data.toString()}`, e);
73
+ }
74
+ }
75
+ })().catch((err) => {
76
+ this.logger.error(`nats-pattern-psubscription-error ${subject}`, err);
77
+ });
78
+ }
79
+ async punsubscribe(keyType, appId, topic) {
80
+ const subject = this.mintKey(keyType, { appId, engineId: topic });
81
+ const subscription = this.subscriptions.get(subject);
82
+ if (subscription) {
83
+ subscription.unsubscribe();
84
+ this.subscriptions.delete(subject);
85
+ this.logger.debug(`nats-punsubscribe ${subject}`);
86
+ }
87
+ else {
88
+ this.logger.warn(`nats-punsubscribe-error ${subject}`);
89
+ }
90
+ }
91
+ async publish(keyType, message, appId, topic) {
92
+ const subject = this.mintKey(keyType, { appId, engineId: topic });
93
+ try {
94
+ // Use the storeClient for publishing if necessary
95
+ this.storeClient.publish(subject, JSON.stringify(message));
96
+ this.logger.debug(`nats-publish ${subject}`);
97
+ return true;
98
+ }
99
+ catch (err) {
100
+ this.logger.error(`nats-publish-error ${subject}`, err);
101
+ return false;
102
+ }
103
+ }
104
+ }
105
+ exports.NatsSubService = NatsSubService;
@@ -0,0 +1,19 @@
1
+ import { KeyStoreParams, KeyType } from '../../../../modules/key';
2
+ import { ILogger } from '../../../logger';
3
+ import { SubService } from '../../index';
4
+ import { SubscriptionCallback } from '../../../../types/quorum';
5
+ import { ProviderClient, ProviderTransaction } from '../../../../types/provider';
6
+ import { PostgresClientType } from '../../../../types/postgres';
7
+ declare class PostgresSubService extends SubService<PostgresClientType & ProviderClient> {
8
+ constructor(eventClient: PostgresClientType & ProviderClient, storeClient?: PostgresClientType & ProviderClient);
9
+ init(namespace: string, appId: string, engineId: string, logger: ILogger): Promise<void>;
10
+ transact(): ProviderTransaction;
11
+ mintKey(type: KeyType, params: KeyStoreParams): string;
12
+ mintSafeKey(type: KeyType, params: KeyStoreParams): [string, string];
13
+ subscribe(keyType: KeyType.QUORUM, callback: SubscriptionCallback, appId: string, topic?: string): Promise<void>;
14
+ unsubscribe(keyType: KeyType.QUORUM, appId: string, topic?: string): Promise<void>;
15
+ publish(keyType: KeyType.QUORUM, message: Record<string, any>, appId: string, topic?: string): Promise<boolean>;
16
+ psubscribe(): Promise<void>;
17
+ punsubscribe(): Promise<void>;
18
+ }
19
+ export { PostgresSubService };
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.PostgresSubService = void 0;
7
+ const crypto_1 = __importDefault(require("crypto"));
8
+ const key_1 = require("../../../../modules/key");
9
+ const index_1 = require("../../index");
10
+ class PostgresSubService extends index_1.SubService {
11
+ constructor(eventClient, storeClient) {
12
+ super(eventClient, storeClient);
13
+ }
14
+ async init(namespace = key_1.HMNS, appId, engineId, logger) {
15
+ this.namespace = namespace;
16
+ this.logger = logger;
17
+ this.appId = appId;
18
+ this.engineId = engineId;
19
+ }
20
+ transact() {
21
+ throw new Error('Transactions are not supported in lightweight pub/sub');
22
+ }
23
+ mintKey(type, params) {
24
+ if (!this.namespace)
25
+ throw new Error('Namespace not set');
26
+ return key_1.KeyService.mintKey(this.namespace, type, params);
27
+ }
28
+ mintSafeKey(type, params) {
29
+ const originalKey = this.mintKey(type, params);
30
+ if (originalKey.length <= 63) {
31
+ return [originalKey, originalKey];
32
+ }
33
+ const { appId = '', engineId = '' } = params;
34
+ const baseKey = `${this.namespace}:${appId}:${type}`;
35
+ const maxHashLength = 63 - baseKey.length - 1; // Reserve space for `:` delimiter
36
+ const engineIdHash = crypto_1.default
37
+ .createHash('sha256')
38
+ .update(engineId)
39
+ .digest('hex')
40
+ .substring(0, maxHashLength);
41
+ const safeKey = `${baseKey}:${engineIdHash}`;
42
+ return [originalKey, safeKey];
43
+ }
44
+ async subscribe(keyType, callback, appId, topic) {
45
+ const [originalKey, safeKey] = this.mintSafeKey(keyType, {
46
+ appId,
47
+ engineId: topic,
48
+ });
49
+ // Start listening to the safe topic
50
+ await this.eventClient.query(`LISTEN "${safeKey}"`);
51
+ this.logger.debug(`postgres-subscribe`, { originalKey, safeKey });
52
+ // Set up the notification handler
53
+ this.eventClient.on('notification', (msg) => {
54
+ if (msg.channel === safeKey) {
55
+ try {
56
+ const payload = JSON.parse(msg.payload || '{}');
57
+ callback(safeKey, payload);
58
+ }
59
+ catch (err) {
60
+ this.logger.error(`Error parsing message for topic ${safeKey}:`, err);
61
+ }
62
+ }
63
+ });
64
+ }
65
+ async unsubscribe(keyType, appId, topic) {
66
+ const [originalKey, safeKey] = this.mintSafeKey(keyType, {
67
+ appId,
68
+ engineId: topic,
69
+ });
70
+ // Stop listening to the safe topic
71
+ await this.eventClient.query(`UNLISTEN "${safeKey}"`);
72
+ this.logger.debug(`postgres-subscribe`, { originalKey, safeKey });
73
+ }
74
+ async publish(keyType, message, appId, topic) {
75
+ const [originalKey, safeKey] = this.mintSafeKey(keyType, {
76
+ appId,
77
+ engineId: topic,
78
+ });
79
+ // Publish the message using the safe topic
80
+ const payload = JSON.stringify(message).replace(/'/g, "''");
81
+ await this.storeClient.query(`NOTIFY "${safeKey}", '${payload}'`);
82
+ this.logger.debug(`postgres-publish`, { originalKey, safeKey });
83
+ return true;
84
+ }
85
+ async psubscribe() {
86
+ throw new Error('Pattern subscriptions are not supported in PostgreSQL');
87
+ }
88
+ async punsubscribe() {
89
+ throw new Error('Pattern subscriptions are not supported in PostgreSQL');
90
+ }
91
+ }
92
+ exports.PostgresSubService = PostgresSubService;
@@ -0,0 +1,17 @@
1
+ import { KeyStoreParams, KeyType } from '../../../../modules/key';
2
+ import { ILogger } from '../../../logger';
3
+ import { SubService } from '../../index';
4
+ import { IORedisClientType as RedisClientType, IORedisMultiType as RedisMultiType } from '../../../../types/redis';
5
+ import { SubscriptionCallback } from '../../../../types/quorum';
6
+ declare class IORedisSubService extends SubService<RedisClientType> {
7
+ constructor(eventClient: RedisClientType, storeClient: RedisClientType);
8
+ init(namespace: string, appId: string, engineId: string, logger: ILogger): Promise<void>;
9
+ transact(): RedisMultiType;
10
+ mintKey(type: KeyType, params: KeyStoreParams): string;
11
+ subscribe(keyType: KeyType.QUORUM, callback: SubscriptionCallback, appId: string, engineId?: string): Promise<void>;
12
+ unsubscribe(keyType: KeyType.QUORUM, appId: string, engineId?: string): Promise<void>;
13
+ psubscribe(keyType: KeyType.QUORUM, callback: SubscriptionCallback, appId: string, engineId?: string): Promise<void>;
14
+ punsubscribe(keyType: KeyType.QUORUM, appId: string, engineId?: string): Promise<void>;
15
+ publish(keyType: KeyType.QUORUM, message: Record<string, any>, appId: string, engineId?: string): Promise<boolean>;
16
+ }
17
+ export { IORedisSubService };
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IORedisSubService = void 0;
4
+ const key_1 = require("../../../../modules/key");
5
+ const index_1 = require("../../index");
6
+ class IORedisSubService extends index_1.SubService {
7
+ constructor(eventClient, storeClient) {
8
+ super(eventClient, storeClient);
9
+ }
10
+ async init(namespace = key_1.HMNS, appId, engineId, logger) {
11
+ this.namespace = namespace;
12
+ this.logger = logger;
13
+ this.appId = appId;
14
+ this.engineId = engineId;
15
+ }
16
+ transact() {
17
+ return this.eventClient.multi();
18
+ }
19
+ mintKey(type, params) {
20
+ if (!this.namespace)
21
+ throw new Error('namespace not set');
22
+ return key_1.KeyService.mintKey(this.namespace, type, params);
23
+ }
24
+ async subscribe(keyType, callback, appId, engineId) {
25
+ const self = this;
26
+ const topic = this.mintKey(keyType, { appId, engineId });
27
+ await this.eventClient.subscribe(topic, (err) => {
28
+ if (err) {
29
+ self.logger.error(`Error subscribing to: ${topic}`, err);
30
+ }
31
+ });
32
+ this.eventClient.on('message', (channel, message) => {
33
+ if (channel === topic) {
34
+ try {
35
+ const payload = JSON.parse(message);
36
+ callback(topic, payload);
37
+ }
38
+ catch (e) {
39
+ self.logger.error(`Error parsing message: ${message}`, e);
40
+ }
41
+ }
42
+ });
43
+ }
44
+ async unsubscribe(keyType, appId, engineId) {
45
+ const topic = this.mintKey(keyType, { appId, engineId });
46
+ await this.eventClient.unsubscribe(topic);
47
+ }
48
+ async psubscribe(keyType, callback, appId, engineId) {
49
+ const self = this;
50
+ const topic = this.mintKey(keyType, { appId, engineId });
51
+ await this.eventClient.psubscribe(topic, (err) => {
52
+ if (err) {
53
+ self.logger.error(`Error subscribing to: ${topic}`, err);
54
+ }
55
+ });
56
+ this.eventClient.on('pmessage', (pattern, channel, message) => {
57
+ if (pattern === topic) {
58
+ try {
59
+ const payload = JSON.parse(message);
60
+ callback(channel, payload);
61
+ }
62
+ catch (e) {
63
+ self.logger.error(`Error parsing message: ${message}`, e);
64
+ }
65
+ }
66
+ });
67
+ }
68
+ async punsubscribe(keyType, appId, engineId) {
69
+ const topic = this.mintKey(keyType, { appId, engineId });
70
+ await this.eventClient.punsubscribe(topic);
71
+ }
72
+ async publish(keyType, message, appId, engineId) {
73
+ const topic = this.mintKey(keyType, { appId, engineId });
74
+ //NOTE: `storeClient.publish` is used,
75
+ // because a Redis connection with subscriptions
76
+ // may not publish (is read only).
77
+ const status = await this.storeClient.publish(topic, JSON.stringify(message));
78
+ return status === 1;
79
+ }
80
+ }
81
+ exports.IORedisSubService = IORedisSubService;
@@ -0,0 +1,17 @@
1
+ import { KeyStoreParams, KeyType } from '../../../../modules/key';
2
+ import { ILogger } from '../../../logger';
3
+ import { SubService } from '../../index';
4
+ import { RedisRedisClientType as ClientProvider, RedisRedisMultiType as TransactionProvider } from '../../../../types/redis';
5
+ import { SubscriptionCallback } from '../../../../types/quorum';
6
+ declare class RedisSubService extends SubService<ClientProvider> {
7
+ constructor(eventClient: ClientProvider, storeClient: ClientProvider);
8
+ init(namespace: string, appId: string, engineId: string, logger: ILogger): Promise<void>;
9
+ transact(): TransactionProvider;
10
+ mintKey(type: KeyType, params: KeyStoreParams): string;
11
+ subscribe(keyType: KeyType.QUORUM, callback: SubscriptionCallback, appId: string, engineId?: string): Promise<void>;
12
+ unsubscribe(keyType: KeyType.QUORUM, appId: string, engineId?: string): Promise<void>;
13
+ psubscribe(keyType: KeyType.QUORUM, callback: SubscriptionCallback, appId: string, engineId?: string): Promise<void>;
14
+ punsubscribe(keyType: KeyType.QUORUM, appId: string, engineId?: string): Promise<void>;
15
+ publish(keyType: KeyType.QUORUM, message: Record<string, any>, appId: string, engineId?: string): Promise<boolean>;
16
+ }
17
+ export { RedisSubService };
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RedisSubService = void 0;
4
+ const key_1 = require("../../../../modules/key");
5
+ const index_1 = require("../../index");
6
+ class RedisSubService extends index_1.SubService {
7
+ constructor(eventClient, storeClient) {
8
+ super(eventClient, storeClient);
9
+ }
10
+ async init(namespace = key_1.HMNS, appId, engineId, logger) {
11
+ this.namespace = namespace;
12
+ this.logger = logger;
13
+ this.appId = appId;
14
+ this.engineId = engineId;
15
+ }
16
+ transact() {
17
+ const multi = this.eventClient.multi();
18
+ return multi;
19
+ }
20
+ mintKey(type, params) {
21
+ if (!this.namespace)
22
+ throw new Error('namespace not set');
23
+ return key_1.KeyService.mintKey(this.namespace, type, params);
24
+ }
25
+ async subscribe(keyType, callback, appId, engineId) {
26
+ if (this.eventClient) {
27
+ const self = this;
28
+ const topic = this.mintKey(keyType, { appId, engineId });
29
+ await this.eventClient.subscribe(topic, (message) => {
30
+ try {
31
+ const payload = JSON.parse(message);
32
+ callback(topic, payload);
33
+ }
34
+ catch (e) {
35
+ self.logger.error(`Error parsing message: ${message}`, e);
36
+ }
37
+ });
38
+ }
39
+ }
40
+ async unsubscribe(keyType, appId, engineId) {
41
+ const topic = this.mintKey(keyType, { appId, engineId });
42
+ await this.eventClient.unsubscribe(topic);
43
+ }
44
+ async psubscribe(keyType, callback, appId, engineId) {
45
+ if (this.eventClient) {
46
+ const self = this;
47
+ const topic = this.mintKey(keyType, { appId, engineId });
48
+ await this.eventClient.pSubscribe(topic, (message, channel) => {
49
+ try {
50
+ const payload = JSON.parse(message);
51
+ callback(channel, payload);
52
+ }
53
+ catch (e) {
54
+ self.logger.error(`Error parsing message: ${message}`, e);
55
+ }
56
+ });
57
+ }
58
+ }
59
+ async punsubscribe(keyType, appId, engineId) {
60
+ const topic = this.mintKey(keyType, { appId, engineId });
61
+ await this.eventClient.pUnsubscribe(topic);
62
+ }
63
+ async publish(keyType, message, appId, engineId) {
64
+ const topic = this.mintKey(keyType, { appId, engineId });
65
+ //NOTE: `storeClient.publish` is used,
66
+ // because a Redis connection with subscriptions
67
+ // may not publish (is read only).
68
+ const status = await this.storeClient.publish(topic, JSON.stringify(message));
69
+ return status > 0;
70
+ }
71
+ }
72
+ exports.RedisSubService = RedisSubService;
@@ -0,0 +1,48 @@
1
+ /// <reference types="node" />
2
+ import { ILogger } from '../logger';
3
+ import { StoreService } from '../store';
4
+ import { HookInterface, HookRule } from '../../types/hook';
5
+ import { JobCompletionOptions, JobState } from '../../types/job';
6
+ import { ProviderClient, ProviderTransaction } from '../../types/provider';
7
+ import { WorkListTaskType } from '../../types/task';
8
+ declare class TaskService {
9
+ store: StoreService<ProviderClient, ProviderTransaction>;
10
+ logger: ILogger;
11
+ cleanupTimeout: NodeJS.Timeout | null;
12
+ isScout: boolean;
13
+ errorCount: number;
14
+ constructor(store: StoreService<ProviderClient, ProviderTransaction>, logger: ILogger);
15
+ processWebHooks(hookEventCallback: HookInterface): Promise<void>;
16
+ enqueueWorkItems(keys: string[]): Promise<void>;
17
+ registerJobForCleanup(jobId: string, inSeconds: number, options: JobCompletionOptions): Promise<void>;
18
+ registerTimeHook(jobId: string, gId: string, activityId: string, type: WorkListTaskType, inSeconds: number, dad: string, transaction?: ProviderTransaction): Promise<void>;
19
+ /**
20
+ * Should this engine instance play the role of 'scout' on behalf
21
+ * of the entire quorum? The scout role is responsible for processing
22
+ * task lists on behalf of the collective.
23
+ */
24
+ shouldScout(): Promise<boolean>;
25
+ /**
26
+ * Callback handler that takes an item from a work list and
27
+ * processes according to its type
28
+ */
29
+ processTimeHooks(timeEventCallback: (jobId: string, gId: string, activityId: string, type: WorkListTaskType) => Promise<void>, listKey?: string): Promise<void>;
30
+ cancelCleanup(): void;
31
+ getHookRule(topic: string): Promise<HookRule | undefined>;
32
+ registerWebHook(topic: string, context: JobState, dad: string, expire: number, transaction?: ProviderTransaction): Promise<string>;
33
+ processWebHookSignal(topic: string, data: Record<string, unknown>): Promise<[string, string, string, string] | undefined>;
34
+ deleteWebHookSignal(topic: string, data: Record<string, unknown>): Promise<number>;
35
+ /**
36
+ * Enhanced processTimeHooks that uses notifications for PostgreSQL stores
37
+ */
38
+ processTimeHooksWithNotifications(timeEventCallback: (jobId: string, gId: string, activityId: string, type: WorkListTaskType) => Promise<void>): Promise<void>;
39
+ /**
40
+ * Check if this is a PostgreSQL store
41
+ */
42
+ private isPostgresStore;
43
+ /**
44
+ * Check if the store supports notifications
45
+ */
46
+ private supportsNotifications;
47
+ }
48
+ export { TaskService };