{"version":3,"sources":["../../src/protocol/personal-server-data.ts"],"sourcesContent":["import {\n  buildWeb3SignedHeader,\n  type Web3SignedSignFn,\n} from \"../auth/web3-signed-builder\";\nimport { DataPointDeletedError } from \"../errors\";\nimport { DataFileEnvelopeSchema, type DataFileEnvelope } from \"./data-file\";\nimport {\n  isDataPointTombstone,\n  tombstoneDeletedAt,\n} from \"./data-point-deletion\";\nimport { readJsonValue } from \"../utils/response-body\";\n\nexport interface BuildPersonalServerDataReadRequestParams {\n  personalServerUrl: string;\n  scope: string;\n  grantId: string;\n  signMessage: Web3SignedSignFn;\n  audience?: string;\n  headers?: HeadersInit;\n}\n\nexport interface ReadPersonalServerDataParams extends BuildPersonalServerDataReadRequestParams {\n  fetch?: typeof fetch;\n}\n\nexport function personalServerDataReadPath(scope: string): string {\n  return `/v1/data/${encodeURIComponent(scope)}`;\n}\n\nexport async function buildPersonalServerDataReadRequest(\n  params: BuildPersonalServerDataReadRequestParams,\n): Promise<Request> {\n  const path = personalServerDataReadPath(params.scope);\n  const baseUrl = params.personalServerUrl.replace(/\\/+$/, \"\");\n  const audience = params.audience ?? baseUrl;\n  const headers = new Headers(params.headers);\n\n  headers.set(\n    \"Authorization\",\n    await buildWeb3SignedHeader({\n      aud: audience,\n      grantId: params.grantId,\n      method: \"GET\",\n      signMessage: params.signMessage,\n      uri: path,\n    }),\n  );\n\n  return new Request(`${baseUrl}${path}`, {\n    headers,\n    method: \"GET\",\n  });\n}\n\nexport async function readPersonalServerData(\n  params: ReadPersonalServerDataParams,\n): Promise<DataFileEnvelope> {\n  const fetchFn = params.fetch ?? globalThis.fetch;\n  if (fetchFn === undefined) {\n    throw new Error(\"No fetch implementation available\");\n  }\n\n  const request = await buildPersonalServerDataReadRequest(params);\n  const response = await fetchFn(request);\n\n  // 410 = the scope was tombstoned. Typed so callers can branch on it\n  // instead of pattern-matching a generic read failure.\n  if (response.status === 410) {\n    throw new DataPointDeletedError(\n      `Personal Server scope '${params.scope}' has been deleted`,\n      {\n        scope: params.scope,\n        deletedAt: tombstoneDeletedAt(await readJsonValue(response)),\n      },\n    );\n  }\n\n  if (!response.ok) {\n    throw new Error(\n      `Personal Server data read failed: ${response.status} ${response.statusText}`,\n    );\n  }\n\n  const body: unknown = await response.json();\n  // A tombstone must never be returned as data, even if the server answered\n  // 200 with the deleted row (deletedAt / tombstone hash pair).\n  if (isDataPointTombstone(body)) {\n    throw new DataPointDeletedError(\n      `Personal Server scope '${params.scope}' has been deleted`,\n      { scope: params.scope, deletedAt: tombstoneDeletedAt(body) },\n    );\n  }\n\n  return DataFileEnvelopeSchema.parse(body);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iCAGO;AACP,oBAAsC;AACtC,uBAA8D;AAC9D,iCAGO;AACP,2BAA8B;AAevB,SAAS,2BAA2B,OAAuB;AAChE,SAAO,YAAY,mBAAmB,KAAK,CAAC;AAC9C;AAEA,eAAsB,mCACpB,QACkB;AAClB,QAAM,OAAO,2BAA2B,OAAO,KAAK;AACpD,QAAM,UAAU,OAAO,kBAAkB,QAAQ,QAAQ,EAAE;AAC3D,QAAM,WAAW,OAAO,YAAY;AACpC,QAAM,UAAU,IAAI,QAAQ,OAAO,OAAO;AAE1C,UAAQ;AAAA,IACN;AAAA,IACA,UAAM,kDAAsB;AAAA,MAC1B,KAAK;AAAA,MACL,SAAS,OAAO;AAAA,MAChB,QAAQ;AAAA,MACR,aAAa,OAAO;AAAA,MACpB,KAAK;AAAA,IACP,CAAC;AAAA,EACH;AAEA,SAAO,IAAI,QAAQ,GAAG,OAAO,GAAG,IAAI,IAAI;AAAA,IACtC;AAAA,IACA,QAAQ;AAAA,EACV,CAAC;AACH;AAEA,eAAsB,uBACpB,QAC2B;AAC3B,QAAM,UAAU,OAAO,SAAS,WAAW;AAC3C,MAAI,YAAY,QAAW;AACzB,UAAM,IAAI,MAAM,mCAAmC;AAAA,EACrD;AAEA,QAAM,UAAU,MAAM,mCAAmC,MAAM;AAC/D,QAAM,WAAW,MAAM,QAAQ,OAAO;AAItC,MAAI,SAAS,WAAW,KAAK;AAC3B,UAAM,IAAI;AAAA,MACR,0BAA0B,OAAO,KAAK;AAAA,MACtC;AAAA,QACE,OAAO,OAAO;AAAA,QACd,eAAW,+CAAmB,UAAM,oCAAc,QAAQ,CAAC;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI;AAAA,MACR,qCAAqC,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,IAC7E;AAAA,EACF;AAEA,QAAM,OAAgB,MAAM,SAAS,KAAK;AAG1C,UAAI,iDAAqB,IAAI,GAAG;AAC9B,UAAM,IAAI;AAAA,MACR,0BAA0B,OAAO,KAAK;AAAA,MACtC,EAAE,OAAO,OAAO,OAAO,eAAW,+CAAmB,IAAI,EAAE;AAAA,IAC7D;AAAA,EACF;AAEA,SAAO,wCAAuB,MAAM,IAAI;AAC1C;","names":[]}