-
Notifications
You must be signed in to change notification settings - Fork 419
Expand file tree
/
Copy pathfetchEvent.ts
More file actions
112 lines (104 loc) · 2.84 KB
/
fetchEvent.ts
File metadata and controls
112 lines (104 loc) · 2.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import {
H3Event,
appendResponseHeader,
getRequestIP,
getResponseHeader,
getResponseHeaders,
getResponseStatus,
getResponseStatusText,
getWebRequest,
removeResponseHeader,
setResponseHeader,
setResponseStatus
} from "vinxi/http";
import type { FetchEvent, ResponseStub } from "./types";
const fetchEventContext = "solidFetchEvent";
export function createFetchEvent(event: H3Event): FetchEvent {
return {
request: getWebRequest(event),
response: createResponseStub(event),
clientAddress: getRequestIP(event),
locals: {},
nativeEvent: event
};
}
export function cloneEvent<T extends FetchEvent>(fetchEvent: T): T {
return {
...fetchEvent
};
}
export function getFetchEvent(h3Event: H3Event): FetchEvent {
if (!h3Event.context[fetchEventContext]) {
const fetchEvent = createFetchEvent(h3Event);
h3Event.context[fetchEventContext] = fetchEvent;
}
return h3Event.context[fetchEventContext];
}
export function mergeResponseHeaders(h3Event: H3Event, headers: Headers) {
for (const [key, value] of headers.entries()) {
appendResponseHeader(h3Event, key, value);
}
}
class HeaderProxy {
constructor(private event: H3Event) {}
get(key: string) {
const h = getResponseHeader(this.event, key);
return Array.isArray(h) ? h.join(", ") : (h as string) || null;
}
has(key: string) {
return this.get(key) !== null;
}
set(key: string, value: string) {
return setResponseHeader(this.event, key, value);
}
delete(key: string) {
return removeResponseHeader(this.event, key);
}
append(key: string, value: string) {
appendResponseHeader(this.event, key, value);
}
getSetCookie() {
const cookies = getResponseHeader(this.event, "Set-Cookie");
return Array.isArray(cookies) ? cookies : [cookies as string];
}
forEach(fn: (value: string, key: string, object: Headers) => void) {
return Object.entries(getResponseHeaders(this.event)).forEach(([key, value]) =>
fn(Array.isArray(value) ? value.join(", ") : (value as string), key, this)
);
}
entries() {
return Object.entries(getResponseHeaders(this.event))
.map(
([key, value]) => [key, Array.isArray(value) ? value.join(", ") : value] as [string, string]
)
[Symbol.iterator]();
}
keys() {
return Object.keys(getResponseHeaders(this.event))[Symbol.iterator]();
}
values() {
return Object.values(getResponseHeaders(this.event))
.map(value => (Array.isArray(value) ? value.join(", ") : (value as string)))
[Symbol.iterator]();
}
[Symbol.iterator]() {
return this.entries()[Symbol.iterator]();
}
}
function createResponseStub(event: H3Event): ResponseStub {
return {
get status() {
return getResponseStatus(event);
},
set status(v) {
setResponseStatus(event, v);
},
get statusText() {
return getResponseStatusText(event);
},
set statusText(v) {
setResponseStatus(event, getResponseStatus(event), v);
},
headers: new HeaderProxy(event)
};
}