{"version":3,"sources":["../../src/utils/google-tag-gateway.ts"],"sourcesContent":["import { getGeolocation } from './geolocation';\n\n/**\n * In a browser, verify the setup by navigating to: https://example.com/metrics/healthy. The page\n * should read ok. Verify that geographical information is being included by navigating to:\n * https://example.com/metrics/?validate_geo=healthy. The page should read ok.\n */\nexport async function forwardToGoogleTagGateway(request: Request, gaId: string) {\n  const GATEWAY_HOST = `${gaId}.fps.goog`;\n  const { pathname, search } = new URL(request.url);\n\n  const target = `https://${GATEWAY_HOST}${pathname}${search}`;\n\n  const headers = new Headers();\n  headers.set('host', GATEWAY_HOST);\n\n  // Forward cookies\n  const cookie = request.headers.get('cookie');\n  if (cookie) headers.set('cookie', cookie);\n\n  // Convert Vercel geo headers to Google Tag Gateway format\n  // https://developers.google.com/tag-platform/tag-manager/gateway/setup-guide\n  const { country, region } = getGeolocation(request);\n\n  if (country && region) {\n    headers.set('x-forwarded-countryregion', `${country}-${region}`);\n  } else if (country) {\n    headers.set('x-forwarded-country', country);\n  } else if (region) {\n    headers.set('x-forwarded-region', region);\n  }\n\n  const hasBody = request.method !== 'GET' && request.method !== 'HEAD';\n  const response = await fetch(target, {\n    method: request.method,\n    headers,\n    body: hasBody ? request.body : undefined,\n    ...(hasBody && { duplex: 'half' as const }),\n  });\n\n  // Strip content-encoding/content-length because fetch() auto-decompresses\n  // but keeps the original headers, causing ERR_CONTENT_DECODING_FAILED\n  const responseHeaders = new Headers(response.headers);\n  responseHeaders.delete('content-encoding');\n  responseHeaders.delete('content-length');\n\n  return new Response(response.body, { status: response.status, headers: responseHeaders });\n}\n"],"mappings":";AAAA,SAAS,sBAAsB;AAO/B,eAAsB,0BAA0B,SAAkB,MAAc;AAC9E,QAAM,eAAe,GAAG,IAAI;AAC5B,QAAM,EAAE,UAAU,OAAO,IAAI,IAAI,IAAI,QAAQ,GAAG;AAEhD,QAAM,SAAS,WAAW,YAAY,GAAG,QAAQ,GAAG,MAAM;AAE1D,QAAM,UAAU,IAAI,QAAQ;AAC5B,UAAQ,IAAI,QAAQ,YAAY;AAGhC,QAAM,SAAS,QAAQ,QAAQ,IAAI,QAAQ;AAC3C,MAAI,OAAQ,SAAQ,IAAI,UAAU,MAAM;AAIxC,QAAM,EAAE,SAAS,OAAO,IAAI,eAAe,OAAO;AAElD,MAAI,WAAW,QAAQ;AACrB,YAAQ,IAAI,6BAA6B,GAAG,OAAO,IAAI,MAAM,EAAE;AAAA,EACjE,WAAW,SAAS;AAClB,YAAQ,IAAI,uBAAuB,OAAO;AAAA,EAC5C,WAAW,QAAQ;AACjB,YAAQ,IAAI,sBAAsB,MAAM;AAAA,EAC1C;AAEA,QAAM,UAAU,QAAQ,WAAW,SAAS,QAAQ,WAAW;AAC/D,QAAM,WAAW,MAAM,MAAM,QAAQ;AAAA,IACnC,QAAQ,QAAQ;AAAA,IAChB;AAAA,IACA,MAAM,UAAU,QAAQ,OAAO;AAAA,IAC/B,GAAI,WAAW,EAAE,QAAQ,OAAgB;AAAA,EAC3C,CAAC;AAID,QAAM,kBAAkB,IAAI,QAAQ,SAAS,OAAO;AACpD,kBAAgB,OAAO,kBAAkB;AACzC,kBAAgB,OAAO,gBAAgB;AAEvC,SAAO,IAAI,SAAS,SAAS,MAAM,EAAE,QAAQ,SAAS,QAAQ,SAAS,gBAAgB,CAAC;AAC1F;","names":[]}