mirror of
https://github.com/stablyai/orca.git
synced 2026-11-15 18:37:24 +00:00
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.
58 lines
1.3 KiB
TypeScript
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()
|
|
}
|
|
}
|