@ricsam/quickjs-fetch 0.2.0 → 0.2.1
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.
- package/dist/cjs/abort-controller.cjs +212 -0
- package/dist/cjs/abort-controller.cjs.map +10 -0
- package/dist/cjs/fetch.cjs +199 -0
- package/dist/cjs/fetch.cjs.map +10 -0
- package/dist/cjs/form-data.cjs +289 -0
- package/dist/cjs/form-data.cjs.map +10 -0
- package/dist/cjs/handle.cjs +248 -0
- package/dist/cjs/handle.cjs.map +10 -0
- package/dist/cjs/headers.cjs +196 -0
- package/dist/cjs/headers.cjs.map +10 -0
- package/dist/cjs/package.json +1 -1
- package/dist/cjs/request.cjs +315 -0
- package/dist/cjs/request.cjs.map +10 -0
- package/dist/cjs/response.cjs +315 -0
- package/dist/cjs/response.cjs.map +10 -0
- package/dist/cjs/serve.cjs +182 -0
- package/dist/cjs/serve.cjs.map +10 -0
- package/dist/cjs/setup.cjs +119 -0
- package/dist/cjs/setup.cjs.map +10 -0
- package/dist/cjs/types.cjs +26 -0
- package/dist/cjs/types.cjs.map +9 -0
- package/dist/mjs/abort-controller.mjs +181 -0
- package/dist/mjs/abort-controller.mjs.map +10 -0
- package/dist/mjs/fetch.mjs +168 -0
- package/dist/mjs/fetch.mjs.map +10 -0
- package/dist/mjs/form-data.mjs +258 -0
- package/dist/mjs/form-data.mjs.map +10 -0
- package/dist/mjs/handle.mjs +217 -0
- package/dist/mjs/handle.mjs.map +10 -0
- package/dist/mjs/headers.mjs +165 -0
- package/dist/mjs/headers.mjs.map +10 -0
- package/dist/mjs/package.json +1 -1
- package/dist/mjs/request.mjs +284 -0
- package/dist/mjs/request.mjs.map +10 -0
- package/dist/mjs/response.mjs +284 -0
- package/dist/mjs/response.mjs.map +10 -0
- package/dist/mjs/serve.mjs +151 -0
- package/dist/mjs/serve.mjs.map +10 -0
- package/dist/mjs/setup.mjs +92 -0
- package/dist/mjs/setup.mjs.map +10 -0
- package/dist/mjs/types.mjs +3 -0
- package/dist/mjs/types.mjs.map +9 -0
- package/package.json +2 -2
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// packages/fetch/src/globals/headers.ts
|
|
3
|
+
import { defineClass } from "@ricsam/quickjs-core";
|
|
4
|
+
function createHeadersClass(context, stateMap) {
|
|
5
|
+
return defineClass(context, stateMap, {
|
|
6
|
+
name: "Headers",
|
|
7
|
+
construct: (args) => {
|
|
8
|
+
const init = args[0];
|
|
9
|
+
const headers = new Map;
|
|
10
|
+
if (init) {
|
|
11
|
+
if (Array.isArray(init)) {
|
|
12
|
+
for (const pair of init) {
|
|
13
|
+
if (Array.isArray(pair) && pair.length >= 2) {
|
|
14
|
+
const key = String(pair[0]).toLowerCase();
|
|
15
|
+
const value = String(pair[1]);
|
|
16
|
+
const existing = headers.get(key) || [];
|
|
17
|
+
existing.push(value);
|
|
18
|
+
headers.set(key, existing);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
} else if (typeof init === "object" && init !== null) {
|
|
22
|
+
if ("headers" in init && init.headers instanceof Map) {
|
|
23
|
+
for (const [key, values] of init.headers) {
|
|
24
|
+
headers.set(key, [...values]);
|
|
25
|
+
}
|
|
26
|
+
} else {
|
|
27
|
+
for (const [key, value] of Object.entries(init)) {
|
|
28
|
+
const normalizedKey = key.toLowerCase();
|
|
29
|
+
if (Array.isArray(value)) {
|
|
30
|
+
headers.set(normalizedKey, value.map(String));
|
|
31
|
+
} else {
|
|
32
|
+
headers.set(normalizedKey, [String(value)]);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return { headers };
|
|
39
|
+
},
|
|
40
|
+
methods: {
|
|
41
|
+
append(name, value) {
|
|
42
|
+
const key = String(name).toLowerCase();
|
|
43
|
+
const existing = this.headers.get(key) || [];
|
|
44
|
+
existing.push(String(value));
|
|
45
|
+
this.headers.set(key, existing);
|
|
46
|
+
},
|
|
47
|
+
delete(name) {
|
|
48
|
+
this.headers.delete(String(name).toLowerCase());
|
|
49
|
+
},
|
|
50
|
+
get(name) {
|
|
51
|
+
const values = this.headers.get(String(name).toLowerCase());
|
|
52
|
+
return values ? values.join(", ") : null;
|
|
53
|
+
},
|
|
54
|
+
has(name) {
|
|
55
|
+
return this.headers.has(String(name).toLowerCase());
|
|
56
|
+
},
|
|
57
|
+
set(name, value) {
|
|
58
|
+
this.headers.set(String(name).toLowerCase(), [String(value)]);
|
|
59
|
+
},
|
|
60
|
+
entries() {
|
|
61
|
+
const result = [];
|
|
62
|
+
for (const [key, values] of this.headers) {
|
|
63
|
+
result.push([key, values.join(", ")]);
|
|
64
|
+
}
|
|
65
|
+
return result;
|
|
66
|
+
},
|
|
67
|
+
keys() {
|
|
68
|
+
return Array.from(this.headers.keys());
|
|
69
|
+
},
|
|
70
|
+
values() {
|
|
71
|
+
const result = [];
|
|
72
|
+
for (const values of this.headers.values()) {
|
|
73
|
+
result.push(values.join(", "));
|
|
74
|
+
}
|
|
75
|
+
return result;
|
|
76
|
+
},
|
|
77
|
+
forEach(callback) {
|
|
78
|
+
if (typeof callback !== "function") {
|
|
79
|
+
throw new TypeError("callback must be a function");
|
|
80
|
+
}
|
|
81
|
+
for (const [key, values] of this.headers) {
|
|
82
|
+
callback(values.join(", "), key, this);
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
getSetCookie() {
|
|
86
|
+
return this.headers.get("set-cookie") || [];
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
function createHeadersStateFromNative(headers) {
|
|
92
|
+
const map = new Map;
|
|
93
|
+
headers.forEach((value, key) => {
|
|
94
|
+
const existing = map.get(key.toLowerCase()) || [];
|
|
95
|
+
existing.push(value);
|
|
96
|
+
map.set(key.toLowerCase(), existing);
|
|
97
|
+
});
|
|
98
|
+
return { headers: map };
|
|
99
|
+
}
|
|
100
|
+
function headersStateToNative(state) {
|
|
101
|
+
const headers = new Headers;
|
|
102
|
+
for (const [key, values] of state.headers) {
|
|
103
|
+
for (const value of values) {
|
|
104
|
+
headers.append(key, value);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return headers;
|
|
108
|
+
}
|
|
109
|
+
function createHeadersLike(state) {
|
|
110
|
+
return {
|
|
111
|
+
headers: state.headers,
|
|
112
|
+
append(name, value) {
|
|
113
|
+
const key = name.toLowerCase();
|
|
114
|
+
const existing = state.headers.get(key) || [];
|
|
115
|
+
existing.push(value);
|
|
116
|
+
state.headers.set(key, existing);
|
|
117
|
+
},
|
|
118
|
+
delete(name) {
|
|
119
|
+
state.headers.delete(name.toLowerCase());
|
|
120
|
+
},
|
|
121
|
+
get(name) {
|
|
122
|
+
const values = state.headers.get(name.toLowerCase());
|
|
123
|
+
return values ? values.join(", ") : null;
|
|
124
|
+
},
|
|
125
|
+
has(name) {
|
|
126
|
+
return state.headers.has(name.toLowerCase());
|
|
127
|
+
},
|
|
128
|
+
set(name, value) {
|
|
129
|
+
state.headers.set(name.toLowerCase(), [value]);
|
|
130
|
+
},
|
|
131
|
+
entries() {
|
|
132
|
+
const result = [];
|
|
133
|
+
for (const [key, values] of state.headers) {
|
|
134
|
+
result.push([key, values.join(", ")]);
|
|
135
|
+
}
|
|
136
|
+
return result;
|
|
137
|
+
},
|
|
138
|
+
keys() {
|
|
139
|
+
return Array.from(state.headers.keys());
|
|
140
|
+
},
|
|
141
|
+
values() {
|
|
142
|
+
const result = [];
|
|
143
|
+
for (const values of state.headers.values()) {
|
|
144
|
+
result.push(values.join(", "));
|
|
145
|
+
}
|
|
146
|
+
return result;
|
|
147
|
+
},
|
|
148
|
+
forEach(callback) {
|
|
149
|
+
for (const [key, values] of state.headers) {
|
|
150
|
+
callback(values.join(", "), key);
|
|
151
|
+
}
|
|
152
|
+
},
|
|
153
|
+
getSetCookie() {
|
|
154
|
+
return state.headers.get("set-cookie") || [];
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
export {
|
|
159
|
+
headersStateToNative,
|
|
160
|
+
createHeadersStateFromNative,
|
|
161
|
+
createHeadersLike,
|
|
162
|
+
createHeadersClass
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
//# debugId=55519B963E4BBD8E64756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/globals/headers.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { StateMap } from \"@ricsam/quickjs-core\";\nimport { defineClass } from \"@ricsam/quickjs-core\";\nimport type { HeadersState } from \"../types.ts\";\n\n/**\n * Create the Headers class for QuickJS\n */\nexport function createHeadersClass(\n context: QuickJSContext,\n stateMap: StateMap\n): QuickJSHandle {\n return defineClass<HeadersState>(context, stateMap, {\n name: \"Headers\",\n construct: (args) => {\n const init = args[0];\n const headers = new Map<string, string[]>();\n\n if (init) {\n if (Array.isArray(init)) {\n // Array of [key, value] pairs\n for (const pair of init) {\n if (Array.isArray(pair) && pair.length >= 2) {\n const key = String(pair[0]).toLowerCase();\n const value = String(pair[1]);\n const existing = headers.get(key) || [];\n existing.push(value);\n headers.set(key, existing);\n }\n }\n } else if (typeof init === \"object\" && init !== null) {\n // Check if it's another Headers-like object with entries method\n if (\"headers\" in init && init.headers instanceof Map) {\n // HeadersState\n for (const [key, values] of (init as HeadersState).headers) {\n headers.set(key, [...values]);\n }\n } else {\n // Plain object\n for (const [key, value] of Object.entries(init)) {\n const normalizedKey = key.toLowerCase();\n if (Array.isArray(value)) {\n headers.set(normalizedKey, value.map(String));\n } else {\n headers.set(normalizedKey, [String(value)]);\n }\n }\n }\n }\n }\n\n return { headers };\n },\n methods: {\n append(this: HeadersState, name: unknown, value: unknown) {\n const key = String(name).toLowerCase();\n const existing = this.headers.get(key) || [];\n existing.push(String(value));\n this.headers.set(key, existing);\n },\n delete(this: HeadersState, name: unknown) {\n this.headers.delete(String(name).toLowerCase());\n },\n get(this: HeadersState, name: unknown): string | null {\n const values = this.headers.get(String(name).toLowerCase());\n return values ? values.join(\", \") : null;\n },\n has(this: HeadersState, name: unknown): boolean {\n return this.headers.has(String(name).toLowerCase());\n },\n set(this: HeadersState, name: unknown, value: unknown) {\n this.headers.set(String(name).toLowerCase(), [String(value)]);\n },\n entries(this: HeadersState): Array<[string, string]> {\n const result: Array<[string, string]> = [];\n for (const [key, values] of this.headers) {\n result.push([key, values.join(\", \")]);\n }\n return result;\n },\n keys(this: HeadersState): string[] {\n return Array.from(this.headers.keys());\n },\n values(this: HeadersState): string[] {\n const result: string[] = [];\n for (const values of this.headers.values()) {\n result.push(values.join(\", \"));\n }\n return result;\n },\n forEach(this: HeadersState, callback: unknown) {\n if (typeof callback !== \"function\") {\n throw new TypeError(\"callback must be a function\");\n }\n for (const [key, values] of this.headers) {\n (callback as (value: string, key: string, parent: HeadersState) => void)(\n values.join(\", \"),\n key,\n this\n );\n }\n },\n getSetCookie(this: HeadersState): string[] {\n return this.headers.get(\"set-cookie\") || [];\n },\n },\n });\n}\n\n/**\n * Create a HeadersState from a native Headers object\n */\nexport function createHeadersStateFromNative(headers: Headers): HeadersState {\n const map = new Map<string, string[]>();\n headers.forEach((value, key) => {\n const existing = map.get(key.toLowerCase()) || [];\n existing.push(value);\n map.set(key.toLowerCase(), existing);\n });\n return { headers: map };\n}\n\n/**\n * Convert HeadersState to native Headers\n */\nexport function headersStateToNative(state: HeadersState): Headers {\n const headers = new Headers();\n for (const [key, values] of state.headers) {\n for (const value of values) {\n headers.append(key, value);\n }\n }\n return headers;\n}\n\n/**\n * Interface for a Headers-like object that can be returned from getters\n */\nexport interface HeadersLike {\n headers: Map<string, string[]>;\n append(name: string, value: string): void;\n delete(name: string): void;\n get(name: string): string | null;\n has(name: string): boolean;\n set(name: string, value: string): void;\n entries(): Array<[string, string]>;\n keys(): string[];\n values(): string[];\n forEach(callback: (value: string, key: string) => void): void;\n getSetCookie(): string[];\n}\n\n/**\n * Create a Headers-like object from HeadersState that has all the Headers methods\n * This is used for getters that need to return an object with Headers API\n */\nexport function createHeadersLike(state: HeadersState): HeadersLike {\n return {\n headers: state.headers,\n append(name: string, value: string) {\n const key = name.toLowerCase();\n const existing = state.headers.get(key) || [];\n existing.push(value);\n state.headers.set(key, existing);\n },\n delete(name: string) {\n state.headers.delete(name.toLowerCase());\n },\n get(name: string): string | null {\n const values = state.headers.get(name.toLowerCase());\n return values ? values.join(\", \") : null;\n },\n has(name: string): boolean {\n return state.headers.has(name.toLowerCase());\n },\n set(name: string, value: string) {\n state.headers.set(name.toLowerCase(), [value]);\n },\n entries(): Array<[string, string]> {\n const result: Array<[string, string]> = [];\n for (const [key, values] of state.headers) {\n result.push([key, values.join(\", \")]);\n }\n return result;\n },\n keys(): string[] {\n return Array.from(state.headers.keys());\n },\n values(): string[] {\n const result: string[] = [];\n for (const values of state.headers.values()) {\n result.push(values.join(\", \"));\n }\n return result;\n },\n forEach(callback: (value: string, key: string) => void) {\n for (const [key, values] of state.headers) {\n callback(values.join(\", \"), key);\n }\n },\n getSetCookie(): string[] {\n return state.headers.get(\"set-cookie\") || [];\n },\n };\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "55519B963E4BBD8E64756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
package/dist/mjs/package.json
CHANGED
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// packages/fetch/src/globals/request.ts
|
|
3
|
+
import { defineClass } from "@ricsam/quickjs-core";
|
|
4
|
+
import { createHeadersStateFromNative, createHeadersLike } from "./headers.ts";
|
|
5
|
+
import { parseMultipartFormData, parseUrlEncodedFormData } from "./form-data.ts";
|
|
6
|
+
function createRequestClass(context, stateMap, createStream) {
|
|
7
|
+
return defineClass(context, stateMap, {
|
|
8
|
+
name: "Request",
|
|
9
|
+
construct: (args) => {
|
|
10
|
+
const input = args[0];
|
|
11
|
+
const init = args[1];
|
|
12
|
+
let url = "";
|
|
13
|
+
let method = "GET";
|
|
14
|
+
let headersState = { headers: new Map };
|
|
15
|
+
let body = null;
|
|
16
|
+
let signal = null;
|
|
17
|
+
if (typeof input === "string") {
|
|
18
|
+
url = input;
|
|
19
|
+
} else if (input && typeof input === "object") {
|
|
20
|
+
if ("url" in input) {
|
|
21
|
+
url = String(input.url);
|
|
22
|
+
}
|
|
23
|
+
if ("method" in input) {
|
|
24
|
+
method = String(input.method);
|
|
25
|
+
}
|
|
26
|
+
if ("headersState" in input) {
|
|
27
|
+
const inputHeaders = input.headersState;
|
|
28
|
+
headersState = {
|
|
29
|
+
headers: new Map(inputHeaders.headers)
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
if ("body" in input && input.body) {
|
|
33
|
+
body = input.body;
|
|
34
|
+
}
|
|
35
|
+
if ("signal" in input) {
|
|
36
|
+
signal = input.signal;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (init) {
|
|
40
|
+
if (init.method) {
|
|
41
|
+
method = init.method.toUpperCase();
|
|
42
|
+
}
|
|
43
|
+
if (init.headers) {
|
|
44
|
+
if (init.headers && typeof init.headers === "object") {
|
|
45
|
+
if ("headers" in init.headers && init.headers.headers instanceof Map) {
|
|
46
|
+
headersState = {
|
|
47
|
+
headers: new Map(init.headers.headers)
|
|
48
|
+
};
|
|
49
|
+
} else {
|
|
50
|
+
headersState = { headers: new Map };
|
|
51
|
+
for (const [key, value] of Object.entries(init.headers)) {
|
|
52
|
+
headersState.headers.set(key.toLowerCase(), [String(value)]);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (init.body !== undefined && init.body !== null) {
|
|
58
|
+
if (typeof init.body === "string") {
|
|
59
|
+
body = new TextEncoder().encode(init.body);
|
|
60
|
+
} else if (init.body instanceof ArrayBuffer) {
|
|
61
|
+
body = new Uint8Array(init.body);
|
|
62
|
+
} else if (init.body instanceof Uint8Array) {
|
|
63
|
+
body = init.body;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (init.signal) {
|
|
67
|
+
signal = init.signal;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
method,
|
|
72
|
+
url,
|
|
73
|
+
headersState,
|
|
74
|
+
body,
|
|
75
|
+
bodyUsed: false,
|
|
76
|
+
cache: init?.cache || "default",
|
|
77
|
+
credentials: init?.credentials || "same-origin",
|
|
78
|
+
destination: "",
|
|
79
|
+
integrity: init?.integrity || "",
|
|
80
|
+
keepalive: init?.keepalive || false,
|
|
81
|
+
mode: init?.mode || "cors",
|
|
82
|
+
redirect: init?.redirect || "follow",
|
|
83
|
+
referrer: init?.referrer || "about:client",
|
|
84
|
+
referrerPolicy: init?.referrerPolicy || "",
|
|
85
|
+
signal
|
|
86
|
+
};
|
|
87
|
+
},
|
|
88
|
+
properties: {
|
|
89
|
+
method: {
|
|
90
|
+
get() {
|
|
91
|
+
return this.method;
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
url: {
|
|
95
|
+
get() {
|
|
96
|
+
return this.url;
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
headers: {
|
|
100
|
+
get() {
|
|
101
|
+
return createHeadersLike(this.headersState);
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
body: {
|
|
105
|
+
get() {
|
|
106
|
+
if (!this.body)
|
|
107
|
+
return null;
|
|
108
|
+
if (!createStream) {
|
|
109
|
+
return this.body;
|
|
110
|
+
}
|
|
111
|
+
const bodyData = this.body;
|
|
112
|
+
let offset = 0;
|
|
113
|
+
const chunkSize = 65536;
|
|
114
|
+
return createStream({
|
|
115
|
+
pull(controller) {
|
|
116
|
+
if (offset >= bodyData.length) {
|
|
117
|
+
controller.close();
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
const chunk = bodyData.slice(offset, Math.min(offset + chunkSize, bodyData.length));
|
|
121
|
+
offset += chunk.length;
|
|
122
|
+
controller.enqueue(chunk);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
bodyUsed: {
|
|
128
|
+
get() {
|
|
129
|
+
return this.bodyUsed;
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
cache: {
|
|
133
|
+
get() {
|
|
134
|
+
return this.cache;
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
credentials: {
|
|
138
|
+
get() {
|
|
139
|
+
return this.credentials;
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
destination: {
|
|
143
|
+
get() {
|
|
144
|
+
return this.destination;
|
|
145
|
+
}
|
|
146
|
+
},
|
|
147
|
+
integrity: {
|
|
148
|
+
get() {
|
|
149
|
+
return this.integrity;
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
keepalive: {
|
|
153
|
+
get() {
|
|
154
|
+
return this.keepalive;
|
|
155
|
+
}
|
|
156
|
+
},
|
|
157
|
+
mode: {
|
|
158
|
+
get() {
|
|
159
|
+
return this.mode;
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
redirect: {
|
|
163
|
+
get() {
|
|
164
|
+
return this.redirect;
|
|
165
|
+
}
|
|
166
|
+
},
|
|
167
|
+
referrer: {
|
|
168
|
+
get() {
|
|
169
|
+
return this.referrer;
|
|
170
|
+
}
|
|
171
|
+
},
|
|
172
|
+
referrerPolicy: {
|
|
173
|
+
get() {
|
|
174
|
+
return this.referrerPolicy;
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
signal: {
|
|
178
|
+
get() {
|
|
179
|
+
return this.signal;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
},
|
|
183
|
+
methods: {
|
|
184
|
+
async arrayBuffer() {
|
|
185
|
+
if (this.bodyUsed) {
|
|
186
|
+
throw new TypeError("Body has already been consumed");
|
|
187
|
+
}
|
|
188
|
+
this.bodyUsed = true;
|
|
189
|
+
if (!this.body) {
|
|
190
|
+
return new ArrayBuffer(0);
|
|
191
|
+
}
|
|
192
|
+
return this.body.buffer.slice(this.body.byteOffset, this.body.byteOffset + this.body.byteLength);
|
|
193
|
+
},
|
|
194
|
+
async blob() {
|
|
195
|
+
if (this.bodyUsed) {
|
|
196
|
+
throw new TypeError("Body has already been consumed");
|
|
197
|
+
}
|
|
198
|
+
this.bodyUsed = true;
|
|
199
|
+
const contentType = this.headersState.headers.get("content-type")?.[0] || "";
|
|
200
|
+
return {
|
|
201
|
+
parts: this.body ? [this.body] : [],
|
|
202
|
+
type: contentType,
|
|
203
|
+
size: this.body?.length || 0
|
|
204
|
+
};
|
|
205
|
+
},
|
|
206
|
+
clone() {
|
|
207
|
+
if (this.bodyUsed) {
|
|
208
|
+
throw new TypeError("Body has already been consumed");
|
|
209
|
+
}
|
|
210
|
+
return {
|
|
211
|
+
...this,
|
|
212
|
+
headersState: {
|
|
213
|
+
headers: new Map(this.headersState.headers)
|
|
214
|
+
},
|
|
215
|
+
body: this.body ? new Uint8Array(this.body) : null,
|
|
216
|
+
bodyUsed: false
|
|
217
|
+
};
|
|
218
|
+
},
|
|
219
|
+
async json() {
|
|
220
|
+
if (this.bodyUsed) {
|
|
221
|
+
throw new TypeError("Body has already been consumed");
|
|
222
|
+
}
|
|
223
|
+
this.bodyUsed = true;
|
|
224
|
+
if (!this.body) {
|
|
225
|
+
return JSON.parse("");
|
|
226
|
+
}
|
|
227
|
+
const text = new TextDecoder().decode(this.body);
|
|
228
|
+
return JSON.parse(text);
|
|
229
|
+
},
|
|
230
|
+
async text() {
|
|
231
|
+
if (this.bodyUsed) {
|
|
232
|
+
throw new TypeError("Body has already been consumed");
|
|
233
|
+
}
|
|
234
|
+
this.bodyUsed = true;
|
|
235
|
+
if (!this.body) {
|
|
236
|
+
return "";
|
|
237
|
+
}
|
|
238
|
+
return new TextDecoder().decode(this.body);
|
|
239
|
+
},
|
|
240
|
+
async formData() {
|
|
241
|
+
if (this.bodyUsed) {
|
|
242
|
+
throw new TypeError("Body has already been consumed");
|
|
243
|
+
}
|
|
244
|
+
this.bodyUsed = true;
|
|
245
|
+
if (!this.body) {
|
|
246
|
+
return { entries: [] };
|
|
247
|
+
}
|
|
248
|
+
const contentType = this.headersState.headers.get("content-type")?.[0] || "";
|
|
249
|
+
if (contentType.includes("multipart/form-data")) {
|
|
250
|
+
return parseMultipartFormData(this.body, contentType);
|
|
251
|
+
} else if (contentType.includes("application/x-www-form-urlencoded")) {
|
|
252
|
+
return parseUrlEncodedFormData(this.body);
|
|
253
|
+
}
|
|
254
|
+
throw new TypeError("Could not parse content as FormData");
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
async function createRequestStateFromNative(request) {
|
|
260
|
+
const body = request.body ? new Uint8Array(await request.arrayBuffer()) : null;
|
|
261
|
+
return {
|
|
262
|
+
method: request.method,
|
|
263
|
+
url: request.url,
|
|
264
|
+
headersState: createHeadersStateFromNative(request.headers),
|
|
265
|
+
body,
|
|
266
|
+
bodyUsed: false,
|
|
267
|
+
cache: request.cache,
|
|
268
|
+
credentials: request.credentials,
|
|
269
|
+
destination: request.destination,
|
|
270
|
+
integrity: request.integrity,
|
|
271
|
+
keepalive: request.keepalive,
|
|
272
|
+
mode: request.mode,
|
|
273
|
+
redirect: request.redirect,
|
|
274
|
+
referrer: request.referrer,
|
|
275
|
+
referrerPolicy: request.referrerPolicy,
|
|
276
|
+
signal: null
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
export {
|
|
280
|
+
createRequestStateFromNative,
|
|
281
|
+
createRequestClass
|
|
282
|
+
};
|
|
283
|
+
|
|
284
|
+
//# debugId=DA1F295D68DF61D764756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/globals/request.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { StateMap } from \"@ricsam/quickjs-core\";\nimport { defineClass } from \"@ricsam/quickjs-core\";\nimport type { RequestState, HeadersState, AbortSignalState, FormDataState } from \"../types.ts\";\nimport { createHeadersStateFromNative, createHeadersLike } from \"./headers.ts\";\nimport { parseMultipartFormData, parseUrlEncodedFormData } from \"./form-data.ts\";\n\n/**\n * Type for the stream factory function\n */\ntype StreamFactory = (source: UnderlyingSource) => QuickJSHandle;\n\n/**\n * Create the Request class for QuickJS\n */\nexport function createRequestClass(\n context: QuickJSContext,\n stateMap: StateMap,\n createStream?: StreamFactory\n): QuickJSHandle {\n return defineClass<RequestState>(context, stateMap, {\n name: \"Request\",\n construct: (args) => {\n const input = args[0];\n const init = args[1] as {\n method?: string;\n headers?: object;\n body?: unknown;\n cache?: string;\n credentials?: string;\n integrity?: string;\n keepalive?: boolean;\n mode?: string;\n redirect?: string;\n referrer?: string;\n referrerPolicy?: string;\n signal?: AbortSignalState;\n } | undefined;\n\n let url = \"\";\n let method = \"GET\";\n let headersState: HeadersState = { headers: new Map() };\n let body: Uint8Array | null = null;\n let signal: AbortSignalState | null = null;\n\n // Handle input\n if (typeof input === \"string\") {\n url = input;\n } else if (input && typeof input === \"object\") {\n // Could be URL or Request-like\n if (\"url\" in input) {\n url = String((input as { url: string }).url);\n }\n if (\"method\" in input) {\n method = String((input as { method: string }).method);\n }\n if (\"headersState\" in input) {\n const inputHeaders = (input as RequestState).headersState;\n headersState = {\n headers: new Map(inputHeaders.headers),\n };\n }\n if (\"body\" in input && (input as RequestState).body) {\n body = (input as RequestState).body;\n }\n if (\"signal\" in input) {\n signal = (input as RequestState).signal;\n }\n }\n\n // Apply init options\n if (init) {\n if (init.method) {\n method = init.method.toUpperCase();\n }\n if (init.headers) {\n if (init.headers && typeof init.headers === \"object\") {\n if (\"headers\" in init.headers && init.headers.headers instanceof Map) {\n headersState = {\n headers: new Map((init.headers as HeadersState).headers),\n };\n } else {\n headersState = { headers: new Map() };\n for (const [key, value] of Object.entries(init.headers)) {\n headersState.headers.set(key.toLowerCase(), [String(value)]);\n }\n }\n }\n }\n if (init.body !== undefined && init.body !== null) {\n if (typeof init.body === \"string\") {\n body = new TextEncoder().encode(init.body);\n } else if (init.body instanceof ArrayBuffer) {\n body = new Uint8Array(init.body);\n } else if (init.body instanceof Uint8Array) {\n body = init.body;\n }\n }\n if (init.signal) {\n signal = init.signal;\n }\n }\n\n return {\n method,\n url,\n headersState,\n body,\n bodyUsed: false,\n cache: init?.cache || \"default\",\n credentials: init?.credentials || \"same-origin\",\n destination: \"\",\n integrity: init?.integrity || \"\",\n keepalive: init?.keepalive || false,\n mode: init?.mode || \"cors\",\n redirect: init?.redirect || \"follow\",\n referrer: init?.referrer || \"about:client\",\n referrerPolicy: init?.referrerPolicy || \"\",\n signal,\n };\n },\n properties: {\n method: {\n get(this: RequestState) {\n return this.method;\n },\n },\n url: {\n get(this: RequestState) {\n return this.url;\n },\n },\n headers: {\n get(this: RequestState) {\n return createHeadersLike(this.headersState);\n },\n },\n body: {\n get(this: RequestState) {\n if (!this.body) return null;\n if (!createStream) {\n // Fallback: return raw body if no stream factory\n return this.body;\n }\n // Create a ReadableStream from the body data\n const bodyData = this.body;\n let offset = 0;\n const chunkSize = 65536; // 64KB chunks\n return createStream({\n pull(controller) {\n if (offset >= bodyData.length) {\n controller.close();\n return;\n }\n const chunk = bodyData.slice(offset, Math.min(offset + chunkSize, bodyData.length));\n offset += chunk.length;\n controller.enqueue(chunk);\n },\n });\n },\n },\n bodyUsed: {\n get(this: RequestState) {\n return this.bodyUsed;\n },\n },\n cache: {\n get(this: RequestState) {\n return this.cache;\n },\n },\n credentials: {\n get(this: RequestState) {\n return this.credentials;\n },\n },\n destination: {\n get(this: RequestState) {\n return this.destination;\n },\n },\n integrity: {\n get(this: RequestState) {\n return this.integrity;\n },\n },\n keepalive: {\n get(this: RequestState) {\n return this.keepalive;\n },\n },\n mode: {\n get(this: RequestState) {\n return this.mode;\n },\n },\n redirect: {\n get(this: RequestState) {\n return this.redirect;\n },\n },\n referrer: {\n get(this: RequestState) {\n return this.referrer;\n },\n },\n referrerPolicy: {\n get(this: RequestState) {\n return this.referrerPolicy;\n },\n },\n signal: {\n get(this: RequestState) {\n return this.signal;\n },\n },\n },\n methods: {\n async arrayBuffer(this: RequestState): Promise<ArrayBuffer> {\n if (this.bodyUsed) {\n throw new TypeError(\"Body has already been consumed\");\n }\n this.bodyUsed = true;\n if (!this.body) {\n return new ArrayBuffer(0);\n }\n return this.body.buffer.slice(\n this.body.byteOffset,\n this.body.byteOffset + this.body.byteLength\n ) as ArrayBuffer;\n },\n async blob(this: RequestState): Promise<object> {\n if (this.bodyUsed) {\n throw new TypeError(\"Body has already been consumed\");\n }\n this.bodyUsed = true;\n const contentType = this.headersState.headers.get(\"content-type\")?.[0] || \"\";\n return {\n parts: this.body ? [this.body] : [],\n type: contentType,\n size: this.body?.length || 0,\n };\n },\n clone(this: RequestState): RequestState {\n if (this.bodyUsed) {\n throw new TypeError(\"Body has already been consumed\");\n }\n return {\n ...this,\n headersState: {\n headers: new Map(this.headersState.headers),\n },\n body: this.body ? new Uint8Array(this.body) : null,\n bodyUsed: false,\n };\n },\n async json(this: RequestState): Promise<unknown> {\n if (this.bodyUsed) {\n throw new TypeError(\"Body has already been consumed\");\n }\n this.bodyUsed = true;\n if (!this.body) {\n return JSON.parse(\"\");\n }\n const text = new TextDecoder().decode(this.body);\n return JSON.parse(text);\n },\n async text(this: RequestState): Promise<string> {\n if (this.bodyUsed) {\n throw new TypeError(\"Body has already been consumed\");\n }\n this.bodyUsed = true;\n if (!this.body) {\n return \"\";\n }\n return new TextDecoder().decode(this.body);\n },\n async formData(this: RequestState): Promise<FormDataState> {\n if (this.bodyUsed) {\n throw new TypeError(\"Body has already been consumed\");\n }\n this.bodyUsed = true;\n if (!this.body) {\n return { entries: [] };\n }\n\n const contentType = this.headersState.headers.get(\"content-type\")?.[0] || \"\";\n\n if (contentType.includes(\"multipart/form-data\")) {\n return parseMultipartFormData(this.body, contentType);\n } else if (contentType.includes(\"application/x-www-form-urlencoded\")) {\n return parseUrlEncodedFormData(this.body);\n }\n\n throw new TypeError(\"Could not parse content as FormData\");\n },\n },\n });\n}\n\n/**\n * Create a RequestState from a native Request object\n */\nexport async function createRequestStateFromNative(\n request: Request\n): Promise<RequestState> {\n const body = request.body\n ? new Uint8Array(await request.arrayBuffer())\n : null;\n\n return {\n method: request.method,\n url: request.url,\n headersState: createHeadersStateFromNative(request.headers),\n body,\n bodyUsed: false,\n cache: request.cache,\n credentials: request.credentials,\n destination: request.destination,\n integrity: request.integrity,\n keepalive: request.keepalive,\n mode: request.mode,\n redirect: request.redirect,\n referrer: request.referrer,\n referrerPolicy: request.referrerPolicy,\n signal: null, // Signal handling is complex, simplified here\n };\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "DA1F295D68DF61D764756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|