# @shade/transport-bridge

Transport-agnostic delivery for Shade: **WS → SSE → long-poll**, in priority
order, behind a single `IncomingMessage` interface.

```ts
import {
  FallbackBridgeTransport,
  WsBridge,
  SseBridge,
  LongPollBridge,
} from '@shade/transport-bridge';

const auth = { crypto, signingPrivateKey, address: 'bob' };

const bridge = new FallbackBridgeTransport([
  new WsBridge({       baseUrl, auth }),
  new SseBridge({      baseUrl, auth }),
  new LongPollBridge({ baseUrl, auth }),
]);

await bridge.connect({
  onMessage: (msg) => {
    // msg: { from: string; bytes: Uint8Array; receivedAt: number; msgId?: string }
  },
});

console.log(bridge.activeKind); // "ws" | "sse" | "long-poll"
```

Pair with `createBridgeRoutes` in `@shade/inbox-server` to expose the
matching `/v1/bridge/{stream,poll,ws}` endpoints. Full design + threat
model in [`docs/transport.md`](../../docs/transport.md).

## What it solves

Browser extensions, strict corporate proxies, and edge runtimes routinely
block long-lived WebSockets. Apps that already use the Shade inbox shouldn't
have to write three custom delivery paths to handle the realistic mix of
hostile networks they ship into. This package is the canonical answer.

## Status

V3.7. Stable wire format, additive change to `@shade/inbox-server`. See
[CHANGELOG](../../CHANGELOG.md).
