@hotmeshio/hotmesh 0.3.32 → 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.
- package/README.md +128 -823
- package/build/index.d.ts +9 -9
- package/build/index.js +10 -10
- package/build/modules/enums.d.ts +23 -23
- package/build/modules/enums.js +26 -26
- package/build/modules/errors.d.ts +16 -16
- package/build/modules/errors.js +28 -28
- package/build/modules/key.js +190 -1
- package/build/modules/utils.js +374 -1
- package/build/package.json +22 -21
- package/build/services/activities/activity.js +549 -1
- package/build/services/activities/await.js +114 -1
- package/build/services/activities/cycle.js +112 -1
- package/build/services/activities/hook.js +168 -1
- package/build/services/activities/index.js +20 -1
- package/build/services/activities/interrupt.js +158 -1
- package/build/services/activities/signal.js +134 -1
- package/build/services/activities/trigger.js +246 -1
- package/build/services/activities/worker.js +106 -1
- package/build/services/collator/index.js +293 -1
- package/build/services/compiler/deployer.js +488 -1
- package/build/services/compiler/index.js +112 -1
- package/build/services/compiler/validator.js +147 -1
- package/build/services/engine/index.js +761 -1
- package/build/services/exporter/index.js +126 -1
- package/build/services/hotmesh/index.d.ts +160 -17
- package/build/services/hotmesh/index.js +160 -17
- package/build/services/mapper/index.js +81 -1
- package/build/services/{meshflow → memflow}/client.d.ts +3 -3
- package/build/services/{meshflow → memflow}/client.js +17 -16
- package/build/services/{meshflow → memflow}/connection.d.ts +2 -2
- package/build/services/{meshflow → memflow}/connection.js +1 -1
- package/build/services/memflow/context.d.ts +143 -0
- package/build/services/memflow/context.js +299 -0
- package/build/services/{meshflow → memflow}/exporter.d.ts +6 -6
- package/build/services/memflow/exporter.js +215 -0
- package/build/services/{meshflow → memflow}/handle.d.ts +4 -4
- package/build/services/{meshflow → memflow}/handle.js +2 -2
- package/build/services/{meshflow → memflow}/index.d.ts +18 -13
- package/build/services/{meshflow → memflow}/index.js +26 -21
- package/build/services/{meshflow → memflow}/schemas/factory.d.ts +4 -4
- package/build/services/{meshflow → memflow}/schemas/factory.js +5 -5
- package/build/services/{meshflow → memflow}/search.d.ts +1 -1
- package/build/services/{meshflow → memflow}/search.js +4 -4
- package/build/services/{meshflow → memflow}/worker.d.ts +5 -5
- package/build/services/{meshflow → memflow}/worker.js +24 -24
- package/build/services/memflow/workflow/common.d.ts +20 -0
- package/build/services/memflow/workflow/common.js +47 -0
- package/build/services/memflow/workflow/contextMethods.d.ts +14 -0
- package/build/services/memflow/workflow/contextMethods.js +33 -0
- package/build/services/{meshflow → memflow}/workflow/execChild.js +12 -12
- package/build/services/memflow/workflow/execHook.d.ts +65 -0
- package/build/services/memflow/workflow/execHook.js +73 -0
- package/build/services/{meshflow → memflow}/workflow/hook.js +19 -3
- package/build/services/{meshflow → memflow}/workflow/index.d.ts +7 -3
- package/build/services/{meshflow → memflow}/workflow/index.js +7 -3
- package/build/services/{meshflow → memflow}/workflow/proxyActivities.d.ts +2 -2
- package/build/services/{meshflow → memflow}/workflow/proxyActivities.js +8 -8
- package/build/services/{meshflow → memflow}/workflow/sleepFor.js +2 -2
- package/build/services/{meshflow → memflow}/workflow/waitFor.js +2 -2
- package/build/services/meshdata/index.d.ts +24 -24
- package/build/services/meshdata/index.js +40 -40
- package/build/services/pipe/functions/array.js +74 -1
- package/build/services/pipe/functions/bitwise.js +24 -1
- package/build/services/pipe/functions/conditional.js +36 -1
- package/build/services/pipe/functions/cron.js +40 -1
- package/build/services/pipe/functions/date.js +171 -1
- package/build/services/pipe/functions/index.js +30 -1
- package/build/services/pipe/functions/json.js +12 -1
- package/build/services/pipe/functions/logical.js +12 -1
- package/build/services/pipe/functions/math.js +184 -1
- package/build/services/pipe/functions/number.js +60 -1
- package/build/services/pipe/functions/object.js +81 -1
- package/build/services/pipe/functions/string.js +69 -1
- package/build/services/pipe/functions/symbol.js +33 -1
- package/build/services/pipe/functions/unary.js +18 -1
- package/build/services/pipe/index.js +242 -1
- package/build/services/quorum/index.js +263 -1
- package/build/services/reporter/index.js +348 -1
- package/build/services/router/config/index.d.ts +11 -0
- package/build/services/router/config/index.js +36 -0
- package/build/services/router/consumption/index.d.ts +34 -0
- package/build/services/router/consumption/index.js +395 -0
- package/build/services/router/error-handling/index.d.ts +8 -0
- package/build/services/router/error-handling/index.js +98 -0
- package/build/services/router/index.d.ts +13 -16
- package/build/services/router/index.js +121 -1
- package/build/services/router/lifecycle/index.d.ts +27 -0
- package/build/services/router/lifecycle/index.js +80 -0
- package/build/services/router/telemetry/index.d.ts +11 -0
- package/build/services/router/telemetry/index.js +32 -0
- package/build/services/router/throttling/index.d.ts +23 -0
- package/build/services/router/throttling/index.js +76 -0
- package/build/services/search/index.d.ts +2 -1
- package/build/services/search/providers/postgres/postgres.d.ts +2 -1
- package/build/services/search/providers/postgres/postgres.js +149 -1
- package/build/services/search/providers/redis/ioredis.d.ts +1 -0
- package/build/services/search/providers/redis/ioredis.js +121 -1
- package/build/services/search/providers/redis/redis.d.ts +1 -0
- package/build/services/search/providers/redis/redis.js +134 -1
- package/build/services/serializer/index.js +282 -1
- package/build/services/store/providers/postgres/kvsql.d.ts +1 -1
- package/build/services/store/providers/postgres/kvsql.js +198 -1
- package/build/services/store/providers/postgres/kvtables.js +441 -1
- package/build/services/store/providers/postgres/kvtransaction.js +248 -1
- package/build/services/store/providers/postgres/kvtypes/hash.d.ts +1 -1
- package/build/services/store/providers/postgres/kvtypes/hash.js +1287 -1
- package/build/services/store/providers/postgres/kvtypes/list.js +194 -1
- package/build/services/store/providers/postgres/kvtypes/string.js +115 -1
- package/build/services/store/providers/postgres/kvtypes/zset.js +214 -1
- package/build/services/store/providers/postgres/postgres.js +1036 -1
- package/build/services/store/providers/redis/_base.js +980 -1
- package/build/services/store/providers/redis/ioredis.js +180 -1
- package/build/services/store/providers/redis/redis.js +199 -1
- package/build/services/store/providers/store-initializable.js +2 -1
- package/build/services/stream/index.d.ts +5 -0
- package/build/services/stream/providers/nats/nats.d.ts +1 -0
- package/build/services/stream/providers/nats/nats.js +225 -1
- package/build/services/stream/providers/postgres/kvtables.d.ts +1 -0
- package/build/services/stream/providers/postgres/kvtables.js +146 -1
- package/build/services/stream/providers/postgres/postgres.d.ts +19 -0
- package/build/services/stream/providers/postgres/postgres.js +519 -1
- package/build/services/stream/providers/redis/ioredis.d.ts +1 -0
- package/build/services/stream/providers/redis/ioredis.js +272 -1
- package/build/services/stream/providers/redis/redis.d.ts +1 -0
- package/build/services/stream/providers/redis/redis.js +305 -1
- package/build/services/stream/providers/stream-initializable.js +2 -1
- package/build/services/sub/providers/nats/nats.js +105 -1
- package/build/services/sub/providers/postgres/postgres.js +92 -1
- package/build/services/sub/providers/redis/ioredis.js +81 -1
- package/build/services/sub/providers/redis/redis.js +72 -1
- package/build/services/task/index.js +206 -1
- package/build/services/telemetry/index.js +306 -1
- package/build/services/worker/index.js +197 -1
- package/build/types/error.d.ts +5 -5
- package/build/types/exporter.d.ts +1 -1
- package/build/types/index.d.ts +3 -3
- package/build/types/manifest.d.ts +2 -2
- package/build/types/{meshflow.d.ts → memflow.d.ts} +15 -15
- package/build/types/meshdata.d.ts +3 -3
- package/build/types/postgres.d.ts +7 -0
- package/build/types/stream.d.ts +3 -0
- package/index.ts +11 -11
- package/package.json +22 -21
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -38
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
- package/build/services/meshflow/exporter.js +0 -1
- package/build/services/meshflow/workflow/common.d.ts +0 -18
- package/build/services/meshflow/workflow/common.js +0 -45
- package/typedoc.json +0 -46
- package/types/activity.ts +0 -268
- package/types/app.ts +0 -20
- package/types/async.ts +0 -6
- package/types/cache.ts +0 -1
- package/types/collator.ts +0 -9
- package/types/error.ts +0 -56
- package/types/exporter.ts +0 -102
- package/types/hook.ts +0 -44
- package/types/hotmesh.ts +0 -314
- package/types/index.ts +0 -306
- package/types/job.ts +0 -233
- package/types/logger.ts +0 -8
- package/types/manifest.ts +0 -70
- package/types/map.ts +0 -5
- package/types/meshcall.ts +0 -235
- package/types/meshdata.ts +0 -278
- package/types/meshflow.ts +0 -645
- package/types/ms.d.ts +0 -7
- package/types/nats.ts +0 -270
- package/types/pipe.ts +0 -90
- package/types/postgres.ts +0 -105
- package/types/provider.ts +0 -161
- package/types/quorum.ts +0 -167
- package/types/redis.ts +0 -404
- package/types/serializer.ts +0 -40
- package/types/stats.ts +0 -117
- package/types/stream.ts +0 -227
- package/types/task.ts +0 -7
- package/types/telemetry.ts +0 -16
- package/types/transition.ts +0 -20
- /package/build/services/{meshflow → memflow}/workflow/all.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/all.js +0 -0
- /package/build/services/{meshflow → memflow}/workflow/context.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/context.js +0 -0
- /package/build/services/{meshflow → memflow}/workflow/didRun.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/didRun.js +0 -0
- /package/build/services/{meshflow → memflow}/workflow/emit.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/emit.js +0 -0
- /package/build/services/{meshflow → memflow}/workflow/enrich.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/enrich.js +0 -0
- /package/build/services/{meshflow → memflow}/workflow/execChild.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/hook.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/interrupt.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/interrupt.js +0 -0
- /package/build/services/{meshflow → memflow}/workflow/isSideEffectAllowed.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/isSideEffectAllowed.js +0 -0
- /package/build/services/{meshflow → memflow}/workflow/random.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/random.js +0 -0
- /package/build/services/{meshflow → memflow}/workflow/searchMethods.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/searchMethods.js +0 -0
- /package/build/services/{meshflow → memflow}/workflow/signal.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/signal.js +0 -0
- /package/build/services/{meshflow → memflow}/workflow/sleepFor.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/trace.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/trace.js +0 -0
- /package/build/services/{meshflow → memflow}/workflow/waitFor.d.ts +0 -0
- /package/build/types/{meshflow.js → memflow.js} +0 -0
|
@@ -1 +1,180 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IORedisStoreService = void 0;
|
|
4
|
+
const key_1 = require("../../../../modules/key");
|
|
5
|
+
const enums_1 = require("../../../../modules/enums");
|
|
6
|
+
const _base_1 = require("./_base");
|
|
7
|
+
class IORedisStoreService extends _base_1.RedisStoreBase {
|
|
8
|
+
constructor(storeClient) {
|
|
9
|
+
super(storeClient);
|
|
10
|
+
this.commands = {
|
|
11
|
+
get: 'get',
|
|
12
|
+
set: 'set',
|
|
13
|
+
setnx: 'setnx',
|
|
14
|
+
del: 'del',
|
|
15
|
+
expire: 'expire',
|
|
16
|
+
hset: 'hset',
|
|
17
|
+
hscan: 'hscan',
|
|
18
|
+
hsetnx: 'hsetnx',
|
|
19
|
+
hincrby: 'hincrby',
|
|
20
|
+
hdel: 'hdel',
|
|
21
|
+
hget: 'hget',
|
|
22
|
+
hmget: 'hmget',
|
|
23
|
+
hgetall: 'hgetall',
|
|
24
|
+
hincrbyfloat: 'hincrbyfloat',
|
|
25
|
+
zrank: 'zrank',
|
|
26
|
+
zrange: 'zrange',
|
|
27
|
+
zrangebyscore_withscores: 'zrangebyscore',
|
|
28
|
+
zrangebyscore: 'zrangebyscore',
|
|
29
|
+
zrem: 'zrem',
|
|
30
|
+
zadd: 'zadd',
|
|
31
|
+
lmove: 'lmove',
|
|
32
|
+
lpop: 'lpop',
|
|
33
|
+
lrange: 'lrange',
|
|
34
|
+
rename: 'rename',
|
|
35
|
+
rpush: 'rpush',
|
|
36
|
+
scan: 'scan',
|
|
37
|
+
xack: 'xack',
|
|
38
|
+
xdel: 'xdel',
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* When in cluster mode, the transact wrapper only
|
|
43
|
+
* sends commands to the same node/shard if they share a key.
|
|
44
|
+
* All other commands are sent simultaneouslyusing Promise.all
|
|
45
|
+
* and are then collated. this is effectiely a wrapper for
|
|
46
|
+
* `multi` but is closer to `pipeline` in terms of usage when
|
|
47
|
+
* promises are used.
|
|
48
|
+
*/
|
|
49
|
+
transact() {
|
|
50
|
+
const my = this;
|
|
51
|
+
if (enums_1.HMSH_IS_CLUSTER) {
|
|
52
|
+
const commands = [];
|
|
53
|
+
const addCommand = (command, args) => {
|
|
54
|
+
commands.push({ command, args });
|
|
55
|
+
return multiInstance;
|
|
56
|
+
};
|
|
57
|
+
const multiInstance = {
|
|
58
|
+
sendCommand(command) {
|
|
59
|
+
return my.storeClient.sendCommand(command);
|
|
60
|
+
},
|
|
61
|
+
async exec() {
|
|
62
|
+
if (commands.length === 0)
|
|
63
|
+
return [];
|
|
64
|
+
const sameKey = commands.every((cmd) => {
|
|
65
|
+
return cmd.args[0] === commands[0].args[0];
|
|
66
|
+
});
|
|
67
|
+
if (sameKey) {
|
|
68
|
+
const multi = my.storeClient.multi();
|
|
69
|
+
commands.forEach((cmd) => multi[cmd.command](...cmd.args));
|
|
70
|
+
const results = await multi.exec();
|
|
71
|
+
return results.map((item) => item);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
return Promise.all(commands.map((cmd) => my.storeClient[cmd.command](...cmd.args)));
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
xadd(key, id, fields, message) {
|
|
78
|
+
return addCommand('xadd', [key, id, fields, message]);
|
|
79
|
+
},
|
|
80
|
+
xack(key, group, id) {
|
|
81
|
+
return addCommand('xack', [key, group, id]);
|
|
82
|
+
},
|
|
83
|
+
xdel(key, id) {
|
|
84
|
+
return addCommand('xdel', [key, id]);
|
|
85
|
+
},
|
|
86
|
+
xlen(key) {
|
|
87
|
+
return addCommand('xlen', [key]);
|
|
88
|
+
},
|
|
89
|
+
xpending(key, group, start, end, count, consumer) {
|
|
90
|
+
return addCommand('xpending', [
|
|
91
|
+
key,
|
|
92
|
+
group,
|
|
93
|
+
start,
|
|
94
|
+
end,
|
|
95
|
+
count,
|
|
96
|
+
consumer,
|
|
97
|
+
]);
|
|
98
|
+
},
|
|
99
|
+
xclaim(key, group, consumer, minIdleTime, id, ...args) {
|
|
100
|
+
return addCommand('xclaim', [
|
|
101
|
+
key,
|
|
102
|
+
group,
|
|
103
|
+
consumer,
|
|
104
|
+
minIdleTime,
|
|
105
|
+
id,
|
|
106
|
+
...args,
|
|
107
|
+
]);
|
|
108
|
+
},
|
|
109
|
+
del(key) {
|
|
110
|
+
return addCommand('del', [key]);
|
|
111
|
+
},
|
|
112
|
+
expire: function (key, seconds) {
|
|
113
|
+
return addCommand('expire', [key, seconds]);
|
|
114
|
+
},
|
|
115
|
+
hdel(key, itemId) {
|
|
116
|
+
return addCommand('hdel', [key, itemId]);
|
|
117
|
+
},
|
|
118
|
+
hget(key, itemId) {
|
|
119
|
+
return addCommand('hget', [key, itemId]);
|
|
120
|
+
},
|
|
121
|
+
hgetall(key) {
|
|
122
|
+
return addCommand('hgetall', [key]);
|
|
123
|
+
},
|
|
124
|
+
hincrbyfloat(key, itemId, value) {
|
|
125
|
+
return addCommand('hincrbyfloat', [key, itemId, value]);
|
|
126
|
+
},
|
|
127
|
+
hmget(key, itemIds) {
|
|
128
|
+
return addCommand('hmget', [key, itemIds]);
|
|
129
|
+
},
|
|
130
|
+
hset(key, values) {
|
|
131
|
+
return addCommand('hset', [key, values]);
|
|
132
|
+
},
|
|
133
|
+
lrange(key, start, end) {
|
|
134
|
+
return addCommand('lrange', [key, start, end]);
|
|
135
|
+
},
|
|
136
|
+
rpush(key, value) {
|
|
137
|
+
return addCommand('rpush', [key, value]);
|
|
138
|
+
},
|
|
139
|
+
zadd(...args) {
|
|
140
|
+
return addCommand('zadd', args);
|
|
141
|
+
},
|
|
142
|
+
xgroup(command, key, groupName, id, mkStream) {
|
|
143
|
+
return addCommand('xgroup', [command, key, groupName, id, mkStream]);
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
return multiInstance;
|
|
147
|
+
}
|
|
148
|
+
return this.storeClient.multi();
|
|
149
|
+
}
|
|
150
|
+
async exec(...args) {
|
|
151
|
+
const response = await this.storeClient.call.apply(this.storeClient, args);
|
|
152
|
+
if (typeof response === 'string') {
|
|
153
|
+
return response;
|
|
154
|
+
}
|
|
155
|
+
else if (Array.isArray(response)) {
|
|
156
|
+
if (Array.isArray(response[0])) {
|
|
157
|
+
return response;
|
|
158
|
+
}
|
|
159
|
+
return response;
|
|
160
|
+
}
|
|
161
|
+
return response;
|
|
162
|
+
}
|
|
163
|
+
async setnxex(key, value, expireSeconds) {
|
|
164
|
+
const status = await this.storeClient[this.commands.set](key, value, 'NX', 'EX', expireSeconds.toString());
|
|
165
|
+
return this.isSuccessful(status);
|
|
166
|
+
}
|
|
167
|
+
hGetAllResult(result) {
|
|
168
|
+
//ioredis response signature is [null, {}] or [null, null]
|
|
169
|
+
return result[1];
|
|
170
|
+
}
|
|
171
|
+
async addTaskQueues(keys) {
|
|
172
|
+
const multi = this.storeClient.multi();
|
|
173
|
+
const zsetKey = this.mintKey(key_1.KeyType.WORK_ITEMS, { appId: this.appId });
|
|
174
|
+
for (const key of keys) {
|
|
175
|
+
multi.zadd(zsetKey, 'NX', Date.now(), key);
|
|
176
|
+
}
|
|
177
|
+
await multi.exec();
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
exports.IORedisStoreService = IORedisStoreService;
|
|
@@ -1 +1,199 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RedisStoreService = void 0;
|
|
4
|
+
const enums_1 = require("../../../../modules/enums");
|
|
5
|
+
const _base_1 = require("./_base");
|
|
6
|
+
class RedisStoreService extends _base_1.RedisStoreBase {
|
|
7
|
+
constructor(storeClient) {
|
|
8
|
+
super(storeClient);
|
|
9
|
+
this.commands = {
|
|
10
|
+
get: 'GET',
|
|
11
|
+
set: 'SET',
|
|
12
|
+
setnx: 'SETNX',
|
|
13
|
+
del: 'DEL',
|
|
14
|
+
expire: 'EXPIRE',
|
|
15
|
+
hscan: 'HSCAN',
|
|
16
|
+
hset: 'HSET',
|
|
17
|
+
hsetnx: 'HSETNX',
|
|
18
|
+
hincrby: 'HINCRBY',
|
|
19
|
+
hdel: 'HDEL',
|
|
20
|
+
hget: 'HGET',
|
|
21
|
+
hmget: 'HMGET',
|
|
22
|
+
hgetall: 'HGETALL',
|
|
23
|
+
hincrbyfloat: 'HINCRBYFLOAT',
|
|
24
|
+
zrange: 'ZRANGE',
|
|
25
|
+
zrangebyscore_withscores: 'ZRANGEBYSCORE_WITHSCORES',
|
|
26
|
+
zrangebyscore: 'ZRANGEBYSCORE',
|
|
27
|
+
zrem: 'ZREM',
|
|
28
|
+
zadd: 'ZADD',
|
|
29
|
+
lmove: 'LMOVE',
|
|
30
|
+
lrange: 'LRANGE',
|
|
31
|
+
lpop: 'LPOP',
|
|
32
|
+
rename: 'RENAME',
|
|
33
|
+
rpush: 'RPUSH',
|
|
34
|
+
scan: 'SCAN',
|
|
35
|
+
xack: 'XACK',
|
|
36
|
+
xdel: 'XDEL',
|
|
37
|
+
xlen: 'XLEN',
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* When in cluster mode, the transact wrapper only
|
|
42
|
+
* sends commands to the same node/shard if they share a key.
|
|
43
|
+
* All other commands are sent simultaneouslyusing Promise.all
|
|
44
|
+
* and are then collated
|
|
45
|
+
*/
|
|
46
|
+
transact() {
|
|
47
|
+
const my = this;
|
|
48
|
+
if (enums_1.HMSH_IS_CLUSTER) {
|
|
49
|
+
const commands = [];
|
|
50
|
+
const addCommand = (command, args) => {
|
|
51
|
+
commands.push({ command: command.toUpperCase(), args });
|
|
52
|
+
return multiInstance;
|
|
53
|
+
};
|
|
54
|
+
const multiInstance = {
|
|
55
|
+
sendCommand(command, ...args) {
|
|
56
|
+
return my.storeClient.sendCommand([command, ...args]);
|
|
57
|
+
},
|
|
58
|
+
async exec() {
|
|
59
|
+
if (commands.length === 0)
|
|
60
|
+
return [];
|
|
61
|
+
const sameKey = commands.every((cmd) => {
|
|
62
|
+
return cmd.args[0] === commands[0].args[0];
|
|
63
|
+
});
|
|
64
|
+
if (sameKey) {
|
|
65
|
+
const multi = my.storeClient.multi();
|
|
66
|
+
commands.forEach((cmd) => {
|
|
67
|
+
if (cmd.command === 'ZADD') {
|
|
68
|
+
return multi.ZADD(cmd.args[0], cmd.args[1], cmd.args[2]);
|
|
69
|
+
}
|
|
70
|
+
return multi[cmd.command](...cmd.args);
|
|
71
|
+
});
|
|
72
|
+
const results = await multi.exec();
|
|
73
|
+
return results.map((item) => item);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
return Promise.all(commands.map((cmd) => {
|
|
77
|
+
if (cmd.command === 'ZADD') {
|
|
78
|
+
return my.storeClient.ZADD(cmd.args[0], cmd.args[1], cmd.args[2]);
|
|
79
|
+
}
|
|
80
|
+
return my.storeClient[cmd.command](...cmd.args);
|
|
81
|
+
}));
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
XADD(key, id, fields, message) {
|
|
85
|
+
return addCommand('XADD', [key, id, fields, message]);
|
|
86
|
+
},
|
|
87
|
+
XACK(key, group, id) {
|
|
88
|
+
return addCommand('XACK', [key, group, id]);
|
|
89
|
+
},
|
|
90
|
+
XDEL(key, id) {
|
|
91
|
+
return addCommand('XDEL', [key, id]);
|
|
92
|
+
},
|
|
93
|
+
XLEN(key) {
|
|
94
|
+
return addCommand('XLEN', [key]);
|
|
95
|
+
},
|
|
96
|
+
XCLAIM(key, group, consumer, minIdleTime, id, ...args) {
|
|
97
|
+
return addCommand('XCLAIM', [
|
|
98
|
+
key,
|
|
99
|
+
group,
|
|
100
|
+
consumer,
|
|
101
|
+
minIdleTime,
|
|
102
|
+
id,
|
|
103
|
+
...args,
|
|
104
|
+
]);
|
|
105
|
+
},
|
|
106
|
+
XPENDING(key, group, start, end, count, consumer) {
|
|
107
|
+
return addCommand('XPENDING', [
|
|
108
|
+
key,
|
|
109
|
+
group,
|
|
110
|
+
start,
|
|
111
|
+
end,
|
|
112
|
+
count,
|
|
113
|
+
consumer,
|
|
114
|
+
]);
|
|
115
|
+
},
|
|
116
|
+
DEL: function (key) {
|
|
117
|
+
return addCommand('DEL', [key]);
|
|
118
|
+
},
|
|
119
|
+
EXPIRE: function (key, seconds) {
|
|
120
|
+
return addCommand('EXPIRE', [key, seconds]);
|
|
121
|
+
},
|
|
122
|
+
HDEL(key, itemId) {
|
|
123
|
+
return addCommand('HDEL', [key, itemId]);
|
|
124
|
+
},
|
|
125
|
+
HGET(key, itemId) {
|
|
126
|
+
return addCommand('HGET', [key, itemId]);
|
|
127
|
+
},
|
|
128
|
+
HGETALL(key) {
|
|
129
|
+
return addCommand('HGETALL', [key]);
|
|
130
|
+
},
|
|
131
|
+
HINCRBYFLOAT(key, itemId, value) {
|
|
132
|
+
return addCommand('HINCRBYFLOAT', [key, itemId, value]);
|
|
133
|
+
},
|
|
134
|
+
HMGET(key, itemIds) {
|
|
135
|
+
return addCommand('HMGET', [key, itemIds]);
|
|
136
|
+
},
|
|
137
|
+
HSET(key, values) {
|
|
138
|
+
return addCommand('HSET', [key, values]);
|
|
139
|
+
},
|
|
140
|
+
LRANGE(key, start, end) {
|
|
141
|
+
return addCommand('LRANGE', [key, start, end]);
|
|
142
|
+
},
|
|
143
|
+
RPUSH(key, items) {
|
|
144
|
+
return addCommand('RPUSH', [key, items]);
|
|
145
|
+
},
|
|
146
|
+
ZADD(key, args, opts) {
|
|
147
|
+
return addCommand('ZADD', [key, args, opts]);
|
|
148
|
+
},
|
|
149
|
+
XGROUP(command, key, groupName, id, mkStream) {
|
|
150
|
+
return addCommand('XGROUP', [command, key, groupName, id, mkStream]);
|
|
151
|
+
},
|
|
152
|
+
EXISTS: function (key) {
|
|
153
|
+
throw new Error('Function not implemented.');
|
|
154
|
+
},
|
|
155
|
+
HMPUSH: function (key, values) {
|
|
156
|
+
throw new Error('Function not implemented.');
|
|
157
|
+
},
|
|
158
|
+
LPUSH: function (key, items) {
|
|
159
|
+
throw new Error('Function not implemented.');
|
|
160
|
+
},
|
|
161
|
+
SET: function (key, value) {
|
|
162
|
+
throw new Error('Function not implemented.');
|
|
163
|
+
},
|
|
164
|
+
ZRANGE_WITHSCORES: function (key, start, end) {
|
|
165
|
+
throw new Error('Function not implemented.');
|
|
166
|
+
},
|
|
167
|
+
ZRANK: function (key, member) {
|
|
168
|
+
throw new Error('Function not implemented.');
|
|
169
|
+
},
|
|
170
|
+
ZSCORE: function (key, value) {
|
|
171
|
+
throw new Error('Function not implemented.');
|
|
172
|
+
},
|
|
173
|
+
};
|
|
174
|
+
return multiInstance;
|
|
175
|
+
}
|
|
176
|
+
return this.storeClient.multi();
|
|
177
|
+
}
|
|
178
|
+
async exec(...args) {
|
|
179
|
+
return await this.storeClient.sendCommand(args);
|
|
180
|
+
}
|
|
181
|
+
async setnxex(key, value, expireSeconds) {
|
|
182
|
+
const status = await this.storeClient[this.commands.set](key, value, { NX: true, EX: expireSeconds });
|
|
183
|
+
return this.isSuccessful(status);
|
|
184
|
+
}
|
|
185
|
+
async zAdd(key, score, value, redisMulti) {
|
|
186
|
+
return await (redisMulti || this.storeClient)[this.commands.zadd](key, {
|
|
187
|
+
score: score,
|
|
188
|
+
value: value.toString(),
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
async zRangeByScore(key, score, value) {
|
|
192
|
+
const result = await this.storeClient[this.commands.zrangebyscore](key, score, value);
|
|
193
|
+
if (result?.length > 0) {
|
|
194
|
+
return result[0];
|
|
195
|
+
}
|
|
196
|
+
return null;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
exports.RedisStoreService = RedisStoreService;
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -26,6 +26,8 @@ export declare abstract class StreamService<ClientProvider extends ProviderClien
|
|
|
26
26
|
initialBackoff?: number;
|
|
27
27
|
maxBackoff?: number;
|
|
28
28
|
maxRetries?: number;
|
|
29
|
+
enableNotifications?: boolean;
|
|
30
|
+
notificationCallback?: (messages: StreamMessage[]) => void;
|
|
29
31
|
}): Promise<StreamMessage[]>;
|
|
30
32
|
abstract transact(): ProviderTransaction;
|
|
31
33
|
abstract ackAndDelete(streamName: string, groupName: string, messageIds: string[], options?: StringAnyType): Promise<number>;
|
|
@@ -58,7 +60,10 @@ export declare abstract class StreamService<ClientProvider extends ProviderClien
|
|
|
58
60
|
supportsOrdering: boolean;
|
|
59
61
|
supportsTrimming: boolean;
|
|
60
62
|
supportsRetry: boolean;
|
|
63
|
+
supportsNotifications?: boolean;
|
|
61
64
|
maxMessageSize: number;
|
|
62
65
|
maxBatchSize: number;
|
|
63
66
|
};
|
|
67
|
+
stopNotificationConsumer?(streamName: string, groupName: string): Promise<void>;
|
|
68
|
+
cleanup?(): Promise<void>;
|
|
64
69
|
}
|
|
@@ -1 +1,225 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NatsStreamService = void 0;
|
|
4
|
+
const index_1 = require("../../index");
|
|
5
|
+
const key_1 = require("../../../../modules/key");
|
|
6
|
+
const enums_1 = require("../../../../modules/enums");
|
|
7
|
+
const utils_1 = require("../../../../modules/utils");
|
|
8
|
+
class NatsStreamService extends index_1.StreamService {
|
|
9
|
+
constructor(streamClient, storeClient, config = {}) {
|
|
10
|
+
super(streamClient, storeClient, config);
|
|
11
|
+
this.jetstream = streamClient.jetstream();
|
|
12
|
+
}
|
|
13
|
+
async init(namespace, appId, logger) {
|
|
14
|
+
this.namespace = namespace;
|
|
15
|
+
this.logger = logger;
|
|
16
|
+
this.appId = appId;
|
|
17
|
+
this.jsm = await this.jetstream.jetstreamManager();
|
|
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, {
|
|
23
|
+
...params,
|
|
24
|
+
appId: this.appId,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
transact() {
|
|
28
|
+
return {};
|
|
29
|
+
}
|
|
30
|
+
async createStream(streamName) {
|
|
31
|
+
try {
|
|
32
|
+
const config = {
|
|
33
|
+
name: streamName,
|
|
34
|
+
subjects: [`${streamName}.*`],
|
|
35
|
+
retention: 'workqueue',
|
|
36
|
+
storage: 'memory',
|
|
37
|
+
num_replicas: 1,
|
|
38
|
+
};
|
|
39
|
+
await this.jsm.streams.add(config);
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
this.logger.error(`Error creating stream ${streamName}`, { error });
|
|
44
|
+
throw error;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async deleteStream(streamName) {
|
|
48
|
+
try {
|
|
49
|
+
await this.jsm.streams.delete(streamName);
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
this.logger.error(`Error deleting stream ${streamName}`, { error });
|
|
54
|
+
throw error;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async createConsumerGroup(streamName, groupName) {
|
|
58
|
+
try {
|
|
59
|
+
const consumerConfig = {
|
|
60
|
+
durable_name: groupName,
|
|
61
|
+
deliver_group: groupName,
|
|
62
|
+
ack_policy: 'explicit',
|
|
63
|
+
ack_wait: 30 * 1000,
|
|
64
|
+
max_deliver: 10,
|
|
65
|
+
};
|
|
66
|
+
await this.jsm.consumers.add(streamName, consumerConfig);
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
this.logger.error(`Error creating consumer group ${groupName} for stream ${streamName}`, { error });
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
async deleteConsumerGroup(streamName, groupName) {
|
|
75
|
+
try {
|
|
76
|
+
await this.jsm.consumers.delete(streamName, groupName);
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
this.logger.error(`Error deleting consumer group ${groupName} for stream ${streamName}`, { error });
|
|
81
|
+
throw error;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async publishMessages(streamName, messages, options) {
|
|
85
|
+
try {
|
|
86
|
+
const publishPromises = messages.map(async (message) => {
|
|
87
|
+
const subject = `${streamName}.message`;
|
|
88
|
+
const ack = await this.jetstream.publish(subject, Buffer.from(message));
|
|
89
|
+
return ack;
|
|
90
|
+
});
|
|
91
|
+
const acks = await Promise.all(publishPromises);
|
|
92
|
+
return acks.map((ack) => ack.seq.toString());
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
this.logger.error(`Error publishing messages to ${streamName}`, {
|
|
96
|
+
error,
|
|
97
|
+
});
|
|
98
|
+
throw error;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
async consumeMessages(streamName, groupName, consumerName, options) {
|
|
102
|
+
try {
|
|
103
|
+
const consumer = await this.jetstream.consumers.get(streamName, groupName);
|
|
104
|
+
const messages = [];
|
|
105
|
+
const fetchOptions = {
|
|
106
|
+
max_messages: options?.batchSize || 1,
|
|
107
|
+
expires: options?.blockTimeout || enums_1.HMSH_BLOCK_TIME_MS,
|
|
108
|
+
};
|
|
109
|
+
const fetchedMessages = await consumer.fetch(fetchOptions);
|
|
110
|
+
for await (const msg of fetchedMessages) {
|
|
111
|
+
messages.push({
|
|
112
|
+
id: msg.seq.toString(),
|
|
113
|
+
data: (0, utils_1.parseStreamMessage)(msg.string()),
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
return messages;
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
this.logger.error(`Error consuming messages from ${streamName}`, {
|
|
120
|
+
error,
|
|
121
|
+
});
|
|
122
|
+
throw error;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
async ackAndDelete(streamName, groupName, messageIds) {
|
|
126
|
+
try {
|
|
127
|
+
await this.acknowledgeMessages(streamName, groupName, messageIds);
|
|
128
|
+
return messageIds.length;
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
this.logger.error(`Error in ack and delete for stream ${streamName}`, {
|
|
132
|
+
error,
|
|
133
|
+
});
|
|
134
|
+
throw error;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
async acknowledgeMessages(streamName, groupName, messageIds, options) {
|
|
138
|
+
//no-op
|
|
139
|
+
return messageIds.length;
|
|
140
|
+
}
|
|
141
|
+
async deleteMessages(streamName, groupName, messageIds, options) {
|
|
142
|
+
try {
|
|
143
|
+
await Promise.all(messageIds.map((id) => this.jsm.streams.deleteMessage(streamName, parseInt(id))));
|
|
144
|
+
return messageIds.length;
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
this.logger.error(`Error deleting messages from ${streamName}`, {
|
|
148
|
+
error,
|
|
149
|
+
});
|
|
150
|
+
throw error;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
async retryMessages(streamName, groupName, options) {
|
|
154
|
+
return [];
|
|
155
|
+
}
|
|
156
|
+
async getStreamStats(streamName) {
|
|
157
|
+
try {
|
|
158
|
+
const info = await this.jsm.streams.info(streamName);
|
|
159
|
+
return {
|
|
160
|
+
messageCount: info.state.messages,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
this.logger.error(`Error getting stats for ${streamName}`, { error });
|
|
165
|
+
throw error;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
async getStreamDepth(streamName) {
|
|
169
|
+
try {
|
|
170
|
+
const info = await this.jsm.streams.info(streamName);
|
|
171
|
+
return info.state.messages;
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
this.logger.error(`Error getting depth for ${streamName}`, { error });
|
|
175
|
+
throw error;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
async getStreamDepths(streamNames) {
|
|
179
|
+
try {
|
|
180
|
+
const results = await Promise.all(streamNames.map(async ({ stream }) => ({
|
|
181
|
+
stream,
|
|
182
|
+
depth: await this.getStreamDepth(stream),
|
|
183
|
+
})));
|
|
184
|
+
return results;
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
this.logger.error('Error getting multiple stream depths', { error });
|
|
188
|
+
throw error;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
async trimStream(streamName, options) {
|
|
192
|
+
try {
|
|
193
|
+
// Retrieve the current stream info
|
|
194
|
+
const streamInfo = await this.jsm.streams.info(streamName);
|
|
195
|
+
const config = { ...streamInfo.config }; // Clone to avoid direct mutation
|
|
196
|
+
// Apply new limits based on options
|
|
197
|
+
if (options.maxLen !== undefined) {
|
|
198
|
+
config.max_msgs = options.maxLen;
|
|
199
|
+
}
|
|
200
|
+
if (options.maxAge !== undefined) {
|
|
201
|
+
config.max_age = options.maxAge * 1e9; // Convert maxAge to nanoseconds
|
|
202
|
+
}
|
|
203
|
+
// Update the stream with the modified config
|
|
204
|
+
await this.jsm.streams.update(streamName, config);
|
|
205
|
+
return 0; // Trimming is applied automatically based on updated config
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
this.logger.error(`Error trimming stream ${streamName}`, { error });
|
|
209
|
+
throw error;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
getProviderSpecificFeatures() {
|
|
213
|
+
return {
|
|
214
|
+
supportsBatching: true,
|
|
215
|
+
supportsDeadLetterQueue: true,
|
|
216
|
+
supportsOrdering: true,
|
|
217
|
+
supportsTrimming: true,
|
|
218
|
+
supportsRetry: false,
|
|
219
|
+
supportsNotifications: false,
|
|
220
|
+
maxMessageSize: 1024 * 1024,
|
|
221
|
+
maxBatchSize: 256,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
exports.NatsStreamService = NatsStreamService;
|