From 4591471e7e75fbb79fc05417d092b90120e1a11d Mon Sep 17 00:00:00 2001 From: Jacob Nguyen <76754747+jacoobes@users.noreply.github.com> Date: Sat, 9 Sep 2023 11:32:11 -0500 Subject: [PATCH] update onError to be record --- src/core/contracts/module-manager.ts | 6 +++--- src/core/contracts/module-store.ts | 2 +- src/core/module-loading.ts | 2 +- src/core/structures/module-store.ts | 2 +- src/core/structures/services/module-manager.ts | 5 +++-- src/handlers/dispatchers.ts | 10 +++++----- src/handlers/event-utils.ts | 12 ++++++++---- src/handlers/ready-event.ts | 2 +- src/handlers/user-defined-events.ts | 15 +++++++-------- src/types/core.ts | 2 +- 10 files changed, 31 insertions(+), 27 deletions(-) diff --git a/src/core/contracts/module-manager.ts b/src/core/contracts/module-manager.ts index 1175cf6..d009554 100644 --- a/src/core/contracts/module-manager.ts +++ b/src/core/contracts/module-manager.ts @@ -12,12 +12,12 @@ interface MetadataAccess { } interface OnErrorAccess { - getErrorCallback(m: Module): Function|undefined; - setErrorCallback(m: Module, c: Function): void; + getErrorCallback(m: Module): Record|undefined; + setErrorCallback(m: Module, c: Record): void; } /** * @since 2.0.0 - * @deprecated - direct access to the module manager will be removed in version 4 + * @internal - direct access to the module manager will be removed in version 4 */ export interface ModuleManager extends MetadataAccess, OnErrorAccess { get(id: string): string | undefined; diff --git a/src/core/contracts/module-store.ts b/src/core/contracts/module-store.ts index d431e9f..0e6015d 100644 --- a/src/core/contracts/module-store.ts +++ b/src/core/contracts/module-store.ts @@ -6,5 +6,5 @@ import type { CommandMeta, Module } from '../../types/core-modules'; export interface CoreModuleStore { commands: Map; metadata: WeakMap; - onError: WeakMap; + onError: WeakMap>; } diff --git a/src/core/module-loading.ts b/src/core/module-loading.ts index 5402427..fe39b98 100644 --- a/src/core/module-loading.ts +++ b/src/core/module-loading.ts @@ -37,7 +37,7 @@ export async function importModule(absPath: string) { .unwrapOr({ module: commandModule, onError }) as T; } interface FileExtras { - onError : Function + onError : Record|undefined } export async function defaultModuleLoader(absPath: string): ModuleResult { diff --git a/src/core/structures/module-store.ts b/src/core/structures/module-store.ts index e83b551..4e00bd3 100644 --- a/src/core/structures/module-store.ts +++ b/src/core/structures/module-store.ts @@ -7,7 +7,7 @@ import { CoreModuleStore } from '../contracts'; * For interacting with modules, use the ModuleManager instead. */ export class ModuleStore implements CoreModuleStore { - onError = new WeakMap(); + onError = new WeakMap>(); metadata = new WeakMap(); commands = new Map(); } diff --git a/src/core/structures/services/module-manager.ts b/src/core/structures/services/module-manager.ts index 588531b..96a7f71 100644 --- a/src/core/structures/services/module-manager.ts +++ b/src/core/structures/services/module-manager.ts @@ -11,10 +11,11 @@ import { CommandType } from '../enums'; export class DefaultModuleManager implements ModuleManager { constructor(private moduleStore: CoreModuleStore) {} - getErrorCallback(m: Module): Function | undefined { + + getErrorCallback(m: Module): Record | undefined { return this.moduleStore.onError.get(m); } - setErrorCallback(m: Module, c: Function): void { + setErrorCallback(m: Module, c: Record): void { this.moduleStore.onError.set(m, c); } diff --git a/src/handlers/dispatchers.ts b/src/handlers/dispatchers.ts index 432a732..4252c55 100644 --- a/src/handlers/dispatchers.ts +++ b/src/handlers/dispatchers.ts @@ -12,7 +12,7 @@ import { createResultResolver } from './event-utils'; import { BaseInteraction, Message } from 'discord.js'; import { CommandType, Context } from '../core'; import type { Args } from '../types/utility'; -import type { BothCommand, CommandModule, Module, Processed } from '../types/core-modules'; +import type { CommandModule, Module, Processed } from '../types/core-modules'; //TODO: refactor dispatchers so that it implements a strategy for each different type of payload? export function dispatchMessage(module: Processed, args: [Context, Args]) { @@ -32,7 +32,7 @@ function interactionArg(interaction: T) { return [interaction] as [T]; } -function intoPayload(module: Processed, onError: Function|undefined) { +function intoPayload(module: Processed, onError: Record|undefined) { return pipe( arrayifySource, map(args => ({ module, args, onError })), @@ -41,7 +41,7 @@ function intoPayload(module: Processed, onError: Function|undefined) { const createResult = createResultResolver< Processed, - { module: Processed; args: unknown[], onError: Function|undefined }, + { module: Processed; args: unknown[], onError: Record|undefined }, unknown[] >({ createStream: ({ module, args }) => from(module.onEvent).pipe(callPlugin(args)), @@ -52,7 +52,7 @@ const createResult = createResultResolver< * @param module * @param source */ -export function eventDispatcher(module: Processed, onError: Function|undefined, source: unknown) { +export function eventDispatcher(module: Processed, onError: Record|undefined, source: unknown) { assert.ok(source instanceof EventEmitter, `${source} is not an EventEmitter`); const execute: OperatorFunction = concatMap(async args => @@ -68,7 +68,7 @@ export function eventDispatcher(module: Processed, onError: Function|und export function createDispatcher(payload: { module: Processed; event: BaseInteraction; - onError: Function + onError: Record|undefined }) { assert.ok( CommandType.Text !== payload.module.type, diff --git a/src/handlers/event-utils.ts b/src/handlers/event-utils.ts index d5a240c..d742b63 100644 --- a/src/handlers/event-utils.ts +++ b/src/handlers/event-utils.ts @@ -78,7 +78,11 @@ export function createInteractionHandler( return Files .defaultModuleLoader>(fullPath) .then(payload => - Ok(createDispatcher({ module: payload.module, event, onError: payload.onError }))); + Ok(createDispatcher({ + module: payload.module, + onError: payload.onError, + event, + }))); }, ); } @@ -99,7 +103,7 @@ export function createMessageHandler( .defaultModuleLoader>(fullPath) .then(payload => { const args = contextArgs(event, rest); - return Ok(dispatchMessage(payload.module, args)); + return Ok({ args, ...payload }); }); }); } @@ -171,7 +175,7 @@ export function executeModule( */ export function createResultResolver< T extends { execute: (...args: any[]) => any; onEvent: ControlPlugin[] }, - Args extends { module: T; onError: Function|undefined, [key: string]: unknown }, + Args extends { module: T; onError: Record|undefined, [key: string]: unknown }, Output, >(config: { onStop?: (module: T) => unknown; @@ -221,7 +225,7 @@ export function makeModuleExecutor< Args extends { module: M; args: unknown[]; - onError: Function|undefined + onError: Record|undefined }, >(onStop: (m: M) => unknown) { const onNext = ({ args, module, onError }: Args) => ({ diff --git a/src/handlers/ready-event.ts b/src/handlers/ready-event.ts index 3f2fe24..4cce6a4 100644 --- a/src/handlers/ready-event.ts +++ b/src/handlers/ready-event.ts @@ -30,7 +30,7 @@ const once = () => pipe( ignoreElements() ) -const registerOnError = (manager: ModuleManager, module: Processed, onError: Function|undefined) => { +const registerOnError = (manager: ModuleManager, module: Processed, onError: Record|undefined) => { if(onError) { manager.setErrorCallback(module, onError) } diff --git a/src/handlers/user-defined-events.ts b/src/handlers/user-defined-events.ts index 822aa73..96ab46f 100644 --- a/src/handlers/user-defined-events.ts +++ b/src/handlers/user-defined-events.ts @@ -4,21 +4,21 @@ import { SernError } from '../core/_internal'; import { buildModules, callInitPlugins, handleCrash, eventDispatcher } from './_internal'; import { Service } from '../core/ioc'; import type { DependencyList } from '../types/ioc'; -import type { CommandModule, EventModule, Processed } from '../types/core-modules'; +import type { EventModule, Processed } from '../types/core-modules'; export function eventsHandler( [emitter, err, log, moduleManager, client]: DependencyList, allPaths: ObservableInput, ) { //code smell - const intoDispatcher = (e: Processed) => { - switch (e.type) { + const intoDispatcher = (e: { module: Processed, onError: Record|undefined }) => { + switch (e.module.type) { case EventType.Sern: - return eventDispatcher(e, emitter); + return eventDispatcher(e.module, e.onError, emitter); case EventType.Discord: - return eventDispatcher(e, client); + return eventDispatcher(e.module, e.onError, client); case EventType.External: - return eventDispatcher(e, Service(e.emitter)); + return eventDispatcher(e.module, e.onError, Service(e.module.emitter)); default: throw Error(SernError.InvalidModuleType + ' while creating event handler'); } @@ -31,7 +31,6 @@ export function eventsHandler( * Where all events are turned on */ mergeAll(), - handleCrash(err, log), - ) + handleCrash(err, log)) .subscribe(); } diff --git a/src/types/core.ts b/src/types/core.ts index c1d10ea..ccc8603 100644 --- a/src/types/core.ts +++ b/src/types/core.ts @@ -1,7 +1,7 @@ export interface ImportPayload { module: T; absPath: string; - onError: Function + onError: Record|undefined [key: string]: unknown; }