You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
168 lines
3.4 KiB
168 lines
3.4 KiB
5 years ago
|
import {EventEmitter} from 'events';
|
||
|
|
||
|
export class LogProvider extends EventEmitter {
|
||
|
static levels = ['Debug', 'Info', 'Warning', 'Error', 'Fatal'];
|
||
|
|
||
|
cachedSettings = null;
|
||
|
fromFile = false;
|
||
|
cachedEntries = [];
|
||
|
hasMore = true;
|
||
|
poll = false;
|
||
|
pollActive = false;
|
||
|
|
||
|
constructor (limit = 50) {
|
||
|
super();
|
||
|
this.baseLimit = limit;
|
||
|
this.loading = false;
|
||
|
this.limit = limit;
|
||
|
this.searchQuery = '';
|
||
|
}
|
||
|
|
||
|
reset () {
|
||
|
this.hasMore = true;
|
||
|
this.limit = this.baseLimit;
|
||
|
this.cachedEntries = [];
|
||
|
this.loading = false;
|
||
|
}
|
||
|
|
||
|
get entries () {
|
||
|
return cachedEntries;
|
||
|
}
|
||
|
|
||
|
set query (newQuery) {
|
||
|
if (newQuery !== this.searchQuery) {
|
||
|
if (newQuery) {
|
||
|
this.stopPolling();
|
||
|
}
|
||
|
this.searchQuery = newQuery;
|
||
|
this.reset();
|
||
|
this.load().then(async () => {
|
||
|
// wait with resuming polling until we've re-loaded the list
|
||
|
if (!newQuery && await this.getLive()) {
|
||
|
this.startPolling();
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
get query () {
|
||
|
return this.searchQuery;
|
||
|
}
|
||
|
|
||
|
async load () {
|
||
|
this.loading = true;
|
||
|
if (this.cachedEntries.length >= this.limit || this.fromFile || !this.hasMore) {
|
||
|
return;
|
||
|
}
|
||
|
const newData = await this.loadEntries(this.cachedEntries.length, this.limit - this.cachedEntries.length);
|
||
|
if (newData.data.length === 0) {
|
||
|
this.hasMore = false;
|
||
|
}
|
||
|
this.cachedEntries = this.cachedEntries.concat(newData.data);
|
||
|
this.loading = false;
|
||
|
this.emit('entries', this.cachedEntries);
|
||
|
}
|
||
|
|
||
|
loadEntries (offset, count = 50) {
|
||
|
return this.getSettings().then(({levels}) => {
|
||
|
if (this.searchQuery) {
|
||
|
return $.get(OC.generateUrl('/apps/logreader/search'), {
|
||
|
offset,
|
||
|
count,
|
||
|
query: this.query,
|
||
|
levels
|
||
|
});
|
||
|
} else {
|
||
|
return $.get(OC.generateUrl('/apps/logreader/get'), {
|
||
|
offset,
|
||
|
count,
|
||
|
levels
|
||
|
});
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
async getSettings () {
|
||
|
if (this.cachedSettings) {
|
||
|
return this.cachedSettings;
|
||
|
}
|
||
|
this.cachedSettings = await $.get(OC.generateUrl('/apps/logreader/settings'));
|
||
|
return this.cachedSettings;
|
||
|
}
|
||
|
|
||
|
async getLevels () {
|
||
|
const {levels} = await this.getSettings();
|
||
|
return levels.split('').map(level => level > 0);
|
||
|
}
|
||
|
|
||
|
setLevels (levels) {
|
||
|
const levelsString = levels.map(level => level ? 1 : 0).join('');
|
||
|
if (this.cachedSettings) {
|
||
|
this.cachedSettings.levels = levelsString;
|
||
|
}
|
||
|
return $.ajax({
|
||
|
type: 'PUT',
|
||
|
url: OC.generateUrl('/apps/logreader/levels'),
|
||
|
data: {levels: levelsString}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
async getRelative () {
|
||
|
const {relativedates} = await this.getSettings();
|
||
|
return relativedates;
|
||
|
}
|
||
|
|
||
|
async getDateFormat () {
|
||
|
const {dateformat} = await this.getSettings();
|
||
|
return dateformat;
|
||
|
}
|
||
|
|
||
|
async getLive () {
|
||
|
const {live} = await this.getSettings();
|
||
|
return live;
|
||
|
}
|
||
|
|
||
|
setRelative (relative) {
|
||
|
return $.ajax({
|
||
|
type: 'PUT',
|
||
|
url: OC.generateUrl('/apps/logreader/relative'),
|
||
|
data: {relative}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
setLive (live) {
|
||
|
return $.ajax({
|
||
|
type: 'PUT',
|
||
|
url: OC.generateUrl('/apps/logreader/live'),
|
||
|
data: {live}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
async startPolling () {
|
||
|
if (this.cachedEntries.length === 0 || this.poll || this.pollActive) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
this.pollActive = true;
|
||
|
this.poll = true;
|
||
|
|
||
|
while (this.poll) {
|
||
|
const lastReqId = this.cachedEntries[0].reqId;
|
||
|
|
||
|
const newData = await $.get(OC.generateUrl('/apps/logreader/poll'), {
|
||
|
lastReqId
|
||
|
});
|
||
|
if (this.poll) {
|
||
|
this.cachedEntries = newData.concat(this.cachedEntries);
|
||
|
this.emit('entries', this.cachedEntries);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
this.pollActive = false;
|
||
|
}
|
||
|
|
||
|
stopPolling () {
|
||
|
this.poll = false;
|
||
|
}
|
||
|
}
|