{"version":3,"file":"ConnectedLdoTransactionDataset.mjs","names":[],"sources":["../src/ConnectedLdoTransactionDataset.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { LdoBase, ShapeType } from \"@ldo/ldo\";\nimport { LdoTransactionDataset } from \"@ldo/ldo\";\nimport type { DatasetFactory, Quad } from \"@rdfjs/types\";\nimport {\n  updateDatasetInBulk,\n  type ITransactionDatasetFactory,\n} from \"@ldo/subscribable-dataset\";\nimport type { DatasetChanges, GraphNode } from \"@ldo/rdf-utils\";\nimport type { ConnectedPlugin } from \"./types/ConnectedPlugin\";\nimport type { ConnectedContext } from \"./types/ConnectedContext\";\nimport type {\n  GetResourceReturnType,\n  IConnectedLdoDataset,\n} from \"./types/IConnectedLdoDataset\";\nimport { splitChangesByGraph } from \"./util/splitChangesByGraph\";\nimport type { IgnoredInvalidUpdateSuccess } from \"./results/success/UpdateSuccess\";\nimport { UpdateDefaultGraphSuccess } from \"./results/success/UpdateSuccess\";\nimport type { ErrorResult } from \"./results/error/ErrorResult\";\nimport { AggregateError } from \"./results/error/ErrorResult\";\nimport type {\n  AggregateSuccess,\n  SuccessResult,\n} from \"./results/success/SuccessResult\";\nimport { ConnectedLdoBuilder } from \"./ConnectedLdoBuilder\";\nimport jsonldDatasetProxy from \"@ldo/jsonld-dataset-proxy\";\n\n/**\n * A ConnectedLdoTransactionDataset has all the functionality of a\n * ConnectedLdoDataset and represents a transaction to the parent\n * ConnectedLdoDataset.\n *\n * It is recommended to use the `startTransaction` method on a SolidLdoDataset\n * to initialize this class\n *\n * @example\n * ```typescript\n * import { createConnectedLdoDataset } from \"@ldo/connected\";\n * import { ProfileShapeType } from \"./_ldo/profile.shapeTypes.ts\"\n * import { solidConnectedPlugin } from \"connected-solid\";\n *\n * // ...\n *\n * const connectedLdoDataset = createConnectedLdoDataset([\n *   solidConnectedPlugin\n * ]);\n *\n * const profileDocument = connectedLdoDataset\n *   .getResource(\"https://example.com/profile\");\n * await profileDocument.read();\n *\n * const transaction = connectedLdoDataset.startTransaction();\n *\n * const profile = transaction\n *   .using(ProfileShapeType)\n *   .fromSubject(\"https://example.com/profile#me\");\n * profile.name = \"Some Name\";\n * const result = await transaction.commitToRemote();\n * if (result.isError) {\n *   // handle error\n * }\n * ```\n */\nexport class ConnectedLdoTransactionDataset<Plugins extends ConnectedPlugin[]>\n  extends LdoTransactionDataset\n  implements IConnectedLdoDataset<Plugins>\n{\n  public instanceId: number;\n  static nextId = 0;\n  /**\n   * @internal\n   */\n  public context: ConnectedContext<Plugins>;\n\n  /**\n   * @internal\n   * Serves no purpose\n   */\n  protected resourceMap: Map<string, Plugins[number][\"types\"][\"resource\"]> =\n    new Map();\n\n  /**\n   * @param context - SolidLdoDatasetContext\n   * @param datasetFactory - An optional dataset factory\n   * @param transactionDatasetFactory - A factory for creating transaction datasets\n   * @param initialDataset - A set of triples to initialize this dataset\n   */\n  constructor(\n    parentDataset: IConnectedLdoDataset<Plugins>,\n    context: ConnectedContext<Plugins>,\n    datasetFactory: DatasetFactory,\n    transactionDatasetFactory: ITransactionDatasetFactory<Quad>,\n  ) {\n    super(parentDataset, datasetFactory, transactionDatasetFactory);\n    this.context = context;\n    this.instanceId = ConnectedLdoTransactionDataset.nextId++;\n  }\n\n  getResource<\n    Name extends Plugins[number][\"name\"],\n    Plugin extends Extract<Plugins[number], { name: Name }>,\n    UriType extends string,\n  >(uri: UriType, pluginName?: Name): GetResourceReturnType<Plugin, UriType> {\n    return this.context.dataset.getResource(uri, pluginName);\n  }\n\n  getResources(): Plugins[number][\"types\"][\"resource\"][] {\n    return this.context.dataset.getResources();\n  }\n\n  getFetchedResources(): Plugins[number][\"types\"][\"resource\"][] {\n    return this.context.dataset.getFetchedResources();\n  }\n\n  createResource<\n    Name extends Plugins[number][\"name\"],\n    Plugin extends Extract<Plugins[number], { name: Name }>,\n  >(name: Name): Promise<ReturnType<Plugin[\"createResource\"]>> {\n    return this.context.dataset.createResource(name);\n  }\n\n  setContext<\n    Name extends Plugins[number][\"name\"],\n    Plugin extends Extract<Plugins[number], { name: Name }>,\n  >(name: Name, context: Plugin[\"types\"][\"context\"]): void {\n    this.context.dataset.setContext(name, context);\n  }\n\n  forgetResource(uri: string): boolean {\n    return this.context.dataset.forgetResource(uri);\n  }\n  forgetAllResources(): void {\n    this.context.dataset.forgetAllResources();\n  }\n\n  public startTransaction(): ConnectedLdoTransactionDataset<Plugins> {\n    return new ConnectedLdoTransactionDataset(\n      this,\n      this.context,\n      this.datasetFactory,\n      this.transactionDatasetFactory,\n    );\n  }\n\n  /**\n   * Commits all changes made in this transaction to the remote connected\n   * platforms as well as the parent dataset.\n   *\n   * @returns A success or failure\n   *\n   * @example\n   * ```typescript\n   * import { createConnectedLdoDataset } from \"@ldo/connected\";\n   * import { ProfileShapeType } from \"./_ldo/profile.shapeTypes.ts\"\n   * import { solidConnectedPlugin } from \"connected-solid\";\n   *\n   * // ...\n   *\n   * const connectedLdoDataset = createConnectedLdoDataset([solidConnectedPlugin]);\n   *\n   * const profileDocument = connectedLdoDataset\n   *   .getResource(\"https://example.com/profile\");\n   * await profileDocument.read();\n   *\n   * const transaction = connectedLdoDataset.startTransaction();\n   *\n   * const profile = transaction\n   *   .using(ProfileShapeType)\n   *   .fromSubject(\"https://example.com/profile#me\");\n   * profile.name = \"Some Name\";\n   * const result = await transaction.commitToRemote();\n   * if (result.isError) {\n   *   // handle error\n   * }\n   * ```\n   */\n  async commitToRemote(): Promise<\n    | AggregateSuccess<\n        | Extract<\n            Awaited<ReturnType<Plugins[number][\"types\"][\"resource\"][\"update\"]>>,\n            { isError: false }\n          >\n        | UpdateDefaultGraphSuccess\n        | IgnoredInvalidUpdateSuccess<Plugins[number][\"types\"][\"resource\"]>\n      >\n    | AggregateError<\n        Extract<\n          Awaited<ReturnType<Plugins[number][\"types\"][\"resource\"][\"update\"]>>,\n          { isError: true }\n        >\n      >\n  > {\n    const changes = this.getChanges();\n    const changesByGraph = splitChangesByGraph(changes);\n\n    // Iterate through all changes by graph in\n    const results: [\n      GraphNode,\n      DatasetChanges<Quad>,\n      (\n        | Awaited<ReturnType<Plugins[number][\"types\"][\"resource\"][\"update\"]>>\n        | IgnoredInvalidUpdateSuccess<any>\n        | UpdateDefaultGraphSuccess\n      ),\n    ][] = await Promise.all(\n      Array.from(changesByGraph.entries()).map(\n        async ([graph, datasetChanges]) => {\n          if (graph.termType === \"DefaultGraph\") {\n            // Undefined means that this is the default graph\n            updateDatasetInBulk(this.parentDataset, datasetChanges);\n            return [graph, datasetChanges, new UpdateDefaultGraphSuccess()];\n          }\n          const resource = this.getResource(\n            graph.value,\n          ) as Plugins[number][\"types\"][\"resource\"];\n          const updateResult = (await resource.update(\n            datasetChanges,\n          )) as Awaited<\n            ReturnType<Plugins[number][\"types\"][\"resource\"][\"update\"]>\n          >;\n          return [graph, datasetChanges, updateResult];\n        },\n      ),\n    );\n\n    // If one has errored, return error\n    console.log(results);\n    const errors = (\n      results.map((result) => result[2]) as (SuccessResult | ErrorResult)[]\n    ).filter((result): result is ErrorResult => result.isError);\n\n    if (errors.length > 0) {\n      // HACK: Cast to Any\n      return new AggregateError(errors) as any;\n    }\n    return {\n      isError: false,\n      type: \"aggregateSuccess\",\n      // HACK: Cast to Any\n      results: results.map((result) => result[2]) as any,\n    };\n  }\n\n  public usingType<Type extends LdoBase>(\n    shapeType: ShapeType<Type>,\n  ): ConnectedLdoBuilder<Type, Plugins> {\n    const proxyBuilder = jsonldDatasetProxy(this, shapeType.context);\n    return new ConnectedLdoBuilder(this, proxyBuilder, shapeType);\n  }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+DA,IAAa,iCAAb,MAAa,uCACH,sBAEV;;;;;;;CAqBE,YACE,eACA,SACA,gBACA,2BACA;AACA,QAAM,eAAe,gBAAgB,0BAA0B;AAfjE,OAAU,8BACR,IAAI,KAAK;AAeT,OAAK,UAAU;AACf,OAAK,aAAa,+BAA+B;;CAGnD,YAIE,KAAc,YAA2D;AACzE,SAAO,KAAK,QAAQ,QAAQ,YAAY,KAAK,WAAW;;CAG1D,eAAuD;AACrD,SAAO,KAAK,QAAQ,QAAQ,cAAc;;CAG5C,sBAA8D;AAC5D,SAAO,KAAK,QAAQ,QAAQ,qBAAqB;;CAGnD,eAGE,MAA2D;AAC3D,SAAO,KAAK,QAAQ,QAAQ,eAAe,KAAK;;CAGlD,WAGE,MAAY,SAA2C;AACvD,OAAK,QAAQ,QAAQ,WAAW,MAAM,QAAQ;;CAGhD,eAAe,KAAsB;AACnC,SAAO,KAAK,QAAQ,QAAQ,eAAe,IAAI;;CAEjD,qBAA2B;AACzB,OAAK,QAAQ,QAAQ,oBAAoB;;CAG3C,mBAAmE;AACjE,SAAO,IAAI,+BACT,MACA,KAAK,SACL,KAAK,gBACL,KAAK,0BACN;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmCH,MAAM,iBAeJ;EAEA,MAAM,iBAAiB,oBADP,KAAK,YAC6B,CAAC;EAGnD,MAAM,UAQA,MAAM,QAAQ,IAClB,MAAM,KAAK,eAAe,SAAS,CAAC,CAAC,IACnC,OAAO,CAAC,OAAO,oBAAoB;AACjC,OAAI,MAAM,aAAa,gBAAgB;AAErC,wBAAoB,KAAK,eAAe,eAAe;AACvD,WAAO;KAAC;KAAO;KAAgB,IAAI,2BAA2B;KAAC;;AAUjE,UAAO;IAAC;IAAO;IAAgB,MARd,KAAK,YACpB,MAAM,MAE4B,CAAC,OACnC,eACD;IAG2C;IAE/C,CACF;AAGD,UAAQ,IAAI,QAAQ;EACpB,MAAM,SACJ,QAAQ,KAAK,WAAW,OAAO,GAAG,CAClC,QAAQ,WAAkC,OAAO,QAAQ;AAE3D,MAAI,OAAO,SAAS,EAElB,QAAO,IAAI,eAAe,OAAO;AAEnC,SAAO;GACL,SAAS;GACT,MAAM;GAEN,SAAS,QAAQ,KAAK,WAAW,OAAO,GAAG;GAC5C;;CAGH,UACE,WACoC;EACpC,MAAM,eAAe,mBAAmB,MAAM,UAAU,QAAQ;AAChE,SAAO,IAAI,oBAAoB,MAAM,cAAc,UAAU;;;AAnL/D,+BAAO,SAAS"}