@fedify/solidstart 2.3.12 → 2.3.14

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 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("Not Acceptable", {
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 != null) {
49
- notAcceptableResponses.delete(event.request);
50
- if ((event.response.status ?? 200) === 404) return stored;
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("Not Acceptable", {
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 != null) {
48
- notAcceptableResponses.delete(event.request);
49
- if ((event.response.status ?? 200) === 404) return stored;
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.12",
3
+ "version": "2.3.14",
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.12"
53
+ "@fedify/fedify": "^2.3.14"
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
  }