import type { parseRemoteRuntimeRpcFrame } from './remote-runtime-request-frames' import { logUnknownSharedControlResponse } from './remote-runtime-shared-control-diagnostics-log' import type { SharedControlRetiredRequestIds } from './remote-runtime-shared-control-retired-request-ids' import { sendRetiredSharedControlCleanupRequest } from './remote-runtime-shared-control-subscription-close' import { handleSharedControlLogicalResponse } from './remote-runtime-shared-control-subscriptions' import { refreshSharedControlPendingRequestTimeouts, resolveSharedControlPendingResponse } from './remote-runtime-shared-control-state' import type { SharedControlLogicalSubscription, SharedControlPendingRequest } from './remote-runtime-shared-control-types' type SharedControlFrame = Exclude, { type: 'error' }> export function dispatchSharedControlFrame(args: { environmentId?: string frame: SharedControlFrame pendingRequests: Map> subscriptions: Map> retiredRequestIds: SharedControlRetiredRequestIds deviceToken: string send: (payload: unknown) => boolean }): void { if (args.frame.type === 'keepalive') { refreshSharedControlPendingRequestTimeouts(args.pendingRequests) return } const response = args.frame.response const subscription = args.subscriptions.get(response.id) if (subscription) { handleSharedControlLogicalResponse({ subscriptions: args.subscriptions, subscription, response, request: (method, params) => sendRetiredSharedControlCleanupRequest({ retiredRequestIds: args.retiredRequestIds, deviceToken: args.deviceToken, method, params, send: args.send }) }) if (!args.subscriptions.has(response.id)) { args.retiredRequestIds.retire(response.id) } return } if (args.pendingRequests.has(response.id)) { resolveSharedControlPendingResponse(args.pendingRequests, response.id, response) args.retiredRequestIds.retire(response.id) return } if (args.retiredRequestIds.has(response.id)) { return } logUnknownSharedControlResponse({ environmentId: args.environmentId, responseId: response.id, pendingRequests: args.pendingRequests, subscriptions: args.subscriptions }) }