feat(backups): add progress to incremental mirror (#9901)

This commit is contained in:
Florent BEAUCHAMP
2026-06-05 16:00:02 +02:00
committed by GitHub
parent d8094a71e2
commit 8939a2deeb
16 changed files with 188 additions and 79 deletions

View File

@@ -1,4 +1,4 @@
import { ProgressHandler } from './ProgressHandler.mjs'
import { ComposedProgressHandler, ProgressHandler } from './ProgressHandler.mjs'
export type DiskBlockData = Buffer
export type DiskBlock = {
@@ -11,7 +11,11 @@ export type BytesLength = number
export abstract class Disk {
#generatedDiskBlocks = 0
#parent?: Disk
progressHandler?: ProgressHandler
#progressHandler = new ComposedProgressHandler()
get progressHandler(): ProgressHandler {
return this.#progressHandler
}
get parent(): Disk | undefined {
return this.#parent
}
@@ -66,9 +70,9 @@ export abstract class Disk {
return Promise.resolve(true)
}
// @todo readRawData will be needed for file level restore
// @todo rename will be needed for merge
// @todo : should the alias part moved from remote/vhd ?
addProgressHandler(progressHandler: ProgressHandler) {
this.#progressHandler.add(progressHandler)
}
}
/**

View File

@@ -42,12 +42,12 @@ test('Disk class', async t => {
await t.test('diskBlocks calls progressHandler.done when consumer exits early', async () => {
let doneCalled = false
disk.progressHandler = {
disk.addProgressHandler({
setProgress: async () => {},
done: async () => {
doneCalled = true
},
}
})
disk.blocks[4] = true
disk.blocks[5] = true
disk.blocks[6] = true

View File

@@ -2,3 +2,17 @@ export interface ProgressHandler {
setProgress(total: number): void | Promise<void>
done(): void | Promise<void>
}
export class ComposedProgressHandler implements ProgressHandler {
#handlers: Array<ProgressHandler> = []
async setProgress(total: number) {
await Promise.all(this.#handlers.map(handler => handler.setProgress(total)))
}
async done() {
await Promise.all(this.#handlers.map(handler => handler.done()))
}
add(handler: ProgressHandler) {
this.#handlers.push(handler)
}
}