fix: event types

This commit is contained in:
MARCROCK22 2024-08-21 15:01:04 +00:00
parent 40f261f921
commit 4f3d5548a9
3 changed files with 32 additions and 20 deletions

View File

@ -8,6 +8,10 @@ import type { UsingClient } from '../commands';
export type AllClientEvents = CustomEventsKeys | GatewayEvents; export type AllClientEvents = CustomEventsKeys | GatewayEvents;
export type ParseClientEventName<T extends AllClientEvents> = T extends CustomEventsKeys ? T : CamelCase<T>; export type ParseClientEventName<T extends AllClientEvents> = T extends CustomEventsKeys ? T : CamelCase<T>;
export type CollectorRunPameters<T extends AllClientEvents> = Awaited<
Parameters<CallbackEventHandler[ParseClientEventName<T>]>[0]
>;
type RunData<T extends AllClientEvents> = { type RunData<T extends AllClientEvents> = {
options: { options: {
event: T; event: T;
@ -15,16 +19,9 @@ type RunData<T extends AllClientEvents> = {
timeout?: number; timeout?: number;
onStop?: (reason: string) => unknown; onStop?: (reason: string) => unknown;
onStopError?: (reason: string, error: unknown) => unknown; onStopError?: (reason: string, error: unknown) => unknown;
filter: (arg: Awaited<Parameters<CallbackEventHandler[ParseClientEventName<T>]>[0]>) => Awaitable<boolean>; filter: (arg: CollectorRunPameters<T>) => Awaitable<boolean>;
run: ( run: (arg: CollectorRunPameters<T>, stop: (reason?: string) => void) => unknown;
arg: Awaited<Parameters<CallbackEventHandler[ParseClientEventName<T>]>[0]>, onRunError?: (arg: CollectorRunPameters<T>, error: unknown, stop: (reason?: string) => void) => unknown;
stop: (reason?: string) => void,
) => unknown;
onRunError?: (
arg: Awaited<Parameters<CallbackEventHandler[ParseClientEventName<T>]>[0]>,
error: unknown,
stop: (reason?: string) => void,
) => unknown;
}; };
idle?: NodeJS.Timeout; idle?: NodeJS.Timeout;
timeout?: NodeJS.Timeout; timeout?: NodeJS.Timeout;

View File

@ -18,17 +18,32 @@ import type { ClientEvents } from '../events/hooks';
import * as RawEvents from '../events/hooks'; import * as RawEvents from '../events/hooks';
import type { ClientEvent, CustomEvents, CustomEventsKeys, ClientNameEvents, EventContext } from './event'; import type { ClientEvent, CustomEvents, CustomEventsKeys, ClientNameEvents, EventContext } from './event';
import type { FileLoaded } from '../commands/handler'; import type { FileLoaded } from '../commands/handler';
import type { UsingClient } from '../commands';
export type EventValue = MakeRequired<ClientEvent, '__filePath'> & { fired?: boolean }; export type EventValue = MakeRequired<ClientEvent, '__filePath'> & { fired?: boolean };
export type GatewayEvents = Uppercase<SnakeCase<keyof ClientEvents>>; export type GatewayEvents = Uppercase<SnakeCase<keyof ClientEvents>>;
type ResolveEventParams<T extends CustomEventsKeys | GatewayEvents> = T extends CustomEventsKeys export type ResolveEventParams<T extends ClientNameEvents | CustomEventsKeys | GatewayEvents> =
T extends CustomEventsKeys
? [...Parameters<CustomEvents[T]>, UsingClient]
: T extends GatewayEvents
? EventContext<{ data: { name: CamelCase<T> } }>
: T extends ClientNameEvents
? EventContext<{ data: { name: T } }>
: never;
export type ResolveEventRunParams<T extends ClientNameEvents | CustomEventsKeys | GatewayEvents> =
T extends CustomEventsKeys
? Parameters<CustomEvents[T]> ? Parameters<CustomEvents[T]>
: EventContext<{ data: { name: CamelCase<T> } }>; : T extends GatewayEvents
? EventContext<{ data: { name: CamelCase<T> } }>
: T extends ClientNameEvents
? EventContext<{ data: { name: T } }>
: never;
export type EventValues = { export type EventValues = {
[K in CustomEventsKeys | GatewayEvents]: Omit<EventValue, 'run'> & { [K in CustomEventsKeys | GatewayEvents]: Omit<EventValue, 'run'> & {
run(...args: ResolveEventParams<K>): any; run(...args: ResolveEventRunParams<K>): any;
}; };
}; };
@ -157,16 +172,16 @@ export class EventHandler extends BaseHandler {
} }
} }
async runCustom<T extends CustomEventsKeys>(name: T, ...args: EventValues[T]) { async runCustom<T extends CustomEventsKeys>(name: T, ...args: ResolveEventRunParams<T>) {
const Event = this.values[name]; const Event = this.values[name];
if (!Event) { if (!Event) {
// @ts-expect-error working with non-existent types is hard // @ts-expect-error working with non-existent types is hard
return this.client.collectors.run(name, ...args, this.client); return this.client.collectors.run(name, args, this.client);
} }
try { try {
if (Event.data.once && Event.fired) { if (Event.data.once && Event.fired) {
// @ts-expect-error working with non-existent types is hard // @ts-expect-error working with non-existent types is hard
return this.client.collectors.run(name, ...args, this.client); return this.client.collectors.run(name, args, this.client);
} }
Event.fired = true; Event.fired = true;
this.logger.debug(`executed a custom event [${name}]`, Event.data.once ? 'once' : ''); this.logger.debug(`executed a custom event [${name}]`, Event.data.once ? 'once' : '');
@ -175,7 +190,7 @@ export class EventHandler extends BaseHandler {
// @ts-expect-error working with non-existent types is hard // @ts-expect-error working with non-existent types is hard
Event.run(...args, this.client), Event.run(...args, this.client),
// @ts-expect-error working with non-existent types is hard // @ts-expect-error working with non-existent types is hard
this.client.collectors.run(name, ...args, this.client), this.client.collectors.run(name, args, this.client),
]); ]);
} catch (e) { } catch (e) {
await this.onFail(name, e); await this.onFail(name, e);

View File

@ -7,7 +7,7 @@ import {
type RuntimeConfig, type RuntimeConfig,
type RuntimeConfigHTTP, type RuntimeConfigHTTP,
} from './client/base'; } from './client/base';
import type { CustomEventsKeys, ClientNameEvents, EventContext } from './events'; import type { CustomEventsKeys, ClientNameEvents, ResolveEventParams } from './events';
import { isCloudfareWorker } from './common'; import { isCloudfareWorker } from './common';
export { Logger, PermissionStrings, Formatter } from './common'; export { Logger, PermissionStrings, Formatter } from './common';
// //
@ -44,7 +44,7 @@ export * from './client';
*/ */
export function createEvent<E extends ClientNameEvents | CustomEventsKeys>(data: { export function createEvent<E extends ClientNameEvents | CustomEventsKeys>(data: {
data: { name: E; once?: boolean }; data: { name: E; once?: boolean };
run: (...args: EventContext<{ data: { name: E } }>) => any; run: (...args: ResolveEventParams<E>) => any;
}) { }) {
data.data.once ??= false; data.data.once ??= false;
return data; return data;