You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
session-desktop/ts/session/apis/snode_api/swarm_polling_config/SwarmPollingConfigShared.ts

64 lines
2.3 KiB
TypeScript

import { compact, toNumber } from 'lodash';
import { RetrieveMessageItem } from '../types';
import { extractWebSocketContent } from '../swarmPolling';
import { SignalService } from '../../../../protobuf';
import { IncomingMessage } from '../../../messages/incoming/IncomingMessage';
import { EnvelopePlus } from '../../../../receiver/types';
function extractWebSocketContents(configMsgs: Array<RetrieveMessageItem>) {
try {
return compact(
configMsgs.map((m: RetrieveMessageItem) => {
return extractWebSocketContent(m.data, m.hash);
})
);
} catch (e) {
window.log.warn('extractWebSocketContents failed with ', e.message);
return [];
}
}
async function decryptSharedConfigMessages(
extractedMsgs: ReturnType<typeof extractWebSocketContents>,
decryptEnvelope: (envelope: EnvelopePlus) => Promise<ArrayBuffer | null>
) {
const allDecryptedConfigMessages: Array<IncomingMessage<SignalService.ISharedConfigMessage>> = [];
for (let index = 0; index < extractedMsgs.length; index++) {
const groupConfigMessage = extractedMsgs[index];
try {
const envelope: EnvelopePlus = SignalService.Envelope.decode(groupConfigMessage.body) as any;
const decryptedEnvelope = await decryptEnvelope(envelope);
if (!decryptedEnvelope?.byteLength) {
continue;
}
const content = SignalService.Content.decode(new Uint8Array(decryptedEnvelope));
if (content.sharedConfigMessage) {
const asIncomingMsg: IncomingMessage<SignalService.ISharedConfigMessage> = {
envelopeTimestamp: toNumber(envelope.timestamp),
message: content.sharedConfigMessage,
messageHash: groupConfigMessage.messageHash,
authorOrGroupPubkey: envelope.source,
authorInGroup: envelope.senderIdentity,
};
allDecryptedConfigMessages.push(asIncomingMsg);
} else {
throw new Error(
'received a message to a namespace reserved for user config but not containign a sharedConfigMessage'
);
}
} catch (e) {
window.log.warn(
`failed to decrypt message with hash "${groupConfigMessage.messageHash}": ${e.message}`
);
}
}
return allDecryptedConfigMessages;
}
export const SwarmPollingConfigShared = {
decryptSharedConfigMessages,
extractWebSocketContents,
};