aboutsummaryrefslogtreecommitdiff
path: root/src/background/completion/impl/HistoryRepositoryImpl.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/background/completion/impl/HistoryRepositoryImpl.ts')
-rw-r--r--src/background/completion/impl/HistoryRepositoryImpl.ts51
1 files changed, 39 insertions, 12 deletions
diff --git a/src/background/completion/impl/HistoryRepositoryImpl.ts b/src/background/completion/impl/HistoryRepositoryImpl.ts
index 42691aa..cd55cd0 100644
--- a/src/background/completion/impl/HistoryRepositoryImpl.ts
+++ b/src/background/completion/impl/HistoryRepositoryImpl.ts
@@ -1,12 +1,39 @@
-import { injectable } from "tsyringe";
import * as filters from "./filters";
import HistoryRepository, {HistoryItem} from "../HistoryRepository";
+import PrefetchAndCache from "./PrefetchAndCache";
const COMPLETION_ITEM_LIMIT = 10;
-@injectable()
-export default class HistoryRepositoryImpl implements HistoryRepository {
+export default class CachedHistoryRepository implements HistoryRepository {
+ private historyCache: PrefetchAndCache<browser.history.HistoryItem>;
+
+ constructor() {
+ this.historyCache = new PrefetchAndCache(this.getter, this.filter, 10)
+ }
+
async queryHistories(keywords: string): Promise<HistoryItem[]> {
+ const items = await this.historyCache.get(keywords);
+
+ const filterOrKeep = <T>(source: T[], filter: (items: T[]) => T[], min: number): T[] => {
+ const filtered = filter(source);
+ if (filtered.length < min) {
+ return source;
+ }
+ return filtered;
+ };
+
+ return [items]
+ .map(items => filterOrKeep(items, filters.filterByPathname, COMPLETION_ITEM_LIMIT))
+ .map(items => filterOrKeep(items, filters.filterByOrigin, COMPLETION_ITEM_LIMIT))[0]
+ .sort((x, y) => Number(y.visitCount) - Number(x.visitCount))
+ .slice(0, COMPLETION_ITEM_LIMIT)
+ .map(item => ({
+ title: item.title!!,
+ url: item.url!!,
+ }));
+ }
+
+ private async getter (keywords: string): Promise<browser.history.HistoryItem[]> {
const items = await browser.history.search({
text: keywords,
startTime: 0,
@@ -15,14 +42,14 @@ export default class HistoryRepositoryImpl implements HistoryRepository {
return [items]
.map(filters.filterBlankTitle)
.map(filters.filterHttp)
- .map(filters.filterByTailingSlash)
- .map(pages => filters.filterByPathname(pages, COMPLETION_ITEM_LIMIT))
- .map(pages => filters.filterByOrigin(pages, COMPLETION_ITEM_LIMIT))[0]
- .sort((x, y) => Number(y.visitCount) - Number(x.visitCount))
- .slice(0, COMPLETION_ITEM_LIMIT)
- .map(item => ({
- title: item.title!!,
- url: item.url!!,
- }))
+ .map(filters.filterByTailingSlash)[0]
}
+
+ private filter(items: browser.history.HistoryItem[], query: string) {
+ return items.filter(item => {
+ return query.split(' ').every(keyword => {
+ return item.title!!.toLowerCase().includes(keyword.toLowerCase()) || item.url!!.includes(keyword)
+ });
+ })
+ };
}