Tunnels
TL;DR
client.tunnels exposes a local service through the relay over a connected session: open a tunnel for a local port, close it, list and get active tunnels, and sessions() to pick a connected session to open against. Relay plane, async.
tunnels uses your relay token (CMDOP_TOKEN).
Methods
| Method | What |
|---|---|
open(session_id, local_port=, protocol=, local_host=, subdomain=, options=) | Open a tunnel to a local port over a connected session. |
close(tunnel_id) | Close a tunnel (idempotent). |
list(page=, per_page=) | List tunnels (offset-paginated; also iter / pages). |
get(tunnel_id) | Detail for one tunnel. |
sessions() | The connected-session picker for opening tunnels. |
protocol defaults to "http" and local_host to "127.0.0.1".
Open and close
Pick a connected session, then open a tunnel to a local port:
async with Client(token="...") as c:
sessions = await c.tunnels.sessions()
session_id = sessions[0].session_id
tunnel = await c.tunnels.open(session_id, local_port=3000, protocol="http")
print(tunnel.id)
await c.tunnels.close(tunnel.id)const sessions = await c.tunnels.sessions();
const tunnel = await c.tunnels.open(sessions[0].sessionId, { localPort: 3000, protocol: "http" });
await c.tunnels.close(tunnel.id);List and inspect
page = await c.tunnels.list()
for t in page.items:
print(t.id, t.protocol)
detail = await c.tunnels.get(tunnel_id)const page = await c.tunnels.list();
const detail = await c.tunnels.get(tunnelId);