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.

167 lines
3.4 KiB

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;
}
}