{"version":3,"file":"LeafBatchedRequester.mjs","names":[],"sources":["../../src/requester/LeafBatchedRequester.ts"],"sourcesContent":["import type { DatasetChanges } from \"@ldo/rdf-utils\";\nimport { mergeDatasetChanges } from \"@ldo/subscribable-dataset\";\nimport type { Quad } from \"@rdfjs/types\";\nimport { BatchedRequester } from \"./BatchedRequester\";\nimport type {\n  LeafCreateAndOverwriteResult,\n  LeafCreateIfAbsentResult,\n} from \"./requests/createDataResource\";\nimport type { ReadLeafResult } from \"./requests/readResource\";\nimport type { UpdateResult } from \"./requests/updateDataResource\";\nimport { updateDataResource } from \"./requests/updateDataResource\";\nimport { uploadResource } from \"./requests/uploadResource\";\nimport type { SolidLeaf } from \"../resources/SolidLeaf\";\nimport type { ConnectedContext } from \"@ldo/connected\";\nimport type { SolidConnectedPlugin } from \"../SolidConnectedPlugin\";\n\nexport const UPDATE_KEY = \"update\";\nexport const UPLOAD_KEY = \"upload\";\n\n/**\n * @internal\n *\n *  A singleton to handle batched requests for leafs\n */\nexport class LeafBatchedRequester extends BatchedRequester<SolidLeaf> {\n  /**\n   * The URI of the leaf\n   */\n  readonly resource: SolidLeaf;\n\n  /**\n   * @param uri - the URI of the leaf\n   * @param context - SolidLdoDatasetContext of the parent dataset\n   */\n  constructor(\n    resource: SolidLeaf,\n    context: ConnectedContext<SolidConnectedPlugin[]>,\n  ) {\n    super(context);\n    this.resource = resource;\n  }\n\n  /**\n   * Checks if the resource is currently executing an update request\n   * @returns true if the resource is currently executing an update request\n   */\n  isUpdating(): boolean {\n    return this.requestBatcher.isLoading(UPDATE_KEY);\n  }\n\n  /**\n   * Checks if the resource is currently executing an upload request\n   * @returns true if the resource is currently executing an upload request\n   */\n  isUploading(): boolean {\n    return this.requestBatcher.isLoading(UPLOAD_KEY);\n  }\n\n  /**\n   * Reads the leaf\n   * @returns A ReadLeafResult\n   */\n  async read(): Promise<ReadLeafResult> {\n    return super.read() as Promise<ReadLeafResult>;\n  }\n\n  /**\n   * Creates the leaf as a data resource\n   * @param overwrite - If true, this will orverwrite the resource if it already\n   * exists\n   */\n  createDataResource(overwrite: true): Promise<LeafCreateAndOverwriteResult>;\n  createDataResource(overwrite?: false): Promise<LeafCreateIfAbsentResult>;\n  createDataResource(\n    overwrite?: boolean,\n  ): Promise<LeafCreateIfAbsentResult | LeafCreateAndOverwriteResult>;\n  createDataResource(\n    overwrite?: boolean,\n  ): Promise<LeafCreateIfAbsentResult | LeafCreateAndOverwriteResult> {\n    return super.createDataResource(overwrite) as Promise<\n      LeafCreateIfAbsentResult | LeafCreateAndOverwriteResult\n    >;\n  }\n\n  /**\n   * Update the data on this resource\n   * @param changes - DatasetChanges that should be applied to the Pod\n   */\n  async updateDataResource(\n    changes: DatasetChanges<Quad>,\n  ): Promise<UpdateResult<SolidLeaf>> {\n    const result = await this.requestBatcher.queueProcess({\n      name: UPDATE_KEY,\n      args: [\n        this.resource,\n        changes,\n        {\n          fetch: this.context.solid.fetch,\n          dataset: this.context.dataset,\n        },\n      ],\n      perform: updateDataResource,\n      modifyQueue: (queue, currentlyProcessing, [, changes]) => {\n        if (queue[queue.length - 1]?.name === UPDATE_KEY) {\n          // Merge Changes\n          const originalChanges = queue[queue.length - 1].args[1];\n          mergeDatasetChanges(originalChanges, changes);\n          return queue[queue.length - 1];\n        }\n        return undefined;\n      },\n    });\n    return result as UpdateResult<SolidLeaf>;\n  }\n\n  /**\n   * Upload a binary at this resource's URI\n   * @param blob - A binary blob\n   * @param mimeType - the mime type of the blob\n   * @param overwrite: If true, will overwrite an existing file\n   */\n  upload(\n    blob: Blob,\n    mimeType: string,\n    overwrite: true,\n  ): Promise<LeafCreateAndOverwriteResult>;\n  upload(\n    blob: Blob,\n    mimeType: string,\n    overwrite?: false,\n  ): Promise<LeafCreateIfAbsentResult>;\n  upload(\n    blob: Blob,\n    mimeType: string,\n    overwrite?: boolean,\n  ): Promise<LeafCreateAndOverwriteResult | LeafCreateIfAbsentResult>;\n  async upload(\n    blob: Blob,\n    mimeType: string,\n    overwrite?: boolean,\n  ): Promise<LeafCreateAndOverwriteResult | LeafCreateIfAbsentResult> {\n    const transaction = this.context.dataset.startTransaction();\n    const result = await this.requestBatcher.queueProcess({\n      name: UPLOAD_KEY,\n      args: [\n        this.resource,\n        blob,\n        mimeType,\n        // Hack: Something's up with these types. I can't be bothered to fix it\n        overwrite as false,\n        { dataset: transaction, fetch: this.context.solid.fetch },\n      ],\n      perform: uploadResource,\n      modifyQueue: (queue, currentlyLoading, args) => {\n        const lastElementInQueue = queue[queue.length - 1];\n        if (\n          lastElementInQueue &&\n          lastElementInQueue.name === UPLOAD_KEY &&\n          !!lastElementInQueue.args[3] === !!args[3]\n        ) {\n          return lastElementInQueue;\n        }\n        if (\n          currentlyLoading &&\n          currentlyLoading.name === UPLOAD_KEY &&\n          !!currentlyLoading.args[3] === !!args[3]\n        ) {\n          return currentlyLoading;\n        }\n        return undefined;\n      },\n      after: (result) => {\n        if (!result.isError) {\n          transaction.commit();\n        }\n      },\n    });\n    return result;\n  }\n}\n"],"mappings":";;;;;AAgBA,MAAa,aAAa;AAC1B,MAAa,aAAa;;;;;;AAO1B,IAAa,uBAAb,cAA0C,iBAA4B;;;;;CAUpE,YACE,UACA,SACA;AACA,QAAM,QAAQ;AACd,OAAK,WAAW;;;;;;CAOlB,aAAsB;AACpB,SAAO,KAAK,eAAe,UAAU,WAAW;;;;;;CAOlD,cAAuB;AACrB,SAAO,KAAK,eAAe,UAAU,WAAW;;;;;;CAOlD,MAAM,OAAgC;AACpC,SAAO,MAAM,MAAM;;CAarB,mBACE,WACkE;AAClE,SAAO,MAAM,mBAAmB,UAAU;;;;;;CAS5C,MAAM,mBACJ,SACkC;AAsBlC,SAAO,MArBc,KAAK,eAAe,aAAa;GACpD,MAAM;GACN,MAAM;IACJ,KAAK;IACL;IACA;KACE,OAAO,KAAK,QAAQ,MAAM;KAC1B,SAAS,KAAK,QAAQ;KACvB;IACF;GACD,SAAS;GACT,cAAc,OAAO,qBAAqB,GAAG,aAAa;AACxD,QAAI,MAAM,MAAM,SAAS,IAAI,SAAA,UAAqB;KAEhD,MAAM,kBAAkB,MAAM,MAAM,SAAS,GAAG,KAAK;AACrD,yBAAoB,iBAAiB,QAAQ;AAC7C,YAAO,MAAM,MAAM,SAAS;;;GAIjC,CAAC;;CAyBJ,MAAM,OACJ,MACA,UACA,WACkE;EAClE,MAAM,cAAc,KAAK,QAAQ,QAAQ,kBAAkB;AAoC3D,SAAO,MAnCc,KAAK,eAAe,aAAa;GACpD,MAAM;GACN,MAAM;IACJ,KAAK;IACL;IACA;IAEA;IACA;KAAE,SAAS;KAAa,OAAO,KAAK,QAAQ,MAAM;KAAO;IAC1D;GACD,SAAS;GACT,cAAc,OAAO,kBAAkB,SAAS;IAC9C,MAAM,qBAAqB,MAAM,MAAM,SAAS;AAChD,QACE,sBACA,mBAAmB,SAAA,YACnB,CAAC,CAAC,mBAAmB,KAAK,OAAO,CAAC,CAAC,KAAK,GAExC,QAAO;AAET,QACE,oBACA,iBAAiB,SAAA,YACjB,CAAC,CAAC,iBAAiB,KAAK,OAAO,CAAC,CAAC,KAAK,GAEtC,QAAO;;GAIX,QAAQ,WAAW;AACjB,QAAI,CAAC,OAAO,QACV,aAAY,QAAQ;;GAGzB,CAAC"}