effect-inspect 0.1.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/README.md +122 -0
- package/app/dist/client/assets/index-smV05cfr.js +25 -0
- package/app/dist/client/assets/rolldown-runtime-CbXtAM7H.js +1 -0
- package/app/dist/client/assets/routes-TKgeFdSW.js +5 -0
- package/app/dist/client/assets/styles-B3rAZGvS.css +2 -0
- package/app/dist/server/assets/_tanstack-start-manifest_v-Co953HeC.js +20 -0
- package/app/dist/server/assets/empty-plugin-adapters-D9UWiqvJ.js +5 -0
- package/app/dist/server/assets/router-CN98Ramo.js +491 -0
- package/app/dist/server/assets/routes-eZ4XqxE9.js +3999 -0
- package/app/dist/server/assets/start-5Z2QO8AU.js +4 -0
- package/app/dist/server/server.js +1812 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.js +29 -0
- package/dist/client/Client.d.ts +52 -0
- package/dist/client/Client.js +224 -0
- package/dist/client/Edge.d.ts +31 -0
- package/dist/client/Edge.js +108 -0
- package/dist/client/Inspect.d.ts +49 -0
- package/dist/client/Inspect.js +55 -0
- package/dist/client/Tracer.d.ts +31 -0
- package/dist/client/Tracer.js +119 -0
- package/dist/collector/Config.d.ts +8 -0
- package/dist/collector/Config.js +9 -0
- package/dist/collector/Server.d.ts +24 -0
- package/dist/collector/Server.js +172 -0
- package/dist/collector/Store.d.ts +86 -0
- package/dist/collector/Store.js +119 -0
- package/dist/collector/WebApp.d.ts +3 -0
- package/dist/collector/WebApp.js +36 -0
- package/dist/collector/main.d.ts +1 -0
- package/dist/collector/main.js +22 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +3 -0
- package/dist/protocol/Codec.d.ts +575 -0
- package/dist/protocol/Codec.js +50 -0
- package/dist/protocol/Schema.d.ts +1237 -0
- package/dist/protocol/Schema.js +327 -0
- package/package.json +85 -0
|
@@ -0,0 +1,1812 @@
|
|
|
1
|
+
import "react";
|
|
2
|
+
import { RouterProvider } from "@tanstack/react-router";
|
|
3
|
+
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
import { defineHandlerCallback, renderRouterToStream } from "@tanstack/react-router/ssr/server";
|
|
5
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
6
|
+
import { H3Event, toResponse } from "h3-v2";
|
|
7
|
+
import { _getRenderedMatches, createSerializationAdapter, executeRewriteInput, getScriptPreloadAttrs, getStylesheetHref, invariant, isDangerousProtocol, isNotFound, isPromise, isRedirect, resolveManifestAssetLink, resolveManifestCssLink, rootRouteId } from "@tanstack/router-core";
|
|
8
|
+
import { makeSerovalPlugin, mergeHeaders } from "@tanstack/router-core/ssr/client";
|
|
9
|
+
import { fromJSON, toCrossJSONAsync, toCrossJSONStream } from "seroval";
|
|
10
|
+
import { attachRouterServerSsrUtils, bindSsrResponseToRequest, createRawStreamRPCPlugin, defaultSerovalDeserializerPlugins, disposeSsrResponse, getNormalizedURL, isSsrResponse, normalizeSsrResponse, replaceSsrResponse, stripSsrResponseBody, waitForRequest } from "@tanstack/router-core/ssr/server";
|
|
11
|
+
import { createServerHistory } from "@tanstack/history";
|
|
12
|
+
//#region node_modules/@tanstack/react-start-server/dist/esm/StartServer.js
|
|
13
|
+
function StartServer(props) {
|
|
14
|
+
return /* @__PURE__ */ jsx(RouterProvider, { router: props.router });
|
|
15
|
+
}
|
|
16
|
+
//#endregion
|
|
17
|
+
//#region node_modules/@tanstack/react-start-server/dist/esm/defaultStreamHandler.js
|
|
18
|
+
var defaultStreamHandler = defineHandlerCallback(({ request, router, responseHeaders }) => renderRouterToStream({
|
|
19
|
+
request,
|
|
20
|
+
router,
|
|
21
|
+
responseHeaders,
|
|
22
|
+
children: /* @__PURE__ */ jsx(StartServer, { router })
|
|
23
|
+
}));
|
|
24
|
+
//#endregion
|
|
25
|
+
//#region node_modules/@tanstack/start-server-core/dist/esm/request-response.js
|
|
26
|
+
var GLOBAL_EVENT_STORAGE_KEY = Symbol.for("tanstack-start:event-storage");
|
|
27
|
+
var globalObj$1 = globalThis;
|
|
28
|
+
if (!globalObj$1[GLOBAL_EVENT_STORAGE_KEY]) globalObj$1[GLOBAL_EVENT_STORAGE_KEY] = new AsyncLocalStorage();
|
|
29
|
+
var eventStorage = globalObj$1[GLOBAL_EVENT_STORAGE_KEY];
|
|
30
|
+
function isPromiseLike(value) {
|
|
31
|
+
return typeof value.then === "function";
|
|
32
|
+
}
|
|
33
|
+
function getSetCookieValues(headers) {
|
|
34
|
+
const headersWithSetCookie = headers;
|
|
35
|
+
if (typeof headersWithSetCookie.getSetCookie === "function") return headersWithSetCookie.getSetCookie();
|
|
36
|
+
const value = headers.get("set-cookie");
|
|
37
|
+
return value ? [value] : [];
|
|
38
|
+
}
|
|
39
|
+
function mergeEventResponseHeaders(response, event) {
|
|
40
|
+
if (response.ok) return;
|
|
41
|
+
const eventSetCookies = getSetCookieValues(event.res.headers);
|
|
42
|
+
if (eventSetCookies.length === 0) return;
|
|
43
|
+
const responseSetCookies = getSetCookieValues(response.headers);
|
|
44
|
+
response.headers.delete("set-cookie");
|
|
45
|
+
for (const cookie of responseSetCookies) response.headers.append("set-cookie", cookie);
|
|
46
|
+
for (const cookie of eventSetCookies) response.headers.append("set-cookie", cookie);
|
|
47
|
+
}
|
|
48
|
+
function attachResponseHeaders(value, event) {
|
|
49
|
+
if (isPromiseLike(value)) return value.then((resolved) => {
|
|
50
|
+
if (resolved instanceof Response) mergeEventResponseHeaders(resolved, event);
|
|
51
|
+
return resolved;
|
|
52
|
+
});
|
|
53
|
+
if (value instanceof Response) mergeEventResponseHeaders(value, event);
|
|
54
|
+
return value;
|
|
55
|
+
}
|
|
56
|
+
function requestHandler(handler) {
|
|
57
|
+
return (request, requestOpts) => {
|
|
58
|
+
let h3Event;
|
|
59
|
+
try {
|
|
60
|
+
h3Event = new H3Event(request);
|
|
61
|
+
} catch (error) {
|
|
62
|
+
if (error instanceof URIError) return new Response(null, {
|
|
63
|
+
status: 400,
|
|
64
|
+
statusText: "Bad Request"
|
|
65
|
+
});
|
|
66
|
+
throw error;
|
|
67
|
+
}
|
|
68
|
+
return toResponse(attachResponseHeaders(eventStorage.run({ h3Event }, () => handler(request, requestOpts)), h3Event), h3Event);
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
function getH3Event() {
|
|
72
|
+
const event = eventStorage.getStore();
|
|
73
|
+
if (!event) throw new Error(`No StartEvent found in AsyncLocalStorage. Make sure you are using the function within the server runtime.`);
|
|
74
|
+
return event.h3Event;
|
|
75
|
+
}
|
|
76
|
+
function getResponse() {
|
|
77
|
+
return getH3Event().res;
|
|
78
|
+
}
|
|
79
|
+
//#endregion
|
|
80
|
+
//#region node_modules/@tanstack/start-server-core/dist/esm/constants.js
|
|
81
|
+
var HEADERS = { TSS_SHELL: "X-TSS_SHELL" };
|
|
82
|
+
//#endregion
|
|
83
|
+
//#region node_modules/@tanstack/start-server-core/dist/esm/router-manifest.js
|
|
84
|
+
/**
|
|
85
|
+
* @description Returns the router manifest data that should be sent to the client.
|
|
86
|
+
* This includes only the assets and preloads for the current route and any
|
|
87
|
+
* special assets that are needed for the client. It does not include relationships
|
|
88
|
+
* between routes or any other data that is not needed for the client.
|
|
89
|
+
*
|
|
90
|
+
* @param matchedRoutes - In dev mode, the matched routes are used to build
|
|
91
|
+
* the dev styles URL for route-scoped CSS collection.
|
|
92
|
+
*/
|
|
93
|
+
async function getStartManifest(matchedRoutes) {
|
|
94
|
+
const { tsrStartManifest } = await import("./assets/_tanstack-start-manifest_v-Co953HeC.js");
|
|
95
|
+
const startManifest = tsrStartManifest();
|
|
96
|
+
let routes = startManifest.routes;
|
|
97
|
+
routes[rootRouteId];
|
|
98
|
+
const manifestRoutes = {};
|
|
99
|
+
for (const k in routes) {
|
|
100
|
+
const v = routes[k];
|
|
101
|
+
const result = {};
|
|
102
|
+
if (v.preloads && v.preloads.length > 0) result.preloads = v.preloads;
|
|
103
|
+
if (v.scripts && v.scripts.length > 0) result.scripts = v.scripts;
|
|
104
|
+
if (v.css?.length) result.css = v.css;
|
|
105
|
+
if (result.preloads || result.scripts || result.css) manifestRoutes[k] = result;
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
...startManifest.scriptFormat ? { scriptFormat: startManifest.scriptFormat } : {},
|
|
109
|
+
...startManifest.inlineCss ? { inlineCss: startManifest.inlineCss } : {},
|
|
110
|
+
routes: manifestRoutes
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
//#endregion
|
|
114
|
+
//#region \0%23tanstack-start-server-fn-resolver
|
|
115
|
+
var manifest = {};
|
|
116
|
+
async function getServerFnById(id, access) {
|
|
117
|
+
const serverFnInfo = manifest[id];
|
|
118
|
+
if (!serverFnInfo) throw new Error("Server function info not found for " + id);
|
|
119
|
+
const fnModule = serverFnInfo.module ??= await serverFnInfo.importer();
|
|
120
|
+
if (!fnModule) throw new Error("Server function module not resolved for " + id);
|
|
121
|
+
const action = fnModule[serverFnInfo.functionName];
|
|
122
|
+
if (!action) throw new Error("Server function module export not resolved for serverFn ID: " + id);
|
|
123
|
+
return action;
|
|
124
|
+
}
|
|
125
|
+
//#endregion
|
|
126
|
+
//#region node_modules/@tanstack/start-client-core/dist/esm/constants.js
|
|
127
|
+
var TSS_FORMDATA_CONTEXT = "__TSS_CONTEXT";
|
|
128
|
+
var TSS_SERVER_FUNCTION = Symbol.for("TSS_SERVER_FUNCTION");
|
|
129
|
+
var X_TSS_SERIALIZED = "x-tss-serialized";
|
|
130
|
+
var X_TSS_RAW_RESPONSE = "x-tss-raw";
|
|
131
|
+
/** Content-Type for multiplexed framed responses (RawStream support) */
|
|
132
|
+
var TSS_CONTENT_TYPE_FRAMED = "application/x-tss-framed";
|
|
133
|
+
/** Largest payload accepted by one framed-protocol record. */
|
|
134
|
+
var MAX_FRAME_PAYLOAD_SIZE = 16777216;
|
|
135
|
+
/** Largest number of raw streams accepted in one framed response. */
|
|
136
|
+
var MAX_FRAMED_STREAMS = 1024;
|
|
137
|
+
/** Full Content-Type header value with version parameter */
|
|
138
|
+
var TSS_CONTENT_TYPE_FRAMED_VERSIONED = `${TSS_CONTENT_TYPE_FRAMED}; v=1`;
|
|
139
|
+
//#endregion
|
|
140
|
+
//#region node_modules/@tanstack/start-storage-context/dist/esm/async-local-storage.js
|
|
141
|
+
var GLOBAL_STORAGE_KEY = Symbol.for("tanstack-start:start-storage-context");
|
|
142
|
+
var globalObj = globalThis;
|
|
143
|
+
if (!globalObj[GLOBAL_STORAGE_KEY]) globalObj[GLOBAL_STORAGE_KEY] = new AsyncLocalStorage();
|
|
144
|
+
var startStorage = globalObj[GLOBAL_STORAGE_KEY];
|
|
145
|
+
async function runWithStartContext(context, fn) {
|
|
146
|
+
return startStorage.run(context, fn);
|
|
147
|
+
}
|
|
148
|
+
function getStartContext(opts) {
|
|
149
|
+
const context = startStorage.getStore();
|
|
150
|
+
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.`);
|
|
151
|
+
return context;
|
|
152
|
+
}
|
|
153
|
+
//#endregion
|
|
154
|
+
//#region node_modules/@tanstack/start-client-core/dist/esm/getStartOptions.js
|
|
155
|
+
var getStartOptions = () => getStartContext().startOptions;
|
|
156
|
+
//#endregion
|
|
157
|
+
//#region node_modules/@tanstack/start-client-core/dist/esm/getDefaultSerovalPlugins.js
|
|
158
|
+
/** Start's serialization adapters followed by `routerPlugins`. */
|
|
159
|
+
function getSerovalPlugins(routerPlugins) {
|
|
160
|
+
return [...(getStartOptions()?.serializationAdapters)?.map(makeSerovalPlugin) ?? [], ...routerPlugins];
|
|
161
|
+
}
|
|
162
|
+
//#endregion
|
|
163
|
+
//#region node_modules/@tanstack/start-server-core/dist/esm/frame-protocol.js
|
|
164
|
+
/**
|
|
165
|
+
* Binary frame protocol for multiplexing JSON and raw streams over HTTP.
|
|
166
|
+
*
|
|
167
|
+
* Frame format: [type:1][streamId:4][length:4][payload:length]
|
|
168
|
+
* - type: 1 byte - frame type (JSON, CHUNK, END, ERROR)
|
|
169
|
+
* - streamId: 4 bytes big-endian uint32 - stream identifier
|
|
170
|
+
* - length: 4 bytes big-endian uint32 - payload length
|
|
171
|
+
* - payload: variable length bytes
|
|
172
|
+
*/
|
|
173
|
+
/** Cached TextEncoder for frame encoding */
|
|
174
|
+
var textEncoder$1 = new TextEncoder();
|
|
175
|
+
/** Shared empty payload for END frames - avoids allocation per call */
|
|
176
|
+
var EMPTY_PAYLOAD = /* @__PURE__ */ new Uint8Array(0);
|
|
177
|
+
var MAX_ERROR_MESSAGE_CODE_UNITS = 4096;
|
|
178
|
+
/**
|
|
179
|
+
* Encodes a single frame with header and payload.
|
|
180
|
+
*/
|
|
181
|
+
function encodeFrame(type, streamId, payload) {
|
|
182
|
+
if (payload.byteLength > 16777216) throw new RangeError(`Frame payload exceeds ${MAX_FRAME_PAYLOAD_SIZE} bytes`);
|
|
183
|
+
const frame = new Uint8Array(9 + payload.length);
|
|
184
|
+
frame[0] = type;
|
|
185
|
+
frame[1] = streamId >>> 24 & 255;
|
|
186
|
+
frame[2] = streamId >>> 16 & 255;
|
|
187
|
+
frame[3] = streamId >>> 8 & 255;
|
|
188
|
+
frame[4] = streamId & 255;
|
|
189
|
+
frame[5] = payload.length >>> 24 & 255;
|
|
190
|
+
frame[6] = payload.length >>> 16 & 255;
|
|
191
|
+
frame[7] = payload.length >>> 8 & 255;
|
|
192
|
+
frame[8] = payload.length & 255;
|
|
193
|
+
frame.set(payload, 9);
|
|
194
|
+
return frame;
|
|
195
|
+
}
|
|
196
|
+
/** Encodes an error message payload, truncated to a bounded length. */
|
|
197
|
+
function encodeErrorPayload(error) {
|
|
198
|
+
const originalMessage = error instanceof Error ? error.message : String(error ?? "Unknown error");
|
|
199
|
+
const message = originalMessage.length > MAX_ERROR_MESSAGE_CODE_UNITS ? `${originalMessage.slice(0, MAX_ERROR_MESSAGE_CODE_UNITS)}…` : originalMessage;
|
|
200
|
+
return textEncoder$1.encode(message);
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Creates a multiplexed ReadableStream from serialized response records.
|
|
204
|
+
*
|
|
205
|
+
* A record's JSON frame is admitted before any raw stream referenced by that
|
|
206
|
+
* record starts. Raw streams from admitted records are pumped concurrently.
|
|
207
|
+
* The caller bounds the stream count before records reach this function.
|
|
208
|
+
*/
|
|
209
|
+
function createMultiplexedStream(recordStream, options = {}) {
|
|
210
|
+
let controller;
|
|
211
|
+
let stopped = false;
|
|
212
|
+
let activePumps = 0;
|
|
213
|
+
let wakeDemand;
|
|
214
|
+
let admission;
|
|
215
|
+
const readers = /* @__PURE__ */ new Set();
|
|
216
|
+
const pendingRawStreams = /* @__PURE__ */ new Set();
|
|
217
|
+
const abortOutput = () => errorOutput(options.signal?.reason);
|
|
218
|
+
const wakeAdmission = () => {
|
|
219
|
+
const wake = wakeDemand;
|
|
220
|
+
wakeDemand = void 0;
|
|
221
|
+
wake?.();
|
|
222
|
+
};
|
|
223
|
+
const cancelReader = (reader, reason) => {
|
|
224
|
+
reader.cancel(reason).catch(() => {});
|
|
225
|
+
};
|
|
226
|
+
const cancelStream = (stream, reason) => {
|
|
227
|
+
stream.cancel(reason).catch(() => {});
|
|
228
|
+
};
|
|
229
|
+
const stop = (reason) => {
|
|
230
|
+
if (stopped) return false;
|
|
231
|
+
stopped = [reason];
|
|
232
|
+
options.signal?.removeEventListener("abort", abortOutput);
|
|
233
|
+
wakeAdmission();
|
|
234
|
+
for (const reader of readers) cancelReader(reader, reason);
|
|
235
|
+
for (const stream of pendingRawStreams) cancelStream(stream, reason);
|
|
236
|
+
pendingRawStreams.clear();
|
|
237
|
+
return true;
|
|
238
|
+
};
|
|
239
|
+
const errorOutput = (error) => {
|
|
240
|
+
if (!stop(error)) return;
|
|
241
|
+
try {
|
|
242
|
+
controller.error(error);
|
|
243
|
+
} catch {}
|
|
244
|
+
};
|
|
245
|
+
const waitForDemand = async () => {
|
|
246
|
+
while (!stopped && (controller.desiredSize ?? 0) <= 0) await new Promise((resolve) => {
|
|
247
|
+
wakeDemand = resolve;
|
|
248
|
+
});
|
|
249
|
+
return !stopped;
|
|
250
|
+
};
|
|
251
|
+
const admitFrame = (type, streamId, payload) => {
|
|
252
|
+
if (stopped) return false;
|
|
253
|
+
if (!admission && (controller.desiredSize ?? 0) > 0) {
|
|
254
|
+
controller.enqueue(encodeFrame(type, streamId, payload));
|
|
255
|
+
return true;
|
|
256
|
+
}
|
|
257
|
+
const runAdmission = async () => {
|
|
258
|
+
if (!await waitForDemand()) return false;
|
|
259
|
+
controller.enqueue(encodeFrame(type, streamId, payload));
|
|
260
|
+
return true;
|
|
261
|
+
};
|
|
262
|
+
const result = admission ? admission.then(runAdmission) : runAdmission();
|
|
263
|
+
const clearAdmission = () => {
|
|
264
|
+
if (admission === tail) admission = void 0;
|
|
265
|
+
};
|
|
266
|
+
const tail = result.then(clearAdmission, clearAdmission);
|
|
267
|
+
admission = tail;
|
|
268
|
+
return result;
|
|
269
|
+
};
|
|
270
|
+
const maybeClose = () => {
|
|
271
|
+
if (activePumps !== 0 || !stop()) return;
|
|
272
|
+
try {
|
|
273
|
+
controller.close();
|
|
274
|
+
} catch {}
|
|
275
|
+
};
|
|
276
|
+
const startPump = (pump) => {
|
|
277
|
+
activePumps++;
|
|
278
|
+
pump().then(() => {
|
|
279
|
+
activePumps--;
|
|
280
|
+
maybeClose();
|
|
281
|
+
}, (error) => {
|
|
282
|
+
activePumps--;
|
|
283
|
+
errorOutput(error);
|
|
284
|
+
});
|
|
285
|
+
};
|
|
286
|
+
async function pumpRawStream(streamId, stream) {
|
|
287
|
+
const reader = stream.getReader();
|
|
288
|
+
readers.add(reader);
|
|
289
|
+
try {
|
|
290
|
+
while (!stopped) {
|
|
291
|
+
const { done, value } = await reader.read();
|
|
292
|
+
if (stopped) return;
|
|
293
|
+
if (done) {
|
|
294
|
+
const frameAdmission = admitFrame(2, streamId, EMPTY_PAYLOAD);
|
|
295
|
+
if (frameAdmission !== true) await frameAdmission;
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
if (!(value instanceof Uint8Array)) throw new TypeError("RawStream chunks must be Uint8Array");
|
|
299
|
+
let offset = 0;
|
|
300
|
+
do {
|
|
301
|
+
const frameAdmission = admitFrame(1, streamId, value.byteLength <= 16777216 ? value : value.subarray(offset, offset + MAX_FRAME_PAYLOAD_SIZE));
|
|
302
|
+
if (frameAdmission !== true && (frameAdmission === false || !await frameAdmission)) return;
|
|
303
|
+
offset += MAX_FRAME_PAYLOAD_SIZE;
|
|
304
|
+
} while (offset < value.byteLength);
|
|
305
|
+
}
|
|
306
|
+
} catch (error) {
|
|
307
|
+
if (!stopped) {
|
|
308
|
+
const frameAdmission = admitFrame(3, streamId, encodeErrorPayload(error));
|
|
309
|
+
if (frameAdmission !== true) await frameAdmission;
|
|
310
|
+
}
|
|
311
|
+
} finally {
|
|
312
|
+
readers.delete(reader);
|
|
313
|
+
reader.releaseLock();
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
async function pumpRecords() {
|
|
317
|
+
const reader = recordStream.getReader();
|
|
318
|
+
readers.add(reader);
|
|
319
|
+
try {
|
|
320
|
+
while (!stopped) {
|
|
321
|
+
const { done, value } = await reader.read();
|
|
322
|
+
if (stopped) {
|
|
323
|
+
if (!done) for (const registration of value.rawStreams) cancelStream(registration.stream, stopped[0]);
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
if (done) return;
|
|
327
|
+
for (const registration of value.rawStreams) pendingRawStreams.add(registration.stream);
|
|
328
|
+
const frameAdmission = admitFrame(0, 0, value.json);
|
|
329
|
+
if (frameAdmission !== true && (frameAdmission === false || !await frameAdmission)) return;
|
|
330
|
+
for (const registration of value.rawStreams) {
|
|
331
|
+
pendingRawStreams.delete(registration.stream);
|
|
332
|
+
startPump(pumpRawStream.bind(void 0, registration.id, registration.stream));
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
} catch (error) {
|
|
336
|
+
if (!stopped) errorOutput(error);
|
|
337
|
+
} finally {
|
|
338
|
+
readers.delete(reader);
|
|
339
|
+
reader.releaseLock();
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
return new ReadableStream({
|
|
343
|
+
start(ctrl) {
|
|
344
|
+
controller = ctrl;
|
|
345
|
+
if (options.signal?.aborted) {
|
|
346
|
+
cancelStream(recordStream, options.signal.reason);
|
|
347
|
+
errorOutput(options.signal.reason);
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
options.signal?.addEventListener("abort", abortOutput, { once: true });
|
|
351
|
+
startPump(pumpRecords);
|
|
352
|
+
},
|
|
353
|
+
pull() {
|
|
354
|
+
wakeAdmission();
|
|
355
|
+
},
|
|
356
|
+
cancel(reason) {
|
|
357
|
+
if (stop(reason)) options.onCancel?.(reason);
|
|
358
|
+
}
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
//#endregion
|
|
362
|
+
//#region node_modules/@tanstack/start-client-core/dist/esm/safeObjectMerge.js
|
|
363
|
+
function isSafeKey(key) {
|
|
364
|
+
return key !== "__proto__" && key !== "constructor" && key !== "prototype";
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Merge target and source into a new null-proto object, filtering dangerous keys.
|
|
368
|
+
*/
|
|
369
|
+
function safeObjectMerge(target, source) {
|
|
370
|
+
const result = Object.create(null);
|
|
371
|
+
if (target) {
|
|
372
|
+
for (const key of Object.keys(target)) if (isSafeKey(key)) result[key] = target[key];
|
|
373
|
+
}
|
|
374
|
+
if (source && typeof source === "object") {
|
|
375
|
+
for (const key of Object.keys(source)) if (isSafeKey(key)) result[key] = source[key];
|
|
376
|
+
}
|
|
377
|
+
return result;
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Create a null-prototype object, optionally copying from source.
|
|
381
|
+
*/
|
|
382
|
+
function createNullProtoObject(source) {
|
|
383
|
+
if (!source) return Object.create(null);
|
|
384
|
+
const obj = Object.create(null);
|
|
385
|
+
for (const key of Object.keys(source)) if (isSafeKey(key)) obj[key] = source[key];
|
|
386
|
+
return obj;
|
|
387
|
+
}
|
|
388
|
+
//#endregion
|
|
389
|
+
//#region node_modules/@tanstack/start-client-core/dist/esm/createServerFn.js
|
|
390
|
+
function flattenMiddlewares(middlewares, maxDepth = 100) {
|
|
391
|
+
const seen = /* @__PURE__ */ new Set();
|
|
392
|
+
const flattened = [];
|
|
393
|
+
const recurse = (middleware, depth) => {
|
|
394
|
+
if (depth > maxDepth) throw new Error(`Middleware nesting depth exceeded maximum of ${maxDepth}. Check for circular references.`);
|
|
395
|
+
middleware.forEach((m) => {
|
|
396
|
+
if (m.options.middleware) recurse(m.options.middleware, depth + 1);
|
|
397
|
+
if (!seen.has(m)) {
|
|
398
|
+
seen.add(m);
|
|
399
|
+
flattened.push(m);
|
|
400
|
+
}
|
|
401
|
+
});
|
|
402
|
+
};
|
|
403
|
+
recurse(middlewares, 0);
|
|
404
|
+
return flattened;
|
|
405
|
+
}
|
|
406
|
+
//#endregion
|
|
407
|
+
//#region node_modules/@tanstack/start-client-core/dist/esm/createMiddleware.js
|
|
408
|
+
var createMiddleware = (options, __opts) => {
|
|
409
|
+
const resolvedOptions = {
|
|
410
|
+
type: "request",
|
|
411
|
+
...__opts || options
|
|
412
|
+
};
|
|
413
|
+
const setValidator = (validator) => {
|
|
414
|
+
return createMiddleware({}, Object.assign(resolvedOptions, {
|
|
415
|
+
validator,
|
|
416
|
+
inputValidator: validator
|
|
417
|
+
}));
|
|
418
|
+
};
|
|
419
|
+
return {
|
|
420
|
+
options: resolvedOptions,
|
|
421
|
+
middleware: (middleware) => {
|
|
422
|
+
return createMiddleware({}, Object.assign(resolvedOptions, { middleware }));
|
|
423
|
+
},
|
|
424
|
+
validator: setValidator,
|
|
425
|
+
inputValidator: setValidator,
|
|
426
|
+
client: (client) => {
|
|
427
|
+
return createMiddleware({}, Object.assign(resolvedOptions, { client }));
|
|
428
|
+
},
|
|
429
|
+
server: (server) => {
|
|
430
|
+
return createMiddleware({}, Object.assign(resolvedOptions, { server }));
|
|
431
|
+
}
|
|
432
|
+
};
|
|
433
|
+
};
|
|
434
|
+
//#endregion
|
|
435
|
+
//#region node_modules/@tanstack/start-client-core/dist/esm/createCsrfMiddleware.js
|
|
436
|
+
var innerCreateCsrfMiddleware = (opts = {}) => {
|
|
437
|
+
return createMiddleware().server(async (ctx) => {
|
|
438
|
+
const csrfCtx = ctx;
|
|
439
|
+
if (opts.filter && !await opts.filter(csrfCtx)) return ctx.next();
|
|
440
|
+
if (await isCsrfRequestAllowed(opts, csrfCtx)) return ctx.next();
|
|
441
|
+
return getFailureResponse(opts, csrfCtx);
|
|
442
|
+
});
|
|
443
|
+
};
|
|
444
|
+
var createCsrfMiddleware = innerCreateCsrfMiddleware;
|
|
445
|
+
async function isCsrfRequestAllowed(opts, ctx) {
|
|
446
|
+
const result = await getCsrfRequestValidationResult(opts, ctx);
|
|
447
|
+
return result === true || result === void 0 && opts.allowRequestsWithoutOriginCheck === true;
|
|
448
|
+
}
|
|
449
|
+
async function getCsrfRequestValidationResult(opts, ctx) {
|
|
450
|
+
const fetchSite = ctx.request.headers.get("Sec-Fetch-Site");
|
|
451
|
+
if (fetchSite !== null) return matchValue(opts.secFetchSite ?? "same-origin", fetchSite, ctx);
|
|
452
|
+
const origin = ctx.request.headers.get("Origin");
|
|
453
|
+
if (origin !== null) {
|
|
454
|
+
if (opts.origin) return matchValue(opts.origin, origin, ctx);
|
|
455
|
+
return origin === new URL(ctx.request.url).origin;
|
|
456
|
+
}
|
|
457
|
+
const referer = ctx.request.headers.get("Referer");
|
|
458
|
+
if (referer === null || opts.referer === false) return;
|
|
459
|
+
if (typeof opts.referer === "function") return opts.referer(referer, ctx);
|
|
460
|
+
if (opts.origin) {
|
|
461
|
+
const refererOrigin = getOriginFromUrl(referer);
|
|
462
|
+
return refererOrigin !== void 0 && matchValue(opts.origin, refererOrigin, ctx);
|
|
463
|
+
}
|
|
464
|
+
return isRefererSameOrigin(referer, new URL(ctx.request.url).origin);
|
|
465
|
+
}
|
|
466
|
+
async function matchValue(matcher, value, ctx) {
|
|
467
|
+
if (typeof matcher === "function") return matcher(value, ctx);
|
|
468
|
+
if (Array.isArray(matcher)) return matcher.includes(value);
|
|
469
|
+
return value === matcher;
|
|
470
|
+
}
|
|
471
|
+
function getOriginFromUrl(url) {
|
|
472
|
+
try {
|
|
473
|
+
return new URL(url).origin;
|
|
474
|
+
} catch {
|
|
475
|
+
return;
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
function isRefererSameOrigin(referer, requestOrigin) {
|
|
479
|
+
if (referer === requestOrigin) return true;
|
|
480
|
+
if (!referer.startsWith(requestOrigin)) return false;
|
|
481
|
+
if (referer.length === requestOrigin.length) return true;
|
|
482
|
+
const code = referer.charCodeAt(requestOrigin.length);
|
|
483
|
+
return code === 47 || code === 63 || code === 35;
|
|
484
|
+
}
|
|
485
|
+
async function getFailureResponse(opts, ctx) {
|
|
486
|
+
if (typeof opts.failureResponse === "function") return opts.failureResponse(ctx);
|
|
487
|
+
return opts.failureResponse?.clone() ?? new Response("Forbidden", { status: 403 });
|
|
488
|
+
}
|
|
489
|
+
//#endregion
|
|
490
|
+
//#region node_modules/@tanstack/start-server-core/dist/esm/server-functions-handler.js
|
|
491
|
+
var serovalPlugins = void 0;
|
|
492
|
+
var FORM_DATA_CONTENT_TYPES = ["multipart/form-data", "application/x-www-form-urlencoded"];
|
|
493
|
+
var MAX_PAYLOAD_SIZE = 1e6;
|
|
494
|
+
var MAX_PENDING_SERIALIZATION_RECORDS = 1024;
|
|
495
|
+
var MAX_PENDING_SERIALIZATION_BYTES = 33554432;
|
|
496
|
+
var textEncoder = new TextEncoder();
|
|
497
|
+
function encodeSerializationRecord(value) {
|
|
498
|
+
return textEncoder.encode(JSON.stringify(value));
|
|
499
|
+
}
|
|
500
|
+
function exceedsPendingSerializationLimit(record, recordCount, pendingBytes) {
|
|
501
|
+
return recordCount >= MAX_PENDING_SERIALIZATION_RECORDS || pendingBytes + record.byteLength > MAX_PENDING_SERIALIZATION_BYTES;
|
|
502
|
+
}
|
|
503
|
+
function runSerializationCleanup(dispose) {
|
|
504
|
+
try {
|
|
505
|
+
dispose();
|
|
506
|
+
} catch {}
|
|
507
|
+
}
|
|
508
|
+
function cancelRawStream(stream, reason) {
|
|
509
|
+
stream.cancel(reason).catch(() => {});
|
|
510
|
+
}
|
|
511
|
+
var handleServerAction = async ({ request, context, serverFnId }) => {
|
|
512
|
+
const methodUpper = request.method.toUpperCase();
|
|
513
|
+
const url = new URL(request.url);
|
|
514
|
+
const action = await getServerFnById(serverFnId, { origin: "client" });
|
|
515
|
+
if (action.method && methodUpper !== action.method) return new Response(`expected ${action.method} method. Got ${methodUpper}`, {
|
|
516
|
+
status: 405,
|
|
517
|
+
headers: { Allow: action.method }
|
|
518
|
+
});
|
|
519
|
+
const isServerFn = request.headers.get("x-tsr-serverFn") === "true";
|
|
520
|
+
serovalPlugins ??= getSerovalPlugins(defaultSerovalDeserializerPlugins);
|
|
521
|
+
const contentType = request.headers.get("Content-Type");
|
|
522
|
+
try {
|
|
523
|
+
let res;
|
|
524
|
+
if (FORM_DATA_CONTENT_TYPES.some((type) => contentType && contentType.includes(type))) {
|
|
525
|
+
if (methodUpper === "GET") invariant();
|
|
526
|
+
const formData = await request.formData();
|
|
527
|
+
const serializedContext = formData.get(TSS_FORMDATA_CONTEXT);
|
|
528
|
+
formData.delete(TSS_FORMDATA_CONTEXT);
|
|
529
|
+
const params = {
|
|
530
|
+
context,
|
|
531
|
+
data: formData,
|
|
532
|
+
method: methodUpper
|
|
533
|
+
};
|
|
534
|
+
if (typeof serializedContext === "string") try {
|
|
535
|
+
const deserializedContext = fromJSON(JSON.parse(serializedContext), { plugins: serovalPlugins });
|
|
536
|
+
if (typeof deserializedContext === "object" && deserializedContext) params.context = safeObjectMerge(deserializedContext, context);
|
|
537
|
+
} catch (e) {}
|
|
538
|
+
res = await action(params);
|
|
539
|
+
} else if (methodUpper === "GET") {
|
|
540
|
+
const payloadParam = url.searchParams.get("payload");
|
|
541
|
+
if (payloadParam && payloadParam.length > MAX_PAYLOAD_SIZE) throw new Error("Payload too large");
|
|
542
|
+
const payload = payloadParam ? fromJSON(JSON.parse(payloadParam), { plugins: serovalPlugins }) : {};
|
|
543
|
+
payload.context = safeObjectMerge(payload.context, context);
|
|
544
|
+
payload.method = methodUpper;
|
|
545
|
+
res = await action(payload);
|
|
546
|
+
} else {
|
|
547
|
+
const payload = contentType?.includes("application/json") ? fromJSON(await request.json(), { plugins: serovalPlugins }) : {};
|
|
548
|
+
payload.context = safeObjectMerge(payload.context, context);
|
|
549
|
+
payload.method = methodUpper;
|
|
550
|
+
res = await action(payload);
|
|
551
|
+
}
|
|
552
|
+
const unwrapped = res.result !== void 0 ? res.result : res.error;
|
|
553
|
+
if (isNotFound(res)) res = isNotFoundResponse(res);
|
|
554
|
+
if (!isServerFn) return unwrapped;
|
|
555
|
+
if (unwrapped instanceof Response) {
|
|
556
|
+
if (isRedirect(unwrapped)) return unwrapped;
|
|
557
|
+
unwrapped.headers.set(X_TSS_RAW_RESPONSE, "true");
|
|
558
|
+
return unwrapped;
|
|
559
|
+
}
|
|
560
|
+
return serializeResult(res, request.signal, serovalPlugins);
|
|
561
|
+
} catch (error) {
|
|
562
|
+
if (error instanceof Response) return error;
|
|
563
|
+
if (isNotFound(error)) return isNotFoundResponse(error);
|
|
564
|
+
console.error("Server Fn Error!", error);
|
|
565
|
+
const serializedError = JSON.stringify(await toCrossJSONAsync(error, {
|
|
566
|
+
refs: /* @__PURE__ */ new Map(),
|
|
567
|
+
plugins: serovalPlugins
|
|
568
|
+
}));
|
|
569
|
+
const response = getResponse();
|
|
570
|
+
const headers = {
|
|
571
|
+
"Content-Type": "application/json",
|
|
572
|
+
[X_TSS_SERIALIZED]: "true"
|
|
573
|
+
};
|
|
574
|
+
try {
|
|
575
|
+
return new Response(serializedError, {
|
|
576
|
+
status: response.status ?? 500,
|
|
577
|
+
statusText: response.statusText,
|
|
578
|
+
headers
|
|
579
|
+
});
|
|
580
|
+
} catch {
|
|
581
|
+
return new Response(serializedError, {
|
|
582
|
+
status: 500,
|
|
583
|
+
statusText: "",
|
|
584
|
+
headers
|
|
585
|
+
});
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
};
|
|
589
|
+
/**
|
|
590
|
+
* Serializes a server-function result. A result that Seroval completes
|
|
591
|
+
* synchronously without RawStreams becomes plain JSON; everything else is a
|
|
592
|
+
* framed response whose records and raw streams are multiplexed in order.
|
|
593
|
+
*/
|
|
594
|
+
function serializeResult(res, signal, plugins) {
|
|
595
|
+
const alsResponse = getResponse();
|
|
596
|
+
const initialRecords = [];
|
|
597
|
+
let initialBytes = 0;
|
|
598
|
+
const pendingRawStreams = [];
|
|
599
|
+
let done = false;
|
|
600
|
+
let initialParsed = false;
|
|
601
|
+
let serializationFailure;
|
|
602
|
+
let disposeSerialization;
|
|
603
|
+
let onParse = (value, initial) => {
|
|
604
|
+
if (serializationFailure) return;
|
|
605
|
+
initialParsed ||= initial;
|
|
606
|
+
const record = encodeSerializationRecord(value);
|
|
607
|
+
if (exceedsPendingSerializationLimit(record, initialRecords.length, initialBytes)) {
|
|
608
|
+
serializationFailure = [/* @__PURE__ */ new Error("Server function serialization exceeded its pending output limit")];
|
|
609
|
+
return;
|
|
610
|
+
}
|
|
611
|
+
initialRecords.push(record);
|
|
612
|
+
initialBytes += record.byteLength;
|
|
613
|
+
};
|
|
614
|
+
let onDone = () => {
|
|
615
|
+
if (initialParsed) done = true;
|
|
616
|
+
};
|
|
617
|
+
let onError = (error) => {
|
|
618
|
+
serializationFailure ??= [error];
|
|
619
|
+
};
|
|
620
|
+
const rawStreamPlugin = createRawStreamRPCPlugin((id, stream) => {
|
|
621
|
+
if (serializationFailure) {
|
|
622
|
+
cancelRawStream(stream, serializationFailure[0]);
|
|
623
|
+
return;
|
|
624
|
+
}
|
|
625
|
+
if (id > 1024) {
|
|
626
|
+
const error = /* @__PURE__ */ new Error(`Too many raw streams in framed response (max ${MAX_FRAMED_STREAMS})`);
|
|
627
|
+
cancelRawStream(stream, error);
|
|
628
|
+
onError(error);
|
|
629
|
+
return;
|
|
630
|
+
}
|
|
631
|
+
pendingRawStreams.push({
|
|
632
|
+
id,
|
|
633
|
+
stream
|
|
634
|
+
});
|
|
635
|
+
});
|
|
636
|
+
const dispose = toCrossJSONStream(res, {
|
|
637
|
+
refs: /* @__PURE__ */ new Map(),
|
|
638
|
+
plugins: [rawStreamPlugin, ...plugins],
|
|
639
|
+
onParse(value, initial) {
|
|
640
|
+
onParse(value, initial);
|
|
641
|
+
},
|
|
642
|
+
onDone() {
|
|
643
|
+
onDone();
|
|
644
|
+
},
|
|
645
|
+
onError: (error) => {
|
|
646
|
+
onError(error);
|
|
647
|
+
}
|
|
648
|
+
});
|
|
649
|
+
if (serializationFailure) {
|
|
650
|
+
runSerializationCleanup(dispose);
|
|
651
|
+
for (const registration of pendingRawStreams) cancelRawStream(registration.stream, serializationFailure[0]);
|
|
652
|
+
throw serializationFailure[0];
|
|
653
|
+
}
|
|
654
|
+
if (!done) disposeSerialization = dispose;
|
|
655
|
+
if (done && pendingRawStreams.length === 0 && initialRecords.length === 1) return new Response(initialRecords[0], {
|
|
656
|
+
status: alsResponse.status,
|
|
657
|
+
statusText: alsResponse.statusText,
|
|
658
|
+
headers: {
|
|
659
|
+
"Content-Type": "application/json",
|
|
660
|
+
[X_TSS_SERIALIZED]: "true"
|
|
661
|
+
}
|
|
662
|
+
});
|
|
663
|
+
if (done && initialRecords.length === 1) {
|
|
664
|
+
const json = initialRecords[0];
|
|
665
|
+
if (json.byteLength > 16777216) {
|
|
666
|
+
const error = /* @__PURE__ */ new Error("Server function serialization exceeded its pending output limit");
|
|
667
|
+
for (const registration of pendingRawStreams) cancelRawStream(registration.stream, error);
|
|
668
|
+
throw error;
|
|
669
|
+
}
|
|
670
|
+
const rawStreams = pendingRawStreams.splice(0);
|
|
671
|
+
initialRecords.length = 0;
|
|
672
|
+
return createFramedResponse(new ReadableStream({
|
|
673
|
+
start(controller) {
|
|
674
|
+
controller.enqueue({
|
|
675
|
+
json,
|
|
676
|
+
rawStreams
|
|
677
|
+
});
|
|
678
|
+
controller.close();
|
|
679
|
+
},
|
|
680
|
+
cancel(reason) {
|
|
681
|
+
for (const registration of rawStreams) cancelRawStream(registration.stream, reason);
|
|
682
|
+
}
|
|
683
|
+
}), { signal });
|
|
684
|
+
}
|
|
685
|
+
const { readable, writable } = new TransformStream();
|
|
686
|
+
const writer = writable.getWriter();
|
|
687
|
+
const recordAbortController = new AbortController();
|
|
688
|
+
let pendingBytes = 0;
|
|
689
|
+
const pendingRecords = /* @__PURE__ */ new Set();
|
|
690
|
+
const abortRecordStream = (error) => {
|
|
691
|
+
if (serializationFailure) return;
|
|
692
|
+
serializationFailure = [error];
|
|
693
|
+
const disposeCurrentSerialization = disposeSerialization;
|
|
694
|
+
disposeSerialization = void 0;
|
|
695
|
+
for (const registration of pendingRawStreams.splice(0)) cancelRawStream(registration.stream, error);
|
|
696
|
+
for (const record of pendingRecords) for (const registration of record.rawStreams) cancelRawStream(registration.stream, error);
|
|
697
|
+
pendingRecords.clear();
|
|
698
|
+
recordAbortController.abort(error);
|
|
699
|
+
writer.abort(error).catch(() => {});
|
|
700
|
+
if (disposeCurrentSerialization) runSerializationCleanup(disposeCurrentSerialization);
|
|
701
|
+
};
|
|
702
|
+
const writeRecord = (json, rawStreams) => {
|
|
703
|
+
if (serializationFailure) {
|
|
704
|
+
for (const registration of rawStreams) cancelRawStream(registration.stream, serializationFailure[0]);
|
|
705
|
+
return false;
|
|
706
|
+
}
|
|
707
|
+
if (json.byteLength > 16777216 || exceedsPendingSerializationLimit(json, pendingRecords.size, pendingBytes)) {
|
|
708
|
+
const error = /* @__PURE__ */ new Error("Server function serialization exceeded its pending output limit");
|
|
709
|
+
for (const registration of rawStreams) cancelRawStream(registration.stream, error);
|
|
710
|
+
onError(error);
|
|
711
|
+
return false;
|
|
712
|
+
}
|
|
713
|
+
pendingBytes += json.byteLength;
|
|
714
|
+
const record = {
|
|
715
|
+
json,
|
|
716
|
+
rawStreams
|
|
717
|
+
};
|
|
718
|
+
pendingRecords.add(record);
|
|
719
|
+
writer.write(record).then(() => {
|
|
720
|
+
pendingRecords.delete(record);
|
|
721
|
+
pendingBytes -= json.byteLength;
|
|
722
|
+
}, (error) => {
|
|
723
|
+
const stillOwned = pendingRecords.delete(record);
|
|
724
|
+
pendingBytes -= json.byteLength;
|
|
725
|
+
if (stillOwned) for (const registration of rawStreams) cancelRawStream(registration.stream, error);
|
|
726
|
+
});
|
|
727
|
+
return true;
|
|
728
|
+
};
|
|
729
|
+
onParse = (value) => {
|
|
730
|
+
if (serializationFailure) return;
|
|
731
|
+
writeRecord(encodeSerializationRecord(value), pendingRawStreams.splice(0));
|
|
732
|
+
};
|
|
733
|
+
onDone = () => {
|
|
734
|
+
if (serializationFailure) return;
|
|
735
|
+
disposeSerialization = void 0;
|
|
736
|
+
writer.close().catch(() => {});
|
|
737
|
+
};
|
|
738
|
+
onError = (error) => {
|
|
739
|
+
abortRecordStream(error);
|
|
740
|
+
};
|
|
741
|
+
const initialRawStreams = pendingRawStreams.splice(0);
|
|
742
|
+
for (let index = 0; index < initialRecords.length; index++) {
|
|
743
|
+
const isLast = index === initialRecords.length - 1;
|
|
744
|
+
if (!writeRecord(initialRecords[index], isLast ? initialRawStreams : [])) {
|
|
745
|
+
if (!isLast) for (const registration of initialRawStreams) cancelRawStream(registration.stream, serializationFailure[0]);
|
|
746
|
+
initialRecords.length = 0;
|
|
747
|
+
throw serializationFailure[0];
|
|
748
|
+
}
|
|
749
|
+
}
|
|
750
|
+
initialRecords.length = 0;
|
|
751
|
+
if (done) onDone();
|
|
752
|
+
writer.closed.catch((error) => {
|
|
753
|
+
abortRecordStream(error);
|
|
754
|
+
});
|
|
755
|
+
return createFramedResponse(readable, {
|
|
756
|
+
signal: AbortSignal.any([recordAbortController.signal, signal]),
|
|
757
|
+
onCancel: abortRecordStream
|
|
758
|
+
});
|
|
759
|
+
function createFramedResponse(records, options) {
|
|
760
|
+
const multiplexedStream = createMultiplexedStream(records, options);
|
|
761
|
+
try {
|
|
762
|
+
return new Response(multiplexedStream, {
|
|
763
|
+
status: alsResponse.status,
|
|
764
|
+
statusText: alsResponse.statusText,
|
|
765
|
+
headers: {
|
|
766
|
+
"Content-Type": TSS_CONTENT_TYPE_FRAMED_VERSIONED,
|
|
767
|
+
[X_TSS_SERIALIZED]: "true"
|
|
768
|
+
}
|
|
769
|
+
});
|
|
770
|
+
} catch (error) {
|
|
771
|
+
cancelRawStream(multiplexedStream, error);
|
|
772
|
+
throw error;
|
|
773
|
+
}
|
|
774
|
+
}
|
|
775
|
+
}
|
|
776
|
+
function isNotFoundResponse(error) {
|
|
777
|
+
const { headers, ...rest } = error;
|
|
778
|
+
return new Response(JSON.stringify(rest), {
|
|
779
|
+
status: 404,
|
|
780
|
+
headers: {
|
|
781
|
+
"Content-Type": "application/json",
|
|
782
|
+
...headers || {}
|
|
783
|
+
}
|
|
784
|
+
});
|
|
785
|
+
}
|
|
786
|
+
//#endregion
|
|
787
|
+
//#region node_modules/@tanstack/start-server-core/dist/esm/early-hints.js
|
|
788
|
+
var LINK_PARAM_TOKEN_RE = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/;
|
|
789
|
+
var PRELOAD_AS_VALUES = /* @__PURE__ */ new Set([
|
|
790
|
+
"fetch",
|
|
791
|
+
"font",
|
|
792
|
+
"image",
|
|
793
|
+
"script",
|
|
794
|
+
"style",
|
|
795
|
+
"track"
|
|
796
|
+
]);
|
|
797
|
+
function buildLinkParam(name, value) {
|
|
798
|
+
if (value === void 0) return name;
|
|
799
|
+
if (LINK_PARAM_TOKEN_RE.test(value)) return `${name}=${value}`;
|
|
800
|
+
return `${name}=${JSON.stringify(value)}`;
|
|
801
|
+
}
|
|
802
|
+
function serializeEarlyHint(hint) {
|
|
803
|
+
const parts = [`<${hint.href}>`, buildLinkParam("rel", hint.rel)];
|
|
804
|
+
if (hint.as) parts.push(buildLinkParam("as", hint.as));
|
|
805
|
+
if (hint.crossOrigin !== void 0) parts.push(buildLinkParam("crossorigin", hint.crossOrigin || void 0));
|
|
806
|
+
if (hint.type) parts.push(buildLinkParam("type", hint.type));
|
|
807
|
+
if (hint.integrity) parts.push(buildLinkParam("integrity", hint.integrity));
|
|
808
|
+
if (hint.referrerPolicy) parts.push(buildLinkParam("referrerpolicy", hint.referrerPolicy));
|
|
809
|
+
if (hint.fetchPriority) parts.push(buildLinkParam("fetchpriority", hint.fetchPriority));
|
|
810
|
+
return parts.join("; ");
|
|
811
|
+
}
|
|
812
|
+
function getStringAttr(attrs, name, fallbackName) {
|
|
813
|
+
const value = attrs?.[name] ?? (fallbackName ? attrs?.[fallbackName] : void 0);
|
|
814
|
+
return typeof value === "string" ? value : void 0;
|
|
815
|
+
}
|
|
816
|
+
function getPreloadAs(attrs) {
|
|
817
|
+
const as = getStringAttr(attrs, "as");
|
|
818
|
+
return as && PRELOAD_AS_VALUES.has(as) ? as : void 0;
|
|
819
|
+
}
|
|
820
|
+
function addEarlyHintFetchAttrs(hint, attrs) {
|
|
821
|
+
const crossOrigin = getStringAttr(attrs, "crossOrigin", "crossorigin");
|
|
822
|
+
const type = getStringAttr(attrs, "type");
|
|
823
|
+
const integrity = getStringAttr(attrs, "integrity");
|
|
824
|
+
const referrerPolicy = getStringAttr(attrs, "referrerPolicy", "referrerpolicy");
|
|
825
|
+
const fetchPriority = getStringAttr(attrs, "fetchPriority", "fetchpriority");
|
|
826
|
+
if (crossOrigin !== void 0) hint.crossOrigin = crossOrigin;
|
|
827
|
+
if (type) hint.type = type;
|
|
828
|
+
if (integrity) hint.integrity = integrity;
|
|
829
|
+
if (referrerPolicy) hint.referrerPolicy = referrerPolicy;
|
|
830
|
+
if (fetchPriority) hint.fetchPriority = fetchPriority;
|
|
831
|
+
}
|
|
832
|
+
function linkAttrsToEarlyHint(attrs) {
|
|
833
|
+
const href = getStringAttr(attrs, "href");
|
|
834
|
+
const rel = getStringAttr(attrs, "rel");
|
|
835
|
+
if (!href || !rel) return void 0;
|
|
836
|
+
const relTokens = rel.split(/\s+/);
|
|
837
|
+
let hintRel;
|
|
838
|
+
let hintAs;
|
|
839
|
+
if (relTokens.includes("modulepreload")) {
|
|
840
|
+
hintRel = "modulepreload";
|
|
841
|
+
hintAs = "script";
|
|
842
|
+
} else if (relTokens.includes("stylesheet")) {
|
|
843
|
+
hintRel = "preload";
|
|
844
|
+
hintAs = "style";
|
|
845
|
+
} else if (relTokens.includes("preload")) {
|
|
846
|
+
hintAs = getPreloadAs(attrs);
|
|
847
|
+
if (!hintAs) return void 0;
|
|
848
|
+
hintRel = "preload";
|
|
849
|
+
} else if (relTokens.includes("preconnect")) {
|
|
850
|
+
hintRel = "preconnect";
|
|
851
|
+
hintAs = void 0;
|
|
852
|
+
} else if (relTokens.includes("dns-prefetch")) {
|
|
853
|
+
hintRel = "dns-prefetch";
|
|
854
|
+
hintAs = void 0;
|
|
855
|
+
}
|
|
856
|
+
if (!hintRel) return void 0;
|
|
857
|
+
const hint = {
|
|
858
|
+
href,
|
|
859
|
+
rel: hintRel
|
|
860
|
+
};
|
|
861
|
+
if (hintAs) hint.as = hintAs;
|
|
862
|
+
addEarlyHintFetchAttrs(hint, attrs);
|
|
863
|
+
return hint;
|
|
864
|
+
}
|
|
865
|
+
function collectStaticHintsFromManifest(manifest, matchedRoutes) {
|
|
866
|
+
const hints = [];
|
|
867
|
+
for (const route of matchedRoutes) {
|
|
868
|
+
const routeManifest = manifest.routes[route.id];
|
|
869
|
+
if (!routeManifest) continue;
|
|
870
|
+
for (const link of routeManifest.preloads ?? []) {
|
|
871
|
+
const attrs = getScriptPreloadAttrs(manifest, link);
|
|
872
|
+
const hint = {
|
|
873
|
+
href: attrs.href,
|
|
874
|
+
rel: attrs.rel,
|
|
875
|
+
as: "script"
|
|
876
|
+
};
|
|
877
|
+
if (attrs.crossOrigin !== void 0) hint.crossOrigin = attrs.crossOrigin;
|
|
878
|
+
hints.push(hint);
|
|
879
|
+
}
|
|
880
|
+
for (const link of routeManifest.css ?? []) {
|
|
881
|
+
const stylesheetHref = getStylesheetHref(link);
|
|
882
|
+
if (manifest.inlineCss?.styles[stylesheetHref] !== void 0) continue;
|
|
883
|
+
const resolvedLink = resolveManifestCssLink(link);
|
|
884
|
+
const hint = {
|
|
885
|
+
href: stylesheetHref,
|
|
886
|
+
rel: "preload",
|
|
887
|
+
as: "style"
|
|
888
|
+
};
|
|
889
|
+
if (resolvedLink.crossOrigin !== void 0) hint.crossOrigin = resolvedLink.crossOrigin;
|
|
890
|
+
hints.push(hint);
|
|
891
|
+
}
|
|
892
|
+
}
|
|
893
|
+
return hints;
|
|
894
|
+
}
|
|
895
|
+
function collectDynamicHintsFromMatches(matches) {
|
|
896
|
+
const hints = [];
|
|
897
|
+
for (const match of matches) {
|
|
898
|
+
const links = match.links;
|
|
899
|
+
if (!Array.isArray(links)) continue;
|
|
900
|
+
for (const link of links) {
|
|
901
|
+
const hint = linkAttrsToEarlyHint(link);
|
|
902
|
+
if (hint) hints.push(hint);
|
|
903
|
+
}
|
|
904
|
+
}
|
|
905
|
+
return hints;
|
|
906
|
+
}
|
|
907
|
+
function createEarlyHintsEvent(opts) {
|
|
908
|
+
const nextHints = [];
|
|
909
|
+
const nextLinks = [];
|
|
910
|
+
for (const hint of opts.hints) {
|
|
911
|
+
const link = serializeEarlyHint(hint);
|
|
912
|
+
if (opts.sentLinks.has(link)) continue;
|
|
913
|
+
opts.sentLinks.add(link);
|
|
914
|
+
opts.sentHints.push(hint);
|
|
915
|
+
nextHints.push(hint);
|
|
916
|
+
nextLinks.push(link);
|
|
917
|
+
}
|
|
918
|
+
if (!nextHints.length && opts.phase !== "dynamic") return void 0;
|
|
919
|
+
return {
|
|
920
|
+
phase: opts.phase,
|
|
921
|
+
hints: nextHints,
|
|
922
|
+
links: nextLinks,
|
|
923
|
+
allHints: opts.sentHints.slice(),
|
|
924
|
+
allLinks: Array.from(opts.sentLinks)
|
|
925
|
+
};
|
|
926
|
+
}
|
|
927
|
+
function createResponseLinkHeaderEntries(opts) {
|
|
928
|
+
for (const hint of opts.hints) {
|
|
929
|
+
const link = serializeEarlyHint(hint);
|
|
930
|
+
if (opts.sentLinks.has(link)) continue;
|
|
931
|
+
opts.sentLinks.add(link);
|
|
932
|
+
opts.entries.push({
|
|
933
|
+
phase: opts.phase,
|
|
934
|
+
hint,
|
|
935
|
+
link
|
|
936
|
+
});
|
|
937
|
+
}
|
|
938
|
+
}
|
|
939
|
+
function getResponseLinkHeaderEntries(opts) {
|
|
940
|
+
if (!opts.filter) return opts.entries.map((entry) => entry.link);
|
|
941
|
+
try {
|
|
942
|
+
const links = [];
|
|
943
|
+
for (const entry of opts.entries) if (opts.filter(entry)) links.push(entry.link);
|
|
944
|
+
return links;
|
|
945
|
+
} catch (err) {
|
|
946
|
+
console.error("Error filtering response Link headers:", err);
|
|
947
|
+
return [];
|
|
948
|
+
}
|
|
949
|
+
}
|
|
950
|
+
function notifyEarlyHints(phase, event, onEarlyHints) {
|
|
951
|
+
try {
|
|
952
|
+
const result = onEarlyHints(event);
|
|
953
|
+
if (result) Promise.resolve(result).catch((err) => {
|
|
954
|
+
console.error(`Error sending ${phase} early hints:`, err);
|
|
955
|
+
});
|
|
956
|
+
} catch (err) {
|
|
957
|
+
console.error(`Error sending ${phase} early hints:`, err);
|
|
958
|
+
}
|
|
959
|
+
}
|
|
960
|
+
function getResponseLinkHeaderFilter(responseLinkHeader) {
|
|
961
|
+
if (typeof responseLinkHeader !== "object") return;
|
|
962
|
+
return responseLinkHeader.filter;
|
|
963
|
+
}
|
|
964
|
+
function appendResponseLinkHeaders(opts) {
|
|
965
|
+
for (const link of getResponseLinkHeaderEntries(opts)) opts.responseHeaders.append("Link", link);
|
|
966
|
+
}
|
|
967
|
+
function collectResponseLinkHeaderEntries(opts) {
|
|
968
|
+
for (let index = 0; index < opts.event.hints.length; index++) opts.entries.push({
|
|
969
|
+
phase: opts.phase,
|
|
970
|
+
hint: opts.event.hints[index],
|
|
971
|
+
link: opts.event.links[index]
|
|
972
|
+
});
|
|
973
|
+
}
|
|
974
|
+
function collectEarlyHintsPhase(opts) {
|
|
975
|
+
const event = opts.onEarlyHints ? createEarlyHintsEvent({
|
|
976
|
+
phase: opts.phase,
|
|
977
|
+
hints: opts.hints,
|
|
978
|
+
sentLinks: opts.sentLinks,
|
|
979
|
+
sentHints: opts.sentHints
|
|
980
|
+
}) : void 0;
|
|
981
|
+
if (event) notifyEarlyHints(opts.phase, event, opts.onEarlyHints);
|
|
982
|
+
if (!opts.responseLinkHeaderEntries) return;
|
|
983
|
+
if (event) {
|
|
984
|
+
collectResponseLinkHeaderEntries({
|
|
985
|
+
phase: opts.phase,
|
|
986
|
+
event,
|
|
987
|
+
entries: opts.responseLinkHeaderEntries
|
|
988
|
+
});
|
|
989
|
+
return;
|
|
990
|
+
}
|
|
991
|
+
createResponseLinkHeaderEntries({
|
|
992
|
+
phase: opts.phase,
|
|
993
|
+
hints: opts.hints,
|
|
994
|
+
sentLinks: opts.sentLinks,
|
|
995
|
+
entries: opts.responseLinkHeaderEntries
|
|
996
|
+
});
|
|
997
|
+
}
|
|
998
|
+
function createEarlyHintsCollector(opts) {
|
|
999
|
+
if (!opts?.onEarlyHints && !opts?.responseLinkHeader) return;
|
|
1000
|
+
const sentLinks = /* @__PURE__ */ new Set();
|
|
1001
|
+
const sentHints = opts.onEarlyHints ? new Array() : void 0;
|
|
1002
|
+
const responseLinkHeaderEntries = opts.responseLinkHeader ? new Array() : void 0;
|
|
1003
|
+
const responseLinkHeaderFilter = getResponseLinkHeaderFilter(opts.responseLinkHeader);
|
|
1004
|
+
return {
|
|
1005
|
+
collectStatic: ({ manifest, matchedRoutes }) => {
|
|
1006
|
+
if (!matchedRoutes?.length) return;
|
|
1007
|
+
collectEarlyHintsPhase({
|
|
1008
|
+
phase: "static",
|
|
1009
|
+
hints: collectStaticHintsFromManifest(manifest, matchedRoutes),
|
|
1010
|
+
sentLinks,
|
|
1011
|
+
sentHints,
|
|
1012
|
+
onEarlyHints: opts.onEarlyHints,
|
|
1013
|
+
responseLinkHeaderEntries
|
|
1014
|
+
});
|
|
1015
|
+
},
|
|
1016
|
+
collectDynamic: (matches) => {
|
|
1017
|
+
collectEarlyHintsPhase({
|
|
1018
|
+
phase: "dynamic",
|
|
1019
|
+
hints: collectDynamicHintsFromMatches(matches),
|
|
1020
|
+
sentLinks,
|
|
1021
|
+
sentHints,
|
|
1022
|
+
onEarlyHints: opts.onEarlyHints,
|
|
1023
|
+
responseLinkHeaderEntries
|
|
1024
|
+
});
|
|
1025
|
+
},
|
|
1026
|
+
appendResponseHeaders: (headers) => {
|
|
1027
|
+
if (!responseLinkHeaderEntries?.length) return;
|
|
1028
|
+
appendResponseLinkHeaders({
|
|
1029
|
+
responseHeaders: headers,
|
|
1030
|
+
entries: responseLinkHeaderEntries,
|
|
1031
|
+
filter: responseLinkHeaderFilter
|
|
1032
|
+
});
|
|
1033
|
+
}
|
|
1034
|
+
};
|
|
1035
|
+
}
|
|
1036
|
+
//#endregion
|
|
1037
|
+
//#region node_modules/@tanstack/start-server-core/dist/esm/transformAssetUrls.js
|
|
1038
|
+
function normalizeTransformAssetResult(result) {
|
|
1039
|
+
if (typeof result === "string") return { href: result };
|
|
1040
|
+
return result;
|
|
1041
|
+
}
|
|
1042
|
+
function escapeCssString(value) {
|
|
1043
|
+
return value.replace(/\\/g, "\\\\").replace(/"/g, "\\\"").replace(/\n/g, "\\a ").replace(/\r/g, "\\d ").replace(/\f/g, "\\c ");
|
|
1044
|
+
}
|
|
1045
|
+
async function transformInlineCssTemplate(options) {
|
|
1046
|
+
const { strings, urls } = options.template;
|
|
1047
|
+
if (strings.length !== urls.length + 1) throw new Error(`TanStack Start inlineCss template for ${options.stylesheetHref} is invalid`);
|
|
1048
|
+
let css = strings[0];
|
|
1049
|
+
for (let index = 0; index < urls.length; index++) {
|
|
1050
|
+
const transformed = normalizeTransformAssetResult(await options.transformFn({
|
|
1051
|
+
kind: "css-url",
|
|
1052
|
+
url: urls[index],
|
|
1053
|
+
stylesheetHref: options.stylesheetHref
|
|
1054
|
+
}));
|
|
1055
|
+
css += escapeCssString(transformed.href) + strings[index + 1];
|
|
1056
|
+
}
|
|
1057
|
+
return css;
|
|
1058
|
+
}
|
|
1059
|
+
async function transformInlineCssStyles(inlineCss, transformFn) {
|
|
1060
|
+
const transformedStyles = {};
|
|
1061
|
+
const transformedEntries = await Promise.all(Object.entries(inlineCss.styles).map(async ([stylesheetHref, css]) => {
|
|
1062
|
+
const template = inlineCss.templates?.[stylesheetHref];
|
|
1063
|
+
return [stylesheetHref, template ? await transformInlineCssTemplate({
|
|
1064
|
+
stylesheetHref,
|
|
1065
|
+
template,
|
|
1066
|
+
transformFn
|
|
1067
|
+
}) : css];
|
|
1068
|
+
}));
|
|
1069
|
+
for (const [stylesheetHref, css] of transformedEntries) transformedStyles[stylesheetHref] = css;
|
|
1070
|
+
return {
|
|
1071
|
+
styles: transformedStyles,
|
|
1072
|
+
...inlineCss.templates ? { templates: inlineCss.templates } : {}
|
|
1073
|
+
};
|
|
1074
|
+
}
|
|
1075
|
+
function resolveTransformAssetsCrossOrigin(config, kind) {
|
|
1076
|
+
if (!config) return void 0;
|
|
1077
|
+
if (typeof config === "string") return config;
|
|
1078
|
+
return config[kind];
|
|
1079
|
+
}
|
|
1080
|
+
function isObjectShorthand(transform) {
|
|
1081
|
+
return "prefix" in transform;
|
|
1082
|
+
}
|
|
1083
|
+
function resolveTransformAssetsConfig(transform) {
|
|
1084
|
+
if (typeof transform === "string") {
|
|
1085
|
+
const prefix = transform;
|
|
1086
|
+
return {
|
|
1087
|
+
type: "transform",
|
|
1088
|
+
transformFn: ({ url }) => ({ href: `${prefix}${url}` }),
|
|
1089
|
+
cache: true
|
|
1090
|
+
};
|
|
1091
|
+
}
|
|
1092
|
+
if (typeof transform === "function") return {
|
|
1093
|
+
type: "transform",
|
|
1094
|
+
transformFn: transform,
|
|
1095
|
+
cache: true
|
|
1096
|
+
};
|
|
1097
|
+
if (isObjectShorthand(transform)) {
|
|
1098
|
+
const { prefix, crossOrigin } = transform;
|
|
1099
|
+
return {
|
|
1100
|
+
type: "transform",
|
|
1101
|
+
transformFn: ({ url, kind }) => {
|
|
1102
|
+
const href = `${prefix}${url}`;
|
|
1103
|
+
if (kind === "css-url") return { href };
|
|
1104
|
+
const co = resolveTransformAssetsCrossOrigin(crossOrigin, kind);
|
|
1105
|
+
return co ? {
|
|
1106
|
+
href,
|
|
1107
|
+
crossOrigin: co
|
|
1108
|
+
} : { href };
|
|
1109
|
+
},
|
|
1110
|
+
cache: true
|
|
1111
|
+
};
|
|
1112
|
+
}
|
|
1113
|
+
if ("createTransform" in transform && transform.createTransform) return {
|
|
1114
|
+
type: "createTransform",
|
|
1115
|
+
createTransform: transform.createTransform,
|
|
1116
|
+
cache: transform.cache !== false
|
|
1117
|
+
};
|
|
1118
|
+
return {
|
|
1119
|
+
type: "transform",
|
|
1120
|
+
transformFn: typeof transform.transform === "string" ? (({ url }) => ({ href: `${transform.transform}${url}` })) : transform.transform,
|
|
1121
|
+
cache: transform.cache !== false
|
|
1122
|
+
};
|
|
1123
|
+
}
|
|
1124
|
+
function assignManifestLink(link, next) {
|
|
1125
|
+
if (typeof link === "string") return next.crossOrigin ? next : next.href;
|
|
1126
|
+
const nextLink = {
|
|
1127
|
+
...link,
|
|
1128
|
+
href: next.href
|
|
1129
|
+
};
|
|
1130
|
+
if (next.crossOrigin) nextLink.crossOrigin = next.crossOrigin;
|
|
1131
|
+
else delete nextLink.crossOrigin;
|
|
1132
|
+
return nextLink;
|
|
1133
|
+
}
|
|
1134
|
+
async function transformManifestAssets(source, transformFn, _opts) {
|
|
1135
|
+
const manifest = structuredClone(source);
|
|
1136
|
+
const inlineCssEnabled = _opts?.inlineCss !== false;
|
|
1137
|
+
const scriptTransforms = /* @__PURE__ */ new Map();
|
|
1138
|
+
const transformScript = (url) => {
|
|
1139
|
+
const cached = scriptTransforms.get(url);
|
|
1140
|
+
if (cached) return cached;
|
|
1141
|
+
const transformed = Promise.resolve(transformFn({
|
|
1142
|
+
url,
|
|
1143
|
+
kind: "script"
|
|
1144
|
+
})).then(normalizeTransformAssetResult);
|
|
1145
|
+
scriptTransforms.set(url, transformed);
|
|
1146
|
+
return transformed;
|
|
1147
|
+
};
|
|
1148
|
+
if (!inlineCssEnabled) delete manifest.inlineCss;
|
|
1149
|
+
else if (manifest.inlineCss) manifest.inlineCss = await transformInlineCssStyles(manifest.inlineCss, transformFn);
|
|
1150
|
+
for (const route of Object.values(manifest.routes)) {
|
|
1151
|
+
if (route.preloads?.length) route.preloads = await Promise.all(route.preloads.map(async (link) => {
|
|
1152
|
+
const result = await transformScript(resolveManifestAssetLink(link).href);
|
|
1153
|
+
return assignManifestLink(link, {
|
|
1154
|
+
href: result.href,
|
|
1155
|
+
crossOrigin: result.crossOrigin
|
|
1156
|
+
});
|
|
1157
|
+
}));
|
|
1158
|
+
if (route.css?.length && !manifest.inlineCss) route.css = await Promise.all(route.css.map(async (link) => {
|
|
1159
|
+
const result = normalizeTransformAssetResult(await transformFn({
|
|
1160
|
+
url: resolveManifestCssLink(link).href,
|
|
1161
|
+
kind: "stylesheet"
|
|
1162
|
+
}));
|
|
1163
|
+
return assignManifestLink(link, {
|
|
1164
|
+
href: result.href,
|
|
1165
|
+
crossOrigin: result.crossOrigin
|
|
1166
|
+
});
|
|
1167
|
+
}));
|
|
1168
|
+
if (route.scripts?.length) for (const script of route.scripts) {
|
|
1169
|
+
const src = script.attrs?.src;
|
|
1170
|
+
if (typeof src !== "string") continue;
|
|
1171
|
+
const result = await transformScript(src);
|
|
1172
|
+
script.attrs = {
|
|
1173
|
+
...script.attrs,
|
|
1174
|
+
src: result.href
|
|
1175
|
+
};
|
|
1176
|
+
if (result.crossOrigin) script.attrs.crossOrigin = result.crossOrigin;
|
|
1177
|
+
else delete script.attrs.crossOrigin;
|
|
1178
|
+
}
|
|
1179
|
+
}
|
|
1180
|
+
return manifest;
|
|
1181
|
+
}
|
|
1182
|
+
/**
|
|
1183
|
+
* Builds a final ServerManifest without URL transforms. Used when no
|
|
1184
|
+
* transformAssets option is provided.
|
|
1185
|
+
*
|
|
1186
|
+
* Returns a new manifest object so the cached base manifest is never mutated.
|
|
1187
|
+
*/
|
|
1188
|
+
function buildManifest(source, opts) {
|
|
1189
|
+
return {
|
|
1190
|
+
...source.scriptFormat ? { scriptFormat: source.scriptFormat } : {},
|
|
1191
|
+
...opts?.inlineCss !== false && source.inlineCss ? { inlineCss: structuredClone(source.inlineCss) } : {},
|
|
1192
|
+
routes: { ...source.routes }
|
|
1193
|
+
};
|
|
1194
|
+
}
|
|
1195
|
+
//#endregion
|
|
1196
|
+
//#region node_modules/@tanstack/start-server-core/dist/esm/inlineCss.js
|
|
1197
|
+
function getStaticHandlerInlineCssDefault(handlerInlineCss) {
|
|
1198
|
+
if (typeof handlerInlineCss === "function") return;
|
|
1199
|
+
return handlerInlineCss ?? true;
|
|
1200
|
+
}
|
|
1201
|
+
async function resolveInlineCssForRequest(opts) {
|
|
1202
|
+
if (opts.requestInlineCss !== void 0) return opts.requestInlineCss;
|
|
1203
|
+
if (typeof opts.handlerInlineCss === "function") return await opts.handlerInlineCss({ request: opts.request });
|
|
1204
|
+
return opts.handlerInlineCss ?? true;
|
|
1205
|
+
}
|
|
1206
|
+
//#endregion
|
|
1207
|
+
//#region node_modules/@tanstack/start-server-core/dist/esm/finalManifest.js
|
|
1208
|
+
function createCachedBaseManifestLoader(loadBaseManifest) {
|
|
1209
|
+
let baseManifestPromise;
|
|
1210
|
+
return () => {
|
|
1211
|
+
if (!baseManifestPromise) baseManifestPromise = loadBaseManifest().catch((error) => {
|
|
1212
|
+
baseManifestPromise = void 0;
|
|
1213
|
+
throw error;
|
|
1214
|
+
});
|
|
1215
|
+
return baseManifestPromise;
|
|
1216
|
+
};
|
|
1217
|
+
}
|
|
1218
|
+
function createFinalManifestTransformResolver(transformAssets, opts) {
|
|
1219
|
+
const transformConfig = transformAssets !== void 0 ? resolveTransformAssetsConfig(transformAssets) : void 0;
|
|
1220
|
+
const cache = transformConfig ? transformConfig.cache : true;
|
|
1221
|
+
const warmup = !!transformAssets && typeof transformAssets === "object" && "warmup" in transformAssets && transformAssets.warmup === true;
|
|
1222
|
+
let cachedCreateTransformPromise;
|
|
1223
|
+
const clearCachedCreateTransform = () => {
|
|
1224
|
+
cachedCreateTransformPromise = void 0;
|
|
1225
|
+
};
|
|
1226
|
+
return {
|
|
1227
|
+
cache,
|
|
1228
|
+
warmup,
|
|
1229
|
+
clearCachedCreateTransform,
|
|
1230
|
+
getTransformFn: async (ctx) => {
|
|
1231
|
+
if (!transformConfig) return void 0;
|
|
1232
|
+
if (transformConfig.type !== "createTransform") return transformConfig.transformFn;
|
|
1233
|
+
if (!cache || !opts.cacheCreateTransform) return transformConfig.createTransform(ctx);
|
|
1234
|
+
if (!cachedCreateTransformPromise) cachedCreateTransformPromise = Promise.resolve(transformConfig.createTransform(ctx)).catch((error) => {
|
|
1235
|
+
clearCachedCreateTransform();
|
|
1236
|
+
throw error;
|
|
1237
|
+
});
|
|
1238
|
+
return cachedCreateTransformPromise;
|
|
1239
|
+
}
|
|
1240
|
+
};
|
|
1241
|
+
}
|
|
1242
|
+
function createFinalManifestResolver(opts) {
|
|
1243
|
+
const finalManifestCache = /* @__PURE__ */ new Map();
|
|
1244
|
+
const transformResolver = createFinalManifestTransformResolver(opts.transformAssets, { cacheCreateTransform: opts.cacheCreateTransform });
|
|
1245
|
+
const handlerDefaultInlineCss = getStaticHandlerInlineCssDefault(opts.inlineCss);
|
|
1246
|
+
const getRequestManifestOptions = async (requestOpts) => {
|
|
1247
|
+
const transformFn = await transformResolver.getTransformFn({
|
|
1248
|
+
warmup: false,
|
|
1249
|
+
request: requestOpts.request
|
|
1250
|
+
});
|
|
1251
|
+
const inlineCss = await resolveInlineCssForRequest({
|
|
1252
|
+
request: requestOpts.request,
|
|
1253
|
+
handlerInlineCss: opts.inlineCss,
|
|
1254
|
+
requestInlineCss: requestOpts.requestInlineCss
|
|
1255
|
+
});
|
|
1256
|
+
return {
|
|
1257
|
+
getBaseManifest: requestOpts.getBaseManifest,
|
|
1258
|
+
transformFn,
|
|
1259
|
+
cache: transformResolver.cache,
|
|
1260
|
+
inlineCss
|
|
1261
|
+
};
|
|
1262
|
+
};
|
|
1263
|
+
const resolveRequest = async (requestOpts, cache) => {
|
|
1264
|
+
return resolveFinalManifest({
|
|
1265
|
+
...await getRequestManifestOptions(requestOpts),
|
|
1266
|
+
finalManifestCache: cache
|
|
1267
|
+
});
|
|
1268
|
+
};
|
|
1269
|
+
return {
|
|
1270
|
+
warmup: ({ getBaseManifest }) => warmupFinalManifest({
|
|
1271
|
+
enabled: transformResolver.warmup,
|
|
1272
|
+
handlerDefaultInlineCss,
|
|
1273
|
+
cache: transformResolver.cache,
|
|
1274
|
+
finalManifestCache,
|
|
1275
|
+
getBaseManifest,
|
|
1276
|
+
getTransformFn: () => transformResolver.getTransformFn({ warmup: true }),
|
|
1277
|
+
onError: transformResolver.clearCachedCreateTransform
|
|
1278
|
+
}),
|
|
1279
|
+
resolveCached: (requestOpts) => resolveRequest(requestOpts, finalManifestCache),
|
|
1280
|
+
resolveUncached: (requestOpts) => resolveRequest(requestOpts, void 0)
|
|
1281
|
+
};
|
|
1282
|
+
}
|
|
1283
|
+
function getFinalManifestCacheKey(inlineCss) {
|
|
1284
|
+
return inlineCss ? "inline-css" : "linked-css";
|
|
1285
|
+
}
|
|
1286
|
+
function cacheFinalManifestPromise(cachedFinalManifestPromises, cacheKey, promise) {
|
|
1287
|
+
const cachedFinalManifestPromise = promise.catch((error) => {
|
|
1288
|
+
if (cachedFinalManifestPromises.get(cacheKey) === cachedFinalManifestPromise) cachedFinalManifestPromises.delete(cacheKey);
|
|
1289
|
+
throw error;
|
|
1290
|
+
});
|
|
1291
|
+
cachedFinalManifestPromises.set(cacheKey, cachedFinalManifestPromise);
|
|
1292
|
+
return cachedFinalManifestPromise;
|
|
1293
|
+
}
|
|
1294
|
+
function getOrCreateCachedFinalManifestPromise(cachedFinalManifestPromises, cacheKey, computeFinalManifest) {
|
|
1295
|
+
const cachedFinalManifestPromise = cachedFinalManifestPromises.get(cacheKey);
|
|
1296
|
+
if (cachedFinalManifestPromise) return cachedFinalManifestPromise;
|
|
1297
|
+
return cacheFinalManifestPromise(cachedFinalManifestPromises, cacheKey, Promise.resolve().then(computeFinalManifest));
|
|
1298
|
+
}
|
|
1299
|
+
async function buildFinalManifest(opts) {
|
|
1300
|
+
return opts.transformFn ? await transformManifestAssets(opts.base, opts.transformFn, { inlineCss: opts.inlineCss }) : buildManifest(opts.base, { inlineCss: opts.inlineCss });
|
|
1301
|
+
}
|
|
1302
|
+
async function resolveFinalManifest(opts) {
|
|
1303
|
+
const computeFinalManifest = async () => {
|
|
1304
|
+
return buildFinalManifest({
|
|
1305
|
+
base: await opts.getBaseManifest(),
|
|
1306
|
+
transformFn: opts.transformFn,
|
|
1307
|
+
inlineCss: opts.inlineCss
|
|
1308
|
+
});
|
|
1309
|
+
};
|
|
1310
|
+
if (opts.finalManifestCache && (!opts.transformFn || opts.cache)) return getOrCreateCachedFinalManifestPromise(opts.finalManifestCache, getFinalManifestCacheKey(opts.inlineCss), computeFinalManifest);
|
|
1311
|
+
return computeFinalManifest();
|
|
1312
|
+
}
|
|
1313
|
+
function warmupFinalManifest(opts) {
|
|
1314
|
+
if (!opts.enabled || opts.handlerDefaultInlineCss === void 0 || !opts.cache) return;
|
|
1315
|
+
const inlineCss = opts.handlerDefaultInlineCss;
|
|
1316
|
+
const warmupPromise = getOrCreateCachedFinalManifestPromise(opts.finalManifestCache, getFinalManifestCacheKey(inlineCss), async () => {
|
|
1317
|
+
const [base, transformFn] = await Promise.all([opts.getBaseManifest(), opts.getTransformFn()]);
|
|
1318
|
+
return buildFinalManifest({
|
|
1319
|
+
base,
|
|
1320
|
+
transformFn,
|
|
1321
|
+
inlineCss
|
|
1322
|
+
});
|
|
1323
|
+
});
|
|
1324
|
+
if (opts.onError) warmupPromise.catch(opts.onError);
|
|
1325
|
+
return warmupPromise;
|
|
1326
|
+
}
|
|
1327
|
+
//#endregion
|
|
1328
|
+
//#region node_modules/@tanstack/start-server-core/dist/esm/serializer/ServerFunctionSerializationAdapter.js
|
|
1329
|
+
var ServerFunctionSerializationAdapter = createSerializationAdapter({
|
|
1330
|
+
key: "$TSS/serverfn",
|
|
1331
|
+
test: (v) => {
|
|
1332
|
+
if (typeof v !== "function") return false;
|
|
1333
|
+
if (!(TSS_SERVER_FUNCTION in v)) return false;
|
|
1334
|
+
return !!v[TSS_SERVER_FUNCTION];
|
|
1335
|
+
},
|
|
1336
|
+
toSerializable: ({ serverFnMeta }) => ({ functionId: serverFnMeta.id }),
|
|
1337
|
+
fromSerializable: ({ functionId }) => {
|
|
1338
|
+
const fn = async (opts, signal) => {
|
|
1339
|
+
return (await (await getServerFnById(functionId, { origin: "client" }))(opts ?? {}, signal)).result;
|
|
1340
|
+
};
|
|
1341
|
+
return fn;
|
|
1342
|
+
}
|
|
1343
|
+
});
|
|
1344
|
+
//#endregion
|
|
1345
|
+
//#region node_modules/@tanstack/start-server-core/dist/esm/createStartHandler.js
|
|
1346
|
+
function getStartResponseHeaders(opts) {
|
|
1347
|
+
return mergeHeaders({ "Content-Type": "text/html; charset=utf-8" }, ..._getRenderedMatches(opts.router.stores.matches.get()).map((match) => {
|
|
1348
|
+
return match.headers;
|
|
1349
|
+
}));
|
|
1350
|
+
}
|
|
1351
|
+
var entriesPromise;
|
|
1352
|
+
var defaultCsrfMiddleware = createCsrfMiddleware({ filter: (ctx) => ctx.handlerType === "serverFn" });
|
|
1353
|
+
var getCachedBaseManifest = createCachedBaseManifestLoader(() => getStartManifest());
|
|
1354
|
+
var getProdBaseManifest = () => getCachedBaseManifest();
|
|
1355
|
+
var getBaseManifest = getProdBaseManifest;
|
|
1356
|
+
var createEarlyHintsForRequest = createEarlyHintsCollector;
|
|
1357
|
+
async function loadEntries() {
|
|
1358
|
+
const [routerEntry, startEntry, pluginAdapters] = await Promise.all([
|
|
1359
|
+
import("./assets/router-CN98Ramo.js").then((n) => n.t),
|
|
1360
|
+
import("./assets/start-5Z2QO8AU.js"),
|
|
1361
|
+
import("./assets/empty-plugin-adapters-D9UWiqvJ.js")
|
|
1362
|
+
]);
|
|
1363
|
+
return {
|
|
1364
|
+
routerEntry,
|
|
1365
|
+
startEntry,
|
|
1366
|
+
pluginAdapters
|
|
1367
|
+
};
|
|
1368
|
+
}
|
|
1369
|
+
function getEntries() {
|
|
1370
|
+
if (!entriesPromise) entriesPromise = loadEntries();
|
|
1371
|
+
return entriesPromise;
|
|
1372
|
+
}
|
|
1373
|
+
var ROUTER_BASEPATH = "/";
|
|
1374
|
+
var SERVER_FN_BASE = "/_serverFn/";
|
|
1375
|
+
var IS_PRERENDERING = process.env.TSS_PRERENDERING === "true";
|
|
1376
|
+
var IS_SHELL_ENV = process.env.TSS_SHELL === "true";
|
|
1377
|
+
var IS_DEV = false;
|
|
1378
|
+
var ERR_NO_RESPONSE = IS_DEV ? `It looks like you forgot to return a response from your server route handler. If you want to defer to the app router, make sure to have a component set in this route.` : "Internal Server Error";
|
|
1379
|
+
var ERR_NO_DEFER = IS_DEV ? `You cannot defer to the app router if there is no component defined on this route.` : "Internal Server Error";
|
|
1380
|
+
function throwRouteHandlerError() {
|
|
1381
|
+
throw new Error(ERR_NO_RESPONSE);
|
|
1382
|
+
}
|
|
1383
|
+
function throwIfMayNotDefer() {
|
|
1384
|
+
throw new Error(ERR_NO_DEFER);
|
|
1385
|
+
}
|
|
1386
|
+
function getResponseFromResult(result) {
|
|
1387
|
+
return isSsrResponse(result) || result instanceof Response ? result : result?.response;
|
|
1388
|
+
}
|
|
1389
|
+
var responseBodySources = /* @__PURE__ */ new WeakMap();
|
|
1390
|
+
function disposeResponseResult(result, reason) {
|
|
1391
|
+
const response = getResponseFromResult(result);
|
|
1392
|
+
if (isSsrResponse(response) || response instanceof Response) disposeSsrResponse(response, reason);
|
|
1393
|
+
}
|
|
1394
|
+
function hasResponseBody(value) {
|
|
1395
|
+
return value instanceof Response && value.body !== null;
|
|
1396
|
+
}
|
|
1397
|
+
function inheritsResponseOwnership(ownership, candidate) {
|
|
1398
|
+
return hasResponseBody(candidate) && (candidate.body === ownership.response.body || responseBodySources.get(candidate) === ownership.response);
|
|
1399
|
+
}
|
|
1400
|
+
function disposeResponseOwnership(ownership, reason) {
|
|
1401
|
+
const { response, sourceBody, streamResponse } = ownership;
|
|
1402
|
+
streamResponse?.dispose(reason);
|
|
1403
|
+
if (!streamResponse || response.body !== sourceBody) response.body.cancel(reason).catch(() => {});
|
|
1404
|
+
}
|
|
1405
|
+
function getOwnedResponse(ownership) {
|
|
1406
|
+
const { response, sourceBody, streamResponse } = ownership;
|
|
1407
|
+
if (!streamResponse) return response;
|
|
1408
|
+
if (streamResponse.response === response && response.body === sourceBody) return streamResponse;
|
|
1409
|
+
if (response.body === sourceBody) return {
|
|
1410
|
+
...streamResponse,
|
|
1411
|
+
response
|
|
1412
|
+
};
|
|
1413
|
+
return {
|
|
1414
|
+
...streamResponse,
|
|
1415
|
+
response,
|
|
1416
|
+
dispose(reason) {
|
|
1417
|
+
disposeResponseOwnership(ownership, reason);
|
|
1418
|
+
}
|
|
1419
|
+
};
|
|
1420
|
+
}
|
|
1421
|
+
function createLateResponseDisposer(signal) {
|
|
1422
|
+
return (result) => disposeResponseResult(result, signal.reason);
|
|
1423
|
+
}
|
|
1424
|
+
/**
|
|
1425
|
+
* Compose middleware around a terminal response handler. With no middleware
|
|
1426
|
+
* the terminal runs directly.
|
|
1427
|
+
*/
|
|
1428
|
+
async function executeMiddleware(middlewares, terminal, ctx, signal, terminalNext) {
|
|
1429
|
+
let index = -1;
|
|
1430
|
+
let responseOwnership;
|
|
1431
|
+
let settled = false;
|
|
1432
|
+
const disposeAbandonedResult = createLateResponseDisposer(signal);
|
|
1433
|
+
const setResponse = (response) => {
|
|
1434
|
+
const ssrResponse = isSsrResponse(response) ? response : void 0;
|
|
1435
|
+
const streamResponse = ssrResponse?.serverSsrCleanup === "stream" ? ssrResponse : void 0;
|
|
1436
|
+
const exposed = ssrResponse ? ssrResponse.response : response;
|
|
1437
|
+
const current = responseOwnership;
|
|
1438
|
+
if (settled) {
|
|
1439
|
+
if (exposed !== ctx.response) disposeResponseResult(response, "late middleware response");
|
|
1440
|
+
return;
|
|
1441
|
+
}
|
|
1442
|
+
if (current && current.response === exposed) current.streamResponse ??= streamResponse;
|
|
1443
|
+
else if (current && inheritsResponseOwnership(current, exposed)) {
|
|
1444
|
+
current.response = exposed;
|
|
1445
|
+
current.streamResponse ??= streamResponse;
|
|
1446
|
+
} else {
|
|
1447
|
+
if (current) disposeResponseOwnership(current, "middleware response replaced");
|
|
1448
|
+
if (hasResponseBody(exposed)) responseOwnership = {
|
|
1449
|
+
response: exposed,
|
|
1450
|
+
sourceBody: exposed.body,
|
|
1451
|
+
streamResponse
|
|
1452
|
+
};
|
|
1453
|
+
else responseOwnership = void 0;
|
|
1454
|
+
}
|
|
1455
|
+
ctx.response = exposed;
|
|
1456
|
+
};
|
|
1457
|
+
const reconcileCtxResponse = () => {
|
|
1458
|
+
if (ctx.response !== responseOwnership?.response) setResponse(ctx.response);
|
|
1459
|
+
};
|
|
1460
|
+
let nextPromise;
|
|
1461
|
+
function next(nextCtx) {
|
|
1462
|
+
const result = runNext(nextCtx);
|
|
1463
|
+
nextPromise = result;
|
|
1464
|
+
return result;
|
|
1465
|
+
}
|
|
1466
|
+
async function runNext(nextCtx) {
|
|
1467
|
+
signal.throwIfAborted();
|
|
1468
|
+
if (nextCtx) {
|
|
1469
|
+
if (nextCtx.context) ctx.context = safeObjectMerge(ctx.context, nextCtx.context);
|
|
1470
|
+
for (const key of Object.keys(nextCtx)) if (key === "response") setResponse(nextCtx.response);
|
|
1471
|
+
else if (key !== "context") ctx[key] = nextCtx[key];
|
|
1472
|
+
}
|
|
1473
|
+
index++;
|
|
1474
|
+
const isTerminal = index === middlewares.length;
|
|
1475
|
+
const middleware = index < middlewares.length ? middlewares[index] : isTerminal ? terminal : void 0;
|
|
1476
|
+
const middlewareNext = isTerminal && terminalNext ? terminalNext : next;
|
|
1477
|
+
if (!middleware) return ctx;
|
|
1478
|
+
let result;
|
|
1479
|
+
try {
|
|
1480
|
+
const pending = middleware({
|
|
1481
|
+
...ctx,
|
|
1482
|
+
next: middlewareNext
|
|
1483
|
+
});
|
|
1484
|
+
if (nextPromise && pending === nextPromise) {
|
|
1485
|
+
nextPromise = void 0;
|
|
1486
|
+
await pending;
|
|
1487
|
+
if (signal.aborted) throw signal.reason;
|
|
1488
|
+
return ctx;
|
|
1489
|
+
} else if (!isPromise(pending)) {
|
|
1490
|
+
result = pending;
|
|
1491
|
+
signal.throwIfAborted();
|
|
1492
|
+
} else result = await waitForRequest(pending, signal, disposeAbandonedResult, disposeAbandonedResult);
|
|
1493
|
+
} catch (err) {
|
|
1494
|
+
reconcileCtxResponse();
|
|
1495
|
+
if (signal.aborted) {
|
|
1496
|
+
if (result !== void 0) disposeAbandonedResult(result);
|
|
1497
|
+
if (err !== signal.reason) disposeAbandonedResult(err);
|
|
1498
|
+
throw signal.reason;
|
|
1499
|
+
}
|
|
1500
|
+
if (err instanceof Response) {
|
|
1501
|
+
setResponse(err);
|
|
1502
|
+
return ctx;
|
|
1503
|
+
}
|
|
1504
|
+
throw err;
|
|
1505
|
+
}
|
|
1506
|
+
if (isTerminal && terminalNext && !result) throwRouteHandlerError();
|
|
1507
|
+
reconcileCtxResponse();
|
|
1508
|
+
if (result && result !== ctx) {
|
|
1509
|
+
const response = getResponseFromResult(result);
|
|
1510
|
+
if (response !== void 0 && response !== ctx.response) setResponse(response);
|
|
1511
|
+
if (response !== result && result.context && result.context !== ctx.context) ctx.context = safeObjectMerge(ctx.context, result.context);
|
|
1512
|
+
}
|
|
1513
|
+
return ctx;
|
|
1514
|
+
}
|
|
1515
|
+
try {
|
|
1516
|
+
await runNext();
|
|
1517
|
+
const response = ctx.response;
|
|
1518
|
+
if (!response) throwRouteHandlerError();
|
|
1519
|
+
reconcileCtxResponse();
|
|
1520
|
+
if (signal.aborted) throw signal.reason;
|
|
1521
|
+
settled = true;
|
|
1522
|
+
return responseOwnership ? getOwnedResponse(responseOwnership) : response;
|
|
1523
|
+
} catch (err) {
|
|
1524
|
+
settled = true;
|
|
1525
|
+
if (responseOwnership) disposeResponseOwnership(responseOwnership, signal.aborted ? signal.reason : err);
|
|
1526
|
+
throw err;
|
|
1527
|
+
}
|
|
1528
|
+
}
|
|
1529
|
+
/**
|
|
1530
|
+
* Creates the TanStack Start request handler.
|
|
1531
|
+
*
|
|
1532
|
+
* @example Backwards-compatible usage (handler callback only):
|
|
1533
|
+
* ```ts
|
|
1534
|
+
* export default createStartHandler(defaultStreamHandler)
|
|
1535
|
+
* ```
|
|
1536
|
+
*
|
|
1537
|
+
* @example With CDN URL rewriting:
|
|
1538
|
+
* ```ts
|
|
1539
|
+
* export default createStartHandler({
|
|
1540
|
+
* handler: defaultStreamHandler,
|
|
1541
|
+
* transformAssets: 'https://cdn.example.com',
|
|
1542
|
+
* })
|
|
1543
|
+
* ```
|
|
1544
|
+
*
|
|
1545
|
+
* @example With per-request URL rewriting:
|
|
1546
|
+
* ```ts
|
|
1547
|
+
* export default createStartHandler({
|
|
1548
|
+
* handler: defaultStreamHandler,
|
|
1549
|
+
* transformAssets: {
|
|
1550
|
+
* transform: ({ url }) => {
|
|
1551
|
+
* const cdnBase = getRequest().headers.get('x-cdn-base') || ''
|
|
1552
|
+
* return { href: `${cdnBase}${url}` }
|
|
1553
|
+
* },
|
|
1554
|
+
* cache: false,
|
|
1555
|
+
* },
|
|
1556
|
+
* })
|
|
1557
|
+
* ```
|
|
1558
|
+
*/
|
|
1559
|
+
function createStartHandler(cbOrOptions) {
|
|
1560
|
+
const handlerOptions = typeof cbOrOptions === "function" ? {} : cbOrOptions;
|
|
1561
|
+
const cb = typeof cbOrOptions === "function" ? cbOrOptions : cbOrOptions.handler;
|
|
1562
|
+
const finalManifestResolver = createFinalManifestResolver({
|
|
1563
|
+
...handlerOptions,
|
|
1564
|
+
cacheCreateTransform: true
|
|
1565
|
+
});
|
|
1566
|
+
const resolveManifestForRequest = finalManifestResolver.resolveCached;
|
|
1567
|
+
finalManifestResolver.warmup({ getBaseManifest: () => getBaseManifest(void 0) });
|
|
1568
|
+
const startRequestResolver = async (request, requestOpts) => {
|
|
1569
|
+
const signal = request.signal;
|
|
1570
|
+
let router;
|
|
1571
|
+
let routerPromise;
|
|
1572
|
+
let responseOwnsCleanup = false;
|
|
1573
|
+
try {
|
|
1574
|
+
signal.throwIfAborted();
|
|
1575
|
+
const { url, handledProtocolRelativeURL } = getNormalizedURL(request.url);
|
|
1576
|
+
const href = url.pathname + url.search + url.hash;
|
|
1577
|
+
const origin = url.origin;
|
|
1578
|
+
if (handledProtocolRelativeURL) return Response.redirect(url, 308);
|
|
1579
|
+
const entries = await waitForRequest(getEntries(), signal);
|
|
1580
|
+
const isServerFnRequest = !!SERVER_FN_BASE && url.pathname.startsWith(SERVER_FN_BASE);
|
|
1581
|
+
const startInstance = entries.startEntry.startInstance;
|
|
1582
|
+
let startOptions;
|
|
1583
|
+
if (startInstance) {
|
|
1584
|
+
const pendingStartOptions = startInstance.getOptions();
|
|
1585
|
+
startOptions = isPromise(pendingStartOptions) ? await waitForRequest(pendingStartOptions, signal) : pendingStartOptions;
|
|
1586
|
+
signal.throwIfAborted();
|
|
1587
|
+
} else startOptions = {};
|
|
1588
|
+
const { hasPluginAdapters, pluginSerializationAdapters } = entries.pluginAdapters;
|
|
1589
|
+
const serializationAdapters = [
|
|
1590
|
+
...startOptions.serializationAdapters || [],
|
|
1591
|
+
...hasPluginAdapters ? pluginSerializationAdapters : [],
|
|
1592
|
+
ServerFunctionSerializationAdapter
|
|
1593
|
+
];
|
|
1594
|
+
const requestStartOptions = {
|
|
1595
|
+
...startOptions,
|
|
1596
|
+
requestMiddleware: startInstance ? startOptions.requestMiddleware : isServerFnRequest ? [defaultCsrfMiddleware] : void 0,
|
|
1597
|
+
serializationAdapters
|
|
1598
|
+
};
|
|
1599
|
+
const flattenedRequestMiddlewares = requestStartOptions.requestMiddleware ? flattenMiddlewares(requestStartOptions.requestMiddleware) : [];
|
|
1600
|
+
const executedRequestMiddlewares = new Set(flattenedRequestMiddlewares);
|
|
1601
|
+
const getRouter = () => {
|
|
1602
|
+
routerPromise ??= (async () => {
|
|
1603
|
+
signal.throwIfAborted();
|
|
1604
|
+
const requestRouter = await waitForRequest(entries.routerEntry.getRouter(), signal);
|
|
1605
|
+
let isShell = IS_SHELL_ENV;
|
|
1606
|
+
if (IS_PRERENDERING && !isShell) isShell = request.headers.get(HEADERS.TSS_SHELL) === "true";
|
|
1607
|
+
const history = createServerHistory(href);
|
|
1608
|
+
requestRouter.update({
|
|
1609
|
+
history,
|
|
1610
|
+
isShell,
|
|
1611
|
+
isPrerendering: IS_PRERENDERING,
|
|
1612
|
+
origin: requestRouter.options.origin ?? origin,
|
|
1613
|
+
defaultSsr: requestStartOptions.defaultSsr,
|
|
1614
|
+
serializationAdapters: [...requestStartOptions.serializationAdapters, ...requestRouter.options.serializationAdapters || []],
|
|
1615
|
+
basepath: ROUTER_BASEPATH
|
|
1616
|
+
});
|
|
1617
|
+
router = requestRouter;
|
|
1618
|
+
return requestRouter;
|
|
1619
|
+
})();
|
|
1620
|
+
return routerPromise;
|
|
1621
|
+
};
|
|
1622
|
+
const handlerType = isServerFnRequest ? "serverFn" : "router";
|
|
1623
|
+
const startContext = {
|
|
1624
|
+
getRouter,
|
|
1625
|
+
startOptions: requestStartOptions,
|
|
1626
|
+
request,
|
|
1627
|
+
executedRequestMiddlewares,
|
|
1628
|
+
handlerType
|
|
1629
|
+
};
|
|
1630
|
+
let terminal;
|
|
1631
|
+
if (isServerFnRequest) {
|
|
1632
|
+
const serverFnId = url.pathname.slice(SERVER_FN_BASE.length).split("/")[0];
|
|
1633
|
+
if (!serverFnId) throw new Error("Invalid server action param for serverFnId");
|
|
1634
|
+
terminal = ({ context }) => runWithStartContext({
|
|
1635
|
+
...startContext,
|
|
1636
|
+
contextAfterGlobalMiddlewares: context
|
|
1637
|
+
}, () => handleServerAction({
|
|
1638
|
+
request,
|
|
1639
|
+
context: requestOpts?.context,
|
|
1640
|
+
serverFnId
|
|
1641
|
+
}));
|
|
1642
|
+
} else {
|
|
1643
|
+
const executeRouter = async (serverContext, matchedRoutes) => {
|
|
1644
|
+
if (!/(^|,)\s*(\*\/\*|text\/html)/.test(request.headers.get("Accept") || "*/*")) return normalizeSsrResponse(Response.json({ error: "Only HTML requests are supported here" }, { status: 406 }));
|
|
1645
|
+
const manifest = await waitForRequest(resolveManifestForRequest({
|
|
1646
|
+
request,
|
|
1647
|
+
requestInlineCss: requestOpts?.inlineCss,
|
|
1648
|
+
getBaseManifest: () => getBaseManifest(matchedRoutes)
|
|
1649
|
+
}), signal);
|
|
1650
|
+
const earlyHints = createEarlyHintsForRequest({
|
|
1651
|
+
onEarlyHints: requestOpts?.onEarlyHints,
|
|
1652
|
+
responseLinkHeader: requestOpts?.responseLinkHeader
|
|
1653
|
+
});
|
|
1654
|
+
earlyHints?.collectStatic({
|
|
1655
|
+
manifest,
|
|
1656
|
+
matchedRoutes
|
|
1657
|
+
});
|
|
1658
|
+
const routerInstance = await getRouter();
|
|
1659
|
+
attachRouterServerSsrUtils({
|
|
1660
|
+
router: routerInstance,
|
|
1661
|
+
manifest,
|
|
1662
|
+
getRequestAssets: () => getStartContext({ throwIfNotFound: false })?.requestAssets
|
|
1663
|
+
});
|
|
1664
|
+
routerInstance.options.additionalContext = { serverContext };
|
|
1665
|
+
await routerInstance.load({ _signal: signal });
|
|
1666
|
+
signal.throwIfAborted();
|
|
1667
|
+
if (routerInstance._serverResult?.type === "redirect") return normalizeSsrResponse(routerInstance._serverResult.redirect);
|
|
1668
|
+
earlyHints?.collectDynamic(_getRenderedMatches(routerInstance.stores.matches.get()));
|
|
1669
|
+
const ctx = getStartContext({ throwIfNotFound: false });
|
|
1670
|
+
await routerInstance.serverSsr.dehydrate({
|
|
1671
|
+
requestAssets: ctx?.requestAssets,
|
|
1672
|
+
signal
|
|
1673
|
+
});
|
|
1674
|
+
signal.throwIfAborted();
|
|
1675
|
+
const responseHeaders = getStartResponseHeaders({ router: routerInstance });
|
|
1676
|
+
earlyHints?.appendResponseHeaders(responseHeaders);
|
|
1677
|
+
signal.throwIfAborted();
|
|
1678
|
+
const disposeLate = createLateResponseDisposer(signal);
|
|
1679
|
+
return normalizeSsrResponse(await waitForRequest(cb({
|
|
1680
|
+
request,
|
|
1681
|
+
router: routerInstance,
|
|
1682
|
+
responseHeaders
|
|
1683
|
+
}), signal, disposeLate, disposeLate));
|
|
1684
|
+
};
|
|
1685
|
+
terminal = ({ context }) => runWithStartContext({
|
|
1686
|
+
...startContext,
|
|
1687
|
+
contextAfterGlobalMiddlewares: context
|
|
1688
|
+
}, () => handleServerRoutes({
|
|
1689
|
+
getRouter,
|
|
1690
|
+
request,
|
|
1691
|
+
url,
|
|
1692
|
+
executeRouter,
|
|
1693
|
+
context,
|
|
1694
|
+
executedRequestMiddlewares
|
|
1695
|
+
}));
|
|
1696
|
+
}
|
|
1697
|
+
const middlewareResponse = await executeMiddleware(flattenedRequestMiddlewares.map((d) => d.options.server), terminal, {
|
|
1698
|
+
request,
|
|
1699
|
+
pathname: url.pathname,
|
|
1700
|
+
handlerType,
|
|
1701
|
+
context: createNullProtoObject(requestOpts?.context)
|
|
1702
|
+
}, signal);
|
|
1703
|
+
let result;
|
|
1704
|
+
try {
|
|
1705
|
+
result = await handleRedirectResponse(middlewareResponse, getRouter, signal, isServerFnRequest && request.headers.get("x-tsr-serverFn") === "true");
|
|
1706
|
+
if (request.method === "HEAD") result = stripSsrResponseBody(result, "HEAD body stripped");
|
|
1707
|
+
} catch (error) {
|
|
1708
|
+
disposeResponseResult(middlewareResponse, signal.aborted ? signal.reason : error);
|
|
1709
|
+
throw error;
|
|
1710
|
+
}
|
|
1711
|
+
bindSsrResponseToRequest(router, result, signal);
|
|
1712
|
+
signal.throwIfAborted();
|
|
1713
|
+
responseOwnsCleanup = result.serverSsrCleanup === "stream";
|
|
1714
|
+
return result.response;
|
|
1715
|
+
} finally {
|
|
1716
|
+
if (router?.serverSsr && !responseOwnsCleanup) router.serverSsr.cleanup();
|
|
1717
|
+
}
|
|
1718
|
+
};
|
|
1719
|
+
return requestHandler(startRequestResolver);
|
|
1720
|
+
}
|
|
1721
|
+
var relativeRedirectProtocols = /* @__PURE__ */ new Set();
|
|
1722
|
+
async function handleRedirectResponse(response, getRouter, signal, serializeRedirect) {
|
|
1723
|
+
signal.throwIfAborted();
|
|
1724
|
+
const ssrResponse = normalizeSsrResponse(response);
|
|
1725
|
+
const redirect = ssrResponse.response;
|
|
1726
|
+
if (!isRedirect(redirect)) return ssrResponse;
|
|
1727
|
+
const opts = redirect.options;
|
|
1728
|
+
const href = redirect.headers.get("Location") || opts.href;
|
|
1729
|
+
if (!href && 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)}`);
|
|
1730
|
+
if (!href && [
|
|
1731
|
+
"params",
|
|
1732
|
+
"search",
|
|
1733
|
+
"hash"
|
|
1734
|
+
].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(", ")}`);
|
|
1735
|
+
signal.throwIfAborted();
|
|
1736
|
+
if (href && !isDangerousProtocol(href, relativeRedirectProtocols)) {
|
|
1737
|
+
opts.href = href;
|
|
1738
|
+
redirect.headers.set("Location", href);
|
|
1739
|
+
} else {
|
|
1740
|
+
const router = await getRouter();
|
|
1741
|
+
signal.throwIfAborted();
|
|
1742
|
+
router.resolveRedirect(redirect);
|
|
1743
|
+
}
|
|
1744
|
+
if (serializeRedirect) {
|
|
1745
|
+
const redirectOptions = { ...opts };
|
|
1746
|
+
delete redirectOptions.headers;
|
|
1747
|
+
const responseHeaders = new Headers(redirect.headers);
|
|
1748
|
+
responseHeaders.set("content-type", "application/json");
|
|
1749
|
+
return replaceSsrResponse(ssrResponse, Response.json({
|
|
1750
|
+
...redirectOptions,
|
|
1751
|
+
isSerializedRedirect: true
|
|
1752
|
+
}, { headers: responseHeaders }), "redirect response replaced");
|
|
1753
|
+
}
|
|
1754
|
+
return ssrResponse;
|
|
1755
|
+
}
|
|
1756
|
+
async function handleServerRoutes({ getRouter, request, url, executeRouter, context, executedRequestMiddlewares }) {
|
|
1757
|
+
const router = await getRouter();
|
|
1758
|
+
const pathname = executeRewriteInput(router.rewrite, url).pathname;
|
|
1759
|
+
const [matchedRoutes, rawParams, foundRoute] = router.getMatchedRoutes(pathname);
|
|
1760
|
+
const isExactMatch = foundRoute && rawParams["**"] === void 0;
|
|
1761
|
+
const routeMiddlewares = [];
|
|
1762
|
+
let terminalHandler = (ctx) => executeRouter(ctx.context, matchedRoutes);
|
|
1763
|
+
let terminalNext;
|
|
1764
|
+
for (const route of matchedRoutes) {
|
|
1765
|
+
const serverMiddleware = route.options.server?.middleware;
|
|
1766
|
+
if (serverMiddleware) {
|
|
1767
|
+
const flattened = flattenMiddlewares(serverMiddleware);
|
|
1768
|
+
for (const m of flattened) if (!executedRequestMiddlewares.has(m)) routeMiddlewares.push(m.options.server);
|
|
1769
|
+
}
|
|
1770
|
+
}
|
|
1771
|
+
const server = foundRoute?.options.server;
|
|
1772
|
+
if (server?.handlers && isExactMatch) {
|
|
1773
|
+
const handlers = typeof server.handlers === "function" ? server.handlers({ createHandlers: (d) => d }) : server.handlers;
|
|
1774
|
+
const requestMethod = request.method.toUpperCase();
|
|
1775
|
+
const handler = requestMethod === "HEAD" ? handlers["HEAD"] ?? handlers["GET"] ?? handlers["ANY"] : handlers[requestMethod] ?? handlers["ANY"];
|
|
1776
|
+
if (handler) {
|
|
1777
|
+
const mayDefer = !!foundRoute.options.component;
|
|
1778
|
+
if (typeof handler === "function") if (!mayDefer) {
|
|
1779
|
+
terminalHandler = handler;
|
|
1780
|
+
terminalNext = throwIfMayNotDefer;
|
|
1781
|
+
} else routeMiddlewares.push(handler);
|
|
1782
|
+
else {
|
|
1783
|
+
if (handler.middleware?.length) {
|
|
1784
|
+
const handlerMiddlewares = flattenMiddlewares(handler.middleware);
|
|
1785
|
+
for (const m of handlerMiddlewares) routeMiddlewares.push(m.options.server);
|
|
1786
|
+
}
|
|
1787
|
+
if (handler.handler) if (!mayDefer) {
|
|
1788
|
+
terminalHandler = handler.handler;
|
|
1789
|
+
terminalNext = throwIfMayNotDefer;
|
|
1790
|
+
} else routeMiddlewares.push(handler.handler);
|
|
1791
|
+
}
|
|
1792
|
+
}
|
|
1793
|
+
}
|
|
1794
|
+
return normalizeSsrResponse(await executeMiddleware(routeMiddlewares, terminalHandler, {
|
|
1795
|
+
request,
|
|
1796
|
+
context,
|
|
1797
|
+
params: rawParams,
|
|
1798
|
+
pathname,
|
|
1799
|
+
handlerType: "router"
|
|
1800
|
+
}, request.signal, terminalNext));
|
|
1801
|
+
}
|
|
1802
|
+
//#endregion
|
|
1803
|
+
//#region node_modules/@tanstack/react-start/dist/plugin/default-entry/server.ts
|
|
1804
|
+
var fetch = createStartHandler(defaultStreamHandler);
|
|
1805
|
+
function createServerEntry(entry) {
|
|
1806
|
+
return { async fetch(...args) {
|
|
1807
|
+
return await entry.fetch(...args);
|
|
1808
|
+
} };
|
|
1809
|
+
}
|
|
1810
|
+
var server_default = createServerEntry({ fetch });
|
|
1811
|
+
//#endregion
|
|
1812
|
+
export { createServerEntry, server_default as default };
|