( credentials: Credentials, session: DecryptedSession, )
| 159 | } |
| 160 | |
| 161 | export async function fetchMessages( |
| 162 | credentials: Credentials, |
| 163 | session: DecryptedSession, |
| 164 | ): Promise<MessageContent[]> { |
| 165 | const res = await fetch( |
| 166 | `${SERVER_URL}/v1/sessions/${session.id}/messages`, |
| 167 | { headers: authHeaders(credentials.token) }, |
| 168 | ); |
| 169 | if (!res.ok) throw new Error(`Failed to fetch messages: ${res.status}`); |
| 170 | |
| 171 | const data = await res.json(); |
| 172 | const messages: MessageContent[] = []; |
| 173 | |
| 174 | for (const raw of (data.messages as RawMessage[]).reverse()) { |
| 175 | if (raw.content?.t === 'encrypted' && raw.content.c) { |
| 176 | try { |
| 177 | const decrypted = await decrypt( |
| 178 | session.encryptionKey, |
| 179 | session.encryptionVariant, |
| 180 | decodeBase64(raw.content.c as string), |
| 181 | ); |
| 182 | if (decrypted) { |
| 183 | messages.push(decrypted as MessageContent); |
| 184 | } |
| 185 | } catch { |
| 186 | // Skip undecryptable messages |
| 187 | } |
| 188 | } |
| 189 | } |
| 190 | |
| 191 | return messages; |
| 192 | } |
| 193 | |
| 194 | export async function deleteSession( |
| 195 | credentials: Credentials, |
no test coverage detected