import type { SolidLdoDatasetContext } from "../SolidLdoDatasetContext"; import type { ContainerUri } from "../util/uriTypes"; import { Requester } from "./Requester"; import type { CheckRootResult } from "./requests/checkRootContainer"; import { checkRootContainer } from "./requests/checkRootContainer"; import type { ContainerCreateAndOverwriteResult, ContainerCreateIfAbsentResult, } from "./requests/createDataResource"; import type { ReadContainerResult } from "./requests/readResource"; export const IS_ROOT_CONTAINER_KEY = "isRootContainer"; export class ContainerRequester extends Requester { readonly uri: ContainerUri; constructor(uri: ContainerUri, context: SolidLdoDatasetContext) { super(context); this.uri = uri; } read(): Promise { return super.read() as Promise; } createDataResource( overwrite: true, ): Promise; createDataResource(overwrite?: false): Promise; createDataResource( overwrite?: boolean, ): Promise; createDataResource( overwrite?: boolean, ): Promise< ContainerCreateIfAbsentResult | ContainerCreateAndOverwriteResult > { return super.createDataResource(overwrite) as Promise< ContainerCreateIfAbsentResult | ContainerCreateAndOverwriteResult >; } async isRootContainer(): Promise { return this.requestBatcher.queueProcess({ name: IS_ROOT_CONTAINER_KEY, args: [this.uri as ContainerUri, { fetch: this.context.fetch }], perform: checkRootContainer, modifyQueue: (queue, isLoading) => { if (queue.length === 0) { return isLoading[IS_ROOT_CONTAINER_KEY]; } else { return queue[queue.length - 1].name === IS_ROOT_CONTAINER_KEY; } }, }); } }