Fall back to the link when an encrypted image cannot be fetched, and drop writes whose database closed
This commit is contained in:
parent
9f7bd3ba2e
commit
7aba172a9c
2 changed files with 19 additions and 6 deletions
|
|
@ -59,13 +59,14 @@
|
||||||
onMount(async () => {
|
onMount(async () => {
|
||||||
// If we have an encryption algorithm, fetch and decrypt
|
// If we have an encryption algorithm, fetch and decrypt
|
||||||
if (algorithm === "aes-gcm" && key && nonce) {
|
if (algorithm === "aes-gcm" && key && nonce) {
|
||||||
|
try {
|
||||||
const response = await fetch(url)
|
const response = await fetch(url)
|
||||||
|
|
||||||
if (response.ok) {
|
|
||||||
const ciphertext = new Uint8Array(await response.arrayBuffer())
|
const ciphertext = new Uint8Array(await response.arrayBuffer())
|
||||||
const decryptedData = await decryptFile({ciphertext, key, nonce, algorithm})
|
const decryptedData = await decryptFile({ciphertext, key, nonce, algorithm})
|
||||||
|
|
||||||
setBlobSrc(new Uint8Array(decryptedData), mime)
|
setBlobSrc(new Uint8Array(decryptedData), mime)
|
||||||
|
} catch {
|
||||||
|
hasError = true
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
src = url
|
src = url
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ export type IDBOptions = {
|
||||||
export class IDB {
|
export class IDB {
|
||||||
connection: Maybe<Promise<Maybe<IDBPDatabase>>>
|
connection: Maybe<Promise<Maybe<IDBPDatabase>>>
|
||||||
failedToConnect = false
|
failedToConnect = false
|
||||||
|
private generation = 0
|
||||||
|
|
||||||
constructor(readonly options: IDBOptions) {}
|
constructor(readonly options: IDBOptions) {}
|
||||||
|
|
||||||
|
|
@ -70,10 +71,20 @@ export class IDB {
|
||||||
return this.connection
|
return this.connection
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Deleting an account closes the database out from under writes that already awaited it, and
|
||||||
|
// the transaction they go on to open throws where nobody is catching. What they were going to
|
||||||
|
// read or write is gone with the connection, so hand them nothing instead.
|
||||||
|
private live = async () => {
|
||||||
|
const generation = this.generation
|
||||||
|
const connection = await this.connect()
|
||||||
|
|
||||||
|
return generation === this.generation ? connection : undefined
|
||||||
|
}
|
||||||
|
|
||||||
table = <T>(name: string) => new IDBTable<T>(this, name)
|
table = <T>(name: string) => new IDBTable<T>(this, name)
|
||||||
|
|
||||||
getAll = async <T>(table: string): Promise<T[]> => {
|
getAll = async <T>(table: string): Promise<T[]> => {
|
||||||
const connection = await this.connect()
|
const connection = await this.live()
|
||||||
|
|
||||||
if (!connection) return []
|
if (!connection) return []
|
||||||
|
|
||||||
|
|
@ -87,7 +98,7 @@ export class IDB {
|
||||||
}
|
}
|
||||||
|
|
||||||
bulkPut = async <T>(table: string, data: Iterable<T>) => {
|
bulkPut = async <T>(table: string, data: Iterable<T>) => {
|
||||||
const connection = await this.connect()
|
const connection = await this.live()
|
||||||
|
|
||||||
if (!connection) return
|
if (!connection) return
|
||||||
|
|
||||||
|
|
@ -108,7 +119,7 @@ export class IDB {
|
||||||
}
|
}
|
||||||
|
|
||||||
bulkDelete = async (table: string, ids: Iterable<string>) => {
|
bulkDelete = async (table: string, ids: Iterable<string>) => {
|
||||||
const connection = await this.connect()
|
const connection = await this.live()
|
||||||
|
|
||||||
if (!connection) return
|
if (!connection) return
|
||||||
|
|
||||||
|
|
@ -123,6 +134,7 @@ export class IDB {
|
||||||
const connection = this.connection
|
const connection = this.connection
|
||||||
|
|
||||||
this.connection = undefined
|
this.connection = undefined
|
||||||
|
this.generation += 1
|
||||||
|
|
||||||
await connection?.then(c => c?.close())
|
await connection?.then(c => c?.close())
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue