Skip to content
This repository was archived by the owner on Jun 10, 2026. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 27 additions & 1 deletion src/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ <h1>CF Worker and DO Clocks Tests</h1>
<p>
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
Expand All @@ -42,6 +42,16 @@ <h1>CF Worker and DO Clocks Tests</h1>
is responded to by the durable-object via a Websocket message with
the durable-object's time.
</li>
<li>
<b>do-worker-post:</b> 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.
</li>
<li>
<b>do-worker-internet-post:</b> 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.
</li>
</ol>
</p>
<p>
Expand Down Expand Up @@ -73,6 +83,20 @@ <h1>CF Worker and DO Clocks Tests</h1>
value="do-websocket"
/>
<label for="do-websocket">do-websocket</label>
<input
type="radio"
id="test-do-worker-post"
name="test"
value="do-worker-post"
/>
<label for="do-worker-internet-post">do-worker-post</label>
<input
type="radio"
id="test-do-worker-internet-post"
name="test"
value="do-worker-internet-post"
/>
<label for="do-worker-internet-post">do-worker-internet-post</label>

<p>Select work per request/message:</p>
<input type="radio" id="work-0" name="work" value="0" />
Expand Down Expand Up @@ -195,6 +219,8 @@ <h2>Log (new messages are prepended)</h2>
switch (testCase) {
case "worker-post":
case "do-post":
case "do-worker-post":
case "do-worker-internet-post":
testPost();
break;
case "do-websocket":
Expand Down
37 changes: 31 additions & 6 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import indexHTML from "index.html";

export interface Env {
clocksTestDO: DurableObjectNamespace;
clockWorker: Fetcher;
}

const worker = {
Expand All @@ -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
Expand All @@ -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();
}
Expand All @@ -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<Response> {
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);
}
Expand All @@ -60,6 +86,7 @@ class ClocksTestDO implements DurableObject {
async function handlePost(
request: Request,
serverID: string,
now: number,
ctx?: ExecutionContext
): Promise<Response> {
const url = new URL(request.url);
Expand All @@ -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(
Expand Down
6 changes: 5 additions & 1 deletion wrangler.toml
Original file line number Diff line number Diff line change
@@ -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" },
Expand Down