File
Blob: src/worker/webdav/lock-xml.ts
| 1 | import { escapeXml } from "@/worker/dav/multistatus"; |
| 2 | import type { FileLockRow } from "@/worker/db/file-dav-do/schema"; |
| 3 | |
| 4 | export 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 | |
| 13 | export 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 | } |