---
title: "DF0076: WebSocket Upgrade Unsupported On This Runtime"
description: "attach / handleUpgrade drive a raw node:http upgrade into crossws Node adapter, which refuses to run on Bun/Deno."
canonical_url: "https://devfra.me/errors/df0076"
---
# DF0076: WebSocket Upgrade Unsupported On This Runtime

> attach / handleUpgrade drive a raw node:http upgrade into crossws Node adapter, which refuses to run on Bun/Deno.

## Message

> `attach` / `handleUpgrade` drive a raw `node:http` upgrade into crossws's Node adapter, which refuses to run on .

## Cause

`attach(server)` and `handleUpgrade(req, socket, head)` hand a raw `node:http` upgrade socket to crossws's Node adapter. That adapter runs only on Node: Bun and Deno expose WebSockets as `fetch` upgrades through `Bun.serve` / `Deno.serve` instead, so there is no `node:http` upgrade socket for the adapter to take over.

## Example

```ts
import { initHub } from '@devframes/hub/initiate'

// Running on Bun/Deno:
const hub = initHub({ base: '/__devframes/' })
hub.attach(myNodeHttpServer) // ✗ throws DF0076 on Bun/Deno
```

## Fix

On Bun/Deno, serve the advertised `__ws` route from `Bun.serve` / `Deno.serve` and complete the upgrade with `attachBunWsTransport` / `attachDenoWsTransport` (see the `hub-deno` example), or connect over the SSE endpoint instead; it rides the instance's ordinary HTTP surface and needs no upgrade wiring. A side-car (`ws: { sidecar: true }`) also binds the native WebSocket adapter for you on its own port.

## Source

- [`packages/devframe/src/node/instance-shell.ts`](https://github.com/devframes/devframe/blob/main/packages/devframe/src/node/instance-shell.ts): the shared instance shell throws this from `attach` / `handleUpgrade` on Bun/Deno, for both `initDevframe` and `initHub`.


## Sitemap

See the full [sitemap](https://devfra.me/sitemap.md) for all pages.
