`self` is undefined in Worker, Durable Object and Worker Loader isolates
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.
bartlomiejureferenced 655ff6caf8b6last month on GitHub
bartlomiejureferenced 90b43017241flast month on GitHub
- BA
Fixed in v0.6.2: `self` is defined in Worker, Durable Object, and Worker Loader isolates.