Added support for graceful recovery of failing search initialization on file:// protocol

This commit is contained in:
squidfunk
2020-04-26 19:20:51 +02:00
parent 6cf14bed10
commit dac469eace
6 changed files with 59 additions and 48 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
{ {
"assets/javascripts/bundle.js": "assets/javascripts/bundle.c51f1a8c.min.js", "assets/javascripts/bundle.js": "assets/javascripts/bundle.f593c2a5.min.js",
"assets/javascripts/bundle.js.map": "assets/javascripts/bundle.c51f1a8c.min.js.map", "assets/javascripts/bundle.js.map": "assets/javascripts/bundle.f593c2a5.min.js.map",
"assets/javascripts/vendor.js": "assets/javascripts/vendor.ff4ef43d.min.js", "assets/javascripts/vendor.js": "assets/javascripts/vendor.ff4ef43d.min.js",
"assets/javascripts/vendor.js.map": "assets/javascripts/vendor.ff4ef43d.min.js.map", "assets/javascripts/vendor.js.map": "assets/javascripts/vendor.ff4ef43d.min.js.map",
"assets/javascripts/worker/search.js": "assets/javascripts/worker/search.58d22e8e.min.js", "assets/javascripts/worker/search.js": "assets/javascripts/worker/search.58d22e8e.min.js",

View File

@@ -179,7 +179,7 @@
</div> </div>
{% block scripts %} {% block scripts %}
<script src="{{ 'assets/javascripts/vendor.ff4ef43d.min.js' | url }}"></script> <script src="{{ 'assets/javascripts/vendor.ff4ef43d.min.js' | url }}"></script>
<script src="{{ 'assets/javascripts/bundle.c51f1a8c.min.js' | url }}"></script> <script src="{{ 'assets/javascripts/bundle.f593c2a5.min.js' | url }}"></script>
{%- set translations = {} -%} {%- set translations = {} -%}
{%- for key in [ {%- for key in [
"clipboard.copy", "clipboard.copy",

View File

@@ -30,7 +30,10 @@ import {
combineLatest, combineLatest,
animationFrameScheduler, animationFrameScheduler,
fromEvent, fromEvent,
from from,
defer,
of,
NEVER
} from "rxjs" } from "rxjs"
import { ajax } from "rxjs/ajax" import { ajax } from "rxjs/ajax"
import { import {
@@ -42,7 +45,8 @@ import {
observeOn, observeOn,
take, take,
shareReplay, shareReplay,
pluck pluck,
catchError
} from "rxjs/operators" } from "rxjs/operators"
import { import {
@@ -228,60 +232,67 @@ export function initialize(config: unknown) {
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */
// External index /* Search worker */
const index = config.search && config.search.index const worker$ = defer(() => {
? config.search.index const index = config.search && config.search.index
: undefined ? config.search.index
: undefined
/* Fetch index if it wasn't passed explicitly */ /* Fetch index if it wasn't passed explicitly */
const index$ = typeof index !== "undefined" const index$ = typeof index !== "undefined"
? from(index) ? from(index)
: base$ : base$
.pipe( .pipe(
switchMap(base => ajax({ switchMap(base => ajax({
url: `${base}/search/search_index.json`, url: `${base}/search/search_index.json`,
responseType: "json", responseType: "json",
withCredentials: true withCredentials: true
}) })
.pipe<SearchIndex>( .pipe<SearchIndex>(
pluck("response") pluck("response")
)
) )
) )
)
const worker = setupSearchWorker(config.search.worker, { return of(setupSearchWorker(config.search.worker, {
base$, index$ base$, index$
}))
}) })
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */
/* Mount search query */ /* Mount search query */
const query$ = useComponent("search-query") const search$ = worker$
.pipe( .pipe(
mountSearchQuery(worker, { transform: config.search.transform }), switchMap(worker => {
shareReplay(1)
)
/* Mount search reset */ const query$ = useComponent("search-query")
const reset$ = useComponent("search-reset") .pipe(
.pipe( mountSearchQuery(worker, { transform: config.search.transform }),
mountSearchReset(), shareReplay(1)
shareReplay(1) )
)
/* Mount search result */ /* Mount search reset */
const result$ = useComponent("search-result") const reset$ = useComponent("search-reset")
.pipe( .pipe(
mountSearchResult(worker, { query$ }), mountSearchReset(),
shareReplay(1) shareReplay(1)
) )
/* ----------------------------------------------------------------------- */ /* Mount search result */
const result$ = useComponent("search-result")
.pipe(
mountSearchResult(worker, { query$ }),
shareReplay(1)
)
const search$ = useComponent("search") return useComponent("search")
.pipe( .pipe(
mountSearch(worker, { query$, reset$, result$ }), mountSearch(worker, { query$, reset$, result$ }),
shareReplay(1) shareReplay(1)
)
}),
catchError(() => NEVER)
) )
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */