denoland/celldPublic

self-hosted, distributed Durable Objects

`self` is undefined in Worker, Durable Object and Worker Loader isolates

ZS

zsilbi opened ·

### Summary

On celld 0.6.1, `typeof self` is `"undefined"` in a top-level Worker, in a Durable Object, and in a Worker that a Worker Loader loads. On workerd and on Cloudflare, `self` is the global scope, so `typeof self` is `"object"`. Libraries that read `self` fail. For example, `@cloudflare/worker-bundler` (`createWorker`) throws `self is not defined` when it runs inside a Durable Object on celld.

### Reproduction

`wrangler.json`:

```json { "name": "self-probe", "main": "index.js", "compatibility_date": "2026-01-01", "worker_loaders": [{ "binding": "LOADER" }], "durable_objects": { "bindings": [{ "name": "PROBE", "class_name": "Probe" }] }, "migrations": [{ "tag": "v1", "new_sqlite_classes": ["Probe"] }] } ```

`index.js`:

```js import { DurableObject } from "cloudflare:workers";

export class Probe extends DurableObject { async fetch() { const worker = this.env.LOADER.get("loaded", () => ({ compatibilityDate: "2026-01-01", globalOutbound: null, mainModule: "main.js", modules: { "main.js": "export default { fetch() { return new Response(typeof self); } };" } })); const loaded = await worker.getEntrypoint().fetch("http://loaded/"); return Response.json({ durableObject: typeof self, loadedWorker: await loaded.text() }); } }

export default { async fetch(request, env) { const inner = await env.PROBE.getByName("only").fetch(request); return Response.json({ topLevelWorker: typeof self, ...(await inner.json()) }); } }; ```

Run `celld dev .` and `curl http://127.0.0.1:9876/`.

### Expected

```json {"topLevelWorker":"object","durableObject":"object","loadedWorker":"object"} ```

This is what workerd 1.20260907.1 answers for the same code.

### Actual

```json {"topLevelWorker":"undefined","durableObject":"undefined","loadedWorker":"undefined"} ```

### Environment

- celld 0.6.1, release binary `celld-x86_64-unknown-linux-gnu`, `celld dev` - Linux x86-64 - Compared with workerd 1.20260907.1 (`workerd serve --experimental`)

### Possible fix

Define `self` as a reference to `globalThis` in every isolate, as workerd does.

  1. bartlomiejuclosedlast month on GitHub

  2. bartlomiejureferenced 655ff6caf8b6last month on GitHub

  3. bartlomiejureferenced 90b43017241flast month on GitHub

  4. BA

    Fixed in v0.6.2: `self` is defined in Worker, Durable Object, and Worker Loader isolates.