dget

<script type="module">
async function dget(id, relay){
  return new Promise((resolve) => {
    const socket = new WebSocket(relay)
    let file_data = []
    let fileids = []

    socket.onopen = function(){
      socket.send(JSON.stringify(["REQ", "fileids", {"ids": [id]}]))
    }

    socket.onmessage = async function(e){
      const data = JSON.parse(e.data)

      if(data[0] === "EVENT" && data[1] === "fileids"){
        fileids.push(...JSON.parse(data[2].content).fileids)
        socket.send(JSON.stringify(["REQ", "parts", {"ids": fileids, "limit": 3000}]))
      }
      else if(data[0] === "EVENT" && data[1] === "parts"){
        const match = data[2].content.match(/^part(\d);(\d);[a-z0-9]+;/)
        const part_data = data[2].content.substr(match[0].length)
        file_data.push([parseInt(match[1], 10), part_data])

        if(file_data.length === fileids.length){
          file_data = file_data.sort((a, b) => a[0] - b[0]).map(e => e[1])
          const datauri = "data:" + file_data.join("")
          const blob = await (await fetch(datauri)).blob()
          resolve(URL.createObjectURL(blob))
        }
      }
    }
  })
}

const res = await dget("411b819bcfa948b4a251658f930fe746d33b094c21d3c78e6a28b86e7c964af0", "wss://relay.nostr.band")
console.log("res", res)
</script>
Edit

Pub: 09 Feb 2024 06:32 UTC

Views: 46