import { findIndex } from 'lodash'; import { OpenGroupData } from '../../../../data/opengroups'; import { DecodedResponseBodiesV4 } from '../../../onions/onionv4'; import { BatchSogsReponse, OpenGroupBatchRow } from './sogsV3BatchPoll'; import { parseCapabilities } from './sogsV3Capabilities'; /** * @param subrequestOptionsLookup list of subrequests used for the batch request (order sensitive) * @param batchPollResults The result from the batch request (order sensitive) */ export const getCapabilitiesFromBatch = ( subrequestOptionsLookup: Array, bodies: DecodedResponseBodiesV4 ): Array | null => { const capabilitiesBatchIndex = findIndex( subrequestOptionsLookup, (subrequest: OpenGroupBatchRow) => { return subrequest.type === 'capabilities'; } ); const capabilities: Array | null = parseCapabilities(bodies?.[capabilitiesBatchIndex]?.body) || null; return capabilities; }; /** using this as explicit way to ensure order */ export const handleCapabilities = async ( subrequestOptionsLookup: Array, batchPollResults: BatchSogsReponse, serverUrl: string // roomId: string ): Promise> => { if (!batchPollResults.body) { return null; } const capabilities = getCapabilitiesFromBatch(subrequestOptionsLookup, batchPollResults.body); if (!capabilities) { window?.log?.error( 'Failed capabilities subrequest - cancelling capabilities response handling' ); return null; } // get all v2OpenGroup rooms with the matching serverUrl and set the capabilities. // TODO: implement - update capabilities. Unsure whether to store in DB or save to instance of this obj. const rooms = OpenGroupData.getV2OpenGroupRoomsByServerUrl(serverUrl); if (!rooms || !rooms.length) { window?.log?.error('handleCapabilities - Found no groups with matching server url'); return null; } const updatedRooms = rooms.map(r => ({ ...r, capabilities })); await OpenGroupData.saveV2OpenGroupRooms(updatedRooms); return capabilities; };