import { randomUUID } from 'node:crypto' import { remoteRuntimeUnavailableError } from './remote-runtime-request-frames' import { admitSharedControlSubscription } from './remote-runtime-shared-control-admission' 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> deviceToken: string method: string params: unknown callbacks: SharedControlSubscriptionCallbacks ensureReady: () => Promise sendSubscription: (subscription: SharedControlLogicalSubscription) => void closeSubscription: (requestId: string) => void }): Promise { const retainedParamsBytes = admitSharedControlSubscription({ subscriptions: args.subscriptions, deviceToken: args.deviceToken, method: args.method, params: args.params }) const requestId = randomUUID() const subscription = createSharedControlSubscription({ requestId, method: args.method, params: args.params, retainedParamsBytes, 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 } }