import { parseAuthenticatedFrame, parseReadyFrame } from './remote-runtime-request-frames' import type { RemoteRuntimeClientError } from './remote-runtime-client-error' import type { RuntimeCapability } from './protocol-version' import { dispatchSharedControlFrame } from './remote-runtime-shared-control-frame-dispatch' import { parseSharedControlFrame } from './remote-runtime-shared-control-protocol' import type { SharedControlRetiredRequestIds } from './remote-runtime-shared-control-retired-request-ids' import { resolveSharedControlReadyWaiters } from './remote-runtime-shared-control-state' import type { SharedControlConnectionState, SharedControlLogicalSubscription, SharedControlPendingRequest, SharedControlReadyWaiter } from './remote-runtime-shared-control-types' export function handleSharedControlTextFrame(args: { frame: string state: SharedControlConnectionState sharedKey: Uint8Array | null deviceToken: string clientCapabilities: readonly RuntimeCapability[] environmentId?: string pendingRequests: Map> subscriptions: Map> retiredRequestIds: SharedControlRetiredRequestIds readyWaiters: SharedControlReadyWaiter[] setState: (state: SharedControlConnectionState) => void handleSocketClosed: (error: RemoteRuntimeClientError) => void sendEncrypted: (payload: unknown) => boolean markReady: () => void replaySubscriptions: () => void }): void { if (args.state === 'awaiting_ready') { const error = parseReadyFrame(args.frame) if (error) { args.handleSocketClosed(error) return } args.setState('awaiting_authenticated') args.sendEncrypted({ type: 'e2ee_auth', deviceToken: args.deviceToken, clientCapabilities: args.clientCapabilities }) return } const parsed = parseSharedControlFrame(args.frame, args.sharedKey, args.state) if (parsed.type === 'auth') { const error = parseAuthenticatedFrame(parsed.plaintext) if (error) { args.handleSocketClosed(error) return } args.setState('ready') args.markReady() resolveSharedControlReadyWaiters(args.readyWaiters) args.replaySubscriptions() return } if (parsed.type === 'error') { args.handleSocketClosed(parsed.error) return } dispatchSharedControlFrame({ environmentId: args.environmentId, frame: parsed.frame, pendingRequests: args.pendingRequests, subscriptions: args.subscriptions, retiredRequestIds: args.retiredRequestIds, deviceToken: args.deviceToken, send: args.sendEncrypted }) }