mirror of
https://github.com/sern-handler/handler
synced 2026-06-06 01:16:55 +00:00
* feat: experimental plugin changes * more refactors and name changes * feat: update name usage and update dispatchers.ts * fix:naming * feat: slightly safer typings than any[] * fix: forgot to destructure arguments * feat: add special function * fix: typings * feat: SUPER SIMPLIFY!!! * refactor: move promisifiedPlugins closer to call site * refactor: typings * refactor: typings * refactor: consolidate resolving initplugins into one function * refactor: better types * revert: remove unneeded function * revert: remove unneeded function * feat: dispatch work, simplify * feat: move some observableHandling function to operators for clarity * feat: simplify and document * feat: simplifying sern and docs * fix: typings * docs: clarity of function name * docs: add documentation for executeModule * feat: contextArgs overloads * docs: found out why * fix: typings * feat: shorten operators signature * refactor: switch to correct convention * refactor: take(1) -> first() * refactor: revert * refactor: safer typings (less any) and more accurate typings * style: prettier and short type aliases * fix: typings * fix: typings * docs: add deprecations * refactor: organization and moving stuff * pretty: prettey * docs: describe file * chore: update dependencies and version * docs: fix link for docasaurus * refactor: using a more appropriate operator function for closing an observable on crash * fix!: changing single and many * refactor: typings and simplifying composeRoot * fix: re-add logger into handleError * docs: comment * docs: new section * feat: help mitigate breaking changes * feat: help mitigate breaking changes * feat: help mitigate breaking changes and function overloads * feat: deprecate instead of remove * feat: partial remove and deprecate old symbols * revert: trying to accommodate old plugins is too difficult * docs: add many as deprecated * docs: update * feat: partial backwards compatability * refactor: renaming, docs, and exports more clean * refactor: context got a lot simpler * refactor: imports * docs: explain methods
73 lines
2.9 KiB
TypeScript
73 lines
2.9 KiB
TypeScript
import { catchError, finalize, map, tap } from 'rxjs';
|
|
import { buildData } from '../utilities/readFile';
|
|
import type { Dependencies, Processed } from '../../types/handler';
|
|
import { errTap, scanModule } from './observableHandling';
|
|
import type { CommandModule, EventModule } from '../../types/module';
|
|
import type { EventEmitter } from 'events';
|
|
import SernEmitter from '../sernEmitter';
|
|
import { match } from 'ts-pattern';
|
|
import type { ErrorHandling, Logging } from '../contracts';
|
|
import { SernError, EventType, type Wrapper } from '../structures';
|
|
import { eventDispatcher } from './dispatchers';
|
|
import { handleError } from '../contracts/errorHandling';
|
|
import { defineAllFields } from './operators';
|
|
import { useContainerRaw } from '../dependencies';
|
|
|
|
export function processEvents({ containerConfig, events }: Wrapper) {
|
|
const [client, errorHandling, sernEmitter, logger] = containerConfig.get(
|
|
'@sern/client',
|
|
'@sern/errors',
|
|
'@sern/emitter',
|
|
'@sern/logger',
|
|
) as [EventEmitter, ErrorHandling, SernEmitter, Logging?];
|
|
const lazy = (k: string) => containerConfig.get(k as keyof Dependencies)[0];
|
|
const eventStream$ = eventObservable$(events!, sernEmitter);
|
|
|
|
const eventCreation$ = eventStream$.pipe(
|
|
defineAllFields(),
|
|
scanModule({
|
|
onFailure: module => sernEmitter.emit('module.register', SernEmitter.success(module)),
|
|
onSuccess: ({ module }) => {
|
|
sernEmitter.emit(
|
|
'module.register',
|
|
SernEmitter.failure(module, SernError.PluginFailure),
|
|
);
|
|
return module;
|
|
},
|
|
}),
|
|
);
|
|
const intoDispatcher = (e: Processed<EventModule | CommandModule>) =>
|
|
match(e)
|
|
.with({ type: EventType.Sern }, m => eventDispatcher(m, sernEmitter))
|
|
.with({ type: EventType.Discord }, m => eventDispatcher(m, client))
|
|
.with({ type: EventType.External }, m => eventDispatcher(m, lazy(m.emitter)))
|
|
.otherwise(() => errorHandling.crash(Error(SernError.InvalidModuleType)));
|
|
|
|
eventCreation$
|
|
.pipe(
|
|
map(intoDispatcher),
|
|
/**
|
|
* Where all events are turned on
|
|
*/
|
|
tap(dispatcher => dispatcher.subscribe()),
|
|
catchError(handleError(errorHandling, logger)),
|
|
finalize(() => {
|
|
logger?.info({ message: 'an event module reached end of lifetime'});
|
|
useContainerRaw()
|
|
?.disposeAll()
|
|
.then(() => {
|
|
logger?.info({ message: 'Cleaning container and crashing' });
|
|
});
|
|
})
|
|
)
|
|
.subscribe();
|
|
}
|
|
|
|
function eventObservable$(events: string, emitter: SernEmitter) {
|
|
return buildData<EventModule>(events).pipe(
|
|
errTap(reason => {
|
|
emitter.emit('module.register', SernEmitter.failure(undefined, reason));
|
|
}),
|
|
);
|
|
}
|