UNPKG

15.9 kBSource Map (JSON)View Raw
1{"version":3,"file":"index.js","sources":["../dist-src/version.js","../dist-src/wrap-request.js","../dist-src/generated/triggers-notification-paths.js","../dist-src/route-matcher.js","../dist-src/index.js"],"sourcesContent":["export const VERSION = \"3.0.0\";\n","const noop = () => Promise.resolve();\n// @ts-ignore\nexport function wrapRequest(state, request, options) {\n return state.retryLimiter.schedule(doRequest, state, request, options);\n}\n// @ts-ignore\nasync function doRequest(state, request, options) {\n const isWrite = options.method !== \"GET\" && options.method !== \"HEAD\";\n const isSearch = options.method === \"GET\" && options.url.startsWith(\"/search/\");\n const isGraphQL = options.url.startsWith(\"/graphql\");\n const retryCount = ~~options.request.retryCount;\n const jobOptions = retryCount > 0 ? { priority: 0, weight: 0 } : {};\n if (state.clustering) {\n // Remove a job from Redis if it has not completed or failed within 60s\n // Examples: Node process terminated, client disconnected, etc.\n // @ts-ignore\n jobOptions.expiration = 1000 * 60;\n }\n // Guarantee at least 1000ms between writes\n // GraphQL can also trigger writes\n if (isWrite || isGraphQL) {\n await state.write.key(state.id).schedule(jobOptions, noop);\n }\n // Guarantee at least 3000ms between requests that trigger notifications\n if (isWrite && state.triggersNotification(options.url)) {\n await state.notifications.key(state.id).schedule(jobOptions, noop);\n }\n // Guarantee at least 2000ms between search requests\n if (isSearch) {\n await state.search.key(state.id).schedule(jobOptions, noop);\n }\n const req = state.global.key(state.id).schedule(jobOptions, request, options);\n if (isGraphQL) {\n const res = await req;\n if (res.data.errors != null &&\n // @ts-ignore\n res.data.errors.some(error => error.type === \"RATE_LIMITED\")) {\n const error = Object.assign(new Error(\"GraphQL Rate Limit Exceeded\"), {\n headers: res.headers,\n data: res.data\n });\n throw error;\n }\n }\n return req;\n}\n","const PATHS = [\n \"/orgs/:org/invitations\",\n \"/repos/:owner/:repo/collaborators/:username\",\n \"/repos/:owner/:repo/commits/:commit_sha/comments\",\n \"/repos/:owner/:repo/issues\",\n \"/repos/:owner/:repo/issues/:issue_number/comments\",\n \"/repos/:owner/:repo/pulls\",\n \"/repos/:owner/:repo/pulls/:pull_number/comments\",\n \"/repos/:owner/:repo/pulls/:pull_number/comments/:comment_id/replies\",\n \"/repos/:owner/:repo/pulls/:pull_number/merge\",\n \"/repos/:owner/:repo/pulls/:pull_number/requested_reviewers\",\n \"/repos/:owner/:repo/pulls/:pull_number/reviews\",\n \"/repos/:owner/:repo/releases\",\n \"/teams/:team_id/discussions\",\n \"/teams/:team_id/discussions/:discussion_number/comments\"\n];\nexport default PATHS;\n","// @ts-ignore\nexport function routeMatcher(paths) {\n // EXAMPLE. For the following paths:\n /* [\n \"/orgs/:org/invitations\",\n \"/repos/:owner/:repo/collaborators/:username\"\n ] */\n // @ts-ignore\n const regexes = paths.map(path => path\n .split(\"/\")\n // @ts-ignore\n .map(c => (c.startsWith(\":\") ? \"(?:.+?)\" : c))\n .join(\"/\"));\n // 'regexes' would contain:\n /* [\n '/orgs/(?:.+?)/invitations',\n '/repos/(?:.+?)/(?:.+?)/collaborators/(?:.+?)'\n ] */\n // @ts-ignore\n const regex = `^(?:${regexes.map(r => `(?:${r})`).join(\"|\")})[^/]*$`;\n // 'regex' would contain:\n /*\n ^(?:(?:\\/orgs\\/(?:.+?)\\/invitations)|(?:\\/repos\\/(?:.+?)\\/(?:.+?)\\/collaborators\\/(?:.+?)))[^\\/]*$\n \n It may look scary, but paste it into https://www.debuggex.com/\n and it will make a lot more sense!\n */\n return new RegExp(regex, \"i\");\n}\n","// @ts-ignore\nimport BottleneckLight from \"bottleneck/light\";\nimport { VERSION } from \"./version\";\nimport { wrapRequest } from \"./wrap-request\";\nimport triggersNotificationPaths from \"./generated/triggers-notification-paths\";\nimport { routeMatcher } from \"./route-matcher\";\n// Workaround to allow tests to directly access the triggersNotification function.\nconst regex = routeMatcher(triggersNotificationPaths);\nconst triggersNotification = regex.test.bind(regex);\nconst groups = {};\n// @ts-ignore\nconst createGroups = function (Bottleneck, common) {\n // @ts-ignore\n groups.global = new Bottleneck.Group({\n id: \"octokit-global\",\n maxConcurrent: 10,\n ...common\n });\n // @ts-ignore\n groups.search = new Bottleneck.Group({\n id: \"octokit-search\",\n maxConcurrent: 1,\n minTime: 2000,\n ...common\n });\n // @ts-ignore\n groups.write = new Bottleneck.Group({\n id: \"octokit-write\",\n maxConcurrent: 1,\n minTime: 1000,\n ...common\n });\n // @ts-ignore\n groups.notifications = new Bottleneck.Group({\n id: \"octokit-notifications\",\n maxConcurrent: 1,\n minTime: 3000,\n ...common\n });\n};\nexport function throttling(octokit, octokitOptions = {}) {\n const { enabled = true, Bottleneck = BottleneckLight, id = \"no-id\", timeout = 1000 * 60 * 2, // Redis TTL: 2 minutes\n connection\n // @ts-ignore\n } = octokitOptions.throttle || {};\n if (!enabled) {\n return;\n }\n const common = { connection, timeout };\n // @ts-ignore\n if (groups.global == null) {\n createGroups(Bottleneck, common);\n }\n const state = Object.assign({\n clustering: connection != null,\n triggersNotification,\n minimumAbuseRetryAfter: 5,\n retryAfterBaseValue: 1000,\n retryLimiter: new Bottleneck(),\n id,\n ...groups\n }, \n // @ts-ignore\n octokitOptions.throttle);\n if (typeof state.onAbuseLimit !== \"function\" ||\n typeof state.onRateLimit !== \"function\") {\n throw new Error(`octokit/plugin-throttling error:\n You must pass the onAbuseLimit and onRateLimit error handlers.\n See https://github.com/octokit/rest.js#throttling\n\n const octokit = new Octokit({\n throttle: {\n onAbuseLimit: (retryAfter, options) => {/* ... */},\n onRateLimit: (retryAfter, options) => {/* ... */}\n }\n })\n `);\n }\n const events = {};\n const emitter = new Bottleneck.Events(events);\n // @ts-ignore\n events.on(\"abuse-limit\", state.onAbuseLimit);\n // @ts-ignore\n events.on(\"rate-limit\", state.onRateLimit);\n // @ts-ignore\n events.on(\"error\", e => console.warn(\"Error in throttling-plugin limit handler\", e));\n // @ts-ignore\n state.retryLimiter.on(\"failed\", async function (error, info) {\n const options = info.args[info.args.length - 1];\n const isGraphQL = options.url.startsWith(\"/graphql\");\n if (!(isGraphQL || error.status === 403)) {\n return;\n }\n const retryCount = ~~options.request.retryCount;\n options.request.retryCount = retryCount;\n const { wantRetry, retryAfter } = await (async function () {\n if (/\\babuse\\b/i.test(error.message)) {\n // The user has hit the abuse rate limit. (REST only)\n // https://developer.github.com/v3/#abuse-rate-limits\n // The Retry-After header can sometimes be blank when hitting an abuse limit,\n // but is always present after 2-3s, so make sure to set `retryAfter` to at least 5s by default.\n const retryAfter = Math.max(~~error.headers[\"retry-after\"], state.minimumAbuseRetryAfter);\n const wantRetry = await emitter.trigger(\"abuse-limit\", retryAfter, options);\n return { wantRetry, retryAfter };\n }\n if (error.headers != null &&\n error.headers[\"x-ratelimit-remaining\"] === \"0\") {\n // The user has used all their allowed calls for the current time period (REST and GraphQL)\n // https://developer.github.com/v3/#rate-limiting\n const rateLimitReset = new Date(~~error.headers[\"x-ratelimit-reset\"] * 1000).getTime();\n const retryAfter = Math.max(Math.ceil((rateLimitReset - Date.now()) / 1000), 0);\n const wantRetry = await emitter.trigger(\"rate-limit\", retryAfter, options);\n return { wantRetry, retryAfter };\n }\n return {};\n })();\n if (wantRetry) {\n options.request.retryCount++;\n // @ts-ignore\n return retryAfter * state.retryAfterBaseValue;\n }\n });\n octokit.hook.wrap(\"request\", wrapRequest.bind(null, state));\n}\nthrottling.VERSION = VERSION;\nthrottling.triggersNotification = triggersNotification;\n"],"names":["triggersNotificationPaths"],"mappings":"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"}
\No newline at end of file