@hotmeshio/hotmesh 0.4.0 → 0.4.1

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 (283) hide show
  1. package/build/modules/enums.d.ts +110 -0
  2. package/build/modules/enums.js +134 -0
  3. package/build/modules/errors.d.ts +124 -0
  4. package/build/modules/errors.js +191 -0
  5. package/build/modules/key.d.ts +66 -0
  6. package/build/modules/key.js +190 -0
  7. package/build/modules/storage.d.ts +3 -0
  8. package/build/modules/storage.js +5 -0
  9. package/build/modules/utils.d.ts +119 -0
  10. package/build/modules/utils.js +374 -0
  11. package/build/package.json +1 -1
  12. package/build/services/activities/activity.d.ts +104 -0
  13. package/build/services/activities/activity.js +549 -0
  14. package/build/services/activities/await.d.ts +12 -0
  15. package/build/services/activities/await.js +114 -0
  16. package/build/services/activities/cycle.d.ts +19 -0
  17. package/build/services/activities/cycle.js +112 -0
  18. package/build/services/activities/hook.d.ts +27 -0
  19. package/build/services/activities/hook.js +168 -0
  20. package/build/services/activities/index.d.ts +19 -0
  21. package/build/services/activities/index.js +20 -0
  22. package/build/services/activities/interrupt.d.ts +16 -0
  23. package/build/services/activities/interrupt.js +158 -0
  24. package/build/services/activities/signal.d.ts +20 -0
  25. package/build/services/activities/signal.js +134 -0
  26. package/build/services/activities/trigger.d.ts +37 -0
  27. package/build/services/activities/trigger.js +246 -0
  28. package/build/services/activities/worker.d.ts +12 -0
  29. package/build/services/activities/worker.js +106 -0
  30. package/build/services/collator/index.d.ts +111 -0
  31. package/build/services/collator/index.js +293 -0
  32. package/build/services/compiler/deployer.d.ts +40 -0
  33. package/build/services/compiler/deployer.js +488 -0
  34. package/build/services/compiler/index.d.ts +32 -0
  35. package/build/services/compiler/index.js +112 -0
  36. package/build/services/compiler/validator.d.ts +34 -0
  37. package/build/services/compiler/validator.js +147 -0
  38. package/build/services/connector/factory.d.ts +22 -0
  39. package/build/services/connector/factory.js +99 -0
  40. package/build/services/connector/index.d.ts +30 -0
  41. package/build/services/connector/index.js +54 -0
  42. package/build/services/connector/providers/ioredis.d.ts +9 -0
  43. package/build/services/connector/providers/ioredis.js +26 -0
  44. package/build/services/connector/providers/nats.d.ts +9 -0
  45. package/build/services/connector/providers/nats.js +34 -0
  46. package/build/services/connector/providers/postgres.d.ts +20 -0
  47. package/build/services/connector/providers/postgres.js +102 -0
  48. package/build/services/connector/providers/redis.d.ts +9 -0
  49. package/build/services/connector/providers/redis.js +38 -0
  50. package/build/services/engine/index.d.ts +264 -0
  51. package/build/services/engine/index.js +761 -0
  52. package/build/services/exporter/index.d.ts +44 -0
  53. package/build/services/exporter/index.js +126 -0
  54. package/build/services/hotmesh/index.d.ts +483 -0
  55. package/build/services/hotmesh/index.js +622 -0
  56. package/build/services/logger/index.d.ts +16 -0
  57. package/build/services/logger/index.js +54 -0
  58. package/build/services/mapper/index.d.ts +28 -0
  59. package/build/services/mapper/index.js +81 -0
  60. package/build/services/memflow/client.d.ts +108 -0
  61. package/build/services/memflow/client.js +372 -0
  62. package/build/services/memflow/connection.d.ts +23 -0
  63. package/build/services/memflow/connection.js +33 -0
  64. package/build/services/memflow/context.d.ts +143 -0
  65. package/build/services/memflow/context.js +299 -0
  66. package/build/services/memflow/exporter.d.ts +51 -0
  67. package/build/services/memflow/exporter.js +215 -0
  68. package/build/services/memflow/handle.d.ts +90 -0
  69. package/build/services/memflow/handle.js +176 -0
  70. package/build/services/memflow/index.d.ts +116 -0
  71. package/build/services/memflow/index.js +122 -0
  72. package/build/services/memflow/schemas/factory.d.ts +29 -0
  73. package/build/services/memflow/schemas/factory.js +2492 -0
  74. package/build/services/memflow/search.d.ts +142 -0
  75. package/build/services/memflow/search.js +320 -0
  76. package/build/services/memflow/worker.d.ts +124 -0
  77. package/build/services/memflow/worker.js +514 -0
  78. package/build/services/memflow/workflow/all.d.ts +7 -0
  79. package/build/services/memflow/workflow/all.js +15 -0
  80. package/build/services/memflow/workflow/common.d.ts +20 -0
  81. package/build/services/memflow/workflow/common.js +47 -0
  82. package/build/services/memflow/workflow/context.d.ts +6 -0
  83. package/build/services/memflow/workflow/context.js +45 -0
  84. package/build/services/memflow/workflow/contextMethods.d.ts +14 -0
  85. package/build/services/memflow/workflow/contextMethods.js +33 -0
  86. package/build/services/memflow/workflow/didRun.d.ts +7 -0
  87. package/build/services/memflow/workflow/didRun.js +22 -0
  88. package/build/services/memflow/workflow/emit.d.ts +11 -0
  89. package/build/services/memflow/workflow/emit.js +29 -0
  90. package/build/services/memflow/workflow/enrich.d.ts +9 -0
  91. package/build/services/memflow/workflow/enrich.js +17 -0
  92. package/build/services/memflow/workflow/execChild.d.ts +18 -0
  93. package/build/services/memflow/workflow/execChild.js +102 -0
  94. package/build/services/memflow/workflow/execHook.d.ts +65 -0
  95. package/build/services/memflow/workflow/execHook.js +73 -0
  96. package/build/services/memflow/workflow/hook.d.ts +9 -0
  97. package/build/services/memflow/workflow/hook.js +56 -0
  98. package/build/services/memflow/workflow/index.d.ts +74 -0
  99. package/build/services/memflow/workflow/index.js +87 -0
  100. package/build/services/memflow/workflow/interrupt.d.ts +9 -0
  101. package/build/services/memflow/workflow/interrupt.js +24 -0
  102. package/build/services/memflow/workflow/isSideEffectAllowed.d.ts +10 -0
  103. package/build/services/memflow/workflow/isSideEffectAllowed.js +33 -0
  104. package/build/services/memflow/workflow/proxyActivities.d.ts +20 -0
  105. package/build/services/memflow/workflow/proxyActivities.js +97 -0
  106. package/build/services/memflow/workflow/random.d.ts +6 -0
  107. package/build/services/memflow/workflow/random.js +16 -0
  108. package/build/services/memflow/workflow/searchMethods.d.ts +6 -0
  109. package/build/services/memflow/workflow/searchMethods.js +25 -0
  110. package/build/services/memflow/workflow/signal.d.ts +7 -0
  111. package/build/services/memflow/workflow/signal.js +28 -0
  112. package/build/services/memflow/workflow/sleepFor.d.ts +8 -0
  113. package/build/services/memflow/workflow/sleepFor.js +35 -0
  114. package/build/services/memflow/workflow/trace.d.ts +14 -0
  115. package/build/services/memflow/workflow/trace.js +33 -0
  116. package/build/services/memflow/workflow/waitFor.d.ts +8 -0
  117. package/build/services/memflow/workflow/waitFor.js +35 -0
  118. package/build/services/meshcall/index.d.ts +194 -0
  119. package/build/services/meshcall/index.js +452 -0
  120. package/build/services/meshcall/schemas/factory.d.ts +9 -0
  121. package/build/services/meshcall/schemas/factory.js +189 -0
  122. package/build/services/meshdata/index.d.ts +795 -0
  123. package/build/services/meshdata/index.js +1235 -0
  124. package/build/services/meshos/index.d.ts +293 -0
  125. package/build/services/meshos/index.js +547 -0
  126. package/build/services/pipe/functions/array.d.ts +17 -0
  127. package/build/services/pipe/functions/array.js +74 -0
  128. package/build/services/pipe/functions/bitwise.d.ts +9 -0
  129. package/build/services/pipe/functions/bitwise.js +24 -0
  130. package/build/services/pipe/functions/conditional.d.ts +13 -0
  131. package/build/services/pipe/functions/conditional.js +36 -0
  132. package/build/services/pipe/functions/cron.d.ts +12 -0
  133. package/build/services/pipe/functions/cron.js +40 -0
  134. package/build/services/pipe/functions/date.d.ts +58 -0
  135. package/build/services/pipe/functions/date.js +171 -0
  136. package/build/services/pipe/functions/index.d.ts +29 -0
  137. package/build/services/pipe/functions/index.js +30 -0
  138. package/build/services/pipe/functions/json.d.ts +5 -0
  139. package/build/services/pipe/functions/json.js +12 -0
  140. package/build/services/pipe/functions/logical.d.ts +5 -0
  141. package/build/services/pipe/functions/logical.js +12 -0
  142. package/build/services/pipe/functions/math.d.ts +42 -0
  143. package/build/services/pipe/functions/math.js +184 -0
  144. package/build/services/pipe/functions/number.d.ts +21 -0
  145. package/build/services/pipe/functions/number.js +60 -0
  146. package/build/services/pipe/functions/object.d.ts +25 -0
  147. package/build/services/pipe/functions/object.js +81 -0
  148. package/build/services/pipe/functions/string.d.ts +23 -0
  149. package/build/services/pipe/functions/string.js +69 -0
  150. package/build/services/pipe/functions/symbol.d.ts +12 -0
  151. package/build/services/pipe/functions/symbol.js +33 -0
  152. package/build/services/pipe/functions/unary.d.ts +7 -0
  153. package/build/services/pipe/functions/unary.js +18 -0
  154. package/build/services/pipe/index.d.ts +48 -0
  155. package/build/services/pipe/index.js +242 -0
  156. package/build/services/quorum/index.d.ts +90 -0
  157. package/build/services/quorum/index.js +263 -0
  158. package/build/services/reporter/index.d.ts +50 -0
  159. package/build/services/reporter/index.js +348 -0
  160. package/build/services/router/config/index.d.ts +11 -0
  161. package/build/services/router/config/index.js +36 -0
  162. package/build/services/router/consumption/index.d.ts +34 -0
  163. package/build/services/router/consumption/index.js +395 -0
  164. package/build/services/router/error-handling/index.d.ts +8 -0
  165. package/build/services/router/error-handling/index.js +98 -0
  166. package/build/services/router/index.d.ts +57 -0
  167. package/build/services/router/index.js +121 -0
  168. package/build/services/router/lifecycle/index.d.ts +27 -0
  169. package/build/services/router/lifecycle/index.js +80 -0
  170. package/build/services/router/telemetry/index.d.ts +11 -0
  171. package/build/services/router/telemetry/index.js +32 -0
  172. package/build/services/router/throttling/index.d.ts +23 -0
  173. package/build/services/router/throttling/index.js +76 -0
  174. package/build/services/search/factory.d.ts +7 -0
  175. package/build/services/search/factory.js +24 -0
  176. package/build/services/search/index.d.ts +23 -0
  177. package/build/services/search/index.js +10 -0
  178. package/build/services/search/providers/postgres/postgres.d.ts +25 -0
  179. package/build/services/search/providers/postgres/postgres.js +149 -0
  180. package/build/services/search/providers/redis/ioredis.d.ts +19 -0
  181. package/build/services/search/providers/redis/ioredis.js +121 -0
  182. package/build/services/search/providers/redis/redis.d.ts +19 -0
  183. package/build/services/search/providers/redis/redis.js +134 -0
  184. package/build/services/serializer/index.d.ts +42 -0
  185. package/build/services/serializer/index.js +282 -0
  186. package/build/services/store/cache.d.ts +67 -0
  187. package/build/services/store/cache.js +128 -0
  188. package/build/services/store/factory.d.ts +8 -0
  189. package/build/services/store/factory.js +24 -0
  190. package/build/services/store/index.d.ts +89 -0
  191. package/build/services/store/index.js +9 -0
  192. package/build/services/store/providers/postgres/kvsql.d.ts +168 -0
  193. package/build/services/store/providers/postgres/kvsql.js +198 -0
  194. package/build/services/store/providers/postgres/kvtables.d.ts +20 -0
  195. package/build/services/store/providers/postgres/kvtables.js +441 -0
  196. package/build/services/store/providers/postgres/kvtransaction.d.ts +36 -0
  197. package/build/services/store/providers/postgres/kvtransaction.js +248 -0
  198. package/build/services/store/providers/postgres/kvtypes/hash.d.ts +60 -0
  199. package/build/services/store/providers/postgres/kvtypes/hash.js +1287 -0
  200. package/build/services/store/providers/postgres/kvtypes/list.d.ts +33 -0
  201. package/build/services/store/providers/postgres/kvtypes/list.js +194 -0
  202. package/build/services/store/providers/postgres/kvtypes/string.d.ts +20 -0
  203. package/build/services/store/providers/postgres/kvtypes/string.js +115 -0
  204. package/build/services/store/providers/postgres/kvtypes/zset.d.ts +41 -0
  205. package/build/services/store/providers/postgres/kvtypes/zset.js +214 -0
  206. package/build/services/store/providers/postgres/postgres.d.ts +145 -0
  207. package/build/services/store/providers/postgres/postgres.js +1036 -0
  208. package/build/services/store/providers/redis/_base.d.ts +137 -0
  209. package/build/services/store/providers/redis/_base.js +980 -0
  210. package/build/services/store/providers/redis/ioredis.d.ts +20 -0
  211. package/build/services/store/providers/redis/ioredis.js +180 -0
  212. package/build/services/store/providers/redis/redis.d.ts +18 -0
  213. package/build/services/store/providers/redis/redis.js +199 -0
  214. package/build/services/store/providers/store-initializable.d.ts +5 -0
  215. package/build/services/store/providers/store-initializable.js +2 -0
  216. package/build/services/stream/factory.d.ts +8 -0
  217. package/build/services/stream/factory.js +37 -0
  218. package/build/services/stream/index.d.ts +69 -0
  219. package/build/services/stream/index.js +11 -0
  220. package/build/services/stream/providers/nats/nats.d.ts +60 -0
  221. package/build/services/stream/providers/nats/nats.js +225 -0
  222. package/build/services/stream/providers/postgres/kvtables.d.ts +3 -0
  223. package/build/services/stream/providers/postgres/kvtables.js +146 -0
  224. package/build/services/stream/providers/postgres/postgres.d.ts +107 -0
  225. package/build/services/stream/providers/postgres/postgres.js +519 -0
  226. package/build/services/stream/providers/redis/ioredis.d.ts +61 -0
  227. package/build/services/stream/providers/redis/ioredis.js +272 -0
  228. package/build/services/stream/providers/redis/redis.d.ts +61 -0
  229. package/build/services/stream/providers/redis/redis.js +305 -0
  230. package/build/services/stream/providers/stream-initializable.d.ts +4 -0
  231. package/build/services/stream/providers/stream-initializable.js +2 -0
  232. package/build/services/sub/factory.d.ts +7 -0
  233. package/build/services/sub/factory.js +29 -0
  234. package/build/services/sub/index.d.ts +22 -0
  235. package/build/services/sub/index.js +10 -0
  236. package/build/services/sub/providers/nats/nats.d.ts +19 -0
  237. package/build/services/sub/providers/nats/nats.js +105 -0
  238. package/build/services/sub/providers/postgres/postgres.d.ts +19 -0
  239. package/build/services/sub/providers/postgres/postgres.js +92 -0
  240. package/build/services/sub/providers/redis/ioredis.d.ts +17 -0
  241. package/build/services/sub/providers/redis/ioredis.js +81 -0
  242. package/build/services/sub/providers/redis/redis.d.ts +17 -0
  243. package/build/services/sub/providers/redis/redis.js +72 -0
  244. package/build/services/task/index.d.ts +36 -0
  245. package/build/services/task/index.js +206 -0
  246. package/build/services/telemetry/index.d.ts +52 -0
  247. package/build/services/telemetry/index.js +306 -0
  248. package/build/services/worker/index.d.ts +77 -0
  249. package/build/services/worker/index.js +197 -0
  250. package/package.json +1 -1
  251. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -38
  252. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
  253. package/typedoc.json +0 -47
  254. package/types/activity.ts +0 -268
  255. package/types/app.ts +0 -20
  256. package/types/async.ts +0 -6
  257. package/types/cache.ts +0 -1
  258. package/types/collator.ts +0 -9
  259. package/types/error.ts +0 -56
  260. package/types/exporter.ts +0 -102
  261. package/types/hook.ts +0 -44
  262. package/types/hotmesh.ts +0 -314
  263. package/types/index.ts +0 -306
  264. package/types/job.ts +0 -233
  265. package/types/logger.ts +0 -8
  266. package/types/manifest.ts +0 -70
  267. package/types/map.ts +0 -5
  268. package/types/memflow.ts +0 -645
  269. package/types/meshcall.ts +0 -235
  270. package/types/meshdata.ts +0 -278
  271. package/types/ms.d.ts +0 -7
  272. package/types/nats.ts +0 -270
  273. package/types/pipe.ts +0 -90
  274. package/types/postgres.ts +0 -114
  275. package/types/provider.ts +0 -161
  276. package/types/quorum.ts +0 -167
  277. package/types/redis.ts +0 -404
  278. package/types/serializer.ts +0 -40
  279. package/types/stats.ts +0 -117
  280. package/types/stream.ts +0 -231
  281. package/types/task.ts +0 -7
  282. package/types/telemetry.ts +0 -16
  283. package/types/transition.ts +0 -20
@@ -0,0 +1,27 @@
1
+ import { ILogger } from '../../logger';
2
+ import { StreamService } from '../../stream';
3
+ import { ProviderClient, ProviderTransaction } from '../../../types/provider';
4
+ export declare class InstanceRegistry {
5
+ private static instances;
6
+ static add(router: any): void;
7
+ static remove(router: any): void;
8
+ static stopAll(): Promise<void>;
9
+ static getInstances(): Set<any>;
10
+ }
11
+ export declare class LifecycleManager<S extends StreamService<ProviderClient, ProviderTransaction>> {
12
+ private shouldConsume;
13
+ private readonly;
14
+ private topic;
15
+ private logger;
16
+ private stream;
17
+ private isUsingNotifications;
18
+ constructor(readonly: boolean, topic: string | undefined, logger: ILogger, stream: S);
19
+ getShouldConsume(): boolean;
20
+ setShouldConsume(value: boolean): void;
21
+ getIsUsingNotifications(): boolean;
22
+ setIsUsingNotifications(value: boolean): void;
23
+ isReadonly(): boolean;
24
+ isStopped(group: string, consumer: string, stream: string): boolean;
25
+ startConsuming(router: any): Promise<void>;
26
+ stopConsuming(router: any): Promise<void>;
27
+ }
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LifecycleManager = exports.InstanceRegistry = void 0;
4
+ const utils_1 = require("../../../modules/utils");
5
+ const config_1 = require("../config");
6
+ class InstanceRegistry {
7
+ static add(router) {
8
+ InstanceRegistry.instances.add(router);
9
+ }
10
+ static remove(router) {
11
+ InstanceRegistry.instances.delete(router);
12
+ }
13
+ static async stopAll() {
14
+ const stopPromises = [];
15
+ for (const instance of [...InstanceRegistry.instances]) {
16
+ stopPromises.push(instance.stopConsuming());
17
+ }
18
+ await Promise.all(stopPromises);
19
+ await (0, utils_1.sleepFor)(config_1.HMSH_BLOCK_TIME_MS * 2);
20
+ }
21
+ static getInstances() {
22
+ return new Set(InstanceRegistry.instances);
23
+ }
24
+ }
25
+ InstanceRegistry.instances = new Set();
26
+ exports.InstanceRegistry = InstanceRegistry;
27
+ class LifecycleManager {
28
+ constructor(readonly, topic, logger, stream) {
29
+ this.shouldConsume = false;
30
+ this.isUsingNotifications = false;
31
+ this.readonly = readonly;
32
+ this.topic = topic;
33
+ this.logger = logger;
34
+ this.stream = stream;
35
+ }
36
+ getShouldConsume() {
37
+ return this.shouldConsume;
38
+ }
39
+ setShouldConsume(value) {
40
+ this.shouldConsume = value;
41
+ }
42
+ getIsUsingNotifications() {
43
+ return this.isUsingNotifications;
44
+ }
45
+ setIsUsingNotifications(value) {
46
+ this.isUsingNotifications = value;
47
+ }
48
+ isReadonly() {
49
+ return this.readonly;
50
+ }
51
+ isStopped(group, consumer, stream) {
52
+ if (!this.shouldConsume) {
53
+ this.logger.info(`router-stream-stopped`, {
54
+ group,
55
+ consumer,
56
+ stream,
57
+ });
58
+ }
59
+ return !this.shouldConsume;
60
+ }
61
+ async startConsuming(router) {
62
+ this.shouldConsume = true;
63
+ InstanceRegistry.add(router);
64
+ }
65
+ async stopConsuming(router) {
66
+ this.shouldConsume = false;
67
+ this.logger.info(`router-stream-stopping`, this.topic ? { topic: this.topic } : undefined);
68
+ InstanceRegistry.remove(router);
69
+ // If using notifications, properly clean up
70
+ if (this.isUsingNotifications && this.stream.stopNotificationConsumer) {
71
+ try {
72
+ await this.stream.cleanup?.();
73
+ }
74
+ catch (error) {
75
+ this.logger.error('router-stream-cleanup-error', { error });
76
+ }
77
+ }
78
+ }
79
+ }
80
+ exports.LifecycleManager = LifecycleManager;
@@ -0,0 +1,11 @@
1
+ import { StreamData, StreamRole } from '../../../types/stream';
2
+ export declare class RouterTelemetry {
3
+ private telemetryService;
4
+ constructor(appId: string);
5
+ startStreamSpan(input: StreamData, role: StreamRole): void;
6
+ setStreamError(error: string): void;
7
+ setStreamErrorFromOutput(output: any): void;
8
+ setStreamErrorFromException(err: Error): void;
9
+ setStreamAttributes(attributes: Record<string, any>): void;
10
+ endStreamSpan(): void;
11
+ }
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RouterTelemetry = void 0;
4
+ const telemetry_1 = require("../../telemetry");
5
+ const stream_1 = require("../../../types/stream");
6
+ const config_1 = require("../config");
7
+ class RouterTelemetry {
8
+ constructor(appId) {
9
+ this.telemetryService = new telemetry_1.TelemetryService(appId);
10
+ }
11
+ startStreamSpan(input, role) {
12
+ this.telemetryService.startStreamSpan(input, role);
13
+ }
14
+ setStreamError(error) {
15
+ this.telemetryService.setStreamError(error);
16
+ }
17
+ setStreamErrorFromOutput(output) {
18
+ if (output?.status === stream_1.StreamStatus.ERROR) {
19
+ this.telemetryService.setStreamError(`Function Status Code ${output.code || config_1.HMSH_CODE_UNKNOWN}`);
20
+ }
21
+ }
22
+ setStreamErrorFromException(err) {
23
+ this.telemetryService.setStreamError(err.message);
24
+ }
25
+ setStreamAttributes(attributes) {
26
+ this.telemetryService.setStreamAttributes(attributes);
27
+ }
28
+ endStreamSpan() {
29
+ this.telemetryService.endStreamSpan();
30
+ }
31
+ }
32
+ exports.RouterTelemetry = RouterTelemetry;
@@ -0,0 +1,23 @@
1
+ export declare class ThrottleManager {
2
+ private throttle;
3
+ private isSleeping;
4
+ private sleepPromiseResolve;
5
+ private innerPromiseResolve;
6
+ private sleepTimeout;
7
+ constructor(initialThrottle?: number);
8
+ getThrottle(): number;
9
+ setThrottle(delayInMillis: number): void;
10
+ isPaused(): boolean;
11
+ /**
12
+ * An adjustable throttle that will interrupt a sleeping
13
+ * router if the throttle is reduced and the sleep time
14
+ * has elapsed. If the throttle is increased, or if
15
+ * the sleep time has not elapsed, the router will continue
16
+ * to sleep until the new termination point. This
17
+ * allows for dynamic, elastic throttling with smooth
18
+ * acceleration and deceleration.
19
+ */
20
+ customSleep(): Promise<void>;
21
+ cancelThrottle(): void;
22
+ private resetThrottleState;
23
+ }
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ThrottleManager = void 0;
4
+ const config_1 = require("../config");
5
+ class ThrottleManager {
6
+ constructor(initialThrottle = 0) {
7
+ this.throttle = 0;
8
+ this.isSleeping = false;
9
+ this.sleepPromiseResolve = null;
10
+ this.innerPromiseResolve = null;
11
+ this.sleepTimeout = null;
12
+ this.throttle = initialThrottle;
13
+ }
14
+ getThrottle() {
15
+ return this.throttle;
16
+ }
17
+ setThrottle(delayInMillis) {
18
+ const wasDecreased = delayInMillis < this.throttle;
19
+ this.throttle = delayInMillis;
20
+ // If the throttle was decreased, and we're in the middle of a sleep cycle, adjust immediately
21
+ if (wasDecreased) {
22
+ if (this.sleepTimeout) {
23
+ clearTimeout(this.sleepTimeout);
24
+ }
25
+ if (this.innerPromiseResolve) {
26
+ this.innerPromiseResolve();
27
+ }
28
+ }
29
+ }
30
+ isPaused() {
31
+ return this.throttle === config_1.MAX_DELAY;
32
+ }
33
+ /**
34
+ * An adjustable throttle that will interrupt a sleeping
35
+ * router if the throttle is reduced and the sleep time
36
+ * has elapsed. If the throttle is increased, or if
37
+ * the sleep time has not elapsed, the router will continue
38
+ * to sleep until the new termination point. This
39
+ * allows for dynamic, elastic throttling with smooth
40
+ * acceleration and deceleration.
41
+ */
42
+ async customSleep() {
43
+ if (this.throttle === 0)
44
+ return;
45
+ if (this.isSleeping)
46
+ return;
47
+ this.isSleeping = true;
48
+ const startTime = Date.now(); //anchor the origin
49
+ await new Promise(async (outerResolve) => {
50
+ this.sleepPromiseResolve = outerResolve;
51
+ let elapsedTime = Date.now() - startTime;
52
+ while (elapsedTime < this.throttle) {
53
+ await new Promise((innerResolve) => {
54
+ this.innerPromiseResolve = innerResolve;
55
+ this.sleepTimeout = setTimeout(innerResolve, this.throttle - elapsedTime);
56
+ });
57
+ elapsedTime = Date.now() - startTime;
58
+ }
59
+ this.resetThrottleState();
60
+ outerResolve();
61
+ });
62
+ }
63
+ cancelThrottle() {
64
+ if (this.sleepTimeout) {
65
+ clearTimeout(this.sleepTimeout);
66
+ }
67
+ this.resetThrottleState();
68
+ }
69
+ resetThrottleState() {
70
+ this.sleepPromiseResolve = null;
71
+ this.innerPromiseResolve = null;
72
+ this.isSleeping = false;
73
+ this.sleepTimeout = null;
74
+ }
75
+ }
76
+ exports.ThrottleManager = ThrottleManager;
@@ -0,0 +1,7 @@
1
+ import { ILogger } from '../logger';
2
+ import { ProviderClient } from '../../types/provider';
3
+ import { SearchService } from './index';
4
+ declare class SearchServiceFactory {
5
+ static init(providerClient: ProviderClient, storeProviderClient: ProviderClient | undefined, namespace: string, appId: string, logger: ILogger): Promise<SearchService<ProviderClient>>;
6
+ }
7
+ export { SearchServiceFactory };
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SearchServiceFactory = void 0;
4
+ const utils_1 = require("../../modules/utils");
5
+ const postgres_1 = require("./providers/postgres/postgres");
6
+ const ioredis_1 = require("./providers/redis/ioredis");
7
+ const redis_1 = require("./providers/redis/redis");
8
+ class SearchServiceFactory {
9
+ static async init(providerClient, storeProviderClient, namespace, appId, logger) {
10
+ let service;
11
+ if ((0, utils_1.identifyProvider)(providerClient) === 'postgres') {
12
+ service = new postgres_1.PostgresSearchService(providerClient, storeProviderClient);
13
+ }
14
+ else if ((0, utils_1.identifyProvider)(providerClient) === 'redis') {
15
+ service = new redis_1.RedisSearchService(providerClient, storeProviderClient);
16
+ }
17
+ else {
18
+ service = new ioredis_1.IORedisSearchService(providerClient, storeProviderClient);
19
+ }
20
+ await service.init(namespace, appId, logger);
21
+ return service;
22
+ }
23
+ }
24
+ exports.SearchServiceFactory = SearchServiceFactory;
@@ -0,0 +1,23 @@
1
+ import { ILogger } from '../logger';
2
+ import { ProviderClient } from '../../types/provider';
3
+ declare abstract class SearchService<ClientProvider extends ProviderClient> {
4
+ protected searchClient: ClientProvider;
5
+ protected storeClient: ClientProvider;
6
+ protected namespace: string;
7
+ protected logger: ILogger;
8
+ protected appId: string;
9
+ constructor(searchClient: ClientProvider, storeClient?: ClientProvider);
10
+ abstract init(namespace: string, appId: string, logger: ILogger): Promise<void>;
11
+ abstract createSearchIndex(indexName: string, prefixes: string[], schema: string[]): Promise<void>;
12
+ abstract listSearchIndexes(): Promise<string[]>;
13
+ abstract setFields(key: string, fields: Record<string, string>): Promise<any>;
14
+ abstract updateContext(key: string, fields: Record<string, string>): Promise<any>;
15
+ abstract getField(key: string, field: string): Promise<string>;
16
+ abstract getFields(key: string, fields: string[]): Promise<string[]>;
17
+ abstract getAllFields(key: string): Promise<Record<string, string>>;
18
+ abstract deleteFields(key: string, fields: string[]): Promise<number>;
19
+ abstract incrementFieldByFloat(key: string, field: string, increment: number): Promise<number>;
20
+ abstract sendQuery(query: any): Promise<any>;
21
+ abstract sendIndexedQuery(index: string, query: any[]): Promise<any>;
22
+ }
23
+ export { SearchService };
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SearchService = void 0;
4
+ class SearchService {
5
+ constructor(searchClient, storeClient) {
6
+ this.searchClient = searchClient;
7
+ this.storeClient = storeClient;
8
+ }
9
+ }
10
+ exports.SearchService = SearchService;
@@ -0,0 +1,25 @@
1
+ import { SearchService } from '../../index';
2
+ import { ILogger } from '../../../logger';
3
+ import { PostgresClientType } from '../../../../types/postgres';
4
+ import { ProviderClient, ProviderTransaction } from '../../../../types/provider';
5
+ declare class PostgresSearchService extends SearchService<PostgresClientType & ProviderClient> {
6
+ pgClient: PostgresClientType;
7
+ transact(): ProviderTransaction;
8
+ constructor(searchClient: PostgresClientType & ProviderClient, storeClient?: PostgresClientType & ProviderClient);
9
+ init(namespace: string, appId: string, logger: ILogger): Promise<void>;
10
+ createSearchIndex(indexName: string, prefixes: string[], schema: string[]): Promise<void>;
11
+ listSearchIndexes(): Promise<string[]>;
12
+ updateContext(key: string, fields: Record<string, string>): Promise<any>;
13
+ setFields(key: string, fields: Record<string, string>): Promise<any>;
14
+ getField(key: string, field: string): Promise<string>;
15
+ getFields(key: string, fields: string[]): Promise<string[]>;
16
+ getAllFields(key: string): Promise<Record<string, string>>;
17
+ deleteFields(key: string, fields: string[]): Promise<number>;
18
+ incrementFieldByFloat(key: string, field: string, increment: number): Promise<number>;
19
+ sendQuery(query: string): Promise<any>;
20
+ /**
21
+ * assume aggregation type query
22
+ */
23
+ sendIndexedQuery(type: string, queryParams?: any[]): Promise<any[]>;
24
+ }
25
+ export { PostgresSearchService };
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PostgresSearchService = void 0;
4
+ const index_1 = require("../../index");
5
+ const kvsql_1 = require("../../../store/providers/postgres/kvsql");
6
+ class PostgresSearchService extends index_1.SearchService {
7
+ transact() {
8
+ return this.storeClient.transact();
9
+ }
10
+ constructor(searchClient, storeClient) {
11
+ super(searchClient, storeClient);
12
+ this.pgClient = searchClient; //raw pg client (to send raw sql)
13
+ this.searchClient = new kvsql_1.KVSQL(//wrapped pg client (to send as redis commands)
14
+ searchClient, this.namespace, this.appId);
15
+ }
16
+ async init(namespace, appId, logger) {
17
+ //bind appId and namespace to searchClient once initialized
18
+ // (it uses these values to construct keys for the store)
19
+ this.searchClient.namespace = this.namespace = namespace;
20
+ this.searchClient.appId = this.appId = appId;
21
+ this.namespace = namespace;
22
+ this.appId = appId;
23
+ this.logger = logger;
24
+ }
25
+ async createSearchIndex(indexName, prefixes, schema) {
26
+ //no-op
27
+ }
28
+ async listSearchIndexes() {
29
+ return [];
30
+ }
31
+ async updateContext(key, fields) {
32
+ try {
33
+ const result = await this.searchClient.hset(key, fields);
34
+ return isNaN(result) ? result : Number(result);
35
+ }
36
+ catch (error) {
37
+ this.logger.error(`postgres-search-set-fields-error`, { key, error });
38
+ throw error;
39
+ }
40
+ }
41
+ async setFields(key, fields) {
42
+ try {
43
+ const result = await this.searchClient.hset(key, fields);
44
+ const isGetOperation = '@context:get' in fields;
45
+ if (isGetOperation) {
46
+ return result;
47
+ }
48
+ return isNaN(result) ? result : Number(result);
49
+ }
50
+ catch (error) {
51
+ this.logger.error(`postgres-search-set-fields-error`, { key, error });
52
+ throw error;
53
+ }
54
+ }
55
+ async getField(key, field) {
56
+ try {
57
+ return await this.searchClient.hget(key, field);
58
+ }
59
+ catch (error) {
60
+ this.logger.error(`postgres-search-get-field-error`, {
61
+ key,
62
+ field,
63
+ error,
64
+ });
65
+ throw error;
66
+ }
67
+ }
68
+ async getFields(key, fields) {
69
+ try {
70
+ return await this.searchClient.hmget(key, [...fields]);
71
+ }
72
+ catch (error) {
73
+ this.logger.error(`postgres-search-get-fields-error`, {
74
+ key,
75
+ fields,
76
+ error,
77
+ });
78
+ throw error;
79
+ }
80
+ }
81
+ async getAllFields(key) {
82
+ try {
83
+ return await this.searchClient.hgetall(key);
84
+ }
85
+ catch (error) {
86
+ this.logger.error(`postgres-search-get-all-fields-error`, {
87
+ key,
88
+ error,
89
+ });
90
+ throw error;
91
+ }
92
+ }
93
+ async deleteFields(key, fields) {
94
+ try {
95
+ const result = await this.searchClient.hdel(key, fields);
96
+ return Number(result);
97
+ }
98
+ catch (error) {
99
+ this.logger.error(`postgres-search-delete-fields-error`, {
100
+ key,
101
+ fields,
102
+ error,
103
+ });
104
+ throw error;
105
+ }
106
+ }
107
+ async incrementFieldByFloat(key, field, increment) {
108
+ try {
109
+ const result = await this.searchClient.hincrbyfloat(key, field, increment);
110
+ return Number(result);
111
+ }
112
+ catch (error) {
113
+ this.logger.error(`postgres-increment-field-error`, {
114
+ key,
115
+ field,
116
+ error,
117
+ });
118
+ throw error;
119
+ }
120
+ }
121
+ async sendQuery(query) {
122
+ try {
123
+ //exec raw sql (local call, not meant for external use); return raw result
124
+ return await this.pgClient.query(query);
125
+ }
126
+ catch (error) {
127
+ this.logger.error(`postgres-send-query-error`, { query, error });
128
+ throw error;
129
+ }
130
+ }
131
+ /**
132
+ * assume aggregation type query
133
+ */
134
+ async sendIndexedQuery(type, queryParams = []) {
135
+ const [sql, ...params] = queryParams;
136
+ try {
137
+ const res = await this.pgClient.query(sql, params.length ? params : undefined);
138
+ return res.rows;
139
+ }
140
+ catch (error) {
141
+ this.logger.error(`postgres-send-indexed-query-error`, {
142
+ query: sql,
143
+ error,
144
+ });
145
+ throw error;
146
+ }
147
+ }
148
+ }
149
+ exports.PostgresSearchService = PostgresSearchService;
@@ -0,0 +1,19 @@
1
+ import { SearchService } from '../../index';
2
+ import { ILogger } from '../../../logger';
3
+ import { IORedisClientType } from '../../../../types/redis';
4
+ declare class IORedisSearchService extends SearchService<IORedisClientType> {
5
+ constructor(searchClient: IORedisClientType, storeClient?: IORedisClientType);
6
+ init(namespace: string, appId: string, logger: ILogger): Promise<void>;
7
+ createSearchIndex(indexName: string, prefixes: string[], schema: string[]): Promise<void>;
8
+ listSearchIndexes(): Promise<string[]>;
9
+ updateContext(key: string, fields: Record<string, string>): Promise<any>;
10
+ setFields(key: string, fields: Record<string, string>): Promise<number>;
11
+ getField(key: string, field: string): Promise<string>;
12
+ getFields(key: string, fields: string[]): Promise<string[]>;
13
+ getAllFields(key: string): Promise<Record<string, string>>;
14
+ deleteFields(key: string, fields: string[]): Promise<number>;
15
+ incrementFieldByFloat(key: string, field: string, increment: number): Promise<number>;
16
+ sendQuery(...query: [string, ...string[]]): Promise<any>;
17
+ sendIndexedQuery(index: string, query: string[]): Promise<string[]>;
18
+ }
19
+ export { IORedisSearchService };
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IORedisSearchService = void 0;
4
+ const index_1 = require("../../index");
5
+ class IORedisSearchService extends index_1.SearchService {
6
+ constructor(searchClient, storeClient) {
7
+ super(searchClient, storeClient);
8
+ }
9
+ async init(namespace, appId, logger) {
10
+ this.namespace = namespace;
11
+ this.appId = appId;
12
+ this.logger = logger;
13
+ }
14
+ async createSearchIndex(indexName, prefixes, schema) {
15
+ try {
16
+ await this.searchClient.call('FT.CREATE', indexName, 'ON', 'HASH', 'PREFIX', prefixes.length.toString(), ...prefixes, 'SCHEMA', ...schema);
17
+ }
18
+ catch (error) {
19
+ this.logger.info('Error creating search index', { error });
20
+ throw error;
21
+ }
22
+ }
23
+ async listSearchIndexes() {
24
+ try {
25
+ const indexes = await this.searchClient.call('FT._LIST');
26
+ return indexes;
27
+ }
28
+ catch (error) {
29
+ this.logger.info('Error listing search indexes', { error });
30
+ throw error;
31
+ }
32
+ }
33
+ async updateContext(key, fields) {
34
+ //no-op;
35
+ throw new Error('Not implemented');
36
+ }
37
+ async setFields(key, fields) {
38
+ try {
39
+ const result = await this.searchClient.hset(key, fields);
40
+ return Number(result);
41
+ }
42
+ catch (error) {
43
+ this.logger.error(`Error setting fields for key: ${key}`, { error });
44
+ throw error;
45
+ }
46
+ }
47
+ async getField(key, field) {
48
+ try {
49
+ return await this.searchClient.hget(key, field);
50
+ }
51
+ catch (error) {
52
+ this.logger.error(`Error getting field ${field} for key: ${key}`, {
53
+ error,
54
+ });
55
+ throw error;
56
+ }
57
+ }
58
+ async getFields(key, fields) {
59
+ try {
60
+ return await this.searchClient.hmget(key, [...fields]);
61
+ }
62
+ catch (error) {
63
+ this.logger.error(`Error getting fields for key: ${key}`, { error });
64
+ throw error;
65
+ }
66
+ }
67
+ async getAllFields(key) {
68
+ try {
69
+ return await this.searchClient.hgetall(key);
70
+ }
71
+ catch (error) {
72
+ this.logger.error(`Error getting fields for key: ${key}`, { error });
73
+ throw error;
74
+ }
75
+ }
76
+ async deleteFields(key, fields) {
77
+ try {
78
+ const result = await this.searchClient.hdel(key, ...fields);
79
+ return Number(result);
80
+ }
81
+ catch (error) {
82
+ this.logger.error(`Error deleting fields for key: ${key}`, { error });
83
+ throw error;
84
+ }
85
+ }
86
+ async incrementFieldByFloat(key, field, increment) {
87
+ try {
88
+ const result = await this.searchClient.hincrbyfloat(key, field, increment);
89
+ return Number(result);
90
+ }
91
+ catch (error) {
92
+ this.logger.error(`Error incrementing field ${field} for key: ${key}`, {
93
+ error,
94
+ });
95
+ throw error;
96
+ }
97
+ }
98
+ async sendQuery(...query) {
99
+ try {
100
+ return await this.searchClient.call(...query);
101
+ }
102
+ catch (error) {
103
+ this.logger.error('Error executing query', { error });
104
+ throw error;
105
+ }
106
+ }
107
+ async sendIndexedQuery(index, query) {
108
+ try {
109
+ if (query[0]?.startsWith('FT.')) {
110
+ const [cmd, ...rest] = query;
111
+ return (await this.searchClient.call(cmd, ...rest));
112
+ }
113
+ return (await this.searchClient.call('FT.SEARCH', index, ...query));
114
+ }
115
+ catch (error) {
116
+ this.logger.error('Error executing query', { error });
117
+ throw error;
118
+ }
119
+ }
120
+ }
121
+ exports.IORedisSearchService = IORedisSearchService;
@@ -0,0 +1,19 @@
1
+ import { SearchService } from '../../index';
2
+ import { ILogger } from '../../../logger';
3
+ import { RedisRedisClientType } from '../../../../types/redis';
4
+ declare class RedisSearchService extends SearchService<RedisRedisClientType> {
5
+ constructor(searchClient: RedisRedisClientType, storeClient?: RedisRedisClientType);
6
+ init(namespace: string, appId: string, logger: ILogger): Promise<void>;
7
+ createSearchIndex(indexName: string, prefixes: string[], schema: string[]): Promise<void>;
8
+ listSearchIndexes(): Promise<string[]>;
9
+ updateContext(key: string, fields: Record<string, string>): Promise<any>;
10
+ setFields(key: string, fields: Record<string, string>): Promise<number>;
11
+ getField(key: string, field: string): Promise<string>;
12
+ getFields(key: string, fields: string[]): Promise<string[]>;
13
+ getAllFields(key: string): Promise<Record<string, string>>;
14
+ deleteFields(key: string, fields: string[]): Promise<number>;
15
+ incrementFieldByFloat(key: string, field: string, increment: number): Promise<number>;
16
+ sendQuery(...query: any[]): Promise<any>;
17
+ sendIndexedQuery(index: string, query: string[]): Promise<string[]>;
18
+ }
19
+ export { RedisSearchService };