{"version":3,"sources":["../../src/visitor/index.ts"],"sourcesContent":["import { fetch } from '@shware/utils';\nimport { keys } from '../constants/storage';\nimport type { CreateVisitorDTO } from '../schema/index';\nimport { cache, config } from '../setup/index';\nimport type { UpdateVisitorDTO, Visitor, VisitorProperties } from './types';\n\nasync function createVisitor(): Promise<Visitor> {\n  const dto: CreateVisitorDTO = {\n    device_id: await config.getDeviceId(),\n    platform: config.platform,\n    environment: config.environment,\n    properties: (await config.getTags()) as VisitorProperties,\n  };\n\n  const response = await fetch(`${config.endpoint}/visitors`, {\n    method: 'POST',\n    credentials: 'include',\n    headers: await config.getHeaders(),\n    body: JSON.stringify(dto),\n  });\n\n  const data = (await response.json()) as Visitor;\n  if (data.id) {\n    config.storage.setItem(keys.visitor_id, data.id);\n  }\n  return data;\n}\n\nasync function getOrCreateVisitor(): Promise<Visitor> {\n  const visitorId = config.storage.getItem(keys.visitor_id);\n  if (visitorId && visitorId !== 'undefined') {\n    const response = await fetch(`${config.endpoint}/visitors/${visitorId}`, {\n      method: 'GET',\n      credentials: 'include',\n      headers: await config.getHeaders(),\n    });\n\n    if (!response.ok) return createVisitor();\n    return response.json() as Promise<Visitor>;\n  } else {\n    return createVisitor();\n  }\n}\n\nlet visitorFetcher: Promise<Visitor> | null = null;\n\nexport async function getVisitor(): Promise<Visitor> {\n  if (cache.visitor) return cache.visitor;\n  if (visitorFetcher) return visitorFetcher;\n  visitorFetcher = getOrCreateVisitor();\n  cache.visitor = await visitorFetcher;\n  visitorFetcher = null;\n  return cache.visitor;\n}\n\nexport async function setVisitor(dto: UpdateVisitorDTO) {\n  const { id } = await getVisitor();\n  const response = await fetch(`${config.endpoint}/visitors/${id}`, {\n    method: 'PATCH',\n    credentials: 'include',\n    headers: await config.getHeaders(),\n    body: JSON.stringify(dto),\n  });\n\n  if (!response.ok) throw new Error('Failed to set visitor');\n  const data = (await response.json()) as Visitor;\n\n  config.thirdPartyUserSetters.forEach((setter) => setter(dto));\n  cache.visitor = data;\n  return data;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAsB;AACtB,qBAAqB;AAErB,mBAA8B;AAG9B,eAAe,gBAAkC;AAC/C,QAAM,MAAwB;AAAA,IAC5B,WAAW,MAAM,oBAAO,YAAY;AAAA,IACpC,UAAU,oBAAO;AAAA,IACjB,aAAa,oBAAO;AAAA,IACpB,YAAa,MAAM,oBAAO,QAAQ;AAAA,EACpC;AAEA,QAAM,WAAW,UAAM,oBAAM,GAAG,oBAAO,QAAQ,aAAa;AAAA,IAC1D,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS,MAAM,oBAAO,WAAW;AAAA,IACjC,MAAM,KAAK,UAAU,GAAG;AAAA,EAC1B,CAAC;AAED,QAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,MAAI,KAAK,IAAI;AACX,wBAAO,QAAQ,QAAQ,oBAAK,YAAY,KAAK,EAAE;AAAA,EACjD;AACA,SAAO;AACT;AAEA,eAAe,qBAAuC;AACpD,QAAM,YAAY,oBAAO,QAAQ,QAAQ,oBAAK,UAAU;AACxD,MAAI,aAAa,cAAc,aAAa;AAC1C,UAAM,WAAW,UAAM,oBAAM,GAAG,oBAAO,QAAQ,aAAa,SAAS,IAAI;AAAA,MACvE,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,SAAS,MAAM,oBAAO,WAAW;AAAA,IACnC,CAAC;AAED,QAAI,CAAC,SAAS,GAAI,QAAO,cAAc;AACvC,WAAO,SAAS,KAAK;AAAA,EACvB,OAAO;AACL,WAAO,cAAc;AAAA,EACvB;AACF;AAEA,IAAI,iBAA0C;AAE9C,eAAsB,aAA+B;AACnD,MAAI,mBAAM,QAAS,QAAO,mBAAM;AAChC,MAAI,eAAgB,QAAO;AAC3B,mBAAiB,mBAAmB;AACpC,qBAAM,UAAU,MAAM;AACtB,mBAAiB;AACjB,SAAO,mBAAM;AACf;AAEA,eAAsB,WAAW,KAAuB;AACtD,QAAM,EAAE,GAAG,IAAI,MAAM,WAAW;AAChC,QAAM,WAAW,UAAM,oBAAM,GAAG,oBAAO,QAAQ,aAAa,EAAE,IAAI;AAAA,IAChE,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS,MAAM,oBAAO,WAAW;AAAA,IACjC,MAAM,KAAK,UAAU,GAAG;AAAA,EAC1B,CAAC;AAED,MAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,uBAAuB;AACzD,QAAM,OAAQ,MAAM,SAAS,KAAK;AAElC,sBAAO,sBAAsB,QAAQ,CAAC,WAAW,OAAO,GAAG,CAAC;AAC5D,qBAAM,UAAU;AAChB,SAAO;AACT;","names":[]}