Skip to content
File

Blob: src/worker/webdav/lock-xml.ts

typescript20 lines
1import { escapeXml } from "@/worker/dav/multistatus";
2import type { FileLockRow } from "@/worker/db/file-dav-do/schema";
3 
4export function lockXml(lock: FileLockRow): string {
5 const timeoutSeconds = Math.max(0, Math.floor((lock.expiresAtMs - Date.now()) / 1000));
6 return `<D:activelock><D:locktype><D:write/></D:locktype><D:lockscope><D:${lock.scope}/></D:lockscope><D:depth>${
7 lock.depth === "infinity" ? "Infinity" : "0"
8 }</D:depth>${lock.ownerXml}<D:timeout>Second-${timeoutSeconds}</D:timeout><D:locktoken><D:href>${escapeXml(
9 lock.token,
10 )}</D:href></D:locktoken><D:lockroot><D:href>${escapeXml(lock.rootPath)}</D:href></D:lockroot></D:activelock>`;
11}
12 
13export function parseTimeout(header: string | null): number {
14 if (!header) return 600;
15 const first = header.split(",")[0]?.trim() ?? "";
16 const match = /^Second-(\d+)$/i.exec(first);
17 if (!match) return 600;
18 return Number.parseInt(match[1]!, 10);
19}