gemi 0.192.0 → 0.193.1
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/{chunk-qg60pgve.js → chunk-fhvyq67n.js} +1 -1
- package/dist/{chunk-qnc840pb.js → chunk-gsrf5c3c.js} +2 -2
- package/dist/{chunk-qnc840pb.js.map → chunk-gsrf5c3c.js.map} +1 -1
- package/dist/chunk-vese6sny.js +24 -0
- package/dist/{chunk-mx9zcq7w.js.map → chunk-vese6sny.js.map} +3 -3
- package/dist/chunks/{RealtimeClient-CyGWZr6p.js → RealtimeClient-BVQeh_yg.js} +2 -2
- package/dist/chunks/{RealtimeClient-CyGWZr6p.js.map → RealtimeClient-BVQeh_yg.js.map} +1 -1
- package/dist/chunks/{ThemeProvider-BnmnRvEc.js → ThemeProvider-G2g5Z1ZS.js} +142 -30
- package/dist/chunks/{ThemeProvider-BnmnRvEc.js.map → ThemeProvider-G2g5Z1ZS.js.map} +1 -1
- package/dist/chunks/{fetchFileRequest-D4fAcY7D.js → fetchFileRequest-Bzva9J59.js} +2 -2
- package/dist/chunks/{fetchFileRequest-D4fAcY7D.js.map → fetchFileRequest-Bzva9J59.js.map} +1 -1
- package/dist/chunks/{live-B4RW02g2.js → live-C2Sck5PO.js} +3 -3
- package/dist/chunks/{live-B4RW02g2.js.map → live-C2Sck5PO.js.map} +1 -1
- package/dist/chunks/{mutationExtras-DgdYjcaa.js → mutationExtras-HC7AC6zn.js} +2 -2
- package/dist/chunks/{mutationExtras-DgdYjcaa.js.map → mutationExtras-HC7AC6zn.js.map} +1 -1
- package/dist/chunks/{subscriptionStream-Ca5V54ee.js → subscriptionStream-CaTWWJwt.js} +2 -2
- package/dist/chunks/{subscriptionStream-Ca5V54ee.js.map → subscriptionStream-CaTWWJwt.js.map} +1 -1
- package/dist/client/chunkLoadRecovery.d.ts +42 -5
- package/dist/client/chunkLoadRecovery.d.ts.map +1 -1
- package/dist/client/index.js +4 -4
- package/dist/server/index.js +1 -1
- package/dist/testing/index.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-mx9zcq7w.js +0 -24
- /package/dist/{chunk-qg60pgve.js.map → chunk-fhvyq67n.js.map} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { X as applyParams, gt as QueryError, pt as parseRetryAfter } from "./ThemeProvider-
|
|
1
|
+
import { X as applyParams, gt as QueryError, pt as parseRetryAfter } from "./ThemeProvider-G2g5Z1ZS.js";
|
|
2
2
|
//#region client/fetchFileRequest.ts
|
|
3
3
|
/**
|
|
4
4
|
* `fetchBlob` / `fetchText` once loaded: the `GET`, a `QueryError` for a
|
|
@@ -54,4 +54,4 @@ function filenameOf(response) {
|
|
|
54
54
|
//#endregion
|
|
55
55
|
export { fetchFile, filenameOf };
|
|
56
56
|
|
|
57
|
-
//# sourceMappingURL=fetchFileRequest-
|
|
57
|
+
//# sourceMappingURL=fetchFileRequest-Bzva9J59.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetchFileRequest-
|
|
1
|
+
{"version":3,"file":"fetchFileRequest-Bzva9J59.js","names":[],"sources":["../../client/fetchFileRequest.ts"],"sourcesContent":["import { applyParams } from \"../utils/applyParams\";\nimport type { FetchedBlob, FetchedText, FetchFileOptions } from \"./fetchFile\";\nimport { QueryError } from \"./QueryError\";\nimport { parseRetryAfter } from \"./retryPolicy\";\n\n// What `fetchBlob` and `fetchText` in `./fetchFile` load on their first call\n// (#915).\n\ntype RequestOptions = Omit<FetchFileOptions<string>, \"params\"> & {\n params?: Record<string, string | number | undefined>;\n};\n\n/**\n * `fetchBlob` / `fetchText` once loaded: the `GET`, a `QueryError` for a\n * non-2xx, and the body read `as` a blob or text.\n */\nexport async function fetchFile(\n path: string,\n // The caller's `FetchFileOptions<P>`, checked against its path there.\n options: object | undefined,\n as: \"blob\" | \"text\",\n): Promise<FetchedBlob | FetchedText> {\n const response = await request(path, options as RequestOptions);\n const body = as === \"blob\" ? { blob: await response.blob() } : { text: await response.text() };\n return { ...body, filename: filenameOf(response), response } as FetchedBlob | FetchedText;\n}\n\nasync function request(path: string, options: RequestOptions = {}) {\n const { params = {}, search, signal, init } = options;\n const url = applyParams(path, params);\n const query = searchString(search);\n const response = await fetch(`/api${url}${query ? `?${query}` : \"\"}`, {\n ...init,\n method: \"GET\",\n signal,\n });\n if (!response.ok) {\n // An error body that is not JSON (a proxy's HTML 502) is still that status.\n const body = await response.json().catch(() => null);\n throw new QueryError(\n url,\n query,\n response.status,\n body,\n parseRetryAfter(response.headers.get(\"retry-after\")),\n );\n }\n return response;\n}\n\nfunction searchString(search: FetchFileOptions<string>[\"search\"]) {\n if (!search) return \"\";\n if (search instanceof URLSearchParams) return search.toString();\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(search)) {\n if (value !== null && value !== undefined) params.append(key, String(value));\n }\n return params.toString();\n}\n\n/**\n * The file name in a `Content-Disposition` header: the RFC 5987\n * `filename*=UTF-8''...` form when present and decodable, else `filename`.\n *\n * @internal Exported for tests.\n */\nexport function filenameOf(response: Response): string | null {\n const header = response.headers.get(\"content-disposition\");\n if (!header) return null;\n const extended = /filename\\*\\s*=\\s*([^']*)'[^']*'([^;]+)/i.exec(header);\n if (extended) {\n try {\n return decodeURIComponent(extended[2].trim());\n } catch {\n // A malformed escape: fall back to the plain form.\n }\n }\n const plain = /filename\\s*=\\s*(?:\"((?:[^\"\\\\]|\\\\.)*)\"|([^;]+))/i.exec(header);\n if (!plain) return null;\n const name = plain[1] !== undefined ? plain[1].replace(/\\\\(.)/g, \"$1\") : plain[2].trim();\n return name || null;\n}\n"],"mappings":";;;;;;AAgBA,eAAsB,UACpB,MAEA,SACA,IACoC;CACpC,MAAM,WAAW,MAAM,QAAQ,MAAM,OAAyB;CAE9D,OAAO;EAAE,GADI,OAAO,SAAS,EAAE,MAAM,MAAM,SAAS,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,SAAS,KAAK,EAAE;EAC3E,UAAU,WAAW,QAAQ;EAAG;CAAS;AAC7D;AAEA,eAAe,QAAQ,MAAc,UAA0B,CAAC,GAAG;CACjE,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,QAAQ,SAAS;CAC9C,MAAM,MAAM,YAAY,MAAM,MAAM;CACpC,MAAM,QAAQ,aAAa,MAAM;CACjC,MAAM,WAAW,MAAM,MAAM,OAAO,MAAM,QAAQ,IAAI,UAAU,MAAM;EACpE,GAAG;EACH,QAAQ;EACR;CACF,CAAC;CACD,IAAI,CAAC,SAAS,IAAI;EAEhB,MAAM,OAAO,MAAM,SAAS,KAAK,CAAC,CAAC,YAAY,IAAI;EACnD,MAAM,IAAI,WACR,KACA,OACA,SAAS,QACT,MACA,gBAAgB,SAAS,QAAQ,IAAI,aAAa,CAAC,CACrD;CACF;CACA,OAAO;AACT;AAEA,SAAS,aAAa,QAA4C;CAChE,IAAI,CAAC,QAAQ,OAAO;CACpB,IAAI,kBAAkB,iBAAiB,OAAO,OAAO,SAAS;CAC9D,MAAM,SAAS,IAAI,gBAAgB;CACnC,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,GAC9C,IAAI,UAAU,QAAQ,UAAU,KAAA,GAAW,OAAO,OAAO,KAAK,OAAO,KAAK,CAAC;CAE7E,OAAO,OAAO,SAAS;AACzB;;;;;;;AAQA,SAAgB,WAAW,UAAmC;CAC5D,MAAM,SAAS,SAAS,QAAQ,IAAI,qBAAqB;CACzD,IAAI,CAAC,QAAQ,OAAO;CACpB,MAAM,WAAW,0CAA0C,KAAK,MAAM;CACtE,IAAI,UACF,IAAI;EACF,OAAO,mBAAmB,SAAS,EAAE,CAAC,KAAK,CAAC;CAC9C,QAAQ,CAER;CAEF,MAAM,QAAQ,kDAAkD,KAAK,MAAM;CAC3E,IAAI,CAAC,OAAO,OAAO;CAEnB,QADa,MAAM,OAAO,KAAA,IAAY,MAAM,EAAE,CAAC,QAAQ,UAAU,IAAI,IAAI,MAAM,EAAE,CAAC,KAAK,MACxE;AACjB"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { G as realtime, J as loadedModule } from "./ThemeProvider-
|
|
1
|
+
import { G as realtime, J as loadedModule } from "./ThemeProvider-G2g5Z1ZS.js";
|
|
2
2
|
//#region \0rolldown/runtime.js
|
|
3
3
|
var __defProp = Object.defineProperty;
|
|
4
4
|
var __exportAll = (all, no_symbols) => {
|
|
@@ -76,7 +76,7 @@ function followLive(provided, live, resource, setOpen) {
|
|
|
76
76
|
};
|
|
77
77
|
const socket = provided ?? realtime.client;
|
|
78
78
|
if (socket) start(socket);
|
|
79
|
-
else import("./RealtimeClient-
|
|
79
|
+
else import("./RealtimeClient-BVQeh_yg.js").then((module) => start(loadedModule(module).tabClient())).catch(() => {});
|
|
80
80
|
return () => {
|
|
81
81
|
stop?.();
|
|
82
82
|
stop = null;
|
|
@@ -85,4 +85,4 @@ function followLive(provided, live, resource, setOpen) {
|
|
|
85
85
|
//#endregion
|
|
86
86
|
export { live_exports as n, followLive as t };
|
|
87
87
|
|
|
88
|
-
//# sourceMappingURL=live-
|
|
88
|
+
//# sourceMappingURL=live-C2Sck5PO.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"live-
|
|
1
|
+
{"version":3,"file":"live-C2Sck5PO.js","names":[],"sources":["../../client/realtime/live.ts"],"sourcesContent":["import type { QueryResource } from \"../QueryResource\";\nimport type { ChannelPattern } from \"../useChannel\";\nimport { EVENT_COALESCE_MS } from \"./useChannelSubscription\";\nimport type { ChannelParamValues, RealtimeSocket } from \"./RealtimeClient\";\nimport { loadedModule } from \"../lazyModule\";\nimport { realtime } from \"./loader\";\n\n/**\n * `useQuery`'s `live` option: the channel whose events and resyncs refetch\n * the query. A pattern without params (`\"user\"`), `[pattern, params]`, or\n * `{ channel, params }`.\n */\nexport type LiveChannel =\n | ChannelPattern\n | readonly [ChannelPattern, ChannelParamValues]\n | { channel: ChannelPattern; params?: ChannelParamValues };\n\nexport function resolveLiveChannel(\n live: LiveChannel | null | undefined | false,\n): { pattern: string; params: ChannelParamValues } | null {\n if (!live) return null;\n if (typeof live === \"string\") return { pattern: live, params: {} };\n if (Array.isArray(live)) return { pattern: live[0], params: live[1] ?? {} };\n const object = live as { channel: string; params?: ChannelParamValues };\n return { pattern: object.channel, params: object.params ?? {} };\n}\n\n/**\n * `useQuery`'s `live` subscription, loaded on first use by `followLive` in\n * `./loader` (#891). The channel's events refetch every cached variant of the\n * query (the rendered ones now), a burst of them once per\n * `EVENT_COALESCE_MS`; a resync refetches at once. `setOpen` follows whether\n * the channel is open, which pauses the query's polling.\n */\nexport function subscribeLive(\n socket: RealtimeSocket,\n live: LiveChannel,\n resource: () => QueryResource,\n setOpen: (open: boolean) => void,\n): () => void {\n const channel = resolveLiveChannel(live);\n if (!channel) return () => {};\n const refresh = () => {\n const target = resource();\n for (const key of target.variantKeys()) target.invalidate(key);\n };\n let timer: ReturnType<typeof setTimeout> | null = null;\n const release = socket.subscribe(channel.pattern, channel.params, {\n onEvent: () => {\n if (timer) return;\n timer = setTimeout(() => {\n timer = null;\n refresh();\n }, EVENT_COALESCE_MS);\n },\n onResync: refresh,\n onStatus: (status) => setOpen(status === \"open\"),\n });\n return () => {\n if (timer) clearTimeout(timer);\n release();\n };\n}\n\n/**\n * What `followLive` in `./loader` hands over to once this module is loaded:\n * subscribes on the provided socket, or the tab's client, loading that first\n * when it is not there yet. Returns the function that stops it.\n */\nexport function followLive(\n provided: RealtimeSocket | null,\n live: LiveChannel,\n resource: () => QueryResource,\n setOpen: (open: boolean) => void,\n): () => void {\n // `undefined` until it subscribes, `null` once stopped.\n let stop: (() => void) | null | undefined;\n const start = (socket: RealtimeSocket) => {\n if (stop === undefined) stop = subscribeLive(socket, live, resource, setOpen);\n };\n const socket = provided ?? realtime.client;\n if (socket) start(socket);\n // Its own `import()` of the client rather than `loadRealtimeClient`, which\n // would keep that in the entry chunk of every app with a `useQuery`. A\n // failed load leaves the channel closed, so the query keeps polling.\n else\n import(\"./RealtimeClient.js\")\n .then((module) => start(loadedModule(module).tabClient()))\n .catch(() => {});\n return () => {\n stop?.();\n stop = null;\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAiBA,SAAgB,mBACd,MACwD;CACxD,IAAI,CAAC,MAAM,OAAO;CAClB,IAAI,OAAO,SAAS,UAAU,OAAO;EAAE,SAAS;EAAM,QAAQ,CAAC;CAAE;CACjE,IAAI,MAAM,QAAQ,IAAI,GAAG,OAAO;EAAE,SAAS,KAAK;EAAI,QAAQ,KAAK,MAAM,CAAC;CAAE;CAC1E,MAAM,SAAS;CACf,OAAO;EAAE,SAAS,OAAO;EAAS,QAAQ,OAAO,UAAU,CAAC;CAAE;AAChE;;;;;;;;AASA,SAAgB,cACd,QACA,MACA,UACA,SACY;CACZ,MAAM,UAAU,mBAAmB,IAAI;CACvC,IAAI,CAAC,SAAS,aAAa,CAAC;CAC5B,MAAM,gBAAgB;EACpB,MAAM,SAAS,SAAS;EACxB,KAAK,MAAM,OAAO,OAAO,YAAY,GAAG,OAAO,WAAW,GAAG;CAC/D;CACA,IAAI,QAA8C;CAClD,MAAM,UAAU,OAAO,UAAU,QAAQ,SAAS,QAAQ,QAAQ;EAChE,eAAe;GACb,IAAI,OAAO;GACX,QAAQ,iBAAiB;IACvB,QAAQ;IACR,QAAQ;GACV,GAAA,GAAoB;EACtB;EACA,UAAU;EACV,WAAW,WAAW,QAAQ,WAAW,MAAM;CACjD,CAAC;CACD,aAAa;EACX,IAAI,OAAO,aAAa,KAAK;EAC7B,QAAQ;CACV;AACF;;;;;;AAOA,SAAgB,WACd,UACA,MACA,UACA,SACY;CAEZ,IAAI;CACJ,MAAM,SAAS,WAA2B;EACxC,IAAI,SAAS,KAAA,GAAW,OAAO,cAAc,QAAQ,MAAM,UAAU,OAAO;CAC9E;CACA,MAAM,SAAS,YAAY,SAAS;CACpC,IAAI,QAAQ,MAAM,MAAM;MAKtB,OAAO,+BAAsB,CAC1B,MAAM,WAAW,MAAM,aAAa,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CACzD,YAAY,CAAC,CAAC;CACnB,aAAa;EACX,OAAO;EACP,OAAO;CACT;AACF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { X as applyParams, Y as toVariantKey } from "./ThemeProvider-
|
|
1
|
+
import { X as applyParams, Y as toVariantKey } from "./ThemeProvider-G2g5Z1ZS.js";
|
|
2
2
|
import { p as mutationErrorFromBody, s as isObject } from "./MutationError-DuKqBW8o.js";
|
|
3
3
|
//#region client/mutationErrorHelpers.ts
|
|
4
4
|
var FALLBACK_MESSAGE = "Something went wrong. Try again.";
|
|
@@ -112,4 +112,4 @@ function applyQueryUpdates(getResource, routeParams, updates, answer) {
|
|
|
112
112
|
//#endregion
|
|
113
113
|
export { applyQueryUpdates, withMutationErrorHelpers, writeQueryData };
|
|
114
114
|
|
|
115
|
-
//# sourceMappingURL=mutationExtras-
|
|
115
|
+
//# sourceMappingURL=mutationExtras-HC7AC6zn.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mutationExtras-
|
|
1
|
+
{"version":3,"file":"mutationExtras-HC7AC6zn.js","names":[],"sources":["../../client/mutationErrorHelpers.ts","../../client/queryUpdates.ts"],"sourcesContent":["import {\n isObject,\n mutationErrorFromBody,\n type MutationErrorHelpers,\n type MutationValidationError,\n type WithMutationErrorHelpers,\n} from \"./MutationError\";\n\n// `error.list()` and `error.field(name)` on what the mutation hooks hand over.\n// Loaded with the hooks' other extras when one mounts (see\n// `./mutationModules`), so no route's entry chunk carries it (#915).\n//\n// `list` and `field` repeat `mutationErrorList` and `mutationErrorField` from\n// `./MutationError` on purpose. Those are public and synchronous, so they sit\n// in whatever chunk calls them; importing them here would put them, and so\n// this code, back in every entry chunk. `MutationError.helpers.test` runs the\n// same cases through both.\n\nconst FALLBACK_MESSAGE = \"Something went wrong. Try again.\";\n\n// `isValidationError`, which an import would keep in the entry chunk.\nfunction isValidationError(error: unknown): error is MutationValidationError {\n return isObject(error) && error.kind === \"validation_error\";\n}\n\n// A `QueryError`'s refusal, read as the mutation hooks read a body. Read by\n// shape, not `instanceof`, so a copy of the class from another bundle works.\nfunction unwrapQueryError(error: unknown): unknown {\n if (error instanceof Error && error.name === \"QueryError\" && \"body\" in error) {\n const { body, status } = error as Error & { body: unknown; status: number };\n return body == null ? error : mutationErrorFromBody(body, status);\n }\n return error;\n}\n\n// `error.list(fallback)`: see `mutationErrorList`.\nfunction list(\n error: unknown,\n fallback: string = FALLBACK_MESSAGE,\n): string[] {\n const value = unwrapQueryError(error);\n if (isValidationError(value)) {\n const messages = Object.values(value.messages ?? {})\n .flat()\n .filter((message) => typeof message === \"string\" && message !== \"\");\n return messages.length > 0 ? messages : [fallback];\n }\n if (\n isObject(value) &&\n !(value instanceof Error) &&\n value.kind !== \"server_error\" &&\n typeof value.message === \"string\" &&\n value.message !== \"\"\n ) {\n return [value.message];\n }\n return [fallback];\n}\n\n// `error.field(name)`: see `mutationErrorField`.\nfunction field(error: unknown, name: string): string[] {\n const value = unwrapQueryError(error);\n if (!isValidationError(value)) return [];\n const messages = value.messages?.[name];\n return Array.isArray(messages) ? [...messages] : [];\n}\n\n/**\n * Puts `list` and `field` on an error the hooks hand over, as non-enumerable\n * properties, so `toEqual`, a spread and `JSON.stringify` see the same object\n * as before. A key the error already has is left alone; a primitive or a\n * frozen value is returned as it is.\n *\n * @internal\n */\nexport function withMutationErrorHelpers<T>(error: T): WithMutationErrorHelpers<T> {\n if (!isObject(error) || !Object.isExtensible(error)) {\n return error as WithMutationErrorHelpers<T>;\n }\n const helpers: MutationErrorHelpers = {\n list: (fallback) => list(error, fallback),\n field: (name) => field(error, name),\n };\n for (const key of [\"list\", \"field\"] as const) {\n if (key in error) continue;\n Object.defineProperty(error, key, {\n value: helpers[key],\n configurable: true,\n writable: true,\n enumerable: false,\n });\n }\n return error as WithMutationErrorHelpers<T>;\n}\n","import type { QueryResource } from \"./QueryResource\";\nimport type { QueryTarget, QueryUpdate } from \"./useSetQueryData\";\nimport { applyParams } from \"../utils/applyParams\";\nimport { toVariantKey } from \"../utils/variantKey\";\n\n// The cache writes behind a mutation's `updates` and `useSetQueryData()`\n// (#897). Loaded with the hooks' other extras when one mounts (see\n// `./mutationModules`), so no route's entry chunk carries it (#915).\n\ntype Resolve = (key: string) => QueryResource;\n\n/**\n * Write data the server just produced (a mutation's answer) into a variant,\n * with no refetch: unlike `mutate`, the value is not a guess to reconcile.\n * The variant counts as freshly fetched, so its `staleTime` starts again, and\n * a GET already on the wire for it is dropped when it lands, since it may\n * carry the data from before the write. A reader suspended on the variant\n * wakes up with it (#897). Here rather than on `QueryResource`, which every\n * entry chunk carries (#915).\n */\nfunction setVariant(resource: QueryResource, variantKey: string, data: unknown) {\n resource.dropHttpCache(variantKey);\n resource.markApplied(variantKey);\n const store = resource.store.getValue();\n resource.fill(store, variantKey, data, Date.now());\n resource.store.next(store);\n}\n\n/** The value to write, or a function of the cached one. */\nexport type WriteQueryNext = { value: unknown } | { update: (current: any) => unknown };\n\n/**\n * Write into every variant `target` names. `next` is the value to write, or\n * a function of the cached value; a function skips a variant with nothing\n * cached. A value seeds a single variant that is not cached yet; a predicate\n * only ever reaches variants that are.\n */\nexport function writeQueryData(\n getResource: Resolve,\n routeParams: Record<string, any>,\n target: QueryTarget<any>,\n next: WriteQueryNext,\n) {\n const { path, params = {}, search = {} } = target;\n const resource = getResource(applyParams(String(path), { ...routeParams, ...params }));\n const write = (variantKey: string) => {\n if (\"value\" in next) {\n setVariant(resource, variantKey, next.value);\n return;\n }\n const state = resource.peek(variantKey);\n if (!state?.hasData) return;\n setVariant(resource, variantKey, next.update(state.data));\n };\n\n if (typeof search === \"function\") {\n for (const variantKey of resource.variantKeys()) {\n if (!resource.peek(variantKey)?.hasData) continue;\n if (search(new URLSearchParams(variantKey))) write(variantKey);\n }\n return;\n }\n write(toVariantKey(search));\n}\n\n/**\n * Write a mutation's `updates` with its answer.\n */\nexport function applyQueryUpdates(\n getResource: Resolve,\n routeParams: Record<string, any>,\n updates: ReadonlyArray<QueryUpdate<any>> | undefined,\n answer: unknown,\n) {\n for (const update of updates ?? []) {\n const { data } = update as { data?: (answer: any, current: any) => any };\n writeQueryData(\n getResource,\n routeParams,\n update,\n data ? { update: (current) => data(answer, current) } : { value: answer },\n );\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { dt as equalJitter } from "./ThemeProvider-
|
|
1
|
+
import { dt as equalJitter } from "./ThemeProvider-G2g5Z1ZS.js";
|
|
2
2
|
//#region client/subscriptionStream.ts
|
|
3
3
|
var MIN_RETRY_MS = 1e3;
|
|
4
4
|
var MAX_RETRY_MS = 3e4;
|
|
@@ -175,4 +175,4 @@ async function* readEvents(body) {
|
|
|
175
175
|
//#endregion
|
|
176
176
|
export { follow, readEvents };
|
|
177
177
|
|
|
178
|
-
//# sourceMappingURL=subscriptionStream-
|
|
178
|
+
//# sourceMappingURL=subscriptionStream-CaTWWJwt.js.map
|
package/dist/chunks/{subscriptionStream-Ca5V54ee.js.map → subscriptionStream-CaTWWJwt.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subscriptionStream-Ca5V54ee.js","names":[],"sources":["../../client/subscriptionStream.ts"],"sourcesContent":["import type { Dispatch, SetStateAction } from \"react\";\n\nimport type { ChangeFeedMessage } from \"../services/change-feed/wire\";\nimport { equalJitter } from \"./retryPolicy\";\nimport type { SubscriptionConfig, SubscriptionStatus } from \"./useSubscription\";\n\n// `useSubscription`'s connection: the SSE request, its reader and the\n// reconnect loop. Loaded by the hook with a dynamic `import()` when it first\n// connects, so it lands in a chunk of its own rather than in the entry chunk\n// every route loads (#891). Import it as a type only from anywhere else.\n\nconst MIN_RETRY_MS = 1_000;\nconst MAX_RETRY_MS = 30_000;\n\n/** The server answered in a way retrying will not change (401, 403, 404). */\nclass FatalStatus extends Error {\n constructor(readonly status: number) {\n super(`The subscription was refused with ${status}.`);\n }\n}\n\nexport interface SubscriptionState {\n status: SubscriptionStatus;\n cursor: string | null;\n error: Error | null;\n}\n\nexport interface FollowOptions {\n endpoint: string;\n pauseWhenHidden: boolean;\n /** Where to resume; advanced as events arrive. */\n cursor: { current: string | null };\n callbacks: { current: SubscriptionConfig<unknown> };\n setState: Dispatch<SetStateAction<SubscriptionState>>;\n /** The jitter's random source; `Math.random` unless a test passes its own. */\n random?: () => number;\n}\n\n/**\n * Follows `endpoint` until the returned function is called: connects,\n * reconnects with backoff, pauses while the tab is hidden, and reports\n * through `setState` and `callbacks`.\n *\n * The backoff step is 1s, doubling per failed attempt up to 30s, and back to\n * 1s once a stream reaches `ready`. Each wait is jittered (\"equal jitter\", a\n * random point between half the step and all of it): a server restart ends\n * every open tab's stream in the same instant, and an exact schedule would\n * bring them all back in the same instant too. A `Retry-After` the server\n * sent is waited out exactly.\n */\nexport function follow({\n endpoint,\n pauseWhenHidden,\n cursor,\n callbacks,\n setState,\n random = Math.random,\n}: FollowOptions): () => void {\n let stopped = false;\n let request: AbortController | null = null;\n let resume: (() => void) | null = null;\n let retryMs = MIN_RETRY_MS;\n const hidden = () =>\n pauseWhenHidden && typeof document !== \"undefined\" && document.visibilityState === \"hidden\";\n const onVisibilityChange = () => {\n if (hidden()) request?.abort();\n else resume?.();\n };\n if (typeof document !== \"undefined\") {\n document.addEventListener(\"visibilitychange\", onVisibilityChange);\n }\n const wait = (ms: number) =>\n new Promise<void>((resolve) => {\n const timer = setTimeout(done, ms);\n function done() {\n clearTimeout(timer);\n resume = null;\n resolve();\n }\n // Shown again, or unmounted: stop waiting.\n resume = done;\n });\n\n void (async () => {\n while (!stopped) {\n if (hidden()) {\n setState((s) => ({ ...s, status: \"paused\" }));\n await new Promise<void>((resolve) => (resume = resolve));\n resume = null;\n continue;\n }\n setState((s) => ({ ...s, status: \"connecting\" }));\n const controller = (request = new AbortController());\n let delay = retryMs;\n let exact = false;\n try {\n const headers: Record<string, string> = { Accept: \"text/event-stream\" };\n if (cursor.current) headers[\"Last-Event-ID\"] = cursor.current;\n const response = await fetch(endpoint, { headers, signal: controller.signal });\n if (!response.ok || !response.body) {\n const status = response.status;\n if (status >= 400 && status < 500 && status !== 408 && status !== 429) {\n throw new FatalStatus(status);\n }\n const retryAfter = Number(response.headers.get(\"Retry-After\"));\n if (Number.isFinite(retryAfter) && retryAfter > 0) {\n delay = retryAfter * 1000;\n exact = true;\n }\n throw new Error(`The subscription answered ${status}.`);\n }\n for await (const { id, message } of readEvents(response.body)) {\n if (stopped) return;\n if (id !== undefined) cursor.current = id;\n if (message.type === \"ready\") {\n retryMs = MIN_RETRY_MS;\n delay = MIN_RETRY_MS;\n setState({ status: \"open\", cursor: cursor.current, error: null });\n } else {\n setState((s) => ({ ...s, cursor: cursor.current }));\n if (message.type === \"change\") callbacks.current.onChange?.(message as never);\n else if (message.type === \"reset\") callbacks.current.onReset?.(message as never);\n }\n }\n } catch (error) {\n if (stopped) return;\n if (error instanceof FatalStatus) {\n setState((s) => ({ ...s, status: \"closed\", error }));\n return;\n }\n // Aborted because the tab was hidden: the loop pauses instead.\n if (controller.signal.aborted) continue;\n setState((s) => ({ ...s, error: error as Error }));\n }\n if (stopped || controller.signal.aborted) continue;\n // The stream ended or failed: try again, a little later each time.\n setState((s) => ({ ...s, status: \"connecting\" }));\n await wait(exact ? delay : equalJitter(delay, random));\n retryMs = Math.min(retryMs * 2, MAX_RETRY_MS);\n }\n })();\n\n return () => {\n stopped = true;\n request?.abort();\n resume?.();\n if (typeof document !== \"undefined\") {\n document.removeEventListener(\"visibilitychange\", onVisibilityChange);\n }\n };\n}\n\n/**\n * The events of an SSE body: `id` and the JSON `data`. Comments (keepalives)\n * and events without data are skipped; an event whose data is not JSON is\n * dropped rather than ending the stream.\n */\nexport async function* readEvents(\n body: ReadableStream<Uint8Array>,\n): AsyncGenerator<{ id?: string; message: ChangeFeedMessage }> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) return;\n // `ChangeFeed.stream` writes `\\n` only; a proxy's `\\r\\n` is folded here.\n buffer = (buffer + decoder.decode(value, { stream: true })).replace(/\\r\\n?/g, \"\\n\");\n let boundary = buffer.indexOf(\"\\n\\n\");\n while (boundary !== -1) {\n const block = buffer.slice(0, boundary);\n buffer = buffer.slice(boundary + 2);\n boundary = buffer.indexOf(\"\\n\\n\");\n let id: string | undefined;\n const data: string[] = [];\n for (const line of block.split(\"\\n\")) {\n if (line === \"\" || line.startsWith(\":\")) continue;\n const colon = line.indexOf(\":\");\n const field = colon === -1 ? line : line.slice(0, colon);\n let text = colon === -1 ? \"\" : line.slice(colon + 1);\n if (text.startsWith(\" \")) text = text.slice(1);\n if (field === \"id\") id = text;\n else if (field === \"data\") data.push(text);\n }\n if (data.length === 0) continue;\n try {\n yield { id, message: JSON.parse(data.join(\"\\n\")) };\n } catch {\n // Not JSON: not ours to apply.\n }\n }\n }\n } finally {\n await reader.cancel().catch(() => {});\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"subscriptionStream-CaTWWJwt.js","names":[],"sources":["../../client/subscriptionStream.ts"],"sourcesContent":["import type { Dispatch, SetStateAction } from \"react\";\n\nimport type { ChangeFeedMessage } from \"../services/change-feed/wire\";\nimport { equalJitter } from \"./retryPolicy\";\nimport type { SubscriptionConfig, SubscriptionStatus } from \"./useSubscription\";\n\n// `useSubscription`'s connection: the SSE request, its reader and the\n// reconnect loop. Loaded by the hook with a dynamic `import()` when it first\n// connects, so it lands in a chunk of its own rather than in the entry chunk\n// every route loads (#891). Import it as a type only from anywhere else.\n\nconst MIN_RETRY_MS = 1_000;\nconst MAX_RETRY_MS = 30_000;\n\n/** The server answered in a way retrying will not change (401, 403, 404). */\nclass FatalStatus extends Error {\n constructor(readonly status: number) {\n super(`The subscription was refused with ${status}.`);\n }\n}\n\nexport interface SubscriptionState {\n status: SubscriptionStatus;\n cursor: string | null;\n error: Error | null;\n}\n\nexport interface FollowOptions {\n endpoint: string;\n pauseWhenHidden: boolean;\n /** Where to resume; advanced as events arrive. */\n cursor: { current: string | null };\n callbacks: { current: SubscriptionConfig<unknown> };\n setState: Dispatch<SetStateAction<SubscriptionState>>;\n /** The jitter's random source; `Math.random` unless a test passes its own. */\n random?: () => number;\n}\n\n/**\n * Follows `endpoint` until the returned function is called: connects,\n * reconnects with backoff, pauses while the tab is hidden, and reports\n * through `setState` and `callbacks`.\n *\n * The backoff step is 1s, doubling per failed attempt up to 30s, and back to\n * 1s once a stream reaches `ready`. Each wait is jittered (\"equal jitter\", a\n * random point between half the step and all of it): a server restart ends\n * every open tab's stream in the same instant, and an exact schedule would\n * bring them all back in the same instant too. A `Retry-After` the server\n * sent is waited out exactly.\n */\nexport function follow({\n endpoint,\n pauseWhenHidden,\n cursor,\n callbacks,\n setState,\n random = Math.random,\n}: FollowOptions): () => void {\n let stopped = false;\n let request: AbortController | null = null;\n let resume: (() => void) | null = null;\n let retryMs = MIN_RETRY_MS;\n const hidden = () =>\n pauseWhenHidden && typeof document !== \"undefined\" && document.visibilityState === \"hidden\";\n const onVisibilityChange = () => {\n if (hidden()) request?.abort();\n else resume?.();\n };\n if (typeof document !== \"undefined\") {\n document.addEventListener(\"visibilitychange\", onVisibilityChange);\n }\n const wait = (ms: number) =>\n new Promise<void>((resolve) => {\n const timer = setTimeout(done, ms);\n function done() {\n clearTimeout(timer);\n resume = null;\n resolve();\n }\n // Shown again, or unmounted: stop waiting.\n resume = done;\n });\n\n void (async () => {\n while (!stopped) {\n if (hidden()) {\n setState((s) => ({ ...s, status: \"paused\" }));\n await new Promise<void>((resolve) => (resume = resolve));\n resume = null;\n continue;\n }\n setState((s) => ({ ...s, status: \"connecting\" }));\n const controller = (request = new AbortController());\n let delay = retryMs;\n let exact = false;\n try {\n const headers: Record<string, string> = { Accept: \"text/event-stream\" };\n if (cursor.current) headers[\"Last-Event-ID\"] = cursor.current;\n const response = await fetch(endpoint, { headers, signal: controller.signal });\n if (!response.ok || !response.body) {\n const status = response.status;\n if (status >= 400 && status < 500 && status !== 408 && status !== 429) {\n throw new FatalStatus(status);\n }\n const retryAfter = Number(response.headers.get(\"Retry-After\"));\n if (Number.isFinite(retryAfter) && retryAfter > 0) {\n delay = retryAfter * 1000;\n exact = true;\n }\n throw new Error(`The subscription answered ${status}.`);\n }\n for await (const { id, message } of readEvents(response.body)) {\n if (stopped) return;\n if (id !== undefined) cursor.current = id;\n if (message.type === \"ready\") {\n retryMs = MIN_RETRY_MS;\n delay = MIN_RETRY_MS;\n setState({ status: \"open\", cursor: cursor.current, error: null });\n } else {\n setState((s) => ({ ...s, cursor: cursor.current }));\n if (message.type === \"change\") callbacks.current.onChange?.(message as never);\n else if (message.type === \"reset\") callbacks.current.onReset?.(message as never);\n }\n }\n } catch (error) {\n if (stopped) return;\n if (error instanceof FatalStatus) {\n setState((s) => ({ ...s, status: \"closed\", error }));\n return;\n }\n // Aborted because the tab was hidden: the loop pauses instead.\n if (controller.signal.aborted) continue;\n setState((s) => ({ ...s, error: error as Error }));\n }\n if (stopped || controller.signal.aborted) continue;\n // The stream ended or failed: try again, a little later each time.\n setState((s) => ({ ...s, status: \"connecting\" }));\n await wait(exact ? delay : equalJitter(delay, random));\n retryMs = Math.min(retryMs * 2, MAX_RETRY_MS);\n }\n })();\n\n return () => {\n stopped = true;\n request?.abort();\n resume?.();\n if (typeof document !== \"undefined\") {\n document.removeEventListener(\"visibilitychange\", onVisibilityChange);\n }\n };\n}\n\n/**\n * The events of an SSE body: `id` and the JSON `data`. Comments (keepalives)\n * and events without data are skipped; an event whose data is not JSON is\n * dropped rather than ending the stream.\n */\nexport async function* readEvents(\n body: ReadableStream<Uint8Array>,\n): AsyncGenerator<{ id?: string; message: ChangeFeedMessage }> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) return;\n // `ChangeFeed.stream` writes `\\n` only; a proxy's `\\r\\n` is folded here.\n buffer = (buffer + decoder.decode(value, { stream: true })).replace(/\\r\\n?/g, \"\\n\");\n let boundary = buffer.indexOf(\"\\n\\n\");\n while (boundary !== -1) {\n const block = buffer.slice(0, boundary);\n buffer = buffer.slice(boundary + 2);\n boundary = buffer.indexOf(\"\\n\\n\");\n let id: string | undefined;\n const data: string[] = [];\n for (const line of block.split(\"\\n\")) {\n if (line === \"\" || line.startsWith(\":\")) continue;\n const colon = line.indexOf(\":\");\n const field = colon === -1 ? line : line.slice(0, colon);\n let text = colon === -1 ? \"\" : line.slice(colon + 1);\n if (text.startsWith(\" \")) text = text.slice(1);\n if (field === \"id\") id = text;\n else if (field === \"data\") data.push(text);\n }\n if (data.length === 0) continue;\n try {\n yield { id, message: JSON.parse(data.join(\"\\n\")) };\n } catch {\n // Not JSON: not ours to apply.\n }\n }\n }\n } finally {\n await reader.cancel().catch(() => {});\n }\n}\n"],"mappings":"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"}
|
|
@@ -11,6 +11,8 @@
|
|
|
11
11
|
* inside the cooldown is left to the route's error boundary. Per URL rather
|
|
12
12
|
* than per tab (#1056): while two releases serve at once every navigation can
|
|
13
13
|
* miss, and a tab-wide cooldown sent the second one to the error boundary.
|
|
14
|
+
* Where `sessionStorage` cannot be used, the marker lives in `window.name`
|
|
15
|
+
* instead (#1186); see `chunkReloadGuard`.
|
|
14
16
|
*
|
|
15
17
|
* The same guard covers a navigation whose data came from another build
|
|
16
18
|
* (`recoverFromBuildMismatch`).
|
|
@@ -39,8 +41,9 @@ export type ChunkLoadErrorSource = "navigation" | "hydration" | "preload" | "app
|
|
|
39
41
|
* Why gemi will not reload, or `null` when it will:
|
|
40
42
|
* - `cooldown`: it already reloaded onto this URL within `cooldownMs`.
|
|
41
43
|
* - `offline`: `navigator.onLine` is false — a reload would only fail harder.
|
|
42
|
-
* - `storage`: `sessionStorage`
|
|
43
|
-
* survive the reload and the loop it prevents
|
|
44
|
+
* - `storage`: neither `sessionStorage` nor the `window.name` fallback can
|
|
45
|
+
* hold the guard, so it cannot survive the reload and the loop it prevents
|
|
46
|
+
* could not be ruled out.
|
|
44
47
|
*/
|
|
45
48
|
export type ChunkReloadBlock = "cooldown" | "offline" | "storage" | null;
|
|
46
49
|
export interface ChunkLoadErrorContext {
|
|
@@ -139,12 +142,46 @@ export declare function recoverFromBuildMismatch({ url, clientBuild, serverBuild
|
|
|
139
142
|
* before the header) is not a mismatch.
|
|
140
143
|
*/
|
|
141
144
|
export declare function otherBuild(response: Response, clientBuild: string | undefined): string | null;
|
|
145
|
+
/**
|
|
146
|
+
* The cross-document guard, shared by the client and the server's reload stub
|
|
147
|
+
* (which embeds this function's source, so it uses nothing but globals and its
|
|
148
|
+
* arguments). With `claim` false it only reads: `"cooldown"` when a reload
|
|
149
|
+
* onto `url` was recorded inside `cooldownMs`, `"storage"` when no marker can
|
|
150
|
+
* be read at all, otherwise `"ok"`. With `claim` true it also records the
|
|
151
|
+
* reload, and answers `"ok"` only once the record was written and read back
|
|
152
|
+
* unchanged; a caller navigates on nothing less. With `"tidy"` it only looks
|
|
153
|
+
* at `window.name`: a gemi marker with no live entry for this origin (expired,
|
|
154
|
+
* from the future, another origin's, or one that does not parse) is cleared
|
|
155
|
+
* to `""` and `"ok"` answered; `"cooldown"` while an entry is still live.
|
|
156
|
+
*
|
|
157
|
+
* Two places can hold the marker:
|
|
158
|
+
*
|
|
159
|
+
* - `sessionStorage[key]`: `{ [url]: at }`, the format earlier releases read
|
|
160
|
+
* and write, so a page from one and a stub from another share the guard.
|
|
161
|
+
* - `window.name`, when `sessionStorage` throws or will not take the write
|
|
162
|
+
* (#1186). It survives a load in the same tab, but it is shared state: the
|
|
163
|
+
* page may use it, and another origin the tab goes to can read it. So it is
|
|
164
|
+
* used only while it is empty or already holds gemi's marker — a value of
|
|
165
|
+
* anyone else's is left exactly as it is, and the guard then fails closed —
|
|
166
|
+
* and it holds no URL: `key + ":" + { o: hash(origin), m: { [hash(origin +
|
|
167
|
+
* pathname)]: at } }`. A marker written by another origin (`o` differs) or
|
|
168
|
+
* one that does not parse holds no reloads and is replaced on the next
|
|
169
|
+
* write. Two paths whose hashes collide share one cooldown, which only ever
|
|
170
|
+
* refuses a reload.
|
|
171
|
+
*
|
|
172
|
+
* A reload recorded in either place counts. Entries past the cooldown — and
|
|
173
|
+
* from the future, after the clock was set back — are dropped as a new one is
|
|
174
|
+
* written, so the marker holds only the reloads it still guards.
|
|
175
|
+
*/
|
|
176
|
+
export declare function chunkReloadGuard(key: string, url: string, cooldownMs: number, claim: boolean | "tidy"): "ok" | "cooldown" | "storage";
|
|
142
177
|
/**
|
|
143
178
|
* The same guard as a classic script body, for the module the server sends in
|
|
144
179
|
* place of a chunk it does not have. It reloads once per URL per cooldown;
|
|
145
|
-
* inside the cooldown (or with no
|
|
146
|
-
* recognises, so the importing page's own
|
|
147
|
-
* failure instead of a module that
|
|
180
|
+
* inside the cooldown (or with no marker that would survive the reload) it
|
|
181
|
+
* throws an error `isChunkLoadError` recognises, so the importing page's own
|
|
182
|
+
* recovery and error boundary see the failure instead of a module that
|
|
183
|
+
* silently has no exports. It runs `chunkReloadGuard` itself, so it and the
|
|
184
|
+
* page's client share one marker and one reload between them.
|
|
148
185
|
*/
|
|
149
186
|
export declare function chunkReloadStubScript(pathname: string, cooldownMs?: number): string;
|
|
150
187
|
//# sourceMappingURL=chunkLoadRecovery.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunkLoadRecovery.d.ts","sourceRoot":"","sources":["../../client/chunkLoadRecovery.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"chunkLoadRecovery.d.ts","sourceRoot":"","sources":["../../client/chunkLoadRecovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,mFAAmF;AACnF,eAAO,MAAM,mBAAmB,sBAAsB,CAAC;AAEvD;;;;GAIG;AACH,eAAO,MAAM,YAAY,iBAAiB,CAAC;AAE3C,kFAAkF;AAClF,eAAO,MAAM,gCAAgC,QAAS,CAAC;AAEvD;;;;;GAKG;AACH,MAAM,MAAM,oBAAoB,GAAG,YAAY,GAAG,WAAW,GAAG,SAAS,GAAG,KAAK,CAAC;AAElF;;;;;;;GAOG;AACH,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,IAAI,CAAC;AAEzE,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,OAAO,CAAC;IACf,+DAA+D;IAC/D,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,oBAAoB,CAAC;IAC7B,+DAA+D;IAC/D,OAAO,EAAE,gBAAgB,CAAC;CAC3B;AAED,MAAM,WAAW,oBAAoB;IACnC,uEAAuE;IACvE,GAAG,EAAE,MAAM,CAAC;IACZ,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,8CAA8C;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,+DAA+D;IAC/D,OAAO,EAAE,gBAAgB,CAAC;CAC3B;AAED,MAAM,WAAW,wBAAwB;IACvC,yBAAyB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,qBAAqB,KAAK,OAAO,GAAG,IAAI,CAAC;IACtE;;;;;OAKG;IACH,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,OAAO,GAAG,IAAI,CAAC;CACrE;AAmBD;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,wBAAwB,GAAG,KAAK,GAAG,SAAS,QAI5F;AAED,iEAAiE;AACjE,wBAAgB,wBAAwB,SAMvC;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,SAEhC;AAWD;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAYxD;AAWD;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,OAAO,EACd,EAAE,MAAc,EAAE,GAAG,EAAE,GAAE;IAAE,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAC5E,OAAO,CAeT;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,EACvC,GAAG,EACH,WAAW,EACX,WAAW,GACZ,EAAE;IACD,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAYV;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAG7F;AA2ED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,OAAO,GAAG,MAAM,GACtB,IAAI,GAAG,UAAU,GAAG,SAAS,CA8F/B;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,EAChB,UAAU,GAAE,MAAyC,GACpD,MAAM,CAQR"}
|
package/dist/client/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $ as QueryManagerProvider, A as useNavigate, C as loadDictionaryForRender, D as routeDataUrl, E as readRoutePayload, F as useLocation, G as realtime, H as configureRealtime, I as domainUrl, J as loadedModule, K as reconnectRealtime, L as isAbsoluteUrl, M as I18nProvider, N as ServerDataContext, O as useRoute, P as ServerDataProvider, Q as QueryManagerContext, S as loadDictionary, T as setActiveLocale, U as followLive, V as RealtimeContext, X as applyParams$1, Y as toVariantKey, Z as QueryConfigContext, _ as isChunkLoadError, _t as Subject, a as useRouteTransition, at as resetAuthenticationIncident, b as recoverFromBuildMismatch, c as ClientRouterContext, ct as isExternalRedirect, d as ComponentsProvider, et as USER_QUERY_CONFIG_KEYS, f as initialViewModulesReady, ft as isRetryableQueryError, g as configureChunkLoadRecovery, gt as QueryError, h as CHUNK_RELOAD_MARKER, ht as shouldRetryQuery, i as RouteTransitionProvider, it as reportAuthenticationRefusal, j as I18nContext, k as useSearchParams, l as ClientRouterProvider, lt as safeRedirectPath, m as subscribeViewModules, mt as retryDelayFor, n as useTheme, nt as DEFAULT_STALE_TIME, o as useChannelSubscription, ot as setAuthenticationNavigator, p as loadViewModule, q as loadLazy, r as m, rt as configureAuthenticationErrors, s as useCoalesced, st as INTENDED_URL_PARAM, t as ThemeProvider, tt as pickDefined, u as ComponentsContext, ut as readResponseBody, v as navigationStarted, w as registerDictionary, x as recoverFromChunkLoadError, y as otherBuild, z as Action } from "../chunks/ThemeProvider-
|
|
1
|
+
import { $ as QueryManagerProvider, A as useNavigate, C as loadDictionaryForRender, D as routeDataUrl, E as readRoutePayload, F as useLocation, G as realtime, H as configureRealtime, I as domainUrl, J as loadedModule, K as reconnectRealtime, L as isAbsoluteUrl, M as I18nProvider, N as ServerDataContext, O as useRoute, P as ServerDataProvider, Q as QueryManagerContext, S as loadDictionary, T as setActiveLocale, U as followLive, V as RealtimeContext, X as applyParams$1, Y as toVariantKey, Z as QueryConfigContext, _ as isChunkLoadError, _t as Subject, a as useRouteTransition, at as resetAuthenticationIncident, b as recoverFromBuildMismatch, c as ClientRouterContext, ct as isExternalRedirect, d as ComponentsProvider, et as USER_QUERY_CONFIG_KEYS, f as initialViewModulesReady, ft as isRetryableQueryError, g as configureChunkLoadRecovery, gt as QueryError, h as CHUNK_RELOAD_MARKER, ht as shouldRetryQuery, i as RouteTransitionProvider, it as reportAuthenticationRefusal, j as I18nContext, k as useSearchParams, l as ClientRouterProvider, lt as safeRedirectPath, m as subscribeViewModules, mt as retryDelayFor, n as useTheme, nt as DEFAULT_STALE_TIME, o as useChannelSubscription, ot as setAuthenticationNavigator, p as loadViewModule, q as loadLazy, r as m, rt as configureAuthenticationErrors, s as useCoalesced, st as INTENDED_URL_PARAM, t as ThemeProvider, tt as pickDefined, u as ComponentsContext, ut as readResponseBody, v as navigationStarted, w as registerDictionary, x as recoverFromChunkLoadError, y as otherBuild, z as Action } from "../chunks/ThemeProvider-G2g5Z1ZS.js";
|
|
2
2
|
import { n as RouteStateContext, r as RouteStateProvider, t as useParams } from "../chunks/useParams-BN3XXfmG.js";
|
|
3
3
|
import { a as isNetworkError, c as isPermissionError, d as isValidationError, f as mutationErrorField, h as mutationErrorList, i as isHttpError, l as isRateLimitError, m as mutationErrorKind, n as isCsrfError, o as isNotFoundError, p as mutationErrorFromBody, r as isFormError, s as isObject, t as isAuthenticationError, u as isServerError } from "../chunks/MutationError-DuKqBW8o.js";
|
|
4
4
|
import { Fragment, StrictMode, Suspense, createContext, createElement, isValidElement, lazy, memo, use, useCallback, useContext, useDeferredValue, useEffect, useInsertionEffect, useMemo, useRef, useState, useSyncExternalStore, useTransition } from "react";
|
|
@@ -562,7 +562,7 @@ var SOCKET_ID_HEADER = "x-gemi-socket";
|
|
|
562
562
|
*/
|
|
563
563
|
var mutationExtras = {
|
|
564
564
|
current: null,
|
|
565
|
-
load: () => import("../chunks/mutationExtras-
|
|
565
|
+
load: () => import("../chunks/mutationExtras-HC7AC6zn.js")
|
|
566
566
|
};
|
|
567
567
|
/** Starts loading `./mutationExtras`: the hooks' mount effect. */
|
|
568
568
|
function preloadMutationExtras() {
|
|
@@ -920,7 +920,7 @@ function useMutate() {
|
|
|
920
920
|
//#region client/fetchFile.ts
|
|
921
921
|
var request = {
|
|
922
922
|
current: null,
|
|
923
|
-
load: () => import("../chunks/fetchFileRequest-
|
|
923
|
+
load: () => import("../chunks/fetchFileRequest-Bzva9J59.js")
|
|
924
924
|
};
|
|
925
925
|
/**
|
|
926
926
|
* Downloads a file route's body as a `Blob`.
|
|
@@ -986,7 +986,7 @@ function useSetQueryData() {
|
|
|
986
986
|
//#endregion
|
|
987
987
|
//#region client/useSubscription.ts
|
|
988
988
|
/** `./subscriptionStream`, loaded on first use. Replaceable in tests. */
|
|
989
|
-
var streamModule = { load: () => import("../chunks/subscriptionStream-
|
|
989
|
+
var streamModule = { load: () => import("../chunks/subscriptionStream-CaTWWJwt.js") };
|
|
990
990
|
/**
|
|
991
991
|
* Follows a route that answers with `ChangeFeed.stream`, as long as the
|
|
992
992
|
* component is mounted: each change reaches `onChange`, in order, exactly
|
package/dist/server/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{Da as f}from"../chunk-s0z61m9j.js";import{Ea as S}from"../chunk-m4r8btey.js";import{Bl as Z,Cl as P,Dl as y,El as U,Fl as A,zl as Q}from"../chunk-f02anz24.js";import{Jl as H}from"../chunk-fryj3asn.js";import"../chunk-y67rmd3y.js";import{Rl as F}from"../chunk-k1c0xd8r.js";var x="/__gemi__/health",$=Symbol.for("gemi.server.health");function V(){let z=globalThis;return z[$]??={lagMs:0,consecutiveBreaches:0,degraded:!1,timer:void 0},z[$]}function W(){let z=V(),B=Q();return{healthy:!B&&!z.degraded,shuttingDown:B,lagMs:z.lagMs,consecutiveBreaches:z.consecutiveBreaches}}function E(z,B){let I=V();I.lagMs=z,I.consecutiveBreaches=z>B.maxLagMs?I.consecutiveBreaches+1:0;let J=I.consecutiveBreaches>=B.breaches;if(J&&!I.degraded)console.warn(`[gemi] Health: degraded (event-loop lag ${Math.round(z)}ms, ${I.consecutiveBreaches} samples in a row over ${B.maxLagMs}ms).`);else if(!J&&I.degraded)console.log(`[gemi] Health: recovered (event-loop lag ${Math.round(z)}ms).`);I.degraded=J}function G(z){let B=V();if(B.timer)return;let I=performance.now()+z.intervalMs;B.timer=setInterval(()=>{let J=performance.now();E(Math.max(0,J-I),z),I=J+z.intervalMs},z.intervalMs),B.timer.unref?.()}function _(z=process.env){return{paths:D(z.GEMI_HEALTH_PATH),intervalMs:O("GEMI_HEALTH_INTERVAL_MS",z.GEMI_HEALTH_INTERVAL_MS,500),maxLagMs:O("GEMI_HEALTH_MAX_LAG_MS",z.GEMI_HEALTH_MAX_LAG_MS,1000),breaches:Math.ceil(O("GEMI_HEALTH_BREACHES",z.GEMI_HEALTH_BREACHES,3))}}function D(z){if(z===void 0||z.trim()==="")return[x];if(z.trim().toLowerCase()==="off")return[];let B=z.split(",").map((J)=>J.trim()).filter(Boolean);if(B.filter((J)=>!J.startsWith("/")).length>0)throw Error(`GEMI_HEALTH_PATH: expected comma-separated paths starting with "/", or "off"; got ${JSON.stringify(z)}.`);return B}function O(z,B,I){if(B===void 0||B.trim()==="")return I;let J=Number(B);if(Number.isFinite(J)&&J>0)return J;return console.warn(`[gemi] Ignoring ${z}="${B}": expected a positive number.`),I}function j(z,B){if(B.length===0)return z;let I=new Set(B);return async(J,K)=>{if(!B.some((b)=>J.url.includes(b))||!I.has(new URL(J.url).pathname))return z(J,K);return y(R(J.method))}}function R(z){let B={"Cache-Control":"no-store","Content-Type":"text/plain; charset=utf-8"};if(z!=="GET"&&z!=="HEAD")return new Response("Method Not Allowed",{status:405,headers:{...B,Allow:"GET, HEAD"}});let{healthy:I,shuttingDown:J}=W();return new Response(z==="HEAD"?null:I?"ok":J?"shutting down":"degraded",{status:I?200:503,headers:B})}var L=Symbol.for("gemi.server.devGeneration"),X={graceMs:1e4,providerTimeoutMs:5000};class Y{app;inFlight=0;waiters=new Set;constructor(z){this.app=z}track(z){return async(B,I)=>{this.inFlight++;try{return await z(B,I)}finally{if(this.inFlight--,this.inFlight===0)this.wake()}}}get pending(){return this.inFlight}async retire({graceMs:z,providerTimeoutMs:B}){try{await this.idle(z),await Promise.resolve().then(()=>this.app.shutdown({timeoutMs:B}))}catch(I){C(I)}}idle(z){if(this.inFlight===0)return Promise.resolve();return new Promise((B)=>{let I=()=>{clearTimeout(J),this.waiters.delete(I),B()},J=setTimeout(I,z);this.waiters.add(I)})}wake(){for(let z of this.waiters)z()}}function N(z,B=X){let I=globalThis,J=I[L];if(I[L]=z,!J||J===z||typeof J.retire!=="function")return Promise.resolve();let K=J.retire.bind(J);return Promise.resolve().then(()=>K(B)).catch(C)}function C(z){console.error("[gemi] Shutting down the application a reload replaced failed:",z)}class k{app;instrumentation;handleSignals;server;stopping;settings;constructor(z){this.app=new S({kernel:z.kernel}),this.handleSignals=z.handleSignals??!0,this.instrumentation=U(z.instrumentation??((B,I)=>I(B)))}async start(){process.env.ROOT_DIR=H();let z=Bun.env.NODE_ENV==="production",B=_();if(z)G(B);let I=j(this.instrumentation,B.paths);if(z){if(this.handleSignals)A(()=>this.stop());this.settings=Z()}try{await this.app.waitForBoot()}catch(J){if(!z)this.app.shutdown({timeoutMs:X.providerTimeoutMs});throw J}if(z){let{httpProd:J}=await import("../chunk-
|
|
2
|
+
import{Da as f}from"../chunk-s0z61m9j.js";import{Ea as S}from"../chunk-m4r8btey.js";import{Bl as Z,Cl as P,Dl as y,El as U,Fl as A,zl as Q}from"../chunk-f02anz24.js";import{Jl as H}from"../chunk-fryj3asn.js";import"../chunk-y67rmd3y.js";import{Rl as F}from"../chunk-k1c0xd8r.js";var x="/__gemi__/health",$=Symbol.for("gemi.server.health");function V(){let z=globalThis;return z[$]??={lagMs:0,consecutiveBreaches:0,degraded:!1,timer:void 0},z[$]}function W(){let z=V(),B=Q();return{healthy:!B&&!z.degraded,shuttingDown:B,lagMs:z.lagMs,consecutiveBreaches:z.consecutiveBreaches}}function E(z,B){let I=V();I.lagMs=z,I.consecutiveBreaches=z>B.maxLagMs?I.consecutiveBreaches+1:0;let J=I.consecutiveBreaches>=B.breaches;if(J&&!I.degraded)console.warn(`[gemi] Health: degraded (event-loop lag ${Math.round(z)}ms, ${I.consecutiveBreaches} samples in a row over ${B.maxLagMs}ms).`);else if(!J&&I.degraded)console.log(`[gemi] Health: recovered (event-loop lag ${Math.round(z)}ms).`);I.degraded=J}function G(z){let B=V();if(B.timer)return;let I=performance.now()+z.intervalMs;B.timer=setInterval(()=>{let J=performance.now();E(Math.max(0,J-I),z),I=J+z.intervalMs},z.intervalMs),B.timer.unref?.()}function _(z=process.env){return{paths:D(z.GEMI_HEALTH_PATH),intervalMs:O("GEMI_HEALTH_INTERVAL_MS",z.GEMI_HEALTH_INTERVAL_MS,500),maxLagMs:O("GEMI_HEALTH_MAX_LAG_MS",z.GEMI_HEALTH_MAX_LAG_MS,1000),breaches:Math.ceil(O("GEMI_HEALTH_BREACHES",z.GEMI_HEALTH_BREACHES,3))}}function D(z){if(z===void 0||z.trim()==="")return[x];if(z.trim().toLowerCase()==="off")return[];let B=z.split(",").map((J)=>J.trim()).filter(Boolean);if(B.filter((J)=>!J.startsWith("/")).length>0)throw Error(`GEMI_HEALTH_PATH: expected comma-separated paths starting with "/", or "off"; got ${JSON.stringify(z)}.`);return B}function O(z,B,I){if(B===void 0||B.trim()==="")return I;let J=Number(B);if(Number.isFinite(J)&&J>0)return J;return console.warn(`[gemi] Ignoring ${z}="${B}": expected a positive number.`),I}function j(z,B){if(B.length===0)return z;let I=new Set(B);return async(J,K)=>{if(!B.some((b)=>J.url.includes(b))||!I.has(new URL(J.url).pathname))return z(J,K);return y(R(J.method))}}function R(z){let B={"Cache-Control":"no-store","Content-Type":"text/plain; charset=utf-8"};if(z!=="GET"&&z!=="HEAD")return new Response("Method Not Allowed",{status:405,headers:{...B,Allow:"GET, HEAD"}});let{healthy:I,shuttingDown:J}=W();return new Response(z==="HEAD"?null:I?"ok":J?"shutting down":"degraded",{status:I?200:503,headers:B})}var L=Symbol.for("gemi.server.devGeneration"),X={graceMs:1e4,providerTimeoutMs:5000};class Y{app;inFlight=0;waiters=new Set;constructor(z){this.app=z}track(z){return async(B,I)=>{this.inFlight++;try{return await z(B,I)}finally{if(this.inFlight--,this.inFlight===0)this.wake()}}}get pending(){return this.inFlight}async retire({graceMs:z,providerTimeoutMs:B}){try{await this.idle(z),await Promise.resolve().then(()=>this.app.shutdown({timeoutMs:B}))}catch(I){C(I)}}idle(z){if(this.inFlight===0)return Promise.resolve();return new Promise((B)=>{let I=()=>{clearTimeout(J),this.waiters.delete(I),B()},J=setTimeout(I,z);this.waiters.add(I)})}wake(){for(let z of this.waiters)z()}}function N(z,B=X){let I=globalThis,J=I[L];if(I[L]=z,!J||J===z||typeof J.retire!=="function")return Promise.resolve();let K=J.retire.bind(J);return Promise.resolve().then(()=>K(B)).catch(C)}function C(z){console.error("[gemi] Shutting down the application a reload replaced failed:",z)}class k{app;instrumentation;handleSignals;server;stopping;settings;constructor(z){this.app=new S({kernel:z.kernel}),this.handleSignals=z.handleSignals??!0,this.instrumentation=U(z.instrumentation??((B,I)=>I(B)))}async start(){process.env.ROOT_DIR=H();let z=Bun.env.NODE_ENV==="production",B=_();if(z)G(B);let I=j(this.instrumentation,B.paths);if(z){if(this.handleSignals)A(()=>this.stop());this.settings=Z()}try{await this.app.waitForBoot()}catch(J){if(!z)this.app.shutdown({timeoutMs:X.providerTimeoutMs});throw J}if(z){let{httpProd:J}=await import("../chunk-vese6sny.js");this.server=await J(this.app,I)}else{f();let{httpDev:J}=await import("../chunk-fhvyq67n.js"),K=new Y(this.app);this.server=await J(this.app,K.track(I)),N(K)}return this.server}stop(z={}){let B=this.app.sockets();return this.stopping??=P({server:this.server,closeSockets:B?()=>B.shutdown():void 0,shutdownProviders:(I)=>this.app.shutdown(I),settings:{...this.settings??Z(),...z}}),this.stopping}}export{W as liveness,Q as isShuttingDown,k as Server};
|
|
3
3
|
|
|
4
4
|
//# debugId=7228D9637EA357D964756E2164756E21
|
package/dist/testing/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { t as followLive } from "../chunks/live-
|
|
2
|
-
import { $ as QueryManagerProvider, B as createMemoryHistory, M as I18nProvider, N as ServerDataContext, Q as QueryManagerContext, R as ProgressManager, V as RealtimeContext, W as liveModule, X as applyParams, Y as toVariantKey, _t as Subject, c as ClientRouterContext, i as RouteTransitionProvider, r as m, t as ThemeProvider, z as Action } from "../chunks/ThemeProvider-
|
|
1
|
+
import { t as followLive } from "../chunks/live-C2Sck5PO.js";
|
|
2
|
+
import { $ as QueryManagerProvider, B as createMemoryHistory, M as I18nProvider, N as ServerDataContext, Q as QueryManagerContext, R as ProgressManager, V as RealtimeContext, W as liveModule, X as applyParams, Y as toVariantKey, _t as Subject, c as ClientRouterContext, i as RouteTransitionProvider, r as m, t as ThemeProvider, z as Action } from "../chunks/ThemeProvider-G2g5Z1ZS.js";
|
|
3
3
|
import { r as RouteStateProvider } from "../chunks/useParams-BN3XXfmG.js";
|
|
4
4
|
import { t as channelKey } from "../chunks/channelKey-CIhHpX6x.js";
|
|
5
5
|
import { Suspense, createElement, useContext, useMemo, useRef, useState } from "react";
|
package/package.json
CHANGED
package/dist/chunk-mx9zcq7w.js
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import{X as y,Y as IJ,Z as NJ,_ as FJ}from"./chunk-qnc840pb.js";import{pa as T,ta as M,ua as MJ}from"./chunk-bwg7genv.js";import"./chunk-s0z61m9j.js";import{Fg as UJ,Gg as B,Og as CJ,Pg as LJ,Qg as _J,re as ZJ}from"./chunk-8zeky0fj.js";import"./chunk-199nvtrj.js";import"./chunk-xwz5fmwy.js";import{Vh as e,Wh as JJ,Zh as $J}from"./chunk-ryfty6mj.js";import{dj as xJ}from"./chunk-xsx69765.js";import"./chunk-rf9c6e49.js";import"./chunk-7zpjdwfq.js";import"./chunk-5zx4e2wa.js";import"./chunk-vr48swd0.js";import"./chunk-tngf3h1g.js";import"./chunk-9dfrsj4m.js";import"./chunk-ce73s4kh.js";import"./chunk-4s7st9y4.js";import"./chunk-8em2ebj1.js";import"./chunk-h688s2ba.js";import"./chunk-ccx7rt7y.js";import"./chunk-8pfy75y6.js";import"./chunk-ejc0mbe3.js";import{vl as WJ}from"./chunk-6n44t4hn.js";import"./chunk-f02anz24.js";import{Jl as KJ}from"./chunk-fryj3asn.js";import{Ll as S}from"./chunk-y67rmd3y.js";import"./chunk-k1c0xd8r.js";import{createHash as V2}from"crypto";import{join as g,resolve as TJ,sep as AJ}from"path";import{Duplex as gJ}from"stream";import{constants as P,createBrotliCompress as fJ,createGzip as mJ}from"zlib";var uJ=["br","gzip"],hJ=1024,cJ=5,pJ=19,dJ=6;function lJ(J){if(J===void 0)return 1;if(!/^\d+(\.\d{0,3})?$/.test(J.trim()))return 1;let $=Number(J.trim());return Number.isFinite($)?Math.min($,1):1}function oJ(J){if(J===null||J===void 0)return null;let $=new Map;for(let Z of J.split(",")){let[X,...j]=Z.split(";"),W=X.trim().toLowerCase();if(W==="")continue;let G=1;for(let Y of j){let O=Y.indexOf("=");if(O===-1)continue;if(Y.slice(0,O).trim().toLowerCase()==="q"){G=lJ(Y.slice(O+1));break}}$.set(W,G)}return $}function w(J,$=uJ){let Z=oJ(J);if(!Z)return null;let X=Z.get("*"),j=null,W=0;for(let G of $){let Y=Z.get(G)??X??0;if(Y>W)j=G,W=Y}return j}function nJ(J,$){if(!J)return!1;return J.split(",").some((Z)=>Z.trim().toLowerCase().split("=")[0].trim()===$)}function iJ(J,$){if(J==="HEAD")return!1;if($.status<200||$.status===204||$.status===206||$.status===304)return!1;if($.headers.has("Content-Range"))return!1;let Z=$.headers.get("Content-Type");if(!Z||!/^\s*text\/html\s*(;|$)/i.test(Z))return!1;if(!$.body)return!1;let X=$.headers.get("Content-Encoding");if(X&&X.trim().toLowerCase()!=="identity")return!1;if(nJ($.headers.get("Cache-Control"),"no-transform"))return!1;let j=$.headers.get("Content-Length");if(j!==null&&Number(j)<hJ)return!1;return!0}function aJ(J){let $=J==="br"?fJ({params:{[P.BROTLI_PARAM_QUALITY]:cJ,[P.BROTLI_PARAM_LGWIN]:pJ},flush:P.BROTLI_OPERATION_FLUSH}):mJ({level:dJ,flush:P.Z_SYNC_FLUSH});return gJ.toWeb($)}function tJ(J){let $=J.get("Vary");if(!$){J.set("Vary","Accept-Encoding");return}let Z=$.split(",").map((X)=>X.trim().toLowerCase());if(Z.includes("*")||Z.includes("accept-encoding"))return;J.append("Vary","Accept-Encoding")}function a(J,$){if(!iJ(J.method,$))return $;let Z=new Headers($.headers);tJ(Z);let X=w(J.headers.get("Accept-Encoding"));if(!X)return new Response($.body,{status:$.status,statusText:$.statusText,headers:Z});let j;try{j=aJ(X)}catch{return new Response($.body,{status:$.status,statusText:$.statusText,headers:Z})}return Z.set("Content-Encoding",X),Z.delete("Content-Length"),new Response($.body.pipeThrough(j),{status:$.status,statusText:$.statusText,headers:Z})}import{readdir as X2,stat as XJ}from"fs/promises";import{join as Q2}from"path";import{mkdir as I2,readFile as rJ,stat as N2,writeFile as F2}from"fs/promises";import{dirname as A2,join as sJ}from"path";import{promisify as t}from"util";import{brotliCompress as eJ,constants as R2,gzip as J2}from"zlib";var $2=".vite/static-assets.json";var r={br:".br",gzip:".gz"},Z2=["br","gzip"],B2=t(eJ),S2=t(J2);async function s(J){let $;try{$=await rJ(sJ(J,$2),"utf8")}catch{return null}let Z;try{Z=JSON.parse($)?.files}catch{return null}if(!Z||typeof Z!=="object")return null;let X={files:{}};for(let[j,W]of Object.entries(Z)){if(!Array.isArray(W))continue;X.files[j]=Z2.filter((G)=>W.includes(G))}return X}function k(J){let $=J.toString(),Z=new Bun.CryptoHasher("sha1");return Z.update($),Z.digest("hex")}async function QJ(J){let $=new Set;async function Z(X,j){let W;try{W=await X2(X,{withFileTypes:!0})}catch{return}for(let G of W){if(G.name.startsWith("."))continue;if(j&&G.name==="assets")continue;let Y=Q2(X,G.name),O=G.isDirectory(),V=G.isFile();if(G.isSymbolicLink())try{let K=await XJ(Y);O=K.isDirectory(),V=K.isFile()}catch{continue}if(V)$.add(Y);else if(O&&!G.isSymbolicLink())await Z(Y,!1)}}return await Z(J,!0),$}var j2="public, max-age=31536000, must-revalidate",W2="public, max-age=31536000, immutable";async function G2(J,$,Z){if(Z.length===0||J.headers.has("Range"))return null;let X=w(J.headers.get("Accept-Encoding"),Z);if(!X)return null;let j=$+r[X];try{let W=await XJ(j);return W.isFile()?{encoding:X,path:j,size:W.size}:null}catch{return null}}async function jJ(J,$,Z={}){let X=Bun.file($),j=Z.encodings??[],W={"Content-Type":X.type||"application/octet-stream","Cache-Control":Z.immutable?W2:j2,"Accept-Ranges":"bytes"};if(j.length>0)W.Vary="Accept-Encoding";let G=await G2(J,$,j);if(G){let V=Bun.file(G.path);return new Response(V.stream(),{headers:{...W,"Content-Encoding":G.encoding,"Content-Length":String(G.size),ETag:`${k(V.lastModified)}-${G.encoding}`}})}let Y=X.size;W.ETag=k(X.lastModified);let O=e(J.headers.get("Range"));if(O){let V=JJ(O,Y);if(!V)return ZJ(Y);return new Response(X.slice(V.start,V.end+1).stream(),{status:206,headers:{...W,"Content-Range":$J(V.start,V.end,Y),"Content-Length":String(V.length)}})}return new Response(X.stream(),{headers:{...W,"Content-Length":String(Y)}})}import{stat as U2}from"fs/promises";var R="app/client.tsx";function GJ(J,$=T){let Z=J[R]?.file;if(!Z)return;return{module:M(Z,$),preload:_(J,R,$)}}function _(J,$,Z=T){let X=[],j=new Set,W=(G)=>{if(j.has(G))return;j.add(G);let Y=J[G];if(!Y?.file)return;X.push(M(Y.file,Z));for(let O of Y.imports??[])W(O)};return W($),X}function H2(J,$,Z=T){let X=new Set(_(J,$,Z)),j=[],W=new Set,G=(O)=>{if(W.has(O))return;W.add(O);let V=J[O];if(!V)return;for(let K of V.dynamicImports??[])if(!/(^|\/)node_modules\//.test(K)&&!j.includes(K))j.push(K);for(let K of V.imports??[])G(K)};G($);let Y=[];for(let O of j)for(let V of _(J,O,Z))if(!X.has(V))X.add(V),Y.push(V);return Y}function HJ(J,$){let Z=[],X=new Set,j=new Set,W=(G)=>{if(j.has(G))return;j.add(G);let Y=J[G];if(!Y)return;for(let O of Y.imports??[])W(O);for(let O of Y.css??[])if(!X.has(O))X.add(O),Z.push(O)};return W($),Z}function YJ(J,$=T){let Z=new Map;return(X)=>{if(!Z.has(X)){let j=`${X}${WJ}`,W=J[j]?.file;Z.set(X,W?{src:M(W,$),preload:_(J,j,$),dynamicPreload:H2(J,j,$)}:void 0)}return Z.get(X)}}var OJ="x-gemi-build";function VJ(J,$=30000){let Z=JSON.stringify("gemi:chunk-reload"),X=JSON.stringify(`Failed to fetch dynamically imported module: ${J}`);return`var r=!1;try{var s=window.sessionStorage,u=window.location.href,m=JSON.parse(s.getItem(${Z})||"{}");if(!m||typeof m!=="object")m={};var d=Date.now()-m[u];if(navigator.onLine!==!1&&!(d>=0&&d<${$})){m[u]=Date.now();s.setItem(${Z},JSON.stringify(m));r=!0}}catch(e){}if(r)window.location.reload();else throw new Error(${X});export {}`}var Y2=new RegExp(`^${UJ}/.+\\.m?js$`);function v(J){return Y2.test(J)}function zJ(J){if(v(J))return new Response(VJ(J),{headers:{"Content-Type":"application/javascript","Cache-Control":"no-store"}});if(B(J))return new Response("Not found",{status:404});return}var O2=`<!DOCTYPE html>
|
|
3
|
-
<html lang="en">
|
|
4
|
-
<head>
|
|
5
|
-
<meta charset="UTF-8" />
|
|
6
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
|
-
<title>Internal Server Error</title>
|
|
8
|
-
<style>
|
|
9
|
-
body { font-family: system-ui, sans-serif; margin: 0; min-height: 100vh; display: grid; place-items: center; }
|
|
10
|
-
main { text-align: center; padding: 16px; }
|
|
11
|
-
h1 { font-size: 1.5rem; margin: 0 0 0.5rem; }
|
|
12
|
-
p { margin: 0; opacity: 0.7; }
|
|
13
|
-
</style>
|
|
14
|
-
</head>
|
|
15
|
-
<body>
|
|
16
|
-
<main>
|
|
17
|
-
<h1>Something went wrong</h1>
|
|
18
|
-
<p>Please try again later.</p>
|
|
19
|
-
</main>
|
|
20
|
-
</body>
|
|
21
|
-
</html>`;function E(J,$,Z){if(!Z)console.error(J);else try{Z(J instanceof Error?J:Error(String(J),{cause:J}))}catch(X){console.error(J),console.error(X)}if(S($))return new Response(JSON.stringify({error:xJ("server_error","Internal Server Error",500)}),{status:500,headers:{"Content-Type":"application/json"}});return new Response(O2,{status:500,headers:{"Content-Type":"text/html; charset=utf-8"}})}var b=KJ(),z2=g(b,"app"),C=g(b,"dist"),I=g(C,"client");function x2(J){let $;try{$=decodeURIComponent(J)}catch{return null}let Z=TJ(I,"."+$.replace("/assets/assets","/assets"));return Z.startsWith(I+AJ)?Z:null}async function K2(J){try{return(await U2(J)).isFile()}catch{return!1}}async function x3(J,$){let Z=await import(`${C}/client/.vite/manifest.json`),X=await import(`${C}/server/.vite/manifest.json`),j=await MJ(`${C}/client`);process.env.ROOT_DIR=b,process.env.APP_DIR=z2,process.env.DIST_DIR=C;let W={},G={},Y={},O={},V={},K=(Q,H)=>`"${Q}": () => import("${H}")`,f=[],m=J.getRequiredViews.call(J);for(let Q of["404",...J.getFlatComponentTree.call(J)]){let H=X[`app/views/${Q}.tsx`];if(!H?.file&&m[Q])throw NJ(Q,m[Q]);if(!H?.file){console.log(`Server file not found for ${Q}`),console.log(H);let x=Object.keys(X),L=`app/views/${Q}.tsx`;console.log(`${L} not found in server manifest`),console.log(x)}let U=await import(`${process.env.DIST_DIR}/server/${H?.file}`);W[Q]=U.default,G[Q]=U.OpenGraph,Y[Q]=U;let z=Z[`app/views/${Q}.tsx`];if(z?.css&&z?.css.length>0)O[Q]=z?.css;if(z)f.push(K(Q,M(z?.file,j))),V[Q]=_(Z,`app/views/${Q}.tsx`,j)}let DJ=`{${f.join(",")}}`,u=GJ(Z,j);if(!u)console.error(`Client manifest has no "${R}" entry \u2014 dist/client is incomplete, so documents will render but never hydrate.`);let PJ=Z["app/client.tsx"]?.css??[],h=(await Promise.all(PJ.map((Q)=>Bun.file(`${C}/client/${Q}`).text()))).join(`
|
|
22
|
-
`),RJ=YJ(Z,j),c=V2("sha256").update(await Bun.file(`${C}/client/.vite/manifest.json`).text()).digest("base64url").slice(0,12),p=new Map,BJ=(Q)=>{let H=p.get(Q);if(!H)H=Bun.file(`${C}/client/${Q}`).text(),p.set(Q,H);return H},SJ=async(Q,H)=>{let U=new Set;for(let x of H?[H,...Q]:Q)for(let L of HJ(Z,`app/views/${x}.tsx`))U.add(L);let z=await Promise.all([...U].map(async(x)=>({id:x,content:await BJ(x)})));return y(H?z:[{content:h},...z])},bJ=await QJ(I),d=new Map;for(let[Q,H]of Object.entries((await s(I))?.files??{})){let U=TJ(I,Q);if(U.startsWith(I+AJ))d.set(U,{immutable:!0,encodings:H})}async function qJ(Q){let{pathname:H}=new URL(Q.url);if(S(H))return await N(Q,H);let U=x2(H),z=B(H),x=!z&&U!==null&&bJ.has(U),L=z||H.startsWith("/.well-known")||x;if(x&&!(await l(Q)).publicFiles)return await N(Q,H);if(L){if(!U||!await K2(U)){if(z&&!v(H)&&(await l(Q)).assetRoutes)return await N(Q,H);return zJ(H)??await N(Q,H)}try{return await jJ(Q,U,d.get(U))}catch(D){return J.onException?.(D),new Response("Not found",{status:404})}}let A=await N(Q,H);if(H.endsWith(".json"))try{A.headers.set(OJ,c)}catch{}return A}async function l(Q){try{return await J.staticFiles?.(Q)??{publicFiles:!0,assetRoutes:!1}}catch{return{publicFiles:!1,assetRoutes:!0}}}async function N(Q,H){let U=J.fetch.bind(J);try{let z=await U(Q);if(z instanceof Response)return z;else{let x=[];return x.push({content:h}),await z({getStyles:async(A,D)=>{let n=A??["404"];if(D?.static)return SJ(n,D.layout);for(let vJ of n){let EJ=Z[`app/views/${vJ}.tsx`];for(let i of EJ?.css??[]){let yJ=Bun.file(`${process.env.DIST_DIR}/client/${i}`);x.push({id:i,content:await yJ.text()})}}return y(x)},clientEntry:u,modulePreloadManifest:V,loaders:DJ,viewImportMap:W,viewModules:Y,ogMap:G,cssManifest:O,assetBase:j,resolveIsland:RJ,buildId:c})}}catch(z){return E(z,H,J.onException)}}let wJ=(process.env.GEMI_COMPRESSION??"auto").toLowerCase()!=="off",o=CJ(process.env.GEMI_TRUST_PROXY),kJ=_J(process.env),F=J.sockets();if(F&&o.kind==="none"&&!kJ)console.warn("[gemi] Broadcast sockets: GEMI_TRUST_PROXY is not set, so a socket's address is its TCP peer. Behind a proxy or load balancer every client shares the proxy's address, and broadcast.maxConnectionsPerIp caps the whole app per process. Set GEMI_TRUST_PROXY (see forwardedFor) or raise that limit.");let q=Bun.serve({maxRequestBodySize:10737418240,fetch:async(Q,H)=>{if(LJ(Q.headers,H.requestIP(Q)?.address??null,o),J.applyTrustedClientIp(Q),F?.matches(Q))return F.upgrade(Q,H);let U=await $(Q,(z)=>J.withGlobalMiddleware(z,qJ,(x)=>E(x,new URL(z.url).pathname,J.onException)));return wJ?a(Q,U):U},idleTimeout:FJ(),port:process.env.PORT||5173,websocket:F?.websocket});return await F?.start(q),IJ({port:q.port,rootDir:b}),q}export{x3 as httpProd};
|
|
23
|
-
|
|
24
|
-
//# debugId=650CC85D073EACB764756E2164756E21
|
|
File without changes
|