mirror of
https://github.com/sern-handler/handler
synced 2026-06-06 01:16:55 +00:00
* some wip code Co-authored-by: Jacob Nguyen <jacoobes@users.noreply.github.com> * general idea * style * making shrimple truly optional * got optional localizer working * proposing api notation? * prepare for localization map * add localsFor * merge some internals * boss call * add test for init functionality * add documentation * inline and cleanup * feat: logging for experimental json loading * loosen typings * dev workflow and cleaning up comments * cleaning up a bit more * rename Localizer -> Localization * more documentation, change dir for default localizer * some tests * " * move stuff, refactor, deprecate * yarnb * Update index.ts --------- Co-authored-by: Jacob Nguyen <jacoobes@users.noreply.github.com> Co-authored-by: Jacob Nguyen <76754747+jacoobes@users.noreply.github.com> Co-authored-by: jacob <jacoobes@sern.dev>
46 lines
1.8 KiB
TypeScript
46 lines
1.8 KiB
TypeScript
import { concatMap, from, interval, of, map, scan, startWith, fromEvent, take } from "rxjs"
|
|
import { Files } from "../core/_internal";
|
|
import * as Presence from "../core/presences";
|
|
import { Services } from "../core/ioc";
|
|
import assert from "node:assert";
|
|
|
|
type SetPresence = (conf: Presence.Result) => Promise<unknown>
|
|
|
|
const parseConfig = async (conf: Promise<Presence.Result>) => {
|
|
return conf.then(s => {
|
|
if('repeat' in s) {
|
|
const { onRepeat, repeat } = s;
|
|
assert(repeat !== undefined, "repeat option is undefined");
|
|
assert(onRepeat !== undefined, "onRepeat callback is undefined, but repeat exists");
|
|
const src$ = typeof repeat === 'number'
|
|
? interval(repeat)
|
|
: fromEvent(...repeat);
|
|
return src$
|
|
.pipe(scan(onRepeat, s),
|
|
startWith(s));
|
|
}
|
|
return of(s).pipe(take(1));
|
|
})
|
|
};
|
|
|
|
export const presenceHandler = (path: string, setPresence: SetPresence) => {
|
|
interface PresenceModule {
|
|
module: Presence.Config<(keyof Dependencies)[]>
|
|
}
|
|
const presence = Files
|
|
.importModule<PresenceModule>(path)
|
|
.then(({ module }) => {
|
|
//fetch services with the order preserved, passing it to the execute fn
|
|
const fetchedServices = Services(...module.inject ?? []);
|
|
return async () => module.execute(...fetchedServices);
|
|
})
|
|
const module$ = from(presence);
|
|
return module$.pipe(
|
|
//compose:
|
|
//call the execute function, passing that result into parseConfig.
|
|
//concatMap resolves the promise, and passes it to the next concatMap.
|
|
concatMap(fn => parseConfig(fn())),
|
|
// subscribe to the observable parseConfig yields, and set the presence.
|
|
concatMap(conf => conf.pipe(map(setPresence))));
|
|
}
|