fix pcloud bug
This commit is contained in:
parent
e3c53860f7
commit
5ed6fec6e9
@ -87,8 +87,12 @@ export interface PCloudConfig {
|
|||||||
locationid: 1 | 2;
|
locationid: 1 | 2;
|
||||||
remoteBaseDir?: string;
|
remoteBaseDir?: string;
|
||||||
credentialsShouldBeDeletedAtTimeMs?: number;
|
credentialsShouldBeDeletedAtTimeMs?: number;
|
||||||
emptyFile: "skip" | "error";
|
|
||||||
kind: "pcloud";
|
kind: "pcloud";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated
|
||||||
|
*/
|
||||||
|
emptyFile: "skip" | "error";
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////
|
||||||
|
|||||||
@ -285,6 +285,10 @@ const fromNestedFolderToEntityListAndCache = (
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const getPCloudPath = (fileOrFolderPath: string, remoteBaseDir: string) => {
|
||||||
|
return `/${remoteBaseDir}/${fileOrFolderPath}`;
|
||||||
|
};
|
||||||
|
|
||||||
export class FakeFsPCloud extends FakeFs {
|
export class FakeFsPCloud extends FakeFs {
|
||||||
kind: string;
|
kind: string;
|
||||||
|
|
||||||
@ -464,25 +468,6 @@ export class FakeFsPCloud extends FakeFs {
|
|||||||
|
|
||||||
await this._init();
|
await this._init();
|
||||||
|
|
||||||
if (content.byteLength === 0) {
|
|
||||||
if (this.pCloudConfig.emptyFile === "error") {
|
|
||||||
throw Error(
|
|
||||||
`${key}: Empty file is not allowed in pCloud, and please write something in it.`
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
return {
|
|
||||||
key: key,
|
|
||||||
keyRaw: key,
|
|
||||||
mtimeSvr: mtime,
|
|
||||||
mtimeCli: mtime,
|
|
||||||
size: 0,
|
|
||||||
sizeRaw: 0,
|
|
||||||
synthesizedFile: true,
|
|
||||||
// hash: ?? // TODO
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const prevCachedEntity: PCloudEntity | undefined =
|
const prevCachedEntity: PCloudEntity | undefined =
|
||||||
this.keyToPCloudEntity[key];
|
this.keyToPCloudEntity[key];
|
||||||
const prevFileID: number | undefined = prevCachedEntity?.id;
|
const prevFileID: number | undefined = prevCachedEntity?.id;
|
||||||
@ -522,6 +507,7 @@ export class FakeFsPCloud extends FakeFs {
|
|||||||
});
|
});
|
||||||
const apiUrl = `https://${this.pCloudConfig.hostname}/uploadfile?${params}`;
|
const apiUrl = `https://${this.pCloudConfig.hostname}/uploadfile?${params}`;
|
||||||
|
|
||||||
|
if (content.byteLength > 0) {
|
||||||
const rsp = await fetch(apiUrl, {
|
const rsp = await fetch(apiUrl, {
|
||||||
method: "PUT",
|
method: "PUT",
|
||||||
body: content,
|
body: content,
|
||||||
@ -531,6 +517,41 @@ export class FakeFsPCloud extends FakeFs {
|
|||||||
// console.debug(entity);
|
// console.debug(entity);
|
||||||
this.keyToPCloudEntity[key] = entity;
|
this.keyToPCloudEntity[key] = entity;
|
||||||
return entity;
|
return entity;
|
||||||
|
} else {
|
||||||
|
// no idea why pcloud doesn't work for empty files
|
||||||
|
// it can be uploaded successfully but the call doesn't end
|
||||||
|
// we abort it and stat it manually.
|
||||||
|
// console.warn(`uploading empty file ${key}`);
|
||||||
|
const controller = new AbortController();
|
||||||
|
const timeoutMs = 300; // just a random reasonable number
|
||||||
|
const id = setTimeout(() => controller.abort(), timeoutMs);
|
||||||
|
try {
|
||||||
|
const rsp = await fetch(apiUrl, {
|
||||||
|
method: "PUT",
|
||||||
|
body: content,
|
||||||
|
signal: controller.signal,
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
// console.warn(`we abort the request of uploading empty file ${key}:`);
|
||||||
|
// console.warn(e);
|
||||||
|
} finally {
|
||||||
|
clearTimeout(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// raw stat here
|
||||||
|
// https://docs.pcloud.com/methods/file/stat.html
|
||||||
|
const params = new URLSearchParams({
|
||||||
|
access_token: await this._getAccessToken(),
|
||||||
|
path: getPCloudPath(key, this.remoteBaseDir),
|
||||||
|
});
|
||||||
|
const apiUrlStat = `https://${this.pCloudConfig.hostname}/stat?${params}`;
|
||||||
|
const rsp2 = await fetch(apiUrlStat);
|
||||||
|
const f = await rsp2.json();
|
||||||
|
const entity = fromRawResponseToEntity(f.metadata, parentFolderPath);
|
||||||
|
// console.warn(entity);
|
||||||
|
this.keyToPCloudEntity[key] = entity;
|
||||||
|
return entity;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async readFile(key: string): Promise<ArrayBuffer> {
|
async readFile(key: string): Promise<ArrayBuffer> {
|
||||||
@ -602,6 +623,6 @@ export class FakeFsPCloud extends FakeFs {
|
|||||||
}
|
}
|
||||||
|
|
||||||
allowEmptyFile(): boolean {
|
allowEmptyFile(): boolean {
|
||||||
return false;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -280,20 +280,6 @@ export const generatePCloudSettingsPart = (
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
new Setting(pCloudAllowedToUsedDiv)
|
|
||||||
.setName(t("settings_pcloud_emptyfile"))
|
|
||||||
.setDesc(t("settings_pcloud_emptyfile_desc"))
|
|
||||||
.addDropdown(async (dropdown) => {
|
|
||||||
dropdown
|
|
||||||
.addOption("skip", t("settings_pcloud_emptyfile_skip"))
|
|
||||||
.addOption("error", t("settings_pcloud_emptyfile_error"))
|
|
||||||
.setValue(plugin.settings.pcloud.emptyFile)
|
|
||||||
.onChange(async (val) => {
|
|
||||||
plugin.settings.pcloud.emptyFile = val as any;
|
|
||||||
await saveUpdatedConfigFunc();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
new Setting(pCloudAllowedToUsedDiv)
|
new Setting(pCloudAllowedToUsedDiv)
|
||||||
.setName(t("settings_checkonnectivity"))
|
.setName(t("settings_checkonnectivity"))
|
||||||
.setDesc(t("settings_checkonnectivity_desc"))
|
.setDesc(t("settings_checkonnectivity_desc"))
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user