diff --git a/src/index.html b/src/index.html index 304a3f2..a7fe9a6 100644 --- a/src/index.html +++ b/src/index.html @@ -16,7 +16,7 @@

CF Worker and DO Clocks Tests

This page logs information about the delta between its clock and the clock of a Cloudflare worker or durable-object as observed over a - series of requests. It has three test cases. + series of requests. It has several test cases. In each test case the page sends its current time as reported by Date.now() every 250ms to a worker (which depending on the test case may forward it to a durable-object). The worker or durable-object @@ -42,6 +42,16 @@

CF Worker and DO Clocks Tests

is responded to by the durable-object via a Websocket message with the durable-object's time. +
  • + do-worker-post: time is sent via a POST request which is responded + to by the durable-object with a timestamp it fetches from the worker + over a service binding. The work computation is done on the do. +
  • +
  • + do-worker-internet-post: time is sent via a POST request which is responded + to by the durable-object with a timestamp it fetches from the worker + by url using internet routing. The work computation is done on the do. +
  • @@ -73,6 +83,20 @@

    CF Worker and DO Clocks Tests

    value="do-websocket" /> + + + +

    Select work per request/message:

    @@ -195,6 +219,8 @@

    Log (new messages are prepended)

    switch (testCase) { case "worker-post": case "do-post": + case "do-worker-post": + case "do-worker-internet-post": testPost(); break; case "do-websocket": diff --git a/src/index.ts b/src/index.ts index 8b9b866..be94c10 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,6 +2,7 @@ import indexHTML from "index.html"; export interface Env { clocksTestDO: DurableObjectNamespace; + clockWorker: Fetcher; } const worker = { @@ -15,6 +16,7 @@ const worker = { workerID = crypto.randomUUID(); globalThis.workerID = workerID; } + console.log(workerID, "worker clockWorker", env.clockWorker); const url = new URL(request.url); const forward = () => { return env.clocksTestDO @@ -28,9 +30,13 @@ const worker = { "content-type": "text/html;charset=UTF-8", }, }); + case "/now": + return new Response(JSON.stringify({ id: workerID, now: Date.now() })); case "/worker-post": - return handlePost(request, workerID, ctx); + return handlePost(request, workerID, Date.now(), ctx); case "/do-post": + case "/do-worker-post": + case "/do-worker-internet-post": case "/do-websocket": return forward(); } @@ -40,16 +46,36 @@ const worker = { class ClocksTestDO implements DurableObject { private readonly _doID: string; + private readonly _env: Env; - constructor() { + constructor(_state: DurableObjectState, env: Env) { + this._env = env; this._doID = crypto.randomUUID(); } async fetch(request: Request): Promise { + console.log(this._doID, "DO clockWorker", this._env.clockWorker); const url = new URL(request.url); switch (url.pathname) { + case "/do-worker-post": { + const { id, now } = await ( + await this._env.clockWorker.fetch("https://unused/now") + ).json<{ id: string; now: number }>(); + return handlePost(request, this._doID + "/" + id, now); + } + case "/do-worker-internet-post": { + const response = await fetch( + "https://cf-worker-clocks-test-w-service-bindings.replicache.workers.dev/now" + ); + console.log(response.status, response.statusText); + if (response.status !== 200) { + return new Response(response.statusText, response); + } + const { id, now } = await response.json<{ id: string; now: number }>(); + return handlePost(request, this._doID + "/" + id, now); + } case "/do-post": - return handlePost(request, this._doID); + return handlePost(request, this._doID, Date.now()); case "/do-websocket": return handleWebSocketConnect(request, this._doID); } @@ -60,6 +86,7 @@ class ClocksTestDO implements DurableObject { async function handlePost( request: Request, serverID: string, + now: number, ctx?: ExecutionContext ): Promise { const url = new URL(request.url); @@ -79,9 +106,7 @@ async function handlePost( } else { setTimeout(() => doWork(work), 1); } - return new Response( - createResponseBody(serverID, i, pageTimestamp, Date.now()) - ); + return new Response(createResponseBody(serverID, i, pageTimestamp, now)); } async function handleWebSocketConnect( diff --git a/wrangler.toml b/wrangler.toml index 1ede0f9..e6c9b2c 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -1,7 +1,11 @@ -name = "cf-worker-clocks-test" +name = "cf-worker-clocks-test-w-service-bindings" main = "src/index.ts" compatibility_date = "2022-06-03" +services = [ + { binding = "clockWorker", service = "cf-worker-clocks-test-w-service-bindings" } +] + [durable_objects] bindings = [ { name = "clocksTestDO", class_name = "ClocksTestDO" },