{"version":3,"file":"readResource.mjs","names":[],"sources":["../../../src/requester/requests/readResource.ts"],"sourcesContent":["import type { UnexpectedHttpError } from \"../results/error/HttpErrorResult\";\nimport {\n  HttpErrorResult,\n  type HttpErrorResultType,\n} from \"../results/error/HttpErrorResult\";\nimport type { DatasetRequestOptions } from \"./requestOptions\";\nimport {\n  BinaryReadSuccess,\n  DataReadSuccess,\n} from \"../results/success/SolidReadSuccess\";\nimport { ContainerReadSuccess } from \"../results/success/SolidReadSuccess\";\nimport { NoncompliantPodError } from \"../results/error/NoncompliantPodError\";\nimport { guaranteeFetch } from \"../../util/guaranteeFetch\";\nimport type { Resource } from \"@ldo/connected\";\nimport { UnexpectedResourceError, AbsentReadSuccess } from \"@ldo/connected\";\nimport { checkHeadersForRootContainer } from \"./checkRootContainer\";\nimport { namedNode } from \"@ldo/rdf-utils\";\nimport type { SolidLeaf } from \"../../resources/SolidLeaf\";\nimport type { SolidContainer } from \"../../resources/SolidContainer\";\nimport {\n  addRawTurtleToDataset,\n  addResourceRdfToContainer,\n} from \"../../util/rdfUtils\";\n\n/**\n * All possible return values for reading a leaf\n */\nexport type ReadLeafResult =\n  | BinaryReadSuccess\n  | DataReadSuccess\n  | AbsentReadSuccess<SolidLeaf>\n  | ReadResultError<SolidLeaf>;\n\n/**\n * All possible return values for reading a container\n */\nexport type ReadContainerResult =\n  | ContainerReadSuccess\n  | AbsentReadSuccess<SolidContainer>\n  | ReadResultError<SolidContainer>;\n\n/**\n * All possible errors the readResource function can return\n */\nexport type ReadResultError<ResourceType extends Resource> =\n  | HttpErrorResultType<ResourceType>\n  | NoncompliantPodError<ResourceType>\n  | UnexpectedHttpError<ResourceType>\n  | UnexpectedResourceError<ResourceType>;\n\n/**\n * @internal\n * Reads resource at a provided URI and returns the result\n *\n * @param uri - The URI of the resource\n * @param options - Options to provide a fetch function and a local dataset to\n * update.\n * @returns ReadResult\n */\nexport async function readResource(\n  resource: SolidLeaf,\n  options?: DatasetRequestOptions,\n): Promise<ReadLeafResult>;\nexport async function readResource(\n  resource: SolidContainer,\n  options?: DatasetRequestOptions,\n): Promise<ReadContainerResult>;\nexport async function readResource(\n  resource: SolidLeaf | SolidContainer,\n  options?: DatasetRequestOptions,\n): Promise<ReadLeafResult | ReadContainerResult>;\nexport async function readResource(\n  resource: SolidLeaf | SolidContainer,\n  options?: DatasetRequestOptions,\n): Promise<ReadLeafResult | ReadContainerResult> {\n  try {\n    const fetch = guaranteeFetch(options?.fetch);\n    // Fetch options to determine the document type\n    const response = await fetch(resource.uri, {\n      headers: { accept: \"text/turtle, */*\" },\n    });\n    if (response.status === 404) {\n      // Clear existing data if present\n      if (options?.dataset) {\n        options.dataset.deleteMatches(\n          undefined,\n          undefined,\n          undefined,\n          namedNode(resource.uri),\n        );\n      }\n\n      return new AbsentReadSuccess(resource, false) as\n        | AbsentReadSuccess<SolidLeaf>\n        | AbsentReadSuccess<SolidContainer>;\n    }\n    const httpErrorResult = HttpErrorResult.checkResponse(resource, response);\n    if (httpErrorResult)\n      return httpErrorResult as\n        | HttpErrorResultType<SolidLeaf>\n        | HttpErrorResultType<SolidContainer>;\n\n    // Add this resource to the container\n    if (options?.dataset) {\n      addResourceRdfToContainer(resource.uri, options.dataset);\n    }\n\n    const contentType = response.headers.get(\"content-type\");\n    if (!contentType) {\n      return new NoncompliantPodError(\n        resource,\n        \"Resource requests must return a content-type header.\",\n      ) as\n        | NoncompliantPodError<SolidContainer>\n        | NoncompliantPodError<SolidLeaf>;\n    }\n\n    if (contentType.startsWith(\"text/turtle\")) {\n      // Parse Turtle\n      const rawTurtle = await response.text();\n      if (options?.dataset) {\n        const result = await addRawTurtleToDataset(\n          rawTurtle,\n          options.dataset,\n          resource.uri,\n        );\n        if (result)\n          return new NoncompliantPodError(resource, result.message) as\n            | NoncompliantPodError<SolidLeaf>\n            | NoncompliantPodError<SolidContainer>;\n      }\n      if (resource.type === \"SolidContainer\") {\n        const result = checkHeadersForRootContainer(resource, response.headers);\n        return new ContainerReadSuccess(\n          resource,\n          false,\n          result.isRootContainer,\n        );\n      }\n      return new DataReadSuccess(resource as SolidLeaf, false);\n    } else {\n      // Load Blob\n      const blob = await response.blob();\n      return new BinaryReadSuccess(\n        resource as SolidLeaf,\n        false,\n        blob,\n        contentType,\n      );\n    }\n  } catch (err) {\n    return UnexpectedResourceError.fromThrown(resource, err) as\n      | UnexpectedResourceError<SolidLeaf>\n      | UnexpectedResourceError<SolidContainer>;\n  }\n}\n"],"mappings":";;;;;;;;;AAuEA,eAAsB,aACpB,UACA,SAC+C;AAC/C,KAAI;EAGF,MAAM,WAAW,MAFH,eAAe,SAAS,MAEV,CAAC,SAAS,KAAK,EACzC,SAAS,EAAE,QAAQ,oBAAoB,EACxC,CAAC;AACF,MAAI,SAAS,WAAW,KAAK;AAE3B,OAAI,SAAS,QACX,SAAQ,QAAQ,cACd,KAAA,GACA,KAAA,GACA,KAAA,GACA,UAAU,SAAS,IAAI,CACxB;AAGH,UAAO,IAAI,kBAAkB,UAAU,MAAM;;EAI/C,MAAM,kBAAkB,gBAAgB,cAAc,UAAU,SAAS;AACzE,MAAI,gBACF,QAAO;AAKT,MAAI,SAAS,QACX,2BAA0B,SAAS,KAAK,QAAQ,QAAQ;EAG1D,MAAM,cAAc,SAAS,QAAQ,IAAI,eAAe;AACxD,MAAI,CAAC,YACH,QAAO,IAAI,qBACT,UACA,uDACD;AAKH,MAAI,YAAY,WAAW,cAAc,EAAE;GAEzC,MAAM,YAAY,MAAM,SAAS,MAAM;AACvC,OAAI,SAAS,SAAS;IACpB,MAAM,SAAS,MAAM,sBACnB,WACA,QAAQ,SACR,SAAS,IACV;AACD,QAAI,OACF,QAAO,IAAI,qBAAqB,UAAU,OAAO,QAAQ;;AAI7D,OAAI,SAAS,SAAS,iBAEpB,QAAO,IAAI,qBACT,UACA,OAHa,6BAA6B,UAAU,SAAS,QAIvD,CAAC,gBACR;AAEH,UAAO,IAAI,gBAAgB,UAAuB,MAAM;QAIxD,QAAO,IAAI,kBACT,UACA,OACA,MAJiB,SAAS,MAAM,EAKhC,YACD;UAEI,KAAK;AACZ,SAAO,wBAAwB,WAAW,UAAU,IAAI"}