12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- import { STORAGE_KEY } from "@/app/constant";
- import { SyncStore } from "@/app/store/sync";
- import { corsFetch } from "../cors";
- export type WebDAVConfig = SyncStore["webdav"];
- export type WebDavClient = ReturnType<typeof createWebDavClient>;
- export function createWebDavClient(store: SyncStore) {
- const folder = STORAGE_KEY;
- const fileName = `${folder}/backup.json`;
- const config = store.webdav;
- const proxyUrl =
- store.useProxy && store.proxyUrl.length > 0 ? store.proxyUrl : undefined;
- return {
- async check() {
- try {
- const res = await corsFetch(this.path(folder), {
- method: "MKCOL",
- headers: this.headers(),
- proxyUrl,
- });
- console.log("[WebDav] check", res.status, res.statusText);
- return [201, 200, 404, 301, 302, 307, 308].includes(res.status);
- } catch (e) {
- console.error("[WebDav] failed to check", e);
- }
- return false;
- },
- async get(key: string) {
- const res = await corsFetch(this.path(fileName), {
- method: "GET",
- headers: this.headers(),
- proxyUrl,
- });
- console.log("[WebDav] get key = ", key, res.status, res.statusText);
- return await res.text();
- },
- async set(key: string, value: string) {
- const res = await corsFetch(this.path(fileName), {
- method: "PUT",
- headers: this.headers(),
- body: value,
- proxyUrl,
- });
- console.log("[WebDav] set key = ", key, res.status, res.statusText);
- },
- headers() {
- const auth = btoa(config.username + ":" + config.password);
- return {
- authorization: `Basic ${auth}`,
- };
- },
- path(path: string) {
- let url = config.endpoint;
- if (!url.endsWith("/")) {
- url += "/";
- }
- if (path.startsWith("/")) {
- path = path.slice(1);
- }
- return url + path;
- },
- };
- }
|