First upload version 0.0.1

This commit is contained in:
Neyra
2026-02-05 15:27:49 +08:00
commit 8e9b7201ed
4182 changed files with 593136 additions and 0 deletions

View File

@@ -0,0 +1,27 @@
import { createLogger } from "../create-logger.js";
import {
receiverOn as on,
receiverOnAny as onAny,
receiverOnError as onError
} from "./on.js";
import { receiverHandle as receive } from "./receive.js";
import { removeListener } from "./remove-listener.js";
function createEventHandler(options) {
const state = {
hooks: {},
log: createLogger(options && options.log)
};
if (options && options.transform) {
state.transform = options.transform;
}
return {
on: on.bind(null, state),
onAny: onAny.bind(null, state),
onError: onError.bind(null, state),
removeListener: removeListener.bind(null, state),
receive: receive.bind(null, state)
};
}
export {
createEventHandler
};

View File

@@ -0,0 +1,31 @@
import { validateEventName } from "./validate-event-name.js";
function handleEventHandlers(state, webhookName, handler) {
if (!state.hooks[webhookName]) {
state.hooks[webhookName] = [];
}
state.hooks[webhookName].push(handler);
}
function receiverOn(state, webhookNameOrNames, handler) {
if (Array.isArray(webhookNameOrNames)) {
webhookNameOrNames.forEach(
(webhookName) => receiverOn(state, webhookName, handler)
);
return;
}
validateEventName(webhookNameOrNames, {
onUnknownEventName: "warn",
log: state.log
});
handleEventHandlers(state, webhookNameOrNames, handler);
}
function receiverOnAny(state, handler) {
handleEventHandlers(state, "*", handler);
}
function receiverOnError(state, handler) {
handleEventHandlers(state, "error", handler);
}
export {
receiverOn,
receiverOnAny,
receiverOnError
};

View File

@@ -0,0 +1,61 @@
import { wrapErrorHandler } from "./wrap-error-handler.js";
function getHooks(state, eventPayloadAction, eventName) {
const hooks = [state.hooks[eventName], state.hooks["*"]];
if (eventPayloadAction) {
hooks.unshift(state.hooks[`${eventName}.${eventPayloadAction}`]);
}
return [].concat(...hooks.filter(Boolean));
}
function receiverHandle(state, event) {
const errorHandlers = state.hooks.error || [];
if (event instanceof Error) {
const error = Object.assign(new AggregateError([event], event.message), {
event
});
errorHandlers.forEach((handler) => wrapErrorHandler(handler, error));
return Promise.reject(error);
}
if (!event || !event.name) {
const error = new Error("Event name not passed");
throw new AggregateError([error], error.message);
}
if (!event.payload) {
const error = new Error("Event name not passed");
throw new AggregateError([error], error.message);
}
const hooks = getHooks(
state,
"action" in event.payload ? event.payload.action : null,
event.name
);
if (hooks.length === 0) {
return Promise.resolve();
}
const errors = [];
const promises = hooks.map((handler) => {
let promise = Promise.resolve(event);
if (state.transform) {
promise = promise.then(state.transform);
}
return promise.then((event2) => {
return handler(event2);
}).catch((error) => errors.push(Object.assign(error, { event })));
});
return Promise.all(promises).then(() => {
if (errors.length === 0) {
return;
}
const error = new AggregateError(
errors,
errors.map((error2) => error2.message).join("\n")
);
Object.assign(error, {
event
});
errorHandlers.forEach((handler) => wrapErrorHandler(handler, error));
throw error;
});
}
export {
receiverHandle
};

View File

@@ -0,0 +1,20 @@
function removeListener(state, webhookNameOrNames, handler) {
if (Array.isArray(webhookNameOrNames)) {
webhookNameOrNames.forEach(
(webhookName) => removeListener(state, webhookName, handler)
);
return;
}
if (!state.hooks[webhookNameOrNames]) {
return;
}
for (let i = state.hooks[webhookNameOrNames].length - 1; i >= 0; i--) {
if (state.hooks[webhookNameOrNames][i] === handler) {
state.hooks[webhookNameOrNames].splice(i, 1);
return;
}
}
}
export {
removeListener
};

View File

@@ -0,0 +1,33 @@
import { emitterEventNames } from "../generated/webhook-names.js";
function validateEventName(eventName, options = {}) {
if (typeof eventName !== "string") {
throw new TypeError("eventName must be of type string");
}
if (eventName === "*") {
throw new TypeError(
`Using the "*" event with the regular Webhooks.on() function is not supported. Please use the Webhooks.onAny() method instead`
);
}
if (eventName === "error") {
throw new TypeError(
`Using the "error" event with the regular Webhooks.on() function is not supported. Please use the Webhooks.onError() method instead`
);
}
if (options.onUnknownEventName === "ignore") {
return;
}
if (!emitterEventNames.includes(eventName)) {
if (options.onUnknownEventName !== "warn") {
throw new TypeError(
`"${eventName}" is not a known webhook name (https://developer.github.com/v3/activity/events/types/)`
);
} else {
(options.log || console).warn(
`"${eventName}" is not a known webhook name (https://developer.github.com/v3/activity/events/types/)`
);
}
}
}
export {
validateEventName
};

View File

@@ -0,0 +1,18 @@
function wrapErrorHandler(handler, error) {
let returnValue;
try {
returnValue = handler(error);
} catch (error2) {
console.log('FATAL: Error occurred in "error" event handler');
console.log(error2);
}
if (returnValue && returnValue.catch) {
returnValue.catch((error2) => {
console.log('FATAL: Error occurred in "error" event handler');
console.log(error2);
});
}
}
export {
wrapErrorHandler
};