@hotmeshio/hotmesh 0.3.6 → 0.3.8

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 (124) hide show
  1. package/README.md +13 -1
  2. package/build/index.d.ts +3 -1
  3. package/build/index.js +10 -1
  4. package/build/modules/key.js +1 -62
  5. package/build/modules/utils.js +1 -267
  6. package/build/package.json +12 -8
  7. package/build/services/activities/activity.js +1 -495
  8. package/build/services/activities/await.js +1 -109
  9. package/build/services/activities/cycle.js +1 -96
  10. package/build/services/activities/hook.js +1 -154
  11. package/build/services/activities/index.js +1 -20
  12. package/build/services/activities/interrupt.js +1 -149
  13. package/build/services/activities/signal.js +1 -118
  14. package/build/services/activities/trigger.js +1 -237
  15. package/build/services/activities/worker.js +1 -101
  16. package/build/services/collator/index.js +1 -197
  17. package/build/services/compiler/deployer.d.ts +3 -1
  18. package/build/services/compiler/deployer.js +1 -455
  19. package/build/services/compiler/index.d.ts +3 -1
  20. package/build/services/compiler/index.js +1 -91
  21. package/build/services/compiler/validator.js +1 -122
  22. package/build/services/engine/index.d.ts +5 -2
  23. package/build/services/engine/index.js +1 -562
  24. package/build/services/exporter/index.js +1 -93
  25. package/build/services/mapper/index.js +1 -67
  26. package/build/services/meshdata/index.d.ts +0 -1
  27. package/build/services/meshdata/index.js +16 -24
  28. package/build/services/meshflow/client.js +4 -8
  29. package/build/services/meshflow/exporter.js +1 -186
  30. package/build/services/meshflow/index.d.ts +2 -0
  31. package/build/services/meshflow/index.js +2 -0
  32. package/build/services/meshflow/search.d.ts +4 -5
  33. package/build/services/meshflow/search.js +45 -35
  34. package/build/services/meshflow/workflow.d.ts +1 -1
  35. package/build/services/meshflow/workflow.js +3 -28
  36. package/build/services/pipe/functions/array.js +1 -74
  37. package/build/services/pipe/functions/bitwise.js +1 -24
  38. package/build/services/pipe/functions/conditional.js +1 -36
  39. package/build/services/pipe/functions/cron.js +1 -32
  40. package/build/services/pipe/functions/date.js +1 -164
  41. package/build/services/pipe/functions/index.js +1 -30
  42. package/build/services/pipe/functions/json.js +1 -12
  43. package/build/services/pipe/functions/logical.js +1 -12
  44. package/build/services/pipe/functions/math.js +1 -182
  45. package/build/services/pipe/functions/number.js +1 -60
  46. package/build/services/pipe/functions/object.js +1 -81
  47. package/build/services/pipe/functions/string.js +1 -69
  48. package/build/services/pipe/functions/symbol.js +1 -33
  49. package/build/services/pipe/functions/unary.js +1 -18
  50. package/build/services/pipe/index.js +1 -221
  51. package/build/services/quorum/index.d.ts +1 -1
  52. package/build/services/quorum/index.js +1 -219
  53. package/build/services/reporter/index.js +1 -331
  54. package/build/services/router/index.js +1 -420
  55. package/build/services/search/factory.d.ts +7 -0
  56. package/build/services/search/factory.js +20 -0
  57. package/build/services/search/index.d.ts +21 -0
  58. package/build/services/search/index.js +10 -0
  59. package/build/services/search/providers/redis/ioredis.d.ts +18 -0
  60. package/build/services/search/providers/redis/ioredis.js +1 -0
  61. package/build/services/search/providers/redis/redis.d.ts +18 -0
  62. package/build/services/search/providers/redis/redis.js +1 -0
  63. package/build/services/serializer/index.js +1 -265
  64. package/build/services/store/factory.d.ts +2 -1
  65. package/build/services/store/factory.js +2 -2
  66. package/build/services/store/index.d.ts +71 -97
  67. package/build/services/store/index.js +2 -939
  68. package/build/services/store/providers/postgres/postgres.d.ts +0 -0
  69. package/build/services/store/providers/postgres/postgres.js +0 -0
  70. package/build/services/store/providers/postgres/types/hash.d.ts +0 -0
  71. package/build/services/store/providers/postgres/types/hash.js +0 -0
  72. package/build/services/store/providers/postgres/types/list.d.ts +0 -0
  73. package/build/services/store/providers/postgres/types/list.js +0 -0
  74. package/build/services/store/providers/postgres/types/string.d.ts +0 -0
  75. package/build/services/store/providers/postgres/types/string.js +0 -0
  76. package/build/services/store/providers/postgres/types/zset.d.ts +0 -0
  77. package/build/services/store/providers/postgres/types/zset.js +0 -0
  78. package/build/services/store/providers/redis/_base.d.ts +98 -0
  79. package/build/services/store/providers/redis/_base.js +1 -0
  80. package/build/services/store/providers/redis/ioredis.d.ts +12 -0
  81. package/build/services/store/providers/redis/ioredis.js +1 -0
  82. package/build/services/store/providers/redis/redis.d.ts +13 -0
  83. package/build/services/store/providers/redis/redis.js +1 -0
  84. package/build/services/store/providers/store-initializable.d.ts +5 -0
  85. package/build/services/store/providers/store-initializable.js +1 -0
  86. package/build/services/stream/factory.d.ts +2 -1
  87. package/build/services/stream/factory.js +5 -5
  88. package/build/services/stream/index.d.ts +13 -14
  89. package/build/services/stream/index.js +3 -2
  90. package/build/services/stream/providers/postgres/_deploy.d.ts +4 -0
  91. package/build/services/stream/providers/postgres/_deploy.js +1 -0
  92. package/build/services/stream/providers/redis/ioredis.d.ts +21 -0
  93. package/build/services/stream/providers/redis/ioredis.js +1 -0
  94. package/build/services/stream/providers/redis/redis.d.ts +21 -0
  95. package/build/services/stream/providers/redis/redis.js +1 -0
  96. package/build/services/stream/providers/stream-initializable.d.ts +5 -0
  97. package/build/services/stream/providers/stream-initializable.js +1 -0
  98. package/build/services/sub/factory.d.ts +1 -1
  99. package/build/services/sub/factory.js +5 -5
  100. package/build/services/sub/index.d.ts +9 -7
  101. package/build/services/sub/index.js +3 -2
  102. package/build/services/sub/{clients → providers/redis}/ioredis.d.ts +7 -10
  103. package/build/services/sub/providers/redis/ioredis.js +1 -0
  104. package/build/services/sub/{clients → providers/redis}/redis.d.ts +7 -10
  105. package/build/services/sub/providers/redis/redis.js +1 -0
  106. package/build/services/task/index.js +1 -171
  107. package/build/services/telemetry/index.js +1 -225
  108. package/build/services/worker/index.d.ts +2 -2
  109. package/build/services/worker/index.js +1 -158
  110. package/build/types/redis.d.ts +5 -5
  111. package/index.ts +18 -1
  112. package/package.json +12 -8
  113. package/typedoc.json +2 -1
  114. package/types/redis.ts +5 -5
  115. package/build/services/store/clients/ioredis.d.ts +0 -30
  116. package/build/services/store/clients/ioredis.js +0 -220
  117. package/build/services/store/clients/redis.d.ts +0 -32
  118. package/build/services/store/clients/redis.js +0 -319
  119. package/build/services/stream/clients/ioredis.d.ts +0 -24
  120. package/build/services/stream/clients/ioredis.js +0 -121
  121. package/build/services/stream/clients/redis.d.ts +0 -24
  122. package/build/services/stream/clients/redis.js +0 -161
  123. package/build/services/sub/clients/ioredis.js +0 -72
  124. package/build/services/sub/clients/redis.js +0 -63
package/README.md CHANGED
@@ -1,12 +1,24 @@
1
1
  # HotMesh
2
2
  ![beta release](https://img.shields.io/badge/release-beta-blue.svg)
3
3
 
4
- **HotMesh** transforms **Redis** into indispensable **Middleware**. Connect **anything** to **everything**.
4
+ **HotMesh** offers "Temporal Your Way"—providing the power of orchestration platforms like Temporal.io in a flexible, decentralized manner. Replace everything with robust **Queues** and **Routers**...even the app server.
5
+
6
+ *Note: This is a beta release and currently focuses on TypeScript/Redis.*
7
+
8
+ ## Features
9
+
10
+ - **Temporal Your Way**: Orchestrate your microservices using message queues and routers, without the need for a central server.
11
+ - **Pluggable Middleware**: Mix and match technologies through a standard interface. Currently supporting **Redis/ValKey/Dragonfly/KVRocks**, with **Postgres**, **ElasticSearch**, and **NATS** coming next.
12
+ - **Decentralized Orchestration**: Build a resilient architecture with decentralized queues and routers.
13
+ - **Linear Scalability**: Scale your application by scaling the database.
14
+ - **Real-Time Analytics**: Gain insights into your workflows with real-time analytics.
5
15
 
6
16
  ## Install
17
+
7
18
  ```sh
8
19
  npm install @hotmeshio/hotmesh
9
20
  ```
21
+
10
22
  You have a Redis instance? Good. You're ready to go.
11
23
 
12
24
  ## Learn
package/build/index.d.ts CHANGED
@@ -4,5 +4,7 @@ import { MeshCall } from './services/meshcall';
4
4
  import { MeshFlow } from './services/meshflow';
5
5
  import { MeshData } from './services/meshdata';
6
6
  import { MeshOS } from './services/meshos';
7
- export { HotMesh, HotMeshConfig, MeshCall, MeshData, MeshFlow, MeshOS };
7
+ import * as Utils from './modules/utils';
8
+ declare const Client: typeof import("./services/meshflow/client").ClientService, Connection: typeof import("./services/meshflow/connection").ConnectionService, Handle: typeof import("./services/meshflow/handle").WorkflowHandleService, Search: typeof import("./services/meshflow/search").Search, Worker: typeof import("./services/meshflow/worker").WorkerService, workflow: typeof import("./services/meshflow/workflow").WorkflowService;
9
+ export { HotMesh, HotMeshConfig, MeshCall, MeshData, MeshOS, MeshFlow, Client, Connection, Handle, Search, Utils, Worker, workflow, };
8
10
  export * as Types from './types';
package/build/index.js CHANGED
@@ -23,7 +23,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
23
23
  return result;
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.Types = exports.MeshOS = exports.MeshFlow = exports.MeshData = exports.MeshCall = exports.HotMesh = void 0;
26
+ exports.Types = exports.workflow = exports.Worker = exports.Utils = exports.Search = exports.Handle = exports.Connection = exports.Client = exports.MeshFlow = exports.MeshOS = exports.MeshData = exports.MeshCall = exports.HotMesh = void 0;
27
27
  const hotmesh_1 = require("./services/hotmesh");
28
28
  Object.defineProperty(exports, "HotMesh", { enumerable: true, get: function () { return hotmesh_1.HotMesh; } });
29
29
  const meshcall_1 = require("./services/meshcall");
@@ -34,4 +34,13 @@ const meshdata_1 = require("./services/meshdata");
34
34
  Object.defineProperty(exports, "MeshData", { enumerable: true, get: function () { return meshdata_1.MeshData; } });
35
35
  const meshos_1 = require("./services/meshos");
36
36
  Object.defineProperty(exports, "MeshOS", { enumerable: true, get: function () { return meshos_1.MeshOS; } });
37
+ const Utils = __importStar(require("./modules/utils"));
38
+ exports.Utils = Utils;
39
+ const { Client, Connection, Handle, Search, Worker, workflow } = meshflow_1.MeshFlow;
40
+ exports.Client = Client;
41
+ exports.Connection = Connection;
42
+ exports.Handle = Handle;
43
+ exports.Search = Search;
44
+ exports.Worker = Worker;
45
+ exports.workflow = workflow;
37
46
  exports.Types = __importStar(require("./types"));
@@ -1,62 +1 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.VALSEP = exports.WEBSEP = exports.TYPSEP = exports.KEYSEP = exports.HMNS = exports.KeyType = exports.KeyService = void 0;
4
- const hotmesh_1 = require("../types/hotmesh");
5
- Object.defineProperty(exports, "KeyType", { enumerable: true, get: function () { return hotmesh_1.KeyType; } });
6
- const HMNS = 'hmsh';
7
- exports.HMNS = HMNS;
8
- const KEYSEP = ':';
9
- exports.KEYSEP = KEYSEP;
10
- const VALSEP = '::';
11
- exports.VALSEP = VALSEP;
12
- const WEBSEP = '::';
13
- exports.WEBSEP = WEBSEP;
14
- const TYPSEP = '::';
15
- exports.TYPSEP = TYPSEP;
16
- class KeyService {
17
- static mintKey(namespace, keyType, params) {
18
- switch (keyType) {
19
- case hotmesh_1.KeyType.HOTMESH:
20
- return namespace;
21
- case hotmesh_1.KeyType.THROTTLE_RATE:
22
- return `${namespace}:${params.appId}:r:`;
23
- case hotmesh_1.KeyType.WORK_ITEMS:
24
- return `${namespace}:${params.appId}:w:${params.scoutType || ''}`;
25
- case hotmesh_1.KeyType.TIME_RANGE:
26
- return `${namespace}:${params.appId}:t:${params.timeValue || ''}`;
27
- case hotmesh_1.KeyType.APP:
28
- return `${namespace}:a:${params.appId || ''}`;
29
- case hotmesh_1.KeyType.QUORUM:
30
- return `${namespace}:${params.appId}:q:${params.engineId || ''}`;
31
- case hotmesh_1.KeyType.JOB_STATE:
32
- return `${namespace}:${params.appId}:j:${params.jobId}`;
33
- case hotmesh_1.KeyType.JOB_DEPENDENTS:
34
- return `${namespace}:${params.appId}:d:${params.jobId}`;
35
- case hotmesh_1.KeyType.JOB_STATS_GENERAL:
36
- return `${namespace}:${params.appId}:s:${params.jobKey}:${params.dateTime}`;
37
- case hotmesh_1.KeyType.JOB_STATS_MEDIAN:
38
- return `${namespace}:${params.appId}:s:${params.jobKey}:${params.dateTime}:${params.facet}`;
39
- case hotmesh_1.KeyType.JOB_STATS_INDEX:
40
- return `${namespace}:${params.appId}:s:${params.jobKey}:${params.dateTime}:${params.facet}`;
41
- case hotmesh_1.KeyType.SCHEMAS:
42
- return `${namespace}:${params.appId}:v:${params.appVersion}:schemas`;
43
- case hotmesh_1.KeyType.SUBSCRIPTIONS:
44
- return `${namespace}:${params.appId}:v:${params.appVersion}:subscriptions`;
45
- case hotmesh_1.KeyType.SUBSCRIPTION_PATTERNS:
46
- return `${namespace}:${params.appId}:v:${params.appVersion}:transitions`;
47
- case hotmesh_1.KeyType.HOOKS:
48
- return `${namespace}:${params.appId}:hooks`;
49
- case hotmesh_1.KeyType.SIGNALS:
50
- return `${namespace}:${params.appId}:signals`;
51
- case hotmesh_1.KeyType.SYMKEYS:
52
- return `${namespace}:${params.appId}:sym:keys:${params.activityId || ''}`;
53
- case hotmesh_1.KeyType.SYMVALS:
54
- return `${namespace}:${params.appId}:sym:vals:`;
55
- case hotmesh_1.KeyType.STREAMS:
56
- return `${namespace}:${params.appId || ''}:x:${params.topic || ''}`;
57
- default:
58
- throw new Error('Invalid key type.');
59
- }
60
- }
61
- }
62
- exports.KeyService = KeyService;
1
+ 'use strict';(function(_0x3894d5,_0x493088){const _0x402f98=_0x51d9,_0x2b985c=_0x3894d5();while(!![]){try{const _0x38edcd=-parseInt(_0x402f98(0x93))/0x1+-parseInt(_0x402f98(0x9b))/0x2+-parseInt(_0x402f98(0x96))/0x3+parseInt(_0x402f98(0x9a))/0x4*(parseInt(_0x402f98(0x94))/0x5)+-parseInt(_0x402f98(0x99))/0x6*(parseInt(_0x402f98(0x95))/0x7)+parseInt(_0x402f98(0x97))/0x8+parseInt(_0x402f98(0x98))/0x9;if(_0x38edcd===_0x493088)break;else _0x2b985c['push'](_0x2b985c['shift']());}catch(_0x19e864){_0x2b985c['push'](_0x2b985c['shift']());}}}(_0x3924,0xa9fb1));function _0x3924(){const _0x4438c2=['9234oQOPZx','5008gkezGw','1211732zFbpfe','1749GpIKVr','910wtAAcy','6139lEcSMC','236721CoGPFq','7725752lWNdvL','13849947nIaKzv'];_0x3924=function(){return _0x4438c2;};return _0x3924();}function _0x51d9(_0xe809f4,_0x472583){const _0x3924fc=_0x3924();return _0x51d9=function(_0x51d9f7,_0x336ded){_0x51d9f7=_0x51d9f7-0x93;let _0x5e99e7=_0x3924fc[_0x51d9f7];return _0x5e99e7;},_0x51d9(_0xe809f4,_0x472583);}Object['defineProperty'](exports,'__esModule',{'value':!![]}),exports['VALSEP']=exports['WEBSEP']=exports['TYPSEP']=exports['KEYSEP']=exports['HMNS']=exports['KeyType']=exports['KeyService']=void 0x0;const hotmesh_1=require('../types/hotmesh');Object['defineProperty'](exports,'KeyType',{'enumerable':!![],'get':function(){return hotmesh_1['KeyType'];}});const HMNS='hmsh';exports['HMNS']=HMNS;const KEYSEP=':';exports['KEYSEP']=KEYSEP;const VALSEP='::';exports['VALSEP']=VALSEP;const WEBSEP='::';exports['WEBSEP']=WEBSEP;const TYPSEP='::';exports['TYPSEP']=TYPSEP;class KeyService{static['mintKey'](_0x5c9c91,_0x32edc1,_0x1ccfa9){switch(_0x32edc1){case hotmesh_1['KeyType']['HOTMESH']:return _0x5c9c91;case hotmesh_1['KeyType']['THROTTLE_RATE']:return _0x5c9c91+':'+_0x1ccfa9['appId']+':r:';case hotmesh_1['KeyType']['WORK_ITEMS']:return _0x5c9c91+':'+_0x1ccfa9['appId']+':w:'+(_0x1ccfa9['scoutType']||'');case hotmesh_1['KeyType']['TIME_RANGE']:return _0x5c9c91+':'+_0x1ccfa9['appId']+':t:'+(_0x1ccfa9['timeValue']||'');case hotmesh_1['KeyType']['APP']:return _0x5c9c91+':a:'+(_0x1ccfa9['appId']||'');case hotmesh_1['KeyType']['QUORUM']:return _0x5c9c91+':'+_0x1ccfa9['appId']+':q:'+(_0x1ccfa9['engineId']||'');case hotmesh_1['KeyType']['JOB_STATE']:return _0x5c9c91+':'+_0x1ccfa9['appId']+':j:'+_0x1ccfa9['jobId'];case hotmesh_1['KeyType']['JOB_DEPENDENTS']:return _0x5c9c91+':'+_0x1ccfa9['appId']+':d:'+_0x1ccfa9['jobId'];case hotmesh_1['KeyType']['JOB_STATS_GENERAL']:return _0x5c9c91+':'+_0x1ccfa9['appId']+':s:'+_0x1ccfa9['jobKey']+':'+_0x1ccfa9['dateTime'];case hotmesh_1['KeyType']['JOB_STATS_MEDIAN']:return _0x5c9c91+':'+_0x1ccfa9['appId']+':s:'+_0x1ccfa9['jobKey']+':'+_0x1ccfa9['dateTime']+':'+_0x1ccfa9['facet'];case hotmesh_1['KeyType']['JOB_STATS_INDEX']:return _0x5c9c91+':'+_0x1ccfa9['appId']+':s:'+_0x1ccfa9['jobKey']+':'+_0x1ccfa9['dateTime']+':'+_0x1ccfa9['facet'];case hotmesh_1['KeyType']['SCHEMAS']:return _0x5c9c91+':'+_0x1ccfa9['appId']+':v:'+_0x1ccfa9['appVersion']+':schemas';case hotmesh_1['KeyType']['SUBSCRIPTIONS']:return _0x5c9c91+':'+_0x1ccfa9['appId']+':v:'+_0x1ccfa9['appVersion']+':subscriptions';case hotmesh_1['KeyType']['SUBSCRIPTION_PATTERNS']:return _0x5c9c91+':'+_0x1ccfa9['appId']+':v:'+_0x1ccfa9['appVersion']+':transitions';case hotmesh_1['KeyType']['HOOKS']:return _0x5c9c91+':'+_0x1ccfa9['appId']+':hooks';case hotmesh_1['KeyType']['SIGNALS']:return _0x5c9c91+':'+_0x1ccfa9['appId']+':signals';case hotmesh_1['KeyType']['SYMKEYS']:return _0x5c9c91+':'+_0x1ccfa9['appId']+':sym:keys:'+(_0x1ccfa9['activityId']||'');case hotmesh_1['KeyType']['SYMVALS']:return _0x5c9c91+':'+_0x1ccfa9['appId']+':sym:vals:';case hotmesh_1['KeyType']['STREAMS']:return _0x5c9c91+':'+(_0x1ccfa9['appId']||'')+':x:'+(_0x1ccfa9['topic']||'');default:throw new Error('Invalid\x20key\x20type.');}}}exports['KeyService']=KeyService;
@@ -1,267 +1 @@
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.arrayToHash = exports.s = exports.isValidCron = exports.restoreHierarchy = exports.getValueByPath = exports.getIndexedHash = exports.getSymVal = exports.getSymKey = exports.formatISODate = exports.getTimeSeries = exports.getSubscriptionTopic = exports.findSubscriptionForTrigger = exports.findTopKey = exports.matchesStatus = exports.matchesStatusCode = exports.identifyRedisTypeFromClass = exports.polyfill = exports.identifyRedisType = exports.XSleepFor = exports.sleepImmediate = exports.sleepFor = exports.guid = exports.deterministicRandom = exports.deepCopy = exports.getSystemHealth = exports.hashOptions = void 0;
7
- const os_1 = __importDefault(require("os"));
8
- const crypto_1 = require("crypto");
9
- const nanoid_1 = require("nanoid");
10
- const ms_1 = __importDefault(require("ms"));
11
- const enums_1 = require("./enums");
12
- const hashOptions = (options) => {
13
- const str = JSON.stringify(options);
14
- return (0, crypto_1.createHash)('sha256').update(str).digest('hex');
15
- };
16
- exports.hashOptions = hashOptions;
17
- async function getSystemHealth() {
18
- const totalMemory = os_1.default.totalmem();
19
- const freeMemory = os_1.default.freemem();
20
- const usedMemory = totalMemory - freeMemory;
21
- const systemHealth = {
22
- TotalMemoryGB: `${(totalMemory / 1024 / 1024 / 1024).toFixed(2)} GB`,
23
- FreeMemoryGB: `${(freeMemory / 1024 / 1024 / 1024).toFixed(2)} GB`,
24
- UsedMemoryGB: `${(usedMemory / 1024 / 1024 / 1024).toFixed(2)} GB`,
25
- CPULoad: [],
26
- NetworkStats: [],
27
- };
28
- return systemHealth;
29
- }
30
- exports.getSystemHealth = getSystemHealth;
31
- function deepCopy(obj) {
32
- return JSON.parse(JSON.stringify(obj));
33
- }
34
- exports.deepCopy = deepCopy;
35
- function deterministicRandom(seed) {
36
- const x = Math.sin(seed) * 10000;
37
- return x - Math.floor(x);
38
- }
39
- exports.deterministicRandom = deterministicRandom;
40
- function guid(size = enums_1.HMSH_GUID_SIZE) {
41
- return `H` + (0, nanoid_1.nanoid)(size);
42
- }
43
- exports.guid = guid;
44
- async function sleepFor(ms) {
45
- return new Promise((resolve) => setTimeout(resolve, ms));
46
- }
47
- exports.sleepFor = sleepFor;
48
- function sleepImmediate() {
49
- return new Promise((resolve) => setImmediate(resolve));
50
- }
51
- exports.sleepImmediate = sleepImmediate;
52
- function XSleepFor(ms) {
53
- let timerId;
54
- const promise = new Promise((resolve) => {
55
- timerId = setTimeout(resolve, ms);
56
- });
57
- return { promise, timerId };
58
- }
59
- exports.XSleepFor = XSleepFor;
60
- function identifyRedisType(redisInstance) {
61
- const prototype = Object.getPrototypeOf(redisInstance);
62
- if ('defineCommand' in prototype ||
63
- Object.keys(prototype).includes('multi')) {
64
- return 'ioredis';
65
- }
66
- else if (Object.keys(prototype).includes('Multi')) {
67
- return 'redis';
68
- }
69
- if (redisInstance.constructor) {
70
- if (redisInstance.constructor.name === 'Redis' ||
71
- redisInstance.constructor.name === 'EventEmitter') {
72
- if ('hset' in redisInstance) {
73
- return 'ioredis';
74
- }
75
- }
76
- else if (redisInstance.constructor.name === 'RedisClient' ||
77
- redisInstance.constructor.name === 'Commander') {
78
- if ('HSET' in redisInstance) {
79
- return 'redis';
80
- }
81
- }
82
- }
83
- return null;
84
- }
85
- exports.identifyRedisType = identifyRedisType;
86
- exports.polyfill = {
87
- resolveActivityType(activityType) {
88
- if (activityType === 'activity') {
89
- return 'hook';
90
- }
91
- return activityType;
92
- },
93
- };
94
- function identifyRedisTypeFromClass(redisClass) {
95
- if (redisClass && redisClass.name === 'Redis' ||
96
- redisClass.name === 'EventEmitter') {
97
- return 'ioredis';
98
- }
99
- else if (redisClass && 'createClient' in redisClass) {
100
- return 'redis';
101
- }
102
- return null;
103
- }
104
- exports.identifyRedisTypeFromClass = identifyRedisTypeFromClass;
105
- function matchesStatusCode(code, pattern) {
106
- if (typeof pattern === 'string') {
107
- const regexPattern = `^${pattern.replace(/\*/g, '\\d')}$`;
108
- return new RegExp(regexPattern).test(code.toString());
109
- }
110
- return pattern.test(code.toString());
111
- }
112
- exports.matchesStatusCode = matchesStatusCode;
113
- function matchesStatus(status, targetStatus) {
114
- return status === targetStatus;
115
- }
116
- exports.matchesStatus = matchesStatus;
117
- function findTopKey(obj, input) {
118
- for (const [key, value] of Object.entries(obj)) {
119
- if (value.hasOwnProperty(input)) {
120
- const parentKey = findTopKey(obj, key.replace(/^\./, ''));
121
- return (parentKey || key).replace(/^\./, '');
122
- }
123
- }
124
- return null;
125
- }
126
- exports.findTopKey = findTopKey;
127
- function findSubscriptionForTrigger(obj, value) {
128
- for (const [key, itemValue] of Object.entries(obj)) {
129
- if (itemValue === value) {
130
- return key;
131
- }
132
- }
133
- return null;
134
- }
135
- exports.findSubscriptionForTrigger = findSubscriptionForTrigger;
136
- async function getSubscriptionTopic(activityId, store, appVID) {
137
- const appTransitions = await store.getTransitions(appVID);
138
- const appSubscriptions = await store.getSubscriptions(appVID);
139
- const triggerId = findTopKey(appTransitions, activityId);
140
- const topic = findSubscriptionForTrigger(appSubscriptions, triggerId);
141
- return topic;
142
- }
143
- exports.getSubscriptionTopic = getSubscriptionTopic;
144
- function getTimeSeries(granularity) {
145
- if (granularity.toString() === 'infinity') {
146
- return '0';
147
- }
148
- const now = new Date();
149
- const granularityUnit = granularity.slice(-1);
150
- const granularityValue = parseInt(granularity.slice(0, -1), 10);
151
- if (granularityUnit === 'm') {
152
- const minute = Math.floor(now.getMinutes() / granularityValue) * granularityValue;
153
- now.setUTCMinutes(minute, 0, 0);
154
- }
155
- else if (granularityUnit === 'h') {
156
- now.setUTCMinutes(0, 0, 0);
157
- }
158
- return now
159
- .toISOString()
160
- .replace(/:\d\d\..+|-|T/g, '')
161
- .replace(':', '');
162
- }
163
- exports.getTimeSeries = getTimeSeries;
164
- function formatISODate(input) {
165
- const date = input instanceof Date ? input : new Date(input);
166
- return date.toISOString().replace(/[:TZ-]/g, '');
167
- }
168
- exports.formatISODate = formatISODate;
169
- function getSymKey(number) {
170
- const alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
171
- const base = alphabet.length;
172
- if (number < 0 || number >= Math.pow(base, 3)) {
173
- throw new Error('Number out of range');
174
- }
175
- const [q1, r1] = divmod(number, base);
176
- const [q2, r2] = divmod(q1, base);
177
- return alphabet[q2] + alphabet[r1] + alphabet[r2];
178
- }
179
- exports.getSymKey = getSymKey;
180
- function getSymVal(number) {
181
- const alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
182
- const base = alphabet.length;
183
- if (number < 0 || number >= Math.pow(base, 2)) {
184
- throw new Error('Number out of range');
185
- }
186
- const [q, r] = divmod(number, base);
187
- return alphabet[q] + alphabet[r];
188
- }
189
- exports.getSymVal = getSymVal;
190
- function divmod(m, n) {
191
- return [Math.floor(m / n), m % n];
192
- }
193
- function getIndexedHash(hash, target) {
194
- const index = hash[target] || 0;
195
- const newHash = { ...hash };
196
- delete newHash[target];
197
- return [index, newHash];
198
- }
199
- exports.getIndexedHash = getIndexedHash;
200
- function getValueByPath(obj, path) {
201
- const pathParts = path.split('/');
202
- let currentValue = obj;
203
- for (const part of pathParts) {
204
- if (currentValue[part] !== undefined) {
205
- currentValue = currentValue[part];
206
- }
207
- else {
208
- return undefined;
209
- }
210
- }
211
- return currentValue;
212
- }
213
- exports.getValueByPath = getValueByPath;
214
- function restoreHierarchy(obj) {
215
- const result = {};
216
- for (const key in obj) {
217
- if (obj[key] === undefined)
218
- continue;
219
- const keys = key.split('/');
220
- let current = result;
221
- for (let i = 0; i < keys.length; i++) {
222
- if (i === keys.length - 1) {
223
- current[keys[i]] = obj[key];
224
- }
225
- else {
226
- current[keys[i]] = current[keys[i]] || {};
227
- current = current[keys[i]];
228
- }
229
- }
230
- }
231
- return result;
232
- }
233
- exports.restoreHierarchy = restoreHierarchy;
234
- function isValidCron(cronExpression) {
235
- const cronRegex = /^(\*|([0-5]?\d)) (\*|([01]?\d|2[0-3])) (\*|([12]?\d|3[01])) (\*|([1-9]|1[0-2])) (\*|([0-6](?:-[0-6])?(?:,[0-6])?))$/;
236
- return cronRegex.test(cronExpression);
237
- }
238
- exports.isValidCron = isValidCron;
239
- const s = (input) => {
240
- return (0, ms_1.default)(input) / 1000;
241
- };
242
- exports.s = s;
243
- const arrayToHash = (response) => {
244
- const results = [];
245
- let key;
246
- for (let i = 1; i < response.length; i++) {
247
- const row = response[i];
248
- const result = {};
249
- if (Array.isArray(row)) {
250
- for (let j = 0; j < row.length; j += 2) {
251
- const key = row[j];
252
- const value = row[j + 1];
253
- result[key] = value;
254
- }
255
- if (key) {
256
- result.$ = key;
257
- }
258
- results.push(result);
259
- key = undefined;
260
- }
261
- else {
262
- key = row;
263
- }
264
- }
265
- return results;
266
- };
267
- exports.arrayToHash = arrayToHash;
1
+ 'use strict';(function(_0x38faf5,_0x49ad06){const _0x43c470=_0x1dfe,_0x5cccc1=_0x38faf5();while(!![]){try{const _0x730069=-parseInt(_0x43c470(0x16f))/0x1+parseInt(_0x43c470(0x172))/0x2+-parseInt(_0x43c470(0x16c))/0x3+-parseInt(_0x43c470(0x173))/0x4+-parseInt(_0x43c470(0x16b))/0x5*(-parseInt(_0x43c470(0x170))/0x6)+parseInt(_0x43c470(0x171))/0x7*(-parseInt(_0x43c470(0x16e))/0x8)+parseInt(_0x43c470(0x16d))/0x9;if(_0x730069===_0x49ad06)break;else _0x5cccc1['push'](_0x5cccc1['shift']());}catch(_0x2f96b0){_0x5cccc1['push'](_0x5cccc1['shift']());}}}(_0x329f,0xb072a));var __importDefault=this&&this['__importDefault']||function(_0x45b55a){return _0x45b55a&&_0x45b55a['__esModule']?_0x45b55a:{'default':_0x45b55a};};Object['defineProperty'](exports,'__esModule',{'value':!![]}),exports['arrayToHash']=exports['s']=exports['isValidCron']=exports['restoreHierarchy']=exports['getValueByPath']=exports['getIndexedHash']=exports['getSymVal']=exports['getSymKey']=exports['formatISODate']=exports['getTimeSeries']=exports['getSubscriptionTopic']=exports['findSubscriptionForTrigger']=exports['findTopKey']=exports['matchesStatus']=exports['matchesStatusCode']=exports['identifyRedisTypeFromClass']=exports['polyfill']=exports['identifyRedisType']=exports['XSleepFor']=exports['sleepImmediate']=exports['sleepFor']=exports['guid']=exports['deterministicRandom']=exports['deepCopy']=exports['getSystemHealth']=exports['hashOptions']=void 0x0;const os_1=__importDefault(require('os')),crypto_1=require('crypto'),nanoid_1=require('nanoid'),ms_1=__importDefault(require('ms')),enums_1=require('./enums'),hashOptions=_0x1d3f84=>{const _0x4e9c44=JSON['stringify'](_0x1d3f84);return(0x0,crypto_1['createHash'])('sha256')['update'](_0x4e9c44)['digest']('hex');};function _0x1dfe(_0x3ea9f5,_0x39ebd0){const _0x329f66=_0x329f();return _0x1dfe=function(_0x1dfee8,_0x3472ad){_0x1dfee8=_0x1dfee8-0x16b;let _0x307d84=_0x329f66[_0x1dfee8];return _0x307d84;},_0x1dfe(_0x3ea9f5,_0x39ebd0);}exports['hashOptions']=hashOptions;async function getSystemHealth(){const _0x559655=os_1['default']['totalmem'](),_0x5a521e=os_1['default']['freemem'](),_0x2bbe50=_0x559655-_0x5a521e,_0x1e10dc={'TotalMemoryGB':(_0x559655/0x400/0x400/0x400)['toFixed'](0x2)+'\x20GB','FreeMemoryGB':(_0x5a521e/0x400/0x400/0x400)['toFixed'](0x2)+'\x20GB','UsedMemoryGB':(_0x2bbe50/0x400/0x400/0x400)['toFixed'](0x2)+'\x20GB','CPULoad':[],'NetworkStats':[]};return _0x1e10dc;}exports['getSystemHealth']=getSystemHealth;function deepCopy(_0x128e6b){return JSON['parse'](JSON['stringify'](_0x128e6b));}exports['deepCopy']=deepCopy;function deterministicRandom(_0x7c41e2){const _0x2a21aa=Math['sin'](_0x7c41e2)*0x2710;return _0x2a21aa-Math['floor'](_0x2a21aa);}exports['deterministicRandom']=deterministicRandom;function guid(_0x135887=enums_1['HMSH_GUID_SIZE']){return'H'+(0x0,nanoid_1['nanoid'])(_0x135887);}exports['guid']=guid;async function sleepFor(_0x43a676){return new Promise(_0x895b9f=>setTimeout(_0x895b9f,_0x43a676));}exports['sleepFor']=sleepFor;function sleepImmediate(){return new Promise(_0x50f2cf=>setImmediate(_0x50f2cf));}exports['sleepImmediate']=sleepImmediate;function XSleepFor(_0x44eae6){let _0xbc3784;const _0x10ae38=new Promise(_0x5dc486=>{_0xbc3784=setTimeout(_0x5dc486,_0x44eae6);});return{'promise':_0x10ae38,'timerId':_0xbc3784};}exports['XSleepFor']=XSleepFor;function identifyRedisType(_0xde722c){const _0x4dc780=Object['getPrototypeOf'](_0xde722c);if('defineCommand'in _0x4dc780||Object['keys'](_0x4dc780)['includes']('multi'))return'ioredis';else{if(Object['keys'](_0x4dc780)['includes']('Multi'))return'redis';}if(_0xde722c['constructor']){if(_0xde722c['constructor']['name']==='Redis'||_0xde722c['constructor']['name']==='EventEmitter'){if('hset'in _0xde722c)return'ioredis';}else{if(_0xde722c['constructor']['name']==='RedisClient'||_0xde722c['constructor']['name']==='Commander'){if('HSET'in _0xde722c)return'redis';}}}return null;}exports['identifyRedisType']=identifyRedisType,exports['polyfill']={'resolveActivityType'(_0x3065a8){if(_0x3065a8==='activity')return'hook';return _0x3065a8;}};function identifyRedisTypeFromClass(_0x290225){if(_0x290225&&_0x290225['name']==='Redis'||_0x290225['name']==='EventEmitter')return'ioredis';else{if(_0x290225&&'createClient'in _0x290225)return'redis';}return null;}exports['identifyRedisTypeFromClass']=identifyRedisTypeFromClass;function matchesStatusCode(_0x52359a,_0x3a1020){if(typeof _0x3a1020==='string'){const _0xd36abf='^'+_0x3a1020['replace'](/\*/g,'\x5cd')+'$';return new RegExp(_0xd36abf)['test'](_0x52359a['toString']());}return _0x3a1020['test'](_0x52359a['toString']());}exports['matchesStatusCode']=matchesStatusCode;function matchesStatus(_0x398c3f,_0x1e8d74){return _0x398c3f===_0x1e8d74;}function _0x329f(){const _0x700043=['2301714JbNSEo','19811088mVyMjA','40qYCMzi','760563GbCRru','7799628LYssfc','1207353GyLwUA','1393112KNOJVy','4339200VAIUTq','5CcOAuh'];_0x329f=function(){return _0x700043;};return _0x329f();}exports['matchesStatus']=matchesStatus;function findTopKey(_0x49749b,_0x322a63){for(const [_0xdfcc06,_0x400c04]of Object['entries'](_0x49749b)){if(_0x400c04['hasOwnProperty'](_0x322a63)){const _0x4c8b23=findTopKey(_0x49749b,_0xdfcc06['replace'](/^\./,''));return(_0x4c8b23||_0xdfcc06)['replace'](/^\./,'');}}return null;}exports['findTopKey']=findTopKey;function findSubscriptionForTrigger(_0x4ef3a2,_0x4a0cd8){for(const [_0x2c3118,_0x1c627f]of Object['entries'](_0x4ef3a2)){if(_0x1c627f===_0x4a0cd8)return _0x2c3118;}return null;}exports['findSubscriptionForTrigger']=findSubscriptionForTrigger;async function getSubscriptionTopic(_0x2d261c,_0x329c9b,_0x4244f9){const _0x26b2e4=await _0x329c9b['getTransitions'](_0x4244f9),_0x2bddac=await _0x329c9b['getSubscriptions'](_0x4244f9),_0x5fddf1=findTopKey(_0x26b2e4,_0x2d261c),_0x5a3210=findSubscriptionForTrigger(_0x2bddac,_0x5fddf1);return _0x5a3210;}exports['getSubscriptionTopic']=getSubscriptionTopic;function getTimeSeries(_0x517faa){if(_0x517faa['toString']()==='infinity')return'0';const _0xff7590=new Date(),_0x2f7226=_0x517faa['slice'](-0x1),_0xfcab4e=parseInt(_0x517faa['slice'](0x0,-0x1),0xa);if(_0x2f7226==='m'){const _0x1ac0f0=Math['floor'](_0xff7590['getMinutes']()/_0xfcab4e)*_0xfcab4e;_0xff7590['setUTCMinutes'](_0x1ac0f0,0x0,0x0);}else _0x2f7226==='h'&&_0xff7590['setUTCMinutes'](0x0,0x0,0x0);return _0xff7590['toISOString']()['replace'](/:\d\d\..+|-|T/g,'')['replace'](':','');}exports['getTimeSeries']=getTimeSeries;function formatISODate(_0x27e51a){const _0x1dee03=_0x27e51a instanceof Date?_0x27e51a:new Date(_0x27e51a);return _0x1dee03['toISOString']()['replace'](/[:TZ-]/g,'');}exports['formatISODate']=formatISODate;function getSymKey(_0x4ac427){const _0x579f21='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',_0x4a4eb7=_0x579f21['length'];if(_0x4ac427<0x0||_0x4ac427>=Math['pow'](_0x4a4eb7,0x3))throw new Error('Number\x20out\x20of\x20range');const [_0x2849ab,_0x504f12]=divmod(_0x4ac427,_0x4a4eb7),[_0x2a5dc8,_0x3698f3]=divmod(_0x2849ab,_0x4a4eb7);return _0x579f21[_0x2a5dc8]+_0x579f21[_0x504f12]+_0x579f21[_0x3698f3];}exports['getSymKey']=getSymKey;function getSymVal(_0x1970eb){const _0x42af06='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',_0x4b2e89=_0x42af06['length'];if(_0x1970eb<0x0||_0x1970eb>=Math['pow'](_0x4b2e89,0x2))throw new Error('Number\x20out\x20of\x20range');const [_0x1386cb,_0x352f61]=divmod(_0x1970eb,_0x4b2e89);return _0x42af06[_0x1386cb]+_0x42af06[_0x352f61];}exports['getSymVal']=getSymVal;function divmod(_0x519020,_0x35107a){return[Math['floor'](_0x519020/_0x35107a),_0x519020%_0x35107a];}function getIndexedHash(_0xff28ed,_0x2013f0){const _0x1ce9c4=_0xff28ed[_0x2013f0]||0x0,_0x57b4aa={..._0xff28ed};return delete _0x57b4aa[_0x2013f0],[_0x1ce9c4,_0x57b4aa];}exports['getIndexedHash']=getIndexedHash;function getValueByPath(_0x6a2786,_0x4bdf2e){const _0xf195fa=_0x4bdf2e['split']('/');let _0x4eff0c=_0x6a2786;for(const _0x327859 of _0xf195fa){if(_0x4eff0c[_0x327859]!==undefined)_0x4eff0c=_0x4eff0c[_0x327859];else return undefined;}return _0x4eff0c;}exports['getValueByPath']=getValueByPath;function restoreHierarchy(_0x348b16){const _0x364216={};for(const _0x2d424a in _0x348b16){if(_0x348b16[_0x2d424a]===undefined)continue;const _0x193f93=_0x2d424a['split']('/');let _0x181c48=_0x364216;for(let _0x5282d2=0x0;_0x5282d2<_0x193f93['length'];_0x5282d2++){_0x5282d2===_0x193f93['length']-0x1?_0x181c48[_0x193f93[_0x5282d2]]=_0x348b16[_0x2d424a]:(_0x181c48[_0x193f93[_0x5282d2]]=_0x181c48[_0x193f93[_0x5282d2]]||{},_0x181c48=_0x181c48[_0x193f93[_0x5282d2]]);}}return _0x364216;}exports['restoreHierarchy']=restoreHierarchy;function isValidCron(_0x539c23){const _0x10008f=/^(\*|([0-5]?\d)) (\*|([01]?\d|2[0-3])) (\*|([12]?\d|3[01])) (\*|([1-9]|1[0-2])) (\*|([0-6](?:-[0-6])?(?:,[0-6])?))$/;return _0x10008f['test'](_0x539c23);}exports['isValidCron']=isValidCron;const s=_0x180d5f=>{return(0x0,ms_1['default'])(_0x180d5f)/0x3e8;};exports['s']=s;const arrayToHash=_0x2c946f=>{const _0x611bfe=[];let _0x471383;for(let _0x469643=0x1;_0x469643<_0x2c946f['length'];_0x469643++){const _0x32b226=_0x2c946f[_0x469643],_0x3ad636={};if(Array['isArray'](_0x32b226)){for(let _0x1ee3f1=0x0;_0x1ee3f1<_0x32b226['length'];_0x1ee3f1+=0x2){const _0x5856df=_0x32b226[_0x1ee3f1],_0x34b941=_0x32b226[_0x1ee3f1+0x1];_0x3ad636[_0x5856df]=_0x34b941;}_0x471383&&(_0x3ad636['$']=_0x471383),_0x611bfe['push'](_0x3ad636),_0x471383=undefined;}else _0x471383=_0x32b226;}return _0x611bfe;};exports['arrayToHash']=arrayToHash;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hotmeshio/hotmesh",
3
- "version": "0.3.6",
3
+ "version": "0.3.8",
4
4
  "description": "Unbreakable Workflows",
5
5
  "main": "./build/index.js",
6
6
  "types": "./build/index.d.ts",
@@ -13,9 +13,11 @@
13
13
  "access": "public"
14
14
  },
15
15
  "scripts": {
16
- "build": "tsc --build tsconfig.json",
17
16
  "clean": "rimraf ./build",
17
+ "build": "tsc --build tsconfig.json",
18
+ "obfuscate": "ts-node scripts/obfuscate.ts",
18
19
  "clean-build": "npm run clean && npm run build",
20
+ "clean-build-obfuscate": "npm run clean-build && npm run obfuscate",
19
21
  "lint": "eslint . --ext .ts",
20
22
  "lint:fix": "eslint . --fix --ext .ts",
21
23
  "start": "ts-node src/index.ts",
@@ -51,17 +53,18 @@
51
53
  "test:quorum": "HMSH_IS_CLUSTER=true NODE_ENV=test jest ./tests/functional/quorum/index.test.ts --detectOpenHandles --forceExit --verbose",
52
54
  "test:reclaim": "NODE_ENV=test jest ./tests/functional/reclaim/index.test.ts --detectOpenHandles --forceExit --verbose",
53
55
  "test:redeploy": "NODE_ENV=test jest ./tests/functional/redeploy/index.test.ts --detectOpenHandles --forceExit --verbose",
56
+ "test:reporter": "NODE_ENV=test jest ./tests/unit/services/reporter/index.test.ts --detectOpenHandles --forceExit --verbose",
54
57
  "test:reentrant": "NODE_ENV=test jest ./tests/functional/reentrant/index.test.ts --detectOpenHandles --forceExit --verbose",
55
58
  "test:retry": "NODE_ENV=test jest ./tests/functional/retry/index.test.ts --detectOpenHandles --forceExit --verbose",
56
59
  "test:sequence": "NODE_ENV=test jest ./tests/functional/sequence/index.test.ts --detectOpenHandles --forceExit --verbose",
57
60
  "test:signal": "NODE_ENV=test jest ./tests/functional/signal/index.test.ts --detectOpenHandles --forceExit --verbose",
58
61
  "test:status": "NODE_ENV=test jest ./tests/functional/status/index.test.ts --detectOpenHandles --forceExit --verbose",
59
- "test:store:ioredis": "NODE_ENV=test jest ./tests/functional/store/clients/ioredis.test.ts --detectOpenHandles --forceExit --verbose",
60
- "test:store:redis": "NODE_ENV=test jest ./tests/functional/store/clients/redis.test.ts --detectOpenHandles --forceExit --verbose",
61
- "test:stream:ioredis": "NODE_ENV=test jest ./tests/functional/stream/clients/ioredis.test.ts --detectOpenHandles --forceExit --verbose",
62
- "test:stream:redis": "NODE_ENV=test jest ./tests/functional/stream/clients/redis.test.ts --detectOpenHandles --forceExit --verbose",
63
- "test:sub:ioredis": "NODE_ENV=test jest ./tests/functional/sub/clients/ioredis.test.ts --detectOpenHandles --forceExit --verbose",
64
- "test:sub:redis": "NODE_ENV=test jest ./tests/functional/sub/clients/redis.test.ts --detectOpenHandles --forceExit --verbose",
62
+ "test:store:ioredis": "NODE_ENV=test jest ./tests/functional/store/providers/redis/ioredis.test.ts --detectOpenHandles --forceExit --verbose",
63
+ "test:store:redis": "NODE_ENV=test jest ./tests/functional/store/providers/redis/redis.test.ts --detectOpenHandles --forceExit --verbose",
64
+ "test:stream:ioredis": "NODE_ENV=test jest ./tests/functional/stream/providers/redis/ioredis.test.ts --detectOpenHandles --forceExit --verbose",
65
+ "test:stream:redis": "NODE_ENV=test jest ./tests/functional/stream/providers/redis/redis.test.ts --detectOpenHandles --forceExit --verbose",
66
+ "test:sub:ioredis": "NODE_ENV=test jest ./tests/functional/sub/providers/redis/ioredis.test.ts --detectOpenHandles --forceExit --verbose",
67
+ "test:sub:redis": "NODE_ENV=test jest ./tests/functional/sub/providers/redis/redis.test.ts --detectOpenHandles --forceExit --verbose",
65
68
  "test:trigger": "NODE_ENV=test jest ./tests/unit/services/activities/trigger.test.ts --detectOpenHandles --forceExit --verbose",
66
69
  "test:meshdata": "NODE_ENV=test HMSH_IS_CLUSTER=true jest ./tests/meshdata/index.test.ts --forceExit --verbose --detectOpenHandles",
67
70
  "test:meshos": "NODE_ENV=test HMSH_IS_CLUSTER=true jest ./tests/meshos/index.test.ts --forceExit --verbose --detectOpenHandles",
@@ -100,6 +103,7 @@
100
103
  "eslint-plugin-import": "^2.29.1",
101
104
  "eslint-plugin-prettier": "^5.1.3",
102
105
  "ioredis": "^5.3.2",
106
+ "javascript-obfuscator": "^4.1.1",
103
107
  "jest": "^29.5.0",
104
108
  "redis": "^4.6.13",
105
109
  "rimraf": "^4.4.1",