@sern/handler
Version:
A complete, customizable, typesafe, & reactive framework for discord bots.
115 lines • 4.75 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.presenceHandler = void 0;
const ioc_1 = require("../core/ioc");
const Files = __importStar(require("../core/module-loading"));
const parseConfig = async (conf, setPresence) => {
const result = await conf;
if ('repeat' in result) {
const { onRepeat, repeat } = result;
// Validate configuration
if (repeat === undefined) {
throw new Error("repeat option is undefined");
}
if (onRepeat === undefined) {
throw new Error("onRepeat callback is undefined, but repeat exists");
}
// Initial state
let currentState = result;
const processState = async (state) => {
try {
const result = onRepeat(state);
// If it's a promise, await it, otherwise use the value directly
return result instanceof Promise ? await result : result;
}
catch (error) {
// TODO process error
//console.error(error);
return state; // Return previous state on error
}
};
// Handle numeric interval
if (typeof repeat === 'number') {
// Return a promise that never resolves (or resolves on cleanup)
return new Promise((resolve) => {
// Immediately return initial state
processState(currentState);
// Set up interval
let isProcessing = false;
const intervalId = setInterval(() => {
// Skip if previous operation is still running
if (isProcessing)
return;
isProcessing = true;
processState(currentState)
.then(newState => {
currentState = newState;
return setPresence(currentState);
})
.catch(console.error)
.finally(() => {
isProcessing = false;
});
}, repeat);
// Optional: Return cleanup function
return () => clearInterval(intervalId);
});
}
// Handle event-based repeat
else {
const handler = async () => {
currentState = await onRepeat(currentState);
await setPresence(currentState);
};
let has_registered = false;
return new Promise((resolve) => {
const [target, eventName] = repeat;
// Immediately return initial state
processState(currentState);
// Set up event listener
if (!has_registered) {
target.addListener(eventName, handler);
has_registered = true;
}
// Optional: Return cleanup function
return () => target.removeListener(eventName, handler);
});
}
}
// No repeat configuration, just return the result
return setPresence(result);
};
const presenceHandler = async (path, setPresence) => {
const presence = await Files.importModule(path)
.then(({ module }) => {
//fetch services with the order preserved, passing it to the execute fn
const fetchedServices = (0, ioc_1.Services)(...module.inject ?? []);
return async () => module.execute(...fetchedServices);
});
return parseConfig(presence(), setPresence);
};
exports.presenceHandler = presenceHandler;
//# sourceMappingURL=presence.js.map