unnbound-events 1.0.21 → 1.0.22
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/dist/lib/client.js +26 -28
- package/package.json +1 -1
package/dist/lib/client.js
CHANGED
|
@@ -9,7 +9,6 @@ const unnbound_logger_sdk_1 = require("unnbound-logger-sdk");
|
|
|
9
9
|
const internal_1 = require("unnbound-logger-sdk/dist/internal");
|
|
10
10
|
const types_1 = require("unnbound-logger-sdk/dist/types");
|
|
11
11
|
const axios_1 = __importDefault(require("axios"));
|
|
12
|
-
const logger = unnbound_logger_sdk_1.logger.child((0, internal_1.internal)());
|
|
13
12
|
const http = require('http');
|
|
14
13
|
function matchPath(matcher, path) {
|
|
15
14
|
if (typeof matcher === 'string') {
|
|
@@ -76,7 +75,7 @@ async function fetchS3Payload(s3Client, bucket, key, versionId) {
|
|
|
76
75
|
}
|
|
77
76
|
catch (error) {
|
|
78
77
|
const message = error instanceof Error ? error.message : String(error);
|
|
79
|
-
logger.error({ err: error, bucket, key }, 'Failed to fetch S3 payload');
|
|
78
|
+
unnbound_logger_sdk_1.logger.error({ err: error, bucket, key }, 'Failed to fetch S3 payload');
|
|
80
79
|
throw new Error(`Failed to fetch S3 payload: ${message}`);
|
|
81
80
|
}
|
|
82
81
|
}
|
|
@@ -128,7 +127,7 @@ function createEventsClient(ignoreTraceRoutes = exports.defaultIgnoreTraceRoutes
|
|
|
128
127
|
const metadataMessageId = typeof request.metadata?.messageId === 'string' ? request.metadata.messageId : undefined;
|
|
129
128
|
const headerMessageId = getHeaderValue(request.headers, types_1.defaultTraceHeaderKey);
|
|
130
129
|
if (metadataMessageId && headerMessageId && metadataMessageId !== headerMessageId) {
|
|
131
|
-
logger.warn({ metadataMessageId, headerMessageId }, 'Message ID mismatch detected; defaulting to header value.');
|
|
130
|
+
unnbound_logger_sdk_1.logger.warn({ metadataMessageId, headerMessageId }, 'Message ID mismatch detected; defaulting to header value.');
|
|
132
131
|
}
|
|
133
132
|
const messageId = headerMessageId ?? metadataMessageId;
|
|
134
133
|
const headerTraceId = getHeaderValue(request.headers, types_1.defaultMessageHeaderKey);
|
|
@@ -235,7 +234,7 @@ function createEventsClient(ignoreTraceRoutes = exports.defaultIgnoreTraceRoutes
|
|
|
235
234
|
return response;
|
|
236
235
|
}
|
|
237
236
|
catch (error) {
|
|
238
|
-
logger.error({ err: error, path: request.path }, 'Handler error');
|
|
237
|
+
unnbound_logger_sdk_1.logger.error({ err: error, path: request.path }, 'Handler error');
|
|
239
238
|
return { status: 500, body: { message: 'Internal Server Error' } };
|
|
240
239
|
}
|
|
241
240
|
},
|
|
@@ -301,7 +300,7 @@ function createEventsClient(ignoreTraceRoutes = exports.defaultIgnoreTraceRoutes
|
|
|
301
300
|
});
|
|
302
301
|
});
|
|
303
302
|
await new Promise((resolve) => server.listen(port, resolve));
|
|
304
|
-
logger.info({ port }, 'HTTP server started');
|
|
303
|
+
unnbound_logger_sdk_1.logger.info({ port, ...(0, internal_1.internal)() }, 'HTTP server started');
|
|
305
304
|
return {
|
|
306
305
|
close() {
|
|
307
306
|
return new Promise((resolve, reject) => {
|
|
@@ -343,7 +342,7 @@ function createEventsClient(ignoreTraceRoutes = exports.defaultIgnoreTraceRoutes
|
|
|
343
342
|
if (!s3Client) {
|
|
344
343
|
throw new Error('S3 client not initialized but S3 pointer message received');
|
|
345
344
|
}
|
|
346
|
-
logger.info({ bucket: pointer.s3BucketName, key: pointer.s3Key }, 'Fetching S3 pointer payload');
|
|
345
|
+
unnbound_logger_sdk_1.logger.info({ bucket: pointer.s3BucketName, key: pointer.s3Key, ...(0, internal_1.internal)() }, 'Fetching S3 pointer payload');
|
|
347
346
|
recordBody = await fetchS3Payload(s3Client, pointer.s3BucketName, pointer.s3Key);
|
|
348
347
|
envelope = JSON.parse(recordBody);
|
|
349
348
|
}
|
|
@@ -352,7 +351,7 @@ function createEventsClient(ignoreTraceRoutes = exports.defaultIgnoreTraceRoutes
|
|
|
352
351
|
}
|
|
353
352
|
}
|
|
354
353
|
catch (error) {
|
|
355
|
-
logger.error({ err: error }, 'Failed to parse SQS record body');
|
|
354
|
+
unnbound_logger_sdk_1.logger.error({ err: error }, 'Failed to parse SQS record body');
|
|
356
355
|
throw error;
|
|
357
356
|
}
|
|
358
357
|
// Check if envelope payload is stored in S3
|
|
@@ -364,15 +363,16 @@ function createEventsClient(ignoreTraceRoutes = exports.defaultIgnoreTraceRoutes
|
|
|
364
363
|
if (!s3Client) {
|
|
365
364
|
throw new Error('S3 client not initialized but S3 payload message received');
|
|
366
365
|
}
|
|
367
|
-
logger.info({
|
|
366
|
+
unnbound_logger_sdk_1.logger.info({
|
|
368
367
|
type: envelope.payload.type,
|
|
369
368
|
bucket: envelope.payload.location.bucket,
|
|
370
369
|
key: envelope.payload.location.key,
|
|
370
|
+
...(0, internal_1.internal)(),
|
|
371
371
|
}, 'Fetching S3 envelope payload');
|
|
372
372
|
let payloadData = await fetchS3Payload(s3Client, envelope.payload.location.bucket, envelope.payload.location.key, envelope.payload.location.versionId);
|
|
373
373
|
// Handle decompression if needed
|
|
374
374
|
if (envelope.payload.compressed && envelope.payload.compressionType) {
|
|
375
|
-
logger.info({ compressionType: envelope.payload.compressionType }, 'Decompressing payload');
|
|
375
|
+
unnbound_logger_sdk_1.logger.info({ compressionType: envelope.payload.compressionType, ...(0, internal_1.internal)() }, 'Decompressing payload');
|
|
376
376
|
payloadData = await decompressPayload(new TextEncoder().encode(payloadData), envelope.payload.compressionType);
|
|
377
377
|
}
|
|
378
378
|
// Parse the payload and set it as the request body
|
|
@@ -391,7 +391,7 @@ function createEventsClient(ignoreTraceRoutes = exports.defaultIgnoreTraceRoutes
|
|
|
391
391
|
? envelope.messageId
|
|
392
392
|
: undefined;
|
|
393
393
|
if (envelopeMessageId && headerMessageId && envelopeMessageId !== headerMessageId) {
|
|
394
|
-
logger.warn({ envelopeMessageId, headerMessageId }, 'Message ID mismatch detected in SQS envelope; defaulting to header value.');
|
|
394
|
+
unnbound_logger_sdk_1.logger.warn({ envelopeMessageId, headerMessageId }, 'Message ID mismatch detected in SQS envelope; defaulting to header value.');
|
|
395
395
|
}
|
|
396
396
|
const messageId = headerMessageId ?? envelopeMessageId ?? record.messageId ?? undefined;
|
|
397
397
|
const originalMessageId = envelopeMessageId && envelopeMessageId !== messageId
|
|
@@ -457,22 +457,20 @@ function createEventsClient(ignoreTraceRoutes = exports.defaultIgnoreTraceRoutes
|
|
|
457
457
|
if (bucketName || options?.s3) {
|
|
458
458
|
s3Options = options?.s3 || {};
|
|
459
459
|
if (!bucketName) {
|
|
460
|
-
|
|
460
|
+
throw new Error('S3 bucket name not provided. Set UNNBOUND_S3_PAYLOAD_BUCKET, S3_BUCKET env or pass options.bucketName');
|
|
461
461
|
}
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
throw error;
|
|
470
|
-
}
|
|
462
|
+
try {
|
|
463
|
+
s3Client = createS3Client({ ...s3Options, bucketName });
|
|
464
|
+
unnbound_logger_sdk_1.logger.info({ bucket: bucketName, ...(0, internal_1.internal)() }, 'S3 client initialized for payload offloading');
|
|
465
|
+
}
|
|
466
|
+
catch (error) {
|
|
467
|
+
unnbound_logger_sdk_1.logger.error({ err: error }, 'Failed to initialize S3 client');
|
|
468
|
+
throw error;
|
|
471
469
|
}
|
|
472
470
|
}
|
|
473
471
|
const awsSqs = require('@aws-sdk/client-sqs');
|
|
474
472
|
const queueUrl = options?.queueUrl || env.UNNBOUND_SQS_QUEUE_URL || env.SQS_QUEUE_URL || env.QUEUE_URL;
|
|
475
|
-
if (!queueUrl
|
|
473
|
+
if (!queueUrl) {
|
|
476
474
|
throw new Error('SQS queue URL not provided. Set UNNBOUND_SQS_QUEUE_URL, SQS_QUEUE_URL env or pass options.queueUrl');
|
|
477
475
|
}
|
|
478
476
|
const region = options?.region || env.AWS_REGION || 'us-east-1';
|
|
@@ -515,7 +513,7 @@ function createEventsClient(ignoreTraceRoutes = exports.defaultIgnoreTraceRoutes
|
|
|
515
513
|
}
|
|
516
514
|
}
|
|
517
515
|
catch (err) {
|
|
518
|
-
logger.error({ err }, 'SQS listen loop error');
|
|
516
|
+
unnbound_logger_sdk_1.logger.error({ err }, 'SQS listen loop error');
|
|
519
517
|
}
|
|
520
518
|
}
|
|
521
519
|
}
|
|
@@ -539,7 +537,7 @@ function createEventsClient(ignoreTraceRoutes = exports.defaultIgnoreTraceRoutes
|
|
|
539
537
|
});
|
|
540
538
|
}
|
|
541
539
|
catch (error) {
|
|
542
|
-
logger.error({ err: error, queueUrl: queueUrl.replace(/\/[^/]+$/, '/***') }, 'SQS connection test failed');
|
|
540
|
+
unnbound_logger_sdk_1.logger.error({ err: error, queueUrl: queueUrl.replace(/\/[^/]+$/, '/***') }, 'SQS connection test failed');
|
|
543
541
|
reject(error instanceof Error ? error : new Error(String(error)));
|
|
544
542
|
}
|
|
545
543
|
};
|
|
@@ -582,7 +580,7 @@ function createEventsClient(ignoreTraceRoutes = exports.defaultIgnoreTraceRoutes
|
|
|
582
580
|
httpServer = await this.http(httpOptions);
|
|
583
581
|
}
|
|
584
582
|
catch (error) {
|
|
585
|
-
logger.error({ err: error }, 'Failed to start HTTP server, continuing without it');
|
|
583
|
+
unnbound_logger_sdk_1.logger.error({ err: error }, 'Failed to start HTTP server, continuing without it');
|
|
586
584
|
}
|
|
587
585
|
// Start SQS listener
|
|
588
586
|
let sqsListener;
|
|
@@ -590,7 +588,7 @@ function createEventsClient(ignoreTraceRoutes = exports.defaultIgnoreTraceRoutes
|
|
|
590
588
|
sqsListener = await this.sqsListen(sqsListenOptions);
|
|
591
589
|
}
|
|
592
590
|
catch (error) {
|
|
593
|
-
logger.error({ err: error }, 'Failed to start SQS listener, continuing without it');
|
|
591
|
+
unnbound_logger_sdk_1.logger.error({ err: error }, 'Failed to start SQS listener, continuing without it');
|
|
594
592
|
}
|
|
595
593
|
// If neither HTTP nor SQS started successfully, throw an error
|
|
596
594
|
if (!httpServer && !sqsListener) {
|
|
@@ -599,14 +597,14 @@ function createEventsClient(ignoreTraceRoutes = exports.defaultIgnoreTraceRoutes
|
|
|
599
597
|
// Set up graceful shutdown
|
|
600
598
|
const g = globalThis;
|
|
601
599
|
const shutdown = async () => {
|
|
602
|
-
logger.info('Received shutdown signal, closing servers...');
|
|
600
|
+
unnbound_logger_sdk_1.logger.info('Received shutdown signal, closing servers...');
|
|
603
601
|
const promises = [];
|
|
604
602
|
if (httpServer)
|
|
605
603
|
promises.push(httpServer.close());
|
|
606
604
|
if (sqsListener)
|
|
607
605
|
promises.push(sqsListener.stop());
|
|
608
606
|
await Promise.all(promises);
|
|
609
|
-
logger.info('All servers closed');
|
|
607
|
+
unnbound_logger_sdk_1.logger.info('All servers closed');
|
|
610
608
|
g.process?.exit?.(0);
|
|
611
609
|
};
|
|
612
610
|
// Handle SIGINT and SIGTERM
|
|
@@ -618,7 +616,7 @@ function createEventsClient(ignoreTraceRoutes = exports.defaultIgnoreTraceRoutes
|
|
|
618
616
|
services.push(`HTTP on port ${httpOptions?.port ?? 3000}`);
|
|
619
617
|
if (sqsListener)
|
|
620
618
|
services.push('SQS listener');
|
|
621
|
-
logger.info({ services: services.join(' and ') }, 'Services started. Press Ctrl+C to stop.');
|
|
619
|
+
unnbound_logger_sdk_1.logger.info({ services: services.join(' and ') }, 'Services started. Press Ctrl+C to stop.');
|
|
622
620
|
},
|
|
623
621
|
};
|
|
624
622
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "unnbound-events",
|
|
3
3
|
"description": "Unified events SDK to handle HTTP routes and SQS messages with a single routing API.",
|
|
4
|
-
"version": "1.0.
|
|
4
|
+
"version": "1.0.22",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"author": "Unnbound Team",
|