This repository has been archived by the owner on Nov 12, 2019. It is now read-only.
/
log-fetcher.js
75 lines (61 loc) · 1.54 KB
/
log-fetcher.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import ansiRegex from 'ansi-regex';
const dataOffset = 0;
let request;
const divide = data => {
const tester = ansiRegex();
const matcher = /.{1,139}/g;
return data
.split(/\n|\[K|\[[0-9]B|\[[1-9][0-9]B/)
.reduce((arr, line) => {
if (line.length < 140 || line.match(tester)) {
arr.push(line);
} else {
arr.push(...line.match(matcher));
}
return arr;
}, []);
};
const onData = e => {
const resp = {};
if (request.responseText != null) {
// Check if we have new data
const length = request.responseText.length;
if (length > dataOffset) {
resp.data = divide(request.responseText);
resp.done = false;
}
}
// When request is done
if (request.readyState === request.DONE) {
resp.done = true;
// Write an error, if request failed
if (request.status !== 200) {
resp.data = ['\r\n[task-inspector] Failed to fetch log!\r\n'];
} else {
resp.data = divide(request.responseText);
}
}
postMessage(resp);
if (resp.done) {
close();
}
};
const abort = () => {
request.removeEventListener('progress', onData);
request.removeEventListener('load', onData);
request.abort();
close();
};
self.addEventListener('message', e => {
if (e.data.url) {
request = new XMLHttpRequest();
request.open('get', e.data.url, true);
request.addEventListener('loadstart', onData);
request.addEventListener('progress', onData);
request.addEventListener('load', onData);
request.send();
}
if (e.data.abort) {
abort();
}
});