diff --git a/src/assets/javascripts/ui/document/index.ts b/src/assets/javascripts/agent/document/index.ts similarity index 100% rename from src/assets/javascripts/ui/document/index.ts rename to src/assets/javascripts/agent/document/index.ts diff --git a/src/assets/javascripts/agent/element/index.ts b/src/assets/javascripts/agent/element/index.ts new file mode 100644 index 000000000..2b549dfb1 --- /dev/null +++ b/src/assets/javascripts/agent/element/index.ts @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2016-2019 Martin Donath + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +/* ---------------------------------------------------------------------------- + * Functions + * ------------------------------------------------------------------------- */ + +/** + * Retrieve an element matching the query selector + * + * @template T - Element type + * + * @param selector - Query selector + * @param node - Node of reference + * + * @return Element + */ +export function getElement( + selector: string, node: ParentNode = document +): T | undefined { + return node.querySelector(selector) || undefined +} + +/** + * Retrieve all elements matching the query selector + * + * @template T - Element type + * + * @param selector - Query selector + * @param node - Node of reference + * + * @return Elements + */ +export function getElements( + selector: string, node: ParentNode = document +): T[] { + return Array.from(node.querySelectorAll(selector)) +} diff --git a/src/assets/javascripts/ui/index.ts b/src/assets/javascripts/agent/index.ts similarity index 96% rename from src/assets/javascripts/ui/index.ts rename to src/assets/javascripts/agent/index.ts index 7ad3ab452..798e51472 100644 --- a/src/assets/javascripts/ui/index.ts +++ b/src/assets/javascripts/agent/index.ts @@ -21,6 +21,8 @@ */ export * from "./document" +export * from "./element" export * from "./location" export * from "./media" export * from "./viewport" +export * from "./worker" diff --git a/src/assets/javascripts/ui/location/index.ts b/src/assets/javascripts/agent/location/index.ts similarity index 100% rename from src/assets/javascripts/ui/location/index.ts rename to src/assets/javascripts/agent/location/index.ts diff --git a/src/assets/javascripts/ui/media/index.ts b/src/assets/javascripts/agent/media/index.ts similarity index 100% rename from src/assets/javascripts/ui/media/index.ts rename to src/assets/javascripts/agent/media/index.ts diff --git a/src/assets/javascripts/ui/viewport/index.ts b/src/assets/javascripts/agent/viewport/index.ts similarity index 100% rename from src/assets/javascripts/ui/viewport/index.ts rename to src/assets/javascripts/agent/viewport/index.ts diff --git a/src/assets/javascripts/ui/worker/index.ts b/src/assets/javascripts/agent/worker/index.ts similarity index 90% rename from src/assets/javascripts/ui/worker/index.ts rename to src/assets/javascripts/agent/worker/index.ts index 2df48f648..739c4550d 100644 --- a/src/assets/javascripts/ui/worker/index.ts +++ b/src/assets/javascripts/agent/worker/index.ts @@ -21,14 +21,7 @@ */ import { Observable, fromEvent } from "rxjs" -import { - pluck, - shareReplay, - switchMap, - take, - tap, - throttle -} from "rxjs/operators" +import { pluck, share, switchMapTo, tap, throttle } from "rxjs/operators" /* ---------------------------------------------------------------------------- * Types @@ -75,22 +68,19 @@ export function watchWorker( worker: Worker, { message$ }: Options ): Observable { - /* Receive messages from web worker */ + /* Observable for messages from web worker */ const worker$ = fromEvent(worker, "message") .pipe( - pluck("data") + pluck("data"), + share() ) - /* Send request and wait for response */ + /* Send and receive messages, return hot observable */ return message$ .pipe( throttle(() => worker$, { leading: true, trailing: true }), tap(message => worker.postMessage(message)), - switchMap(() => worker$ - .pipe( - take(1) - ) - ), - shareReplay(1) + switchMapTo(worker$), + share() ) }