70bf21e064
Deploy (to testing) and Test Playground Preview Worker / Deploy Playground Preview Worker (testing) (push) Has been skipped
Deploy Workers Shared Staging / Deploy Workers Shared Staging (push) Failing after 0s
Prerelease / build (push) Has been skipped
Handle Changesets / Handle Changesets (push) Has been cancelled
Semgrep OSS scan / semgrep-oss (push) Has been cancelled
65 lines
1.4 KiB
TypeScript
65 lines
1.4 KiB
TypeScript
import crypto from "node:crypto";
|
|
|
|
// This just ensures that the import doesn't get tree shaken
|
|
console.log(typeof crypto);
|
|
interface Env {
|
|
ASSETS: Fetcher;
|
|
AI: Ai;
|
|
}
|
|
|
|
let requestAborted = false;
|
|
|
|
export default {
|
|
async fetch(request, env, ctx) {
|
|
const url = new URL(request.url);
|
|
|
|
if (url.pathname.startsWith("/api/")) {
|
|
return Response.json({
|
|
name: "Cloudflare",
|
|
});
|
|
}
|
|
|
|
if (url.pathname === "/env/") {
|
|
return Response.json(env);
|
|
}
|
|
|
|
if (url.pathname === "/wait") {
|
|
request.signal.addEventListener("abort", () => {
|
|
requestAborted = true;
|
|
});
|
|
|
|
const { readable, writable } = new IdentityTransformStream();
|
|
// Acquire the writer immediately before returning the Response
|
|
// to ensure the stream stays open for writes
|
|
const writer = writable.getWriter();
|
|
const enc = new TextEncoder();
|
|
|
|
ctx.waitUntil(
|
|
(async () => {
|
|
try {
|
|
for (let i = 0; i < 6; i++) {
|
|
// Send 'ping' every 500ms to keep the connection alive for 3 seconds
|
|
await writer.write(enc.encode("ping\r\n"));
|
|
await scheduler.wait(500);
|
|
}
|
|
} finally {
|
|
await writer.close();
|
|
}
|
|
})()
|
|
);
|
|
|
|
return new Response(readable, {
|
|
headers: { "Content-Type": "text/plain" },
|
|
});
|
|
}
|
|
|
|
if (url.pathname === "/aborted") {
|
|
return new Response(
|
|
requestAborted ? "Request aborted" : "Request not aborted"
|
|
);
|
|
}
|
|
|
|
return env.ASSETS.fetch(request);
|
|
},
|
|
} satisfies ExportedHandler<Env>;
|