From 2fae820ee40491c93fdc1dcbf8fa9c77b0758d15 Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Thu, 24 Mar 2022 12:01:41 +0100 Subject: [PATCH] Improved streaming as preperation for #300 --- dev/Remote/AbstractFetch.js | 51 ++++++++++--------- .../app/libraries/snappymail/http/stream.php | 2 +- 2 files changed, 27 insertions(+), 26 deletions(-) diff --git a/dev/Remote/AbstractFetch.js b/dev/Remote/AbstractFetch.js index 67c495423..57c2bab1d 100644 --- a/dev/Remote/AbstractFetch.js +++ b/dev/Remote/AbstractFetch.js @@ -81,36 +81,37 @@ export class AbstractFetchRemote * Can be used to stream lines of json encoded data, but does not work on all servers. * Apache needs 'flushpackets' like in */ - streamPerLine(fCallback, sGetAdd) { - rl.fetch(getURL(sGetAdd)) + streamPerLine(fCallback, sGetAdd, postData) { + rl.fetch(getURL(sGetAdd), {}, postData) .then(response => response.body) .then(body => { - // Firefox TextDecoderStream is not defined - // const reader = body.pipeThrough(new TextDecoderStream()).getReader(); - const reader = body.getReader(), - re = /\r\n|\n|\r/gm, - utf8decoder = new TextDecoder(); let buffer = ''; - function processText({ done, value }) { - buffer += value ? utf8decoder.decode(value, {stream: true}) : ''; - for (;;) { - let result = re.exec(buffer); - if (!result) { - if (done) { - break; + const + // Firefox TextDecoderStream is not defined +// reader = body.pipeThrough(new TextDecoderStream()).getReader(); + reader = body.getReader(), + re = /\r\n|\n|\r/gm, + utf8decoder = new TextDecoder(), + processText = ({ done, value }) => { + buffer += value ? utf8decoder.decode(value, {stream: true}) : ''; + for (;;) { + let result = re.exec(buffer); + if (!result) { + if (done) { + break; + } + reader.read().then(processText); + return; } - reader.read().then(processText); - return; + fCallback(buffer.slice(0, result.index)); + buffer = buffer.slice(result.index + 1); + re.lastIndex = 0; } - fCallback(buffer.slice(0, result.index)); - buffer = buffer.slice(result.index + 1); - re.lastIndex = 0; - } - if (buffer.length) { - // last line didn't end in a newline char - fCallback(buffer); - } - } + if (buffer.length) { + // last line didn't end in a newline char + fCallback(buffer); + } + }; reader.read().then(processText); }) } diff --git a/snappymail/v/0.0.0/app/libraries/snappymail/http/stream.php b/snappymail/v/0.0.0/app/libraries/snappymail/http/stream.php index 49dbee134..847bee9d6 100644 --- a/snappymail/v/0.0.0/app/libraries/snappymail/http/stream.php +++ b/snappymail/v/0.0.0/app/libraries/snappymail/http/stream.php @@ -3,7 +3,7 @@ namespace SnappyMail\HTTP; /** - * Can be used with JavaScript AbstractFetchRemote.streamPerLine(fCallback, sGetAdd) + * Can be used with JavaScript AbstractFetchRemote.streamPerLine(fCallback, sGetAdd, postData) */ abstract class Stream