@restorecommerce/chassis-srv 1.6.8 → 1.7.0
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/CHANGELOG.md +16 -0
- package/lib/cache/index.d.ts +1 -0
- package/lib/cache/index.d.ts.map +1 -0
- package/lib/cache/index.js +10 -38
- package/lib/cache/index.js.map +1 -1
- package/lib/command-interface/index.d.ts +4 -3
- package/lib/command-interface/index.d.ts.map +1 -0
- package/lib/command-interface/index.js +67 -74
- package/lib/command-interface/index.js.map +1 -1
- package/lib/config/index.d.ts +1 -0
- package/lib/config/index.d.ts.map +1 -0
- package/lib/config/index.js +5 -10
- package/lib/config/index.js.map +1 -1
- package/lib/database/index.d.ts +3 -2
- package/lib/database/index.d.ts.map +1 -0
- package/lib/database/index.js +6 -11
- package/lib/database/index.js.map +1 -1
- package/lib/database/provider/arango/base.d.ts +4 -3
- package/lib/database/provider/arango/base.d.ts.map +1 -0
- package/lib/database/provider/arango/base.js +32 -59
- package/lib/database/provider/arango/base.js.map +1 -1
- package/lib/database/provider/arango/common.d.ts +1 -0
- package/lib/database/provider/arango/common.d.ts.map +1 -0
- package/lib/database/provider/arango/common.js +56 -98
- package/lib/database/provider/arango/common.js.map +1 -1
- package/lib/database/provider/arango/graph.d.ts +8 -7
- package/lib/database/provider/arango/graph.d.ts.map +1 -0
- package/lib/database/provider/arango/graph.js +20 -45
- package/lib/database/provider/arango/graph.js.map +1 -1
- package/lib/database/provider/arango/index.d.ts +2 -1
- package/lib/database/provider/arango/index.d.ts.map +1 -0
- package/lib/database/provider/arango/index.js +10 -40
- package/lib/database/provider/arango/index.js.map +1 -1
- package/lib/database/provider/arango/interface.d.ts +1 -0
- package/lib/database/provider/arango/interface.d.ts.map +1 -0
- package/lib/database/provider/arango/interface.js +1 -2
- package/lib/database/provider/arango/utils.d.ts +2 -1
- package/lib/database/provider/arango/utils.d.ts.map +1 -0
- package/lib/database/provider/arango/utils.js +56 -96
- package/lib/database/provider/arango/utils.js.map +1 -1
- package/lib/database/provider/nedb/index.d.ts +1 -0
- package/lib/database/provider/nedb/index.d.ts.map +1 -0
- package/lib/database/provider/nedb/index.js +6 -35
- package/lib/database/provider/nedb/index.js.map +1 -1
- package/lib/health/index.d.ts +5 -4
- package/lib/health/index.d.ts.map +1 -0
- package/lib/health/index.js +16 -17
- package/lib/health/index.js.map +1 -1
- package/lib/index.d.ts +17 -16
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +27 -54
- package/lib/index.js.map +1 -1
- package/lib/microservice/errors.d.ts +1 -0
- package/lib/microservice/errors.d.ts.map +1 -0
- package/lib/microservice/errors.js +60 -33
- package/lib/microservice/errors.js.map +1 -1
- package/lib/microservice/server.d.ts +3 -2
- package/lib/microservice/server.d.ts.map +1 -0
- package/lib/microservice/server.js +13 -37
- package/lib/microservice/server.js.map +1 -1
- package/lib/microservice/transport/provider/grpc/index.d.ts +3 -2
- package/lib/microservice/transport/provider/grpc/index.d.ts.map +1 -0
- package/lib/microservice/transport/provider/grpc/index.js +16 -38
- package/lib/microservice/transport/provider/grpc/index.js.map +1 -1
- package/lib/microservice/transport/provider/grpc/middlewares.d.ts +2 -1
- package/lib/microservice/transport/provider/grpc/middlewares.d.ts.map +1 -0
- package/lib/microservice/transport/provider/grpc/middlewares.js +12 -18
- package/lib/microservice/transport/provider/grpc/middlewares.js.map +1 -1
- package/lib/microservice/transport/provider/grpc/reflection.d.ts +2 -1
- package/lib/microservice/transport/provider/grpc/reflection.d.ts.map +1 -0
- package/lib/microservice/transport/provider/grpc/reflection.js +8 -12
- package/lib/microservice/transport/provider/grpc/reflection.js.map +1 -1
- package/lib/offsets/index.d.ts +14 -12
- package/lib/offsets/index.d.ts.map +1 -0
- package/lib/offsets/index.js +37 -62
- package/lib/offsets/index.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -0
- package/package.json +18 -25
- package/tsconfig.json +3 -19
- package/tsconfig.test.json +2 -1
- package/vitest.config.ts +2 -0
|
@@ -1,18 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const descriptor_1 = require("@restorecommerce/rc-grpc-clients/dist/generated/google/protobuf/descriptor");
|
|
7
|
-
const buildReflectionService = (services) => {
|
|
8
|
-
const set = new descriptor_pb_1.FileDescriptorSet();
|
|
1
|
+
import { FileDescriptorSet, FileDescriptorProto as FileDescriptorProtoGoogle } from 'google-protobuf/google/protobuf/descriptor_pb.js';
|
|
2
|
+
import { ServerReflection, } from 'nice-grpc-server-reflection';
|
|
3
|
+
import { FileDescriptorProto } from '@restorecommerce/rc-grpc-clients/dist/generated/google/protobuf/descriptor.js';
|
|
4
|
+
export const buildReflectionService = (services) => {
|
|
5
|
+
const set = new FileDescriptorSet();
|
|
9
6
|
const names = [];
|
|
10
7
|
services.forEach((service, i) => {
|
|
11
|
-
const serialized =
|
|
12
|
-
set.addFile(
|
|
8
|
+
const serialized = FileDescriptorProto.encode(service.descriptor).finish();
|
|
9
|
+
set.addFile(FileDescriptorProtoGoogle.deserializeBinary(serialized), i);
|
|
13
10
|
names.push(service.name || service.descriptor.name + '.Service');
|
|
14
11
|
});
|
|
15
|
-
return
|
|
12
|
+
return ServerReflection(set.serializeBinary(), names);
|
|
16
13
|
};
|
|
17
|
-
exports.buildReflectionService = buildReflectionService;
|
|
18
14
|
//# sourceMappingURL=reflection.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reflection.js","sourceRoot":"","sources":["../../../../../src/microservice/transport/provider/grpc/reflection.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"reflection.js","sourceRoot":"","sources":["../../../../../src/microservice/transport/provider/grpc/reflection.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EACjB,mBAAmB,IAAI,yBAAyB,EACjD,MAAM,kDAAkD,CAAC;AAC1D,OAAO,EAAE,gBAAgB,GAAG,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,+EAA+E,CAAC;AAKpH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,QAGpC,EAAmD,EAAE;IACtD,MAAM,GAAG,GAAG,IAAI,iBAAiB,EAAE,CAAC;IACpC,MAAM,KAAK,GAAU,EAAE,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE;QAC9B,MAAM,UAAU,GAAG,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,CAAC;QAC3E,GAAG,CAAC,OAAO,CAAC,yBAAyB,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QACxE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,GAAG,UAAU,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IACH,OAAO,gBAAgB,CAAC,GAAG,CAAC,eAAe,EAAE,EAAE,KAAK,CAAC,CAAC;AACxD,CAAC,CAAC"}
|
package/lib/offsets/index.d.ts
CHANGED
|
@@ -1,40 +1,42 @@
|
|
|
1
1
|
import { Events, Topic } from '@restorecommerce/kafka-client';
|
|
2
2
|
import { RedisClientType } from 'redis';
|
|
3
|
-
import {
|
|
3
|
+
import { type ServiceConfig } from '@restorecommerce/service-config';
|
|
4
|
+
import { type Logger } from '@restorecommerce/logger';
|
|
4
5
|
/**
|
|
5
6
|
* Stores the offsets of the provided topics to redis periodically
|
|
6
7
|
*/
|
|
7
8
|
export declare class OffsetStore {
|
|
8
|
-
|
|
9
|
-
config:
|
|
10
|
-
|
|
11
|
-
redisClient
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
constructor(
|
|
9
|
+
protected readonly kafkaEvents: Events;
|
|
10
|
+
protected readonly config: ServiceConfig;
|
|
11
|
+
protected readonly logger?: Logger;
|
|
12
|
+
protected readonly redisClient?: RedisClientType;
|
|
13
|
+
protected readonly timerID: NodeJS.Timeout[];
|
|
14
|
+
protected readonly prefix: string;
|
|
15
|
+
constructor(kafkaEvents: Events, config: ServiceConfig, logger?: Logger, redisClient?: RedisClientType);
|
|
15
16
|
/**
|
|
16
17
|
* updates the topic offset in redis periodically
|
|
17
18
|
*
|
|
18
19
|
*/
|
|
19
|
-
updateTopicOffsets():
|
|
20
|
+
updateTopicOffsets(): Promise<void>;
|
|
20
21
|
/**
|
|
21
22
|
* stores the offset to redis
|
|
22
23
|
* @param {object} topic Topic object
|
|
23
24
|
* @param {object} redisClient
|
|
24
25
|
* @return {object}
|
|
25
26
|
*/
|
|
26
|
-
storeOffset(topic: Topic, topicName: string): Promise<
|
|
27
|
+
storeOffset(topic: Topic, topicName: string): Promise<void>;
|
|
27
28
|
/**
|
|
28
29
|
* get the offset value for the topic from redis
|
|
29
30
|
* @param {string} topic Topic name
|
|
30
31
|
* @return {object}
|
|
31
32
|
*/
|
|
32
|
-
getOffset(topicName: string): Promise<
|
|
33
|
+
getOffset(topicName: string): Promise<bigint>;
|
|
33
34
|
/**
|
|
34
35
|
* stops the redis client
|
|
35
36
|
* @param {object} topic Topic object
|
|
36
37
|
* @param {object} redisClient
|
|
37
38
|
* @return {object}
|
|
38
39
|
*/
|
|
39
|
-
stop(): Promise<
|
|
40
|
+
stop(): Promise<void>;
|
|
40
41
|
}
|
|
42
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/offsets/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAgB,eAAe,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,EACL,KAAK,aAAa,EACnB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,KAAK,MAAM,EACZ,MAAM,yBAAyB,CAAC;AAEjC;;GAEG;AACH,qBAAa,WAAW;IAMpB,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM;IACtC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,aAAa;IACxC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM;IAClC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe;IAPlD,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAM;IAClD,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAGb,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,aAAa,EACrB,MAAM,CAAC,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,eAAe;IA2BlD;;;MAGE;IACI,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBzC;;;;;OAKG;IACG,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOjE;;;;OAIG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAanD;;;;;OAKG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ5B"}
|
package/lib/offsets/index.js
CHANGED
|
@@ -1,79 +1,52 @@
|
|
|
1
|
-
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.OffsetStore = void 0;
|
|
27
|
-
const _ = __importStar(require("lodash"));
|
|
28
|
-
const redis_1 = require("redis");
|
|
1
|
+
import { createClient } from 'redis';
|
|
29
2
|
/**
|
|
30
3
|
* Stores the offsets of the provided topics to redis periodically
|
|
31
4
|
*/
|
|
32
|
-
class OffsetStore {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
5
|
+
export class OffsetStore {
|
|
6
|
+
kafkaEvents;
|
|
7
|
+
config;
|
|
8
|
+
logger;
|
|
9
|
+
redisClient;
|
|
10
|
+
// protected readonly topics: Record<string, Topic> = {};
|
|
11
|
+
timerID = [];
|
|
12
|
+
prefix;
|
|
13
|
+
constructor(kafkaEvents, config, logger, redisClient) {
|
|
14
|
+
this.kafkaEvents = kafkaEvents;
|
|
41
15
|
this.config = config;
|
|
42
16
|
this.logger = logger;
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
17
|
+
this.redisClient = redisClient;
|
|
18
|
+
if (!kafkaEvents) {
|
|
19
|
+
logger?.error('No Kafka client was provided, offsets will not be stored to redis');
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
if (!this.config.get('events:kafka:topics')) {
|
|
46
23
|
throw new Error('Kafka events configuration was not provided.');
|
|
47
24
|
}
|
|
48
|
-
this.
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
this.redisClient
|
|
55
|
-
this.redisClient.on('error', (err) => logger.error('Redis Client Error in offsetstore', { code: err.code, message: err.message, stack: err.stack }));
|
|
56
|
-
this.redisClient.connect().then((val) => logger.info('Redis client connection successful for offsetstore'));
|
|
25
|
+
this.prefix = this.config.get('events:kafka:kafka:clientId');
|
|
26
|
+
const redisConfig = this.config.get('redis');
|
|
27
|
+
if (!redisClient && redisConfig) {
|
|
28
|
+
redisConfig.database = this.config.get('redis:db-indexes:db-offsetStore') ?? 0;
|
|
29
|
+
this.redisClient = createClient(redisConfig);
|
|
30
|
+
this.redisClient.on('error', (err) => logger?.error('Redis Client Error in offsetstore', err));
|
|
31
|
+
this.redisClient.connect().then(() => logger?.info('Redis client connection successful for offsetstore'));
|
|
57
32
|
}
|
|
58
|
-
this.topics = {};
|
|
59
|
-
this.timerID = [];
|
|
60
33
|
setTimeout(this.updateTopicOffsets.bind(this), 5000);
|
|
61
34
|
}
|
|
62
35
|
/**
|
|
63
36
|
* updates the topic offset in redis periodically
|
|
64
37
|
*
|
|
65
38
|
*/
|
|
66
|
-
updateTopicOffsets() {
|
|
39
|
+
async updateTopicOffsets() {
|
|
67
40
|
// Iterate through the topics and updateOffsets periodically for each topic
|
|
68
41
|
// events.topic(TopicName) - gives the topic object
|
|
69
42
|
const kafkaCfg = this.config.get('events:kafka');
|
|
70
|
-
const topicTypes =
|
|
43
|
+
const topicTypes = Object.keys(kafkaCfg.topics ?? {});
|
|
71
44
|
for (let i = 0; i < topicTypes.length; i += 1) {
|
|
72
45
|
const topicType = topicTypes[i];
|
|
73
46
|
const topicName = kafkaCfg.topics[topicType].topic;
|
|
74
47
|
this.kafkaEvents.topic(topicName).then(topic => {
|
|
75
|
-
this.topics[topicType] = topic;
|
|
76
|
-
this.timerID[i] = setInterval(this.storeOffset.bind(this), this.config.get('redis:offsetStoreInterval'),
|
|
48
|
+
// this.topics[topicType] = topic;
|
|
49
|
+
this.timerID[i] = setInterval(this.storeOffset.bind(this), this.config.get('redis:offsetStoreInterval') ?? 1000, topic, topicName);
|
|
77
50
|
});
|
|
78
51
|
}
|
|
79
52
|
}
|
|
@@ -85,9 +58,9 @@ class OffsetStore {
|
|
|
85
58
|
*/
|
|
86
59
|
async storeOffset(topic, topicName) {
|
|
87
60
|
// get the latest offset here each time and store it.
|
|
88
|
-
const offsetValue = await topic.$offset(-1);
|
|
89
|
-
const redisKey = this.
|
|
90
|
-
this.redisClient.set(redisKey, offsetValue);
|
|
61
|
+
const offsetValue = await topic.$offset(BigInt(-1));
|
|
62
|
+
const redisKey = `${this.prefix}:${topicName}`;
|
|
63
|
+
this.redisClient.set(redisKey, offsetValue.toString(10));
|
|
91
64
|
}
|
|
92
65
|
/**
|
|
93
66
|
* get the offset value for the topic from redis
|
|
@@ -95,10 +68,13 @@ class OffsetStore {
|
|
|
95
68
|
* @return {object}
|
|
96
69
|
*/
|
|
97
70
|
async getOffset(topicName) {
|
|
98
|
-
const redisKey = this.
|
|
71
|
+
const redisKey = `${this.prefix}:${topicName}`;
|
|
99
72
|
const offsetValue = await this.redisClient.get(redisKey);
|
|
100
|
-
this.logger
|
|
101
|
-
|
|
73
|
+
this.logger?.info('The offset value retreived from redis for topic is:', { topicName, offsetValue });
|
|
74
|
+
if (!offsetValue) {
|
|
75
|
+
return BigInt(0);
|
|
76
|
+
}
|
|
77
|
+
return BigInt(offsetValue);
|
|
102
78
|
}
|
|
103
79
|
/**
|
|
104
80
|
* stops the redis client
|
|
@@ -115,5 +91,4 @@ class OffsetStore {
|
|
|
115
91
|
}
|
|
116
92
|
}
|
|
117
93
|
}
|
|
118
|
-
exports.OffsetStore = OffsetStore;
|
|
119
94
|
//# sourceMappingURL=index.js.map
|
package/lib/offsets/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/offsets/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/offsets/index.ts"],"names":[],"mappings":"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"}
|