[API reference](https://evolu.dev/docs/api-reference) › [@evolu/common](https://evolu.dev/docs/api-reference/common) › [Worker](https://evolu.dev/docs/api-reference/common/Worker) › MessageChannel

Defined in: [packages/common/src/Worker.ts:163](https://github.com/evoluhq/evolu/blob/e7144e2bbe9069362b62dec1b64a8aa922b8f1b0/packages/common/src/Worker.ts#L163)

Platform-agnostic MessageChannel.

Creates two entangled ports: keep one and transfer the other (e.g., to a
SharedWorker via `postMessage` with `transfer`). Messages sent to one port
are received by the other.

Messages are queued until `onMessage` is assigned, enabling safe async
initialization. The sender can post messages immediately while the receiver
performs async setup — no manual buffering required.

For one-way communication, omit `Output` (defaults to `never`).

### Example

Transfer a channel port to a SharedWorker for async initialization:

```ts
// Main thread: create channel, transfer port1, use port2 immediately.
const channel = createMessageChannel<EvoluRequest, EvoluResponse>();

sharedWorker.port.postMessage(
  { type: "CreateEvolu", port: channel.port1.native },
  [channel.port1.native],
);

// Safe to send immediately — messages queue until worker is ready.
channel.port2.postMessage({ type: "Query", query });
channel.port2.onMessage = (response) => {
  handleResponse(response);
};
```

```ts
// Worker: receive the port, do async init, then start listening.
const evoluPort = createMessagePort<EvoluResponse, EvoluRequest>(message.port);
await openDatabase(name);
evoluPort.onMessage = (request) => {
  handleRequest(request);
};
// Queued messages are now delivered in order.
```

## See

https://developer.mozilla.org/en-US/docs/Web/API/MessageChannel

## Extends

- [`Disposable`](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-2.html#using-declarations-and-explicit-resource-management)

## Extended by

- [`TestMessageChannel`](https://evolu.dev/docs/api-reference/common/Worker/interfaces/TestMessageChannel)

## Methods

<a id="dispose"></a>

### \[dispose\]()

```ts
dispose: void;
```

Defined in: node_modules/.bun/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.disposable.d.ts:36

#### Inherited from

```ts
Disposable.[dispose]
```

## Properties

<a id="port1"></a>

### port1

```ts
readonly port1: MessagePort<Input, Output>;
```

Defined in: [packages/common/src/Worker.ts:165](https://github.com/evoluhq/evolu/blob/e7144e2bbe9069362b62dec1b64a8aa922b8f1b0/packages/common/src/Worker.ts#L165)

The first port of the channel.

---

<a id="port2"></a>

### port2

```ts
readonly port2: MessagePort<Output, Input>;
```

Defined in: [packages/common/src/Worker.ts:168](https://github.com/evoluhq/evolu/blob/e7144e2bbe9069362b62dec1b64a8aa922b8f1b0/packages/common/src/Worker.ts#L168)

The second port of the channel.