headers.mjs 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
  2. import { isReadonlyArray } from "./utils/values.mjs";
  3. const brand_privateNullableHeaders = Symbol.for('brand.privateNullableHeaders');
  4. function* iterateHeaders(headers) {
  5. if (!headers)
  6. return;
  7. if (brand_privateNullableHeaders in headers) {
  8. const { values, nulls } = headers;
  9. yield* values.entries();
  10. for (const name of nulls) {
  11. yield [name, null];
  12. }
  13. return;
  14. }
  15. let shouldClear = false;
  16. let iter;
  17. if (headers instanceof Headers) {
  18. iter = headers.entries();
  19. }
  20. else if (isReadonlyArray(headers)) {
  21. iter = headers;
  22. }
  23. else {
  24. shouldClear = true;
  25. iter = Object.entries(headers ?? {});
  26. }
  27. for (let row of iter) {
  28. const name = row[0];
  29. if (typeof name !== 'string')
  30. throw new TypeError('expected header name to be a string');
  31. const values = isReadonlyArray(row[1]) ? row[1] : [row[1]];
  32. let didClear = false;
  33. for (const value of values) {
  34. if (value === undefined)
  35. continue;
  36. // Objects keys always overwrite older headers, they never append.
  37. // Yield a null to clear the header before adding the new values.
  38. if (shouldClear && !didClear) {
  39. didClear = true;
  40. yield [name, null];
  41. }
  42. yield [name, value];
  43. }
  44. }
  45. }
  46. export const buildHeaders = (newHeaders) => {
  47. const targetHeaders = new Headers();
  48. const nullHeaders = new Set();
  49. for (const headers of newHeaders) {
  50. const seenHeaders = new Set();
  51. for (const [name, value] of iterateHeaders(headers)) {
  52. const lowerName = name.toLowerCase();
  53. if (!seenHeaders.has(lowerName)) {
  54. targetHeaders.delete(name);
  55. seenHeaders.add(lowerName);
  56. }
  57. if (value === null) {
  58. targetHeaders.delete(name);
  59. nullHeaders.add(lowerName);
  60. }
  61. else {
  62. targetHeaders.append(name, value);
  63. nullHeaders.delete(lowerName);
  64. }
  65. }
  66. }
  67. return { [brand_privateNullableHeaders]: true, values: targetHeaders, nulls: nullHeaders };
  68. };
  69. export const isEmptyHeaders = (headers) => {
  70. for (const _ of iterateHeaders(headers))
  71. return false;
  72. return true;
  73. };
  74. //# sourceMappingURL=headers.mjs.map