@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.
- package/build/modules/enums.d.ts +110 -0
- package/build/modules/enums.js +134 -0
- package/build/modules/errors.d.ts +124 -0
- package/build/modules/errors.js +191 -0
- package/build/modules/key.d.ts +66 -0
- package/build/modules/key.js +190 -0
- package/build/modules/storage.d.ts +3 -0
- package/build/modules/storage.js +5 -0
- package/build/modules/utils.d.ts +119 -0
- package/build/modules/utils.js +374 -0
- package/build/package.json +1 -1
- package/build/services/activities/activity.d.ts +104 -0
- package/build/services/activities/activity.js +549 -0
- package/build/services/activities/await.d.ts +12 -0
- package/build/services/activities/await.js +114 -0
- package/build/services/activities/cycle.d.ts +19 -0
- package/build/services/activities/cycle.js +112 -0
- package/build/services/activities/hook.d.ts +27 -0
- package/build/services/activities/hook.js +168 -0
- package/build/services/activities/index.d.ts +19 -0
- package/build/services/activities/index.js +20 -0
- package/build/services/activities/interrupt.d.ts +16 -0
- package/build/services/activities/interrupt.js +158 -0
- package/build/services/activities/signal.d.ts +20 -0
- package/build/services/activities/signal.js +134 -0
- package/build/services/activities/trigger.d.ts +37 -0
- package/build/services/activities/trigger.js +246 -0
- package/build/services/activities/worker.d.ts +12 -0
- package/build/services/activities/worker.js +106 -0
- package/build/services/collator/index.d.ts +111 -0
- package/build/services/collator/index.js +293 -0
- package/build/services/compiler/deployer.d.ts +40 -0
- package/build/services/compiler/deployer.js +488 -0
- package/build/services/compiler/index.d.ts +32 -0
- package/build/services/compiler/index.js +112 -0
- package/build/services/compiler/validator.d.ts +34 -0
- package/build/services/compiler/validator.js +147 -0
- package/build/services/connector/factory.d.ts +22 -0
- package/build/services/connector/factory.js +99 -0
- package/build/services/connector/index.d.ts +30 -0
- package/build/services/connector/index.js +54 -0
- package/build/services/connector/providers/ioredis.d.ts +9 -0
- package/build/services/connector/providers/ioredis.js +26 -0
- package/build/services/connector/providers/nats.d.ts +9 -0
- package/build/services/connector/providers/nats.js +34 -0
- package/build/services/connector/providers/postgres.d.ts +20 -0
- package/build/services/connector/providers/postgres.js +102 -0
- package/build/services/connector/providers/redis.d.ts +9 -0
- package/build/services/connector/providers/redis.js +38 -0
- package/build/services/engine/index.d.ts +264 -0
- package/build/services/engine/index.js +761 -0
- package/build/services/exporter/index.d.ts +44 -0
- package/build/services/exporter/index.js +126 -0
- package/build/services/hotmesh/index.d.ts +483 -0
- package/build/services/hotmesh/index.js +622 -0
- package/build/services/logger/index.d.ts +16 -0
- package/build/services/logger/index.js +54 -0
- package/build/services/mapper/index.d.ts +28 -0
- package/build/services/mapper/index.js +81 -0
- package/build/services/memflow/client.d.ts +108 -0
- package/build/services/memflow/client.js +372 -0
- package/build/services/memflow/connection.d.ts +23 -0
- package/build/services/memflow/connection.js +33 -0
- package/build/services/memflow/context.d.ts +143 -0
- package/build/services/memflow/context.js +299 -0
- package/build/services/memflow/exporter.d.ts +51 -0
- package/build/services/memflow/exporter.js +215 -0
- package/build/services/memflow/handle.d.ts +90 -0
- package/build/services/memflow/handle.js +176 -0
- package/build/services/memflow/index.d.ts +116 -0
- package/build/services/memflow/index.js +122 -0
- package/build/services/memflow/schemas/factory.d.ts +29 -0
- package/build/services/memflow/schemas/factory.js +2492 -0
- package/build/services/memflow/search.d.ts +142 -0
- package/build/services/memflow/search.js +320 -0
- package/build/services/memflow/worker.d.ts +124 -0
- package/build/services/memflow/worker.js +514 -0
- package/build/services/memflow/workflow/all.d.ts +7 -0
- package/build/services/memflow/workflow/all.js +15 -0
- package/build/services/memflow/workflow/common.d.ts +20 -0
- package/build/services/memflow/workflow/common.js +47 -0
- package/build/services/memflow/workflow/context.d.ts +6 -0
- package/build/services/memflow/workflow/context.js +45 -0
- package/build/services/memflow/workflow/contextMethods.d.ts +14 -0
- package/build/services/memflow/workflow/contextMethods.js +33 -0
- package/build/services/memflow/workflow/didRun.d.ts +7 -0
- package/build/services/memflow/workflow/didRun.js +22 -0
- package/build/services/memflow/workflow/emit.d.ts +11 -0
- package/build/services/memflow/workflow/emit.js +29 -0
- package/build/services/memflow/workflow/enrich.d.ts +9 -0
- package/build/services/memflow/workflow/enrich.js +17 -0
- package/build/services/memflow/workflow/execChild.d.ts +18 -0
- package/build/services/memflow/workflow/execChild.js +102 -0
- package/build/services/memflow/workflow/execHook.d.ts +65 -0
- package/build/services/memflow/workflow/execHook.js +73 -0
- package/build/services/memflow/workflow/hook.d.ts +9 -0
- package/build/services/memflow/workflow/hook.js +56 -0
- package/build/services/memflow/workflow/index.d.ts +74 -0
- package/build/services/memflow/workflow/index.js +87 -0
- package/build/services/memflow/workflow/interrupt.d.ts +9 -0
- package/build/services/memflow/workflow/interrupt.js +24 -0
- package/build/services/memflow/workflow/isSideEffectAllowed.d.ts +10 -0
- package/build/services/memflow/workflow/isSideEffectAllowed.js +33 -0
- package/build/services/memflow/workflow/proxyActivities.d.ts +20 -0
- package/build/services/memflow/workflow/proxyActivities.js +97 -0
- package/build/services/memflow/workflow/random.d.ts +6 -0
- package/build/services/memflow/workflow/random.js +16 -0
- package/build/services/memflow/workflow/searchMethods.d.ts +6 -0
- package/build/services/memflow/workflow/searchMethods.js +25 -0
- package/build/services/memflow/workflow/signal.d.ts +7 -0
- package/build/services/memflow/workflow/signal.js +28 -0
- package/build/services/memflow/workflow/sleepFor.d.ts +8 -0
- package/build/services/memflow/workflow/sleepFor.js +35 -0
- package/build/services/memflow/workflow/trace.d.ts +14 -0
- package/build/services/memflow/workflow/trace.js +33 -0
- package/build/services/memflow/workflow/waitFor.d.ts +8 -0
- package/build/services/memflow/workflow/waitFor.js +35 -0
- package/build/services/meshcall/index.d.ts +194 -0
- package/build/services/meshcall/index.js +452 -0
- package/build/services/meshcall/schemas/factory.d.ts +9 -0
- package/build/services/meshcall/schemas/factory.js +189 -0
- package/build/services/meshdata/index.d.ts +795 -0
- package/build/services/meshdata/index.js +1235 -0
- package/build/services/meshos/index.d.ts +293 -0
- package/build/services/meshos/index.js +547 -0
- package/build/services/pipe/functions/array.d.ts +17 -0
- package/build/services/pipe/functions/array.js +74 -0
- package/build/services/pipe/functions/bitwise.d.ts +9 -0
- package/build/services/pipe/functions/bitwise.js +24 -0
- package/build/services/pipe/functions/conditional.d.ts +13 -0
- package/build/services/pipe/functions/conditional.js +36 -0
- package/build/services/pipe/functions/cron.d.ts +12 -0
- package/build/services/pipe/functions/cron.js +40 -0
- package/build/services/pipe/functions/date.d.ts +58 -0
- package/build/services/pipe/functions/date.js +171 -0
- package/build/services/pipe/functions/index.d.ts +29 -0
- package/build/services/pipe/functions/index.js +30 -0
- package/build/services/pipe/functions/json.d.ts +5 -0
- package/build/services/pipe/functions/json.js +12 -0
- package/build/services/pipe/functions/logical.d.ts +5 -0
- package/build/services/pipe/functions/logical.js +12 -0
- package/build/services/pipe/functions/math.d.ts +42 -0
- package/build/services/pipe/functions/math.js +184 -0
- package/build/services/pipe/functions/number.d.ts +21 -0
- package/build/services/pipe/functions/number.js +60 -0
- package/build/services/pipe/functions/object.d.ts +25 -0
- package/build/services/pipe/functions/object.js +81 -0
- package/build/services/pipe/functions/string.d.ts +23 -0
- package/build/services/pipe/functions/string.js +69 -0
- package/build/services/pipe/functions/symbol.d.ts +12 -0
- package/build/services/pipe/functions/symbol.js +33 -0
- package/build/services/pipe/functions/unary.d.ts +7 -0
- package/build/services/pipe/functions/unary.js +18 -0
- package/build/services/pipe/index.d.ts +48 -0
- package/build/services/pipe/index.js +242 -0
- package/build/services/quorum/index.d.ts +90 -0
- package/build/services/quorum/index.js +263 -0
- package/build/services/reporter/index.d.ts +50 -0
- package/build/services/reporter/index.js +348 -0
- 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 +57 -0
- package/build/services/router/index.js +121 -0
- 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/factory.d.ts +7 -0
- package/build/services/search/factory.js +24 -0
- package/build/services/search/index.d.ts +23 -0
- package/build/services/search/index.js +10 -0
- package/build/services/search/providers/postgres/postgres.d.ts +25 -0
- package/build/services/search/providers/postgres/postgres.js +149 -0
- package/build/services/search/providers/redis/ioredis.d.ts +19 -0
- package/build/services/search/providers/redis/ioredis.js +121 -0
- package/build/services/search/providers/redis/redis.d.ts +19 -0
- package/build/services/search/providers/redis/redis.js +134 -0
- package/build/services/serializer/index.d.ts +42 -0
- package/build/services/serializer/index.js +282 -0
- package/build/services/store/cache.d.ts +67 -0
- package/build/services/store/cache.js +128 -0
- package/build/services/store/factory.d.ts +8 -0
- package/build/services/store/factory.js +24 -0
- package/build/services/store/index.d.ts +89 -0
- package/build/services/store/index.js +9 -0
- package/build/services/store/providers/postgres/kvsql.d.ts +168 -0
- package/build/services/store/providers/postgres/kvsql.js +198 -0
- package/build/services/store/providers/postgres/kvtables.d.ts +20 -0
- package/build/services/store/providers/postgres/kvtables.js +441 -0
- package/build/services/store/providers/postgres/kvtransaction.d.ts +36 -0
- package/build/services/store/providers/postgres/kvtransaction.js +248 -0
- package/build/services/store/providers/postgres/kvtypes/hash.d.ts +60 -0
- package/build/services/store/providers/postgres/kvtypes/hash.js +1287 -0
- package/build/services/store/providers/postgres/kvtypes/list.d.ts +33 -0
- package/build/services/store/providers/postgres/kvtypes/list.js +194 -0
- package/build/services/store/providers/postgres/kvtypes/string.d.ts +20 -0
- package/build/services/store/providers/postgres/kvtypes/string.js +115 -0
- package/build/services/store/providers/postgres/kvtypes/zset.d.ts +41 -0
- package/build/services/store/providers/postgres/kvtypes/zset.js +214 -0
- package/build/services/store/providers/postgres/postgres.d.ts +145 -0
- package/build/services/store/providers/postgres/postgres.js +1036 -0
- package/build/services/store/providers/redis/_base.d.ts +137 -0
- package/build/services/store/providers/redis/_base.js +980 -0
- package/build/services/store/providers/redis/ioredis.d.ts +20 -0
- package/build/services/store/providers/redis/ioredis.js +180 -0
- package/build/services/store/providers/redis/redis.d.ts +18 -0
- package/build/services/store/providers/redis/redis.js +199 -0
- package/build/services/store/providers/store-initializable.d.ts +5 -0
- package/build/services/store/providers/store-initializable.js +2 -0
- package/build/services/stream/factory.d.ts +8 -0
- package/build/services/stream/factory.js +37 -0
- package/build/services/stream/index.d.ts +69 -0
- package/build/services/stream/index.js +11 -0
- package/build/services/stream/providers/nats/nats.d.ts +60 -0
- package/build/services/stream/providers/nats/nats.js +225 -0
- package/build/services/stream/providers/postgres/kvtables.d.ts +3 -0
- package/build/services/stream/providers/postgres/kvtables.js +146 -0
- package/build/services/stream/providers/postgres/postgres.d.ts +107 -0
- package/build/services/stream/providers/postgres/postgres.js +519 -0
- package/build/services/stream/providers/redis/ioredis.d.ts +61 -0
- package/build/services/stream/providers/redis/ioredis.js +272 -0
- package/build/services/stream/providers/redis/redis.d.ts +61 -0
- package/build/services/stream/providers/redis/redis.js +305 -0
- package/build/services/stream/providers/stream-initializable.d.ts +4 -0
- package/build/services/stream/providers/stream-initializable.js +2 -0
- package/build/services/sub/factory.d.ts +7 -0
- package/build/services/sub/factory.js +29 -0
- package/build/services/sub/index.d.ts +22 -0
- package/build/services/sub/index.js +10 -0
- package/build/services/sub/providers/nats/nats.d.ts +19 -0
- package/build/services/sub/providers/nats/nats.js +105 -0
- package/build/services/sub/providers/postgres/postgres.d.ts +19 -0
- package/build/services/sub/providers/postgres/postgres.js +92 -0
- package/build/services/sub/providers/redis/ioredis.d.ts +17 -0
- package/build/services/sub/providers/redis/ioredis.js +81 -0
- package/build/services/sub/providers/redis/redis.d.ts +17 -0
- package/build/services/sub/providers/redis/redis.js +72 -0
- package/build/services/task/index.d.ts +36 -0
- package/build/services/task/index.js +206 -0
- package/build/services/telemetry/index.d.ts +52 -0
- package/build/services/telemetry/index.js +306 -0
- package/build/services/worker/index.d.ts +77 -0
- package/build/services/worker/index.js +197 -0
- package/package.json +1 -1
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -38
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
- package/typedoc.json +0 -47
- 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/memflow.ts +0 -645
- package/types/meshcall.ts +0 -235
- package/types/meshdata.ts +0 -278
- package/types/ms.d.ts +0 -7
- package/types/nats.ts +0 -270
- package/types/pipe.ts +0 -90
- package/types/postgres.ts +0 -114
- 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 -231
- package/types/task.ts +0 -7
- package/types/telemetry.ts +0 -16
- 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 };
|