From 58d6cba2a1fbed3acc380f2fcdd921d6bdf3726c Mon Sep 17 00:00:00 2001
From: Rob Marscher <rob@robmarscher.com>
Date: Wed, 11 Sep 2024 00:28:47 -0400
Subject: [PATCH] Expose Cloudflare execution context to server components

Using the getEnv API for now until #827 is resolved

Example usage:

```ts
  const ctx = getEnv("executionContext") as unknown as ExecutionContext | undefined;
  ctx?.waitUntil(
    new Promise<void>((resolve) => {
      console.log("Waiting for 5 seconds")
      setTimeout(() => {
        console.log("OK, done waiting")
        resolve()
      }, 5000)
    }),
  )
```

Server console output:

```
Waiting for 5 seconds
[wrangler:inf] GET /about 200 OK (30ms)
[wrangler:inf] GET /assets/jsx-runtime-BjG_zV1W.js 304 Not Modified (6ms)
[wrangler:inf] GET /assets/index-CbskofAj.js 304 Not Modified (7ms)
[wrangler:inf] GET /assets/_layout-Shb4QlRw.css 304 Not Modified (9ms)
[wrangler:inf] GET /assets/rsc2-c69df7b3e.js 200 OK (11ms)
[wrangler:inf] GET /assets/client-kczTGGZ_.js 304 Not Modified (16ms)
[wrangler:inf] GET /assets/indexHtml-DCalQi_d.js 304 Not Modified (18ms)
[wrangler:inf] GET /assets/client-CMyJdxTj.js 304 Not Modified (21ms)
[wrangler:inf] GET /assets/rsc0-ba005381c.js 304 Not Modified (4ms)
[wrangler:inf] GET /images/favicon.png 304 Not Modified (3ms)
OK, done waiting
```

The page was already sent to the client and loaded while the promise was still executing.

It is necessary to cast the Cloudflare types for now.
See https://developers.cloudflare.com/workers/languages/typescript/#generate-types-that-match-your-workers-configuration-experimental
for info on generating types for your project.
---
 packages/waku/src/lib/builder/serve-cloudflare.ts | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/packages/waku/src/lib/builder/serve-cloudflare.ts b/packages/waku/src/lib/builder/serve-cloudflare.ts
index 4555b626a..013d8bea5 100644
--- a/packages/waku/src/lib/builder/serve-cloudflare.ts
+++ b/packages/waku/src/lib/builder/serve-cloudflare.ts
@@ -34,7 +34,12 @@ export default {
     ctx: Parameters<typeof app.fetch>[2],
   ) {
     if (!serveWaku) {
-      serveWaku = runner({ cmd: 'start', loadEntries, env });
+      serveWaku = runner({
+        cmd: 'start',
+        loadEntries,
+        // @ts-expect-error Pass the execution context to server components via env
+        env: { ...(ctx ? { ctx } : {}), ...env },
+      });
     }
     return app.fetch(request, env, ctx);
   },