Each auth.Provider now declares DefaultServiceURL() so callers do not
need to know service-specific endpoints. ApplyAuthDefaults fills Engine
and URL from the provider before validation runs — explicit flags always
win, and providers with no default URL require -url to be set explicitly.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Also add OLCRTC_CARRIER fallback in entrypoint for backwards compat
with existing docker-compose configs.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace all -carrier references with -auth in settings, manual, fast,
uri, and about. Update architecture diagram and repo structure table
to reflect internal/engine + internal/auth split (replaces internal/provider).
Add pkg/olcrtc section describing the public Go library API.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Dial now sets SetEndedCallback to close the pipe with ErrSessionEnded
and starts WatchConnection in a goroutine. Consumers (e.g. sing-box)
get a concrete error from Read when the session dies permanently.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add olcrtc.CreateRoom(ctx, authName) that delegates to the auth
provider's RoomCreator interface. Returns ErrRoomCreationUnsupported
for providers that don't support room creation (e.g. telemost).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add conn.go wrapping Session as net.Conn: Read from pipe fed by OnData,
Write calls engine.Send, Close drains pipe and tears down session.
Add Session.Dial(ctx) as single-call connect-and-wrap entry point.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Exposes olcrtc as an embeddable Go library via pkg/olcrtc.Session.
Two usage modes:
- Direct engine: caller supplies Engine+URL+Token, no HTTP auth flow.
- Built-in auth: caller supplies Auth+RoomID; the registered auth
provider (telemost, jazz, wbstream) resolves credentials internally.
Public surface:
New(ctx, Config) (*Session, error)
Session.Connect / Send / Close / WatchConnection
Session.CanSend / SetEndedCallback / SetShouldReconnect
RegisterDefaults() — pulls in all built-in engines + auth providers.
Also add !pkg/ exception to .gitignore (bare "olcrtc" pattern was
shadowing the new directory).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Break CLI backwards compatibility as planned for refactor/universal-carrier:
- Drop -carrier flag; add -auth (auth provider name), -engine (engine
name for -auth none), -url and -token (SFU endpoint + access token for
direct/none auth mode).
- session.Config.Carrier → Auth + Engine + URL + Token.
- session.Gen() is now generic: auth.Get(cfg.Auth).(auth.RoomCreator)
replaces the hard-coded switch on carrier names.
- Register a "none" carrier in builtin (registerDirect) that bypasses
auth and connects directly to any engine with caller-supplied URL+Token.
- auth/telemost.Provider.Issue now accepts a raw room-ID hash in addition
to a full https://telemost.yandex.ru/j/<id> URL.
- Plumb Engine/URL/Token from session.Config through server.Run,
client.Run/RunWithReady, bringUpLink, link.Config, transport.Config, and
carrier.Config so the "none" carrier has access to them end-to-end.
- Update all tests and mobile.go call sites.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Decompose the monolithic internal/provider/telemost package into two
orthogonal layers: engine/goolom (Yandex proprietary SFU wire protocol —
WebSocket signaling, dual pub/sub PeerConnections, DataChannel, telemetry)
and auth/telemost (HTTP connection-info fetch → engine.Credentials).
Add engine.Config.Refresh callback so Goolom can obtain fresh peerID and
credentials on every reconnect without a direct dependency on the auth
package. engine_adapter wires the Refresh closure from authProvider.Issue.
Delete internal/provider/ entirely (telemost was the last tenant) and
remove the now-obsolete provider_adapter + its test from builtin.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Split the SaluteJazz provider along the same engine/auth seam used for
WB Stream:
- internal/engine/salutejazz — Sber WS+SDP signaling engine (pub/sub
split, _reliable data channel, length-prefixed DataPacket envelope).
Consumes URL/Token/Extra[password] from engine.Config; no embedded
HTTP/auth logic. Registered as engine "salutejazz".
- internal/auth/salutejazz — create-meeting + preconnect flow.
Implements auth.Provider (Engine() → "salutejazz") and
auth.RoomCreator. Accepts cfg.RoomURL in "<roomID>:<password>" form
for join, or empty / "any" / "dummy" for create-on-the-fly, matching
the legacy provider.
The carrier name "jazz" now goes through registerEngineAuth.
engine.Config gains an Extra map so auth providers can pass engine-
specific fields (password here); engine_adapter forwards
auth.Credentials.Extra into it.
session.Gen for jazz uses the auth.RoomCreator capability. Output now
includes the password ("<roomID>:<password>") — without it the printed
room is not joinable, so the legacy roomID-only output was effectively
broken for the gen flow.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Split the WB Stream provider into two orthogonal pieces:
- internal/engine/livekit — generic LiveKit transport (URL+Token only,
no service-specific assumptions). Registered as engine "livekit".
- internal/auth/wbstream — WB Stream API flow (guest register, join,
token exchange). Implements auth.Provider and auth.RoomCreator,
reports engine "livekit".
The carrier name "wbstream" now goes through registerEngineAuth, which
wires the auth provider to the engine it declares. CLI surface is
unchanged. session.Gen for wbstream calls the RoomCreator directly;
that path will become fully generic in a later step. jazz and telemost
remain on the legacy provider path for now.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Lay the groundwork for splitting service-specific logic (WB / Jazz /
Telemost API flows) from wire-level transport engines (LiveKit, Goolom,
future Jitsi). An engine takes only URL+Token+Name+network knobs; an
auth provider produces those credentials and reports which engine it
feeds. RoomCreator is an optional capability for the gen mode.
Existing carriers and providers are untouched.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>