From f0aad35f30e39b64541a38e7611a4d9ebb396c5e Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Wed, 12 Oct 2022 12:01:50 -0400 Subject: [PATCH] Refactor listening of different channel kinds Signed-off-by: Sebastian Malton --- ...stening-on-message-channels.injectable.ts} | 14 ++++----- src/common/utils/disposer.ts | 6 ++-- src/common/utils/iter.ts | 9 ------ ...stening-on-request-channels.injectable.ts} | 28 +++++++++--------- .../start-listening-of-channels.injectable.ts | 29 ------------------- .../start-listening-on-channels.injectable.ts | 29 +++++++++++++++++++ .../start-listening-of-channels.injectable.ts | 4 +-- 7 files changed, 54 insertions(+), 65 deletions(-) rename src/common/utils/channel/{listening-of-channels.injectable.ts => listening-on-message-channels.injectable.ts} (67%) rename src/main/utils/channel/channel-listeners/{handling-of-channels.injectable.ts => listening-on-request-channels.injectable.ts} (53%) delete mode 100644 src/main/utils/channel/channel-listeners/start-listening-of-channels.injectable.ts create mode 100644 src/main/utils/channel/channel-listeners/start-listening-on-channels.injectable.ts diff --git a/src/common/utils/channel/listening-of-channels.injectable.ts b/src/common/utils/channel/listening-on-message-channels.injectable.ts similarity index 67% rename from src/common/utils/channel/listening-of-channels.injectable.ts rename to src/common/utils/channel/listening-on-message-channels.injectable.ts index 6ee7d7aaf7..afe0c08f24 100644 --- a/src/common/utils/channel/listening-of-channels.injectable.ts +++ b/src/common/utils/channel/listening-on-message-channels.injectable.ts @@ -8,20 +8,18 @@ import { disposer } from "../index"; import { messageChannelListenerInjectionToken } from "./message-channel-listener-injection-token"; import { enlistMessageChannelListenerInjectionToken } from "./enlist-message-channel-listener-injection-token"; -const listeningOfChannelsInjectable = getInjectable({ - id: "listening-of-channels", +const listeningOnMessageChannelsInjectable = getInjectable({ + id: "listening-on-message-channels", instantiate: (di) => { const enlistMessageChannelListener = di.inject(enlistMessageChannelListenerInjectionToken); const messageChannelListeners = di.injectMany(messageChannelListenerInjectionToken); - return getStartableStoppable("listening-of-channels", () => { - const messageChannelDisposers = messageChannelListeners.map(enlistMessageChannelListener); - - return disposer(...messageChannelDisposers); - }); + return getStartableStoppable("listening-on-channels", () => ( + disposer(messageChannelListeners.map(enlistMessageChannelListener)) + )); }, }); -export default listeningOfChannelsInjectable; +export default listeningOnMessageChannelsInjectable; diff --git a/src/common/utils/disposer.ts b/src/common/utils/disposer.ts index 05a349ab4d..2949a7ae35 100644 --- a/src/common/utils/disposer.ts +++ b/src/common/utils/disposer.ts @@ -3,6 +3,8 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ +import type { SingleOrMany } from "./types"; + export interface Disposer { @@ -17,9 +19,9 @@ export interface ExtendableDisposer extends Disposer { push(...vals: (Disposer | ExtendableDisposer | Disposable)[]): void; } -export function disposer(...items: (Disposer | Disposable | undefined | null)[]): ExtendableDisposer { +export function disposer(...items: SingleOrMany[]): ExtendableDisposer { return Object.assign(() => { - for (const item of items) { + for (const item of items.flat()) { if (!item) { continue; } diff --git a/src/common/utils/iter.ts b/src/common/utils/iter.ts index a2fc7fbd21..9752e56dc5 100644 --- a/src/common/utils/iter.ts +++ b/src/common/utils/iter.ts @@ -11,7 +11,6 @@ interface Iterator { find(fn: (val: T) => unknown): T | undefined; collect(fn: (values: Iterable) => U): U; map(fn: (val: T) => U): Iterator; - tap(fn: (val: T) => void): Iterator; flatMap(fn: (val: T) => U[]): Iterator; join(sep?: string): string; } @@ -22,7 +21,6 @@ export function pipeline(src: IterableIterator): Iterator { filterMap: (fn) => pipeline(filterMap(src, fn)), map: (fn) => pipeline(map(src, fn)), flatMap: (fn) => pipeline(flatMap(src, fn)), - tap: (fn) => pipeline(tap(src, fn)), find: (fn) => find(src, fn), join: (sep) => join(src, sep), collect: (fn) => fn(src), @@ -35,13 +33,6 @@ export function pipeline(src: IterableIterator): Iterator { */ export function* newEmpty(): IterableIterator {} -export function* tap(src: Iterable, fn: (val: T) => void): IterableIterator { - for (const val of src) { - fn(val); - yield val; - } -} - /** * Creates a new `Iterable` that yields at most n items from src. * Does not modify `src` which can be used later. diff --git a/src/main/utils/channel/channel-listeners/handling-of-channels.injectable.ts b/src/main/utils/channel/channel-listeners/listening-on-request-channels.injectable.ts similarity index 53% rename from src/main/utils/channel/channel-listeners/handling-of-channels.injectable.ts rename to src/main/utils/channel/channel-listeners/listening-on-request-channels.injectable.ts index 40ac50882c..80b94fbe0e 100644 --- a/src/main/utils/channel/channel-listeners/handling-of-channels.injectable.ts +++ b/src/main/utils/channel/channel-listeners/listening-on-request-channels.injectable.ts @@ -3,34 +3,32 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable } from "@ogre-tools/injectable"; -import { disposer, iter } from "../../../../common/utils"; +import { disposer } from "../../../../common/utils"; import type { RequestChannel } from "../../../../common/utils/channel/request-channel-listener-injection-token"; import { getStartableStoppable } from "../../../../common/utils/get-startable-stoppable"; import enlistRequestChannelListenerInjectable from "./enlist-request-channel-listener.injectable"; import { requestChannelListenerInjectionToken } from "./listener-tokens"; -const listenerOfRequestChannelsInjectable = getInjectable({ - id: "listener-of-request-channels", +const listeningOnRequestChannelsInjectable = getInjectable({ + id: "listening-on-request-channels", instantiate: (di) => { const enlistRequestChannelListener = di.inject(enlistRequestChannelListenerInjectable); const requestChannelListeners = di.injectMany(requestChannelListenerInjectionToken); - return getStartableStoppable("listening-of-request-channels", () => { + return getStartableStoppable("listening-on-request-channels", () => { const seenChannels = new Set>(); - const requestChannelDisposers = iter.pipeline(requestChannelListeners.values()) - .tap(listener => { - if (seenChannels.has(listener.channel)) { - throw new Error(`Trying to register a multiple channel handlers for "${listener.channel.id}", which is an error`); - } - seenChannels.add(listener.channel); - }) - .map(enlistRequestChannelListener) - .collect(v => Array.from(v)); + for (const listener of requestChannelListeners) { + if (seenChannels.has(listener.channel)) { + throw new Error(`Tried to register a multiple channel handlers for "${listener.channel.id}", only one handler is supported for a request channel.`); + } - return disposer(...requestChannelDisposers); + seenChannels.add(listener.channel); + } + + return disposer(requestChannelListeners.map(enlistRequestChannelListener)); }); }, }); -export default listenerOfRequestChannelsInjectable; +export default listeningOnRequestChannelsInjectable; diff --git a/src/main/utils/channel/channel-listeners/start-listening-of-channels.injectable.ts b/src/main/utils/channel/channel-listeners/start-listening-of-channels.injectable.ts deleted file mode 100644 index ebb8afe385..0000000000 --- a/src/main/utils/channel/channel-listeners/start-listening-of-channels.injectable.ts +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { onLoadOfApplicationInjectionToken } from "../../../start-main-application/runnable-tokens/on-load-of-application-injection-token"; -import listeningOfChannelsInjectable from "../../../../common/utils/channel/listening-of-channels.injectable"; -import listenerOfRequestChannelsInjectable from "./handling-of-channels.injectable"; - -const startListeningOfChannelsInjectable = getInjectable({ - id: "start-listening-of-channels-main", - - instantiate: (di) => { - const listeningOfChannels = di.inject(listeningOfChannelsInjectable); - const listenerOfRequestChannels = di.inject(listenerOfRequestChannelsInjectable); - - return { - id: "start-listening-of-channels-main", - run: async () => { - await listeningOfChannels.start(); - await listenerOfRequestChannels.start(); - }, - }; - }, - - injectionToken: onLoadOfApplicationInjectionToken, -}); - -export default startListeningOfChannelsInjectable; diff --git a/src/main/utils/channel/channel-listeners/start-listening-on-channels.injectable.ts b/src/main/utils/channel/channel-listeners/start-listening-on-channels.injectable.ts new file mode 100644 index 0000000000..d1cf5d68d6 --- /dev/null +++ b/src/main/utils/channel/channel-listeners/start-listening-on-channels.injectable.ts @@ -0,0 +1,29 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import { onLoadOfApplicationInjectionToken } from "../../../start-main-application/runnable-tokens/on-load-of-application-injection-token"; +import listeningOnMessageChannelsInjectable from "../../../../common/utils/channel/listening-on-message-channels.injectable"; +import listeningOnRequestChannelsInjectable from "./listening-on-request-channels.injectable"; + +const startListeningOnChannelsInjectable = getInjectable({ + id: "start-listening-on-channels-main", + + instantiate: (di) => { + const listeningOnMessageChannels = di.inject(listeningOnMessageChannelsInjectable); + const listeningOnRequestChannels = di.inject(listeningOnRequestChannelsInjectable); + + return { + id: "start-listening-on-channels-main", + run: async () => { + await listeningOnMessageChannels.start(); + await listeningOnRequestChannels.start(); + }, + }; + }, + + injectionToken: onLoadOfApplicationInjectionToken, +}); + +export default startListeningOnChannelsInjectable; diff --git a/src/renderer/utils/channel/channel-listeners/start-listening-of-channels.injectable.ts b/src/renderer/utils/channel/channel-listeners/start-listening-of-channels.injectable.ts index e423299915..3b10ef6bd9 100644 --- a/src/renderer/utils/channel/channel-listeners/start-listening-of-channels.injectable.ts +++ b/src/renderer/utils/channel/channel-listeners/start-listening-of-channels.injectable.ts @@ -4,13 +4,13 @@ */ import { getInjectable } from "@ogre-tools/injectable"; import { beforeFrameStartsInjectionToken } from "../../../before-frame-starts/before-frame-starts-injection-token"; -import listeningOfChannelsInjectable from "../../../../common/utils/channel/listening-of-channels.injectable"; +import listeningOnMessageChannelsInjectable from "../../../../common/utils/channel/listening-on-message-channels.injectable"; const startListeningOfChannelsInjectable = getInjectable({ id: "start-listening-of-channels-renderer", instantiate: (di) => { - const listeningOfChannels = di.inject(listeningOfChannelsInjectable); + const listeningOfChannels = di.inject(listeningOnMessageChannelsInjectable); return { id: "start-listening-of-channels-renderer",