mirror of
https://github.com/tiramisulabs/seyfert.git
synced 2025-07-03 05:26:07 +00:00
fix: event types
This commit is contained in:
parent
40f261f921
commit
4f3d5548a9
@ -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;
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user