---
description: Forwarding a Websocket request to a Container
title: Websocket to Container
image: https://developers.cloudflare.com/og-docs.png
---

[Skip to content](#main-content)

> Documentation Index  
> Fetch the complete documentation index at: https://developers.cloudflare.com/containers/llms.txt  
> Use this file to discover all available pages before exploring further.

# Websocket to Container

Forwarding a Websocket request to a Container

Last updated Aug 28, 2026|Copy as Markdown|[View as Markdown](https://codex-container-api-docs.previews.developers.cloudflare.com/containers/examples/websocket/index.md)|[Agent setup](https://codex-container-api-docs.previews.developers.cloudflare.com/agent-setup/)

Forward an incoming WebSocket upgrade request through the Durable Object to the listening port on the Container.

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

export class MyContainer extends DurableObject {
	constructor(ctx, env) {
		super(ctx, env);

		ctx.blockConcurrencyWhile(async () => {
			const container = ctx.container;
			await container.setInactivityTimeout(2 * 60 * 1000);

			if (!container.running) {
				container.start();
			}

			const port = container.getTcpPort(8080);
			let lastError;
			for (let attempt = 0; attempt < 50; attempt++) {
				try {
					await port.fetch("http://container/");
					return;
				} catch (error) {
					lastError = error;
					await scheduler.wait(100);
				}
			}
			throw lastError;
		});
	}

	fetch(request) {
		return this.ctx.container.getTcpPort(8080).fetch(request);
	}
}

export default {
	fetch(request, env) {
		return env.MY_CONTAINER.getByName("default").fetch(request);
	},
};
```

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

interface Env {
	MY_CONTAINER: DurableObjectNamespace<MyContainer>;
}

export class MyContainer extends DurableObject<Env> {
	constructor(ctx: DurableObjectState, env: Env) {
		super(ctx, env);

		ctx.blockConcurrencyWhile(async () => {
			const container = ctx.container!;
			await container.setInactivityTimeout(2 * 60 * 1000);

			if (!container.running) {
				container.start();
			}

			const port = container.getTcpPort(8080);
			let lastError: unknown;
			for (let attempt = 0; attempt < 50; attempt++) {
				try {
					await port.fetch("http://container/");
					return;
				} catch (error) {
					lastError = error;
					await scheduler.wait(100);
				}
			}
			throw lastError;
		});
	}

	fetch(request: Request): Promise<Response> {
		return this.ctx.container!.getTcpPort(8080).fetch(request);
	}
}

export default {
	fetch(request: Request, env: Env): Promise<Response> {
		return env.MY_CONTAINER.getByName("default").fetch(request);
	},
};
```

```js
import { Container, getContainer } from "@cloudflare/containers";

export class MyContainer extends Container {
	defaultPort = 8080;
	sleepAfter = "2m";
}

export default {
	async fetch(request, env) {
		// gets default instance and forwards websocket from outside Worker
		return getContainer(env.MY_CONTAINER).fetch(request);
	},
};
```

View a full example in the [Container class repository ↗](https://github.com/cloudflare/containers/tree/main/examples/websocket).

Was this helpful?

YesNo

## On this page

[![](https://codex-container-api-docs.previews.developers.cloudflare.com/_astro/logo.te5VL_aD.svg)Docs](https://codex-container-api-docs.previews.developers.cloudflare.com/)

```json
{"@context":"https://schema.org","@type":"TechArticle","@id":"https://developers.cloudflare.com/containers/examples/websocket/#page","headline":"Websocket to Container · Cloudflare Containers docs","description":"Forwarding a Websocket request to a Container","url":"https://developers.cloudflare.com/containers/examples/websocket/","inLanguage":"en","image":"https://developers.cloudflare.com/og-docs.png","dateModified":"2026-08-28","publisher":{"@type":"Organization","name":"Cloudflare","description":"One platform for your apps, agents, and workforce. Build, secure, and scale without managing infrastructure","url":"https://www.cloudflare.com/","sameAs":["https://github.com/cloudflare","https://www.linkedin.com/company/cloudflare","https://x.com/cloudflare"],"logo":{"@type":"ImageObject","url":"https://developers.cloudflare.com/logo.svg"},"address":{"@type":"PostalAddress","streetAddress":"101 Townsend St","addressLocality":"San Francisco","addressRegion":"CA","postalCode":"94107","addressCountry":"US"},"contactPoint":[{"@type":"ContactPoint","contactType":"Customer Support","url":"https://support.cloudflare.com/","availableLanguage":["English"]},{"@type":"ContactPoint","contactType":"Sales","url":"https://www.cloudflare.com/contact/","availableLanguage":["English"]}]},"isPartOf":{"@type":"WebSite","@id":"https://developers.cloudflare.com/#website","name":"Cloudflare Docs","url":"https://developers.cloudflare.com/"}}
```
