From 3d236837e13d8cfdcd44a1570bdc9659f48e7f47 Mon Sep 17 00:00:00 2001 From: Ali Mihandoost Date: Sat, 28 Jan 2023 18:50:24 +0330 Subject: [PATCH] feat(signal): command handler/provider interface --- .vscode/settings.json | 3 ++- core/signal/src/command-handler.ts | 24 ++++++++++++++++++++++++ core/signal/src/signal-manager.ts | 16 +++++++++++----- 3 files changed, 37 insertions(+), 6 deletions(-) create mode 100644 core/signal/src/command-handler.ts diff --git a/.vscode/settings.json b/.vscode/settings.json index 113ab01e2..b9bb45697 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -24,7 +24,7 @@ "cssprop", "currentcolor", "esbuild", - "Kubernetes", + "kubernetes", "mastmalize", "metafile", "mihandoost", @@ -35,6 +35,7 @@ "outdir", "preconnect", "preload", + "requestable", "roundot", "Stringifyable", "Superfast", diff --git a/core/signal/src/command-handler.ts b/core/signal/src/command-handler.ts new file mode 100644 index 000000000..cd32caad4 --- /dev/null +++ b/core/signal/src/command-handler.ts @@ -0,0 +1,24 @@ +import {signalManager} from './signal-manager.js'; + +/** + * Command handler/provider interface. + */ +export const commandHandler = { + /** + * Defines the command and dispatch returned value. + * + * Subscribe commandFunction to request-command-signal and dispatch callback-signal with commandFunction return value. + * + * Example: + * + * ```ts + * commandHandler.define( + * 'show-prompt', + * async (argumentObject) => { + * return await showPrompt(argumentObject); + * }, + * ); + * ``` + */ + define: signalManager.defineCommand, +} as const; diff --git a/core/signal/src/signal-manager.ts b/core/signal/src/signal-manager.ts index 5f64482ae..30512dcd5 100644 --- a/core/signal/src/signal-manager.ts +++ b/core/signal/src/signal-manager.ts @@ -322,22 +322,28 @@ export const signalManager = { }, /** - * Defines the provider of the signal that will be called when the signal requested. - * Subscribe to `request-signalId`. + * Defines the command and dispatch returned value. + * + * Subscribe commandFunction to request-command-signal and dispatch callback-signal with commandFunction return value. * * Example: * * ```ts - * signalManager.setProvider('content-change', async (requestParam) => await fetchNewContent(requestParam)); + * signalManager.defineCommand( + * 'show-prompt', + * async (argumentObject) => { + * return await showPrompt(argumentObject); + * }, + * ); * ``` */ - setCommandProvider: ( + defineCommand: , TReturn extends Stringifyable>( signalId: string, signalProvider: ProviderFunction, options: Partial> = {}, ): void => { options.debounce ??= 'AnimationFrame'; - signalManager._logger.logMethodArgs('setCommandProvider', {commandId: signalId, options}); + signalManager._logger.logMethodArgs('defineCommand', {commandId: signalId, options}); const requestSignalId = 'request-' + signalId; signalManager.removeAllListeners(requestSignalId); signalManager.subscribe(