splp-nodejs 1.0.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.
Files changed (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +35 -0
  3. package/dist/config/index.d.ts +139 -0
  4. package/dist/config/index.d.ts.map +1 -0
  5. package/dist/config/index.js +258 -0
  6. package/dist/config/index.js.map +1 -0
  7. package/dist/lib/crypto/json-encryptor.d.ts +149 -0
  8. package/dist/lib/crypto/json-encryptor.d.ts.map +1 -0
  9. package/dist/lib/crypto/json-encryptor.js +568 -0
  10. package/dist/lib/crypto/json-encryptor.js.map +1 -0
  11. package/dist/lib/index.d.ts +18 -0
  12. package/dist/lib/index.d.ts.map +1 -0
  13. package/dist/lib/index.js +18 -0
  14. package/dist/lib/index.js.map +1 -0
  15. package/dist/lib/kafka/kafka-wrapper.d.ts +27 -0
  16. package/dist/lib/kafka/kafka-wrapper.d.ts.map +1 -0
  17. package/dist/lib/kafka/kafka-wrapper.js +206 -0
  18. package/dist/lib/kafka/kafka-wrapper.js.map +1 -0
  19. package/dist/lib/tracing/tracer.d.ts +19 -0
  20. package/dist/lib/tracing/tracer.d.ts.map +1 -0
  21. package/dist/lib/tracing/tracer.js +147 -0
  22. package/dist/lib/tracing/tracer.js.map +1 -0
  23. package/dist/lib/utils/circuit-breaker.d.ts +27 -0
  24. package/dist/lib/utils/circuit-breaker.d.ts.map +1 -0
  25. package/dist/lib/utils/circuit-breaker.js +56 -0
  26. package/dist/lib/utils/circuit-breaker.js.map +1 -0
  27. package/dist/lib/utils/request-id.d.ts +3 -0
  28. package/dist/lib/utils/request-id.d.ts.map +1 -0
  29. package/dist/lib/utils/request-id.js +9 -0
  30. package/dist/lib/utils/request-id.js.map +1 -0
  31. package/dist/lib/utils/retry-manager.d.ts +42 -0
  32. package/dist/lib/utils/retry-manager.d.ts.map +1 -0
  33. package/dist/lib/utils/retry-manager.js +69 -0
  34. package/dist/lib/utils/retry-manager.js.map +1 -0
  35. package/dist/lib/utils/sanitizer.d.ts +32 -0
  36. package/dist/lib/utils/sanitizer.d.ts.map +1 -0
  37. package/dist/lib/utils/sanitizer.js +235 -0
  38. package/dist/lib/utils/sanitizer.js.map +1 -0
  39. package/dist/types/index.d.ts +115 -0
  40. package/dist/types/index.d.ts.map +1 -0
  41. package/dist/types/index.js +2 -0
  42. package/dist/types/index.js.map +1 -0
  43. package/package.json +61 -0
@@ -0,0 +1,27 @@
1
+ import { Producer, Consumer, EachMessagePayload } from 'kafkajs';
2
+ import type { KafkaConfig } from '../../types/index.js';
3
+ export declare class KafkaWrapper {
4
+ private kafka;
5
+ private producer;
6
+ private consumer;
7
+ private admin;
8
+ private config;
9
+ private isConsuming;
10
+ private static instanceCounter;
11
+ private instanceId;
12
+ constructor(config: KafkaConfig);
13
+ connectProducer(): Promise<Producer>;
14
+ connectConsumer(groupId?: string): Promise<Consumer>;
15
+ getProducer(): Producer;
16
+ getConsumer(): Consumer;
17
+ sendMessage(topic: string, message: string, key?: string): Promise<{
18
+ partition: number;
19
+ offset: string;
20
+ }>;
21
+ subscribe(topics: string[], messageHandler: (payload: EachMessagePayload) => Promise<void>): Promise<void>;
22
+ createTopics(topics: string[]): Promise<void>;
23
+ disconnect(): Promise<void>;
24
+ isProducerConnected(): boolean;
25
+ isConsumerConnected(): boolean;
26
+ }
27
+ //# sourceMappingURL=kafka-wrapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kafka-wrapper.d.ts","sourceRoot":"","sources":["../../../lib/kafka/kafka-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,QAAQ,EAAE,QAAQ,EAAS,kBAAkB,EAAyE,MAAM,SAAS,CAAC;AACtJ,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAMxD,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAK;IACnC,OAAO,CAAC,UAAU,CAAS;gBAEf,MAAM,EAAE,WAAW;IAyDzB,eAAe,IAAI,OAAO,CAAC,QAAQ,CAAC;IAiBpC,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAuC1D,WAAW,IAAI,QAAQ;IAOvB,WAAW,IAAI,QAAQ;IAOjB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IA0BzG,SAAS,CACb,MAAM,EAAE,MAAM,EAAE,EAChB,cAAc,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC,IAAI,CAAC,GAC7D,OAAO,CAAC,IAAI,CAAC;IAuBV,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA8B7C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAYjC,mBAAmB,IAAI,OAAO;IAI9B,mBAAmB,IAAI,OAAO;CAG/B"}
@@ -0,0 +1,206 @@
1
+ import { Kafka, Partitioners, PartitionAssigners, CompressionTypes, CompressionCodecs } from 'kafkajs';
2
+ import SnappyCodec from 'kafkajs-snappy';
3
+ // Register Snappy compression codec globally before creating any Kafka instances
4
+ CompressionCodecs[CompressionTypes.Snappy] = SnappyCodec;
5
+ export class KafkaWrapper {
6
+ kafka;
7
+ producer = null;
8
+ consumer = null;
9
+ admin;
10
+ config;
11
+ isConsuming = false;
12
+ static instanceCounter = 0;
13
+ instanceId;
14
+ constructor(config) {
15
+ this.instanceId = ++KafkaWrapper.instanceCounter;
16
+ console.log(`[KafkaWrapper#${this.instanceId}] NEW INSTANCE created for clientId: ${config.clientId}`);
17
+ this.config = config;
18
+ // Connection timeout settings for remote brokers
19
+ const connectionTimeout = config.connectionTimeout || 10000;
20
+ const requestTimeout = config.requestTimeout || 60000;
21
+ const socketTimeout = config.socketTimeout || 60000;
22
+ console.log(`[KafkaWrapper#${this.instanceId}] Kafka configuration:`);
23
+ console.log(` Brokers: ${config.brokers.join(', ')}`);
24
+ console.log(` Connection timeout: ${connectionTimeout}ms`);
25
+ console.log(` Request timeout: ${requestTimeout}ms`);
26
+ console.log(` Socket timeout: ${socketTimeout}ms`);
27
+ if (config.ssl) {
28
+ console.log(` SSL/TLS: enabled`);
29
+ console.log(` Servername: ${config.ssl.servername || 'not set'}`);
30
+ }
31
+ // Build Kafka configuration
32
+ const kafkaConfig = {
33
+ clientId: config.clientId,
34
+ brokers: config.brokers,
35
+ connectionTimeout: connectionTimeout,
36
+ requestTimeout: requestTimeout,
37
+ socketTimeout: socketTimeout,
38
+ retry: config.retry || {
39
+ retries: 8,
40
+ initialRetryTime: 300,
41
+ maxRetryTime: 30000,
42
+ multiplier: 2,
43
+ restartOnFailure: async (e) => {
44
+ console.error(`[KafkaWrapper#${this.instanceId}] Connection failed, will retry:`, e.message);
45
+ return true;
46
+ },
47
+ },
48
+ };
49
+ // Add SSL configuration if provided
50
+ if (config.ssl) {
51
+ kafkaConfig.ssl = config.ssl;
52
+ }
53
+ // Add logging configuration if provided
54
+ if (config.logLevel !== undefined) {
55
+ kafkaConfig.logLevel = config.logLevel;
56
+ }
57
+ if (config.logCreator) {
58
+ kafkaConfig.logCreator = config.logCreator;
59
+ }
60
+ this.kafka = new Kafka(kafkaConfig);
61
+ this.admin = this.kafka.admin();
62
+ }
63
+ async connectProducer() {
64
+ if (this.producer) {
65
+ return this.producer;
66
+ }
67
+ const maxRequestSize = this.config.maxRequestSize || 10485760;
68
+ this.producer = this.kafka.producer({
69
+ createPartitioner: Partitioners.LegacyPartitioner,
70
+ maxRequestSize: maxRequestSize,
71
+ });
72
+ await this.producer.connect();
73
+ console.log('Kafka producer connected');
74
+ console.log(` Max request size: ${(maxRequestSize / 1024 / 1024).toFixed(2)}MB`);
75
+ return this.producer;
76
+ }
77
+ async connectConsumer(groupId) {
78
+ if (this.consumer) {
79
+ return this.consumer;
80
+ }
81
+ const consumerGroupId = groupId || this.config.groupId || this.config.clientId;
82
+ const maxBytes = this.config.maxBytes || this.config.maxBytesPerPartition || 10485760;
83
+ const fetchMaxBytes = this.config.fetchMaxBytes || 52428800;
84
+ this.consumer = this.kafka.consumer({
85
+ groupId: consumerGroupId,
86
+ sessionTimeout: this.config.sessionTimeout || 60000,
87
+ heartbeatInterval: this.config.heartbeatInterval || 5000,
88
+ rebalanceTimeout: this.config.rebalanceTimeout || 120000,
89
+ maxBytes: maxBytes,
90
+ maxBytesPerPartition: maxBytes,
91
+ partitionAssigners: [PartitionAssigners.roundRobin],
92
+ });
93
+ try {
94
+ await this.consumer.connect();
95
+ console.log(`Kafka consumer connected with group: ${consumerGroupId}`);
96
+ console.log(` Session timeout: ${this.config.sessionTimeout || 60000}ms`);
97
+ console.log(` Heartbeat interval: ${this.config.heartbeatInterval || 5000}ms`);
98
+ }
99
+ catch (error) {
100
+ const errorMsg = error instanceof Error ? error.message : String(error);
101
+ console.error(`[KafkaWrapper#${this.instanceId}] Failed to connect consumer:`, errorMsg);
102
+ console.error(`\nTroubleshooting Connection Timeout:\n`);
103
+ console.error(` 1. Verify Kafka broker is accessible: ${this.config.brokers.join(', ')}`);
104
+ console.error(` 2. Check network connectivity`);
105
+ console.error(` 3. Check firewall rules`);
106
+ console.error(` 4. Verify broker address is correct\n`);
107
+ throw error;
108
+ }
109
+ console.log(` Max bytes per partition: ${(maxBytes / 1024 / 1024).toFixed(2)}MB`);
110
+ console.log(` Total fetch max bytes: ${(fetchMaxBytes / 1024 / 1024).toFixed(2)}MB`);
111
+ return this.consumer;
112
+ }
113
+ getProducer() {
114
+ if (!this.producer) {
115
+ throw new Error('Producer not connected. Call connectProducer() first.');
116
+ }
117
+ return this.producer;
118
+ }
119
+ getConsumer() {
120
+ if (!this.consumer) {
121
+ throw new Error('Consumer not connected. Call connectConsumer() first.');
122
+ }
123
+ return this.consumer;
124
+ }
125
+ async sendMessage(topic, message, key) {
126
+ const producer = this.getProducer();
127
+ const result = await producer.send({
128
+ topic,
129
+ messages: [
130
+ {
131
+ key: key || null,
132
+ value: message,
133
+ },
134
+ ],
135
+ });
136
+ if (result && result.length > 0) {
137
+ return {
138
+ partition: result[0].partition,
139
+ offset: result[0].offset ?? '0',
140
+ };
141
+ }
142
+ return {
143
+ partition: 0,
144
+ offset: '0',
145
+ };
146
+ }
147
+ async subscribe(topics, messageHandler) {
148
+ const consumer = this.getConsumer();
149
+ if (this.isConsuming) {
150
+ console.warn(`[KafkaWrapper#${this.instanceId}] Consumer is already running. Ignoring duplicate subscribe() call.`);
151
+ return;
152
+ }
153
+ this.isConsuming = true;
154
+ for (const topic of topics) {
155
+ await consumer.subscribe({ topic, fromBeginning: false });
156
+ }
157
+ await consumer.run({
158
+ eachMessage: async (payload) => {
159
+ await messageHandler(payload);
160
+ },
161
+ });
162
+ console.log(`[KafkaWrapper#${this.instanceId}] Subscribed to topics: ${topics.join(', ')}`);
163
+ }
164
+ async createTopics(topics) {
165
+ await this.admin.connect();
166
+ const maxMessageBytes = this.config.maxMessageBytes || 10485760;
167
+ const topicConfigs = topics.map((topic) => ({
168
+ topic,
169
+ numPartitions: 3,
170
+ replicationFactor: 1,
171
+ configEntries: [
172
+ { name: 'max.message.bytes', value: String(maxMessageBytes) },
173
+ { name: 'retention.ms', value: '604800000' },
174
+ ],
175
+ }));
176
+ const created = await this.admin.createTopics({
177
+ topics: topicConfigs,
178
+ waitForLeaders: true,
179
+ });
180
+ if (created) {
181
+ console.log(`Topics created: ${topics.join(', ')}`);
182
+ console.log(` Max message bytes: ${(maxMessageBytes / 1024 / 1024).toFixed(2)}MB`);
183
+ }
184
+ else {
185
+ console.log('Topics already exist');
186
+ }
187
+ await this.admin.disconnect();
188
+ }
189
+ async disconnect() {
190
+ if (this.producer) {
191
+ await this.producer.disconnect();
192
+ console.log('Producer disconnected');
193
+ }
194
+ if (this.consumer) {
195
+ await this.consumer.disconnect();
196
+ console.log('Consumer disconnected');
197
+ }
198
+ }
199
+ isProducerConnected() {
200
+ return this.producer !== null;
201
+ }
202
+ isConsumerConnected() {
203
+ return this.consumer !== null;
204
+ }
205
+ }
206
+ //# sourceMappingURL=kafka-wrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kafka-wrapper.js","sourceRoot":"","sources":["../../../lib/kafka/kafka-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAiD,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEtJ,OAAO,WAAW,MAAM,gBAAgB,CAAC;AAEzC,iFAAiF;AACjF,iBAAiB,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC;AAEzD,MAAM,OAAO,YAAY;IACf,KAAK,CAAQ;IACb,QAAQ,GAAoB,IAAI,CAAC;IACjC,QAAQ,GAAoB,IAAI,CAAC;IACjC,KAAK,CAAQ;IACb,MAAM,CAAc;IACpB,WAAW,GAAY,KAAK,CAAC;IAC7B,MAAM,CAAC,eAAe,GAAG,CAAC,CAAC;IAC3B,UAAU,CAAS;IAE3B,YAAY,MAAmB;QAC7B,IAAI,CAAC,UAAU,GAAG,EAAE,YAAY,CAAC,eAAe,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,UAAU,wCAAwC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAEvG,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAErB,iDAAiD;QACjD,MAAM,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,IAAI,KAAK,CAAC;QAC5D,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc,IAAI,KAAK,CAAC;QACtD,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,IAAI,KAAK,CAAC;QAEpD,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,UAAU,wBAAwB,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,yBAAyB,iBAAiB,IAAI,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,sBAAsB,cAAc,IAAI,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,qBAAqB,aAAa,IAAI,CAAC,CAAC;QACpD,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,GAAG,CAAC,UAAU,IAAI,SAAS,EAAE,CAAC,CAAC;QACrE,CAAC;QAED,4BAA4B;QAC5B,MAAM,WAAW,GAAQ;YACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,iBAAiB,EAAE,iBAAiB;YACpC,cAAc,EAAE,cAAc;YAC9B,aAAa,EAAE,aAAa;YAC5B,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI;gBACrB,OAAO,EAAE,CAAC;gBACV,gBAAgB,EAAE,GAAG;gBACrB,YAAY,EAAE,KAAK;gBACnB,UAAU,EAAE,CAAC;gBACb,gBAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;oBAC5B,OAAO,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,UAAU,kCAAkC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;oBAC7F,OAAO,IAAI,CAAC;gBACd,CAAC;aACF;SACF,CAAC;QAEF,oCAAoC;QACpC,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;YACf,WAAW,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;QAC/B,CAAC;QAED,wCAAwC;QACxC,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAClC,WAAW,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QACzC,CAAC;QACD,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACtB,WAAW,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QAC7C,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC,QAAQ,CAAC;QACvB,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,QAAQ,CAAC;QAE9D,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;YAClC,iBAAiB,EAAE,YAAY,CAAC,iBAAiB;YACjD,cAAc,EAAE,cAAc;SACxB,CAAC,CAAC;QACV,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,cAAc,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAClF,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,OAAgB;QACpC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC,QAAQ,CAAC;QACvB,CAAC;QAED,MAAM,eAAe,GAAG,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC/E,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,oBAAoB,IAAI,QAAQ,CAAC;QACtF,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,QAAQ,CAAC;QAE5D,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;YAClC,OAAO,EAAE,eAAe;YACxB,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,KAAK;YACnD,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB,IAAI,IAAI;YACxD,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,IAAI,MAAM;YACxD,QAAQ,EAAE,QAAQ;YAClB,oBAAoB,EAAE,QAAQ;YAC9B,kBAAkB,EAAE,CAAC,kBAAkB,CAAC,UAAU,CAAC;SACpD,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,wCAAwC,eAAe,EAAE,CAAC,CAAC;YACvE,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,KAAK,IAAI,CAAC,CAAC;YAC3E,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,CAAC,MAAM,CAAC,iBAAiB,IAAI,IAAI,IAAI,CAAC,CAAC;QAClF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACxE,OAAO,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,UAAU,+BAA+B,EAAE,QAAQ,CAAC,CAAC;YACzF,OAAO,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;YACzD,OAAO,CAAC,KAAK,CAAC,2CAA2C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC3F,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;YACjD,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC3C,OAAO,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;YACzD,MAAM,KAAK,CAAC;QACd,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACnF,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,aAAa,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACtF,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,WAAW;QACT,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC3E,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,WAAW;QACT,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC3E,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAa,EAAE,OAAe,EAAE,GAAY;QAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAEpC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC;YACjC,KAAK;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,IAAI,IAAI;oBAChB,KAAK,EAAE,OAAO;iBACf;aACF;SACF,CAAC,CAAC;QAEH,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,OAAO;gBACL,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;gBAC9B,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,GAAG;aAChC,CAAC;QACJ,CAAC;QAED,OAAO;YACL,SAAS,EAAE,CAAC;YACZ,MAAM,EAAE,GAAG;SACZ,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,SAAS,CACb,MAAgB,EAChB,cAA8D;QAE9D,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAEpC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,UAAU,qEAAqE,CAAC,CAAC;YACpH,OAAO;QACT,CAAC;QAED,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAExB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,MAAM,QAAQ,CAAC,GAAG,CAAC;YACjB,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;gBAC7B,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;YAChC,CAAC;SACF,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,UAAU,2BAA2B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAgB;QACjC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QAE3B,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,QAAQ,CAAC;QAEhE,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC1C,KAAK;YACL,aAAa,EAAE,CAAC;YAChB,iBAAiB,EAAE,CAAC;YACpB,aAAa,EAAE;gBACb,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,CAAC,eAAe,CAAC,EAAE;gBAC7D,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,WAAW,EAAE;aAC7C;SACF,CAAC,CAAC,CAAC;QAEJ,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;YAC5C,MAAM,EAAE,YAAY;YACpB,cAAc,EAAE,IAAI;SACrB,CAAC,CAAC;QAEH,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,eAAe,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACtF,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACtC,CAAC;QAED,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACvC,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,mBAAmB;QACjB,OAAO,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC;IAChC,CAAC;IAED,mBAAmB;QACjB,OAAO,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC;IAChC,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { Span } from '@opentelemetry/api';
2
+ import type { Context } from '@opentelemetry/api';
3
+ export interface TracingConfig {
4
+ serviceName: string;
5
+ tempoEndpoint?: string;
6
+ enabled?: boolean;
7
+ }
8
+ export declare function initTracing(config: TracingConfig): void;
9
+ export declare function shutdownTracing(): Promise<void>;
10
+ export declare function getTracer(name?: string): import("@opentelemetry/api").Tracer;
11
+ export declare function requestIdToTraceId(requestId: string): string;
12
+ export declare function setCustomTraceId(requestId: string): Context;
13
+ export declare function withSpan<T>(name: string, fn: (span: Span) => Promise<T>, parentContext?: Context): Promise<T>;
14
+ export declare function addSpanAttributes(attributes: Record<string, string | number | boolean>): void;
15
+ export declare function addSpanEvent(name: string, attributes?: Record<string, string | number | boolean>): void;
16
+ export declare function extractTraceContext(headers: Record<string, Buffer | string | undefined>): Context;
17
+ export declare function injectTraceContext(headers?: Record<string, string>): Record<string, string>;
18
+ export declare function createChildSpan(name: string, headers: Record<string, Buffer | string | undefined>): Span;
19
+ //# sourceMappingURL=tracer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracer.d.ts","sourceRoot":"","sources":["../../../lib/tracing/tracer.ts"],"names":[],"mappings":"AAKA,OAAO,EAAkC,IAAI,EAAwC,MAAM,oBAAoB,CAAC;AAChH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAGlD,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAMD,wBAAgB,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CA2CvD;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAOrD;AAED,wBAAgB,SAAS,CAAC,IAAI,GAAE,MAAkB,uCAEjD;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAM5D;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAwB3D;AAED,wBAAsB,QAAQ,CAAC,CAAC,EAC9B,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,EAC9B,aAAa,CAAC,EAAE,OAAO,GACtB,OAAO,CAAC,CAAC,CAAC,CAoBZ;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,IAAI,CAO7F;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,IAAI,CAKvG;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,GAAG,OAAO,CAiBjG;AAED,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAU/F;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,GACnD,IAAI,CAKN"}
@@ -0,0 +1,147 @@
1
+ import { NodeSDK } from '@opentelemetry/sdk-node';
2
+ import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
3
+ import { Resource } from '@opentelemetry/resources';
4
+ import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions';
5
+ import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
6
+ import { trace, context, SpanStatusCode } from '@opentelemetry/api';
7
+ import { W3CTraceContextPropagator } from '@opentelemetry/core';
8
+ let sdk = null;
9
+ let isInitialized = false;
10
+ const w3cPropagator = new W3CTraceContextPropagator();
11
+ export function initTracing(config) {
12
+ if (isInitialized) {
13
+ console.log('Tracing already initialized');
14
+ return;
15
+ }
16
+ if (config.enabled === false) {
17
+ console.log('Tracing disabled');
18
+ return;
19
+ }
20
+ const tempoEndpoint = config.tempoEndpoint || process.env.TEMPO_ENDPOINT || 'http://localhost:4318/v1/traces';
21
+ const traceExporter = new OTLPTraceExporter({
22
+ url: tempoEndpoint,
23
+ });
24
+ sdk = new NodeSDK({
25
+ resource: new Resource({
26
+ [SemanticResourceAttributes.SERVICE_NAME]: config.serviceName,
27
+ }),
28
+ traceExporter,
29
+ instrumentations: [
30
+ getNodeAutoInstrumentations({
31
+ '@opentelemetry/instrumentation-fs': {
32
+ enabled: false,
33
+ },
34
+ }),
35
+ ],
36
+ });
37
+ sdk.start();
38
+ isInitialized = true;
39
+ console.log(`Tracing initialized for service: ${config.serviceName}`);
40
+ console.log(`Tempo endpoint: ${tempoEndpoint}`);
41
+ process.on('SIGTERM', () => {
42
+ sdk?.shutdown()
43
+ .then(() => console.log('Tracing terminated'))
44
+ .catch((error) => console.error('Error terminating tracing', error))
45
+ .finally(() => process.exit(0));
46
+ });
47
+ }
48
+ export async function shutdownTracing() {
49
+ if (sdk) {
50
+ await sdk.shutdown();
51
+ isInitialized = false;
52
+ sdk = null;
53
+ console.log('Tracing shut down');
54
+ }
55
+ }
56
+ export function getTracer(name = 'default') {
57
+ return trace.getTracer(name);
58
+ }
59
+ export function requestIdToTraceId(requestId) {
60
+ const cleaned = requestId.replace(/-/g, '');
61
+ if (cleaned.length === 32) {
62
+ return cleaned;
63
+ }
64
+ return cleaned.padEnd(32, '0').substring(0, 32);
65
+ }
66
+ export function setCustomTraceId(requestId) {
67
+ const traceId = requestIdToTraceId(requestId);
68
+ const fakeSpanId = Array.from({ length: 16 }, () => Math.floor(Math.random() * 16).toString(16)).join('');
69
+ const traceparent = `00-${traceId}-${fakeSpanId}-01`;
70
+ const carrier = { traceparent };
71
+ const ctx = w3cPropagator.extract(context.active(), carrier, {
72
+ get(carrier, key) {
73
+ return carrier[key];
74
+ },
75
+ keys(carrier) {
76
+ return Object.keys(carrier);
77
+ },
78
+ });
79
+ return ctx;
80
+ }
81
+ export async function withSpan(name, fn, parentContext) {
82
+ const tracer = getTracer();
83
+ const ctx = parentContext || context.active();
84
+ return tracer.startActiveSpan(name, {}, ctx, async (span) => {
85
+ try {
86
+ const result = await fn(span);
87
+ span.setStatus({ code: SpanStatusCode.OK });
88
+ return result;
89
+ }
90
+ catch (error) {
91
+ span.setStatus({
92
+ code: SpanStatusCode.ERROR,
93
+ message: error instanceof Error ? error.message : 'Unknown error',
94
+ });
95
+ span.recordException(error);
96
+ throw error;
97
+ }
98
+ finally {
99
+ span.end();
100
+ }
101
+ });
102
+ }
103
+ export function addSpanAttributes(attributes) {
104
+ const span = trace.getActiveSpan();
105
+ if (span) {
106
+ Object.entries(attributes).forEach(([key, value]) => {
107
+ span.setAttribute(key, value);
108
+ });
109
+ }
110
+ }
111
+ export function addSpanEvent(name, attributes) {
112
+ const span = trace.getActiveSpan();
113
+ if (span) {
114
+ span.addEvent(name, attributes);
115
+ }
116
+ }
117
+ export function extractTraceContext(headers) {
118
+ const carrier = {};
119
+ for (const [key, value] of Object.entries(headers)) {
120
+ if (value !== undefined) {
121
+ carrier[key] = typeof value === 'string' ? value : value.toString();
122
+ }
123
+ }
124
+ return w3cPropagator.extract(context.active(), carrier, {
125
+ get(carrier, key) {
126
+ return carrier[key];
127
+ },
128
+ keys(carrier) {
129
+ return Object.keys(carrier);
130
+ },
131
+ });
132
+ }
133
+ export function injectTraceContext(headers = {}) {
134
+ const carrier = { ...headers };
135
+ w3cPropagator.inject(context.active(), carrier, {
136
+ set(carrier, key, value) {
137
+ carrier[key] = value;
138
+ },
139
+ });
140
+ return carrier;
141
+ }
142
+ export function createChildSpan(name, headers) {
143
+ const tracer = getTracer();
144
+ const parentContext = extractTraceContext(headers);
145
+ return tracer.startSpan(name, {}, parentContext);
146
+ }
147
+ //# sourceMappingURL=tracer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracer.js","sourceRoot":"","sources":["../../../lib/tracing/tracer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Circuit Breaker Pattern Implementation
3
+ * Provides fault tolerance and prevents cascading failures
4
+ */
5
+ export declare enum CircuitState {
6
+ CLOSED = "CLOSED",
7
+ OPEN = "OPEN",
8
+ HALF_OPEN = "HALF_OPEN"
9
+ }
10
+ export interface CircuitBreakerConfig {
11
+ failureThreshold: number;
12
+ recoveryTimeout: number;
13
+ monitoringPeriod: number;
14
+ }
15
+ export declare class CircuitBreaker {
16
+ private state;
17
+ private failureCount;
18
+ private lastFailureTime;
19
+ private config;
20
+ constructor(config: CircuitBreakerConfig);
21
+ execute<T>(fn: () => Promise<T>): Promise<T>;
22
+ private onSuccess;
23
+ private onFailure;
24
+ getState(): CircuitState;
25
+ getFailureCount(): number;
26
+ }
27
+ //# sourceMappingURL=circuit-breaker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circuit-breaker.d.ts","sourceRoot":"","sources":["../../../lib/utils/circuit-breaker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,oBAAY,YAAY;IACtB,MAAM,WAAW;IACjB,IAAI,SAAS;IACb,SAAS,cAAc;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAqC;IAClD,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,MAAM,CAAuB;gBAEzB,MAAM,EAAE,oBAAoB;IAIlC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAmBlD,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,SAAS;IASjB,QAAQ,IAAI,YAAY;IAIxB,eAAe,IAAI,MAAM;CAG1B"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Circuit Breaker Pattern Implementation
3
+ * Provides fault tolerance and prevents cascading failures
4
+ */
5
+ export var CircuitState;
6
+ (function (CircuitState) {
7
+ CircuitState["CLOSED"] = "CLOSED";
8
+ CircuitState["OPEN"] = "OPEN";
9
+ CircuitState["HALF_OPEN"] = "HALF_OPEN";
10
+ })(CircuitState || (CircuitState = {}));
11
+ export class CircuitBreaker {
12
+ state = CircuitState.CLOSED;
13
+ failureCount = 0;
14
+ lastFailureTime = 0;
15
+ config;
16
+ constructor(config) {
17
+ this.config = config;
18
+ }
19
+ async execute(fn) {
20
+ if (this.state === CircuitState.OPEN) {
21
+ if (Date.now() - this.lastFailureTime > this.config.recoveryTimeout) {
22
+ this.state = CircuitState.HALF_OPEN;
23
+ }
24
+ else {
25
+ throw new Error('Circuit breaker is OPEN - service unavailable');
26
+ }
27
+ }
28
+ try {
29
+ const result = await fn();
30
+ this.onSuccess();
31
+ return result;
32
+ }
33
+ catch (error) {
34
+ this.onFailure();
35
+ throw error;
36
+ }
37
+ }
38
+ onSuccess() {
39
+ this.failureCount = 0;
40
+ this.state = CircuitState.CLOSED;
41
+ }
42
+ onFailure() {
43
+ this.failureCount++;
44
+ this.lastFailureTime = Date.now();
45
+ if (this.failureCount >= this.config.failureThreshold) {
46
+ this.state = CircuitState.OPEN;
47
+ }
48
+ }
49
+ getState() {
50
+ return this.state;
51
+ }
52
+ getFailureCount() {
53
+ return this.failureCount;
54
+ }
55
+ }
56
+ //# sourceMappingURL=circuit-breaker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../../../lib/utils/circuit-breaker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAN,IAAY,YAIX;AAJD,WAAY,YAAY;IACtB,iCAAiB,CAAA;IACjB,6BAAa,CAAA;IACb,uCAAuB,CAAA;AACzB,CAAC,EAJW,YAAY,KAAZ,YAAY,QAIvB;AAQD,MAAM,OAAO,cAAc;IACjB,KAAK,GAAiB,YAAY,CAAC,MAAM,CAAC;IAC1C,YAAY,GAAG,CAAC,CAAC;IACjB,eAAe,GAAG,CAAC,CAAC;IACpB,MAAM,CAAuB;IAErC,YAAY,MAA4B;QACtC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,OAAO,CAAI,EAAoB;QACnC,IAAI,IAAI,CAAC,KAAK,KAAK,YAAY,CAAC,IAAI,EAAE,CAAC;YACrC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;gBACpE,IAAI,CAAC,KAAK,GAAG,YAAY,CAAC,SAAS,CAAC;YACtC,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC;YAC1B,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,SAAS;QACf,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC;IACnC,CAAC;IAEO,SAAS;QACf,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAElC,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;YACtD,IAAI,CAAC,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC;QACjC,CAAC;IACH,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ export declare function generateRequestId(): string;
2
+ export declare function isValidRequestId(requestId: string): boolean;
3
+ //# sourceMappingURL=request-id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-id.d.ts","sourceRoot":"","sources":["../../../lib/utils/request-id.ts"],"names":[],"mappings":"AAEA,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAG3D"}
@@ -0,0 +1,9 @@
1
+ import { randomUUID } from 'crypto';
2
+ export function generateRequestId() {
3
+ return randomUUID();
4
+ }
5
+ export function isValidRequestId(requestId) {
6
+ const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
7
+ return uuidRegex.test(requestId);
8
+ }
9
+ //# sourceMappingURL=request-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-id.js","sourceRoot":"","sources":["../../../lib/utils/request-id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC,MAAM,UAAU,iBAAiB;IAC/B,OAAO,UAAU,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,SAAiB;IAChD,MAAM,SAAS,GAAG,wEAAwE,CAAC;IAC3F,OAAO,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACnC,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Retry Mechanism with Exponential Backoff
3
+ * Provides automatic retry for transient failures
4
+ */
5
+ export interface RetryConfig {
6
+ maxAttempts: number;
7
+ baseDelay: number;
8
+ maxDelay: number;
9
+ backoffMultiplier: number;
10
+ jitter: boolean;
11
+ }
12
+ export declare class RetryManager {
13
+ private config;
14
+ constructor(config: RetryConfig);
15
+ execute<T>(fn: () => Promise<T>, isRetryableError?: (error: Error) => boolean): Promise<T>;
16
+ private calculateDelay;
17
+ private sleep;
18
+ }
19
+ export declare const RetryConfigs: {
20
+ readonly FAST: {
21
+ readonly maxAttempts: 3;
22
+ readonly baseDelay: 100;
23
+ readonly maxDelay: 1000;
24
+ readonly backoffMultiplier: 2;
25
+ readonly jitter: true;
26
+ };
27
+ readonly STANDARD: {
28
+ readonly maxAttempts: 5;
29
+ readonly baseDelay: 500;
30
+ readonly maxDelay: 5000;
31
+ readonly backoffMultiplier: 2;
32
+ readonly jitter: true;
33
+ };
34
+ readonly SLOW: {
35
+ readonly maxAttempts: 3;
36
+ readonly baseDelay: 2000;
37
+ readonly maxDelay: 10000;
38
+ readonly backoffMultiplier: 2;
39
+ readonly jitter: true;
40
+ };
41
+ };
42
+ //# sourceMappingURL=retry-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry-manager.d.ts","sourceRoot":"","sources":["../../../lib/utils/retry-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAc;gBAEhB,MAAM,EAAE,WAAW;IAIzB,OAAO,CAAC,CAAC,EACb,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,GAC3C,OAAO,CAAC,CAAC,CAAC;IA2Bb,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,KAAK;CAGd;AAED,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;CAwBf,CAAC"}