(fileBlob: Blob, filename: string)
| 1082 | } |
| 1083 | |
| 1084 | async function uploadToWebdav(fileBlob: Blob, filename: string): Promise<string> { |
| 1085 | const { webdavUrl, webdavServerType, webdavDirectory } = settings.store as { |
| 1086 | webdavUrl?: string; |
| 1087 | webdavServerType?: string; |
| 1088 | webdavDirectory?: string; |
| 1089 | }; |
| 1090 | |
| 1091 | if (!webdavUrl) { |
| 1092 | throw new Error("WebDAV server URL is required"); |
| 1093 | } |
| 1094 | |
| 1095 | const authHeader = buildWebdavAuthHeader(); |
| 1096 | const baseUrl = webdavUrl.replace(/\/+$/, ""); |
| 1097 | const dir = (webdavDirectory || "").replace(/^\/+|\/+$/g, ""); |
| 1098 | const relativePath = dir ? `${dir}/${filename}` : filename; |
| 1099 | const encodedDir = dir ? dir.split("/").map(encodeURIComponent).join("/") + "/" : ""; |
| 1100 | const uploadUrl = `${baseUrl}/${encodedDir}${encodeURIComponent(filename)}`; |
| 1101 | const serverType = webdavServerType || "nextcloud"; |
| 1102 | |
| 1103 | const requestHeaders: Record<string, string> = { |
| 1104 | "Content-Type": fileBlob.type || "application/octet-stream" |
| 1105 | }; |
| 1106 | if (authHeader) { |
| 1107 | requestHeaders.Authorization = authHeader; |
| 1108 | } |
| 1109 | |
| 1110 | if (Native) { |
| 1111 | const arrayBuffer = await fileBlob.arrayBuffer(); |
| 1112 | const result = await Native.uploadToWebdav(arrayBuffer, uploadUrl, requestHeaders); |
| 1113 | if (!result.success) { |
| 1114 | throw new Error(result.error || "Upload failed"); |
| 1115 | } |
| 1116 | } else { |
| 1117 | const response = await uploadRequestWithTimeout(uploadUrl, { |
| 1118 | method: "PUT", |
| 1119 | headers: requestHeaders, |
| 1120 | body: fileBlob |
| 1121 | }); |
| 1122 | |
| 1123 | if (!response.ok) { |
| 1124 | const errorText = await response.text(); |
| 1125 | throw new Error(`Upload failed: ${response.status} ${errorText}`); |
| 1126 | } |
| 1127 | } |
| 1128 | |
| 1129 | if (serverType === "generic") { |
| 1130 | return uploadUrl; |
| 1131 | } |
| 1132 | |
| 1133 | let serverOrigin: string; |
| 1134 | try { |
| 1135 | serverOrigin = new URL(webdavUrl).origin; |
| 1136 | } catch { |
| 1137 | throw new Error("Invalid WebDAV server URL"); |
| 1138 | } |
| 1139 | return await createWebdavShare(relativePath, serverOrigin, filename); |
| 1140 | } |
| 1141 |
no test coverage detected