Files
orca/src/main/jira/request-queue.ts
Neil 83117f2860 refactor(integrations): split issue-tracker clients under the max-lines budget (#14704)
The GitLab, GitHub, Jira and Linear integration modules, their two IPC
registrars, and the shared GitHub project types each carried a file-level
`eslint-disable max-lines` and ran 351-614 counted lines against a 300-line
budget. AGENTS.md calls for splitting rather than suppressing, and
config/max-lines-baseline.txt is a shrink-only ratchet, so this removes all
eight suppressions and prunes their entries (341 -> 333).

Pure move, no behavior change. Each client is cut along the seam it already
had: per-operation modules for the issue APIs (create / update / comment /
field options), and for Jira the request queue, site credential store,
authenticated request, and site identity. The two IPC registrars keep their own
handlers and delegate the rest to per-domain sub-registrars, so they remain
real entry points rather than re-export shims.

The IPC surface is proved intact rather than assumed: comparing (method,
channel) multisets between HEAD and the split gives 52 registrations across 52
distinct channels on both sides.

Provider-neutrality is preserved -- GitLab and GitHub keep separate, parallel
module layouts rather than being merged behind a shared abstraction.

Verified: oxlint clean, ratchet passes, typecheck clean, full unit suite green
(the one remaining failure is a pre-existing load flake in an untouched file,
green when re-run serially), no new runtime import cycles among 744 modules,
and no lint suppression added anywhere.
2026-08-15 18:17:20 -07:00

58 lines
1.3 KiB
TypeScript

const MAX_CONCURRENT = 4
let running = 0
type QueuedJiraRequest = {
resolve: () => void
reject: (error: Error) => void
signal?: AbortSignal
onAbort: () => void
}
const queue: QueuedJiraRequest[] = []
function createJiraRequestAbortError(): Error {
const error = new Error('Jira request aborted')
error.name = 'AbortError'
return error
}
export function acquire(signal?: AbortSignal): Promise<void> {
if (signal?.aborted) {
return Promise.reject(createJiraRequestAbortError())
}
if (running < MAX_CONCURRENT) {
running += 1
return Promise.resolve()
}
return new Promise((resolve, reject) => {
const entry: QueuedJiraRequest = {
resolve,
reject,
signal,
onAbort: () => {
const index = queue.indexOf(entry)
if (index === -1) {
return
}
queue.splice(index, 1)
reject(createJiraRequestAbortError())
}
}
signal?.addEventListener('abort', entry.onAbort, { once: true })
queue.push(entry)
})
}
export function release(): void {
running -= 1
let next = queue.shift()
while (next) {
next.signal?.removeEventListener('abort', next.onAbort)
if (!next.signal?.aborted) {
running += 1
next.resolve()
return
}
next.reject(createJiraRequestAbortError())
next = queue.shift()
}
}