global update and global fix

This commit is contained in:
lendry
2026-06-25 23:48:57 +03:00
parent 3880c68d59
commit b0ea87e898
121 changed files with 13759 additions and 663 deletions

View File

@@ -0,0 +1,72 @@
import { decryptBinary, decryptDirectMessage, encryptBinary, encryptDirectMessage } from '@/lib/e2e-crypto';
export type E2EMessageKind = 'text' | 'emoji' | 'image' | 'voice' | 'audio' | 'file';
export interface E2EMessagePayload {
kind: E2EMessageKind;
text?: string;
emojiId?: string;
fileName?: string;
mimeType?: string;
fileSize?: number;
durationMs?: number;
}
export async function encryptE2EPayload(userId: string, peerPublicKey: string, payload: E2EMessagePayload) {
return encryptDirectMessage(userId, peerPublicKey, JSON.stringify(payload));
}
export async function decryptE2EPayload(userId: string, peerPublicKey: string, encrypted: string): Promise<E2EMessagePayload | null> {
const decrypted = await decryptDirectMessage(userId, peerPublicKey, encrypted);
if (decrypted.startsWith('🔒')) return null;
try {
return JSON.parse(decrypted) as E2EMessagePayload;
} catch {
return { kind: 'text', text: decrypted };
}
}
export async function encryptE2EBlob(userId: string, peerPublicKey: string, data: ArrayBuffer) {
return encryptBinary(userId, peerPublicKey, data);
}
export async function decryptE2EBlob(userId: string, peerPublicKey: string, encryptedBytes: ArrayBuffer) {
return decryptBinary(userId, peerPublicKey, encryptedBytes);
}
export function e2eKindFromMessageType(type: string): E2EMessageKind {
switch (type) {
case 'EMOJI':
return 'emoji';
case 'IMAGE':
return 'image';
case 'VOICE':
return 'voice';
case 'AUDIO':
return 'audio';
case 'FILE':
return 'file';
default:
return 'text';
}
}
export function readableE2EPayload(payload: E2EMessagePayload | null) {
if (!payload) return '🔒 Зашифрованное сообщение';
switch (payload.kind) {
case 'emoji':
return payload.emojiId ?? '';
case 'text':
return payload.text ?? '';
case 'voice':
return 'Голосовое сообщение';
case 'audio':
return 'Аудио';
case 'image':
return 'Фото';
case 'file':
return payload.fileName ?? 'Файл';
default:
return '🔒 Зашифрованное сообщение';
}
}