forked from coracle/flotilla
50 lines
1.3 KiB
Svelte
50 lines
1.3 KiB
Svelte
<script lang="ts">
|
|
import {onDestroy} from "svelte"
|
|
import {now} from "@welshman/lib"
|
|
import {BLOSSOM_AUTH, makeEvent, getTags, getTagValue, tagsFromIMeta} from "@welshman/util"
|
|
import {signer} from "@welshman/app"
|
|
import {imgproxy} from "@app/state"
|
|
|
|
const {value, event, ...props} = $props()
|
|
|
|
const url = value.url.toString()
|
|
|
|
// If we fail to fetch the image, try authenticating if we have a blossom hash
|
|
const onerror = async () => {
|
|
const meta = getTags("imeta", event.tags)
|
|
.map(tagsFromIMeta)
|
|
.find(meta => getTagValue("url", meta) === url)
|
|
const hash = meta ? getTagValue("x", meta) : undefined
|
|
|
|
if (hash && $signer) {
|
|
const event = await signer.get().sign(
|
|
makeEvent(BLOSSOM_AUTH, {
|
|
tags: [
|
|
["t", "get"],
|
|
["x", hash],
|
|
["expiration", String(now() + 30)],
|
|
],
|
|
}),
|
|
)
|
|
|
|
const res = await fetch(url, {
|
|
headers: {
|
|
Authorization: `Nostr ${btoa(JSON.stringify(event))}`,
|
|
},
|
|
})
|
|
|
|
if (res.status === 200) {
|
|
src = URL.createObjectURL(await res.blob())
|
|
}
|
|
}
|
|
}
|
|
|
|
let src = $state(imgproxy(url))
|
|
|
|
onDestroy(() => {
|
|
URL.revokeObjectURL(src)
|
|
})
|
|
</script>
|
|
|
|
<img alt="" {src} {onerror} {...props} />
|