diff --git a/src/sync-manager.ts b/src/sync-manager.ts index 4fd26d1..e21309b 100644 --- a/src/sync-manager.ts +++ b/src/sync-manager.ts @@ -12,6 +12,7 @@ import MetadataStore, { import EventsListener from "./events-listener"; import { GitHubSyncSettings } from "./settings/settings"; import Logger from "./logger"; +import { decodeBase64String } from "./utils"; interface SyncAction { type: "upload" | "download" | "delete_local" | "delete_remote"; @@ -299,7 +300,9 @@ export default class SyncManager { } const blob = await this.client.getBlob(manifest.sha); - const remoteMetadata: Metadata = JSON.parse(atob(blob.content)); + const remoteMetadata: Metadata = JSON.parse( + decodeBase64String(blob.content), + ); const conflicts = await this.findConflicts(remoteMetadata.files); @@ -464,7 +467,7 @@ export default class SyncManager { const res = await this.client.getBlob( filesMetadata[filePath].sha!, ); - return atob(res.content); + return decodeBase64String(res.content); })(), await this.vault.adapter.read(normalizePath(filePath)), ]); diff --git a/src/utils.ts b/src/utils.ts new file mode 100644 index 0000000..8f4ceb0 --- /dev/null +++ b/src/utils.ts @@ -0,0 +1,14 @@ +import { base64ToArrayBuffer } from "obsidian"; + +/** + * Decodes a base64 encoded string, this properly + * handles emojis and other non ASCII chars. + * + * @param s base64 encoded string + * @returns Decoded string + */ +export function decodeBase64String(s: string): string { + const buffer = base64ToArrayBuffer(s); + const decoder = new TextDecoder(); + return decoder.decode(buffer); +}