From 9dd129d90b87f24ad20f084c44d48be50d750c94 Mon Sep 17 00:00:00 2001 From: Roman Hotsiy Date: Mon, 25 May 2020 16:36:09 +0300 Subject: [PATCH] fix: proper search-index dispose --- src/services/SearchStore.ts | 1 + src/services/SearchWorker.worker.ts | 38 +++++++++++++++++++---------- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/services/SearchStore.ts b/src/services/SearchStore.ts index d096debe..88cd9d31 100644 --- a/src/services/SearchStore.ts +++ b/src/services/SearchStore.ts @@ -42,6 +42,7 @@ export class SearchStore { dispose() { (this.searchWorker as any).terminate(); + (this.searchWorker as any).dispose(); } search(q: string) { diff --git a/src/services/SearchWorker.worker.ts b/src/services/SearchWorker.worker.ts index 3bd41576..c9433d51 100644 --- a/src/services/SearchWorker.worker.ts +++ b/src/services/SearchWorker.worker.ts @@ -14,6 +14,7 @@ export default class Worker { search: typeof search = search; toJS = toJS; load = load; + dispose = dispose; } export interface SearchDocument { @@ -29,22 +30,28 @@ export interface SearchResult { let store: any[] = []; -let resolveIndex: (v: lunr.Index) => void = () => { - throw new Error('Should not be called'); -}; - -const index: Promise = new Promise(resolve => { - resolveIndex = resolve; -}); - lunr.tokenizer.separator = /\s+/; -const builder = new lunr.Builder(); -builder.field('title'); -builder.field('description'); -builder.ref('ref'); +let builder: lunr.Builder; -builder.pipeline.add(lunr.trimmer, lunr.stopWordFilter, lunr.stemmer); +let resolveIndex: (v: lunr.Index) => void; + +let index: Promise; + +function initEmpty() { + builder = new lunr.Builder(); + builder.field('title'); + builder.field('description'); + builder.ref('ref'); + + builder.pipeline.add(lunr.trimmer, lunr.stopWordFilter, lunr.stemmer); + + index = new Promise(resolve => { + resolveIndex = resolve; + }); +} + +initEmpty(); const expandTerm = term => '*' + lunr.stemmer(new lunr.Token(term, {})) + '*'; @@ -70,6 +77,11 @@ export async function load(state: any) { resolveIndex(lunr.Index.load(state.index)); } +export async function dispose() { + store = []; + initEmpty(); +} + export async function search( q: string, limit = 0,