import asyncPool from "tiny-async-pool"; import { DocumentAccessor } from "../model/doc"; import { ContentDiffHandler } from "./content_handler"; import { IDiffWatcher } from "./watcher"; export class DiffManager { watching: { [content_type: string]: ContentDiffHandler }; doc_cntr: DocumentAccessor; constructor(contorller: DocumentAccessor) { this.watching = {}; this.doc_cntr = contorller; } async register(content_type: string, watcher: IDiffWatcher) { if (this.watching[content_type] === undefined) { this.watching[content_type] = new ContentDiffHandler(this.doc_cntr, content_type); } this.watching[content_type].register(watcher); await watcher.setup(this.doc_cntr); } async commit(type: string, path: string) { const list = this.watching[type].waiting_list; const c = list.getByPath(path); if (c === undefined) { throw new Error("path is not exist"); } await list.delete(c); const body = await c.createDocumentBody(); const id = await this.doc_cntr.add(body); return id; } async commitAll(type: string) { const list = this.watching[type].waiting_list; const contentFiles = list.getAll(); list.clear(); const bodies = await asyncPool(30, contentFiles, async (x) => await x.createDocumentBody()); const ids = await this.doc_cntr.addList(bodies); return ids; } getAdded() { return Object.keys(this.watching).map(x => ({ type: x, value: this.watching[x].waiting_list.getAll(), })); } }