@narumitw/pi-sync 0.49.10 → 0.49.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -1
- package/dist/chunks/chunk-3GRWMWUZ.ts +213 -0
- package/dist/chunks/chunk-3GRWMWUZ.ts.map +7 -0
- package/dist/chunks/chunk-3NDD5QPM.ts +203 -0
- package/dist/chunks/chunk-3NDD5QPM.ts.map +7 -0
- package/dist/chunks/chunk-4F3W4CSC.ts +195 -0
- package/dist/chunks/chunk-4F3W4CSC.ts.map +7 -0
- package/dist/chunks/chunk-4U6AFLJB.ts +221 -0
- package/dist/chunks/chunk-4U6AFLJB.ts.map +7 -0
- package/dist/chunks/chunk-5MQ76BK5.ts +34 -0
- package/dist/chunks/chunk-5MQ76BK5.ts.map +7 -0
- package/dist/chunks/chunk-APZVBSM6.ts +1238 -0
- package/dist/chunks/chunk-APZVBSM6.ts.map +7 -0
- package/dist/chunks/chunk-BHJUISB4.ts +134 -0
- package/dist/chunks/chunk-BHJUISB4.ts.map +7 -0
- package/dist/chunks/chunk-D3S54OXI.ts +653 -0
- package/dist/chunks/chunk-D3S54OXI.ts.map +7 -0
- package/dist/chunks/chunk-EWX3TPLQ.ts +356 -0
- package/dist/chunks/chunk-EWX3TPLQ.ts.map +7 -0
- package/dist/chunks/chunk-F5QL2GPY.ts +341 -0
- package/dist/chunks/chunk-F5QL2GPY.ts.map +7 -0
- package/dist/chunks/chunk-FR6CVXAL.ts +81 -0
- package/dist/chunks/chunk-FR6CVXAL.ts.map +7 -0
- package/dist/chunks/chunk-HGV24P4T.ts +53 -0
- package/dist/chunks/chunk-HGV24P4T.ts.map +7 -0
- package/dist/chunks/chunk-JNOOSPEW.ts +82 -0
- package/dist/chunks/chunk-JNOOSPEW.ts.map +7 -0
- package/dist/chunks/chunk-LJDSHNS3.ts +259 -0
- package/dist/chunks/chunk-LJDSHNS3.ts.map +7 -0
- package/dist/chunks/chunk-RGJ6SOYR.ts +128 -0
- package/dist/chunks/chunk-RGJ6SOYR.ts.map +7 -0
- package/dist/chunks/chunk-W64NEHXT.ts +167 -0
- package/dist/chunks/chunk-W64NEHXT.ts.map +7 -0
- package/dist/chunks/chunk-YQ6UW7IF.ts +394 -0
- package/dist/chunks/chunk-YQ6UW7IF.ts.map +7 -0
- package/dist/chunks/file-selection-4UABOP44.ts +290 -0
- package/dist/chunks/file-selection-4UABOP44.ts.map +7 -0
- package/dist/chunks/git-backend-E3UOUUOM.ts +1104 -0
- package/dist/chunks/git-backend-E3UOUUOM.ts.map +7 -0
- package/dist/chunks/manager-result-dispatcher-YKBLZ7KL.ts +18 -0
- package/dist/chunks/manager-result-dispatcher-YKBLZ7KL.ts.map +7 -0
- package/dist/chunks/manager-ui-7E25VWUP.ts +2754 -0
- package/dist/chunks/manager-ui-7E25VWUP.ts.map +7 -0
- package/dist/chunks/remote-selection-ui-J6OW5DKZ.ts +17 -0
- package/dist/chunks/remote-selection-ui-J6OW5DKZ.ts.map +7 -0
- package/dist/chunks/s3-backend-3QZGO2EF.ts +680 -0
- package/dist/chunks/s3-backend-3QZGO2EF.ts.map +7 -0
- package/dist/chunks/setup-switch-X3W3FALZ.ts +27 -0
- package/dist/chunks/setup-switch-X3W3FALZ.ts.map +7 -0
- package/dist/chunks/snapshot-WBSV4MQG.ts +45 -0
- package/dist/chunks/snapshot-WBSV4MQG.ts.map +7 -0
- package/dist/chunks/sync-operations-MPAFVVHA.ts +1112 -0
- package/dist/chunks/sync-operations-MPAFVVHA.ts.map +7 -0
- package/dist/chunks/sync-state-36H7ULG2.ts +41 -0
- package/dist/chunks/sync-state-36H7ULG2.ts.map +7 -0
- package/dist/chunks/webdav-backend-ZD5RHRIU.ts +869 -0
- package/dist/chunks/webdav-backend-ZD5RHRIU.ts.map +7 -0
- package/dist/index.ts +668 -0
- package/dist/index.ts.map +7 -0
- package/package.json +11 -7
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/webdav-backend.ts", "../../src/webdav-client.ts"],
|
|
4
|
+
"sourcesContent": ["import { createHash, randomUUID } from \"node:crypto\";\nimport { decodeSnapshot, encodeSnapshot } from \"./snapshot-codec.js\";\nimport {\n\ttype BackendDiagnostic,\n\ttype ExpectedRemoteHead,\n\ttype PublishSnapshotOptions,\n\ttype PublishSnapshotResult,\n\ttype RemoteHead,\n\ttype RemoteHistoryEntry,\n\ttype SyncBackend,\n\tSyncBackendConflictError,\n\tSyncBackendPublicationOutcomeUnknownError,\n} from \"./sync-backend.js\";\nimport { portableSnapshotSelection } from \"./sync-policy.js\";\nimport type { LatestPointer, RemoteObject, ResolvedWebDavBackend, Snapshot } from \"./types.js\";\nimport { WebDavClient, WebDavHttpError, WebDavPreconditionError } from \"./webdav-client.js\";\n\nconst VERSION = 1;\nconst POST_COMMIT_TIMEOUT_MS = 30_000;\n\nexport class WebDavSyncBackend implements SyncBackend {\n\treadonly identity: string;\n\treadonly destination: string;\n\tprivate conditionalVerified = false;\n\tprivate readonly checksums = new Map<string, string>();\n\tprivate capabilityCheck?: Promise<void>;\n\n\tconstructor(\n\t\tprivate readonly config: ResolvedWebDavBackend,\n\t\tprivate readonly postCommitTimeoutMs = POST_COMMIT_TIMEOUT_MS,\n\t) {\n\t\tassertSafeDestination(config);\n\t\tthis.identity = webDavBackendIdentity(config);\n\t\tthis.destination = webDavStorageLocation(config);\n\t}\n\n\tget capability() {\n\t\treturn this.conditionalVerified\n\t\t\t? (\"atomic-conditional\" as const)\n\t\t\t: (\"conditional-required\" as const);\n\t}\n\n\tsameRevision(left: string, right: string) {\n\t\treturn left === right;\n\t}\n\n\tasync readHead(signal?: AbortSignal): Promise<RemoteHead | undefined> {\n\t\tconst object = await new WebDavClient(this.config, signal).getJson<LatestPointer>(\n\t\t\tlatestPath(this.config),\n\t\t);\n\t\tthrowIfAborted(signal);\n\t\tif (object.missing) return undefined;\n\t\tconst pointer = requirePointer(object.value, this.config.destination.namespace);\n\t\tthis.registerChecksum(pointer.snapshot, pointer.sha256);\n\t\treturn remoteHead(pointer, this.identity, object.etag);\n\t}\n\n\tasync readSnapshot(reference: string, signal?: AbortSignal): Promise<Snapshot> {\n\t\trequireSnapshotReference(reference);\n\t\tconst expectedChecksum =\n\t\t\tthis.checksums.get(reference) ?? (await this.resolveChecksum(reference, signal));\n\t\tconst object = await new WebDavClient(this.config, signal).getBuffer(\n\t\t\tsnapshotPath(this.config, reference),\n\t\t);\n\t\tthrowIfAborted(signal);\n\t\tif (!object.value) throw new Error(`Snapshot not found: ${reference}`);\n\t\tif (!expectedChecksum || sha256(object.value) !== expectedChecksum) {\n\t\t\tthrow new Error(\"Remote snapshot checksum mismatch.\");\n\t\t}\n\t\tconst snapshot = await decodeSnapshot(object.value, { signal });\n\t\tif (snapshot.id !== reference || snapshot.profile !== this.config.destination.namespace) {\n\t\t\tthrow new Error(\"Remote snapshot identity mismatch.\");\n\t\t}\n\t\tvalidateSnapshotBundle(snapshot);\n\t\treturn snapshot;\n\t}\n\n\tasync publishSnapshot(\n\t\tsnapshot: Snapshot,\n\t\texpected: ExpectedRemoteHead,\n\t\toptions: PublishSnapshotOptions = {},\n\t): Promise<PublishSnapshotResult> {\n\t\tthrowIfAborted(options.signal);\n\t\tassertSnapshotIdentity(snapshot, this.config.destination.namespace);\n\t\tawait this.ensureAtomicConditions(options.signal);\n\t\tthrowIfAborted(options.signal);\n\t\tconst client = new WebDavClient(this.config, options.signal);\n\t\tawait client.ensureCollection(snapshotsPath(this.config));\n\t\tconst encoded = await encodeSnapshot(snapshot);\n\t\tthrowIfAborted(options.signal);\n\t\tconst pointer = pointerFor(this.config, snapshot, sha256(encoded));\n\t\tconst stagedPath = snapshotPath(this.config, snapshot.id);\n\t\ttry {\n\t\t\tawait client.putBuffer(stagedPath, encoded, \"application/gzip\", { ifAbsent: true });\n\t\t} catch (error) {\n\t\t\tif (!(error instanceof WebDavPreconditionError)) throw error;\n\t\t\tconst existing = await client.getBuffer(stagedPath);\n\t\t\tif (!existing.value || sha256(existing.value) !== pointer.sha256) {\n\t\t\t\tthrow new SyncBackendConflictError(\n\t\t\t\t\t`Immutable snapshot id already exists with different content: ${snapshot.id}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tconst currentObject = await client.getJson<LatestPointer>(latestPath(this.config));\n\t\tthrowIfAborted(options.signal);\n\t\tconst current = currentObject.missing\n\t\t\t? undefined\n\t\t\t: remoteHead(\n\t\t\t\t\trequirePointer(currentObject.value, this.config.destination.namespace),\n\t\t\t\t\tthis.identity,\n\t\t\t\t\tcurrentObject.etag,\n\t\t\t\t);\n\t\tif (!matchesExpected(current, expected)) {\n\t\t\tthrow new SyncBackendConflictError(\n\t\t\t\t\"Remote changed while pushing. Run /sync pull first, then retry.\",\n\t\t\t\t{\n\t\t\t\t\tcurrentHead: current,\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t\tconst condition = publicationCondition(currentObject, expected, this.identity);\n\t\tthrowIfAborted(options.signal);\n\t\toptions.onCommit?.();\n\t\tconst commitClient = new WebDavClient(\n\t\t\tthis.config,\n\t\t\tAbortSignal.timeout(this.postCommitTimeoutMs),\n\t\t\tthis.postCommitTimeoutMs,\n\t\t);\n\t\ttry {\n\t\t\tawait commitClient.putJson(latestPath(this.config), pointer, condition);\n\t\t} catch (error) {\n\t\t\tif (error instanceof WebDavPreconditionError) {\n\t\t\t\tconst latest = await this.readHeadAfterCommit(commitClient).catch(() => undefined);\n\t\t\t\tthrow new SyncBackendConflictError(\"Remote changed while publishing the WebDAV pointer.\", {\n\t\t\t\t\tcurrentHead: latest,\n\t\t\t\t});\n\t\t\t}\n\t\t\tthrow new SyncBackendPublicationOutcomeUnknownError(\n\t\t\t\t`Remote publication outcome is unknown: ${errorMessage(error)}`,\n\t\t\t\t{ cause: error },\n\t\t\t);\n\t\t}\n\t\tlet verifiedObject: RemoteObject<LatestPointer>;\n\t\ttry {\n\t\t\tverifiedObject = await commitClient.getJson<LatestPointer>(latestPath(this.config));\n\t\t} catch (error) {\n\t\t\tthrow new SyncBackendPublicationOutcomeUnknownError(\n\t\t\t\t`Remote snapshot may be active, but publication could not be verified: ${errorMessage(error)}`,\n\t\t\t\t{ cause: error },\n\t\t\t);\n\t\t}\n\t\tlet verified: LatestPointer;\n\t\ttry {\n\t\t\tverified = requirePointer(verifiedObject.value, this.config.destination.namespace);\n\t\t} catch (error) {\n\t\t\tthrow new SyncBackendPublicationOutcomeUnknownError(\n\t\t\t\t`Remote snapshot may be active, but publication verification was malformed: ${errorMessage(error)}`,\n\t\t\t\t{ cause: error },\n\t\t\t);\n\t\t}\n\t\tif (!samePointer(pointer, verified)) {\n\t\t\tthrow new SyncBackendConflictError(\n\t\t\t\t\"Remote latest changed immediately after push. Run /sync status before continuing.\",\n\t\t\t\t{\n\t\t\t\t\tphase: \"after-commit\",\n\t\t\t\t\tcurrentHead: remoteHead(verified, this.identity, verifiedObject.etag),\n\t\t\t\t\tcandidateMayHaveBeenActive: true,\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t\tif (!strongEtag(verifiedObject.etag)) {\n\t\t\tthrow new SyncBackendPublicationOutcomeUnknownError(\n\t\t\t\t\"Remote snapshot is active, but the WebDAV server returned no strong ETag.\",\n\t\t\t);\n\t\t}\n\t\tthis.registerChecksum(verified.snapshot, verified.sha256);\n\t\tconst head = remoteHead(verified, this.identity, verifiedObject.etag);\n\t\tconst warning = await this.updateHistorySafely(commitClient, pointer);\n\t\treturn { head, warnings: warning ? [warning] : [] };\n\t}\n\n\tasync listHistory(signal?: AbortSignal): Promise<RemoteHistoryEntry[]> {\n\t\tconst object = await new WebDavClient(this.config, signal).getJson<{\n\t\t\tversion: number;\n\t\t\tsnapshots: LatestPointer[];\n\t\t}>(historyPath(this.config));\n\t\tthrowIfAborted(signal);\n\t\tif (object.missing) return [];\n\t\tconst pointers = requireHistory(object.value, this.config.destination.namespace);\n\t\tfor (const pointer of pointers) this.registerChecksum(pointer.snapshot, pointer.sha256);\n\t\treturn pointers.map(remoteHistoryEntry);\n\t}\n\n\tasync diagnose(signal?: AbortSignal): Promise<BackendDiagnostic[]> {\n\t\tconst diagnostics: BackendDiagnostic[] = [\n\t\t\t{\n\t\t\t\tkey: \"webdav-url\",\n\t\t\t\tlevel: \"info\",\n\t\t\t\tmessage: `webdav URL/TLS/auth: configured (${webDavStorageLocation(this.config)})`,\n\t\t\t},\n\t\t];\n\t\ttry {\n\t\t\tawait this.runCapabilityProbe(signal);\n\t\t\tdiagnostics.push(\n\t\t\t\t{ key: \"webdav-collection\", level: \"info\", message: \"webdav collection read/write: ok\" },\n\t\t\t\t{\n\t\t\t\t\tkey: \"webdav-conditional\",\n\t\t\t\t\tlevel: \"info\",\n\t\t\t\t\tmessage: \"webdav conditional publication: atomic-conditional (verified)\",\n\t\t\t\t},\n\t\t\t\t{ key: \"webdav-cleanup\", level: \"info\", message: \"webdav probe cleanup: ok\" },\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tthis.capabilityCheck = undefined;\n\t\t\tthis.conditionalVerified = false;\n\t\t\tif (error instanceof Error && error.name === \"AbortError\") throw error;\n\t\t\tdiagnostics.push({\n\t\t\t\tkey: \"webdav-probe\",\n\t\t\t\tlevel: \"error\",\n\t\t\t\tmessage: `webdav publication is read-only until diagnostics pass: ${errorMessage(error)}`,\n\t\t\t});\n\t\t\treturn diagnostics;\n\t\t}\n\t\ttry {\n\t\t\tdiagnostics.push({\n\t\t\t\tkey: \"webdav-history\",\n\t\t\t\tlevel: \"info\",\n\t\t\t\tmessage: await this.reconcileActiveHistory(signal),\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tif (error instanceof Error && error.name === \"AbortError\") throw error;\n\t\t\tdiagnostics.push({\n\t\t\t\tkey: \"webdav-history\",\n\t\t\t\tlevel: \"error\",\n\t\t\t\tmessage: `webdav history repair failed: ${errorMessage(error)}`,\n\t\t\t});\n\t\t}\n\t\treturn diagnostics;\n\t}\n\n\tprivate ensureAtomicConditions(signal?: AbortSignal) {\n\t\tif (this.capabilityCheck) return this.capabilityCheck;\n\t\tthis.conditionalVerified = false;\n\t\tconst check = this.runCapabilityProbe(signal).finally(() => {\n\t\t\tif (this.capabilityCheck === check) this.capabilityCheck = undefined;\n\t\t});\n\t\tthis.capabilityCheck = check;\n\t\treturn check;\n\t}\n\n\tprivate async runCapabilityProbe(signal?: AbortSignal) {\n\t\tthrowIfAborted(signal);\n\t\tconst probeCollection = `${rootPath(this.config)}/.pi-sync-probes/${randomUUID()}`;\n\t\tconst probe = `${probeCollection}/conditional.txt`;\n\t\tconst client = new WebDavClient(this.config, signal);\n\t\tlet created = false;\n\t\tlet operationError: unknown;\n\t\ttry {\n\t\t\tcreated = true;\n\t\t\tawait client.ensureCollection(probeCollection);\n\t\t\tawait client.listCollection(probeCollection);\n\t\t\tawait client.putBuffer(probe, Buffer.from(\"first\"), \"text/plain\", { ifAbsent: true });\n\t\t\tconst read = await client.getBuffer(probe);\n\t\t\tconst etag = strongEtag(read.etag);\n\t\t\tif (!read.value || !etag) {\n\t\t\t\tthrow new Error(\"WebDAV server did not return a strong ETag for the capability probe.\");\n\t\t\t}\n\t\t\tawait expectPrecondition(\n\t\t\t\tclient.putBuffer(probe, Buffer.from(\"replace\"), \"text/plain\", { ifAbsent: true }),\n\t\t\t\t\"If-None-Match\",\n\t\t\t);\n\t\t\tawait expectPrecondition(\n\t\t\t\tclient.putBuffer(probe, Buffer.from(\"replace\"), \"text/plain\", {\n\t\t\t\t\tifMatch: '\"pi-sync-deliberately-stale\"',\n\t\t\t\t}),\n\t\t\t\t\"If-Match\",\n\t\t\t);\n\t\t\tconst unchanged = await client.getBuffer(probe);\n\t\t\tif (!unchanged.value?.equals(Buffer.from(\"first\"))) {\n\t\t\t\tthrow new Error(\"WebDAV server changed a probe despite a failed precondition.\");\n\t\t\t}\n\t\t\tawait client.putBuffer(probe, Buffer.from(\"second\"), \"text/plain\", { ifMatch: etag });\n\t\t\tconst changed = await client.getBuffer(probe);\n\t\t\tconst changedEtag = strongEtag(changed.etag);\n\t\t\tif (!changed.value?.equals(Buffer.from(\"second\")) || !changedEtag || changedEtag === etag) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"WebDAV server did not rotate its strong ETag after changing the capability probe.\",\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\toperationError = error;\n\t\t}\n\t\tif (created) {\n\t\t\ttry {\n\t\t\t\tawait new WebDavClient(this.config, undefined).delete(probeCollection);\n\t\t\t} catch (cleanupError) {\n\t\t\t\tconst operationDetail = operationError\n\t\t\t\t\t? `WebDAV probe failed: ${errorMessage(operationError)}; `\n\t\t\t\t\t: \"\";\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`${operationDetail}probe cleanup also failed; remove ${probeCollection}: ${errorMessage(cleanupError)}`,\n\t\t\t\t\t{ cause: operationError ?? cleanupError },\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tif (operationError) throw operationError;\n\t\tthis.conditionalVerified = true;\n\t}\n\n\tprivate async resolveChecksum(reference: string, signal?: AbortSignal) {\n\t\tawait this.readHead(signal);\n\t\tif (this.checksums.has(reference)) return this.checksums.get(reference);\n\t\tawait this.listHistory(signal);\n\t\treturn this.checksums.get(reference);\n\t}\n\n\tprivate registerChecksum(reference: string, checksum: string) {\n\t\tconst known = this.checksums.get(reference);\n\t\tif (known && known !== checksum) {\n\t\t\tthrow new Error(\"Remote snapshot reference was rebound to a different checksum.\");\n\t\t}\n\t\tthis.checksums.set(reference, checksum);\n\t}\n\n\tprivate async readHeadAfterCommit(client: WebDavClient) {\n\t\tconst object = await client.getJson<LatestPointer>(latestPath(this.config));\n\t\tif (object.missing) return undefined;\n\t\treturn remoteHead(\n\t\t\trequirePointer(object.value, this.config.destination.namespace),\n\t\t\tthis.identity,\n\t\t\tobject.etag,\n\t\t);\n\t}\n\n\tprivate async reconcileActiveHistory(signal?: AbortSignal) {\n\t\tconst client = new WebDavClient(this.config, signal);\n\t\tconst object = await client.getJson<LatestPointer>(latestPath(this.config));\n\t\tthrowIfAborted(signal);\n\t\tif (object.missing) return \"webdav history: no active snapshot\";\n\t\tconst pointer = requirePointer(object.value, this.config.destination.namespace);\n\t\tthis.registerChecksum(pointer.snapshot, pointer.sha256);\n\t\tconst repaired = await this.ensureHistoryPointer(client, pointer);\n\t\treturn repaired\n\t\t\t? \"webdav history: repaired active snapshot entry\"\n\t\t\t: \"webdav history: active snapshot entry present\";\n\t}\n\n\tprivate async ensureHistoryPointer(client: WebDavClient, pointer: LatestPointer) {\n\t\tconst object = await client.getJson<{ version: number; snapshots: LatestPointer[] }>(\n\t\t\thistoryPath(this.config),\n\t\t);\n\t\tconst snapshots = object.missing\n\t\t\t? []\n\t\t\t: requireHistory(object.value, this.config.destination.namespace);\n\t\tconst existing = snapshots.find((entry) => entry.snapshot === pointer.snapshot);\n\t\tif (existing) {\n\t\t\tif (!samePointer(existing, pointer)) {\n\t\t\t\tthrow new Error(\"Remote history rebound an immutable snapshot reference.\");\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\tconst next = [...snapshots, pointer].slice(-100);\n\t\tconst condition = object.missing\n\t\t\t? { ifAbsent: true }\n\t\t\t: { ifMatch: requireStrongEtag(object.etag, \"history\") };\n\t\tawait client.putJson(\n\t\t\thistoryPath(this.config),\n\t\t\t{ version: VERSION, snapshots: next },\n\t\t\tcondition,\n\t\t);\n\t\treturn true;\n\t}\n\n\tprivate async updateHistorySafely(client: WebDavClient, pointer: LatestPointer) {\n\t\ttry {\n\t\t\tawait this.ensureHistoryPointer(client, pointer);\n\t\t\treturn undefined;\n\t\t} catch (error) {\n\t\t\treturn `Remote snapshot is active, but history could not be updated: ${errorMessage(error)}. Run /sync doctor before relying on history.`;\n\t\t}\n\t}\n}\n\nexport function rootPath(config: ResolvedWebDavBackend) {\n\treturn config.destination.path;\n}\n\nexport function latestPath(config: ResolvedWebDavBackend) {\n\treturn joinRemote(rootPath(config), \"latest.json\");\n}\n\nexport function historyPath(config: ResolvedWebDavBackend) {\n\treturn joinRemote(rootPath(config), \"history.json\");\n}\n\nexport function snapshotsPath(config: ResolvedWebDavBackend) {\n\treturn joinRemote(rootPath(config), \"snapshots\");\n}\n\nexport function snapshotPath(config: ResolvedWebDavBackend, reference: string) {\n\trequireSnapshotReference(reference);\n\treturn joinRemote(snapshotsPath(config), `${reference}.json.gz`);\n}\n\nexport function webDavBackendIdentity(config: ResolvedWebDavBackend) {\n\treturn `webdav:${sha256(\n\t\tBuffer.from(JSON.stringify([secretFreeUrl(config.profile.url), config.destination.path])),\n\t)}`;\n}\n\nfunction webDavStorageLocation(config: ResolvedWebDavBackend) {\n\tconst url = new URL(secretFreeUrl(config.profile.url));\n\treturn `${url.host} \u00B7 ${rootPath(config)}`;\n}\n\nfunction pointerFor(\n\tconfig: ResolvedWebDavBackend,\n\tsnapshot: Snapshot,\n\tchecksum: string,\n): LatestPointer {\n\treturn {\n\t\tversion: VERSION,\n\t\tprofile: config.destination.namespace,\n\t\tsnapshot: snapshot.id,\n\t\tsha256: checksum,\n\t\tcreatedAt: snapshot.createdAt,\n\t\tmachine: snapshot.machine,\n\t\tsyncSessions:\n\t\t\tsnapshot.syncSessions === true ||\n\t\t\tsnapshot.files.some((file) => file.path.startsWith(\"sessions/\")),\n\t\t...(snapshot.selection === undefined ? {} : { selection: snapshot.selection }),\n\t};\n}\n\nfunction remoteHead(pointer: LatestPointer, identity: string, etag?: string): RemoteHead {\n\treturn {\n\t\tsnapshotRef: pointer.snapshot,\n\t\tsnapshotId: pointer.snapshot,\n\t\trevision: encodeRevision(identity, etag, pointer),\n\t\tcreatedAt: pointer.createdAt,\n\t\tmachine: pointer.machine,\n\t\tsyncSessions: pointer.syncSessions === true,\n\t\t...(pointer.selection === undefined ? {} : { selection: pointer.selection }),\n\t};\n}\n\nfunction encodeRevision(identity: string, etag: string | undefined, pointer: LatestPointer) {\n\treturn `webdav-v1:${Buffer.from(JSON.stringify({ identity, etag: etag ?? null, pointer: sha256(Buffer.from(canonicalJson(pointer))) })).toString(\"base64url\")}`;\n}\n\nfunction decodeRevision(value: string, identity: string) {\n\ttry {\n\t\tif (!value.startsWith(\"webdav-v1:\")) return undefined;\n\t\tconst parsed = JSON.parse(Buffer.from(value.slice(10), \"base64url\").toString(\"utf8\")) as {\n\t\t\tidentity?: unknown;\n\t\t\tetag?: unknown;\n\t\t};\n\t\tif (parsed.identity !== identity || typeof parsed.etag !== \"string\") return undefined;\n\t\treturn strongEtag(parsed.etag);\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction publicationCondition(\n\tcurrent: RemoteObject<LatestPointer>,\n\texpected: ExpectedRemoteHead,\n\tidentity: string,\n) {\n\tif (expected.kind === \"missing\") return { ifAbsent: true };\n\tconst etag = decodeRevision(expected.revision, identity) ?? strongEtag(current.etag);\n\tif (!etag) throw new SyncBackendConflictError(\"WebDAV head has no usable strong ETag.\");\n\treturn { ifMatch: etag };\n}\n\nasync function expectPrecondition(operation: Promise<unknown>, header: string) {\n\ttry {\n\t\tawait operation;\n\t} catch (error) {\n\t\tif (error instanceof WebDavPreconditionError) return;\n\t\tthrow error;\n\t}\n\tthrow new Error(`WebDAV server ignored ${header}; publication is read-only for safety.`);\n}\n\nfunction requireStrongEtag(value: string | undefined, resource: string) {\n\tconst etag = strongEtag(value);\n\tif (!etag) throw new Error(`WebDAV ${resource} has no strong ETag.`);\n\treturn etag;\n}\n\nfunction strongEtag(value: string | undefined) {\n\treturn value && !value.startsWith(\"W/\") && /^\"[^\"\\r\\n]+\"$/u.test(value) ? value : undefined;\n}\n\nfunction requirePointer(value: LatestPointer | undefined, expectedProfile: string) {\n\tif (\n\t\t!value ||\n\t\tvalue.version !== VERSION ||\n\t\tvalue.profile !== expectedProfile ||\n\t\t!isSafeReference(value.snapshot) ||\n\t\t!/^[0-9a-f]{64}$/u.test(value.sha256) ||\n\t\t!isSafeMetadata(value.createdAt, 64) ||\n\t\t!isSafeMetadata(value.machine, 256) ||\n\t\t(value.syncSessions !== undefined && typeof value.syncSessions !== \"boolean\")\n\t) {\n\t\tthrow new Error(\"Remote latest pointer is malformed.\");\n\t}\n\tif (value.selection !== undefined) portableSnapshotSelection(value.selection);\n\treturn value;\n}\n\nfunction requireHistory(\n\tvalue: { version: number; snapshots: LatestPointer[] } | undefined,\n\texpectedProfile: string,\n) {\n\tif (!value || value.version !== VERSION || !Array.isArray(value.snapshots)) {\n\t\tthrow new Error(\"Remote history is malformed.\");\n\t}\n\tconst pointers = value.snapshots.map((item) => requirePointer(item, expectedProfile));\n\tif (new Set(pointers.map((item) => item.snapshot)).size !== pointers.length) {\n\t\tthrow new Error(\"Remote history contains duplicate snapshot references.\");\n\t}\n\treturn pointers;\n}\n\nfunction remoteHistoryEntry(pointer: LatestPointer): RemoteHistoryEntry {\n\treturn {\n\t\tsnapshotRef: pointer.snapshot,\n\t\tsnapshotId: pointer.snapshot,\n\t\tcreatedAt: pointer.createdAt,\n\t\tmachine: pointer.machine,\n\t\tsyncSessions: pointer.syncSessions === true,\n\t};\n}\n\nfunction assertSnapshotIdentity(snapshot: Snapshot, namespace: string) {\n\tif (\n\t\tsnapshot.version !== VERSION ||\n\t\tsnapshot.profile !== namespace ||\n\t\t!isSafeReference(snapshot.id) ||\n\t\t!isSafeMetadata(snapshot.createdAt, 64) ||\n\t\t!isSafeMetadata(snapshot.machine, 256) ||\n\t\t!Array.isArray(snapshot.files)\n\t) {\n\t\tthrow new Error(\"Invalid snapshot identity for WebDAV publication.\");\n\t}\n}\n\nfunction validateSnapshotBundle(snapshot: Snapshot) {\n\tconst paths = new Set<string>();\n\tfor (const file of snapshot.files) {\n\t\tif (\n\t\t\t!file ||\n\t\t\t!isSafeSnapshotPath(file.path) ||\n\t\t\tpaths.has(file.path) ||\n\t\t\ttypeof file.contentBase64 !== \"string\" ||\n\t\t\ttypeof file.sha256 !== \"string\"\n\t\t) {\n\t\t\tthrow new Error(\"Remote snapshot bundle is malformed.\");\n\t\t}\n\t\tconst content = Buffer.from(file.contentBase64, \"base64\");\n\t\tif (content.toString(\"base64\") !== file.contentBase64 || sha256(content) !== file.sha256) {\n\t\t\tthrow new Error(\"Remote snapshot bundle is malformed.\");\n\t\t}\n\t\tpaths.add(file.path);\n\t}\n}\n\nfunction isSafeSnapshotPath(value: unknown): value is string {\n\tif (typeof value !== \"string\" || !value || value.length > 4096 || value.includes(\"\\\\\")) {\n\t\treturn false;\n\t}\n\tif (\n\t\t[...value].some((character) => {\n\t\t\tconst code = character.codePointAt(0) ?? 0;\n\t\t\treturn code < 0x20 || (code >= 0x7f && code <= 0x9f);\n\t\t})\n\t) {\n\t\treturn false;\n\t}\n\treturn value.split(\"/\").every((segment) => segment && segment !== \".\" && segment !== \"..\");\n}\n\nfunction assertSafeDestination(config: ResolvedWebDavBackend) {\n\tconst url = new URL(config.profile.url);\n\tif (url.username || url.password || url.search || url.hash)\n\t\tthrow new Error(\"Invalid WebDAV URL.\");\n\tfor (const value of [config.destination.path, config.destination.namespace]) {\n\t\tif (\n\t\t\t!value ||\n\t\t\tvalue.includes(\"\\\\\") ||\n\t\t\t[...value].some((character) => {\n\t\t\t\tconst code = character.codePointAt(0) ?? 0;\n\t\t\t\treturn code < 0x20 || (code >= 0x7f && code <= 0x9f);\n\t\t\t}) ||\n\t\t\tvalue.split(\"/\").some((part) => part === \".\" || part === \"..\")\n\t\t) {\n\t\t\tthrow new Error(\"Invalid WebDAV storage location.\");\n\t\t}\n\t}\n}\n\nfunction isSafeMetadata(value: unknown, maxLength: number): value is string {\n\treturn (\n\t\ttypeof value === \"string\" &&\n\t\tvalue.length > 0 &&\n\t\tvalue.length <= maxLength &&\n\t\t![...value].some((character) => {\n\t\t\tconst code = character.codePointAt(0) ?? 0;\n\t\t\treturn code < 0x20 || (code >= 0x7f && code <= 0x9f);\n\t\t})\n\t);\n}\n\nfunction requireSnapshotReference(reference: string) {\n\tif (!isSafeReference(reference)) throw new Error(\"Invalid WebDAV snapshot reference.\");\n}\n\nfunction isSafeReference(value: string) {\n\treturn (\n\t\t!!value &&\n\t\tvalue.length <= 512 &&\n\t\t// biome-ignore lint/suspicious/noControlCharactersInRegex: Remote references cannot contain terminal controls.\n\t\t!/[\\\\/\\u0000-\\u001f\\u007f-\\u009f]/u.test(value) &&\n\t\tvalue !== \".\" &&\n\t\tvalue !== \"..\"\n\t);\n}\n\nfunction matchesExpected(head: RemoteHead | undefined, expected: ExpectedRemoteHead) {\n\treturn expected.kind === \"missing\" ? head === undefined : head?.revision === expected.revision;\n}\n\nfunction samePointer(left: LatestPointer, right: LatestPointer) {\n\treturn canonicalJson(left) === canonicalJson(right);\n}\n\nfunction canonicalJson(value: unknown): string {\n\tif (Array.isArray(value))\n\t\treturn JSON.stringify(value.map((item) => JSON.parse(canonicalJson(item))));\n\tif (!value || typeof value !== \"object\") return JSON.stringify(value);\n\treturn JSON.stringify(\n\t\tObject.fromEntries(\n\t\t\tObject.keys(value)\n\t\t\t\t.sort()\n\t\t\t\t.map((key) => [key, JSON.parse(canonicalJson((value as Record<string, unknown>)[key]))]),\n\t\t),\n\t);\n}\n\nfunction joinRemote(...parts: string[]) {\n\treturn parts\n\t\t.flatMap((part) => part.split(\"/\"))\n\t\t.filter(Boolean)\n\t\t.join(\"/\");\n}\n\nfunction secretFreeUrl(value: string) {\n\tconst url = new URL(value);\n\turl.username = \"\";\n\turl.password = \"\";\n\turl.search = \"\";\n\turl.hash = \"\";\n\treturn url.toString();\n}\n\nfunction sha256(value: Buffer) {\n\treturn createHash(\"sha256\").update(value).digest(\"hex\");\n}\n\nfunction throwIfAborted(signal?: AbortSignal) {\n\tif (!signal?.aborted) return;\n\tthrow signal.reason instanceof Error\n\t\t? signal.reason\n\t\t: new DOMException(\"The operation was aborted\", \"AbortError\");\n}\n\nfunction errorMessage(error: unknown) {\n\tif (error instanceof WebDavHttpError) return error.message;\n\treturn error instanceof Error ? error.message : String(error);\n}\n", "import { XMLParser } from \"fast-xml-parser\";\nimport type { RemoteObject, ResolvedWebDavBackend } from \"./types.js\";\n\nconst JSON_LIMIT = 1024 * 1024;\nconst ERROR_LIMIT = 64 * 1024;\nconst SNAPSHOT_LIMIT = 256 * 1024 * 1024;\nconst XML_LIMIT = 1024 * 1024;\nconst REQUEST_TIMEOUT_MS = 30_000;\nconst MAX_REDIRECTS = 3;\n\nexport interface WebDavPutOptions {\n\tifAbsent?: boolean;\n\tifMatch?: string;\n}\n\nexport interface WebDavEntry {\n\thref: string;\n\tetag?: string;\n\tcollection: boolean;\n}\n\nexport class WebDavHttpError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\treadonly status: number,\n\t\toptions?: ErrorOptions,\n\t) {\n\t\tsuper(message, options);\n\t\tthis.name = \"WebDavHttpError\";\n\t}\n}\n\nexport class WebDavPreconditionError extends WebDavHttpError {\n\tconstructor(message = \"WebDAV precondition failed.\") {\n\t\tsuper(message, 412);\n\t\tthis.name = \"WebDavPreconditionError\";\n\t}\n}\n\nexport class WebDavClient {\n\tprivate readonly baseUrl: URL;\n\tprivate readonly authorization: string;\n\n\tconstructor(\n\t\tprivate readonly config: ResolvedWebDavBackend,\n\t\tprivate readonly signal?: AbortSignal,\n\t\tprivate readonly timeoutMs = REQUEST_TIMEOUT_MS,\n\t) {\n\t\tthis.baseUrl = new URL(config.profile.url);\n\t\tassertSafeAuthenticatedUrl(this.baseUrl);\n\t\tif (\n\t\t\t!config.profile.username ||\n\t\t\t!config.profile.password ||\n\t\t\tconfig.profile.username.includes(\":\") ||\n\t\t\thasControlCharacter(config.profile.username) ||\n\t\t\thasControlCharacter(config.profile.password)\n\t\t) {\n\t\t\tthrow new Error(\"Invalid WebDAV credentials.\");\n\t\t}\n\t\tthis.authorization = `Basic ${Buffer.from(`${config.profile.username}:${config.profile.password}`).toString(\"base64\")}`;\n\t}\n\n\tasync getBuffer(remotePath: string): Promise<RemoteObject<Buffer>> {\n\t\tconst response = await this.request(remotePath, { method: \"GET\" });\n\t\tif (response.status === 404) {\n\t\t\tawait response.body?.cancel();\n\t\t\treturn { missing: true };\n\t\t}\n\t\tawait this.requireOk(response, \"read\");\n\t\treturn {\n\t\t\tvalue: await readBounded(response, SNAPSHOT_LIMIT, \"WebDAV response is too large\"),\n\t\t\tetag: response.headers.get(\"etag\") ?? undefined,\n\t\t\tmissing: false,\n\t\t};\n\t}\n\n\tasync getJson<T>(remotePath: string): Promise<RemoteObject<T>> {\n\t\tconst response = await this.request(remotePath, { method: \"GET\" });\n\t\tif (response.status === 404) {\n\t\t\tawait response.body?.cancel();\n\t\t\treturn { missing: true };\n\t\t}\n\t\tawait this.requireOk(response, \"read\");\n\t\tconst bytes = await readBounded(response, JSON_LIMIT, \"WebDAV JSON response is too large\");\n\t\ttry {\n\t\t\treturn {\n\t\t\t\tvalue: JSON.parse(bytes.toString(\"utf8\")) as T,\n\t\t\t\tetag: response.headers.get(\"etag\") ?? undefined,\n\t\t\t\tmissing: false,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tthrow new Error(\"WebDAV JSON response is malformed.\", { cause: error });\n\t\t}\n\t}\n\n\tasync putBuffer(\n\t\tremotePath: string,\n\t\tbody: Buffer,\n\t\tcontentType: string,\n\t\toptions: WebDavPutOptions = {},\n\t) {\n\t\tconst headers: Record<string, string> = { \"content-type\": contentType };\n\t\tif (options.ifAbsent) headers[\"if-none-match\"] = \"*\";\n\t\tif (options.ifMatch) headers[\"if-match\"] = options.ifMatch;\n\t\tconst response = await this.request(remotePath, {\n\t\t\tmethod: \"PUT\",\n\t\t\theaders,\n\t\t\tbody: body as unknown as BodyInit,\n\t\t});\n\t\tif (response.status === 412) {\n\t\t\tawait response.body?.cancel();\n\t\t\tthrow new WebDavPreconditionError();\n\t\t}\n\t\tawait this.requireOk(response, \"write\");\n\t\tawait response.body?.cancel();\n\t\treturn response.headers.get(\"etag\") ?? undefined;\n\t}\n\n\tasync putJson(remotePath: string, value: unknown, options: WebDavPutOptions = {}) {\n\t\treturn this.putBuffer(\n\t\t\tremotePath,\n\t\t\tBuffer.from(JSON.stringify(value)),\n\t\t\t\"application/json\",\n\t\t\toptions,\n\t\t);\n\t}\n\n\tasync makeCollection(remotePath: string) {\n\t\tconst response = await this.request(remotePath, { method: \"MKCOL\" });\n\t\tif (response.status === 405) {\n\t\t\tawait response.body?.cancel();\n\t\t\treturn false;\n\t\t}\n\t\tawait this.requireOk(response, \"create collection\");\n\t\tawait response.body?.cancel();\n\t\treturn true;\n\t}\n\n\tasync ensureCollection(remotePath: string) {\n\t\tconst segments = safeSegments(remotePath);\n\t\tfor (let index = 1; index <= segments.length; index += 1) {\n\t\t\tawait this.makeCollection(segments.slice(0, index).join(\"/\"));\n\t\t}\n\t}\n\n\tasync listCollection(remotePath: string): Promise<WebDavEntry[]> {\n\t\tconst response = await this.request(remotePath, {\n\t\t\tmethod: \"PROPFIND\",\n\t\t\theaders: { depth: \"1\", \"content-type\": \"application/xml; charset=utf-8\" },\n\t\t\tbody: '<?xml version=\"1.0\"?><d:propfind xmlns:d=\"DAV:\"><d:prop><d:getetag/><d:resourcetype/></d:prop></d:propfind>',\n\t\t});\n\t\tif (response.status === 404) {\n\t\t\tawait response.body?.cancel();\n\t\t\tthrow new WebDavHttpError(\"WebDAV collection is missing.\", 404);\n\t\t}\n\t\tif (response.status !== 207) await this.requireOk(response, \"list collection\");\n\t\tconst xml = (\n\t\t\tawait readBounded(response, XML_LIMIT, \"WebDAV directory response is too large\")\n\t\t).toString(\"utf8\");\n\t\ttry {\n\t\t\tconst parsed = new XMLParser({\n\t\t\t\tremoveNSPrefix: true,\n\t\t\t\tignoreAttributes: false,\n\t\t\t\tprocessEntities: false,\n\t\t\t}).parse(xml) as {\n\t\t\t\tmultistatus?: { response?: unknown };\n\t\t\t};\n\t\t\tif (!parsed.multistatus || parsed.multistatus.response === undefined) {\n\t\t\t\tthrow new Error(\"Missing DAV multistatus response.\");\n\t\t\t}\n\t\t\tconst responses = asArray(parsed.multistatus.response);\n\t\t\treturn responses.map(parseEntry);\n\t\t} catch (error) {\n\t\t\tthrow new Error(\"WebDAV directory response is malformed.\", { cause: error });\n\t\t}\n\t}\n\n\tasync delete(remotePath: string) {\n\t\tconst response = await this.request(remotePath, { method: \"DELETE\" });\n\t\tif (response.status === 404) {\n\t\t\tawait response.body?.cancel();\n\t\t\treturn;\n\t\t}\n\t\tif (response.status === 207) {\n\t\t\tawait response.body?.cancel();\n\t\t\tthrow new WebDavHttpError(\"WebDAV probe cleanup returned a partial response.\", 207);\n\t\t}\n\t\tawait this.requireOk(response, \"delete probe resource\");\n\t\tawait response.body?.cancel();\n\t}\n\n\tprivate async request(remotePath: string, init: RequestInit) {\n\t\tthrowIfAborted(this.signal);\n\t\tlet url = appendRemotePath(this.baseUrl, remotePath);\n\t\tfor (let redirects = 0; ; redirects += 1) {\n\t\t\tconst timeout = AbortSignal.timeout(this.timeoutMs);\n\t\t\tconst signal = this.signal ? AbortSignal.any([this.signal, timeout]) : timeout;\n\t\t\tlet response: Response;\n\t\t\ttry {\n\t\t\t\tresponse = await fetch(url, {\n\t\t\t\t\t...init,\n\t\t\t\t\theaders: {\n\t\t\t\t\t\taccept: \"*/*\",\n\t\t\t\t\t\tauthorization: this.authorization,\n\t\t\t\t\t\t...headersObject(init.headers),\n\t\t\t\t\t},\n\t\t\t\t\tredirect: \"manual\",\n\t\t\t\t\tsignal,\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tthrowIfAborted(this.signal);\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`WebDAV ${String(init.method ?? \"GET\")} request failed for ${redactText(safeUrl(url), this.config)}.`,\n\t\t\t\t\t{\n\t\t\t\t\t\tcause: redactError(error, this.config),\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (![301, 302, 303, 307, 308].includes(response.status)) return response;\n\t\t\tawait response.body?.cancel();\n\t\t\tconst method = String(init.method ?? \"GET\").toUpperCase();\n\t\t\tif ([301, 302, 303].includes(response.status) && method !== \"GET\" && method !== \"HEAD\") {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`WebDAV refused an ambiguous HTTP ${response.status} redirect for ${method}; configure the canonical collection URL or require HTTP 307/308.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (redirects >= MAX_REDIRECTS) throw new Error(\"WebDAV redirect limit exceeded.\");\n\t\t\tconst location = response.headers.get(\"location\");\n\t\t\tif (!location) throw new Error(\"WebDAV redirect is missing Location.\");\n\t\t\tconst next = new URL(location, url);\n\t\t\tif (next.origin !== this.baseUrl.origin) {\n\t\t\t\tthrow new Error(\"WebDAV refused a cross-origin authenticated redirect.\");\n\t\t\t}\n\t\t\turl = next;\n\t\t}\n\t}\n\n\tprivate async requireOk(response: Response, action: string) {\n\t\tif (response.ok) return;\n\t\tconst body = (await readBounded(response, ERROR_LIMIT, \"WebDAV error body is too large\"))\n\t\t\t.toString(\"utf8\")\n\t\t\t// biome-ignore lint/suspicious/noControlCharactersInRegex: Remote error text is untrusted terminal input.\n\t\t\t.replace(/[\\u0000-\\u001f\\u007f-\\u009f]/gu, \" \")\n\t\t\t.trim();\n\t\tconst detail = body ? `: ${redactText(body, this.config)}` : \"\";\n\t\tthrow new WebDavHttpError(\n\t\t\t`WebDAV ${action} failed with HTTP ${response.status}${detail}`,\n\t\t\tresponse.status,\n\t\t);\n\t}\n}\n\nfunction assertSafeAuthenticatedUrl(url: URL) {\n\tconst loopback =\n\t\turl.hostname === \"127.0.0.1\" ||\n\t\turl.hostname === \"localhost\" ||\n\t\turl.hostname === \"[::1]\" ||\n\t\turl.hostname === \"::1\";\n\tif (\n\t\turl.username ||\n\t\turl.password ||\n\t\turl.search ||\n\t\turl.hash ||\n\t\t(url.protocol !== \"https:\" && !(url.protocol === \"http:\" && loopback))\n\t) {\n\t\tthrow new Error(\n\t\t\t\"Invalid WebDAV URL: HTTPS is required and embedded credentials, query, or fragment are not allowed.\",\n\t\t);\n\t}\n}\n\nfunction hasControlCharacter(value: string) {\n\treturn [...value].some((character) => {\n\t\tconst code = character.codePointAt(0) ?? 0;\n\t\treturn code < 0x20 || (code >= 0x7f && code <= 0x9f);\n\t});\n}\n\nfunction appendRemotePath(base: URL, remotePath: string) {\n\tconst url = new URL(base);\n\tconst suffix = safeSegments(remotePath).map(encodeURIComponent).join(\"/\");\n\turl.pathname = `${base.pathname.replace(/\\/+$/u, \"\")}/${suffix}`;\n\treturn url;\n}\n\nfunction safeSegments(value: string) {\n\tconst segments = value\n\t\t.replace(/^\\/+|\\/+$/gu, \"\")\n\t\t.split(\"/\")\n\t\t.filter(Boolean);\n\tif (\n\t\tsegments.some(\n\t\t\t(segment) =>\n\t\t\t\tsegment === \".\" ||\n\t\t\t\tsegment === \"..\" ||\n\t\t\t\t// biome-ignore lint/suspicious/noControlCharactersInRegex: Remote path segments cannot contain controls.\n\t\t\t\t/[\\u0000-\\u001f]/u.test(segment),\n\t\t)\n\t) {\n\t\tthrow new Error(\"Invalid WebDAV remote path.\");\n\t}\n\treturn segments;\n}\n\nasync function readBounded(response: Response, limit: number, message: string) {\n\tconst length = Number(response.headers.get(\"content-length\"));\n\tif (Number.isFinite(length) && length > limit) {\n\t\tawait response.body?.cancel();\n\t\tthrow new Error(message);\n\t}\n\tif (!response.body) return Buffer.alloc(0);\n\tconst reader = response.body.getReader();\n\tconst chunks: Buffer[] = [];\n\tlet total = 0;\n\ttry {\n\t\twhile (true) {\n\t\t\tconst { done, value } = await reader.read();\n\t\t\tif (done) break;\n\t\t\ttotal += value.byteLength;\n\t\t\tif (total > limit) throw new Error(message);\n\t\t\tchunks.push(Buffer.from(value));\n\t\t}\n\t} catch (error) {\n\t\tawait reader.cancel().catch(() => undefined);\n\t\tthrow error;\n\t}\n\treturn Buffer.concat(chunks, total);\n}\n\nfunction parseEntry(value: unknown): WebDavEntry {\n\tif (!value || typeof value !== \"object\") throw new Error(\"Invalid WebDAV response entry.\");\n\tconst record = value as Record<string, unknown>;\n\tconst href = typeof record.href === \"string\" ? record.href : undefined;\n\tif (!href) throw new Error(\"Invalid WebDAV response href.\");\n\tconst propstat = asArray(record.propstat).find((item) => {\n\t\tif (!item || typeof item !== \"object\") return false;\n\t\treturn String((item as Record<string, unknown>).status ?? \"\").includes(\" 200 \");\n\t}) as Record<string, unknown> | undefined;\n\tconst prop = propstat?.prop as Record<string, unknown> | undefined;\n\treturn {\n\t\thref,\n\t\tetag: typeof prop?.getetag === \"string\" ? prop.getetag : undefined,\n\t\tcollection:\n\t\t\t!!prop?.resourcetype &&\n\t\t\ttypeof prop.resourcetype === \"object\" &&\n\t\t\tObject.hasOwn(prop.resourcetype, \"collection\"),\n\t};\n}\n\nfunction asArray(value: unknown): unknown[] {\n\tif (value === undefined) return [];\n\treturn Array.isArray(value) ? value : [value];\n}\n\nfunction headersObject(headers: HeadersInit | undefined) {\n\treturn Object.fromEntries(new Headers(headers).entries());\n}\n\nfunction safeUrl(url: URL) {\n\treturn `${url.protocol}//${url.host}${url.pathname}`;\n}\n\nfunction redactError(error: unknown, config: ResolvedWebDavBackend) {\n\tconst message = error instanceof Error ? error.message : String(error);\n\treturn new Error(redactText(message, config));\n}\n\nfunction redactText(value: string, config: ResolvedWebDavBackend) {\n\tlet result = value;\n\tfor (const secret of [config.profile.username, config.profile.password, config.profile.url]) {\n\t\tif (!secret) continue;\n\t\tfor (const variant of new Set([secret, encodeURIComponent(secret)])) {\n\t\t\tresult = result.replace(new RegExp(escapeRegExp(variant), \"giu\"), \"[redacted]\");\n\t\t}\n\t}\n\treturn result\n\t\t.replace(/basic\\s+[a-z0-9+/=]+/giu, \"Basic [redacted]\")\n\t\t.replace(/\\?[^\\s]*/gu, \"?[redacted]\");\n}\n\nfunction escapeRegExp(value: string) {\n\treturn value.replace(/[.*+?^${}()|[\\]\\\\]/gu, \"\\\\$&\");\n}\n\nfunction throwIfAborted(signal?: AbortSignal) {\n\tif (!signal?.aborted) return;\n\tthrow signal.reason instanceof Error\n\t\t? signal.reason\n\t\t: new DOMException(\"The operation was aborted\", \"AbortError\");\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["throwIfAborted"]
|
|
7
|
+
}
|