blob: 887654244ef621250fd6f84dcf79ca8820a80a7f [file] [log] [blame]
/*
* Implement the data source which handles parsing the stream, searching, filtering
* and sorting of the vLog items.
* @fileoverview
*/
import { parse } from './parser';
import { vLogSort } from './sorter';
import { vLogSearch } from './searcher';
import { vLogFilter } from './filterer';
export class vLogDataSource {
constructor(stream, onNewItem, onError) {
/*
* all logs, unlimited buffer for now.
* @private
*/
this.allLogItems = [];
/*
* Raw stream of log data
* @private
*/
this.stream = stream;
stream.on('data', (line) => {
if (line.trim() === '') {
return;
}
var logItem = null;
// try to parse and display as much as we can.
try {
logItem = parse(line);
} catch (e) {
if (onError) {
onError(e);
}
}
if (logItem) {
this.allLogItems.push(logItem);
if (onNewItem) {
onNewItem(logItem);
}
}
});
}
/*
* Implements the fetch method expected by the grid components.
* handles parsing the stream, searching, filtering and sorting of the data.
* search, sort and filters are provided by the grid control whenever they are
* changed by the user.
* DataSource is called automatically by the grid when user interacts with the component
* Grid does some batching of user actions and only calls fetch when needed.
* keys provided for sort and filters correspond to keys set in the markup
* when constructing the grid.
* @param {object} search search{key<string>} current search keyword
* @param {object} sort sort{key<string>, ascending<bool>} current sort key and direction
* @param {map} filters map{key<string>, values<Array>} Map of filter keys to currently selected filter values
* @return {Array<object>} Returns an array of filtered sorted results of the items.
*/
fetch(search, sort, filters) {
var filteredSortedItems = this.allLogItems.
filter((item) => {
return vLogFilter(item, filters);
}).
filter((item) => {
return vLogSearch(item, search.keyword);
}).
sort((item1, item2) => {
return vLogSort(item1, item2, sort.key, sort.ascending);
});
// pause or resume the stream when auto-refresh filter changes
if (filters['autorefresh'] && this.stream.paused) {
this.stream.resume();
}
if (!filters['autorefresh'] && !this.stream.paused) {
this.stream.pause();
}
return filteredSortedItems;
}
}