git LFS server implemented on Cloudflare Workers + R2
cloudflare
git
lfs
workers
r2
1export interface LfsBatchRequest {
2 operation: "download" | "upload";
3 transfers?: string[];
4 objects: LfsObject[];
5}
6
7export interface LfsObject {
8 oid: string;
9 size: number;
10}
11
12export interface LfsBatchResponse {
13 transfer?: string;
14 objects: LfsObjectResult[];
15}
16
17export interface LfsObjectResult {
18 oid: string;
19 size: number;
20 authenticated?: boolean;
21 actions?: LfsActions;
22 error?: LfsObjectError;
23}
24
25export interface LfsActions {
26 download?: LfsAction;
27 upload?: LfsAction;
28 verify?: LfsAction;
29}
30
31export interface LfsAction {
32 href: string;
33 header?: Record<string, string>;
34 expires_in?: number;
35}
36
37export interface LfsObjectError {
38 code: number;
39 message: string;
40}
41
42export interface LfsVerifyRequest {
43 oid: string;
44 size: number;
45}
46
47const LFS_CONTENT_TYPE = "application/vnd.git-lfs+json";
48
49export function lfsJson(body: unknown, status = 200): Response {
50 return new Response(JSON.stringify(body), {
51 status,
52 headers: { "Content-Type": LFS_CONTENT_TYPE },
53 });
54}
55
56export function lfsError(code: number, message: string): Response {
57 return lfsJson({ message }, code);
58}