({ request }: LoaderFunctionArgs)
| 4 | import { sse } from "~/utils/sse.server"; |
| 5 | |
| 6 | export async function loader({ request }: LoaderFunctionArgs) { |
| 7 | const url = new URL(request.url); |
| 8 | const searchParams = Object.fromEntries(url.searchParams.entries()); |
| 9 | |
| 10 | const options = z |
| 11 | .object({ |
| 12 | minDelay: z.coerce.number().int(), |
| 13 | maxDelay: z.coerce.number().int(), |
| 14 | undefinedProbability: z.coerce.number().min(0).max(1).default(0.1), |
| 15 | }) |
| 16 | .parse(searchParams); |
| 17 | |
| 18 | logger.debug("Test SSE stream", { options }); |
| 19 | |
| 20 | let lastSignals = calculateChangeSignals(Date.now()); |
| 21 | |
| 22 | return sse({ |
| 23 | request, |
| 24 | run: async (send, stop) => { |
| 25 | const result = await dateForUpdates(options); |
| 26 | |
| 27 | if (!result) { |
| 28 | return stop(); |
| 29 | } |
| 30 | |
| 31 | const newSignals = calculateChangeSignals(result); |
| 32 | |
| 33 | if (lastSignals.ts !== newSignals.ts) { |
| 34 | send({ data: JSON.stringify(newSignals) }); |
| 35 | } |
| 36 | |
| 37 | lastSignals = newSignals; |
| 38 | }, |
| 39 | }); |
| 40 | } |
| 41 | |
| 42 | async function dateForUpdates(opts: { |
| 43 | minDelay: number; |
nothing calls this directly
no test coverage detected
searching dependent graphs…