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