rezo 1.0.0

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.
Files changed (135) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +1507 -0
  3. package/assets/icon.svg +37 -0
  4. package/assets/logo-dark.svg +47 -0
  5. package/assets/logo.svg +58 -0
  6. package/dist/adapters/curl.cjs +1034 -0
  7. package/dist/adapters/curl.js +1031 -0
  8. package/dist/adapters/entries/curl.cjs +4 -0
  9. package/dist/adapters/entries/curl.d.ts +2136 -0
  10. package/dist/adapters/entries/curl.js +2 -0
  11. package/dist/adapters/entries/fetch.cjs +2 -0
  12. package/dist/adapters/entries/fetch.d.ts +2127 -0
  13. package/dist/adapters/entries/fetch.js +1 -0
  14. package/dist/adapters/entries/http.cjs +2 -0
  15. package/dist/adapters/entries/http.d.ts +2126 -0
  16. package/dist/adapters/entries/http.js +1 -0
  17. package/dist/adapters/entries/http2.cjs +4 -0
  18. package/dist/adapters/entries/http2.d.ts +2136 -0
  19. package/dist/adapters/entries/http2.js +2 -0
  20. package/dist/adapters/entries/react-native.cjs +2 -0
  21. package/dist/adapters/entries/react-native.d.ts +2126 -0
  22. package/dist/adapters/entries/react-native.js +1 -0
  23. package/dist/adapters/entries/xhr.cjs +2 -0
  24. package/dist/adapters/entries/xhr.d.ts +2127 -0
  25. package/dist/adapters/entries/xhr.js +1 -0
  26. package/dist/adapters/fetch.cjs +740 -0
  27. package/dist/adapters/fetch.js +739 -0
  28. package/dist/adapters/http.cjs +1153 -0
  29. package/dist/adapters/http.js +1151 -0
  30. package/dist/adapters/http2.cjs +957 -0
  31. package/dist/adapters/http2.js +956 -0
  32. package/dist/adapters/index.cjs +6 -0
  33. package/dist/adapters/index.js +7 -0
  34. package/dist/adapters/picker.cjs +342 -0
  35. package/dist/adapters/picker.js +331 -0
  36. package/dist/adapters/react-native.cjs +545 -0
  37. package/dist/adapters/react-native.js +544 -0
  38. package/dist/adapters/xhr.cjs +622 -0
  39. package/dist/adapters/xhr.js +621 -0
  40. package/dist/cache/dns-cache.cjs +118 -0
  41. package/dist/cache/dns-cache.js +113 -0
  42. package/dist/cache/file-cacher.cjs +264 -0
  43. package/dist/cache/file-cacher.js +261 -0
  44. package/dist/cache/index.cjs +13 -0
  45. package/dist/cache/index.js +5 -0
  46. package/dist/cache/lru-cache.cjs +96 -0
  47. package/dist/cache/lru-cache.js +93 -0
  48. package/dist/cache/response-cache.cjs +314 -0
  49. package/dist/cache/response-cache.js +310 -0
  50. package/dist/cache/url-store.cjs +288 -0
  51. package/dist/cache/url-store.js +285 -0
  52. package/dist/core/hooks.cjs +133 -0
  53. package/dist/core/hooks.js +120 -0
  54. package/dist/core/rezo.cjs +464 -0
  55. package/dist/core/rezo.js +458 -0
  56. package/dist/crawler.d.ts +6255 -0
  57. package/dist/dom/index.cjs +1 -0
  58. package/dist/dom/index.d.ts +23 -0
  59. package/dist/dom/index.js +1 -0
  60. package/dist/entries/crawler.cjs +5 -0
  61. package/dist/entries/crawler.js +2 -0
  62. package/dist/errors/rezo-error.cjs +722 -0
  63. package/dist/errors/rezo-error.js +716 -0
  64. package/dist/index.cjs +34 -0
  65. package/dist/index.d.ts +3335 -0
  66. package/dist/index.js +26 -0
  67. package/dist/platform/browser.cjs +9 -0
  68. package/dist/platform/browser.d.ts +3203 -0
  69. package/dist/platform/browser.js +7 -0
  70. package/dist/platform/bun.cjs +9 -0
  71. package/dist/platform/bun.d.ts +3203 -0
  72. package/dist/platform/bun.js +7 -0
  73. package/dist/platform/deno.cjs +9 -0
  74. package/dist/platform/deno.d.ts +3203 -0
  75. package/dist/platform/deno.js +7 -0
  76. package/dist/platform/node.cjs +9 -0
  77. package/dist/platform/node.d.ts +3203 -0
  78. package/dist/platform/node.js +7 -0
  79. package/dist/platform/react-native.cjs +9 -0
  80. package/dist/platform/react-native.d.ts +3203 -0
  81. package/dist/platform/react-native.js +7 -0
  82. package/dist/platform/worker.cjs +9 -0
  83. package/dist/platform/worker.d.ts +3203 -0
  84. package/dist/platform/worker.js +7 -0
  85. package/dist/plugin/addon/decodo/index.cjs +1 -0
  86. package/dist/plugin/addon/decodo/index.js +1 -0
  87. package/dist/plugin/addon/decodo/options.cjs +1 -0
  88. package/dist/plugin/addon/decodo/options.js +1 -0
  89. package/dist/plugin/addon/oxylabs/index.cjs +1 -0
  90. package/dist/plugin/addon/oxylabs/index.js +1 -0
  91. package/dist/plugin/addon/oxylabs/options.cjs +1 -0
  92. package/dist/plugin/addon/oxylabs/options.js +1 -0
  93. package/dist/plugin/crawler-options.cjs +1 -0
  94. package/dist/plugin/crawler-options.js +1 -0
  95. package/dist/plugin/crawler.cjs +519 -0
  96. package/dist/plugin/crawler.js +517 -0
  97. package/dist/plugin/index.cjs +36 -0
  98. package/dist/plugin/index.js +32 -0
  99. package/dist/proxy/index.cjs +142 -0
  100. package/dist/proxy/index.js +139 -0
  101. package/dist/responses/buildError.cjs +452 -0
  102. package/dist/responses/buildError.js +441 -0
  103. package/dist/responses/buildResponse.cjs +365 -0
  104. package/dist/responses/buildResponse.js +361 -0
  105. package/dist/responses/download.cjs +54 -0
  106. package/dist/responses/download.js +52 -0
  107. package/dist/responses/stream.cjs +60 -0
  108. package/dist/responses/stream.js +58 -0
  109. package/dist/responses/upload.cjs +54 -0
  110. package/dist/responses/upload.js +52 -0
  111. package/dist/types/cookies.cjs +394 -0
  112. package/dist/types/cookies.js +391 -0
  113. package/dist/types/download.cjs +10 -0
  114. package/dist/types/download.js +10 -0
  115. package/dist/types/rezo-request.cjs +131 -0
  116. package/dist/types/rezo-request.js +131 -0
  117. package/dist/utils/agent-merger.cjs +111 -0
  118. package/dist/utils/agent-merger.js +108 -0
  119. package/dist/utils/compression.cjs +84 -0
  120. package/dist/utils/compression.js +82 -0
  121. package/dist/utils/cookies.cjs +514 -0
  122. package/dist/utils/cookies.js +511 -0
  123. package/dist/utils/data-operations.cjs +75 -0
  124. package/dist/utils/data-operations.js +73 -0
  125. package/dist/utils/form-data.cjs +164 -0
  126. package/dist/utils/form-data.js +161 -0
  127. package/dist/utils/headers.cjs +162 -0
  128. package/dist/utils/headers.js +161 -0
  129. package/dist/utils/http-config.cjs +723 -0
  130. package/dist/utils/http-config.js +718 -0
  131. package/dist/utils/index.cjs +8 -0
  132. package/dist/utils/index.js +8 -0
  133. package/dist/utils/tools.cjs +18 -0
  134. package/dist/utils/tools.js +15 -0
  135. package/package.json +172 -0
@@ -0,0 +1,164 @@
1
+ const NodeFormData = require("form-data");
2
+ const { Readable } = require("node:stream");
3
+
4
+ class RezoFormData extends NodeFormData {
5
+ constructor(options) {
6
+ super(options);
7
+ }
8
+ async getFieldEntries() {
9
+ return new Promise((resolve, reject) => {
10
+ const entries = [];
11
+ const fields = this._fields || [];
12
+ for (const field of fields) {
13
+ if (field && field.name && field.value !== undefined) {
14
+ entries.push([field.name, field.value]);
15
+ }
16
+ }
17
+ resolve(entries);
18
+ });
19
+ }
20
+ async toNativeFormData() {
21
+ if (typeof globalThis !== "undefined" && typeof globalThis.FormData !== "undefined" || typeof global !== "undefined" && typeof global.FormData !== "undefined" || typeof window !== "undefined" && typeof window.FormData !== "undefined") {
22
+ const formData = new FormData;
23
+ const entries = await this.getFieldEntries();
24
+ for (const [key, value] of entries) {
25
+ if (value instanceof Readable) {
26
+ const chunks = [];
27
+ for await (const chunk of value) {
28
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
29
+ }
30
+ const buffer = Buffer.concat(chunks);
31
+ const blob = new Blob([buffer]);
32
+ formData.append(key, blob);
33
+ } else {
34
+ formData.append(key, value);
35
+ }
36
+ }
37
+ return formData;
38
+ }
39
+ return null;
40
+ }
41
+ static async fromNativeFormData(formData, options) {
42
+ const rezoFormData = new RezoFormData(options);
43
+ for (const [key, value] of Array.from(formData.entries())) {
44
+ if (typeof File !== "undefined" && value instanceof File) {
45
+ const file = value;
46
+ const arrayBuffer = await file.arrayBuffer();
47
+ const buffer = Buffer.from(arrayBuffer);
48
+ rezoFormData.append(key, buffer, {
49
+ filename: file.name,
50
+ contentType: file.type || "application/octet-stream"
51
+ });
52
+ } else if (typeof Blob !== "undefined" && value instanceof Blob) {
53
+ const blob = value;
54
+ const arrayBuffer = await blob.arrayBuffer();
55
+ const buffer = Buffer.from(arrayBuffer);
56
+ rezoFormData.append(key, buffer, {
57
+ contentType: blob.type || "application/octet-stream"
58
+ });
59
+ } else {
60
+ rezoFormData.append(key, value);
61
+ }
62
+ }
63
+ return rezoFormData;
64
+ }
65
+ getContentType() {
66
+ return `multipart/form-data; boundary=${this.getBoundary()}`;
67
+ }
68
+ toBuffer() {
69
+ return Buffer.from(this.toString());
70
+ }
71
+ static fromObject(obj, options) {
72
+ const formData = new RezoFormData(options);
73
+ for (const [key, value] of Object.entries(obj)) {
74
+ if (Array.isArray(value)) {
75
+ for (const item of value) {
76
+ formData.append(key, item);
77
+ }
78
+ } else {
79
+ formData.append(key, value);
80
+ }
81
+ }
82
+ return formData;
83
+ }
84
+ async toUrlQueryString(convertBinaryToBase64 = false) {
85
+ const params = new URLSearchParams;
86
+ let hasOmittedData = false;
87
+ try {
88
+ const entries = await this.getFieldEntries();
89
+ for (const [name, value] of entries) {
90
+ if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
91
+ params.append(name, String(value));
92
+ } else if (value instanceof Buffer) {
93
+ if (convertBinaryToBase64) {
94
+ params.append(name, value.toString("base64"));
95
+ } else {
96
+ hasOmittedData = true;
97
+ }
98
+ } else if (value instanceof Readable || typeof File !== "undefined" && value instanceof File || typeof Blob !== "undefined" && value instanceof Blob) {
99
+ if (convertBinaryToBase64 && value instanceof File) {
100
+ hasOmittedData = true;
101
+ } else {
102
+ hasOmittedData = true;
103
+ }
104
+ } else if (typeof value === "object" && value && "value" in value) {
105
+ if (typeof value.value === "string" || typeof value.value === "number" || typeof value.value === "boolean") {
106
+ params.append(name, String(value.value));
107
+ } else {
108
+ hasOmittedData = true;
109
+ }
110
+ } else {
111
+ hasOmittedData = true;
112
+ }
113
+ }
114
+ } catch (error) {
115
+ console.warn("RezoFormData.toUrlQueryString(): Error reading form data entries:", error);
116
+ }
117
+ if (hasOmittedData && !convertBinaryToBase64) {
118
+ console.warn("RezoFormData.toUrlQueryString(): Binary data, files, and blobs have been omitted. Use convertBinaryToBase64=true to include binary data as base64 strings.");
119
+ }
120
+ return params.toString();
121
+ }
122
+ async toURLSearchParams(convertBinaryToBase64 = false) {
123
+ const params = new URLSearchParams;
124
+ let hasOmittedData = false;
125
+ try {
126
+ const entries = await this.getFieldEntries();
127
+ for (const [name, value] of entries) {
128
+ if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
129
+ params.append(name, String(value));
130
+ } else if (value instanceof Buffer) {
131
+ if (convertBinaryToBase64) {
132
+ params.append(name, value.toString("base64"));
133
+ } else {
134
+ hasOmittedData = true;
135
+ }
136
+ } else if (value instanceof Readable || typeof File !== "undefined" && value instanceof File || typeof Blob !== "undefined" && value instanceof Blob) {
137
+ if (convertBinaryToBase64 && value instanceof File) {
138
+ hasOmittedData = true;
139
+ } else {
140
+ hasOmittedData = true;
141
+ }
142
+ } else if (typeof value === "object" && value && "value" in value) {
143
+ if (typeof value.value === "string" || typeof value.value === "number" || typeof value.value === "boolean") {
144
+ params.append(name, String(value.value));
145
+ } else {
146
+ hasOmittedData = true;
147
+ }
148
+ } else {
149
+ hasOmittedData = true;
150
+ }
151
+ }
152
+ } catch (error) {
153
+ console.warn("RezoFormData.toURLSearchParams(): Error reading form data entries:", error);
154
+ }
155
+ if (hasOmittedData && !convertBinaryToBase64) {
156
+ console.warn("RezoFormData.toURLSearchParams(): Binary data, files, and blobs have been omitted. Use convertBinaryToBase64=true to include binary data as base64 strings.");
157
+ }
158
+ return params;
159
+ }
160
+ }
161
+
162
+ exports.RezoFormData = RezoFormData;
163
+ exports.default = RezoFormData;
164
+ module.exports = Object.assign(RezoFormData, exports);
@@ -0,0 +1,161 @@
1
+ import NodeFormData from "form-data";
2
+ import { Readable } from "node:stream";
3
+
4
+ export class RezoFormData extends NodeFormData {
5
+ constructor(options) {
6
+ super(options);
7
+ }
8
+ async getFieldEntries() {
9
+ return new Promise((resolve, reject) => {
10
+ const entries = [];
11
+ const fields = this._fields || [];
12
+ for (const field of fields) {
13
+ if (field && field.name && field.value !== undefined) {
14
+ entries.push([field.name, field.value]);
15
+ }
16
+ }
17
+ resolve(entries);
18
+ });
19
+ }
20
+ async toNativeFormData() {
21
+ if (typeof globalThis !== "undefined" && typeof globalThis.FormData !== "undefined" || typeof global !== "undefined" && typeof global.FormData !== "undefined" || typeof window !== "undefined" && typeof window.FormData !== "undefined") {
22
+ const formData = new FormData;
23
+ const entries = await this.getFieldEntries();
24
+ for (const [key, value] of entries) {
25
+ if (value instanceof Readable) {
26
+ const chunks = [];
27
+ for await (const chunk of value) {
28
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
29
+ }
30
+ const buffer = Buffer.concat(chunks);
31
+ const blob = new Blob([buffer]);
32
+ formData.append(key, blob);
33
+ } else {
34
+ formData.append(key, value);
35
+ }
36
+ }
37
+ return formData;
38
+ }
39
+ return null;
40
+ }
41
+ static async fromNativeFormData(formData, options) {
42
+ const rezoFormData = new RezoFormData(options);
43
+ for (const [key, value] of Array.from(formData.entries())) {
44
+ if (typeof File !== "undefined" && value instanceof File) {
45
+ const file = value;
46
+ const arrayBuffer = await file.arrayBuffer();
47
+ const buffer = Buffer.from(arrayBuffer);
48
+ rezoFormData.append(key, buffer, {
49
+ filename: file.name,
50
+ contentType: file.type || "application/octet-stream"
51
+ });
52
+ } else if (typeof Blob !== "undefined" && value instanceof Blob) {
53
+ const blob = value;
54
+ const arrayBuffer = await blob.arrayBuffer();
55
+ const buffer = Buffer.from(arrayBuffer);
56
+ rezoFormData.append(key, buffer, {
57
+ contentType: blob.type || "application/octet-stream"
58
+ });
59
+ } else {
60
+ rezoFormData.append(key, value);
61
+ }
62
+ }
63
+ return rezoFormData;
64
+ }
65
+ getContentType() {
66
+ return `multipart/form-data; boundary=${this.getBoundary()}`;
67
+ }
68
+ toBuffer() {
69
+ return Buffer.from(this.toString());
70
+ }
71
+ static fromObject(obj, options) {
72
+ const formData = new RezoFormData(options);
73
+ for (const [key, value] of Object.entries(obj)) {
74
+ if (Array.isArray(value)) {
75
+ for (const item of value) {
76
+ formData.append(key, item);
77
+ }
78
+ } else {
79
+ formData.append(key, value);
80
+ }
81
+ }
82
+ return formData;
83
+ }
84
+ async toUrlQueryString(convertBinaryToBase64 = false) {
85
+ const params = new URLSearchParams;
86
+ let hasOmittedData = false;
87
+ try {
88
+ const entries = await this.getFieldEntries();
89
+ for (const [name, value] of entries) {
90
+ if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
91
+ params.append(name, String(value));
92
+ } else if (value instanceof Buffer) {
93
+ if (convertBinaryToBase64) {
94
+ params.append(name, value.toString("base64"));
95
+ } else {
96
+ hasOmittedData = true;
97
+ }
98
+ } else if (value instanceof Readable || typeof File !== "undefined" && value instanceof File || typeof Blob !== "undefined" && value instanceof Blob) {
99
+ if (convertBinaryToBase64 && value instanceof File) {
100
+ hasOmittedData = true;
101
+ } else {
102
+ hasOmittedData = true;
103
+ }
104
+ } else if (typeof value === "object" && value && "value" in value) {
105
+ if (typeof value.value === "string" || typeof value.value === "number" || typeof value.value === "boolean") {
106
+ params.append(name, String(value.value));
107
+ } else {
108
+ hasOmittedData = true;
109
+ }
110
+ } else {
111
+ hasOmittedData = true;
112
+ }
113
+ }
114
+ } catch (error) {
115
+ console.warn("RezoFormData.toUrlQueryString(): Error reading form data entries:", error);
116
+ }
117
+ if (hasOmittedData && !convertBinaryToBase64) {
118
+ console.warn("RezoFormData.toUrlQueryString(): Binary data, files, and blobs have been omitted. Use convertBinaryToBase64=true to include binary data as base64 strings.");
119
+ }
120
+ return params.toString();
121
+ }
122
+ async toURLSearchParams(convertBinaryToBase64 = false) {
123
+ const params = new URLSearchParams;
124
+ let hasOmittedData = false;
125
+ try {
126
+ const entries = await this.getFieldEntries();
127
+ for (const [name, value] of entries) {
128
+ if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
129
+ params.append(name, String(value));
130
+ } else if (value instanceof Buffer) {
131
+ if (convertBinaryToBase64) {
132
+ params.append(name, value.toString("base64"));
133
+ } else {
134
+ hasOmittedData = true;
135
+ }
136
+ } else if (value instanceof Readable || typeof File !== "undefined" && value instanceof File || typeof Blob !== "undefined" && value instanceof Blob) {
137
+ if (convertBinaryToBase64 && value instanceof File) {
138
+ hasOmittedData = true;
139
+ } else {
140
+ hasOmittedData = true;
141
+ }
142
+ } else if (typeof value === "object" && value && "value" in value) {
143
+ if (typeof value.value === "string" || typeof value.value === "number" || typeof value.value === "boolean") {
144
+ params.append(name, String(value.value));
145
+ } else {
146
+ hasOmittedData = true;
147
+ }
148
+ } else {
149
+ hasOmittedData = true;
150
+ }
151
+ }
152
+ } catch (error) {
153
+ console.warn("RezoFormData.toURLSearchParams(): Error reading form data entries:", error);
154
+ }
155
+ if (hasOmittedData && !convertBinaryToBase64) {
156
+ console.warn("RezoFormData.toURLSearchParams(): Binary data, files, and blobs have been omitted. Use convertBinaryToBase64=true to include binary data as base64 strings.");
157
+ }
158
+ return params;
159
+ }
160
+ }
161
+ export default RezoFormData;
@@ -0,0 +1,162 @@
1
+ const util = require("node:util");
2
+
3
+ class RezoHeaders extends Headers {
4
+ constructor(init) {
5
+ if (init instanceof RezoHeaders) {
6
+ super(init.toNative());
7
+ } else if (init instanceof Headers || Array.isArray(init)) {
8
+ super(init);
9
+ } else if (typeof init === "object") {
10
+ const isValueArray = Object.values(init).some((value) => Array.isArray(value));
11
+ if (isValueArray) {
12
+ const headers = new Headers;
13
+ for (const [key, value] of Object.entries(init)) {
14
+ if (Array.isArray(value)) {
15
+ value.forEach((v) => headers.append(key, v));
16
+ } else {
17
+ headers.append(key, value);
18
+ }
19
+ }
20
+ super(headers);
21
+ } else {
22
+ super(init);
23
+ }
24
+ } else {
25
+ super(init);
26
+ }
27
+ }
28
+ getAll(name) {
29
+ if (typeof super.getAll === "function" || super.getAll !== undefined) {
30
+ return super.getAll(name);
31
+ }
32
+ if (super.has(name)) {
33
+ return super.get(name).split(",");
34
+ }
35
+ return [];
36
+ }
37
+ getSetCookie() {
38
+ if (typeof super.getSetCookie === "function" || super.getSetCookie !== undefined) {
39
+ return super.getSetCookie();
40
+ }
41
+ return this.getAll("set-cookie");
42
+ }
43
+ get size() {
44
+ let size = 0;
45
+ super.forEach(() => size++);
46
+ return size;
47
+ }
48
+ setContentType(value) {
49
+ this.set("content-type", value);
50
+ return this;
51
+ }
52
+ getContentType() {
53
+ return this.get("content-type") || undefined;
54
+ }
55
+ setAuthorization(value) {
56
+ this.set("authorization", value);
57
+ return this;
58
+ }
59
+ setUserAgent(value) {
60
+ this.set("user-agent", value);
61
+ return this;
62
+ }
63
+ getUserAgent() {
64
+ return this.get("user-agent") || undefined;
65
+ }
66
+ getKeys() {
67
+ const keys = [];
68
+ super.forEach((_, key) => {
69
+ keys.push(key);
70
+ });
71
+ return keys;
72
+ }
73
+ getValues() {
74
+ const values = [];
75
+ super.forEach((value) => {
76
+ values.push(value);
77
+ });
78
+ return values;
79
+ }
80
+ toEntries() {
81
+ return Object.entries(Object.fromEntries(super.entries()));
82
+ }
83
+ toNative() {
84
+ const headers = new Headers;
85
+ super.forEach((value, key) => {
86
+ headers.append(key, value);
87
+ });
88
+ return headers;
89
+ }
90
+ toRaw() {
91
+ const headers = [];
92
+ for (const header of this.toArray()) {
93
+ headers.push([header.key, header.value]);
94
+ }
95
+ return headers;
96
+ }
97
+ toArray() {
98
+ const headers = [];
99
+ for (const [key, value] of this) {
100
+ if (Array.isArray(value)) {
101
+ value.forEach((v) => headers.push({ key, value: v }));
102
+ } else {
103
+ headers.push({ key, value });
104
+ }
105
+ }
106
+ return headers;
107
+ }
108
+ toObject(omit) {
109
+ const headers = {};
110
+ omit = (omit ? typeof omit === "string" ? [omit] : omit : []).map((key) => key.toLowerCase());
111
+ for (const [key, value] of super.entries()) {
112
+ if (omit.length > 0) {
113
+ if (omit.includes(key.toLowerCase())) {
114
+ continue;
115
+ }
116
+ }
117
+ if (key.toLowerCase() === "set-cookie") {
118
+ if (!headers[key]) {
119
+ const cookies = this.getSetCookie();
120
+ if (cookies.length > 0) {
121
+ headers[key] = cookies;
122
+ } else {
123
+ headers[key] = cookies[0];
124
+ }
125
+ }
126
+ continue;
127
+ } else {
128
+ headers[key] = value;
129
+ }
130
+ }
131
+ return headers;
132
+ }
133
+ toString() {
134
+ return this.toArray().map(({ key, value }) => key + ": " + value).join(`
135
+ `);
136
+ }
137
+ set(name, value) {
138
+ super.set(name, value);
139
+ }
140
+ append(name, value) {
141
+ super.append(name, value);
142
+ }
143
+ get(name) {
144
+ return super.get(name);
145
+ }
146
+ has(name) {
147
+ return super.has(name);
148
+ }
149
+ [Symbol.iterator]() {
150
+ return Object.entries(this.toObject())[Symbol.iterator]();
151
+ }
152
+ [util.inspect.custom](_depth, options) {
153
+ return `${this[Symbol.toStringTag]} ${util.inspect(this.toObject(), options)}`;
154
+ }
155
+ get [Symbol.toStringTag]() {
156
+ return "RezoHeaders";
157
+ }
158
+ }
159
+
160
+ exports.RezoHeaders = RezoHeaders;
161
+ exports.default = RezoHeaders;
162
+ module.exports = Object.assign(RezoHeaders, exports);
@@ -0,0 +1,161 @@
1
+ import util from "node:util";
2
+
3
+ class RezoHeaders extends Headers {
4
+ constructor(init) {
5
+ if (init instanceof RezoHeaders) {
6
+ super(init.toNative());
7
+ } else if (init instanceof Headers || Array.isArray(init)) {
8
+ super(init);
9
+ } else if (typeof init === "object") {
10
+ const isValueArray = Object.values(init).some((value) => Array.isArray(value));
11
+ if (isValueArray) {
12
+ const headers = new Headers;
13
+ for (const [key, value] of Object.entries(init)) {
14
+ if (Array.isArray(value)) {
15
+ value.forEach((v) => headers.append(key, v));
16
+ } else {
17
+ headers.append(key, value);
18
+ }
19
+ }
20
+ super(headers);
21
+ } else {
22
+ super(init);
23
+ }
24
+ } else {
25
+ super(init);
26
+ }
27
+ }
28
+ getAll(name) {
29
+ if (typeof super.getAll === "function" || super.getAll !== undefined) {
30
+ return super.getAll(name);
31
+ }
32
+ if (super.has(name)) {
33
+ return super.get(name).split(",");
34
+ }
35
+ return [];
36
+ }
37
+ getSetCookie() {
38
+ if (typeof super.getSetCookie === "function" || super.getSetCookie !== undefined) {
39
+ return super.getSetCookie();
40
+ }
41
+ return this.getAll("set-cookie");
42
+ }
43
+ get size() {
44
+ let size = 0;
45
+ super.forEach(() => size++);
46
+ return size;
47
+ }
48
+ setContentType(value) {
49
+ this.set("content-type", value);
50
+ return this;
51
+ }
52
+ getContentType() {
53
+ return this.get("content-type") || undefined;
54
+ }
55
+ setAuthorization(value) {
56
+ this.set("authorization", value);
57
+ return this;
58
+ }
59
+ setUserAgent(value) {
60
+ this.set("user-agent", value);
61
+ return this;
62
+ }
63
+ getUserAgent() {
64
+ return this.get("user-agent") || undefined;
65
+ }
66
+ getKeys() {
67
+ const keys = [];
68
+ super.forEach((_, key) => {
69
+ keys.push(key);
70
+ });
71
+ return keys;
72
+ }
73
+ getValues() {
74
+ const values = [];
75
+ super.forEach((value) => {
76
+ values.push(value);
77
+ });
78
+ return values;
79
+ }
80
+ toEntries() {
81
+ return Object.entries(Object.fromEntries(super.entries()));
82
+ }
83
+ toNative() {
84
+ const headers = new Headers;
85
+ super.forEach((value, key) => {
86
+ headers.append(key, value);
87
+ });
88
+ return headers;
89
+ }
90
+ toRaw() {
91
+ const headers = [];
92
+ for (const header of this.toArray()) {
93
+ headers.push([header.key, header.value]);
94
+ }
95
+ return headers;
96
+ }
97
+ toArray() {
98
+ const headers = [];
99
+ for (const [key, value] of this) {
100
+ if (Array.isArray(value)) {
101
+ value.forEach((v) => headers.push({ key, value: v }));
102
+ } else {
103
+ headers.push({ key, value });
104
+ }
105
+ }
106
+ return headers;
107
+ }
108
+ toObject(omit) {
109
+ const headers = {};
110
+ omit = (omit ? typeof omit === "string" ? [omit] : omit : []).map((key) => key.toLowerCase());
111
+ for (const [key, value] of super.entries()) {
112
+ if (omit.length > 0) {
113
+ if (omit.includes(key.toLowerCase())) {
114
+ continue;
115
+ }
116
+ }
117
+ if (key.toLowerCase() === "set-cookie") {
118
+ if (!headers[key]) {
119
+ const cookies = this.getSetCookie();
120
+ if (cookies.length > 0) {
121
+ headers[key] = cookies;
122
+ } else {
123
+ headers[key] = cookies[0];
124
+ }
125
+ }
126
+ continue;
127
+ } else {
128
+ headers[key] = value;
129
+ }
130
+ }
131
+ return headers;
132
+ }
133
+ toString() {
134
+ return this.toArray().map(({ key, value }) => key + ": " + value).join(`
135
+ `);
136
+ }
137
+ set(name, value) {
138
+ super.set(name, value);
139
+ }
140
+ append(name, value) {
141
+ super.append(name, value);
142
+ }
143
+ get(name) {
144
+ return super.get(name);
145
+ }
146
+ has(name) {
147
+ return super.has(name);
148
+ }
149
+ [Symbol.iterator]() {
150
+ return Object.entries(this.toObject())[Symbol.iterator]();
151
+ }
152
+ [util.inspect.custom](_depth, options) {
153
+ return `${this[Symbol.toStringTag]} ${util.inspect(this.toObject(), options)}`;
154
+ }
155
+ get [Symbol.toStringTag]() {
156
+ return "RezoHeaders";
157
+ }
158
+ }
159
+
160
+ export { RezoHeaders };
161
+ export default RezoHeaders;