-
Notifications
You must be signed in to change notification settings - Fork 418
Expand file tree
/
Copy pathfetchEvent.ts
More file actions
89 lines (77 loc) · 2.13 KB
/
fetchEvent.ts
File metadata and controls
89 lines (77 loc) · 2.13 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
import {
H3Event,
appendResponseHeader,
getRequestIP,
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);
}
}
function createHeadersProxy(event: H3Event) {
// @ts-expect-error will be coerced into correct format
const headers = new Headers(getResponseHeaders());
const origSet = headers.set.bind(headers);
headers.set = (name, value) => {
origSet(name, value);
setResponseHeader(event, name, value);
};
const origAppend = headers.append.bind(headers);
headers.append = (name, value) => {
origAppend(name, value);
appendResponseHeader(event, name, value);
};
const origDelete = headers.delete.bind(headers);
headers.delete = name => {
origDelete(name);
removeResponseHeader(event, name);
};
return headers;
}
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: createHeadersProxy(event)
};
}