{"version":3,"file":"endpointBuilder.mjs","names":[],"sources":["../../../src/domain/configuration/endpointBuilder.ts"],"sourcesContent":["import { timeStampNow } from '@openobserve/js-core/time'\nimport type { Payload } from '../../transport'\nimport { normalizeUrl } from '../../tools/utils/urlPolyfill'\nimport { generateUUID } from '../../tools/utils/stringUtils'\nimport type { Site } from '../intakeSites'\nimport { INTAKE_SITE_US1 } from '../intakeSites'\nimport type { Configuration, ProxyFn } from './configuration'\n\n// replaced at build time\ndeclare const __BUILD_ENV__SDK_VERSION__: string\n\nexport type TrackType = 'logs' | 'rum' | 'replay' | 'profile' | 'exposures' | 'flagevaluation' | 'debugger'\nexport type ApiType =\n  | 'fetch'\n  | 'beacon'\n  // 'manual' reflects that the request have been sent manually, outside of the SDK (ex: via curl or\n  // a Node.js script).\n  | 'manual'\n\n/**\n * Source values supported by the transport layer for the `o2source` URL parameter.\n *\n * `'dd_debugger'` is internal to the Live Debugger SDK and is not part of\n * `InitConfiguration.source`. It is passed directly to `createEndpointBuilder`\n * by the debugger transport.\n */\nexport type TransportSource = 'browser' | 'flutter' | 'unity' | 'dd_debugger'\n\ninterface EndpointBuilderConfiguration {\n  clientToken: string\n  proxy?: string | ProxyFn\n  site?: Site\n  source?: TransportSource\n  apiVersion?: string\n  organizationIdentifier?: string\n  insecureHTTP?: boolean\n}\n\nexport type EndpointBuilder = ReturnType<typeof createEndpointBuilder>\n\nexport function createEndpointBuilder(\n  configuration: EndpointBuilderConfiguration,\n  trackType: TrackType,\n  extraParameters?: string[]\n) {\n  return {\n    build(api: ApiType, payload: Payload) {\n      return buildEndpointUrl({\n        proxy: configuration.proxy,\n        site: configuration.site,\n        insecureHTTP: configuration.insecureHTTP,\n        path: `/rum/${configuration.apiVersion ?? 'v1'}/${configuration.organizationIdentifier ?? 'default'}/${trackType}`,\n        parameters: buildEndpointParameters(configuration, trackType, api, payload, extraParameters),\n      })\n    },\n    trackType,\n  }\n}\n\n/**\n * Build the endpoint for the replica (dual shipping) site, if a replica is configured.\n *\n * The replica always targets the US1 site but keeps the `proxy` and `source` of the main\n * configuration. The RUM track additionally carries the replica `application.id`.\n */\nexport function createReplicaEndpointBuilder({ replica, proxy, source }: Configuration, trackType: TrackType) {\n  if (!replica) {\n    return\n  }\n  return createEndpointBuilder(\n    {\n      clientToken: replica.clientToken,\n      proxy,\n      source,\n      site: INTAKE_SITE_US1,\n    },\n    trackType,\n    trackType === 'rum' ? [`application.id=${replica.applicationId}`] : undefined\n  )\n}\n\nexport interface BuildEndpointUrlOptions {\n  proxy?: string | ProxyFn\n  site: Site | undefined\n  subdomain?: string\n  path: string\n  parameters?: string\n  insecureHTTP?: boolean\n}\n\nexport function buildEndpointUrl({\n  proxy,\n  site = INTAKE_SITE_US1,\n  path,\n  parameters = '',\n  subdomain,\n  insecureHTTP,\n}: BuildEndpointUrlOptions): string {\n  let pathAndParameters = path\n  if (parameters) {\n    pathAndParameters += `?${parameters}`\n  }\n\n  if (typeof proxy === 'string') {\n    let url = `${normalizeUrl(proxy)}?o2forward=${encodeURIComponent(pathAndParameters)}`\n    if (subdomain) {\n      url += `&o2forwardSubdomain=${subdomain}`\n    }\n    return url\n  }\n\n  if (typeof proxy === 'function') {\n    return proxy({ path, parameters, subdomain })\n  }\n\n  // OpenObserve: the configured `site` is used verbatim as the intake host, without the\n  // Datadog `browser-intake-` domain construction or subdomain prefixes.\n  const protocol = insecureHTTP ? 'http' : 'https'\n  return `${protocol}://${site}${pathAndParameters}`\n}\n\n/**\n * Build parameters to be used for an intake request. Parameters should be re-built for each\n * request, as they change randomly.\n */\nfunction buildEndpointParameters(\n  { clientToken, source = 'browser' }: EndpointBuilderConfiguration,\n  trackType: TrackType,\n  api: ApiType,\n  { retry, encoding }: Payload,\n  extraParameters: string[] = []\n) {\n  const parameters = [\n    `o2source=${source}`,\n    `o2-api-key=${clientToken}`,\n    `o2-evp-origin-version=${encodeURIComponent(__BUILD_ENV__SDK_VERSION__)}`,\n    'o2-evp-origin=browser',\n    `o2-request-id=${generateUUID()}`,\n  ].concat(extraParameters)\n\n  if (encoding) {\n    parameters.push(`o2-evp-encoding=${encoding}`)\n  }\n\n  if (trackType === 'rum') {\n    parameters.push(`batch_time=${timeStampNow()}`, `_o2.api=${api}`)\n\n    if (retry) {\n      parameters.push(`_o2.retry_count=${retry.count}`, `_o2.retry_after=${retry.lastFailureStatus}`)\n    }\n  }\n\n  return parameters.join('&')\n}\n"],"mappings":";;;;;AAwCA,SAAgB,sBACd,eACA,WACA,iBACA;CACA,OAAO;EACL,MAAM,KAAc,SAAkB;GACpC,OAAO,iBAAiB;IACtB,OAAO,cAAc;IACrB,MAAM,cAAc;IACpB,cAAc,cAAc;IAC5B,MAAM,QAAQ,cAAc,cAAc,KAAK,GAAG,cAAc,0BAA0B,UAAU,GAAG;IACvG,YAAY,wBAAwB,eAAe,WAAW,KAAK,SAAS,eAAe;GAC7F,CAAC;EACH;EACA;CACF;AACF;;;;;;;AAQA,SAAgB,6BAA6B,EAAE,SAAS,OAAO,UAAyB,WAAsB;CAC5G,IAAI,CAAC,SACH;CAEF,OAAO,sBACL;EACE,aAAa,QAAQ;EACrB;EACA;EACA,MAAM;CACR,GACA,WACA,cAAc,QAAQ,CAAC,kBAAkB,QAAQ,eAAe,IAAI,KAAA,CACtE;AACF;AAWA,SAAgB,iBAAiB,EAC/B,OACA,OAAO,iBACP,MACA,aAAa,IACb,WACA,gBACkC;CAClC,IAAI,oBAAoB;CACxB,IAAI,YACF,qBAAqB,IAAI;CAG3B,IAAI,OAAO,UAAU,UAAU;EAC7B,IAAI,MAAM,GAAG,aAAa,KAAK,EAAE,aAAa,mBAAmB,iBAAiB;EAClF,IAAI,WACF,OAAO,uBAAuB;EAEhC,OAAO;CACT;CAEA,IAAI,OAAO,UAAU,YACnB,OAAO,MAAM;EAAE;EAAM;EAAY;CAAU,CAAC;CAM9C,OAAO,GADU,eAAe,SAAS,QACtB,KAAK,OAAO;AACjC;;;;;AAMA,SAAS,wBACP,EAAE,aAAa,SAAS,aACxB,WACA,KACA,EAAE,OAAO,YACT,kBAA4B,CAAC,GAC7B;CACA,MAAM,aAAa;EACjB,YAAY;EACZ,cAAc;EACd,yBAAyB,mBAAA,OAA6C;EACtE;EACA,iBAAiB,aAAa;CAChC,CAAC,CAAC,OAAO,eAAe;CAExB,IAAI,UACF,WAAW,KAAK,mBAAmB,UAAU;CAG/C,IAAI,cAAc,OAAO;EACvB,WAAW,KAAK,cAAc,aAAa,KAAK,WAAW,KAAK;EAEhE,IAAI,OACF,WAAW,KAAK,mBAAmB,MAAM,SAAS,mBAAmB,MAAM,mBAAmB;CAElG;CAEA,OAAO,WAAW,KAAK,GAAG;AAC5B"}