Files
wehub-resource-sync 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
chore: import upstream snapshot with attribution
2026-07-13 12:30:11 +08:00

149 lines
3.5 KiB
TypeScript

import { WorkerEntrypoint } from "cloudflare:workers";
let tailEvents = [];
let queueMessages = [];
export class NamedEntrypoint extends WorkerEntrypoint {
ping() {
return "Pong from Named Entrypoint";
}
fetch() {
return new Response("Hello from Named Entrypoint!");
}
}
export default class Worker extends WorkerEntrypoint<{
SERVICE_WORKER: Fetcher;
EXPORTED_HANDLER: Fetcher;
WORKER_ENTRYPOINT: Fetcher;
WORKER_ENTRYPOINT_WITH_ASSETS: Fetcher;
NAMED_ENTRYPOINT: Fetcher;
NAMED_ENTRYPOINT_WITH_ASSETS: Fetcher;
DURABLE_OBJECT: DurableObjectNamespace;
}> {
ping() {
return "Pong";
}
async fetch(request) {
try {
const url = new URL(request.url);
const testMethod = url.searchParams.get("test-method");
const testService = url.searchParams.get("test-service");
// Remove the test-method search params to avoid recursion
url.searchParams.delete("test-method");
url.searchParams.delete("test-service");
let service: Fetcher | undefined;
switch (testService) {
case "service-worker": {
service = this.env.SERVICE_WORKER;
break;
}
case "exported-handler": {
service = this.env.EXPORTED_HANDLER;
break;
}
case "worker-entrypoint": {
service = this.env.WORKER_ENTRYPOINT;
break;
}
case "worker-entrypoint-with-assets": {
service = this.env.WORKER_ENTRYPOINT_WITH_ASSETS;
break;
}
case "named-entrypoint": {
service = this.env.NAMED_ENTRYPOINT;
break;
}
case "named-entrypoint-with-assets": {
service = this.env.NAMED_ENTRYPOINT_WITH_ASSETS;
break;
}
case "durable-object": {
const id = this.env.DURABLE_OBJECT.newUniqueId();
const stub = this.env.DURABLE_OBJECT.get(id);
service = stub;
break;
}
}
if (service && testMethod === "rpc") {
// @ts-expect-error
const result = await service.ping();
return new Response(result);
}
if (service && testMethod === "fetch") {
return await service.fetch(url, request);
}
if (service && testMethod === "websocket-proxy") {
return await service.fetch(new Request(url, request));
}
// Handle WebSocket upgrades forwarded via service bindings
if (request.headers.get("Upgrade")) {
const { 0: client, 1: server } = new WebSocketPair();
server.accept();
server.addEventListener("message", (event) => {
server.send(`echo:${event.data}`);
});
return new Response(null, { status: 101, webSocket: client });
}
if (testMethod === "queue-received") {
return Response.json(queueMessages);
}
if (testMethod === "tail") {
if (request.method === "POST") {
const logs = await request.json();
if (Array.isArray(logs)) {
console.log(`[Worker Entrypoint]`);
console.log(...logs);
}
return new Response("ok");
}
try {
return Response.json({
worker: "Worker Entrypoint",
tailEvents,
});
} finally {
// Clear the tail events after sending them
tailEvents = [];
}
}
return new Response("Hello from Worker Entrypoint!");
} catch (e) {
return new Response(e.message, { status: 500 });
}
}
tail(events) {
const logs = [];
for (const event of events) {
if (Array.isArray(event.logs) && event.logs.length > 0) {
logs.push(...event.logs.map((log) => log.message));
}
}
if (logs.length > 0) {
tailEvents.push(logs);
}
}
queue(batch) {
for (const message of batch.messages) {
queueMessages.push(message.body);
}
}
}