claude-session-dashboard 0.4.4 → 0.5.0
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/client/assets/_dashboard-ChSI7O-o.js +1 -0
- package/dist/client/assets/_sessionId-DxfkocLt.js +12 -0
- package/dist/client/assets/app-BAZLXX_G.css +1 -0
- package/dist/client/assets/createServerFn-DJjqV8Yc.js +1 -0
- package/dist/client/assets/index-BHwOAB5a.js +1 -0
- package/dist/client/assets/main-DMwMzWYr.js +69 -0
- package/dist/client/assets/sessions.queries-D7WObk5d.js +1 -0
- package/dist/client/assets/settings-BM0TBEkW.js +1 -0
- package/dist/client/assets/settings.types-BNSfIfFX.js +1 -0
- package/dist/client/assets/stats-wLUGXFpZ.js +4 -0
- package/dist/client/assets/useSessionCost-BPqnyONZ.js +37 -0
- package/dist/server/assets/{_dashboard-smfIqyQC.js → _dashboard-DZJZ9oYy.js} +13 -12
- package/dist/server/assets/{_sessionId-DIUMcrWR.js → _sessionId-znGcd1Dj.js} +53 -24
- package/dist/server/assets/_tanstack-start-manifest_v-BNorjuP4.js +4 -0
- package/dist/server/assets/{app-info.server-CXcS0a5s.js → app-info.api-CrHplh0q.js} +33 -18
- package/dist/server/assets/{createServerRpc-Bd3B-Ah9.js → createServerRpc-D_-6bKnO.js} +1 -1
- package/dist/server/assets/{createSsrRpc-CVg2UDl0.js → createSsrRpc-OFLSk08e.js} +2 -3
- package/dist/server/assets/{index-hFrIPkke.js → index-BnvjnlZM.js} +31 -14
- package/dist/server/assets/{project-analytics.server-Bxk8-NnT.js → project-analytics.api-6b5TIBNn.js} +12 -10
- package/dist/server/assets/{router-5hznwWqr.js → router-DAepjaOj.js} +80 -12
- package/dist/server/assets/{session-detail.server-BIoOQwSE.js → session-detail.api-BQts3iQn.js} +38 -33
- package/dist/server/assets/{session-parser-B0pdBvgT.js → session-parser-DKZZMuh6.js} +123 -31
- package/dist/server/assets/{session-scanner-CpgOq5m1.js → session-scanner-CECpfGFh.js} +4 -4
- package/dist/server/assets/{sessions.server-Biq8gbAJ.js → sessions.api-CQ-Lrk5S.js} +16 -14
- package/dist/server/assets/{sessions.queries-B5ZBiVJy.js → sessions.queries-MfPgj6cK.js} +4 -4
- package/dist/server/assets/{settings-D0FgLIR5.js → settings-DsLaw8yg.js} +42 -13
- package/dist/server/assets/{settings.server-6B2PvLgf.js → settings.api-Cq5KPUxN.js} +12 -11
- package/dist/server/assets/{settings.queries-DSQd324O.js → settings.queries-CMWxUDF-.js} +4 -4
- package/dist/server/assets/{settings.types-DntadCHo.js → settings.types-CphWe-HW.js} +10 -1
- package/dist/server/assets/{stats-Ae6umrPI.js → stats-DKbhSePW.js} +57 -43
- package/dist/server/assets/{stats.server-DhzOihwM.js → stats.api-tIZqhk4B.js} +12 -10
- package/dist/server/assets/{useSessionCost-CYs5UOX-.js → useSessionCost-iQEg4FRM.js} +2 -2
- package/dist/server/server.js +458 -808
- package/package.json +6 -2
- package/LICENSE +0 -21
- package/README.md +0 -194
- package/dist/client/assets/_dashboard-DLFGahko.js +0 -1
- package/dist/client/assets/_sessionId-xiPzwrlf.js +0 -12
- package/dist/client/assets/app-DREGBD44.css +0 -1
- package/dist/client/assets/createServerFn-BLR4iNR3.js +0 -1
- package/dist/client/assets/index-D_9sS4oJ.js +0 -1
- package/dist/client/assets/main-BcKPK-4E.js +0 -56
- package/dist/client/assets/sessions.queries-CHKiZnLm.js +0 -1
- package/dist/client/assets/settings-B2tG1vy0.js +0 -1
- package/dist/client/assets/settings.types-DHC6rkil.js +0 -1
- package/dist/client/assets/stats-BlA0NIHc.js +0 -4
- package/dist/client/assets/useSessionCost-BikgEmWy.js +0 -37
- package/dist/server/assets/_tanstack-start-manifest_v-Dmhlhehg.js +0 -4
package/dist/server/server.js
CHANGED
|
@@ -1,230 +1,284 @@
|
|
|
1
|
-
import { createMemoryHistory } from "@tanstack/history";
|
|
2
|
-
import { mergeHeaders } from "@tanstack/router-core/ssr/client";
|
|
3
|
-
import { parseRedirect, isRedirect, defaultSerovalPlugins, makeSerovalPlugin, rootRouteId, createRawStreamRPCPlugin, isNotFound, createSerializationAdapter, isResolvedRedirect, executeRewriteInput } from "@tanstack/router-core";
|
|
4
1
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
5
|
-
import { getNormalizedURL, getOrigin, attachRouterServerSsrUtils } from "@tanstack/router-core/ssr/server";
|
|
6
2
|
import { H3Event, toResponse } from "h3-v2";
|
|
3
|
+
import { rootRouteId, parseRedirect, isRedirect, defaultSerovalPlugins, makeSerovalPlugin, createRawStreamRPCPlugin, isNotFound, createSerializationAdapter, isResolvedRedirect, executeRewriteInput } from "@tanstack/router-core";
|
|
7
4
|
import invariant from "tiny-invariant";
|
|
8
5
|
import { toCrossJSONStream, fromJSON, toCrossJSONAsync } from "seroval";
|
|
6
|
+
import { createMemoryHistory } from "@tanstack/history";
|
|
7
|
+
import { mergeHeaders } from "@tanstack/router-core/ssr/client";
|
|
8
|
+
import { getNormalizedURL, getOrigin, attachRouterServerSsrUtils } from "@tanstack/router-core/ssr/server";
|
|
9
|
+
import "react";
|
|
10
|
+
import { RouterProvider } from "@tanstack/react-router";
|
|
9
11
|
import { jsx } from "react/jsx-runtime";
|
|
10
12
|
import { defineHandlerCallback, renderRouterToStream } from "@tanstack/react-router/ssr/server";
|
|
11
|
-
import { RouterProvider } from "@tanstack/react-router";
|
|
12
13
|
function StartServer(props) {
|
|
13
14
|
return /* @__PURE__ */ jsx(RouterProvider, { router: props.router });
|
|
14
15
|
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
"
|
|
27
|
-
);
|
|
28
|
-
const X_TSS_SERIALIZED = "x-tss-serialized";
|
|
29
|
-
const X_TSS_RAW_RESPONSE = "x-tss-raw";
|
|
30
|
-
const TSS_CONTENT_TYPE_FRAMED = "application/x-tss-framed";
|
|
31
|
-
const FrameType = {
|
|
32
|
-
/** Seroval JSON chunk (NDJSON line) */
|
|
33
|
-
JSON: 0,
|
|
34
|
-
/** Raw stream data chunk */
|
|
35
|
-
CHUNK: 1,
|
|
36
|
-
/** Raw stream end (EOF) */
|
|
37
|
-
END: 2,
|
|
38
|
-
/** Raw stream error */
|
|
39
|
-
ERROR: 3
|
|
40
|
-
};
|
|
41
|
-
const FRAME_HEADER_SIZE = 9;
|
|
42
|
-
const TSS_FRAMED_PROTOCOL_VERSION = 1;
|
|
43
|
-
const TSS_CONTENT_TYPE_FRAMED_VERSIONED = `${TSS_CONTENT_TYPE_FRAMED}; v=${TSS_FRAMED_PROTOCOL_VERSION}`;
|
|
44
|
-
const GLOBAL_STORAGE_KEY = /* @__PURE__ */ Symbol.for("tanstack-start:start-storage-context");
|
|
45
|
-
const globalObj$1 = globalThis;
|
|
46
|
-
if (!globalObj$1[GLOBAL_STORAGE_KEY]) {
|
|
47
|
-
globalObj$1[GLOBAL_STORAGE_KEY] = new AsyncLocalStorage();
|
|
16
|
+
var defaultStreamHandler = defineHandlerCallback(({ request, router, responseHeaders }) => renderRouterToStream({
|
|
17
|
+
request,
|
|
18
|
+
router,
|
|
19
|
+
responseHeaders,
|
|
20
|
+
children: /* @__PURE__ */ jsx(StartServer, { router })
|
|
21
|
+
}));
|
|
22
|
+
var GLOBAL_EVENT_STORAGE_KEY = /* @__PURE__ */ Symbol.for("tanstack-start:event-storage");
|
|
23
|
+
var globalObj$1 = globalThis;
|
|
24
|
+
if (!globalObj$1[GLOBAL_EVENT_STORAGE_KEY]) globalObj$1[GLOBAL_EVENT_STORAGE_KEY] = new AsyncLocalStorage();
|
|
25
|
+
var eventStorage = globalObj$1[GLOBAL_EVENT_STORAGE_KEY];
|
|
26
|
+
function isPromiseLike(value) {
|
|
27
|
+
return typeof value.then === "function";
|
|
48
28
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
return
|
|
29
|
+
function getSetCookieValues(headers) {
|
|
30
|
+
const headersWithSetCookie = headers;
|
|
31
|
+
if (typeof headersWithSetCookie.getSetCookie === "function") return headersWithSetCookie.getSetCookie();
|
|
32
|
+
const value = headers.get("set-cookie");
|
|
33
|
+
return value ? [value] : [];
|
|
52
34
|
}
|
|
53
|
-
function
|
|
54
|
-
|
|
55
|
-
|
|
35
|
+
function mergeEventResponseHeaders(response, event) {
|
|
36
|
+
if (response.ok) return;
|
|
37
|
+
const eventSetCookies = getSetCookieValues(event.res.headers);
|
|
38
|
+
if (eventSetCookies.length === 0) return;
|
|
39
|
+
const responseSetCookies = getSetCookieValues(response.headers);
|
|
40
|
+
response.headers.delete("set-cookie");
|
|
41
|
+
for (const cookie of responseSetCookies) response.headers.append("set-cookie", cookie);
|
|
42
|
+
for (const cookie of eventSetCookies) response.headers.append("set-cookie", cookie);
|
|
43
|
+
}
|
|
44
|
+
function attachResponseHeaders(value, event) {
|
|
45
|
+
if (isPromiseLike(value)) return value.then((resolved) => {
|
|
46
|
+
if (resolved instanceof Response) mergeEventResponseHeaders(resolved, event);
|
|
47
|
+
return resolved;
|
|
48
|
+
});
|
|
49
|
+
if (value instanceof Response) mergeEventResponseHeaders(value, event);
|
|
50
|
+
return value;
|
|
51
|
+
}
|
|
52
|
+
function requestHandler(handler) {
|
|
53
|
+
return (request, requestOpts) => {
|
|
54
|
+
const h3Event = new H3Event(request);
|
|
55
|
+
return toResponse(attachResponseHeaders(eventStorage.run({ h3Event }, () => handler(request, requestOpts)), h3Event), h3Event);
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function getH3Event() {
|
|
59
|
+
const event = eventStorage.getStore();
|
|
60
|
+
if (!event) throw new Error(`No StartEvent found in AsyncLocalStorage. Make sure you are using the function within the server runtime.`);
|
|
61
|
+
return event.h3Event;
|
|
62
|
+
}
|
|
63
|
+
function getResponse() {
|
|
64
|
+
return getH3Event().res;
|
|
65
|
+
}
|
|
66
|
+
var HEADERS = { TSS_SHELL: "X-TSS_SHELL" };
|
|
67
|
+
async function getStartManifest(matchedRoutes) {
|
|
68
|
+
const { tsrStartManifest } = await import("./assets/_tanstack-start-manifest_v-BNorjuP4.js");
|
|
69
|
+
const startManifest = tsrStartManifest();
|
|
70
|
+
const rootRoute = startManifest.routes[rootRouteId] = startManifest.routes[rootRouteId] || {};
|
|
71
|
+
rootRoute.assets = rootRoute.assets || [];
|
|
72
|
+
let injectedHeadScripts;
|
|
73
|
+
return {
|
|
74
|
+
manifest: { routes: Object.fromEntries(Object.entries(startManifest.routes).flatMap(([k, v]) => {
|
|
75
|
+
const result = {};
|
|
76
|
+
let hasData = false;
|
|
77
|
+
if (v.preloads && v.preloads.length > 0) {
|
|
78
|
+
result["preloads"] = v.preloads;
|
|
79
|
+
hasData = true;
|
|
80
|
+
}
|
|
81
|
+
if (v.assets && v.assets.length > 0) {
|
|
82
|
+
result["assets"] = v.assets;
|
|
83
|
+
hasData = true;
|
|
84
|
+
}
|
|
85
|
+
if (!hasData) return [];
|
|
86
|
+
return [[k, result]];
|
|
87
|
+
})) },
|
|
88
|
+
clientEntry: startManifest.clientEntry,
|
|
89
|
+
injectedHeadScripts
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
const manifest = { "39e65590d2bc41f653f54a9b6a9e0a72f185da275304c0a4a595d811cf185572": {
|
|
93
|
+
functionName: "getProjectAnalytics_createServerFn_handler",
|
|
94
|
+
importer: () => import("./assets/project-analytics.api-6b5TIBNn.js")
|
|
95
|
+
}, "44af69d3bfcf3ec46fffb3f297d2b12cd7fe4db36c654b8a322df34d549c6493": {
|
|
96
|
+
functionName: "getStats_createServerFn_handler",
|
|
97
|
+
importer: () => import("./assets/stats.api-tIZqhk4B.js")
|
|
98
|
+
}, "71794080473579a94431392ab409ebd02772f6a9f6a08386cadbb8c0d3cf804a": {
|
|
99
|
+
functionName: "getSessionDetail_createServerFn_handler",
|
|
100
|
+
importer: () => import("./assets/session-detail.api-BQts3iQn.js")
|
|
101
|
+
}, "72f81ef9e8fa751bab60a8bdabd7e77816e2a6723a5e6e26e03712c01b3a249c": {
|
|
102
|
+
functionName: "getSettings_createServerFn_handler",
|
|
103
|
+
importer: () => import("./assets/settings.api-Cq5KPUxN.js")
|
|
104
|
+
}, "7fe8c2b131c4fc81aa9a2570aec79640ff84603fe0060d13c24928b7329cb236": {
|
|
105
|
+
functionName: "saveSettings_createServerFn_handler",
|
|
106
|
+
importer: () => import("./assets/settings.api-Cq5KPUxN.js")
|
|
107
|
+
}, "04ac41a7e3e644815167d098c2d6c3375d00a72a11e5af0d37033ba771081ba9": {
|
|
108
|
+
functionName: "getAppInfo_createServerFn_handler",
|
|
109
|
+
importer: () => import("./assets/app-info.api-CrHplh0q.js")
|
|
110
|
+
}, "8fd6c4e5b4d5590acf1ec73da75f249978e8aced6dd2be23de06ade8431033be": {
|
|
111
|
+
functionName: "getSessionList_createServerFn_handler",
|
|
112
|
+
importer: () => import("./assets/sessions.api-CQ-Lrk5S.js")
|
|
113
|
+
}, "946cc550946f64ee7985dc35913a690eb13183d7ba83cffe398e424e697b4265": {
|
|
114
|
+
functionName: "getActiveSessionList_createServerFn_handler",
|
|
115
|
+
importer: () => import("./assets/sessions.api-CQ-Lrk5S.js")
|
|
116
|
+
}, "e574977967ea9b3387e72d70704b6ca87230e72becaf69f0b98cbc91c9cd1339": {
|
|
117
|
+
functionName: "getPaginatedSessions_createServerFn_handler",
|
|
118
|
+
importer: () => import("./assets/sessions.api-CQ-Lrk5S.js")
|
|
119
|
+
} };
|
|
120
|
+
async function getServerFnById(id) {
|
|
121
|
+
const serverFnInfo = manifest[id];
|
|
122
|
+
if (!serverFnInfo) {
|
|
123
|
+
throw new Error("Server function info not found for " + id);
|
|
124
|
+
}
|
|
125
|
+
const fnModule = await serverFnInfo.importer();
|
|
126
|
+
if (!fnModule) {
|
|
127
|
+
console.info("serverFnInfo", serverFnInfo);
|
|
128
|
+
throw new Error("Server function module not resolved for " + id);
|
|
129
|
+
}
|
|
130
|
+
const action = fnModule[serverFnInfo.functionName];
|
|
131
|
+
if (!action) {
|
|
132
|
+
console.info("serverFnInfo", serverFnInfo);
|
|
133
|
+
console.info("fnModule", fnModule);
|
|
56
134
|
throw new Error(
|
|
57
|
-
`
|
|
135
|
+
`Server function module export not resolved for serverFn ID: ${id}`
|
|
58
136
|
);
|
|
59
137
|
}
|
|
60
|
-
return
|
|
138
|
+
return action;
|
|
61
139
|
}
|
|
62
|
-
|
|
63
|
-
|
|
140
|
+
var TSS_FORMDATA_CONTEXT = "__TSS_CONTEXT";
|
|
141
|
+
var TSS_SERVER_FUNCTION = /* @__PURE__ */ Symbol.for("TSS_SERVER_FUNCTION");
|
|
142
|
+
var TSS_SERVER_FUNCTION_FACTORY = /* @__PURE__ */ Symbol.for("TSS_SERVER_FUNCTION_FACTORY");
|
|
143
|
+
var X_TSS_SERIALIZED = "x-tss-serialized";
|
|
144
|
+
var X_TSS_RAW_RESPONSE = "x-tss-raw";
|
|
145
|
+
var TSS_CONTENT_TYPE_FRAMED = "application/x-tss-framed";
|
|
146
|
+
var FrameType = {
|
|
147
|
+
JSON: 0,
|
|
148
|
+
CHUNK: 1,
|
|
149
|
+
END: 2,
|
|
150
|
+
ERROR: 3
|
|
151
|
+
};
|
|
152
|
+
var FRAME_HEADER_SIZE = 9;
|
|
153
|
+
var TSS_CONTENT_TYPE_FRAMED_VERSIONED = `${TSS_CONTENT_TYPE_FRAMED}; v=1`;
|
|
64
154
|
function isSafeKey(key) {
|
|
65
155
|
return key !== "__proto__" && key !== "constructor" && key !== "prototype";
|
|
66
156
|
}
|
|
67
157
|
function safeObjectMerge(target, source) {
|
|
68
158
|
const result = /* @__PURE__ */ Object.create(null);
|
|
69
159
|
if (target) {
|
|
70
|
-
for (const key of Object.keys(target))
|
|
71
|
-
if (isSafeKey(key)) result[key] = target[key];
|
|
72
|
-
}
|
|
160
|
+
for (const key of Object.keys(target)) if (isSafeKey(key)) result[key] = target[key];
|
|
73
161
|
}
|
|
74
162
|
if (source && typeof source === "object") {
|
|
75
|
-
for (const key of Object.keys(source))
|
|
76
|
-
if (isSafeKey(key)) result[key] = source[key];
|
|
77
|
-
}
|
|
163
|
+
for (const key of Object.keys(source)) if (isSafeKey(key)) result[key] = source[key];
|
|
78
164
|
}
|
|
79
165
|
return result;
|
|
80
166
|
}
|
|
81
167
|
function createNullProtoObject(source) {
|
|
82
168
|
if (!source) return /* @__PURE__ */ Object.create(null);
|
|
83
169
|
const obj = /* @__PURE__ */ Object.create(null);
|
|
84
|
-
for (const key of Object.keys(source))
|
|
85
|
-
if (isSafeKey(key)) obj[key] = source[key];
|
|
86
|
-
}
|
|
170
|
+
for (const key of Object.keys(source)) if (isSafeKey(key)) obj[key] = source[key];
|
|
87
171
|
return obj;
|
|
88
172
|
}
|
|
89
|
-
|
|
173
|
+
var GLOBAL_STORAGE_KEY = /* @__PURE__ */ Symbol.for("tanstack-start:start-storage-context");
|
|
174
|
+
var globalObj = globalThis;
|
|
175
|
+
if (!globalObj[GLOBAL_STORAGE_KEY]) globalObj[GLOBAL_STORAGE_KEY] = new AsyncLocalStorage();
|
|
176
|
+
var startStorage = globalObj[GLOBAL_STORAGE_KEY];
|
|
177
|
+
async function runWithStartContext(context, fn) {
|
|
178
|
+
return startStorage.run(context, fn);
|
|
179
|
+
}
|
|
180
|
+
function getStartContext(opts) {
|
|
181
|
+
const context = startStorage.getStore();
|
|
182
|
+
if (!context && opts?.throwIfNotFound !== false) throw new Error(`No Start context found in AsyncLocalStorage. Make sure you are using the function within the server runtime.`);
|
|
183
|
+
return context;
|
|
184
|
+
}
|
|
185
|
+
var getStartOptions = () => getStartContext().startOptions;
|
|
186
|
+
var getStartContextServerOnly = getStartContext;
|
|
187
|
+
var createServerFn = (options, __opts) => {
|
|
90
188
|
const resolvedOptions = __opts || options || {};
|
|
91
|
-
if (typeof resolvedOptions.method === "undefined")
|
|
92
|
-
resolvedOptions.method = "GET";
|
|
93
|
-
}
|
|
189
|
+
if (typeof resolvedOptions.method === "undefined") resolvedOptions.method = "GET";
|
|
94
190
|
const res = {
|
|
95
191
|
options: resolvedOptions,
|
|
96
192
|
middleware: (middleware) => {
|
|
97
193
|
const newMiddleware = [...resolvedOptions.middleware || []];
|
|
98
194
|
middleware.map((m) => {
|
|
99
195
|
if (TSS_SERVER_FUNCTION_FACTORY in m) {
|
|
100
|
-
if (m.options.middleware)
|
|
101
|
-
|
|
102
|
-
}
|
|
103
|
-
} else {
|
|
104
|
-
newMiddleware.push(m);
|
|
105
|
-
}
|
|
196
|
+
if (m.options.middleware) newMiddleware.push(...m.options.middleware);
|
|
197
|
+
} else newMiddleware.push(m);
|
|
106
198
|
});
|
|
107
|
-
const
|
|
199
|
+
const res2 = createServerFn(void 0, {
|
|
108
200
|
...resolvedOptions,
|
|
109
201
|
middleware: newMiddleware
|
|
110
|
-
};
|
|
111
|
-
const res2 = createServerFn(void 0, newOptions);
|
|
202
|
+
});
|
|
112
203
|
res2[TSS_SERVER_FUNCTION_FACTORY] = true;
|
|
113
204
|
return res2;
|
|
114
205
|
},
|
|
115
206
|
inputValidator: (inputValidator) => {
|
|
116
|
-
|
|
117
|
-
|
|
207
|
+
return createServerFn(void 0, {
|
|
208
|
+
...resolvedOptions,
|
|
209
|
+
inputValidator
|
|
210
|
+
});
|
|
118
211
|
},
|
|
119
212
|
handler: (...args) => {
|
|
120
213
|
const [extractedFn, serverFn] = args;
|
|
121
|
-
const newOptions = {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
...newOptions,
|
|
131
|
-
data: opts?.data,
|
|
132
|
-
headers: opts?.headers,
|
|
133
|
-
signal: opts?.signal,
|
|
134
|
-
fetch: opts?.fetch,
|
|
135
|
-
context: createNullProtoObject()
|
|
136
|
-
});
|
|
137
|
-
const redirect = parseRedirect(result.error);
|
|
138
|
-
if (redirect) {
|
|
139
|
-
throw redirect;
|
|
140
|
-
}
|
|
141
|
-
if (result.error) throw result.error;
|
|
142
|
-
return result.result;
|
|
143
|
-
},
|
|
144
|
-
{
|
|
145
|
-
// This copies over the URL, function ID
|
|
214
|
+
const newOptions = {
|
|
215
|
+
...resolvedOptions,
|
|
216
|
+
extractedFn,
|
|
217
|
+
serverFn
|
|
218
|
+
};
|
|
219
|
+
const resolvedMiddleware = [...newOptions.middleware || [], serverFnBaseToMiddleware(newOptions)];
|
|
220
|
+
extractedFn.method = resolvedOptions.method;
|
|
221
|
+
return Object.assign(async (opts) => {
|
|
222
|
+
const result = await executeMiddleware$1(resolvedMiddleware, "client", {
|
|
146
223
|
...extractedFn,
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
}));
|
|
176
|
-
return result;
|
|
177
|
-
}
|
|
224
|
+
...newOptions,
|
|
225
|
+
data: opts?.data,
|
|
226
|
+
headers: opts?.headers,
|
|
227
|
+
signal: opts?.signal,
|
|
228
|
+
fetch: opts?.fetch,
|
|
229
|
+
context: createNullProtoObject()
|
|
230
|
+
});
|
|
231
|
+
const redirect = parseRedirect(result.error);
|
|
232
|
+
if (redirect) throw redirect;
|
|
233
|
+
if (result.error) throw result.error;
|
|
234
|
+
return result.result;
|
|
235
|
+
}, {
|
|
236
|
+
...extractedFn,
|
|
237
|
+
method: resolvedOptions.method,
|
|
238
|
+
__executeServer: async (opts) => {
|
|
239
|
+
const startContext = getStartContextServerOnly();
|
|
240
|
+
const serverContextAfterGlobalMiddlewares = startContext.contextAfterGlobalMiddlewares;
|
|
241
|
+
return await executeMiddleware$1(resolvedMiddleware, "server", {
|
|
242
|
+
...extractedFn,
|
|
243
|
+
...opts,
|
|
244
|
+
serverFnMeta: extractedFn.serverFnMeta,
|
|
245
|
+
context: safeObjectMerge(serverContextAfterGlobalMiddlewares, opts.context),
|
|
246
|
+
request: startContext.request
|
|
247
|
+
}).then((d) => ({
|
|
248
|
+
result: d.result,
|
|
249
|
+
error: d.error,
|
|
250
|
+
context: d.sendContext
|
|
251
|
+
}));
|
|
178
252
|
}
|
|
179
|
-
);
|
|
253
|
+
});
|
|
180
254
|
}
|
|
181
255
|
};
|
|
182
256
|
const fun = (options2) => {
|
|
183
|
-
|
|
257
|
+
return createServerFn(void 0, {
|
|
184
258
|
...resolvedOptions,
|
|
185
259
|
...options2
|
|
186
|
-
};
|
|
187
|
-
return createServerFn(void 0, newOptions);
|
|
260
|
+
});
|
|
188
261
|
};
|
|
189
262
|
return Object.assign(fun, res);
|
|
190
263
|
};
|
|
191
264
|
async function executeMiddleware$1(middlewares, env, opts) {
|
|
192
|
-
|
|
193
|
-
let flattenedMiddlewares = flattenMiddlewares([
|
|
194
|
-
...globalMiddlewares,
|
|
195
|
-
...middlewares
|
|
196
|
-
]);
|
|
265
|
+
let flattenedMiddlewares = flattenMiddlewares([...getStartOptions()?.functionMiddleware || [], ...middlewares]);
|
|
197
266
|
if (env === "server") {
|
|
198
267
|
const startContext = getStartContextServerOnly({ throwIfNotFound: false });
|
|
199
|
-
if (startContext?.executedRequestMiddlewares)
|
|
200
|
-
flattenedMiddlewares = flattenedMiddlewares.filter(
|
|
201
|
-
(m) => !startContext.executedRequestMiddlewares.has(m)
|
|
202
|
-
);
|
|
203
|
-
}
|
|
268
|
+
if (startContext?.executedRequestMiddlewares) flattenedMiddlewares = flattenedMiddlewares.filter((m) => !startContext.executedRequestMiddlewares.has(m));
|
|
204
269
|
}
|
|
205
270
|
const callNextMiddleware = async (ctx) => {
|
|
206
271
|
const nextMiddleware = flattenedMiddlewares.shift();
|
|
207
|
-
if (!nextMiddleware)
|
|
208
|
-
return ctx;
|
|
209
|
-
}
|
|
272
|
+
if (!nextMiddleware) return ctx;
|
|
210
273
|
try {
|
|
211
|
-
if ("inputValidator" in nextMiddleware.options && nextMiddleware.options.inputValidator && env === "server")
|
|
212
|
-
ctx.data = await execValidator(
|
|
213
|
-
nextMiddleware.options.inputValidator,
|
|
214
|
-
ctx.data
|
|
215
|
-
);
|
|
216
|
-
}
|
|
274
|
+
if ("inputValidator" in nextMiddleware.options && nextMiddleware.options.inputValidator && env === "server") ctx.data = await execValidator(nextMiddleware.options.inputValidator, ctx.data);
|
|
217
275
|
let middlewareFn = void 0;
|
|
218
276
|
if (env === "client") {
|
|
219
|
-
if ("client" in nextMiddleware.options)
|
|
220
|
-
|
|
221
|
-
}
|
|
222
|
-
} else if ("server" in nextMiddleware.options) {
|
|
223
|
-
middlewareFn = nextMiddleware.options.server;
|
|
224
|
-
}
|
|
277
|
+
if ("client" in nextMiddleware.options) middlewareFn = nextMiddleware.options.client;
|
|
278
|
+
} else if ("server" in nextMiddleware.options) middlewareFn = nextMiddleware.options.server;
|
|
225
279
|
if (middlewareFn) {
|
|
226
280
|
const userNext = async (userCtx = {}) => {
|
|
227
|
-
const
|
|
281
|
+
const result2 = await callNextMiddleware({
|
|
228
282
|
...ctx,
|
|
229
283
|
...userCtx,
|
|
230
284
|
context: safeObjectMerge(ctx.context, userCtx.context),
|
|
@@ -234,34 +288,23 @@ async function executeMiddleware$1(middlewares, env, opts) {
|
|
|
234
288
|
fetch: ctx._callSiteFetch ?? userCtx.fetch ?? ctx.fetch,
|
|
235
289
|
result: userCtx.result !== void 0 ? userCtx.result : userCtx instanceof Response ? userCtx : ctx.result,
|
|
236
290
|
error: userCtx.error ?? ctx.error
|
|
237
|
-
};
|
|
238
|
-
|
|
239
|
-
if (result2.error) {
|
|
240
|
-
throw result2.error;
|
|
241
|
-
}
|
|
291
|
+
});
|
|
292
|
+
if (result2.error) throw result2.error;
|
|
242
293
|
return result2;
|
|
243
294
|
};
|
|
244
295
|
const result = await middlewareFn({
|
|
245
296
|
...ctx,
|
|
246
297
|
next: userNext
|
|
247
298
|
});
|
|
248
|
-
if (isRedirect(result)) {
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
result
|
|
258
|
-
};
|
|
259
|
-
}
|
|
260
|
-
if (!result) {
|
|
261
|
-
throw new Error(
|
|
262
|
-
"User middleware returned undefined. You must call next() or return a result in your middlewares."
|
|
263
|
-
);
|
|
264
|
-
}
|
|
299
|
+
if (isRedirect(result)) return {
|
|
300
|
+
...ctx,
|
|
301
|
+
error: result
|
|
302
|
+
};
|
|
303
|
+
if (result instanceof Response) return {
|
|
304
|
+
...ctx,
|
|
305
|
+
result
|
|
306
|
+
};
|
|
307
|
+
if (!result) throw new Error("User middleware returned undefined. You must call next() or return a result in your middlewares.");
|
|
265
308
|
return result;
|
|
266
309
|
}
|
|
267
310
|
return callNextMiddleware(ctx);
|
|
@@ -284,15 +327,9 @@ function flattenMiddlewares(middlewares, maxDepth = 100) {
|
|
|
284
327
|
const seen = /* @__PURE__ */ new Set();
|
|
285
328
|
const flattened = [];
|
|
286
329
|
const recurse = (middleware, depth) => {
|
|
287
|
-
if (depth > maxDepth) {
|
|
288
|
-
throw new Error(
|
|
289
|
-
`Middleware nesting depth exceeded maximum of ${maxDepth}. Check for circular references.`
|
|
290
|
-
);
|
|
291
|
-
}
|
|
330
|
+
if (depth > maxDepth) throw new Error(`Middleware nesting depth exceeded maximum of ${maxDepth}. Check for circular references.`);
|
|
292
331
|
middleware.forEach((m) => {
|
|
293
|
-
if (m.options.middleware)
|
|
294
|
-
recurse(m.options.middleware, depth + 1);
|
|
295
|
-
}
|
|
332
|
+
if (m.options.middleware) recurse(m.options.middleware, depth + 1);
|
|
296
333
|
if (!seen.has(m)) {
|
|
297
334
|
seen.add(m);
|
|
298
335
|
flattened.push(m);
|
|
@@ -306,16 +343,11 @@ async function execValidator(validator, input) {
|
|
|
306
343
|
if (validator == null) return {};
|
|
307
344
|
if ("~standard" in validator) {
|
|
308
345
|
const result = await validator["~standard"].validate(input);
|
|
309
|
-
if (result.issues)
|
|
310
|
-
throw new Error(JSON.stringify(result.issues, void 0, 2));
|
|
346
|
+
if (result.issues) throw new Error(JSON.stringify(result.issues, void 0, 2));
|
|
311
347
|
return result.value;
|
|
312
348
|
}
|
|
313
|
-
if ("parse" in validator)
|
|
314
|
-
|
|
315
|
-
}
|
|
316
|
-
if (typeof validator === "function") {
|
|
317
|
-
return validator(input);
|
|
318
|
-
}
|
|
349
|
+
if ("parse" in validator) return validator.parse(input);
|
|
350
|
+
if (typeof validator === "function") return validator(input);
|
|
319
351
|
throw new Error("Invalid validator type!");
|
|
320
352
|
}
|
|
321
353
|
function serverFnBaseToMiddleware(options) {
|
|
@@ -326,12 +358,10 @@ function serverFnBaseToMiddleware(options) {
|
|
|
326
358
|
client: async ({ next, sendContext, fetch: fetch2, ...ctx }) => {
|
|
327
359
|
const payload = {
|
|
328
360
|
...ctx,
|
|
329
|
-
// switch the sendContext over to context
|
|
330
361
|
context: sendContext,
|
|
331
362
|
fetch: fetch2
|
|
332
363
|
};
|
|
333
|
-
|
|
334
|
-
return next(res);
|
|
364
|
+
return next(await options.extractedFn?.(payload));
|
|
335
365
|
},
|
|
336
366
|
server: async ({ next, ...ctx }) => {
|
|
337
367
|
const result = await options.serverFn?.(ctx);
|
|
@@ -344,118 +374,10 @@ function serverFnBaseToMiddleware(options) {
|
|
|
344
374
|
};
|
|
345
375
|
}
|
|
346
376
|
function getDefaultSerovalPlugins() {
|
|
347
|
-
|
|
348
|
-
const adapters = start?.serializationAdapters;
|
|
349
|
-
return [
|
|
350
|
-
...adapters?.map(makeSerovalPlugin) ?? [],
|
|
351
|
-
...defaultSerovalPlugins
|
|
352
|
-
];
|
|
353
|
-
}
|
|
354
|
-
const GLOBAL_EVENT_STORAGE_KEY = /* @__PURE__ */ Symbol.for("tanstack-start:event-storage");
|
|
355
|
-
const globalObj = globalThis;
|
|
356
|
-
if (!globalObj[GLOBAL_EVENT_STORAGE_KEY]) {
|
|
357
|
-
globalObj[GLOBAL_EVENT_STORAGE_KEY] = new AsyncLocalStorage();
|
|
358
|
-
}
|
|
359
|
-
const eventStorage = globalObj[GLOBAL_EVENT_STORAGE_KEY];
|
|
360
|
-
function isPromiseLike(value) {
|
|
361
|
-
return typeof value.then === "function";
|
|
362
|
-
}
|
|
363
|
-
function getSetCookieValues(headers) {
|
|
364
|
-
const headersWithSetCookie = headers;
|
|
365
|
-
if (typeof headersWithSetCookie.getSetCookie === "function") {
|
|
366
|
-
return headersWithSetCookie.getSetCookie();
|
|
367
|
-
}
|
|
368
|
-
const value = headers.get("set-cookie");
|
|
369
|
-
return value ? [value] : [];
|
|
370
|
-
}
|
|
371
|
-
function mergeEventResponseHeaders(response, event) {
|
|
372
|
-
if (response.ok) {
|
|
373
|
-
return;
|
|
374
|
-
}
|
|
375
|
-
const eventSetCookies = getSetCookieValues(event.res.headers);
|
|
376
|
-
if (eventSetCookies.length === 0) {
|
|
377
|
-
return;
|
|
378
|
-
}
|
|
379
|
-
const responseSetCookies = getSetCookieValues(response.headers);
|
|
380
|
-
response.headers.delete("set-cookie");
|
|
381
|
-
for (const cookie of responseSetCookies) {
|
|
382
|
-
response.headers.append("set-cookie", cookie);
|
|
383
|
-
}
|
|
384
|
-
for (const cookie of eventSetCookies) {
|
|
385
|
-
response.headers.append("set-cookie", cookie);
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
function attachResponseHeaders(value, event) {
|
|
389
|
-
if (isPromiseLike(value)) {
|
|
390
|
-
return value.then((resolved) => {
|
|
391
|
-
if (resolved instanceof Response) {
|
|
392
|
-
mergeEventResponseHeaders(resolved, event);
|
|
393
|
-
}
|
|
394
|
-
return resolved;
|
|
395
|
-
});
|
|
396
|
-
}
|
|
397
|
-
if (value instanceof Response) {
|
|
398
|
-
mergeEventResponseHeaders(value, event);
|
|
399
|
-
}
|
|
400
|
-
return value;
|
|
401
|
-
}
|
|
402
|
-
function requestHandler(handler) {
|
|
403
|
-
return (request, requestOpts) => {
|
|
404
|
-
const h3Event = new H3Event(request);
|
|
405
|
-
const response = eventStorage.run(
|
|
406
|
-
{ h3Event },
|
|
407
|
-
() => handler(request, requestOpts)
|
|
408
|
-
);
|
|
409
|
-
return toResponse(attachResponseHeaders(response, h3Event), h3Event);
|
|
410
|
-
};
|
|
411
|
-
}
|
|
412
|
-
function getH3Event() {
|
|
413
|
-
const event = eventStorage.getStore();
|
|
414
|
-
if (!event) {
|
|
415
|
-
throw new Error(
|
|
416
|
-
`No StartEvent found in AsyncLocalStorage. Make sure you are using the function within the server runtime.`
|
|
417
|
-
);
|
|
418
|
-
}
|
|
419
|
-
return event.h3Event;
|
|
420
|
-
}
|
|
421
|
-
function getResponse() {
|
|
422
|
-
const event = getH3Event();
|
|
423
|
-
return event.res;
|
|
377
|
+
return [...getStartOptions()?.serializationAdapters?.map(makeSerovalPlugin) ?? [], ...defaultSerovalPlugins];
|
|
424
378
|
}
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
const startManifest = tsrStartManifest();
|
|
428
|
-
const rootRoute = startManifest.routes[rootRouteId] = startManifest.routes[rootRouteId] || {};
|
|
429
|
-
rootRoute.assets = rootRoute.assets || [];
|
|
430
|
-
let injectedHeadScripts;
|
|
431
|
-
const manifest2 = {
|
|
432
|
-
routes: Object.fromEntries(
|
|
433
|
-
Object.entries(startManifest.routes).flatMap(([k, v]) => {
|
|
434
|
-
const result = {};
|
|
435
|
-
let hasData = false;
|
|
436
|
-
if (v.preloads && v.preloads.length > 0) {
|
|
437
|
-
result["preloads"] = v.preloads;
|
|
438
|
-
hasData = true;
|
|
439
|
-
}
|
|
440
|
-
if (v.assets && v.assets.length > 0) {
|
|
441
|
-
result["assets"] = v.assets;
|
|
442
|
-
hasData = true;
|
|
443
|
-
}
|
|
444
|
-
if (!hasData) {
|
|
445
|
-
return [];
|
|
446
|
-
}
|
|
447
|
-
return [[k, result]];
|
|
448
|
-
})
|
|
449
|
-
)
|
|
450
|
-
};
|
|
451
|
-
return {
|
|
452
|
-
manifest: manifest2,
|
|
453
|
-
clientEntry: startManifest.clientEntry,
|
|
454
|
-
injectedHeadScripts
|
|
455
|
-
};
|
|
456
|
-
}
|
|
457
|
-
const textEncoder$1 = new TextEncoder();
|
|
458
|
-
const EMPTY_PAYLOAD = new Uint8Array(0);
|
|
379
|
+
var textEncoder$1 = new TextEncoder();
|
|
380
|
+
var EMPTY_PAYLOAD = new Uint8Array(0);
|
|
459
381
|
function encodeFrame(type, streamId, payload) {
|
|
460
382
|
const frame = new Uint8Array(FRAME_HEADER_SIZE + payload.length);
|
|
461
383
|
frame[0] = type;
|
|
@@ -511,9 +433,7 @@ function createMultiplexedStream(jsonStream, rawStreams) {
|
|
|
511
433
|
};
|
|
512
434
|
const checkComplete = () => {
|
|
513
435
|
activePumps--;
|
|
514
|
-
if (activePumps === 0)
|
|
515
|
-
safeClose();
|
|
516
|
-
}
|
|
436
|
+
if (activePumps === 0) safeClose();
|
|
517
437
|
};
|
|
518
438
|
return new ReadableStream({
|
|
519
439
|
start(controller) {
|
|
@@ -563,107 +483,44 @@ function createMultiplexedStream(jsonStream, rawStreams) {
|
|
|
563
483
|
}
|
|
564
484
|
};
|
|
565
485
|
pumpJSON();
|
|
566
|
-
for (const [streamId, stream] of rawStreams)
|
|
567
|
-
pumpRawStream(streamId, stream);
|
|
568
|
-
}
|
|
486
|
+
for (const [streamId, stream] of rawStreams) pumpRawStream(streamId, stream);
|
|
569
487
|
},
|
|
570
488
|
cancel() {
|
|
571
489
|
cancelled = true;
|
|
572
490
|
controllerRef = null;
|
|
573
|
-
for (const cancelReader of cancelReaders)
|
|
574
|
-
cancelReader();
|
|
575
|
-
}
|
|
491
|
+
for (const cancelReader of cancelReaders) cancelReader();
|
|
576
492
|
cancelReaders.length = 0;
|
|
577
493
|
}
|
|
578
494
|
});
|
|
579
495
|
}
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
}, "810657681a273df5b4e58f0d8fcc6a5451598b489431b9bcaa98eea0ad815da8": {
|
|
587
|
-
functionName: "getSettings_createServerFn_handler",
|
|
588
|
-
importer: () => import("./assets/settings.server-6B2PvLgf.js")
|
|
589
|
-
}, "3050115d92ca91ab1fd8fd698e33076328aae80dc64ca27c088eee16cebccc1a": {
|
|
590
|
-
functionName: "saveSettings_createServerFn_handler",
|
|
591
|
-
importer: () => import("./assets/settings.server-6B2PvLgf.js")
|
|
592
|
-
}, "bf8e4a7901f1843bdc9c46be1ad5ad59c615b8bbe611b73eb3ff28f20e43ee0d": {
|
|
593
|
-
functionName: "getSessionList_createServerFn_handler",
|
|
594
|
-
importer: () => import("./assets/sessions.server-Biq8gbAJ.js")
|
|
595
|
-
}, "839d29fe93dfa2a6d506af7b48ca25197190a5ff4c796e970ddfdc6e8c98827f": {
|
|
596
|
-
functionName: "getActiveSessionList_createServerFn_handler",
|
|
597
|
-
importer: () => import("./assets/sessions.server-Biq8gbAJ.js")
|
|
598
|
-
}, "a3f42f9012fd83586787da8f7cb90649da739dd947d867eb67572f68735ff495": {
|
|
599
|
-
functionName: "getPaginatedSessions_createServerFn_handler",
|
|
600
|
-
importer: () => import("./assets/sessions.server-Biq8gbAJ.js")
|
|
601
|
-
}, "955327d72ca3168c4751159ca07b8fb0fe0d2381dd0b991f06b941480959fbe8": {
|
|
602
|
-
functionName: "getAppInfo_createServerFn_handler",
|
|
603
|
-
importer: () => import("./assets/app-info.server-CXcS0a5s.js")
|
|
604
|
-
}, "64052f224a1d6696436e5d3deeee2b798f0742e1292ffabd038c3a7bf75e6fcb": {
|
|
605
|
-
functionName: "getProjectAnalytics_createServerFn_handler",
|
|
606
|
-
importer: () => import("./assets/project-analytics.server-Bxk8-NnT.js")
|
|
607
|
-
} };
|
|
608
|
-
async function getServerFnById(id) {
|
|
609
|
-
const serverFnInfo = manifest[id];
|
|
610
|
-
if (!serverFnInfo) {
|
|
611
|
-
throw new Error("Server function info not found for " + id);
|
|
612
|
-
}
|
|
613
|
-
const fnModule = await serverFnInfo.importer();
|
|
614
|
-
if (!fnModule) {
|
|
615
|
-
console.info("serverFnInfo", serverFnInfo);
|
|
616
|
-
throw new Error("Server function module not resolved for " + id);
|
|
617
|
-
}
|
|
618
|
-
const action = fnModule[serverFnInfo.functionName];
|
|
619
|
-
if (!action) {
|
|
620
|
-
console.info("serverFnInfo", serverFnInfo);
|
|
621
|
-
console.info("fnModule", fnModule);
|
|
622
|
-
throw new Error(
|
|
623
|
-
`Server function module export not resolved for serverFn ID: ${id}`
|
|
624
|
-
);
|
|
625
|
-
}
|
|
626
|
-
return action;
|
|
627
|
-
}
|
|
628
|
-
let serovalPlugins = void 0;
|
|
629
|
-
const textEncoder = new TextEncoder();
|
|
630
|
-
const FORM_DATA_CONTENT_TYPES = [
|
|
631
|
-
"multipart/form-data",
|
|
632
|
-
"application/x-www-form-urlencoded"
|
|
633
|
-
];
|
|
634
|
-
const MAX_PAYLOAD_SIZE = 1e6;
|
|
635
|
-
const handleServerAction = async ({
|
|
636
|
-
request,
|
|
637
|
-
context,
|
|
638
|
-
serverFnId
|
|
639
|
-
}) => {
|
|
640
|
-
const method = request.method;
|
|
641
|
-
const methodUpper = method.toUpperCase();
|
|
642
|
-
const methodLower = method.toLowerCase();
|
|
496
|
+
var serovalPlugins = void 0;
|
|
497
|
+
var textEncoder = new TextEncoder();
|
|
498
|
+
var FORM_DATA_CONTENT_TYPES = ["multipart/form-data", "application/x-www-form-urlencoded"];
|
|
499
|
+
var MAX_PAYLOAD_SIZE = 1e6;
|
|
500
|
+
var handleServerAction = async ({ request, context, serverFnId }) => {
|
|
501
|
+
const methodUpper = request.method.toUpperCase();
|
|
643
502
|
const url = new URL(request.url);
|
|
644
503
|
const action = await getServerFnById(serverFnId);
|
|
504
|
+
if (action.method && methodUpper !== action.method) return new Response(`expected ${action.method} method. Got ${methodUpper}`, {
|
|
505
|
+
status: 405,
|
|
506
|
+
headers: { Allow: action.method }
|
|
507
|
+
});
|
|
645
508
|
const isServerFn = request.headers.get("x-tsr-serverFn") === "true";
|
|
646
|
-
if (!serovalPlugins)
|
|
647
|
-
serovalPlugins = getDefaultSerovalPlugins();
|
|
648
|
-
}
|
|
509
|
+
if (!serovalPlugins) serovalPlugins = getDefaultSerovalPlugins();
|
|
649
510
|
const contentType = request.headers.get("Content-Type");
|
|
650
511
|
function parsePayload(payload) {
|
|
651
|
-
|
|
652
|
-
return parsedPayload;
|
|
512
|
+
return fromJSON(payload, { plugins: serovalPlugins });
|
|
653
513
|
}
|
|
654
|
-
|
|
514
|
+
return await (async () => {
|
|
655
515
|
try {
|
|
656
516
|
let serializeResult = function(res2) {
|
|
657
517
|
let nonStreamingBody = void 0;
|
|
658
518
|
const alsResponse = getResponse();
|
|
659
519
|
if (res2 !== void 0) {
|
|
660
520
|
const rawStreams = /* @__PURE__ */ new Map();
|
|
661
|
-
const
|
|
662
|
-
(id, stream2)
|
|
663
|
-
|
|
664
|
-
}
|
|
665
|
-
);
|
|
666
|
-
const plugins = [rawStreamPlugin, ...serovalPlugins || []];
|
|
521
|
+
const plugins = [createRawStreamRPCPlugin((id, stream2) => {
|
|
522
|
+
rawStreams.set(id, stream2);
|
|
523
|
+
}), ...serovalPlugins || []];
|
|
667
524
|
let done = false;
|
|
668
525
|
const callbacks = {
|
|
669
526
|
onParse: (value) => {
|
|
@@ -689,41 +546,28 @@ const handleServerAction = async ({
|
|
|
689
546
|
callbacks.onError(error);
|
|
690
547
|
}
|
|
691
548
|
});
|
|
692
|
-
if (done && rawStreams.size === 0) {
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
[X_TSS_SERIALIZED]: "true"
|
|
701
|
-
}
|
|
702
|
-
}
|
|
703
|
-
);
|
|
704
|
-
}
|
|
549
|
+
if (done && rawStreams.size === 0) return new Response(nonStreamingBody ? JSON.stringify(nonStreamingBody) : void 0, {
|
|
550
|
+
status: alsResponse.status,
|
|
551
|
+
statusText: alsResponse.statusText,
|
|
552
|
+
headers: {
|
|
553
|
+
"Content-Type": "application/json",
|
|
554
|
+
[X_TSS_SERIALIZED]: "true"
|
|
555
|
+
}
|
|
556
|
+
});
|
|
705
557
|
if (rawStreams.size > 0) {
|
|
706
|
-
const
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
} catch {
|
|
715
|
-
}
|
|
716
|
-
};
|
|
717
|
-
callbacks.onError = (error) => controller.error(error);
|
|
718
|
-
if (nonStreamingBody !== void 0) {
|
|
719
|
-
callbacks.onParse(nonStreamingBody);
|
|
558
|
+
const multiplexedStream = createMultiplexedStream(new ReadableStream({ start(controller) {
|
|
559
|
+
callbacks.onParse = (value) => {
|
|
560
|
+
controller.enqueue(JSON.stringify(value) + "\n");
|
|
561
|
+
};
|
|
562
|
+
callbacks.onDone = () => {
|
|
563
|
+
try {
|
|
564
|
+
controller.close();
|
|
565
|
+
} catch {
|
|
720
566
|
}
|
|
721
|
-
}
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
rawStreams
|
|
726
|
-
);
|
|
567
|
+
};
|
|
568
|
+
callbacks.onError = (error) => controller.error(error);
|
|
569
|
+
if (nonStreamingBody !== void 0) callbacks.onParse(nonStreamingBody);
|
|
570
|
+
} }), rawStreams);
|
|
727
571
|
return new Response(multiplexedStream, {
|
|
728
572
|
status: alsResponse.status,
|
|
729
573
|
statusText: alsResponse.statusText,
|
|
@@ -733,24 +577,18 @@ const handleServerAction = async ({
|
|
|
733
577
|
}
|
|
734
578
|
});
|
|
735
579
|
}
|
|
736
|
-
const stream = new ReadableStream({
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
controller.close();
|
|
744
|
-
} catch (error) {
|
|
745
|
-
controller.error(error);
|
|
746
|
-
}
|
|
747
|
-
};
|
|
748
|
-
callbacks.onError = (error) => controller.error(error);
|
|
749
|
-
if (nonStreamingBody !== void 0) {
|
|
750
|
-
callbacks.onParse(nonStreamingBody);
|
|
580
|
+
const stream = new ReadableStream({ start(controller) {
|
|
581
|
+
callbacks.onParse = (value) => controller.enqueue(textEncoder.encode(JSON.stringify(value) + "\n"));
|
|
582
|
+
callbacks.onDone = () => {
|
|
583
|
+
try {
|
|
584
|
+
controller.close();
|
|
585
|
+
} catch (error) {
|
|
586
|
+
controller.error(error);
|
|
751
587
|
}
|
|
752
|
-
}
|
|
753
|
-
|
|
588
|
+
};
|
|
589
|
+
callbacks.onError = (error) => controller.error(error);
|
|
590
|
+
if (nonStreamingBody !== void 0) callbacks.onParse(nonStreamingBody);
|
|
591
|
+
} });
|
|
754
592
|
return new Response(stream, {
|
|
755
593
|
status: alsResponse.status,
|
|
756
594
|
statusText: alsResponse.statusText,
|
|
@@ -766,13 +604,8 @@ const handleServerAction = async ({
|
|
|
766
604
|
});
|
|
767
605
|
};
|
|
768
606
|
let res = await (async () => {
|
|
769
|
-
if (FORM_DATA_CONTENT_TYPES.some(
|
|
770
|
-
(
|
|
771
|
-
)) {
|
|
772
|
-
invariant(
|
|
773
|
-
methodLower !== "get",
|
|
774
|
-
"GET requests with FormData payloads are not supported"
|
|
775
|
-
);
|
|
607
|
+
if (FORM_DATA_CONTENT_TYPES.some((type) => contentType && contentType.includes(type))) {
|
|
608
|
+
invariant(methodUpper !== "GET", "GET requests with FormData payloads are not supported");
|
|
776
609
|
const formData = await request.formData();
|
|
777
610
|
const serializedContext = formData.get(TSS_FORMDATA_CONTEXT);
|
|
778
611
|
formData.delete(TSS_FORMDATA_CONTEXT);
|
|
@@ -781,85 +614,54 @@ const handleServerAction = async ({
|
|
|
781
614
|
data: formData,
|
|
782
615
|
method: methodUpper
|
|
783
616
|
};
|
|
784
|
-
if (typeof serializedContext === "string") {
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
});
|
|
790
|
-
if (typeof deserializedContext === "object" && deserializedContext) {
|
|
791
|
-
params.context = safeObjectMerge(
|
|
792
|
-
context,
|
|
793
|
-
deserializedContext
|
|
794
|
-
);
|
|
795
|
-
}
|
|
796
|
-
} catch (e) {
|
|
797
|
-
if (false) ;
|
|
798
|
-
}
|
|
617
|
+
if (typeof serializedContext === "string") try {
|
|
618
|
+
const deserializedContext = fromJSON(JSON.parse(serializedContext), { plugins: serovalPlugins });
|
|
619
|
+
if (typeof deserializedContext === "object" && deserializedContext) params.context = safeObjectMerge(context, deserializedContext);
|
|
620
|
+
} catch (e) {
|
|
621
|
+
if (false) ;
|
|
799
622
|
}
|
|
800
623
|
return await action(params);
|
|
801
624
|
}
|
|
802
|
-
if (
|
|
625
|
+
if (methodUpper === "GET") {
|
|
803
626
|
const payloadParam = url.searchParams.get("payload");
|
|
804
|
-
if (payloadParam && payloadParam.length > MAX_PAYLOAD_SIZE)
|
|
805
|
-
throw new Error("Payload too large");
|
|
806
|
-
}
|
|
627
|
+
if (payloadParam && payloadParam.length > MAX_PAYLOAD_SIZE) throw new Error("Payload too large");
|
|
807
628
|
const payload2 = payloadParam ? parsePayload(JSON.parse(payloadParam)) : {};
|
|
808
629
|
payload2.context = safeObjectMerge(context, payload2.context);
|
|
809
630
|
payload2.method = methodUpper;
|
|
810
631
|
return await action(payload2);
|
|
811
632
|
}
|
|
812
|
-
if (methodLower !== "post") {
|
|
813
|
-
throw new Error("expected POST method");
|
|
814
|
-
}
|
|
815
633
|
let jsonPayload;
|
|
816
|
-
if (contentType?.includes("application/json"))
|
|
817
|
-
jsonPayload = await request.json();
|
|
818
|
-
}
|
|
634
|
+
if (contentType?.includes("application/json")) jsonPayload = await request.json();
|
|
819
635
|
const payload = jsonPayload ? parsePayload(jsonPayload) : {};
|
|
820
636
|
payload.context = safeObjectMerge(payload.context, context);
|
|
821
637
|
payload.method = methodUpper;
|
|
822
638
|
return await action(payload);
|
|
823
639
|
})();
|
|
824
640
|
const unwrapped = res.result || res.error;
|
|
825
|
-
if (isNotFound(res))
|
|
826
|
-
|
|
827
|
-
}
|
|
828
|
-
if (!isServerFn) {
|
|
829
|
-
return unwrapped;
|
|
830
|
-
}
|
|
641
|
+
if (isNotFound(res)) res = isNotFoundResponse(res);
|
|
642
|
+
if (!isServerFn) return unwrapped;
|
|
831
643
|
if (unwrapped instanceof Response) {
|
|
832
|
-
if (isRedirect(unwrapped))
|
|
833
|
-
return unwrapped;
|
|
834
|
-
}
|
|
644
|
+
if (isRedirect(unwrapped)) return unwrapped;
|
|
835
645
|
unwrapped.headers.set(X_TSS_RAW_RESPONSE, "true");
|
|
836
646
|
return unwrapped;
|
|
837
647
|
}
|
|
838
648
|
return serializeResult(res);
|
|
839
649
|
} catch (error) {
|
|
840
|
-
if (error instanceof Response)
|
|
841
|
-
|
|
842
|
-
}
|
|
843
|
-
if (isNotFound(error)) {
|
|
844
|
-
return isNotFoundResponse(error);
|
|
845
|
-
}
|
|
650
|
+
if (error instanceof Response) return error;
|
|
651
|
+
if (isNotFound(error)) return isNotFoundResponse(error);
|
|
846
652
|
console.info();
|
|
847
653
|
console.info("Server Fn Error!");
|
|
848
654
|
console.info();
|
|
849
655
|
console.error(error);
|
|
850
656
|
console.info();
|
|
851
|
-
const serializedError = JSON.stringify(
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
})
|
|
857
|
-
)
|
|
858
|
-
);
|
|
859
|
-
const response2 = getResponse();
|
|
657
|
+
const serializedError = JSON.stringify(await Promise.resolve(toCrossJSONAsync(error, {
|
|
658
|
+
refs: /* @__PURE__ */ new Map(),
|
|
659
|
+
plugins: serovalPlugins
|
|
660
|
+
})));
|
|
661
|
+
const response = getResponse();
|
|
860
662
|
return new Response(serializedError, {
|
|
861
|
-
status:
|
|
862
|
-
statusText:
|
|
663
|
+
status: response.status ?? 500,
|
|
664
|
+
statusText: response.statusText,
|
|
863
665
|
headers: {
|
|
864
666
|
"Content-Type": "application/json",
|
|
865
667
|
[X_TSS_SERIALIZED]: "true"
|
|
@@ -867,7 +669,6 @@ const handleServerAction = async ({
|
|
|
867
669
|
});
|
|
868
670
|
}
|
|
869
671
|
})();
|
|
870
|
-
return response;
|
|
871
672
|
};
|
|
872
673
|
function isNotFoundResponse(error) {
|
|
873
674
|
const { headers, ...rest } = error;
|
|
@@ -888,33 +689,25 @@ function resolveTransformConfig(transform) {
|
|
|
888
689
|
cache: true
|
|
889
690
|
};
|
|
890
691
|
}
|
|
891
|
-
if (typeof transform === "function") {
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
createTransform: transform.createTransform,
|
|
902
|
-
cache: transform.cache !== false
|
|
903
|
-
};
|
|
904
|
-
}
|
|
905
|
-
const transformFn = typeof transform.transform === "string" ? (({ url }) => `${transform.transform}${url}`) : transform.transform;
|
|
692
|
+
if (typeof transform === "function") return {
|
|
693
|
+
type: "transform",
|
|
694
|
+
transformFn: transform,
|
|
695
|
+
cache: true
|
|
696
|
+
};
|
|
697
|
+
if ("createTransform" in transform && transform.createTransform) return {
|
|
698
|
+
type: "createTransform",
|
|
699
|
+
createTransform: transform.createTransform,
|
|
700
|
+
cache: transform.cache !== false
|
|
701
|
+
};
|
|
906
702
|
return {
|
|
907
703
|
type: "transform",
|
|
908
|
-
transformFn,
|
|
704
|
+
transformFn: typeof transform.transform === "string" ? (({ url }) => `${transform.transform}${url}`) : transform.transform,
|
|
909
705
|
cache: transform.cache !== false
|
|
910
706
|
};
|
|
911
707
|
}
|
|
912
708
|
function buildClientEntryScriptTag(clientEntry, injectedHeadScripts) {
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
if (injectedHeadScripts) {
|
|
916
|
-
script = `${injectedHeadScripts};${script}`;
|
|
917
|
-
}
|
|
709
|
+
let script = `import(${JSON.stringify(clientEntry)})`;
|
|
710
|
+
if (injectedHeadScripts) script = `${injectedHeadScripts};${script}`;
|
|
918
711
|
return {
|
|
919
712
|
tag: "script",
|
|
920
713
|
attrs: {
|
|
@@ -928,66 +721,41 @@ function transformManifestUrls(source, transformFn, opts) {
|
|
|
928
721
|
return (async () => {
|
|
929
722
|
const manifest2 = opts?.clone ? structuredClone(source.manifest) : source.manifest;
|
|
930
723
|
for (const route of Object.values(manifest2.routes)) {
|
|
931
|
-
if (route.preloads) {
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
)
|
|
936
|
-
);
|
|
937
|
-
}
|
|
724
|
+
if (route.preloads) route.preloads = await Promise.all(route.preloads.map((url) => Promise.resolve(transformFn({
|
|
725
|
+
url,
|
|
726
|
+
type: "modulepreload"
|
|
727
|
+
}))));
|
|
938
728
|
if (route.assets) {
|
|
939
|
-
for (const asset of route.assets) {
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
url: asset.attrs.href,
|
|
944
|
-
type: "stylesheet"
|
|
945
|
-
})
|
|
946
|
-
);
|
|
947
|
-
}
|
|
948
|
-
}
|
|
729
|
+
for (const asset of route.assets) if (asset.tag === "link" && asset.attrs?.href) asset.attrs.href = await Promise.resolve(transformFn({
|
|
730
|
+
url: asset.attrs.href,
|
|
731
|
+
type: "stylesheet"
|
|
732
|
+
}));
|
|
949
733
|
}
|
|
950
734
|
}
|
|
951
|
-
const transformedClientEntry = await Promise.resolve(
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
})
|
|
956
|
-
);
|
|
735
|
+
const transformedClientEntry = await Promise.resolve(transformFn({
|
|
736
|
+
url: source.clientEntry,
|
|
737
|
+
type: "clientEntry"
|
|
738
|
+
}));
|
|
957
739
|
const rootRoute = manifest2.routes[rootRouteId];
|
|
958
740
|
if (rootRoute) {
|
|
959
741
|
rootRoute.assets = rootRoute.assets || [];
|
|
960
|
-
rootRoute.assets.push(
|
|
961
|
-
buildClientEntryScriptTag(
|
|
962
|
-
transformedClientEntry,
|
|
963
|
-
source.injectedHeadScripts
|
|
964
|
-
)
|
|
965
|
-
);
|
|
742
|
+
rootRoute.assets.push(buildClientEntryScriptTag(transformedClientEntry, source.injectedHeadScripts));
|
|
966
743
|
}
|
|
967
744
|
return manifest2;
|
|
968
745
|
})();
|
|
969
746
|
}
|
|
970
747
|
function buildManifestWithClientEntry(source) {
|
|
971
|
-
const scriptTag = buildClientEntryScriptTag(
|
|
972
|
-
source.clientEntry,
|
|
973
|
-
source.injectedHeadScripts
|
|
974
|
-
);
|
|
748
|
+
const scriptTag = buildClientEntryScriptTag(source.clientEntry, source.injectedHeadScripts);
|
|
975
749
|
const baseRootRoute = source.manifest.routes[rootRouteId];
|
|
976
|
-
|
|
750
|
+
return { routes: {
|
|
977
751
|
...source.manifest.routes,
|
|
978
|
-
...baseRootRoute ? {
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
} : {}
|
|
984
|
-
};
|
|
985
|
-
return { routes };
|
|
752
|
+
...baseRootRoute ? { [rootRouteId]: {
|
|
753
|
+
...baseRootRoute,
|
|
754
|
+
assets: [...baseRootRoute.assets || [], scriptTag]
|
|
755
|
+
} } : {}
|
|
756
|
+
} };
|
|
986
757
|
}
|
|
987
|
-
|
|
988
|
-
TSS_SHELL: "X-TSS_SHELL"
|
|
989
|
-
};
|
|
990
|
-
const ServerFunctionSerializationAdapter = createSerializationAdapter({
|
|
758
|
+
var ServerFunctionSerializationAdapter = createSerializationAdapter({
|
|
991
759
|
key: "$TSS/serverfn",
|
|
992
760
|
test: (v) => {
|
|
993
761
|
if (typeof v !== "function") return false;
|
|
@@ -997,42 +765,32 @@ const ServerFunctionSerializationAdapter = createSerializationAdapter({
|
|
|
997
765
|
toSerializable: ({ serverFnMeta }) => ({ functionId: serverFnMeta.id }),
|
|
998
766
|
fromSerializable: ({ functionId }) => {
|
|
999
767
|
const fn = async (opts, signal) => {
|
|
1000
|
-
|
|
1001
|
-
const result = await serverFn(opts ?? {}, signal);
|
|
1002
|
-
return result.result;
|
|
768
|
+
return (await (await getServerFnById(functionId))(opts ?? {}, signal)).result;
|
|
1003
769
|
};
|
|
1004
770
|
return fn;
|
|
1005
771
|
}
|
|
1006
772
|
});
|
|
1007
773
|
function getStartResponseHeaders(opts) {
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
},
|
|
1012
|
-
...opts.router.state.matches.map((match) => {
|
|
1013
|
-
return match.headers;
|
|
1014
|
-
})
|
|
1015
|
-
);
|
|
1016
|
-
return headers;
|
|
774
|
+
return mergeHeaders({ "Content-Type": "text/html; charset=utf-8" }, ...opts.router.state.matches.map((match) => {
|
|
775
|
+
return match.headers;
|
|
776
|
+
}));
|
|
1017
777
|
}
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
778
|
+
var entriesPromise;
|
|
779
|
+
var baseManifestPromise;
|
|
780
|
+
var cachedFinalManifestPromise;
|
|
1021
781
|
async function loadEntries() {
|
|
1022
|
-
const routerEntry = await import("./assets/router-
|
|
1023
|
-
|
|
1024
|
-
|
|
782
|
+
const routerEntry = await import("./assets/router-DAepjaOj.js").then((n) => n.r);
|
|
783
|
+
return {
|
|
784
|
+
startEntry: await import("./assets/start-HYkvq4Ni.js"),
|
|
785
|
+
routerEntry
|
|
786
|
+
};
|
|
1025
787
|
}
|
|
1026
788
|
function getEntries() {
|
|
1027
|
-
if (!entriesPromise)
|
|
1028
|
-
entriesPromise = loadEntries();
|
|
1029
|
-
}
|
|
789
|
+
if (!entriesPromise) entriesPromise = loadEntries();
|
|
1030
790
|
return entriesPromise;
|
|
1031
791
|
}
|
|
1032
792
|
function getBaseManifest(matchedRoutes) {
|
|
1033
|
-
if (!baseManifestPromise)
|
|
1034
|
-
baseManifestPromise = getStartManifest();
|
|
1035
|
-
}
|
|
793
|
+
if (!baseManifestPromise) baseManifestPromise = getStartManifest();
|
|
1036
794
|
return baseManifestPromise;
|
|
1037
795
|
}
|
|
1038
796
|
async function resolveManifest(matchedRoutes, transformFn, cache) {
|
|
@@ -1041,19 +799,17 @@ async function resolveManifest(matchedRoutes, transformFn, cache) {
|
|
|
1041
799
|
return transformFn ? await transformManifestUrls(base, transformFn, { clone: !cache }) : buildManifestWithClientEntry(base);
|
|
1042
800
|
};
|
|
1043
801
|
if (!transformFn || cache) {
|
|
1044
|
-
if (!cachedFinalManifestPromise)
|
|
1045
|
-
cachedFinalManifestPromise = computeFinalManifest();
|
|
1046
|
-
}
|
|
802
|
+
if (!cachedFinalManifestPromise) cachedFinalManifestPromise = computeFinalManifest();
|
|
1047
803
|
return cachedFinalManifestPromise;
|
|
1048
804
|
}
|
|
1049
805
|
return computeFinalManifest();
|
|
1050
806
|
}
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
807
|
+
var ROUTER_BASEPATH = "/";
|
|
808
|
+
var SERVER_FN_BASE = "/_serverFn/";
|
|
809
|
+
var IS_PRERENDERING = process.env.TSS_PRERENDERING === "true";
|
|
810
|
+
var IS_SHELL_ENV = process.env.TSS_SHELL === "true";
|
|
811
|
+
var ERR_NO_RESPONSE = "Internal Server Error";
|
|
812
|
+
var ERR_NO_DEFER = "Internal Server Error";
|
|
1057
813
|
function throwRouteHandlerError() {
|
|
1058
814
|
throw new Error(ERR_NO_RESPONSE);
|
|
1059
815
|
}
|
|
@@ -1064,30 +820,25 @@ function isSpecialResponse(value) {
|
|
|
1064
820
|
return value instanceof Response || isRedirect(value);
|
|
1065
821
|
}
|
|
1066
822
|
function handleCtxResult(result) {
|
|
1067
|
-
if (isSpecialResponse(result)) {
|
|
1068
|
-
return { response: result };
|
|
1069
|
-
}
|
|
823
|
+
if (isSpecialResponse(result)) return { response: result };
|
|
1070
824
|
return result;
|
|
1071
825
|
}
|
|
1072
826
|
function executeMiddleware(middlewares, ctx) {
|
|
1073
827
|
let index = -1;
|
|
1074
828
|
const next = async (nextCtx) => {
|
|
1075
829
|
if (nextCtx) {
|
|
1076
|
-
if (nextCtx.context)
|
|
1077
|
-
|
|
1078
|
-
}
|
|
1079
|
-
for (const key of Object.keys(nextCtx)) {
|
|
1080
|
-
if (key !== "context") {
|
|
1081
|
-
ctx[key] = nextCtx[key];
|
|
1082
|
-
}
|
|
1083
|
-
}
|
|
830
|
+
if (nextCtx.context) ctx.context = safeObjectMerge(ctx.context, nextCtx.context);
|
|
831
|
+
for (const key of Object.keys(nextCtx)) if (key !== "context") ctx[key] = nextCtx[key];
|
|
1084
832
|
}
|
|
1085
833
|
index++;
|
|
1086
834
|
const middleware = middlewares[index];
|
|
1087
835
|
if (!middleware) return ctx;
|
|
1088
836
|
let result;
|
|
1089
837
|
try {
|
|
1090
|
-
result = await middleware({
|
|
838
|
+
result = await middleware({
|
|
839
|
+
...ctx,
|
|
840
|
+
next
|
|
841
|
+
});
|
|
1091
842
|
} catch (err) {
|
|
1092
843
|
if (isSpecialResponse(err)) {
|
|
1093
844
|
ctx.response = err;
|
|
@@ -1097,26 +848,21 @@ function executeMiddleware(middlewares, ctx) {
|
|
|
1097
848
|
}
|
|
1098
849
|
const normalized = handleCtxResult(result);
|
|
1099
850
|
if (normalized) {
|
|
1100
|
-
if (normalized.response !== void 0)
|
|
1101
|
-
|
|
1102
|
-
}
|
|
1103
|
-
if (normalized.context) {
|
|
1104
|
-
ctx.context = safeObjectMerge(ctx.context, normalized.context);
|
|
1105
|
-
}
|
|
851
|
+
if (normalized.response !== void 0) ctx.response = normalized.response;
|
|
852
|
+
if (normalized.context) ctx.context = safeObjectMerge(ctx.context, normalized.context);
|
|
1106
853
|
}
|
|
1107
854
|
return ctx;
|
|
1108
855
|
};
|
|
1109
856
|
return next();
|
|
1110
857
|
}
|
|
1111
858
|
function handlerToMiddleware(handler, mayDefer = false) {
|
|
1112
|
-
if (mayDefer)
|
|
1113
|
-
return handler;
|
|
1114
|
-
}
|
|
859
|
+
if (mayDefer) return handler;
|
|
1115
860
|
return async (ctx) => {
|
|
1116
|
-
const response = await handler({
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
}
|
|
861
|
+
const response = await handler({
|
|
862
|
+
...ctx,
|
|
863
|
+
next: throwIfMayNotDefer
|
|
864
|
+
});
|
|
865
|
+
if (!response) throwRouteHandlerError();
|
|
1120
866
|
return response;
|
|
1121
867
|
};
|
|
1122
868
|
}
|
|
@@ -1131,11 +877,7 @@ function createStartHandler(cbOrOptions) {
|
|
|
1131
877
|
if (!resolvedTransformConfig) return void 0;
|
|
1132
878
|
if (resolvedTransformConfig.type === "createTransform") {
|
|
1133
879
|
if (cache) {
|
|
1134
|
-
if (!cachedCreateTransformPromise)
|
|
1135
|
-
cachedCreateTransformPromise = Promise.resolve(
|
|
1136
|
-
resolvedTransformConfig.createTransform(opts)
|
|
1137
|
-
);
|
|
1138
|
-
}
|
|
880
|
+
if (!cachedCreateTransformPromise) cachedCreateTransformPromise = Promise.resolve(resolvedTransformConfig.createTransform(opts));
|
|
1139
881
|
return cachedCreateTransformPromise;
|
|
1140
882
|
}
|
|
1141
883
|
return resolvedTransformConfig.createTransform(opts);
|
|
@@ -1150,9 +892,7 @@ function createStartHandler(cbOrOptions) {
|
|
|
1150
892
|
})();
|
|
1151
893
|
cachedFinalManifestPromise = warmupPromise;
|
|
1152
894
|
warmupPromise.catch(() => {
|
|
1153
|
-
if (cachedFinalManifestPromise === warmupPromise)
|
|
1154
|
-
cachedFinalManifestPromise = void 0;
|
|
1155
|
-
}
|
|
895
|
+
if (cachedFinalManifestPromise === warmupPromise) cachedFinalManifestPromise = void 0;
|
|
1156
896
|
cachedCreateTransformPromise = void 0;
|
|
1157
897
|
});
|
|
1158
898
|
}
|
|
@@ -1163,98 +903,62 @@ function createStartHandler(cbOrOptions) {
|
|
|
1163
903
|
const { url, handledProtocolRelativeURL } = getNormalizedURL(request.url);
|
|
1164
904
|
const href = url.pathname + url.search + url.hash;
|
|
1165
905
|
const origin = getOrigin(request);
|
|
1166
|
-
if (handledProtocolRelativeURL)
|
|
1167
|
-
return Response.redirect(url, 308);
|
|
1168
|
-
}
|
|
906
|
+
if (handledProtocolRelativeURL) return Response.redirect(url, 308);
|
|
1169
907
|
const entries = await getEntries();
|
|
1170
908
|
const startOptions = await entries.startEntry.startInstance?.getOptions() || {};
|
|
1171
|
-
const serializationAdapters = [
|
|
1172
|
-
...startOptions.serializationAdapters || [],
|
|
1173
|
-
ServerFunctionSerializationAdapter
|
|
1174
|
-
];
|
|
909
|
+
const serializationAdapters = [...startOptions.serializationAdapters || [], ServerFunctionSerializationAdapter];
|
|
1175
910
|
const requestStartOptions = {
|
|
1176
911
|
...startOptions,
|
|
1177
912
|
serializationAdapters
|
|
1178
913
|
};
|
|
1179
914
|
const flattenedRequestMiddlewares = startOptions.requestMiddleware ? flattenMiddlewares(startOptions.requestMiddleware) : [];
|
|
1180
|
-
const executedRequestMiddlewares = new Set(
|
|
1181
|
-
flattenedRequestMiddlewares
|
|
1182
|
-
);
|
|
915
|
+
const executedRequestMiddlewares = new Set(flattenedRequestMiddlewares);
|
|
1183
916
|
const getRouter = async () => {
|
|
1184
917
|
if (router) return router;
|
|
1185
918
|
router = await entries.routerEntry.getRouter();
|
|
1186
919
|
let isShell = IS_SHELL_ENV;
|
|
1187
|
-
if (IS_PRERENDERING && !isShell)
|
|
1188
|
-
|
|
1189
|
-
}
|
|
1190
|
-
const history = createMemoryHistory({
|
|
1191
|
-
initialEntries: [href]
|
|
1192
|
-
});
|
|
920
|
+
if (IS_PRERENDERING && !isShell) isShell = request.headers.get(HEADERS.TSS_SHELL) === "true";
|
|
921
|
+
const history = createMemoryHistory({ initialEntries: [href] });
|
|
1193
922
|
router.update({
|
|
1194
923
|
history,
|
|
1195
924
|
isShell,
|
|
1196
925
|
isPrerendering: IS_PRERENDERING,
|
|
1197
926
|
origin: router.options.origin ?? origin,
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
serializationAdapters: [
|
|
1201
|
-
...requestStartOptions.serializationAdapters,
|
|
1202
|
-
...router.options.serializationAdapters || []
|
|
1203
|
-
]
|
|
1204
|
-
},
|
|
927
|
+
defaultSsr: requestStartOptions.defaultSsr,
|
|
928
|
+
serializationAdapters: [...requestStartOptions.serializationAdapters, ...router.options.serializationAdapters || []],
|
|
1205
929
|
basepath: ROUTER_BASEPATH
|
|
1206
930
|
});
|
|
1207
931
|
return router;
|
|
1208
932
|
};
|
|
1209
933
|
if (SERVER_FN_BASE && url.pathname.startsWith(SERVER_FN_BASE)) {
|
|
1210
934
|
const serverFnId = url.pathname.slice(SERVER_FN_BASE.length).split("/")[0];
|
|
1211
|
-
if (!serverFnId)
|
|
1212
|
-
throw new Error("Invalid server action param for serverFnId");
|
|
1213
|
-
}
|
|
935
|
+
if (!serverFnId) throw new Error("Invalid server action param for serverFnId");
|
|
1214
936
|
const serverFnHandler = async ({ context }) => {
|
|
1215
|
-
return runWithStartContext(
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
serverFnId
|
|
1227
|
-
})
|
|
1228
|
-
);
|
|
937
|
+
return runWithStartContext({
|
|
938
|
+
getRouter,
|
|
939
|
+
startOptions: requestStartOptions,
|
|
940
|
+
contextAfterGlobalMiddlewares: context,
|
|
941
|
+
request,
|
|
942
|
+
executedRequestMiddlewares
|
|
943
|
+
}, () => handleServerAction({
|
|
944
|
+
request,
|
|
945
|
+
context: requestOpts?.context,
|
|
946
|
+
serverFnId
|
|
947
|
+
}));
|
|
1229
948
|
};
|
|
1230
|
-
|
|
1231
|
-
(d) => d.options.server
|
|
1232
|
-
);
|
|
1233
|
-
const ctx2 = await executeMiddleware([...middlewares2, serverFnHandler], {
|
|
949
|
+
return handleRedirectResponse((await executeMiddleware([...flattenedRequestMiddlewares.map((d) => d.options.server), serverFnHandler], {
|
|
1234
950
|
request,
|
|
1235
951
|
pathname: url.pathname,
|
|
1236
952
|
context: createNullProtoObject(requestOpts?.context)
|
|
1237
|
-
});
|
|
1238
|
-
return handleRedirectResponse(ctx2.response, request, getRouter);
|
|
953
|
+
})).response, request, getRouter);
|
|
1239
954
|
}
|
|
1240
955
|
const executeRouter = async (serverContext, matchedRoutes) => {
|
|
1241
|
-
const
|
|
1242
|
-
|
|
1243
|
-
const
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
);
|
|
1247
|
-
if (!isSupported) {
|
|
1248
|
-
return Response.json(
|
|
1249
|
-
{ error: "Only HTML requests are supported here" },
|
|
1250
|
-
{ status: 500 }
|
|
1251
|
-
);
|
|
1252
|
-
}
|
|
1253
|
-
const manifest2 = await resolveManifest(
|
|
1254
|
-
matchedRoutes,
|
|
1255
|
-
await getTransformFn({ warmup: false, request }),
|
|
1256
|
-
cache
|
|
1257
|
-
);
|
|
956
|
+
const acceptParts = (request.headers.get("Accept") || "*/*").split(",");
|
|
957
|
+
if (!["*/*", "text/html"].some((mimeType) => acceptParts.some((part) => part.trim().startsWith(mimeType)))) return Response.json({ error: "Only HTML requests are supported here" }, { status: 500 });
|
|
958
|
+
const manifest2 = await resolveManifest(matchedRoutes, await getTransformFn({
|
|
959
|
+
warmup: false,
|
|
960
|
+
request
|
|
961
|
+
}), cache);
|
|
1258
962
|
const routerInstance = await getRouter();
|
|
1259
963
|
attachRouterServerSsrUtils({
|
|
1260
964
|
router: routerInstance,
|
|
@@ -1262,13 +966,9 @@ function createStartHandler(cbOrOptions) {
|
|
|
1262
966
|
});
|
|
1263
967
|
routerInstance.update({ additionalContext: { serverContext } });
|
|
1264
968
|
await routerInstance.load();
|
|
1265
|
-
if (routerInstance.state.redirect)
|
|
1266
|
-
return routerInstance.state.redirect;
|
|
1267
|
-
}
|
|
969
|
+
if (routerInstance.state.redirect) return routerInstance.state.redirect;
|
|
1268
970
|
await routerInstance.serverSsr.dehydrate();
|
|
1269
|
-
const responseHeaders = getStartResponseHeaders({
|
|
1270
|
-
router: routerInstance
|
|
1271
|
-
});
|
|
971
|
+
const responseHeaders = getStartResponseHeaders({ router: routerInstance });
|
|
1272
972
|
cbWillCleanup = true;
|
|
1273
973
|
return cb({
|
|
1274
974
|
request,
|
|
@@ -1277,103 +977,66 @@ function createStartHandler(cbOrOptions) {
|
|
|
1277
977
|
});
|
|
1278
978
|
};
|
|
1279
979
|
const requestHandlerMiddleware = async ({ context }) => {
|
|
1280
|
-
return runWithStartContext(
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
if (err instanceof Response) {
|
|
1300
|
-
return err;
|
|
1301
|
-
}
|
|
1302
|
-
throw err;
|
|
1303
|
-
}
|
|
980
|
+
return runWithStartContext({
|
|
981
|
+
getRouter,
|
|
982
|
+
startOptions: requestStartOptions,
|
|
983
|
+
contextAfterGlobalMiddlewares: context,
|
|
984
|
+
request,
|
|
985
|
+
executedRequestMiddlewares
|
|
986
|
+
}, async () => {
|
|
987
|
+
try {
|
|
988
|
+
return await handleServerRoutes({
|
|
989
|
+
getRouter,
|
|
990
|
+
request,
|
|
991
|
+
url,
|
|
992
|
+
executeRouter,
|
|
993
|
+
context,
|
|
994
|
+
executedRequestMiddlewares
|
|
995
|
+
});
|
|
996
|
+
} catch (err) {
|
|
997
|
+
if (err instanceof Response) return err;
|
|
998
|
+
throw err;
|
|
1304
999
|
}
|
|
1305
|
-
);
|
|
1000
|
+
});
|
|
1306
1001
|
};
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
{
|
|
1313
|
-
request,
|
|
1314
|
-
pathname: url.pathname,
|
|
1315
|
-
context: createNullProtoObject(requestOpts?.context)
|
|
1316
|
-
}
|
|
1317
|
-
);
|
|
1318
|
-
return handleRedirectResponse(ctx.response, request, getRouter);
|
|
1002
|
+
return handleRedirectResponse((await executeMiddleware([...flattenedRequestMiddlewares.map((d) => d.options.server), requestHandlerMiddleware], {
|
|
1003
|
+
request,
|
|
1004
|
+
pathname: url.pathname,
|
|
1005
|
+
context: createNullProtoObject(requestOpts?.context)
|
|
1006
|
+
})).response, request, getRouter);
|
|
1319
1007
|
} finally {
|
|
1320
|
-
if (router && !cbWillCleanup)
|
|
1321
|
-
router.serverSsr?.cleanup();
|
|
1322
|
-
}
|
|
1008
|
+
if (router && !cbWillCleanup) router.serverSsr?.cleanup();
|
|
1323
1009
|
router = null;
|
|
1324
1010
|
}
|
|
1325
1011
|
};
|
|
1326
1012
|
return requestHandler(startRequestResolver);
|
|
1327
1013
|
}
|
|
1328
1014
|
async function handleRedirectResponse(response, request, getRouter) {
|
|
1329
|
-
if (!isRedirect(response))
|
|
1330
|
-
return response;
|
|
1331
|
-
}
|
|
1015
|
+
if (!isRedirect(response)) return response;
|
|
1332
1016
|
if (isResolvedRedirect(response)) {
|
|
1333
|
-
if (request.headers.get("x-tsr-serverFn") === "true") {
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
);
|
|
1338
|
-
}
|
|
1017
|
+
if (request.headers.get("x-tsr-serverFn") === "true") return Response.json({
|
|
1018
|
+
...response.options,
|
|
1019
|
+
isSerializedRedirect: true
|
|
1020
|
+
}, { headers: response.headers });
|
|
1339
1021
|
return response;
|
|
1340
1022
|
}
|
|
1341
1023
|
const opts = response.options;
|
|
1342
|
-
if (opts.to && typeof opts.to === "string" && !opts.to.startsWith("/")) {
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
)) {
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
).filter((d) => typeof opts[d] === "function").map((d) => `"${d}"`).join(", ")}`
|
|
1354
|
-
);
|
|
1355
|
-
}
|
|
1356
|
-
const router = await getRouter();
|
|
1357
|
-
const redirect = router.resolveRedirect(response);
|
|
1358
|
-
if (request.headers.get("x-tsr-serverFn") === "true") {
|
|
1359
|
-
return Response.json(
|
|
1360
|
-
{ ...response.options, isSerializedRedirect: true },
|
|
1361
|
-
{ headers: response.headers }
|
|
1362
|
-
);
|
|
1363
|
-
}
|
|
1024
|
+
if (opts.to && typeof opts.to === "string" && !opts.to.startsWith("/")) throw new Error(`Server side redirects must use absolute paths via the 'href' or 'to' options. The redirect() method's "to" property accepts an internal path only. Use the "href" property to provide an external URL. Received: ${JSON.stringify(opts)}`);
|
|
1025
|
+
if ([
|
|
1026
|
+
"params",
|
|
1027
|
+
"search",
|
|
1028
|
+
"hash"
|
|
1029
|
+
].some((d) => typeof opts[d] === "function")) throw new Error(`Server side redirects must use static search, params, and hash values and do not support functional values. Received functional values for: ${Object.keys(opts).filter((d) => typeof opts[d] === "function").map((d) => `"${d}"`).join(", ")}`);
|
|
1030
|
+
const redirect = (await getRouter()).resolveRedirect(response);
|
|
1031
|
+
if (request.headers.get("x-tsr-serverFn") === "true") return Response.json({
|
|
1032
|
+
...response.options,
|
|
1033
|
+
isSerializedRedirect: true
|
|
1034
|
+
}, { headers: response.headers });
|
|
1364
1035
|
return redirect;
|
|
1365
1036
|
}
|
|
1366
|
-
async function handleServerRoutes({
|
|
1367
|
-
getRouter,
|
|
1368
|
-
request,
|
|
1369
|
-
url,
|
|
1370
|
-
executeRouter,
|
|
1371
|
-
context,
|
|
1372
|
-
executedRequestMiddlewares
|
|
1373
|
-
}) {
|
|
1037
|
+
async function handleServerRoutes({ getRouter, request, url, executeRouter, context, executedRequestMiddlewares }) {
|
|
1374
1038
|
const router = await getRouter();
|
|
1375
|
-
const
|
|
1376
|
-
const pathname = rewrittenUrl.pathname;
|
|
1039
|
+
const pathname = executeRewriteInput(router.rewrite, url).pathname;
|
|
1377
1040
|
const { matchedRoutes, foundRoute, routeParams } = router.getMatchedRoutes(pathname);
|
|
1378
1041
|
const isExactMatch = foundRoute && routeParams["**"] === void 0;
|
|
1379
1042
|
const routeMiddlewares = [];
|
|
@@ -1381,45 +1044,32 @@ async function handleServerRoutes({
|
|
|
1381
1044
|
const serverMiddleware = route.options.server?.middleware;
|
|
1382
1045
|
if (serverMiddleware) {
|
|
1383
1046
|
const flattened = flattenMiddlewares(serverMiddleware);
|
|
1384
|
-
for (const m of flattened)
|
|
1385
|
-
if (!executedRequestMiddlewares.has(m)) {
|
|
1386
|
-
routeMiddlewares.push(m.options.server);
|
|
1387
|
-
}
|
|
1388
|
-
}
|
|
1047
|
+
for (const m of flattened) if (!executedRequestMiddlewares.has(m)) routeMiddlewares.push(m.options.server);
|
|
1389
1048
|
}
|
|
1390
1049
|
}
|
|
1391
1050
|
const server2 = foundRoute?.options.server;
|
|
1392
1051
|
if (server2?.handlers && isExactMatch) {
|
|
1393
1052
|
const handlers = typeof server2.handlers === "function" ? server2.handlers({ createHandlers: (d) => d }) : server2.handlers;
|
|
1394
|
-
const
|
|
1395
|
-
const handler = handlers[requestMethod] ?? handlers["ANY"];
|
|
1053
|
+
const handler = handlers[request.method.toUpperCase()] ?? handlers["ANY"];
|
|
1396
1054
|
if (handler) {
|
|
1397
1055
|
const mayDefer = !!foundRoute.options.component;
|
|
1398
|
-
if (typeof handler === "function")
|
|
1399
|
-
|
|
1400
|
-
} else {
|
|
1056
|
+
if (typeof handler === "function") routeMiddlewares.push(handlerToMiddleware(handler, mayDefer));
|
|
1057
|
+
else {
|
|
1401
1058
|
if (handler.middleware?.length) {
|
|
1402
1059
|
const handlerMiddlewares = flattenMiddlewares(handler.middleware);
|
|
1403
|
-
for (const m of handlerMiddlewares)
|
|
1404
|
-
routeMiddlewares.push(m.options.server);
|
|
1405
|
-
}
|
|
1406
|
-
}
|
|
1407
|
-
if (handler.handler) {
|
|
1408
|
-
routeMiddlewares.push(handlerToMiddleware(handler.handler, mayDefer));
|
|
1060
|
+
for (const m of handlerMiddlewares) routeMiddlewares.push(m.options.server);
|
|
1409
1061
|
}
|
|
1062
|
+
if (handler.handler) routeMiddlewares.push(handlerToMiddleware(handler.handler, mayDefer));
|
|
1410
1063
|
}
|
|
1411
1064
|
}
|
|
1412
1065
|
}
|
|
1413
|
-
routeMiddlewares.push(
|
|
1414
|
-
|
|
1415
|
-
);
|
|
1416
|
-
const ctx = await executeMiddleware(routeMiddlewares, {
|
|
1066
|
+
routeMiddlewares.push((ctx) => executeRouter(ctx.context, matchedRoutes));
|
|
1067
|
+
return (await executeMiddleware(routeMiddlewares, {
|
|
1417
1068
|
request,
|
|
1418
1069
|
context,
|
|
1419
1070
|
params: routeParams,
|
|
1420
1071
|
pathname
|
|
1421
|
-
});
|
|
1422
|
-
return ctx.response;
|
|
1072
|
+
})).response;
|
|
1423
1073
|
}
|
|
1424
1074
|
const fetch = createStartHandler(defaultStreamHandler);
|
|
1425
1075
|
function createServerEntry(entry) {
|