fix(server): cancel merge observation HTTP requests on shutdown

Bound GitHub object and repository probes, keep readiness independent of external reads, and page pending cards through the owning parser.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
DottaandPaperclip committed 2026-10-30 16:49:17 -05:00
1 parent e55bc2df65
commit 7edb163a80
10 files changed
+200 -40

No files matched your search

@@ -1,5 +1,5 @@
import type { Db } from "@paperclipai/db";
import { createGitHubExternalObjectProvider } from "./github-external-object-provider.js";
import { createGitHubExternalObjectProvider, type GitHubExternalObjectProviderOptions } from "./github-external-object-provider.js";
export type GitHubPullRequestReference = {
host: "github.com";
@@ -25,11 +25,13 @@ export type PullRequestMergeDetails = {
export type PullRequestMergeStateResolver = (
companyId: string,
reference: GitHubPullRequestReference,
signal?: AbortSignal,
) => Promise<PullRequestMergeState>;
export type PullRequestMergeDetailsResolver = (
companyId: string,
reference: GitHubPullRequestReference,
signal?: AbortSignal,
) => Promise<PullRequestMergeDetails>;
export const PULL_REQUEST_CACHE_MAX_ENTRIES = 1_000;
@@ -86,14 +88,15 @@ function readRecord(value: unknown): Record<string, unknown> | null {
: null;
}
export function createPullRequestMergeDetailsResolver(db: Db): PullRequestMergeDetailsResolver {
const resolver = createGitHubExternalObjectProvider(db).resolvers
export function createPullRequestMergeDetailsResolver(db: Db, options?: GitHubExternalObjectProviderOptions): PullRequestMergeDetailsResolver {
const resolver = createGitHubExternalObjectProvider(db, options).resolvers
.find((candidate) => candidate.objectType === "pull_request") ?? null;
return async (companyId, reference) => {
return async (companyId, reference, signal) => {
if (!resolver) return { state: "unknown", headRef: null, headSha: null };
const result = await resolver.resolve({
companyId,
signal,
object: {
externalId: `${reference.owner}/${reference.repo}#pull/${reference.number}`,
sanitizedCanonicalUrl: `https://github.com/${reference.owner}/${reference.repo}/pull/${reference.number}`,
@@ -123,7 +126,7 @@ export function createPullRequestMergeDetailsResolver(db: Db): PullRequestMergeD
};
}
export function createPullRequestMergeStateResolver(db: Db): PullRequestMergeStateResolver {
const resolveDetails = createPullRequestMergeDetailsResolver(db);
return async (companyId, reference) => (await resolveDetails(companyId, reference)).state;
export function createPullRequestMergeStateResolver(db: Db, options?: GitHubExternalObjectProviderOptions): PullRequestMergeStateResolver {
const resolveDetails = createPullRequestMergeDetailsResolver(db, options);
return async (companyId, reference, signal) => (await resolveDetails(companyId, reference, signal)).state;
}