Skip to content

Commit

Permalink
feat(signal): command handler/provider interface
Browse files Browse the repository at this point in the history
  • Loading branch information
AliMD committed Jan 28, 2023
1 parent bf6845f commit 3d23683
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 6 deletions.
3 changes: 2 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
"cssprop",
"currentcolor",
"esbuild",
"Kubernetes",
"kubernetes",
"mastmalize",
"metafile",
"mihandoost",
Expand All @@ -35,6 +35,7 @@
"outdir",
"preconnect",
"preload",
"requestable",
"roundot",
"Stringifyable",
"Superfast",
Expand Down
24 changes: 24 additions & 0 deletions core/signal/src/command-handler.ts
Original file line number Diff line number Diff line change
@@ -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<TArgument, TReturn>(
* 'show-prompt',
* async (argumentObject) => {
* return await showPrompt(argumentObject);
* },
* );
* ```
*/
define: signalManager.defineCommand,
} as const;
16 changes: 11 additions & 5 deletions core/signal/src/signal-manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<TArgument, TReturn>(
* 'show-prompt',
* async (argumentObject) => {
* return await showPrompt(argumentObject);
* },
* );
* ```
*/
setCommandProvider: <TArgument extends Stringifyable, TReturn extends Stringifyable>(
defineCommand: <TArgument extends Record<string, Stringifyable>, TReturn extends Stringifyable>(
signalId: string,
signalProvider: ProviderFunction<TArgument & {_callbackSignalId: string}, TReturn>,
options: Partial<Pick<ProviderOptions, 'debounce'>> = {},
): 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<TArgument & {_callbackSignalId: string}>(
Expand Down

0 comments on commit 3d23683

Please sign in to comment.