@fedify/solidstart 2.3.12 → 2.3.13
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/index.cjs +78 -6
- package/dist/index.js +78 -6
- package/package.json +8 -4
package/dist/index.cjs
CHANGED
|
@@ -1,5 +1,66 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
let _solidjs_start_middleware = require("@solidjs/start/middleware");
|
|
3
|
+
//#region src/response.ts
|
|
4
|
+
const NOT_ACCEPTABLE_BODY = "Not Acceptable";
|
|
5
|
+
const representationHeaders = [
|
|
6
|
+
"content-length",
|
|
7
|
+
"content-encoding",
|
|
8
|
+
"content-range",
|
|
9
|
+
"content-digest",
|
|
10
|
+
"digest",
|
|
11
|
+
"etag",
|
|
12
|
+
"last-modified",
|
|
13
|
+
"content-language",
|
|
14
|
+
"content-location"
|
|
15
|
+
];
|
|
16
|
+
function notAcceptableHeaders(original, eventHeaders) {
|
|
17
|
+
const headers = new Headers(original);
|
|
18
|
+
for (const name of representationHeaders) {
|
|
19
|
+
headers.delete(name);
|
|
20
|
+
eventHeaders.delete(name);
|
|
21
|
+
}
|
|
22
|
+
const vary = [headers.get("vary"), eventHeaders.get("vary")].filter((value) => value != null).join(", ");
|
|
23
|
+
headers.set("vary", vary.split(/,\s*/).some((v) => v === "*" || v.toLowerCase() === "accept") ? vary : [vary, "Accept"].filter(Boolean).join(", "));
|
|
24
|
+
headers.set("content-type", "text/plain");
|
|
25
|
+
return headers;
|
|
26
|
+
}
|
|
27
|
+
/** Restore buffered error responses that skip SolidStart's response hook. */
|
|
28
|
+
function interceptNotAcceptable(response, cleanup) {
|
|
29
|
+
if (typeof response?.end !== "function") return;
|
|
30
|
+
const originalEnd = response.end;
|
|
31
|
+
const descriptor = Object.getOwnPropertyDescriptor(response, "end");
|
|
32
|
+
let active = true;
|
|
33
|
+
const restore = () => {
|
|
34
|
+
if (!active) return;
|
|
35
|
+
active = false;
|
|
36
|
+
if (response.end === end) if (descriptor == null) delete response.end;
|
|
37
|
+
else Object.defineProperty(response, "end", descriptor);
|
|
38
|
+
response.removeListener("close", restore);
|
|
39
|
+
cleanup();
|
|
40
|
+
};
|
|
41
|
+
function end(...args) {
|
|
42
|
+
const convert = active && this.statusCode === 404 && !this.headersSent && !this.writableEnded;
|
|
43
|
+
restore();
|
|
44
|
+
if (!convert) return Reflect.apply(originalEnd, this, args);
|
|
45
|
+
this.statusCode = 406;
|
|
46
|
+
this.statusMessage = "Not Acceptable";
|
|
47
|
+
const headers = new Headers();
|
|
48
|
+
const vary = this.getHeader("vary");
|
|
49
|
+
if (vary != null) headers.set("vary", Array.isArray(vary) ? vary.join(", ") : String(vary));
|
|
50
|
+
const negotiated = notAcceptableHeaders(headers, new Headers());
|
|
51
|
+
for (const name of representationHeaders) this.removeHeader(name);
|
|
52
|
+
negotiated.forEach((value, name) => this.setHeader(name, value));
|
|
53
|
+
const callback = args.at(-1);
|
|
54
|
+
return Reflect.apply(originalEnd, this, [
|
|
55
|
+
NOT_ACCEPTABLE_BODY,
|
|
56
|
+
"utf8",
|
|
57
|
+
typeof callback === "function" ? callback : void 0
|
|
58
|
+
]);
|
|
59
|
+
}
|
|
60
|
+
response.end = end;
|
|
61
|
+
response.once("close", restore);
|
|
62
|
+
}
|
|
63
|
+
//#endregion
|
|
3
64
|
//#region src/index.ts
|
|
4
65
|
const notAcceptableResponses = /* @__PURE__ */ new WeakMap();
|
|
5
66
|
/**
|
|
@@ -28,8 +89,9 @@ function fedifyMiddleware(federation, createContextData = () => void 0) {
|
|
|
28
89
|
const response = await federation.fetch(event.request, {
|
|
29
90
|
contextData: await createContextData(event),
|
|
30
91
|
onNotFound: () => new Response("Not Found", { status: 404 }),
|
|
31
|
-
onNotAcceptable: () => new Response(
|
|
92
|
+
onNotAcceptable: () => new Response(NOT_ACCEPTABLE_BODY, {
|
|
32
93
|
status: 406,
|
|
94
|
+
statusText: "Not Acceptable",
|
|
33
95
|
headers: {
|
|
34
96
|
"Content-Type": "text/plain",
|
|
35
97
|
Vary: "Accept"
|
|
@@ -39,16 +101,26 @@ function fedifyMiddleware(federation, createContextData = () => void 0) {
|
|
|
39
101
|
if (response.status === 404) return;
|
|
40
102
|
if (response.status === 406) {
|
|
41
103
|
notAcceptableResponses.set(event.request, response);
|
|
104
|
+
interceptNotAcceptable(event.nativeEvent.node.res, () => {
|
|
105
|
+
notAcceptableResponses.delete(event.request);
|
|
106
|
+
});
|
|
42
107
|
return;
|
|
43
108
|
}
|
|
44
109
|
return response;
|
|
45
110
|
},
|
|
46
|
-
onBeforeResponse: (event) => {
|
|
111
|
+
onBeforeResponse: (event, payload) => {
|
|
47
112
|
const stored = notAcceptableResponses.get(event.request);
|
|
48
|
-
if (stored
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
113
|
+
if (stored == null || event.nativeEvent.handled) return;
|
|
114
|
+
const body = payload.body;
|
|
115
|
+
const error = body instanceof Error ? body : void 0;
|
|
116
|
+
if ((body instanceof Response ? body.status : body === void 0 && (event.response.status ?? 200) === 200 ? 404 : error?.statusCode ?? error?.status ?? event.response.status ?? 200) !== 404) return;
|
|
117
|
+
const headers = notAcceptableHeaders(body instanceof Response ? body.headers : new Headers(), event.response.headers);
|
|
118
|
+
if (body instanceof Response) body.body?.cancel().catch(() => {});
|
|
119
|
+
payload.body = new Response(stored.body, {
|
|
120
|
+
status: 406,
|
|
121
|
+
statusText: "Not Acceptable",
|
|
122
|
+
headers
|
|
123
|
+
});
|
|
52
124
|
}
|
|
53
125
|
});
|
|
54
126
|
}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,65 @@
|
|
|
1
1
|
import { createMiddleware } from "@solidjs/start/middleware";
|
|
2
|
+
//#region src/response.ts
|
|
3
|
+
const NOT_ACCEPTABLE_BODY = "Not Acceptable";
|
|
4
|
+
const representationHeaders = [
|
|
5
|
+
"content-length",
|
|
6
|
+
"content-encoding",
|
|
7
|
+
"content-range",
|
|
8
|
+
"content-digest",
|
|
9
|
+
"digest",
|
|
10
|
+
"etag",
|
|
11
|
+
"last-modified",
|
|
12
|
+
"content-language",
|
|
13
|
+
"content-location"
|
|
14
|
+
];
|
|
15
|
+
function notAcceptableHeaders(original, eventHeaders) {
|
|
16
|
+
const headers = new Headers(original);
|
|
17
|
+
for (const name of representationHeaders) {
|
|
18
|
+
headers.delete(name);
|
|
19
|
+
eventHeaders.delete(name);
|
|
20
|
+
}
|
|
21
|
+
const vary = [headers.get("vary"), eventHeaders.get("vary")].filter((value) => value != null).join(", ");
|
|
22
|
+
headers.set("vary", vary.split(/,\s*/).some((v) => v === "*" || v.toLowerCase() === "accept") ? vary : [vary, "Accept"].filter(Boolean).join(", "));
|
|
23
|
+
headers.set("content-type", "text/plain");
|
|
24
|
+
return headers;
|
|
25
|
+
}
|
|
26
|
+
/** Restore buffered error responses that skip SolidStart's response hook. */
|
|
27
|
+
function interceptNotAcceptable(response, cleanup) {
|
|
28
|
+
if (typeof response?.end !== "function") return;
|
|
29
|
+
const originalEnd = response.end;
|
|
30
|
+
const descriptor = Object.getOwnPropertyDescriptor(response, "end");
|
|
31
|
+
let active = true;
|
|
32
|
+
const restore = () => {
|
|
33
|
+
if (!active) return;
|
|
34
|
+
active = false;
|
|
35
|
+
if (response.end === end) if (descriptor == null) delete response.end;
|
|
36
|
+
else Object.defineProperty(response, "end", descriptor);
|
|
37
|
+
response.removeListener("close", restore);
|
|
38
|
+
cleanup();
|
|
39
|
+
};
|
|
40
|
+
function end(...args) {
|
|
41
|
+
const convert = active && this.statusCode === 404 && !this.headersSent && !this.writableEnded;
|
|
42
|
+
restore();
|
|
43
|
+
if (!convert) return Reflect.apply(originalEnd, this, args);
|
|
44
|
+
this.statusCode = 406;
|
|
45
|
+
this.statusMessage = "Not Acceptable";
|
|
46
|
+
const headers = new Headers();
|
|
47
|
+
const vary = this.getHeader("vary");
|
|
48
|
+
if (vary != null) headers.set("vary", Array.isArray(vary) ? vary.join(", ") : String(vary));
|
|
49
|
+
const negotiated = notAcceptableHeaders(headers, new Headers());
|
|
50
|
+
for (const name of representationHeaders) this.removeHeader(name);
|
|
51
|
+
negotiated.forEach((value, name) => this.setHeader(name, value));
|
|
52
|
+
const callback = args.at(-1);
|
|
53
|
+
return Reflect.apply(originalEnd, this, [
|
|
54
|
+
NOT_ACCEPTABLE_BODY,
|
|
55
|
+
"utf8",
|
|
56
|
+
typeof callback === "function" ? callback : void 0
|
|
57
|
+
]);
|
|
58
|
+
}
|
|
59
|
+
response.end = end;
|
|
60
|
+
response.once("close", restore);
|
|
61
|
+
}
|
|
62
|
+
//#endregion
|
|
2
63
|
//#region src/index.ts
|
|
3
64
|
const notAcceptableResponses = /* @__PURE__ */ new WeakMap();
|
|
4
65
|
/**
|
|
@@ -27,8 +88,9 @@ function fedifyMiddleware(federation, createContextData = () => void 0) {
|
|
|
27
88
|
const response = await federation.fetch(event.request, {
|
|
28
89
|
contextData: await createContextData(event),
|
|
29
90
|
onNotFound: () => new Response("Not Found", { status: 404 }),
|
|
30
|
-
onNotAcceptable: () => new Response(
|
|
91
|
+
onNotAcceptable: () => new Response(NOT_ACCEPTABLE_BODY, {
|
|
31
92
|
status: 406,
|
|
93
|
+
statusText: "Not Acceptable",
|
|
32
94
|
headers: {
|
|
33
95
|
"Content-Type": "text/plain",
|
|
34
96
|
Vary: "Accept"
|
|
@@ -38,16 +100,26 @@ function fedifyMiddleware(federation, createContextData = () => void 0) {
|
|
|
38
100
|
if (response.status === 404) return;
|
|
39
101
|
if (response.status === 406) {
|
|
40
102
|
notAcceptableResponses.set(event.request, response);
|
|
103
|
+
interceptNotAcceptable(event.nativeEvent.node.res, () => {
|
|
104
|
+
notAcceptableResponses.delete(event.request);
|
|
105
|
+
});
|
|
41
106
|
return;
|
|
42
107
|
}
|
|
43
108
|
return response;
|
|
44
109
|
},
|
|
45
|
-
onBeforeResponse: (event) => {
|
|
110
|
+
onBeforeResponse: (event, payload) => {
|
|
46
111
|
const stored = notAcceptableResponses.get(event.request);
|
|
47
|
-
if (stored
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
112
|
+
if (stored == null || event.nativeEvent.handled) return;
|
|
113
|
+
const body = payload.body;
|
|
114
|
+
const error = body instanceof Error ? body : void 0;
|
|
115
|
+
if ((body instanceof Response ? body.status : body === void 0 && (event.response.status ?? 200) === 200 ? 404 : error?.statusCode ?? error?.status ?? event.response.status ?? 200) !== 404) return;
|
|
116
|
+
const headers = notAcceptableHeaders(body instanceof Response ? body.headers : new Headers(), event.response.headers);
|
|
117
|
+
if (body instanceof Response) body.body?.cancel().catch(() => {});
|
|
118
|
+
payload.body = new Response(stored.body, {
|
|
119
|
+
status: 406,
|
|
120
|
+
statusText: "Not Acceptable",
|
|
121
|
+
headers
|
|
122
|
+
});
|
|
51
123
|
}
|
|
52
124
|
});
|
|
53
125
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fedify/solidstart",
|
|
3
|
-
"version": "2.3.
|
|
3
|
+
"version": "2.3.13",
|
|
4
4
|
"description": "Integrate Fedify with SolidStart",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Fedify",
|
|
@@ -50,15 +50,19 @@
|
|
|
50
50
|
],
|
|
51
51
|
"peerDependencies": {
|
|
52
52
|
"@solidjs/start": "^1.3.0",
|
|
53
|
-
"@fedify/fedify": "^2.3.
|
|
53
|
+
"@fedify/fedify": "^2.3.13"
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
56
56
|
"tsdown": "^0.22.0",
|
|
57
|
-
"typescript": "^6.0.0"
|
|
57
|
+
"typescript": "^6.0.0",
|
|
58
|
+
"h3": "^1.15.0",
|
|
59
|
+
"@fedify/fixture": "^2.0.0"
|
|
58
60
|
},
|
|
59
61
|
"scripts": {
|
|
60
62
|
"build:self": "tsdown",
|
|
61
63
|
"build": "pnpm --filter @fedify/solidstart... run build:self",
|
|
62
|
-
"prepublish": "pnpm build"
|
|
64
|
+
"prepublish": "pnpm build",
|
|
65
|
+
"test": "node --experimental-transform-types --test",
|
|
66
|
+
"test:bun": "bun test"
|
|
63
67
|
}
|
|
64
68
|
}
|