JavaScript: ako sledovať websocket upload?

hknmtt

  • ***
  • 145
    • Zobrazit profil
    • E-mail
JavaScript: ako sledovať websocket upload?
« kdy: Dnes v 08:37:54 »
Nahravam subor cez websocket. Subor je obycajny file objekt z file inputu a odosiela sa ako ws.send(file). Chcem vsak sledovat priebeh nahravania. Ako by to bolo mozne? Je mi jedno ci sledujem citanie dat zo suboru alebo odosielanie dat od websocketu, proste len chcem mat prehlad. Urcite sa vsak chcem vyhnut implementacii "manualneho" upload cez WebSocketStream. A rozkuzkovat subor cez file.slice(offset, limit) a posielat to takto cez ws.send(chunk) nefunguje, takze tadial cesta nevedie.


Jen Kings

  • ***
  • 122
  • Hryprodva.cz
    • Zobrazit profil
    • Hry Pro Dva
    • E-mail
Re:JavaScript: ako sledovať websocket upload?
« Odpověď #1 kdy: Dnes v 09:17:26 »
S zkoušel jsi soubor číst jako stream, a ten rourovat do websocketu? Nad streamem si uložíš reader, který ti poskytne callbackované informace o tom kolik toho přenesl, takže si jen na začátku vyčteš ze souboru jeho původní velikost, a pak si do další globálky v callbacku přičítáš kolik již bylo přeneseno, takže pak spočítáš procentuální progress
Sice to na pozadí funguje dost podobně jako to slicování, ale ne úplně. Nevím jakým způsobem to zmíněné "slicování a posílání nefunguje", takže nedovedu říct, jestli tohle je pro tebe cesta, nebo ne.

hknmtt

  • ***
  • 145
    • Zobrazit profil
    • E-mail
Re:JavaScript: ako sledovať websocket upload?
« Odpověď #2 kdy: Dnes v 09:34:53 »
Nevím jakým způsobem to zmíněné "slicování a posílání nefunguje", takže nedovedu říct, jestli tohle je pro tebe cesta, nebo ne.

Kód: [Vybrat]
        const MB = 1024*1024
        let offset = 0
        while (offset < file.size) {
          const payload = file.slice(offset, offset+MB)
          offset += MB
          up.send(payload)
          progressor(payload.size)
        }

toto mi produkuje prazdne wbesocket spravy. Cize ws.send() sa vola, lenze nic neodosiela. Predpokladam ze kvoli tomu ze ws.bufferedAmount sa s kazdym volanim ws.send() zvysuje a ked vykonava samotny send tak mozno zisti ze ma neplatne udaje lebo sa velkost znovu zvysila tak neodosle nic? Moc mi to logiku nedava, ale je to JS a tam logika neexistuje.

Taktiez by to mohlo mat nieco s tym ze payload prestane mat platnu adresu kvoli slucke a oneskorenemu pristupu do pamete, takze ked websocket realne odosiela data tak blob/buffer na ktory payload odkazoval v ws.send uz je neplatny? Nemam sajnu.

Jen Kings

  • ***
  • 122
  • Hryprodva.cz
    • Zobrazit profil
    • Hry Pro Dva
    • E-mail
Re:JavaScript: ako sledovať websocket upload?
« Odpověď #3 kdy: Dnes v 09:51:28 »
a ten stream jsi zkoušel ? Dělá to to stejné ?


Kód: [Vybrat]
const stream = file.stream();
const reader = stream.getReader();

Kód: [Vybrat]
    function readAndSend() {
        reader.read().then(({ done, value }) => {
            if (done) {
                return; /* odesláno */
            }
            ws.send(value);

            //value.length  -> obsahuje objem který se teď odeslal
            readAndSend();
        }).catch((error) => {
            //ERROR
        });
    }

    readAndSend();


To je teď jen tak z hlavy, ber to spíš jako pseudokód a náznak toho, jak bych si představoval že by to mohlo fungovat