mirror of
https://github.com/the-djmaze/snappymail.git
synced 2025-10-02 09:54:21 +08:00
Improved streaming as preperation for #300
This commit is contained in:
parent
b138c1b4a0
commit
2fae820ee4
2 changed files with 27 additions and 26 deletions
|
@ -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 <Proxy "fcgi://...." flushpackets=on></Proxy>
|
||||
*/
|
||||
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);
|
||||
})
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue