@jaypie/express 1.2.4-rc6 → 1.2.4-rc7

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.
@@ -1126,6 +1126,64 @@ function getCurrentInvokeUuid(req) {
1126
1126
  return getWebAdapterUuid();
1127
1127
  }
1128
1128
 
1129
+ //
1130
+ //
1131
+ // Helpers
1132
+ //
1133
+ /**
1134
+ * Safely get a header value from response.
1135
+ * Handles both Express Response and Lambda adapter responses.
1136
+ * Defensive against dd-trace instrumentation issues.
1137
+ */
1138
+ function safeGetHeader(res, name) {
1139
+ try {
1140
+ // Try direct _headers access first (Lambda adapter, avoids dd-trace)
1141
+ if (res._headers instanceof Map) {
1142
+ const value = res._headers.get(name.toLowerCase());
1143
+ return value ? String(value) : undefined;
1144
+ }
1145
+ // Fall back to getHeader (more standard than get)
1146
+ if (typeof res.getHeader === "function") {
1147
+ const value = res.getHeader(name);
1148
+ return value ? String(value) : undefined;
1149
+ }
1150
+ // Last resort: try get
1151
+ if (typeof res.get === "function") {
1152
+ const value = res.get(name);
1153
+ return value ? String(value) : undefined;
1154
+ }
1155
+ }
1156
+ catch {
1157
+ // Silently fail - caller will handle missing value
1158
+ }
1159
+ return undefined;
1160
+ }
1161
+ /**
1162
+ * Safely set a header value on response.
1163
+ * Handles both Express Response and Lambda adapter responses.
1164
+ * Defensive against dd-trace instrumentation issues.
1165
+ */
1166
+ function safeSetHeader(res, name, value) {
1167
+ try {
1168
+ // Try direct _headers access first (Lambda adapter, avoids dd-trace)
1169
+ if (res._headers instanceof Map) {
1170
+ res._headers.set(name.toLowerCase(), value);
1171
+ return;
1172
+ }
1173
+ // Fall back to setHeader (more standard than set)
1174
+ if (typeof res.setHeader === "function") {
1175
+ res.setHeader(name, value);
1176
+ return;
1177
+ }
1178
+ // Last resort: try set
1179
+ if (typeof res.set === "function") {
1180
+ res.set(name, value);
1181
+ }
1182
+ }
1183
+ catch {
1184
+ // Silently fail - header just won't be set
1185
+ }
1186
+ }
1129
1187
  //
1130
1188
  //
1131
1189
  // Main
@@ -1142,36 +1200,37 @@ const decorateResponse = (res, { handler = "", version = process.env.PROJECT_VER
1142
1200
  log.warn("decorateResponse called but response is not an object");
1143
1201
  return;
1144
1202
  }
1203
+ const extRes = res;
1145
1204
  try {
1146
1205
  //
1147
1206
  //
1148
1207
  // Decorate Headers
1149
1208
  //
1150
1209
  // X-Powered-By, override "Express" but nothing else
1151
- if (!res.get(kit.HTTP.HEADER.POWERED_BY) ||
1152
- res.get(kit.HTTP.HEADER.POWERED_BY) === "Express") {
1153
- res.set(kit.HTTP.HEADER.POWERED_BY, kit.JAYPIE.LIB.EXPRESS);
1210
+ const currentPoweredBy = safeGetHeader(extRes, kit.HTTP.HEADER.POWERED_BY);
1211
+ if (!currentPoweredBy || currentPoweredBy === "Express") {
1212
+ safeSetHeader(extRes, kit.HTTP.HEADER.POWERED_BY, kit.JAYPIE.LIB.EXPRESS);
1154
1213
  }
1155
1214
  // X-Project-Environment
1156
1215
  if (process.env.PROJECT_ENV) {
1157
- res.set(kit.HTTP.HEADER.PROJECT.ENVIRONMENT, process.env.PROJECT_ENV);
1216
+ safeSetHeader(extRes, kit.HTTP.HEADER.PROJECT.ENVIRONMENT, process.env.PROJECT_ENV);
1158
1217
  }
1159
1218
  // X-Project-Handler
1160
1219
  if (handler) {
1161
- res.set(kit.HTTP.HEADER.PROJECT.HANDLER, handler);
1220
+ safeSetHeader(extRes, kit.HTTP.HEADER.PROJECT.HANDLER, handler);
1162
1221
  }
1163
1222
  // X-Project-Invocation
1164
1223
  const currentInvoke = getCurrentInvokeUuid();
1165
1224
  if (currentInvoke) {
1166
- res.set(kit.HTTP.HEADER.PROJECT.INVOCATION, currentInvoke);
1225
+ safeSetHeader(extRes, kit.HTTP.HEADER.PROJECT.INVOCATION, currentInvoke);
1167
1226
  }
1168
1227
  // X-Project-Key
1169
1228
  if (process.env.PROJECT_KEY) {
1170
- res.set(kit.HTTP.HEADER.PROJECT.KEY, process.env.PROJECT_KEY);
1229
+ safeSetHeader(extRes, kit.HTTP.HEADER.PROJECT.KEY, process.env.PROJECT_KEY);
1171
1230
  }
1172
1231
  // X-Project-Version
1173
1232
  if (version) {
1174
- res.set(kit.HTTP.HEADER.PROJECT.VERSION, version);
1233
+ safeSetHeader(extRes, kit.HTTP.HEADER.PROJECT.VERSION, version);
1175
1234
  }
1176
1235
  //
1177
1236
  //