feat(nbstore): add blob sync frontend (#9084)

This commit is contained in:
EYHN
2024-12-11 12:39:26 +00:00
parent a67fbc9448
commit 0c0722c650
3 changed files with 54 additions and 3 deletions
+29 -1
View File
@@ -1,6 +1,6 @@
import { difference } from 'lodash-es';
import type { BlobStorage } from '../../storage';
import type { BlobRecord, BlobStorage } from '../../storage';
import { MANUALLY_STOP, throwIfAborted } from '../../utils/throw-if-aborted';
export class BlobSyncEngine {
@@ -11,6 +11,29 @@ export class BlobSyncEngine {
readonly remotes: BlobStorage[]
) {}
async downloadBlob(blobId: string, signal?: AbortSignal) {
const localBlob = await this.local.get(blobId, signal);
if (localBlob) {
return localBlob;
}
for (const storage of this.remotes) {
const data = await storage.get(blobId, signal);
if (data) {
await this.local.set(data, signal);
return data;
}
}
return null;
}
async uploadBlob(blob: BlobRecord, signal?: AbortSignal) {
await this.local.set(blob);
await Promise.allSettled(
this.remotes.map(remote => remote.set(blob, signal))
);
}
private async sync(signal?: AbortSignal) {
throwIfAborted(signal);
@@ -94,4 +117,9 @@ export class BlobSyncEngine {
this.abort?.abort();
this.abort = null;
}
addPriority(_id: string, _priority: number): () => void {
// TODO: implement
return () => {};
}
}