import { randomUUID } from 'crypto' import { remoteRuntimeUnavailableError } from './remote-runtime-request-frames' import { createSharedControlSubscription } from './remote-runtime-shared-control-subscriptions' import { finishSharedControlSubscription } from './remote-runtime-shared-control-state' import type { RemoteRuntimeSharedSubscription, SharedControlLogicalSubscription, SharedControlSubscriptionCallbacks } from './remote-runtime-shared-control-types' export async function startSharedControlSubscription(args: { subscriptions: Map> method: string params: unknown callbacks: SharedControlSubscriptionCallbacks ensureReady: () => Promise sendSubscription: (subscription: SharedControlLogicalSubscription) => void closeSubscription: (requestId: string) => void }): Promise { const requestId = randomUUID() const subscription = createSharedControlSubscription({ requestId, method: args.method, params: args.params, callbacks: args.callbacks }) args.subscriptions.set(requestId, subscription as SharedControlLogicalSubscription) try { await args.ensureReady() } catch (error) { finishSharedControlSubscription( args.subscriptions, subscription as SharedControlLogicalSubscription, false ) throw error } if (args.subscriptions.get(requestId) !== subscription) { throw remoteRuntimeUnavailableError('Remote runtime subscription closed before it started.') } args.sendSubscription(subscription as SharedControlLogicalSubscription) return { requestId, close: () => args.closeSubscription(requestId), sendBinary: () => false } }