@jaypie/express 1.2.4-rc5 → 1.2.4-rc6

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.
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var node_stream = require('node:stream');
4
+ var node_http = require('node:http');
4
5
  var errors = require('@jaypie/errors');
5
6
  var kit = require('@jaypie/kit');
6
7
  var expressCors = require('cors');
@@ -161,6 +162,10 @@ function createLambdaRequest(event, context) {
161
162
  //
162
163
  // Constants
163
164
  //
165
+ // Get Node's internal kOutHeaders symbol from ServerResponse prototype.
166
+ // This is needed for compatibility with Datadog dd-trace instrumentation,
167
+ // which patches HTTP methods and expects this internal state to exist.
168
+ const kOutHeaders$1 = Object.getOwnPropertySymbols(node_http.ServerResponse.prototype).find((s) => s.toString() === "Symbol(kOutHeaders)");
164
169
  const BINARY_CONTENT_TYPE_PATTERNS = [
165
170
  /^application\/octet-stream$/,
166
171
  /^application\/pdf$/,
@@ -191,6 +196,11 @@ class LambdaResponseBuffered extends node_stream.Writable {
191
196
  this._headers = new Map();
192
197
  this._headersSent = false;
193
198
  this._resolve = null;
199
+ // Initialize Node's internal kOutHeaders for dd-trace compatibility.
200
+ // dd-trace patches HTTP methods and expects this internal state.
201
+ if (kOutHeaders$1) {
202
+ this[kOutHeaders$1] = Object.create(null);
203
+ }
194
204
  }
195
205
  //
196
206
  // Promise-based API for getting final result
@@ -213,14 +223,31 @@ class LambdaResponseBuffered extends node_stream.Writable {
213
223
  // In production, log warning but don't throw to match Express behavior
214
224
  return this;
215
225
  }
216
- this._headers.set(name.toLowerCase(), String(value));
226
+ const lowerName = name.toLowerCase();
227
+ this._headers.set(lowerName, String(value));
228
+ // Sync with kOutHeaders for dd-trace compatibility
229
+ // Node stores as { 'header-name': ['Header-Name', value] }
230
+ if (kOutHeaders$1) {
231
+ const outHeaders = this[kOutHeaders$1];
232
+ if (outHeaders) {
233
+ outHeaders[lowerName] = [name, String(value)];
234
+ }
235
+ }
217
236
  return this;
218
237
  }
219
238
  getHeader(name) {
220
239
  return this._headers.get(name.toLowerCase());
221
240
  }
222
241
  removeHeader(name) {
223
- this._headers.delete(name.toLowerCase());
242
+ const lowerName = name.toLowerCase();
243
+ this._headers.delete(lowerName);
244
+ // Sync with kOutHeaders for dd-trace compatibility
245
+ if (kOutHeaders$1) {
246
+ const outHeaders = this[kOutHeaders$1];
247
+ if (outHeaders) {
248
+ delete outHeaders[lowerName];
249
+ }
250
+ }
224
251
  }
225
252
  getHeaders() {
226
253
  const headers = {};
@@ -414,6 +441,14 @@ class LambdaResponseBuffered extends node_stream.Writable {
414
441
  }
415
442
  }
416
443
 
444
+ //
445
+ //
446
+ // Constants
447
+ //
448
+ // Get Node's internal kOutHeaders symbol from ServerResponse prototype.
449
+ // This is needed for compatibility with Datadog dd-trace instrumentation,
450
+ // which patches HTTP methods and expects this internal state to exist.
451
+ const kOutHeaders = Object.getOwnPropertySymbols(node_http.ServerResponse.prototype).find((s) => s.toString() === "Symbol(kOutHeaders)");
417
452
  //
418
453
  //
419
454
  // LambdaResponseStreaming Class
@@ -436,6 +471,11 @@ class LambdaResponseStreaming extends node_stream.Writable {
436
471
  this._pendingWrites = [];
437
472
  this._wrappedStream = null;
438
473
  this._responseStream = responseStream;
474
+ // Initialize Node's internal kOutHeaders for dd-trace compatibility.
475
+ // dd-trace patches HTTP methods and expects this internal state.
476
+ if (kOutHeaders) {
477
+ this[kOutHeaders] = Object.create(null);
478
+ }
439
479
  }
440
480
  //
441
481
  // Header management
@@ -446,7 +486,16 @@ class LambdaResponseStreaming extends node_stream.Writable {
446
486
  // Headers cannot be changed after body starts
447
487
  return this;
448
488
  }
449
- this._headers.set(name.toLowerCase(), String(value));
489
+ const lowerName = name.toLowerCase();
490
+ this._headers.set(lowerName, String(value));
491
+ // Sync with kOutHeaders for dd-trace compatibility
492
+ // Node stores as { 'header-name': ['Header-Name', value] }
493
+ if (kOutHeaders) {
494
+ const outHeaders = this[kOutHeaders];
495
+ if (outHeaders) {
496
+ outHeaders[lowerName] = [name, String(value)];
497
+ }
498
+ }
450
499
  return this;
451
500
  }
452
501
  getHeader(name) {
@@ -454,7 +503,15 @@ class LambdaResponseStreaming extends node_stream.Writable {
454
503
  }
455
504
  removeHeader(name) {
456
505
  if (!this._headersSent) {
457
- this._headers.delete(name.toLowerCase());
506
+ const lowerName = name.toLowerCase();
507
+ this._headers.delete(lowerName);
508
+ // Sync with kOutHeaders for dd-trace compatibility
509
+ if (kOutHeaders) {
510
+ const outHeaders = this[kOutHeaders];
511
+ if (outHeaders) {
512
+ delete outHeaders[lowerName];
513
+ }
514
+ }
458
515
  }
459
516
  }
460
517
  getHeaders() {