@jaypie/express 1.2.13 → 1.2.15

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.
@@ -2,7 +2,7 @@ import type { Request } from "express";
2
2
  export interface RequestSummary {
3
3
  baseUrl: string;
4
4
  body: unknown;
5
- headers: Request["headers"];
5
+ headers: Record<string, string | string[] | undefined>;
6
6
  method: string;
7
7
  query: Request["query"];
8
8
  url: string;
package/dist/esm/index.js CHANGED
@@ -4,7 +4,7 @@ import { CorsError, BadRequestError, UnhandledError, GatewayTimeoutError, Unavai
4
4
  import { force, envBoolean, JAYPIE, HTTP, getHeaderFrom, jaypieHandler } from '@jaypie/kit';
5
5
  import expressCors from 'cors';
6
6
  import { loadEnvSecrets, getContentTypeForFormat, formatStreamError } from '@jaypie/aws';
7
- import { log } from '@jaypie/logger';
7
+ import { log, redactAuth } from '@jaypie/logger';
8
8
  import { hasDatadogEnv, submitMetric, DATADOG } from '@jaypie/datadog';
9
9
 
10
10
  //
@@ -1390,71 +1390,61 @@ function getCurrentInvokeUuid(req) {
1390
1390
  return getJaypieAdapterUuid();
1391
1391
  }
1392
1392
 
1393
- //
1394
- //
1395
- // Helpers
1396
- //
1397
1393
  /**
1398
- * Safely get a header value from response.
1394
+ * Safely set a header value on response.
1399
1395
  * Handles both Express Response and Lambda adapter responses.
1400
1396
  * Defensive against dd-trace instrumentation issues.
1401
1397
  */
1402
- function safeGetHeader(res, name) {
1398
+ function safeSetHeader(res, name, value) {
1403
1399
  try {
1404
1400
  // Try internal method first (completely bypasses dd-trace)
1405
- if (typeof res._internalGetHeader === "function") {
1406
- return res._internalGetHeader(name);
1401
+ if (typeof res._internalSetHeader === "function") {
1402
+ res._internalSetHeader(name, value);
1403
+ return;
1407
1404
  }
1408
1405
  // Fall back to _headers Map access (Lambda adapter, avoids dd-trace)
1409
1406
  if (res._headers instanceof Map) {
1410
- const value = res._headers.get(name.toLowerCase());
1411
- return value ? String(value) : undefined;
1407
+ res._headers.set(name.toLowerCase(), value);
1408
+ return;
1412
1409
  }
1413
- // Fall back to getHeader (more standard than get)
1414
- if (typeof res.getHeader === "function") {
1415
- const value = res.getHeader(name);
1416
- return value ? String(value) : undefined;
1410
+ // Fall back to setHeader (more standard than set)
1411
+ if (typeof res.setHeader === "function") {
1412
+ res.setHeader(name, value);
1413
+ return;
1417
1414
  }
1418
- // Last resort: try get
1419
- if (typeof res.get === "function") {
1420
- const value = res.get(name);
1421
- return value ? String(value) : undefined;
1415
+ // Last resort: try set
1416
+ if (typeof res.set === "function") {
1417
+ res.set(name, value);
1422
1418
  }
1423
1419
  }
1424
1420
  catch {
1425
- // Silently fail - caller will handle missing value
1421
+ // Silently fail - header just won't be set
1426
1422
  }
1427
- return undefined;
1428
1423
  }
1429
1424
  /**
1430
- * Safely set a header value on response.
1425
+ * Safely remove a header from response.
1431
1426
  * Handles both Express Response and Lambda adapter responses.
1432
1427
  * Defensive against dd-trace instrumentation issues.
1433
1428
  */
1434
- function safeSetHeader(res, name, value) {
1429
+ function safeRemoveHeader(res, name) {
1435
1430
  try {
1436
1431
  // Try internal method first (completely bypasses dd-trace)
1437
- if (typeof res._internalSetHeader === "function") {
1438
- res._internalSetHeader(name, value);
1432
+ if (typeof res._internalRemoveHeader === "function") {
1433
+ res._internalRemoveHeader(name);
1439
1434
  return;
1440
1435
  }
1441
1436
  // Fall back to _headers Map access (Lambda adapter, avoids dd-trace)
1442
1437
  if (res._headers instanceof Map) {
1443
- res._headers.set(name.toLowerCase(), value);
1438
+ res._headers.delete(name.toLowerCase());
1444
1439
  return;
1445
1440
  }
1446
- // Fall back to setHeader (more standard than set)
1447
- if (typeof res.setHeader === "function") {
1448
- res.setHeader(name, value);
1449
- return;
1450
- }
1451
- // Last resort: try set
1452
- if (typeof res.set === "function") {
1453
- res.set(name, value);
1441
+ // Fall back to removeHeader (standard Node.js http.ServerResponse)
1442
+ if (typeof res.removeHeader === "function") {
1443
+ res.removeHeader(name);
1454
1444
  }
1455
1445
  }
1456
1446
  catch {
1457
- // Silently fail - header just won't be set
1447
+ // Silently fail - header just won't be removed
1458
1448
  }
1459
1449
  }
1460
1450
  //
@@ -1479,11 +1469,8 @@ const decorateResponse = (res, { handler = "", version = process.env.PROJECT_VER
1479
1469
  //
1480
1470
  // Decorate Headers
1481
1471
  //
1482
- // X-Powered-By, override "Express" but nothing else
1483
- const currentPoweredBy = safeGetHeader(extRes, HTTP.HEADER.POWERED_BY);
1484
- if (!currentPoweredBy || currentPoweredBy === "Express") {
1485
- safeSetHeader(extRes, HTTP.HEADER.POWERED_BY, JAYPIE.LIB.EXPRESS);
1486
- }
1472
+ // Remove X-Powered-By
1473
+ safeRemoveHeader(extRes, HTTP.HEADER.POWERED_BY);
1487
1474
  // X-Project-Environment
1488
1475
  if (process.env.PROJECT_ENV) {
1489
1476
  safeSetHeader(extRes, HTTP.HEADER.PROJECT.ENVIRONMENT, process.env.PROJECT_ENV);
@@ -1523,6 +1510,11 @@ const decorateResponse = (res, { handler = "", version = process.env.PROJECT_VER
1523
1510
  // about the environment's secret parameters, the special adapter,
1524
1511
  // HTTP, etc. There must be a better way to organize this
1525
1512
 
1513
+ //
1514
+ //
1515
+ // Constants
1516
+ //
1517
+ const SENSITIVE_HEADERS = new Set(["authorization", "cookie", "set-cookie"]);
1526
1518
  //
1527
1519
  //
1528
1520
  // Function Definition
@@ -1533,10 +1525,19 @@ function summarizeRequest(req) {
1533
1525
  if (Buffer.isBuffer(body)) {
1534
1526
  body = body.toString();
1535
1527
  }
1528
+ // Redact sensitive headers
1529
+ const headers = {
1530
+ ...req.headers,
1531
+ };
1532
+ for (const key of Object.keys(headers)) {
1533
+ if (SENSITIVE_HEADERS.has(key.toLowerCase())) {
1534
+ headers[key] = redactAuth(headers[key]);
1535
+ }
1536
+ }
1536
1537
  return {
1537
1538
  baseUrl: req.baseUrl,
1538
1539
  body,
1539
- headers: req.headers,
1540
+ headers,
1540
1541
  method: req.method,
1541
1542
  query: req.query,
1542
1543
  url: req.url,