export type LfsPointer = { oid: string; size: number }; /** Spec-compliant pointers are tiny; anything larger is real content and is never parsed. */ export const MAX_POINTER_BYTES = 1024; const POINTER_VERSION = "version https://git-lfs.github.com/spec/v1"; const LEGACY_VERSION = "version https://hawser.github.com/spec/v1"; const OID_LINE = /^oid sha256:([0-9a-f]{64})$/; const SIZE_LINE = /^size (\d{1,16})$/; const OID_PATTERN = /^[0-9a-f]{64}$/; const decoder = new TextDecoder("utf-8", { fatal: true }); export function isValidOid(oid: string): boolean { return OID_PATTERN.test(oid); } export function parseLfsPointer(bytes: Uint8Array): LfsPointer | null { if (bytes.byteLength === 0 || bytes.byteLength > MAX_POINTER_BYTES) return null; let text: string; try { text = decoder.decode(bytes); } catch { return null; } const lines = text.replace(/\r\n/g, "\n").split("\n").filter(Boolean); if (lines[0] !== POINTER_VERSION && lines[0] !== LEGACY_VERSION) return null; let oid: string | null = null; let size: number | null = null; for (const line of lines.slice(1)) { const oidMatch = OID_LINE.exec(line); if (oidMatch) oid = oidMatch[1]; const sizeMatch = SIZE_LINE.exec(line); if (sizeMatch) size = Number(sizeMatch[1]); } if (oid === null || size === null || !Number.isSafeInteger(size)) return null; return { oid, size }; }