62 lines
		
	
	
	
		
			2 KiB
			
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
	
		
			2 KiB
			
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
// Copyright 2024 Signal Messenger, LLC
 | 
						|
// SPDX-License-Identifier: AGPL-3.0-only
 | 
						|
 | 
						|
import { CallLinkRootKey } from '@signalapp/ringrtc';
 | 
						|
import type { CallLinkUpdateSyncEvent } from '../textsecure/messageReceiverEvents';
 | 
						|
import { createLogger } from '../logging/log';
 | 
						|
import * as Errors from '../types/errors';
 | 
						|
import { fromAdminKeyBytes } from './callLinks';
 | 
						|
import { getRoomIdFromRootKey } from './callLinksRingrtc';
 | 
						|
import { strictAssert } from './assert';
 | 
						|
import { CallLinkUpdateSyncType } from '../types/CallLink';
 | 
						|
import { DataWriter } from '../sql/Client';
 | 
						|
 | 
						|
const log = createLogger('onCallLinkUpdateSync');
 | 
						|
 | 
						|
export async function onCallLinkUpdateSync(
 | 
						|
  syncEvent: CallLinkUpdateSyncEvent
 | 
						|
): Promise<void> {
 | 
						|
  const { callLinkUpdate, confirm } = syncEvent;
 | 
						|
  const { type, rootKey, adminKey } = callLinkUpdate;
 | 
						|
 | 
						|
  if (!rootKey) {
 | 
						|
    log.warn('Missing rootKey, invalid sync message');
 | 
						|
    return;
 | 
						|
  }
 | 
						|
 | 
						|
  let callLinkRootKey: CallLinkRootKey;
 | 
						|
  let roomId: string;
 | 
						|
  try {
 | 
						|
    callLinkRootKey = CallLinkRootKey.fromBytes(rootKey as Buffer);
 | 
						|
    roomId = getRoomIdFromRootKey(callLinkRootKey);
 | 
						|
    strictAssert(
 | 
						|
      roomId,
 | 
						|
      'onCallLinkUpdateSync: roomId is required in sync message'
 | 
						|
    );
 | 
						|
  } catch (err) {
 | 
						|
    log.error('Could not parse root key');
 | 
						|
    return;
 | 
						|
  }
 | 
						|
 | 
						|
  const logId = `onCallLinkUpdateSync(${roomId}, ${type})`;
 | 
						|
  log.info(`${logId}: Processing`);
 | 
						|
 | 
						|
  try {
 | 
						|
    if (type === CallLinkUpdateSyncType.Update) {
 | 
						|
      const rootKeyString = callLinkRootKey.toString();
 | 
						|
      const adminKeyString = adminKey ? fromAdminKeyBytes(adminKey) : null;
 | 
						|
      window.reduxActions.calling.handleCallLinkUpdate({
 | 
						|
        rootKey: rootKeyString,
 | 
						|
        adminKey: adminKeyString,
 | 
						|
      });
 | 
						|
    } else if (type === CallLinkUpdateSyncType.Delete) {
 | 
						|
      log.info(`${logId}: Deleting call link record ${roomId}`);
 | 
						|
      await DataWriter.deleteCallLinkFromSync(roomId);
 | 
						|
      window.reduxActions.calling.handleCallLinkDelete({ roomId });
 | 
						|
    }
 | 
						|
 | 
						|
    confirm();
 | 
						|
  } catch (err) {
 | 
						|
    log.error(`${logId}: Failed to process`, Errors.toLogFormat(err));
 | 
						|
  }
 | 
						|
}
 |