47 lines
2.2 KiB
JavaScript
47 lines
2.2 KiB
JavaScript
const noop = () => Promise.resolve();
|
|
function wrapRequest(state, request, options) {
|
|
return state.retryLimiter.schedule(doRequest, state, request, options);
|
|
}
|
|
async function doRequest(state, request, options) {
|
|
const { pathname } = new URL(options.url, "http://github.test");
|
|
const isAuth = isAuthRequest(options.method, pathname);
|
|
const isWrite = !isAuth && options.method !== "GET" && options.method !== "HEAD";
|
|
const isSearch = options.method === "GET" && pathname.startsWith("/search/");
|
|
const isGraphQL = pathname.startsWith("/graphql");
|
|
const retryCount = ~~request.retryCount;
|
|
const jobOptions = retryCount > 0 ? { priority: 0, weight: 0 } : {};
|
|
if (state.clustering) {
|
|
jobOptions.expiration = 1e3 * 60;
|
|
}
|
|
if (isWrite || isGraphQL) {
|
|
await state.write.key(state.id).schedule(jobOptions, noop);
|
|
}
|
|
if (isWrite && state.triggersNotification(pathname)) {
|
|
await state.notifications.key(state.id).schedule(jobOptions, noop);
|
|
}
|
|
if (isSearch) {
|
|
await state.search.key(state.id).schedule(jobOptions, noop);
|
|
}
|
|
const req = (isAuth ? state.auth : state.global).key(state.id).schedule(jobOptions, request, options);
|
|
if (isGraphQL) {
|
|
const res = await req;
|
|
if (res.data.errors != null && res.data.errors.some((error) => error.type === "RATE_LIMITED")) {
|
|
const error = Object.assign(new Error("GraphQL Rate Limit Exceeded"), {
|
|
response: res,
|
|
data: res.data
|
|
});
|
|
throw error;
|
|
}
|
|
}
|
|
return req;
|
|
}
|
|
function isAuthRequest(method, pathname) {
|
|
return method === "PATCH" && // https://docs.github.com/en/rest/apps/apps?apiVersion=2022-11-28#create-a-scoped-access-token
|
|
/^\/applications\/[^/]+\/token\/scoped$/.test(pathname) || method === "POST" && // https://docs.github.com/en/rest/apps/oauth-applications?apiVersion=2022-11-28#reset-a-token
|
|
(/^\/applications\/[^/]+\/token$/.test(pathname) || // https://docs.github.com/en/rest/apps/apps?apiVersion=2022-11-28#create-an-installation-access-token-for-an-app
|
|
/^\/app\/installations\/[^/]+\/access_tokens$/.test(pathname) || // https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/authorizing-oauth-apps
|
|
pathname === "/login/oauth/access_token");
|
|
}
|
|
export {
|
|
wrapRequest
|
|
};
|