@seeka-labs/sdk-apps-server-telemetry-core 3.9.18 → 3.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- var je=Object.create;var W=Object.defineProperty;var Je=Object.getOwnPropertyDescriptor;var ze=Object.getOwnPropertyNames;var Ye=Object.getPrototypeOf,Qe=Object.prototype.hasOwnProperty;var d=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,i)=>(typeof require<"u"?require:t)[i]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var Xe=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Ze=(e,t,i,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of ze(t))!Qe.call(e,n)&&n!==i&&W(e,n,{get:()=>t[n],enumerable:!(r=Je(t,n))||r.enumerable});return e};var H=(e,t,i)=>(i=e!=null?je(Ye(e)):{},Ze(t||!e||!e.__esModule?W(i,"default",{value:e,enumerable:!0}):i,e));var B=Xe((cr,qe)=>{"use strict";var et=Object.create,E=Object.defineProperty,tt=Object.getOwnPropertyDescriptor,rt=Object.getOwnPropertyNames,it=Object.getPrototypeOf,nt=Object.prototype.hasOwnProperty,at=(e,t)=>{for(var i in t)E(e,i,{get:t[i],enumerable:!0})},Y=(e,t,i,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of rt(t))!nt.call(e,n)&&n!==i&&E(e,n,{get:()=>t[n],enumerable:!(r=tt(t,n))||r.enumerable});return e},g=(e,t,i)=>(i=e!=null?et(it(e)):{},Y(t||!e||!e.__esModule?E(i,"default",{value:e,enumerable:!0}):i,e)),st=e=>Y(E({},"__esModule",{value:!0}),e),Q={};at(Q,{ActivityPipelineActivityFilterSourceItemType:()=>ye,ActivityPipelineActivityFilterType:()=>ge,AnalyticsLibrary:()=>fe,ApiException:()=>we,ApiServiceProxyBase:()=>R,AppPermissionKeys:()=>h,ClickAttributionSourcePlatform:()=>pe,ConditionComparer:()=>me,ConditionOperator:()=>he,ConsentMappingMatchType:()=>Pe,ContentIdentificationBehavior:()=>ve,ConvergePipelineLoggableActivityType:()=>le,ConvergeVendorDestinationPublishStrategy:()=>Ae,CrossDomainTrackingUtmBehavior:()=>Ie,ECommerceContentType:()=>ae,ECommerceFinancialStatus:()=>ce,ECommerceFulfillmentStatus:()=>oe,ECommercePlatform:()=>se,IabPrivacyConsentPurposeId:()=>ke,IabPrivacyConsentPurposeIdMap:()=>kt,IdentityServiceProxy:()=>ee,IngestServiceProxy:()=>te,PrivacyConsentType:()=>ie,PrivacyDataControlMode:()=>be,RegionalConsentGrantOption:()=>Se,ResponseResultType:()=>re,SdkLogEventLevel:()=>ue,SeekaApiHelper:()=>Oe,SeekaAppCacheManager:()=>b,SeekaAppConfig:()=>Z,SeekaAppHelper:()=>Tt,SeekaWebhookCallType:()=>de,TrackingActivityNames:()=>C,TrackingEventSourceOriginType:()=>ne,chunk:()=>M,cloneDeep:()=>Nt,dateToUtcDateTimeReferenceString:()=>Ce,decryptText:()=>Ve,emailAddress:()=>Vt,encryptText:()=>De,generateNewSessionId:()=>T,getActivityName:()=>lt,getActivityValue:()=>qt,getContentIdFromProduct:()=>$t,getContentNameFromProduct:()=>Kt,getIssuer:()=>D,getNestedProperty:()=>Rt,getNewAppInstallToken:()=>Ue,getNewOrCachedAppInstallToken:()=>V,getRandomNumberString:()=>Te,isDeepEqual:()=>Dt,isNumber:()=>Mt,isValidSeekaProfileId:()=>Gt,last:()=>Fe,lastOrDefault:()=>Ot,matchActivityPipelineFilters:()=>Ft,md5Hash:()=>Ee,parseFloat:()=>Le,parseInt:()=>Ut,parseMoney:()=>Et,parseStr:()=>p,phoneNumberToE164:()=>Bt,separatePersonFullName:()=>ut,setNestedProperty:()=>_t,throwOnInvalidWebhookSignature:()=>wt,urls:()=>Wt,validateWebhookSignature:()=>Re,webhookSignatureHeaderName:()=>O});qe.exports=st(Q);var ot="3.9.18",X=g(d("axios")),Z=class{appId;appSecret;ingestUrl;issuerUrl;organisationId;applicationInstallId;runtime;logger;grantedPermissions;transformApiRequest;transformApiResponse;hasAnyPermissions;hasAllPermissions;hasPermission},R=class{config;constructor(e){this.config=e}transformOptions=async e=>await this.config.transformApiRequest(e);transformResult=async(e,t,i)=>await this.config.transformApiResponse(e,t,i)},ee=class extends R{instance;baseUrl;jsonParseReviver=void 0;constructor(e,t,i){super(e),this.instance=i||X.default.create(),this.baseUrl=t??"https://api-localdev-env0-seeka.au.ngrok.io"}merge(e,t){let i=this.baseUrl+"/api/identity";i=i.replace(/[?&]$/,"");let r={data:JSON.stringify(e),method:"POST",url:i,headers:{"Content-Type":"application/json",Accept:"application/json"},cancelToken:t};return this.transformOptions(r).then(n=>this.instance.request(n)).catch(n=>{if(xe(n)&&n.response)return n.response;throw n}).then(n=>this.transformResult(i,n,a=>this.processMerge(a)))}processMerge(e){let t=e.status,i={};if(e.headers&&typeof e.headers=="object")for(let r in e.headers)e.headers.hasOwnProperty(r)&&(i[r]=e.headers[r]);if(t===200){let r=e.data,n=null;return n=JSON.parse(r),Promise.resolve(n)}else if(t===400){let r=e.data,n=null;return n=JSON.parse(r),f("A server side error occurred.",t,r,i,n)}else if(t===401){let r=e.data,n=null;return n=JSON.parse(r),f("A server side error occurred.",t,r,i,n)}else if(t===422){let r=e.data,n=null;return n=JSON.parse(r),f("A server side error occurred.",t,r,i,n)}else if(t!==200&&t!==204){let r=e.data;return f("An unexpected server error occurred.",t,r,i)}return Promise.resolve(null)}},te=class extends R{instance;baseUrl;jsonParseReviver=void 0;constructor(e,t,i){super(e),this.instance=i||X.default.create(),this.baseUrl=t??"https://api-localdev-env0-seeka.au.ngrok.io"}batch(e,t){let i=this.baseUrl+"/api/ingest";i=i.replace(/[?&]$/,"");let r={data:JSON.stringify(e),method:"POST",url:i,headers:{"Content-Type":"application/json"},cancelToken:t};return this.transformOptions(r).then(n=>this.instance.request(n)).catch(n=>{if(xe(n)&&n.response)return n.response;throw n}).then(n=>this.transformResult(i,n,a=>this.processBatch(a)))}processBatch(e){let t=e.status,i={};if(e.headers&&typeof e.headers=="object")for(let r in e.headers)e.headers.hasOwnProperty(r)&&(i[r]=e.headers[r]);if(t===202){let r=e.data;return Promise.resolve(null)}else if(t===400){let r=e.data,n=null;return n=JSON.parse(r),f("A server side error occurred.",t,r,i,n)}else if(t===401){let r=e.data,n=null;return n=JSON.parse(r),f("A server side error occurred.",t,r,i,n)}else if(t===422){let r=e.data,n=null;return n=JSON.parse(r),f("A server side error occurred.",t,r,i,n)}else if(t!==200&&t!==204){let r=e.data;return f("An unexpected server error occurred.",t,r,i)}return Promise.resolve(null)}},re=(e=>(e.Undefined="undefined",e.Success="success",e.Failed="failed",e))(re||{}),ie=(e=>(e.Unknown="unknown",e.Informed="informed",e.Implied="implied",e.Explicit="explicit",e.Active="active",e.Passive="passive",e))(ie||{}),ne=(e=>(e.Browser="browser",e.Server="server",e.Mobile="mobile",e.Desktop="desktop",e.PhysicalStore="physicalStore",e.Email="email",e.Phone="phone",e.Chat="chat",e.Automatic="automatic",e))(ne||{}),C=(e=>(e.Undefined="undefined",e.PageViewOrganic="pageViewOrganic",e.PageViewUtmAttributed="pageViewUtmAttributed",e.AddPaymentMethod="addPaymentMethod",e.AddToWishlist="addToWishlist",e.ContactMessage="contactMessage",e.Custom="custom",e.SyncCart="syncCart",e.Order="order",e.InitiateCheckout="initiateCheckout",e.AddToCart="addToCart",e.RemoveFromCart="removeFromCart",e.OneTimeItemPurchase="oneTimeItemPurchase",e.SubscriptionItemPurchase="subscriptionItemPurchase",e.ViewProduct="viewProduct",e.ViewPage="viewPage",e.ApplyPromotionalCode="applyPromotionalCode",e.KeywordSearch="keywordSearch",e.UserLoginSignup="userLoginSignup",e.UserLogin="userLogin",e.NewsletterSignup="newsletterSignup",e.Lead="lead",e.ChangeProductAttribute="changeProductAttribute",e.FilterItemsByAttribute="filterItemsByAttribute",e.Schedule="schedule",e.ViewContentItem="viewContentItem",e.StartTrial="startTrial",e))(C||{}),ae=(e=>(e.Undefined="undefined",e.SingleProduct="singleProduct",e.SingleVariant="singleVariant",e.Collection="collection",e))(ae||{}),se=(e=>(e.None="none",e.BigCommerce="bigCommerce",e.Shopify="shopify",e.OrderGroove="orderGroove",e.Magento="magento",e.Generic="generic",e.WooCommerce="wooCommerce",e.Demandware="demandware",e))(se||{}),oe=(e=>(e.Undefined="undefined",e.Fulfilled="fulfilled",e.NoneFulfilled="noneFulfilled",e.PartiallyFulfilled="partiallyFulfilled",e.RestockedOrCancelled="restockedOrCancelled",e.Pending="pending",e))(oe||{}),ce=(e=>(e.Undefined="undefined",e.Pending="pending",e.Authorized="authorized",e.PartiallyPaid="partiallyPaid",e.Paid="paid",e.PartiallyRefunded="partiallyRefunded",e.Refunded="refunded",e.Voided="voided",e))(ce||{}),le=(e=>(e.Generic="generic",e.ActivityIngress="activityIngress",e.ActivityEgress="activityEgress",e.UserProfile="userProfile",e.SdkLog="sdkLog",e.Detections="detections",e.ActivityEgressFilter="activityEgressFilter",e.Diagnosis="diagnosis",e.PipelineIntegrationOutput="pipelineIntegrationOutput",e))(le||{}),ue=(e=>(e.Information="information",e.Warning="warning",e.Error="error",e.Verbose="verbose",e))(ue||{}),de=(e=>(e.None="none",e.Probe="probe",e.AppInstalled="appInstalled",e.IdentityChanged="identityChanged",e.ActivityAccepted="activityAccepted",e.AppInstallSettingsUpdated="appInstallSettingsUpdated",e.AppUninstalled="appUninstalled",e.BrowserSdkPlugin="browserSdkPlugin",e))(de||{}),pe=(e=>(e.Unknown="unknown",e.Google="google",e.Meta="meta",e.Snapchat="snapchat",e.Pinterest="pinterest",e.TikTok="tikTok",e))(pe||{}),ge=(e=>(e.Undefined="undefined",e.PurchaseMade="purchaseMade",e.ActivityTracked="activityTracked",e))(ge||{}),me=(e=>(e.Undefined="undefined",e.And="and",e.Or="or",e))(me||{}),ye=(e=>(e.Undefined="undefined",e.Domain="domain",e.Pipeline="pipeline",e.Wildcard="wildcard",e.Url="url",e.PagePath="pagePath",e))(ye||{}),he=(e=>(e.Undefined="undefined",e.Equals="equals",e.NotEquals="notEquals",e.Contains="contains",e.NotContains="notContains",e.StartsWith="startsWith",e.EndsWith="endsWith",e.IsNull="isNull",e.NotNull="notNull",e.IsTrue="isTrue",e.IsFalse="isFalse",e.GreaterThanOrEquals="greaterThanOrEquals",e.LessThanOrEquals="lessThanOrEquals",e.GreaterThan="greaterThan",e.LessThan="lessThan",e.Before="before",e.After="after",e.Between="between",e.In="in",e.NotIn="notIn",e.Regex="regEx",e.Any="any",e))(he||{}),fe=(e=>(e.Undefined="undefined",e.Seeka="seeka",e.DynamicYield="dynamicYield",e.Segment="segment",e.FacebookPixel="facebookPixel",e.GoogleAnalytics="googleAnalytics",e.Braze="braze",e.SnapchatPixel="snapchatPixel",e.Pinterest="pinterest",e.TikTokPixel="tikTokPixel",e.GoogleAds="googleAds",e))(fe||{}),ve=(e=>(e.Default="default",e.Sku="sku",e.ProductId="productId",e.VariantId="variantId",e.ProductIdAndVariantIdUnderscore="productIdAndVariantIdUnderscore",e.VariantIdOrProductId="variantIdOrProductId",e))(ve||{}),Ae=(e=>(e.DeliverAllTraitsAndDeliverAllEvents="deliverAllTraitsAndDeliverAllEvents",e.DeliverAllTraitsAndDeliverEventsOnlyIfMaxWeightedTraitsPresent="deliverAllTraitsAndDeliverEventsOnlyIfMaxWeightedTraitsPresent",e.DeliverMaxWeightedTraitsOnlyAndDeliverAllEvents="deliverMaxWeightedTraitsOnlyAndDeliverAllEvents",e.DeliverMaxWeightedTraitsOnlyAndDeliverEventsOnlyIfMaxWeightedTraitsPresent="deliverMaxWeightedTraitsOnlyAndDeliverEventsOnlyIfMaxWeightedTraitsPresent",e))(Ae||{}),Ie=(e=>(e.None="none",e.SessionPassthrough="sessionPassthrough",e.UrlPassthrough="urlPassthrough",e))(Ie||{}),Se=(e=>(e.Unset="unset",e.Granted="granted",e.Denied="denied",e))(Se||{}),ke=(e=>(e.Undefined="undefined",e.MeasureAdvertisingPerformance="measureAdvertisingPerformance",e))(ke||{}),Pe=(e=>(e.Undefined="undefined",e.AllOf="allOf",e.AnyOf="anyOf",e))(Pe||{}),be=(e=>(e.Disabled="disabled",e.Explicit="explicit",e.Implicit="implicit",e))(be||{}),we=class extends Error{message;status;response;headers;result;constructor(e,t,i,r,n){super(),this.message=e,this.status=t,this.response=i,this.headers=r,this.result=n}isApiException=!0;static isApiException(e){return e.isApiException===!0}};function f(e,t,i,r,n){throw n??new we(e,t,i,r,null)}function xe(e){return e&&e.isAxiosError===!0}var P=d("openid-client"),_=g(d("winston")),N=g(d("memory-cache")),j="seeka:sdk",b=class{constructor(e,t){this.appId=e,this.appInstallationId=t}appId;appInstallationId;set=async(e,t,i)=>{let r=this.getKey(e);N.default.put(r,JSON.stringify(t),i)};getOrSet=async(e,t,i)=>{let r=this.getKey(e),n=N.default.get(r);if(n){let s=JSON.parse(n);return i&&await i(s),s}let a=await t();return a?(N.default.put(r,JSON.stringify(a.value),a.expiryAbsoluteMilliseconds),a.value):null};getKey=e=>this.appInstallationId?`${j}:${this.appId}:${this.appInstallationId}:${e}`:`${j}:${this.appId}:${e}`},ct=g(d("crypto")),T=()=>{let e=Ce(new Date),t=Te();return`${e}.${t}`},lt=e=>{let t=Object.keys(C),i=e.toLowerCase(),r=t.find(n=>n.toLowerCase()===i);return r?C[r]:"custom"},Te=()=>Math.floor(Math.random()*(9999999999-1e9)+1e9).toString(),Ce=e=>{let t=(e.getUTCMonth()+1).toString();t.length<2&&(t="0"+t);let i=e.getUTCDate().toString();i.length<2&&(i="0"+i);let r=e.getUTCHours().toString();r.length<2&&(r="0"+r);let n=e.getUTCMinutes().toString();n.length<2&&(n="0"+n);let a=e.getUTCSeconds().toString();return a.length<2&&(a="0"+a),`${e.getUTCFullYear()}${t}${i}.${r}${n}${a}`},Ee=e=>ct.createHash("md5").update(e).digest("hex"),ut=e=>{if(!e)return{firstName:null,lastName:null};let t=e.trim().split(" ");return t.length===1?{firstName:e,lastName:null}:t.length===2?{firstName:t[0],lastName:t[1]}:{firstName:t[0],lastName:t.slice(1).join(" ")}},M=(e,t)=>e.reduce((i,r,n)=>{let a=Math.floor(n/t);return i[a]||(i[a]=[]),i[a].push(r),i},[]),D=async e=>{let t={applicationId:e.appId,issuer:{url:e.issuerUrl}};e.logger?e.logger.debug("Seeka auth: getting issuer",{...t}):console.debug("Seeka auth: getting issuer",{...t});let i=new b(e.appId,e.applicationInstallId),r=Ee(e.issuerUrl+"_"+e.appId),n=await i.getOrSet(r,async()=>{try{let a=await dt(e);return!a||!a.meta||!a.raw?null:(e.logger?e.logger.verbose("Seeka auth: got issuer from remote",{...t}):console.debug("Seeka auth: got issuer from remote",{...t}),{value:a.meta,expiryAbsoluteMilliseconds:1e3*60*60})}catch(a){return e.logger?e.logger.error("Seeka auth: failed getting issuer",{...t,ex:_.default.exceptions.getAllInfo(a)}):console.error("Seeka auth: failed getting issuer",{...t}),null}},async()=>{e.logger?e.logger.verbose("Seeka auth: got issuer from cache",{...t}):console.debug("Seeka auth: got issuer from cache",{...t})});return n===null?null:new P.Configuration(n.serverMetadata,n.clientId,e.appSecret)},dt=async e=>{let t={applicationId:e.appId,issuer:{url:e.issuerUrl}};e.logger?e.logger.verbose("Seeka auth: discovering issuer from remote",{...t}):console.info("Seeka auth: discovering issuer from remote",{...t});try{let i=e.appId.replace(/-/g,""),r=await(0,P.discovery)(new URL(e.issuerUrl),i,void 0,(0,P.None)(),{timeout:1e4});return e.logger?e.logger.verbose("Seeka auth: discovered issuer from remote",{...t,client_id:r.clientMetadata().client_id}):console.info("Seeka auth: discovered issuer from remote",{...t,client_id:r.clientMetadata().client_id}),{meta:{serverMetadata:r.serverMetadata(),clientMetadata:r.clientMetadata(),timeout:r.timeout,clientId:i},raw:r}}catch(i){return e.logger?e.logger.error("Seeka auth: failed discovering issuer from remote",{...t,ex:_.default.exceptions.getAllInfo(i)}):console.error("Seeka auth: failed discovering issuer from remote",{...t,err:i}),null}},pt=async e=>{let t={applicationId:e.appId,issuer:{url:e.issuerUrl}},i=await D(e);if(!i)return null;try{let r=await(0,P.clientCredentialsGrant)(i,{resource:i.clientMetadata().client_id}),n={...t,token:{expires_at:r.expires_at,token_type:r.token_type,scope:r.scope}};return e.logger?e.logger.verbose("Seeka auth: got client access token from server",{...n}):console.info("Seeka auth: got app client token from server",{...n}),{token_type:r.token_type,access_token:r.access_token,expires_in:r.expires_in,id_token:r.id_token,refresh_token:r.refresh_token,scope:r.scope,authorization_details:r.authorization_details}}catch(r){let n={...t,error:r};return e.logger?e.logger.error("Seeka auth: failed to get client access token from server",{...n}):console.error("Seeka auth: failed to get client access token from server",{...n,err:_.default.exceptions.getAllInfo(r)}),null}},Ue=async(e,t)=>{let i={applicationId:t.appId,issuer:{url:t.issuerUrl}},r=await D(t);if(!r||!r)return null;try{let n=await(0,P.genericGrantRequest)(r,"app_install_token",{applicationInstallId:t.applicationInstallId,access_token:e,scope:"Seeka.API.Ingest"}),a={...i,token:{expires_at:n.expires_at,token_type:n.token_type,scope:n.scope}};return t.logger?t.logger.verbose("Seeka auth: got app access token from server",{...a}):console.info("Seeka auth: got app access token from server",{...a}),{token_type:n.token_type,access_token:n.access_token,expires_in:n.expires_in,id_token:n.id_token,refresh_token:n.refresh_token,scope:n.scope,authorization_details:n.authorization_details}}catch(n){let a={...i,error:n};return t.logger?t.logger.error("Seeka auth: failed to get app access token from server",{...a}):console.debug("Seeka auth: failed to get app access token from server",{...a}),null}},V=async e=>{let t=new b(e.appId,e.applicationInstallId),i={applicationId:e.appId,issuer:{url:e.issuerUrl}};return await t.getOrSet("auth:token:appinstall",async()=>{let r=await pt(e);if(!r||!r.access_token)return null;let n=await Ue(r.access_token,e);return n?{value:n,expiryAbsoluteMilliseconds:((n.expires_in>r.expires_in?r.expires_in:n.expires_in)||900*1e3)-60*1e3}:null},async()=>{e.logger?e.logger.verbose("Seeka auth: got app token from cache",{...i}):console.debug("Seeka auth: got app token from cache",{...i})})},Ne="https://router.seeka.services",gt="https://router.seeka.services/tel/otel",Me="https://account.seeka.app",mt=(e,t,i,r,n)=>{let a=new Z;return a.appId=e.applicationId,a.appSecret=t,a.ingestUrl=process.env.SEEKA_INGEST_URL||Ne,a.issuerUrl=process.env.SEEKA_ISSUER_URL||Me,a.organisationId=e.organisationId,a.applicationInstallId=e.applicationInstallId,a.runtime={type:"sdk/js/apps-server",ver:ot.split("-")[0],client:i},a.logger=n,a.grantedPermissions=r,a.transformApiRequest=s=>yt(a,s),a.transformApiResponse=async(s,o,l)=>ht(a,s,o,l),a.hasAnyPermissions=s=>!a.grantedPermissions||a.grantedPermissions.length===0?!1:!s||s.length===0?!0:s.some(o=>a.grantedPermissions.includes(o)),a.hasAllPermissions=s=>!a.grantedPermissions||a.grantedPermissions.length===0?!1:!s||s.length===0?!0:s.every(o=>a.grantedPermissions.includes(o)),a.hasPermission=s=>!a.grantedPermissions||a.grantedPermissions.length===0?!1:s?a.grantedPermissions.includes(s):!0,a},yt=async(e,t)=>{let i=await V(e);if(!i||!i.access_token)throw new Error("Could not get access token for API request");return t.headers={...t.headers,"X-OrgId":e.organisationId,Authorization:"Bearer "+i?.access_token},t},ht=async(e,t,i,r)=>(i.data=JSON.stringify(i.data),r(i)),h={identity:{receiveFull:"Identity.Receive.Pii",send:"Identity.Send"},activity:{receiveAnon:"Activity.Receive.Anon",receiveFull:"Activity.Receive.Pii",send:"Activity.Send"}},ft=g(d("axios")),vt=g(d("http")),At=g(d("https")),It=new vt.default.Agent({keepAlive:!0,scheduling:"fifo"}),St=new At.default.Agent({keepAlive:!0,scheduling:"fifo"}),J=e=>{let t=ft.default.create({httpAgent:It,httpsAgent:St});return t.interceptors.request.use(function(i){let r={url:i.url,method:i.method};return process.env.LOGGING_LEVEL==="silly"&&(r={...r,body:i.data,params:i.params}),e.logger?e.logger.debug(`Seeka API: making call to ${r.url}`,{...r}):console.debug(`Seeka API: making call to ${r.url}`,{...r}),i},function(i){let r={error:i};return e.logger?e.logger.http("Seeka API: failed to send request",{...r}):console.debug("Seeka API: failed to send request",{...r}),Promise.reject(i)}),t.interceptors.response.use(function(i){let r={url:i.request?.url||i.config.url,method:i.request?.method||i.config.method,response:{status:i.status}};return e.logger?e.logger.http(`Seeka API: call to ${r.url} succeeded`,{...r}):console.debug(`Seeka API: call to ${r.url} succeeded`,{...r}),i},function(i){let{code:r,status:n,message:a}=i,{headers:s,url:o,method:l}=i?.config,u={code:r,status:n,message:a,headers:s,url:o,method:l,content:i?.response?.data};return e.logger?e.logger.error(`Seeka API: call to ${u.url} failed`,{...u}):console.error(`Seeka API: call to ${u.url} failed`,{...u}),Promise.reject(i)}),t},z={getIdentityService:e=>new ee(e,e.ingestUrl,J(e)),getIngestService:e=>new te(e,e.ingestUrl,J(e))},Oe=class{constructor(e){this.config=e,this.ingestionService=z.getIngestService(e),this.identityService=z.getIdentityService(e)}config;maxBatchSize=50;refreshOrPrimeTokenCache=async()=>{await V(this.config)};ingestionService;identityService;checkPermission=(e,t)=>{if(!this.config.hasPermission(e))throw new Error("Cannot perform operation "+t+" on installationId "+this.config.applicationInstallId+" without permission "+e+". Currently granted permissions: "+(this.config.grantedPermissions?this.config.grantedPermissions.join(", "):"none"));return!0};mergeIdentity=async(e,t)=>{this.checkPermission(h.identity.send,"mergeIdentity");let i=T();return(await this.identityService.merge({id:e,src:{method:"",origin:t.origin,time:void 0,loc:t.loc,sess:i,diag:process.env.SEEKA_DEBUG_ENABLED==="true"?i:void 0,runtime:this.config.runtime}})).result?.personId};mergeIdentityBatch=async(e,t)=>{this.checkPermission(h.identity.send,"mergeIdentityBatch");let i=T();if(e.length===0){this.config.logger?.debug("No identities in batch");return}let r={method:"",origin:t.origin,time:void 0,loc:t.loc,sess:i,diag:process.env.SEEKA_DEBUG_ENABLED==="true"?i:void 0,runtime:this.config.runtime},n=M(e,this.maxBatchSize);if(n.length>1&&this.config.logger&&this.config.logger.debug(`Identity batch size ${e} is greater than ${this.maxBatchSize}, splitting into ${n.length} batches`),await this.trackActivityBatchRaw({data:n[0].map(a=>({id:{id:a||{},src:{...r}}}))}),n.length>1){let a=n.map((s,o)=>o===0?Promise.resolve():(this.config.logger?.verbose(`Processing identity batch ${o+1} of ${n.length}`),this.trackActivityBatchRaw({data:s.map(l=>({id:{id:l||{},src:{...r}}}))})));await Promise.all(a)}};trackActivityBatch=async(e,t)=>{this.checkPermission(h.activity.send,"trackActivityBatch");let i=T();if(e.length===0){this.config.logger?.debug("No activities in batch");return}let r={method:"",origin:t.origin,time:void 0,loc:t.loc,sess:i,diag:process.env.SEEKA_DEBUG_ENABLED==="true"?i:void 0,runtime:this.config.runtime},n=M(e,this.maxBatchSize);if(n.length>1&&this.config.logger&&this.config.logger.debug(`Activity batch size ${e.length} is greater than ${this.maxBatchSize}, splitting into ${n.length} batches`),await this.trackActivityBatchRaw({data:n[0].map(a=>({ev:{id:a.profile||{},src:{...r},payload:a.activity}}))}),n.length>1){let a=n.map((s,o)=>o===0?Promise.resolve():(this.config.logger?.verbose(`Processing activity batch ${o+1} of ${n.length}`),this.trackActivityBatchRaw({data:s.map(l=>({ev:{id:l.profile||{},src:{...r},payload:l.activity}}))})));await Promise.all(a)}};trackActivityBatchRaw=async e=>{await this.ingestionService.batch(e)};trackActivityForProfileId=async(e,t,i)=>{this.checkPermission(h.activity.send,"trackActivityForProfileId"),await this.trackActivityForProfileIdBatch([e],t,i)};trackActivityForProfileIdBatch=async(e,t,i)=>{this.checkPermission(h.activity.send,"trackActivityForProfileIdBatch"),await this.trackActivityBatch(e.map(r=>({activity:r,profile:t?{seekaPId:t}:void 0})),i)};trackActivityForProfile=async(e,t,i)=>{this.checkPermission(h.activity.send,"trackActivityForProfile"),await this.trackActivityForProfileBatch([e],t,i)};trackActivityForProfileBatch=async(e,t,i)=>{this.checkPermission(h.activity.send,"trackActivityForProfileBatch"),await this.trackActivityBatch(e.map(r=>({activity:r,profile:t})),i)}},kt={measureAdvertisingPerformance:7},Pt=g(d("crypto")),O="x-seeka-signature-sha256",Re=(e,t,i)=>{if(!t)return!1;let r=null;if(t.get&&typeof t.get=="function")r=t.get(O);else{let a=t[O];a&&(Array.isArray(a)&&a.length>0?r=a[0]:(typeof a=="string"||a instanceof String)&&(r=a))}if(!r)return!1;let n=bt(e,i)===r;return n||console.warn("Invalid webhook signature"),n},bt=(e,t)=>Pt.createHmac("sha256",e).update(t).digest("hex"),wt=(e,t,i)=>{if(!Re(e,t,i))throw new Error("Invalid webhook signature")},k=g(d("crypto")),_e="aes-192-cbc",De=(e,t)=>{if(!e)return"";if(!t)throw new Error("Secret is required to encrypt data");let i=k.default.scryptSync(t,"salt",24),r=k.default.randomBytes(16),n=k.default.createCipheriv(_e,i,r);return[n.update(e,"utf8","hex")+n.final("hex"),Buffer.from(r).toString("hex")].join("|")},Ve=(e,t)=>{if(!e)return"";if(!t)throw new Error("Secret is required to decrypt data");let[i,r]=e.split("|");if(!r)throw new Error("IV not found");let n=k.default.scryptSync(t,"salt",24),a=k.default.createDecipheriv(_e,n,Buffer.from(r,"hex"));return a.update(i,"hex","utf8")+a.final("utf8")},xt=class{constructor(e){this.appSecret=e}appSecret;encryptWithAppSecret=e=>{if(!this.appSecret)throw new Error("App secret is required to encrypt data");return De(e,this.appSecret)};decryptWithAppSecret=e=>{if(!this.appSecret)throw new Error("App secret is required to decrypt data");return Ve(e,this.appSecret)}},Tt=class Be{constructor(t,i){this.context=t,this.api=new Oe(t.config),this.appCache=new b(t.config.appId),this.appInstallCache=new b(t.config.appId,t.config.applicationInstallId),this.crypto=new xt(t.config.appSecret),this.logger=i}context;appCache;appInstallCache;api;logger;crypto;static create=(t,i,r,n,a)=>new Be({config:mt({...i},t,{type:r.name,ver:r.version.split("-")[0]},n,a)},a)},Ct=g(d("winston")),U=d("lodash-es"),p=e=>e==null||e===""||String(e).trim()===""?"":String(e);function Le(e){if(e==null||e==="")return 0;let t=e.toString().replace(/[^0-9.]/g,"");return Number.isNaN(Number(t))?0:Number(t)}function Et(e){if(e==null||e===0||e==="")return+"0.00";let t=Le(e);return Number(t.toFixed(3))}function Ut(e){return e==null||e===""||Number.isNaN(Number(e.toString()))?0:Math.floor(Number(e))}function Nt(e){return JSON.parse(JSON.stringify(e))}function Mt(e){return/^-?\d+$/.test(e)}function Ot(e){if(!(e==null||e.length===0))return Fe(e)}function Fe(e){return(0,U.last)(e)}function Rt(e,t){return(0,U.get)(e,t)}function _t(e,t,i){return(0,U.set)(e,t,i)}function Dt(e,t){return(0,U.isEqual)(e,t)}function Vt(e){return e?e.trim().toLowerCase():""}function Bt(e){return e==null?"":(e=e.trim().replace(/-/gi,"").replace(/\(/gi,"").replace(/\)/gi,"").replace(/ /g,"").replace(/\+/g,""),e)}var Lt=["order","subscriptionItemPurchase","oneTimeItemPurchase"],Ft=(e,t,i)=>{if(!e.activity)return[];let r=e.activity,n=r.activityName==="custom"?r.activityNameCustom:r.activityName;if(!n)return[];let a=n.toLowerCase(),s=[];return t.forEach(o=>{if(!o)return;switch(o.type){case"activityTracked":{if(!o.activityNames||!o.activityNames.find(c=>c.toLowerCase()===a))return;i.verbose("Matched activity tracked filter",{filter:o,activityName:n});break}case"purchaseMade":{if(!r.activityName||!Lt.includes(r.activityName))return;i.verbose("Matched purchase made activity filter",{filter:o,activityName:n});break}default:{i.warn("Unknown activity filter type",{filter:o});return}}let l=o.sourceFilter;if(!l)return;let u=e.source,v;try{v=u?.loc?new URL(u.loc).hostname.toLowerCase():null}catch(c){i.error("Failed to parse activity source URL",{ex:Ct.default.exceptions.getAllInfo(c),activitySource:u}),v=null}let S=u?.pipeline?.convergePipelineIntegrationInstanceId?.toLowerCase(),A=l.filters?l.filters.map(c=>{switch(c.type){case"wildcard":return i.verbose("Matched wildcard source filter",{sourceFilter:c}),!0;case"domain":return!v||!c.key?!1:v===c.key.toLowerCase()?(i.verbose("Matched domain source filter",{sourceFilter:c,activityHostname:v}),!0):!1;case"pipeline":return!S||!c.key?!1:S===c.key.toLowerCase()?(i.verbose("Matched pipeline source filter",{sourceFilter:c,sourceConvergePipelineIntegrationInstanceId:S}),!0):!1}}):[];switch(l.comparer){case"and":{A.every(c=>c===!0)&&s.push(o);break}case"or":{A.some(c=>c===!0)&&s.push(o);break}default:{i.warn("Unknown source filter comparer",{sourceFilters:l});break}}}),s},qt=(e,t=!1)=>{let i=e.commerce,r=i?.totalPrice||i?.products?.map(a=>(a.unitPrice||0)*(a.quantity||1)).reduce((a,s)=>a+s,0)||void 0,n=i?.currencyCode||null;if((!r||r<=0)&&(r=e?.lead?.predictedLtv||e?.lead?.predictedValue,r&&e?.lead?.currencyCode&&(n=e?.lead?.currencyCode||null)),(!r||r<=0)&&(r=e?.contentItem?.value,r&&e?.contentItem?.currencyCode&&(n=e?.contentItem?.currencyCode||null)),(!r||r<=0)&&(e?.contentItem?.items&&e?.contentItem?.items.length>0&&(r=e?.contentItem?.items.map(a=>a&&a.unitPrice?a.unitPrice*(a.quantity||1):0).reduce((a,s)=>a+s,0)),r&&(n=e?.contentItem?.currencyCode||e?.commerce?.currencyCode||null,!n))){let a=e?.contentItem?.items?.filter(s=>s.currencyCode)||[];a.length>0&&(n=a[0].currencyCode||null)}if((!r||r<=0)&&e?.commerce?.products&&e?.commerce?.products.length>0&&(r=e?.commerce?.products.map(a=>a&&a.unitPrice?a.unitPrice*(a.quantity||1):0).reduce((a,s)=>a+s,0),r&&(n=e?.commerce?.currencyCode||null,!n))){let a=e?.commerce?.products?.filter(s=>s.currencyCode)||[];a.length>0&&(n=a[0].currencyCode||null)}return(!r||r<=0)&&!n?null:{value:r===0&&t?null:r||null,currencyCode:n}};function $t(e,t,i){if(!e)return;let r=t.processing?.contentIdentificationBehavior,n=null;(i=="googleAnalytics"||i=="googleAds")&&(t.analytics?.libraries?.googleAnalytics?.merchant?.productItemIdBehavior!=null&&(r=t.analytics?.libraries?.googleAnalytics?.merchant?.productItemIdBehavior),n=p(t.analytics?.libraries?.googleAnalytics?.merchant?.productItemIdPrefix));let a;switch(r){case"sku":a=e?.sku;break;case"productId":a=e?.productIdentifier;break;case"variantId":a=e?.variantIdentifier;break;case"productIdAndVariantIdUnderscore":p(e.variantIdentifier)&&p(e.productIdentifier)?a=`${e.productIdentifier}_${e.variantIdentifier}`:p(e.variantIdentifier)?a=e.variantIdentifier:a=e.productIdentifier;break;case"variantIdOrProductId":p(e.variantIdentifier)?a=e.variantIdentifier:a=e.productIdentifier;break;default:a=p(e?.sku)||p(e?.variantIdentifier)||p(e?.productIdentifier);break}return n?`${n}${a}`:a}function Kt(e,t){return p(e?.variantName)||p(e?.productName)}function Gt(e){if(!e||e.trim().length===0)return!1;let t=e.split(".").filter(i=>i.trim().length>0);return!(t.length!==4||t[0].toLowerCase()!=="sk".toLowerCase()||t[1].toLowerCase()!=="1".toLowerCase()||isNaN(parseInt(t[2],10))||isNaN(parseInt(t[3],10)))}var Wt={defaultIssuerUrl:Me,defaultTelemetryUrl:gt,defaultIngestUrl:Ne}});var Ge=H(B(),1);import{fetch as ir,Headers as nr}from"undici";import{jwtDecode as ar}from"jwt-decode";var Ht=new TextEncoder;function L(e){let t=e>>>0,i=[];for(;t>=128;)i.push(t&127|128),t>>>=7;return i.push(t),Uint8Array.from(i)}function F(e,t){let i=e<<3|t;return L(i)}function I(e,t){if(t==null)return[];let i=Ht.encode(t);return[F(e,2),L(i.length),i]}function y(e,t){return[F(e,2),L(t.length),t]}function jt(e,t){if(t==null)return[];let i=new ArrayBuffer(8);return new DataView(i).setFloat64(0,t,!0),[F(e,1),new Uint8Array(i)]}function m(e){let t=e.filter(a=>a instanceof Uint8Array),i=t.reduce((a,s)=>a+s.length,0),r=new Uint8Array(i),n=0;for(let a of t)r.set(a,n),n+=a.length;return r}function Jt(e){if(!e)return new Uint8Array(0);let t;if("stringValue"in e&&typeof e.stringValue=="string")t=e.stringValue;else{let r=e.doubleValue??e.intValue??e.boolValue??e.bytesValue??e.arrayValue??e.kvlistValue;try{t=typeof r=="string"?r:JSON.stringify(r)}catch{t=String(r)}}let i=m(I(1,t));return i}function zt(e){let t=[];return t.push(...I(1,e.key)),t.push(...y(2,Jt(e.value))),m(t)}function Yt(e){if(!e)return new Uint8Array(0);let t=[];for(let i of e.attributes??[])t.push(...y(1,zt(i)));return m(t)}function Qt(e){let t=[];return e&&(t.push(...I(1,e.name)),t.push(...I(2,e.version))),m(t)}function Xt(e){let t=[];return t.push(...jt(4,e.asDouble)),m(t)}function Zt(e){let t=[];for(let i of e.dataPoints??[])t.push(...y(1,Xt(i)));return m(t)}function er(e){let t=[];return t.push(...I(1,e.name)),t.push(...I(2,e.description)),t.push(...I(3,e.unit)),e.gauge&&t.push(...y(5,Zt(e.gauge))),m(t)}function tr(e){let t=[];t.push(...y(1,Qt(e.scope)));for(let i of e.metrics??[])t.push(...y(2,er(i)));return m(t)}function rr(e){let t=[];t.push(...y(1,Yt(e.resource)));for(let i of e.scopeMetrics??[])t.push(...y(2,tr(i)));return m(t)}function $e(e){let t=[];for(let i of e.resourceMetrics??[]){let r=rr(i);t.push(...y(1,r))}return m(t)}var q=e=>{let t=r=>String(r).padStart(2,"0"),i=r=>String(r).padStart(3,"0");return e.getUTCFullYear()+"-"+t(e.getUTCMonth()+1)+"-"+t(e.getUTCDate())+"T"+t(e.getUTCHours())+":"+t(e.getUTCMinutes())+":"+t(e.getUTCSeconds())+"."+i(e.getUTCMilliseconds())};var $=H(B(),1);import"winston";var Ke="seeka.tel",K=class{options;constructor(t){this.options=t}pushStr=(t,i,r)=>{i!=null&&r.push({key:`${Ke}.${t}`,value:{stringValue:String(i)}})};getStr(t,i){let r=`${Ke}.${t}`,n=i.find(a=>a.key===r);if(n?.value&&"stringValue"in n.value)return n.value.stringValue}sendEgressMetric=async(t,i)=>{let r=[],n=o=>{if(typeof o=="string")return o;try{return JSON.stringify(o??{})}catch{return'""'}},a=new Date;this.pushStr("type","record.activity.egress",r),this.pushStr("originActivityId",t.originActivityId,r),this.pushStr("occurredAt",q(t.occurredAt||a),r),this.pushStr("timestamp",q(a),r),this.pushStr("personId",t.personId,r),this.pushStr("originSessionIdentifier",t.originSessionIdentifier,r),this.pushStr("originDnsName",t.originDnsName,r),this.pushStr("destinationPlatformIdentifier",t.destinationPlatformIdentifier,r),this.pushStr("destinationPlatformEgressType",t.destinationPlatformEgressType,r),this.pushStr("destinationPlatformTypeKey",t.destinationPlatformTypeKey,r),this.pushStr("originActivityName",t.originActivityName,r),this.pushStr("originActivityNameCustom",t.originActivityNameCustom,r),this.pushStr("publishedPayload",n(t.publishedPayload),r),this.pushStr("egressQualityMetrics",n(t.egressQualityMetrics),r),this.pushStr("egressIdentityMetrics",n(t.egressIdentityMetrics),r);let s={resourceMetrics:[{resource:{attributes:r},scopeMetrics:[{scope:{name:"seeka.telemetry.apps-server-host",version:"0.0.0"},metrics:[{name:"record.activity.egress",description:"Activity egress record",unit:"1",gauge:{dataPoints:[{asDouble:1}]}}]}]}]};await this.sendMetric(s,i)};sendMetric=async(t,i)=>{let{telemetryEndpointUrl:r,logger:n,issuerUrl:a,appId:s,appSecret:o}=this.options;if(!t||!Array.isArray(t.resourceMetrics))throw new Error("SeekaTelemetry: metric must be an OTLP ExportMetricsServiceRequest with a resourceMetrics array");let l={appId:s,appSecret:o,issuerUrl:a,ingestUrl:r,applicationInstallId:i.appInstallId,logger:n,grantedPermissions:[],runtime:this.getRuntimeInfo()},u=await(0,Ge.getNewOrCachedAppInstallToken)(l);if(!u||!u.access_token)throw new Error("SeekaTelemetry: failed to get access token for install");let v=r.endsWith("/")?r:r+"/",S=new URL("v1/metrics",v).toString(),A=ar(u.access_token),c=new nr;c.set("Content-Type",this.options.protobuf?"application/x-protobuf":"application/json"),c.set("Accept",this.options.protobuf?"application/x-protobuf":"application/json"),c.set("Authorization",`Bearer ${u.access_token}`),c.set("X-OrgId",A.tenantid);let w=t.resourceMetrics[0]?.resource?.attributes||[];this.pushStr("tenantId",A.tenantid,w),this.pushStr("organisationBrandId",A.org_brand_id,w),this.getStr("type",w)==="record.activity.egress"&&this.pushStr("convergeInstanceId",A.converge_instance_id,w);let We=this.options.protobuf?$e(t):JSON.stringify(t),x=await ir(S,{method:"POST",headers:c,body:We});if(x.ok)n?.debug("SeekaTelemetry: metric send succeeded");else{let He=await x.text().catch(()=>""),G=`SeekaTelemetry: metric send failed with status ${x.status} ${x.statusText}`;throw n?.error(G,{body:He}),new Error(G)}};shutdown=async()=>{};getRuntimeInfo(){return{type:"sdk/js/apps-server-telemetry-core",ver:"0.0.0",client:{type:"server",ver:process.versions?.node||"unknown"}}}},br=(e,t)=>new K({...e,appId:e?.appId||process.env.SEEKA_APP_ID,appSecret:e?.appSecret||process.env.SEEKA_APP_SECRET,telemetryEndpointUrl:e?.telemetryEndpointUrl||process.env.SEEKA_TELEMETRY_URL||$.urls.defaultTelemetryUrl,issuerUrl:e?.issuerUrl||process.env.SEEKA_ISSUER_URL||$.urls.defaultIssuerUrl,logger:t});var sr=(r=>(r[r.AGGREGATION_TEMPORALITY_UNSPECIFIED=0]="AGGREGATION_TEMPORALITY_UNSPECIFIED",r[r.AGGREGATION_TEMPORALITY_DELTA=1]="AGGREGATION_TEMPORALITY_DELTA",r[r.AGGREGATION_TEMPORALITY_CUMULATIVE=2]="AGGREGATION_TEMPORALITY_CUMULATIVE",r))(sr||{}),xr=(e,t,i)=>({...t,...e,personId:i.personId,originActivityId:i.activity?.activityId,occurredAt:new Date,originActivityName:i.activity?.activityName,originActivityNameCustom:i.activity?.activityNameCustom,originSessionIdentifier:i.source?.sess,originDnsName:new URL(i.source?.loc||"").hostname.toLowerCase()});export{sr as AggregationTemporality,xr as createEgressTelemetryRecord,br as createSeekaTelemetryClient,q as toIsoDateTime};
1
+ var je=Object.create;var W=Object.defineProperty;var Je=Object.getOwnPropertyDescriptor;var ze=Object.getOwnPropertyNames;var Ye=Object.getPrototypeOf,Qe=Object.prototype.hasOwnProperty;var d=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,i)=>(typeof require<"u"?require:t)[i]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var Xe=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Ze=(e,t,i,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of ze(t))!Qe.call(e,n)&&n!==i&&W(e,n,{get:()=>t[n],enumerable:!(r=Je(t,n))||r.enumerable});return e};var H=(e,t,i)=>(i=e!=null?je(Ye(e)):{},Ze(t||!e||!e.__esModule?W(i,"default",{value:e,enumerable:!0}):i,e));var B=Xe((cr,qe)=>{"use strict";var et=Object.create,E=Object.defineProperty,tt=Object.getOwnPropertyDescriptor,rt=Object.getOwnPropertyNames,it=Object.getPrototypeOf,nt=Object.prototype.hasOwnProperty,at=(e,t)=>{for(var i in t)E(e,i,{get:t[i],enumerable:!0})},Y=(e,t,i,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of rt(t))!nt.call(e,n)&&n!==i&&E(e,n,{get:()=>t[n],enumerable:!(r=tt(t,n))||r.enumerable});return e},g=(e,t,i)=>(i=e!=null?et(it(e)):{},Y(t||!e||!e.__esModule?E(i,"default",{value:e,enumerable:!0}):i,e)),st=e=>Y(E({},"__esModule",{value:!0}),e),Q={};at(Q,{ActivityPipelineActivityFilterSourceItemType:()=>ye,ActivityPipelineActivityFilterType:()=>ge,AnalyticsLibrary:()=>fe,ApiException:()=>we,ApiServiceProxyBase:()=>R,AppPermissionKeys:()=>h,ClickAttributionSourcePlatform:()=>pe,ConditionComparer:()=>me,ConditionOperator:()=>he,ConsentMappingMatchType:()=>Pe,ContentIdentificationBehavior:()=>ve,ConvergePipelineLoggableActivityType:()=>le,ConvergeVendorDestinationPublishStrategy:()=>Ae,CrossDomainTrackingUtmBehavior:()=>Ie,ECommerceContentType:()=>ae,ECommerceFinancialStatus:()=>ce,ECommerceFulfillmentStatus:()=>oe,ECommercePlatform:()=>se,IabPrivacyConsentPurposeId:()=>ke,IabPrivacyConsentPurposeIdMap:()=>kt,IdentityServiceProxy:()=>ee,IngestServiceProxy:()=>te,PrivacyConsentType:()=>ie,PrivacyDataControlMode:()=>be,RegionalConsentGrantOption:()=>Se,ResponseResultType:()=>re,SdkLogEventLevel:()=>ue,SeekaApiHelper:()=>Oe,SeekaAppCacheManager:()=>b,SeekaAppConfig:()=>Z,SeekaAppHelper:()=>Tt,SeekaWebhookCallType:()=>de,TrackingActivityNames:()=>C,TrackingEventSourceOriginType:()=>ne,chunk:()=>M,cloneDeep:()=>Nt,dateToUtcDateTimeReferenceString:()=>Ce,decryptText:()=>Ve,emailAddress:()=>Vt,encryptText:()=>De,generateNewSessionId:()=>T,getActivityName:()=>lt,getActivityValue:()=>qt,getContentIdFromProduct:()=>$t,getContentNameFromProduct:()=>Kt,getIssuer:()=>D,getNestedProperty:()=>Rt,getNewAppInstallToken:()=>Ue,getNewOrCachedAppInstallToken:()=>V,getRandomNumberString:()=>Te,isDeepEqual:()=>Dt,isNumber:()=>Mt,isValidSeekaProfileId:()=>Gt,last:()=>Fe,lastOrDefault:()=>Ot,matchActivityPipelineFilters:()=>Ft,md5Hash:()=>Ee,parseFloat:()=>Le,parseInt:()=>Ut,parseMoney:()=>Et,parseStr:()=>p,phoneNumberToE164:()=>Bt,separatePersonFullName:()=>ut,setNestedProperty:()=>_t,throwOnInvalidWebhookSignature:()=>wt,urls:()=>Wt,validateWebhookSignature:()=>Re,webhookSignatureHeaderName:()=>O});qe.exports=st(Q);var ot="3.10.0",X=g(d("axios")),Z=class{appId;appSecret;ingestUrl;issuerUrl;organisationId;applicationInstallId;runtime;logger;grantedPermissions;transformApiRequest;transformApiResponse;hasAnyPermissions;hasAllPermissions;hasPermission},R=class{config;constructor(e){this.config=e}transformOptions=async e=>await this.config.transformApiRequest(e);transformResult=async(e,t,i)=>await this.config.transformApiResponse(e,t,i)},ee=class extends R{instance;baseUrl;jsonParseReviver=void 0;constructor(e,t,i){super(e),this.instance=i||X.default.create(),this.baseUrl=t??"https://api-localdev-env0-seeka.au.ngrok.io"}merge(e,t){let i=this.baseUrl+"/api/identity";i=i.replace(/[?&]$/,"");let r={data:JSON.stringify(e),method:"POST",url:i,headers:{"Content-Type":"application/json",Accept:"application/json"},cancelToken:t};return this.transformOptions(r).then(n=>this.instance.request(n)).catch(n=>{if(xe(n)&&n.response)return n.response;throw n}).then(n=>this.transformResult(i,n,a=>this.processMerge(a)))}processMerge(e){let t=e.status,i={};if(e.headers&&typeof e.headers=="object")for(let r in e.headers)e.headers.hasOwnProperty(r)&&(i[r]=e.headers[r]);if(t===200){let r=e.data,n=null;return n=JSON.parse(r),Promise.resolve(n)}else if(t===400){let r=e.data,n=null;return n=JSON.parse(r),f("A server side error occurred.",t,r,i,n)}else if(t===401){let r=e.data,n=null;return n=JSON.parse(r),f("A server side error occurred.",t,r,i,n)}else if(t===422){let r=e.data,n=null;return n=JSON.parse(r),f("A server side error occurred.",t,r,i,n)}else if(t!==200&&t!==204){let r=e.data;return f("An unexpected server error occurred.",t,r,i)}return Promise.resolve(null)}},te=class extends R{instance;baseUrl;jsonParseReviver=void 0;constructor(e,t,i){super(e),this.instance=i||X.default.create(),this.baseUrl=t??"https://api-localdev-env0-seeka.au.ngrok.io"}batch(e,t){let i=this.baseUrl+"/api/ingest";i=i.replace(/[?&]$/,"");let r={data:JSON.stringify(e),method:"POST",url:i,headers:{"Content-Type":"application/json"},cancelToken:t};return this.transformOptions(r).then(n=>this.instance.request(n)).catch(n=>{if(xe(n)&&n.response)return n.response;throw n}).then(n=>this.transformResult(i,n,a=>this.processBatch(a)))}processBatch(e){let t=e.status,i={};if(e.headers&&typeof e.headers=="object")for(let r in e.headers)e.headers.hasOwnProperty(r)&&(i[r]=e.headers[r]);if(t===202){let r=e.data;return Promise.resolve(null)}else if(t===400){let r=e.data,n=null;return n=JSON.parse(r),f("A server side error occurred.",t,r,i,n)}else if(t===401){let r=e.data,n=null;return n=JSON.parse(r),f("A server side error occurred.",t,r,i,n)}else if(t===422){let r=e.data,n=null;return n=JSON.parse(r),f("A server side error occurred.",t,r,i,n)}else if(t!==200&&t!==204){let r=e.data;return f("An unexpected server error occurred.",t,r,i)}return Promise.resolve(null)}},re=(e=>(e.Undefined="undefined",e.Success="success",e.Failed="failed",e))(re||{}),ie=(e=>(e.Unknown="unknown",e.Informed="informed",e.Implied="implied",e.Explicit="explicit",e.Active="active",e.Passive="passive",e))(ie||{}),ne=(e=>(e.Browser="browser",e.Server="server",e.Mobile="mobile",e.Desktop="desktop",e.PhysicalStore="physicalStore",e.Email="email",e.Phone="phone",e.Chat="chat",e.Automatic="automatic",e))(ne||{}),C=(e=>(e.Undefined="undefined",e.PageViewOrganic="pageViewOrganic",e.PageViewUtmAttributed="pageViewUtmAttributed",e.AddPaymentMethod="addPaymentMethod",e.AddToWishlist="addToWishlist",e.ContactMessage="contactMessage",e.Custom="custom",e.SyncCart="syncCart",e.Order="order",e.InitiateCheckout="initiateCheckout",e.AddToCart="addToCart",e.RemoveFromCart="removeFromCart",e.OneTimeItemPurchase="oneTimeItemPurchase",e.SubscriptionItemPurchase="subscriptionItemPurchase",e.ViewProduct="viewProduct",e.ViewPage="viewPage",e.ApplyPromotionalCode="applyPromotionalCode",e.KeywordSearch="keywordSearch",e.UserLoginSignup="userLoginSignup",e.UserLogin="userLogin",e.NewsletterSignup="newsletterSignup",e.Lead="lead",e.ChangeProductAttribute="changeProductAttribute",e.FilterItemsByAttribute="filterItemsByAttribute",e.Schedule="schedule",e.ViewContentItem="viewContentItem",e.StartTrial="startTrial",e))(C||{}),ae=(e=>(e.Undefined="undefined",e.SingleProduct="singleProduct",e.SingleVariant="singleVariant",e.Collection="collection",e))(ae||{}),se=(e=>(e.None="none",e.BigCommerce="bigCommerce",e.Shopify="shopify",e.OrderGroove="orderGroove",e.Magento="magento",e.Generic="generic",e.WooCommerce="wooCommerce",e.Demandware="demandware",e))(se||{}),oe=(e=>(e.Undefined="undefined",e.Fulfilled="fulfilled",e.NoneFulfilled="noneFulfilled",e.PartiallyFulfilled="partiallyFulfilled",e.RestockedOrCancelled="restockedOrCancelled",e.Pending="pending",e))(oe||{}),ce=(e=>(e.Undefined="undefined",e.Pending="pending",e.Authorized="authorized",e.PartiallyPaid="partiallyPaid",e.Paid="paid",e.PartiallyRefunded="partiallyRefunded",e.Refunded="refunded",e.Voided="voided",e))(ce||{}),le=(e=>(e.Generic="generic",e.ActivityIngress="activityIngress",e.ActivityEgress="activityEgress",e.UserProfile="userProfile",e.SdkLog="sdkLog",e.Detections="detections",e.ActivityEgressFilter="activityEgressFilter",e.Diagnosis="diagnosis",e.PipelineIntegrationOutput="pipelineIntegrationOutput",e))(le||{}),ue=(e=>(e.Information="information",e.Warning="warning",e.Error="error",e.Verbose="verbose",e))(ue||{}),de=(e=>(e.None="none",e.Probe="probe",e.AppInstalled="appInstalled",e.IdentityChanged="identityChanged",e.ActivityAccepted="activityAccepted",e.AppInstallSettingsUpdated="appInstallSettingsUpdated",e.AppUninstalled="appUninstalled",e.BrowserSdkPlugin="browserSdkPlugin",e))(de||{}),pe=(e=>(e.Unknown="unknown",e.Google="google",e.Meta="meta",e.Snapchat="snapchat",e.Pinterest="pinterest",e.TikTok="tikTok",e))(pe||{}),ge=(e=>(e.Undefined="undefined",e.PurchaseMade="purchaseMade",e.ActivityTracked="activityTracked",e))(ge||{}),me=(e=>(e.Undefined="undefined",e.And="and",e.Or="or",e))(me||{}),ye=(e=>(e.Undefined="undefined",e.Domain="domain",e.Pipeline="pipeline",e.Wildcard="wildcard",e.Url="url",e.PagePath="pagePath",e))(ye||{}),he=(e=>(e.Undefined="undefined",e.Equals="equals",e.NotEquals="notEquals",e.Contains="contains",e.NotContains="notContains",e.StartsWith="startsWith",e.EndsWith="endsWith",e.IsNull="isNull",e.NotNull="notNull",e.IsTrue="isTrue",e.IsFalse="isFalse",e.GreaterThanOrEquals="greaterThanOrEquals",e.LessThanOrEquals="lessThanOrEquals",e.GreaterThan="greaterThan",e.LessThan="lessThan",e.Before="before",e.After="after",e.Between="between",e.In="in",e.NotIn="notIn",e.Regex="regEx",e.Any="any",e))(he||{}),fe=(e=>(e.Undefined="undefined",e.Seeka="seeka",e.DynamicYield="dynamicYield",e.Segment="segment",e.FacebookPixel="facebookPixel",e.GoogleAnalytics="googleAnalytics",e.Braze="braze",e.SnapchatPixel="snapchatPixel",e.Pinterest="pinterest",e.TikTokPixel="tikTokPixel",e.GoogleAds="googleAds",e))(fe||{}),ve=(e=>(e.Default="default",e.Sku="sku",e.ProductId="productId",e.VariantId="variantId",e.ProductIdAndVariantIdUnderscore="productIdAndVariantIdUnderscore",e.VariantIdOrProductId="variantIdOrProductId",e))(ve||{}),Ae=(e=>(e.DeliverAllTraitsAndDeliverAllEvents="deliverAllTraitsAndDeliverAllEvents",e.DeliverAllTraitsAndDeliverEventsOnlyIfMaxWeightedTraitsPresent="deliverAllTraitsAndDeliverEventsOnlyIfMaxWeightedTraitsPresent",e.DeliverMaxWeightedTraitsOnlyAndDeliverAllEvents="deliverMaxWeightedTraitsOnlyAndDeliverAllEvents",e.DeliverMaxWeightedTraitsOnlyAndDeliverEventsOnlyIfMaxWeightedTraitsPresent="deliverMaxWeightedTraitsOnlyAndDeliverEventsOnlyIfMaxWeightedTraitsPresent",e))(Ae||{}),Ie=(e=>(e.None="none",e.SessionPassthrough="sessionPassthrough",e.UrlPassthrough="urlPassthrough",e))(Ie||{}),Se=(e=>(e.Unset="unset",e.Granted="granted",e.Denied="denied",e))(Se||{}),ke=(e=>(e.Undefined="undefined",e.MeasureAdvertisingPerformance="measureAdvertisingPerformance",e))(ke||{}),Pe=(e=>(e.Undefined="undefined",e.AllOf="allOf",e.AnyOf="anyOf",e))(Pe||{}),be=(e=>(e.Disabled="disabled",e.Explicit="explicit",e.Implicit="implicit",e))(be||{}),we=class extends Error{message;status;response;headers;result;constructor(e,t,i,r,n){super(),this.message=e,this.status=t,this.response=i,this.headers=r,this.result=n}isApiException=!0;static isApiException(e){return e.isApiException===!0}};function f(e,t,i,r,n){throw n??new we(e,t,i,r,null)}function xe(e){return e&&e.isAxiosError===!0}var P=d("openid-client"),_=g(d("winston")),N=g(d("memory-cache")),j="seeka:sdk",b=class{constructor(e,t){this.appId=e,this.appInstallationId=t}appId;appInstallationId;set=async(e,t,i)=>{let r=this.getKey(e);N.default.put(r,JSON.stringify(t),i)};getOrSet=async(e,t,i)=>{let r=this.getKey(e),n=N.default.get(r);if(n){let s=JSON.parse(n);return i&&await i(s),s}let a=await t();return a?(N.default.put(r,JSON.stringify(a.value),a.expiryAbsoluteMilliseconds),a.value):null};getKey=e=>this.appInstallationId?`${j}:${this.appId}:${this.appInstallationId}:${e}`:`${j}:${this.appId}:${e}`},ct=g(d("crypto")),T=()=>{let e=Ce(new Date),t=Te();return`${e}.${t}`},lt=e=>{let t=Object.keys(C),i=e.toLowerCase(),r=t.find(n=>n.toLowerCase()===i);return r?C[r]:"custom"},Te=()=>Math.floor(Math.random()*(9999999999-1e9)+1e9).toString(),Ce=e=>{let t=(e.getUTCMonth()+1).toString();t.length<2&&(t="0"+t);let i=e.getUTCDate().toString();i.length<2&&(i="0"+i);let r=e.getUTCHours().toString();r.length<2&&(r="0"+r);let n=e.getUTCMinutes().toString();n.length<2&&(n="0"+n);let a=e.getUTCSeconds().toString();return a.length<2&&(a="0"+a),`${e.getUTCFullYear()}${t}${i}.${r}${n}${a}`},Ee=e=>ct.createHash("md5").update(e).digest("hex"),ut=e=>{if(!e)return{firstName:null,lastName:null};let t=e.trim().split(" ");return t.length===1?{firstName:e,lastName:null}:t.length===2?{firstName:t[0],lastName:t[1]}:{firstName:t[0],lastName:t.slice(1).join(" ")}},M=(e,t)=>e.reduce((i,r,n)=>{let a=Math.floor(n/t);return i[a]||(i[a]=[]),i[a].push(r),i},[]),D=async e=>{let t={applicationId:e.appId,issuer:{url:e.issuerUrl}};e.logger?e.logger.debug("Seeka auth: getting issuer",{...t}):console.debug("Seeka auth: getting issuer",{...t});let i=new b(e.appId,e.applicationInstallId),r=Ee(e.issuerUrl+"_"+e.appId),n=await i.getOrSet(r,async()=>{try{let a=await dt(e);return!a||!a.meta||!a.raw?null:(e.logger?e.logger.verbose("Seeka auth: got issuer from remote",{...t}):console.debug("Seeka auth: got issuer from remote",{...t}),{value:a.meta,expiryAbsoluteMilliseconds:1e3*60*60})}catch(a){return e.logger?e.logger.error("Seeka auth: failed getting issuer",{...t,ex:_.default.exceptions.getAllInfo(a)}):console.error("Seeka auth: failed getting issuer",{...t}),null}},async()=>{e.logger?e.logger.verbose("Seeka auth: got issuer from cache",{...t}):console.debug("Seeka auth: got issuer from cache",{...t})});return n===null?null:new P.Configuration(n.serverMetadata,n.clientId,e.appSecret)},dt=async e=>{let t={applicationId:e.appId,issuer:{url:e.issuerUrl}};e.logger?e.logger.verbose("Seeka auth: discovering issuer from remote",{...t}):console.info("Seeka auth: discovering issuer from remote",{...t});try{let i=e.appId.replace(/-/g,""),r=await(0,P.discovery)(new URL(e.issuerUrl),i,void 0,(0,P.None)(),{timeout:1e4});return e.logger?e.logger.verbose("Seeka auth: discovered issuer from remote",{...t,client_id:r.clientMetadata().client_id}):console.info("Seeka auth: discovered issuer from remote",{...t,client_id:r.clientMetadata().client_id}),{meta:{serverMetadata:r.serverMetadata(),clientMetadata:r.clientMetadata(),timeout:r.timeout,clientId:i},raw:r}}catch(i){return e.logger?e.logger.error("Seeka auth: failed discovering issuer from remote",{...t,ex:_.default.exceptions.getAllInfo(i)}):console.error("Seeka auth: failed discovering issuer from remote",{...t,err:i}),null}},pt=async e=>{let t={applicationId:e.appId,issuer:{url:e.issuerUrl}},i=await D(e);if(!i)return null;try{let r=await(0,P.clientCredentialsGrant)(i,{resource:i.clientMetadata().client_id}),n={...t,token:{expires_at:r.expires_at,token_type:r.token_type,scope:r.scope}};return e.logger?e.logger.verbose("Seeka auth: got client access token from server",{...n}):console.info("Seeka auth: got app client token from server",{...n}),{token_type:r.token_type,access_token:r.access_token,expires_in:r.expires_in,id_token:r.id_token,refresh_token:r.refresh_token,scope:r.scope,authorization_details:r.authorization_details}}catch(r){let n={...t,error:r};return e.logger?e.logger.error("Seeka auth: failed to get client access token from server",{...n}):console.error("Seeka auth: failed to get client access token from server",{...n,err:_.default.exceptions.getAllInfo(r)}),null}},Ue=async(e,t)=>{let i={applicationId:t.appId,issuer:{url:t.issuerUrl}},r=await D(t);if(!r||!r)return null;try{let n=await(0,P.genericGrantRequest)(r,"app_install_token",{applicationInstallId:t.applicationInstallId,access_token:e,scope:"Seeka.API.Ingest"}),a={...i,token:{expires_at:n.expires_at,token_type:n.token_type,scope:n.scope}};return t.logger?t.logger.verbose("Seeka auth: got app access token from server",{...a}):console.info("Seeka auth: got app access token from server",{...a}),{token_type:n.token_type,access_token:n.access_token,expires_in:n.expires_in,id_token:n.id_token,refresh_token:n.refresh_token,scope:n.scope,authorization_details:n.authorization_details}}catch(n){let a={...i,error:n};return t.logger?t.logger.error("Seeka auth: failed to get app access token from server",{...a}):console.debug("Seeka auth: failed to get app access token from server",{...a}),null}},V=async e=>{let t=new b(e.appId,e.applicationInstallId),i={applicationId:e.appId,issuer:{url:e.issuerUrl}};return await t.getOrSet("auth:token:appinstall",async()=>{let r=await pt(e);if(!r||!r.access_token)return null;let n=await Ue(r.access_token,e);return n?{value:n,expiryAbsoluteMilliseconds:((n.expires_in>r.expires_in?r.expires_in:n.expires_in)||900*1e3)-60*1e3}:null},async()=>{e.logger?e.logger.verbose("Seeka auth: got app token from cache",{...i}):console.debug("Seeka auth: got app token from cache",{...i})})},Ne="https://router.seeka.services",gt="https://router.seeka.services/tel/otel",Me="https://account.seeka.app",mt=(e,t,i,r,n)=>{let a=new Z;return a.appId=e.applicationId,a.appSecret=t,a.ingestUrl=process.env.SEEKA_INGEST_URL||Ne,a.issuerUrl=process.env.SEEKA_ISSUER_URL||Me,a.organisationId=e.organisationId,a.applicationInstallId=e.applicationInstallId,a.runtime={type:"sdk/js/apps-server",ver:ot.split("-")[0],client:i},a.logger=n,a.grantedPermissions=r,a.transformApiRequest=s=>yt(a,s),a.transformApiResponse=async(s,o,l)=>ht(a,s,o,l),a.hasAnyPermissions=s=>!a.grantedPermissions||a.grantedPermissions.length===0?!1:!s||s.length===0?!0:s.some(o=>a.grantedPermissions.includes(o)),a.hasAllPermissions=s=>!a.grantedPermissions||a.grantedPermissions.length===0?!1:!s||s.length===0?!0:s.every(o=>a.grantedPermissions.includes(o)),a.hasPermission=s=>!a.grantedPermissions||a.grantedPermissions.length===0?!1:s?a.grantedPermissions.includes(s):!0,a},yt=async(e,t)=>{let i=await V(e);if(!i||!i.access_token)throw new Error("Could not get access token for API request");return t.headers={...t.headers,"X-OrgId":e.organisationId,Authorization:"Bearer "+i?.access_token},t},ht=async(e,t,i,r)=>(i.data=JSON.stringify(i.data),r(i)),h={identity:{receiveFull:"Identity.Receive.Pii",send:"Identity.Send"},activity:{receiveAnon:"Activity.Receive.Anon",receiveFull:"Activity.Receive.Pii",send:"Activity.Send"}},ft=g(d("axios")),vt=g(d("http")),At=g(d("https")),It=new vt.default.Agent({keepAlive:!0,scheduling:"fifo"}),St=new At.default.Agent({keepAlive:!0,scheduling:"fifo"}),J=e=>{let t=ft.default.create({httpAgent:It,httpsAgent:St});return t.interceptors.request.use(function(i){let r={url:i.url,method:i.method};return process.env.LOGGING_LEVEL==="silly"&&(r={...r,body:i.data,params:i.params}),e.logger?e.logger.debug(`Seeka API: making call to ${r.url}`,{...r}):console.debug(`Seeka API: making call to ${r.url}`,{...r}),i},function(i){let r={error:i};return e.logger?e.logger.http("Seeka API: failed to send request",{...r}):console.debug("Seeka API: failed to send request",{...r}),Promise.reject(i)}),t.interceptors.response.use(function(i){let r={url:i.request?.url||i.config.url,method:i.request?.method||i.config.method,response:{status:i.status}};return e.logger?e.logger.http(`Seeka API: call to ${r.url} succeeded`,{...r}):console.debug(`Seeka API: call to ${r.url} succeeded`,{...r}),i},function(i){let{code:r,status:n,message:a}=i,{headers:s,url:o,method:l}=i?.config,u={code:r,status:n,message:a,headers:s,url:o,method:l,content:i?.response?.data};return e.logger?e.logger.error(`Seeka API: call to ${u.url} failed`,{...u}):console.error(`Seeka API: call to ${u.url} failed`,{...u}),Promise.reject(i)}),t},z={getIdentityService:e=>new ee(e,e.ingestUrl,J(e)),getIngestService:e=>new te(e,e.ingestUrl,J(e))},Oe=class{constructor(e){this.config=e,this.ingestionService=z.getIngestService(e),this.identityService=z.getIdentityService(e)}config;maxBatchSize=50;refreshOrPrimeTokenCache=async()=>{await V(this.config)};ingestionService;identityService;checkPermission=(e,t)=>{if(!this.config.hasPermission(e))throw new Error("Cannot perform operation "+t+" on installationId "+this.config.applicationInstallId+" without permission "+e+". Currently granted permissions: "+(this.config.grantedPermissions?this.config.grantedPermissions.join(", "):"none"));return!0};mergeIdentity=async(e,t)=>{this.checkPermission(h.identity.send,"mergeIdentity");let i=T();return(await this.identityService.merge({id:e,src:{method:"",origin:t.origin,time:void 0,loc:t.loc,sess:i,diag:process.env.SEEKA_DEBUG_ENABLED==="true"?i:void 0,runtime:this.config.runtime}})).result?.personId};mergeIdentityBatch=async(e,t)=>{this.checkPermission(h.identity.send,"mergeIdentityBatch");let i=T();if(e.length===0){this.config.logger?.debug("No identities in batch");return}let r={method:"",origin:t.origin,time:void 0,loc:t.loc,sess:i,diag:process.env.SEEKA_DEBUG_ENABLED==="true"?i:void 0,runtime:this.config.runtime},n=M(e,this.maxBatchSize);if(n.length>1&&this.config.logger&&this.config.logger.debug(`Identity batch size ${e} is greater than ${this.maxBatchSize}, splitting into ${n.length} batches`),await this.trackActivityBatchRaw({data:n[0].map(a=>({id:{id:a||{},src:{...r}}}))}),n.length>1){let a=n.map((s,o)=>o===0?Promise.resolve():(this.config.logger?.verbose(`Processing identity batch ${o+1} of ${n.length}`),this.trackActivityBatchRaw({data:s.map(l=>({id:{id:l||{},src:{...r}}}))})));await Promise.all(a)}};trackActivityBatch=async(e,t)=>{this.checkPermission(h.activity.send,"trackActivityBatch");let i=T();if(e.length===0){this.config.logger?.debug("No activities in batch");return}let r={method:"",origin:t.origin,time:void 0,loc:t.loc,sess:i,diag:process.env.SEEKA_DEBUG_ENABLED==="true"?i:void 0,runtime:this.config.runtime},n=M(e,this.maxBatchSize);if(n.length>1&&this.config.logger&&this.config.logger.debug(`Activity batch size ${e.length} is greater than ${this.maxBatchSize}, splitting into ${n.length} batches`),await this.trackActivityBatchRaw({data:n[0].map(a=>({ev:{id:a.profile||{},src:{...r},payload:a.activity}}))}),n.length>1){let a=n.map((s,o)=>o===0?Promise.resolve():(this.config.logger?.verbose(`Processing activity batch ${o+1} of ${n.length}`),this.trackActivityBatchRaw({data:s.map(l=>({ev:{id:l.profile||{},src:{...r},payload:l.activity}}))})));await Promise.all(a)}};trackActivityBatchRaw=async e=>{await this.ingestionService.batch(e)};trackActivityForProfileId=async(e,t,i)=>{this.checkPermission(h.activity.send,"trackActivityForProfileId"),await this.trackActivityForProfileIdBatch([e],t,i)};trackActivityForProfileIdBatch=async(e,t,i)=>{this.checkPermission(h.activity.send,"trackActivityForProfileIdBatch"),await this.trackActivityBatch(e.map(r=>({activity:r,profile:t?{seekaPId:t}:void 0})),i)};trackActivityForProfile=async(e,t,i)=>{this.checkPermission(h.activity.send,"trackActivityForProfile"),await this.trackActivityForProfileBatch([e],t,i)};trackActivityForProfileBatch=async(e,t,i)=>{this.checkPermission(h.activity.send,"trackActivityForProfileBatch"),await this.trackActivityBatch(e.map(r=>({activity:r,profile:t})),i)}},kt={measureAdvertisingPerformance:7},Pt=g(d("crypto")),O="x-seeka-signature-sha256",Re=(e,t,i)=>{if(!t)return!1;let r=null;if(t.get&&typeof t.get=="function")r=t.get(O);else{let a=t[O];a&&(Array.isArray(a)&&a.length>0?r=a[0]:(typeof a=="string"||a instanceof String)&&(r=a))}if(!r)return!1;let n=bt(e,i)===r;return n||console.warn("Invalid webhook signature"),n},bt=(e,t)=>Pt.createHmac("sha256",e).update(t).digest("hex"),wt=(e,t,i)=>{if(!Re(e,t,i))throw new Error("Invalid webhook signature")},k=g(d("crypto")),_e="aes-192-cbc",De=(e,t)=>{if(!e)return"";if(!t)throw new Error("Secret is required to encrypt data");let i=k.default.scryptSync(t,"salt",24),r=k.default.randomBytes(16),n=k.default.createCipheriv(_e,i,r);return[n.update(e,"utf8","hex")+n.final("hex"),Buffer.from(r).toString("hex")].join("|")},Ve=(e,t)=>{if(!e)return"";if(!t)throw new Error("Secret is required to decrypt data");let[i,r]=e.split("|");if(!r)throw new Error("IV not found");let n=k.default.scryptSync(t,"salt",24),a=k.default.createDecipheriv(_e,n,Buffer.from(r,"hex"));return a.update(i,"hex","utf8")+a.final("utf8")},xt=class{constructor(e){this.appSecret=e}appSecret;encryptWithAppSecret=e=>{if(!this.appSecret)throw new Error("App secret is required to encrypt data");return De(e,this.appSecret)};decryptWithAppSecret=e=>{if(!this.appSecret)throw new Error("App secret is required to decrypt data");return Ve(e,this.appSecret)}},Tt=class Be{constructor(t,i){this.context=t,this.api=new Oe(t.config),this.appCache=new b(t.config.appId),this.appInstallCache=new b(t.config.appId,t.config.applicationInstallId),this.crypto=new xt(t.config.appSecret),this.logger=i}context;appCache;appInstallCache;api;logger;crypto;static create=(t,i,r,n,a)=>new Be({config:mt({...i},t,{type:r.name,ver:r.version.split("-")[0]},n,a)},a)},Ct=g(d("winston")),U=d("lodash-es"),p=e=>e==null||e===""||String(e).trim()===""?"":String(e);function Le(e){if(e==null||e==="")return 0;let t=e.toString().replace(/[^0-9.]/g,"");return Number.isNaN(Number(t))?0:Number(t)}function Et(e){if(e==null||e===0||e==="")return+"0.00";let t=Le(e);return Number(t.toFixed(3))}function Ut(e){return e==null||e===""||Number.isNaN(Number(e.toString()))?0:Math.floor(Number(e))}function Nt(e){return JSON.parse(JSON.stringify(e))}function Mt(e){return/^-?\d+$/.test(e)}function Ot(e){if(!(e==null||e.length===0))return Fe(e)}function Fe(e){return(0,U.last)(e)}function Rt(e,t){return(0,U.get)(e,t)}function _t(e,t,i){return(0,U.set)(e,t,i)}function Dt(e,t){return(0,U.isEqual)(e,t)}function Vt(e){return e?e.trim().toLowerCase():""}function Bt(e){return e==null?"":(e=e.trim().replace(/-/gi,"").replace(/\(/gi,"").replace(/\)/gi,"").replace(/ /g,"").replace(/\+/g,""),e)}var Lt=["order","subscriptionItemPurchase","oneTimeItemPurchase"],Ft=(e,t,i)=>{if(!e.activity)return[];let r=e.activity,n=r.activityName==="custom"?r.activityNameCustom:r.activityName;if(!n)return[];let a=n.toLowerCase(),s=[];return t.forEach(o=>{if(!o)return;switch(o.type){case"activityTracked":{if(!o.activityNames||!o.activityNames.find(c=>c.toLowerCase()===a))return;i.verbose("Matched activity tracked filter",{filter:o,activityName:n});break}case"purchaseMade":{if(!r.activityName||!Lt.includes(r.activityName))return;i.verbose("Matched purchase made activity filter",{filter:o,activityName:n});break}default:{i.warn("Unknown activity filter type",{filter:o});return}}let l=o.sourceFilter;if(!l)return;let u=e.source,v;try{v=u?.loc?new URL(u.loc).hostname.toLowerCase():null}catch(c){i.error("Failed to parse activity source URL",{ex:Ct.default.exceptions.getAllInfo(c),activitySource:u}),v=null}let S=u?.pipeline?.convergePipelineIntegrationInstanceId?.toLowerCase(),A=l.filters?l.filters.map(c=>{switch(c.type){case"wildcard":return i.verbose("Matched wildcard source filter",{sourceFilter:c}),!0;case"domain":return!v||!c.key?!1:v===c.key.toLowerCase()?(i.verbose("Matched domain source filter",{sourceFilter:c,activityHostname:v}),!0):!1;case"pipeline":return!S||!c.key?!1:S===c.key.toLowerCase()?(i.verbose("Matched pipeline source filter",{sourceFilter:c,sourceConvergePipelineIntegrationInstanceId:S}),!0):!1}}):[];switch(l.comparer){case"and":{A.every(c=>c===!0)&&s.push(o);break}case"or":{A.some(c=>c===!0)&&s.push(o);break}default:{i.warn("Unknown source filter comparer",{sourceFilters:l});break}}}),s},qt=(e,t=!1)=>{let i=e.commerce,r=i?.totalPrice||i?.products?.map(a=>(a.unitPrice||0)*(a.quantity||1)).reduce((a,s)=>a+s,0)||void 0,n=i?.currencyCode||null;if((!r||r<=0)&&(r=e?.lead?.predictedLtv||e?.lead?.predictedValue,r&&e?.lead?.currencyCode&&(n=e?.lead?.currencyCode||null)),(!r||r<=0)&&(r=e?.contentItem?.value,r&&e?.contentItem?.currencyCode&&(n=e?.contentItem?.currencyCode||null)),(!r||r<=0)&&(e?.contentItem?.items&&e?.contentItem?.items.length>0&&(r=e?.contentItem?.items.map(a=>a&&a.unitPrice?a.unitPrice*(a.quantity||1):0).reduce((a,s)=>a+s,0)),r&&(n=e?.contentItem?.currencyCode||e?.commerce?.currencyCode||null,!n))){let a=e?.contentItem?.items?.filter(s=>s.currencyCode)||[];a.length>0&&(n=a[0].currencyCode||null)}if((!r||r<=0)&&e?.commerce?.products&&e?.commerce?.products.length>0&&(r=e?.commerce?.products.map(a=>a&&a.unitPrice?a.unitPrice*(a.quantity||1):0).reduce((a,s)=>a+s,0),r&&(n=e?.commerce?.currencyCode||null,!n))){let a=e?.commerce?.products?.filter(s=>s.currencyCode)||[];a.length>0&&(n=a[0].currencyCode||null)}return(!r||r<=0)&&!n?null:{value:r===0&&t?null:r||null,currencyCode:n}};function $t(e,t,i){if(!e)return;let r=t.processing?.contentIdentificationBehavior,n=null;(i=="googleAnalytics"||i=="googleAds")&&(t.analytics?.libraries?.googleAnalytics?.merchant?.productItemIdBehavior!=null&&(r=t.analytics?.libraries?.googleAnalytics?.merchant?.productItemIdBehavior),n=p(t.analytics?.libraries?.googleAnalytics?.merchant?.productItemIdPrefix));let a;switch(r){case"sku":a=e?.sku;break;case"productId":a=e?.productIdentifier;break;case"variantId":a=e?.variantIdentifier;break;case"productIdAndVariantIdUnderscore":p(e.variantIdentifier)&&p(e.productIdentifier)?a=`${e.productIdentifier}_${e.variantIdentifier}`:p(e.variantIdentifier)?a=e.variantIdentifier:a=e.productIdentifier;break;case"variantIdOrProductId":p(e.variantIdentifier)?a=e.variantIdentifier:a=e.productIdentifier;break;default:a=p(e?.sku)||p(e?.variantIdentifier)||p(e?.productIdentifier);break}return n?`${n}${a}`:a}function Kt(e,t){return p(e?.variantName)||p(e?.productName)}function Gt(e){if(!e||e.trim().length===0)return!1;let t=e.split(".").filter(i=>i.trim().length>0);return!(t.length!==4||t[0].toLowerCase()!=="sk".toLowerCase()||t[1].toLowerCase()!=="1".toLowerCase()||isNaN(parseInt(t[2],10))||isNaN(parseInt(t[3],10)))}var Wt={defaultIssuerUrl:Me,defaultTelemetryUrl:gt,defaultIngestUrl:Ne}});var Ge=H(B(),1);import{fetch as ir,Headers as nr}from"undici";import{jwtDecode as ar}from"jwt-decode";var Ht=new TextEncoder;function L(e){let t=e>>>0,i=[];for(;t>=128;)i.push(t&127|128),t>>>=7;return i.push(t),Uint8Array.from(i)}function F(e,t){let i=e<<3|t;return L(i)}function I(e,t){if(t==null)return[];let i=Ht.encode(t);return[F(e,2),L(i.length),i]}function y(e,t){return[F(e,2),L(t.length),t]}function jt(e,t){if(t==null)return[];let i=new ArrayBuffer(8);return new DataView(i).setFloat64(0,t,!0),[F(e,1),new Uint8Array(i)]}function m(e){let t=e.filter(a=>a instanceof Uint8Array),i=t.reduce((a,s)=>a+s.length,0),r=new Uint8Array(i),n=0;for(let a of t)r.set(a,n),n+=a.length;return r}function Jt(e){if(!e)return new Uint8Array(0);let t;if("stringValue"in e&&typeof e.stringValue=="string")t=e.stringValue;else{let r=e.doubleValue??e.intValue??e.boolValue??e.bytesValue??e.arrayValue??e.kvlistValue;try{t=typeof r=="string"?r:JSON.stringify(r)}catch{t=String(r)}}let i=m(I(1,t));return i}function zt(e){let t=[];return t.push(...I(1,e.key)),t.push(...y(2,Jt(e.value))),m(t)}function Yt(e){if(!e)return new Uint8Array(0);let t=[];for(let i of e.attributes??[])t.push(...y(1,zt(i)));return m(t)}function Qt(e){let t=[];return e&&(t.push(...I(1,e.name)),t.push(...I(2,e.version))),m(t)}function Xt(e){let t=[];return t.push(...jt(4,e.asDouble)),m(t)}function Zt(e){let t=[];for(let i of e.dataPoints??[])t.push(...y(1,Xt(i)));return m(t)}function er(e){let t=[];return t.push(...I(1,e.name)),t.push(...I(2,e.description)),t.push(...I(3,e.unit)),e.gauge&&t.push(...y(5,Zt(e.gauge))),m(t)}function tr(e){let t=[];t.push(...y(1,Qt(e.scope)));for(let i of e.metrics??[])t.push(...y(2,er(i)));return m(t)}function rr(e){let t=[];t.push(...y(1,Yt(e.resource)));for(let i of e.scopeMetrics??[])t.push(...y(2,tr(i)));return m(t)}function $e(e){let t=[];for(let i of e.resourceMetrics??[]){let r=rr(i);t.push(...y(1,r))}return m(t)}var q=e=>{let t=r=>String(r).padStart(2,"0"),i=r=>String(r).padStart(3,"0");return e.getUTCFullYear()+"-"+t(e.getUTCMonth()+1)+"-"+t(e.getUTCDate())+"T"+t(e.getUTCHours())+":"+t(e.getUTCMinutes())+":"+t(e.getUTCSeconds())+"."+i(e.getUTCMilliseconds())};var $=H(B(),1);import"winston";var Ke="seeka.tel",K=class{options;constructor(t){this.options=t}pushStr=(t,i,r)=>{i!=null&&r.push({key:`${Ke}.${t}`,value:{stringValue:String(i)}})};getStr(t,i){let r=`${Ke}.${t}`,n=i.find(a=>a.key===r);if(n?.value&&"stringValue"in n.value)return n.value.stringValue}sendEgressMetric=async(t,i)=>{let r=[],n=o=>{if(typeof o=="string")return o;try{return JSON.stringify(o??{})}catch{return'""'}},a=new Date;this.pushStr("type","record.activity.egress",r),this.pushStr("originActivityId",t.originActivityId,r),this.pushStr("occurredAt",q(t.occurredAt||a),r),this.pushStr("timestamp",q(a),r),this.pushStr("personId",t.personId,r),this.pushStr("originSessionIdentifier",t.originSessionIdentifier,r),this.pushStr("originDnsName",t.originDnsName,r),this.pushStr("destinationPlatformIdentifier",t.destinationPlatformIdentifier,r),this.pushStr("destinationPlatformEgressType",t.destinationPlatformEgressType,r),this.pushStr("destinationPlatformTypeKey",t.destinationPlatformTypeKey,r),this.pushStr("originActivityName",t.originActivityName,r),this.pushStr("originActivityNameCustom",t.originActivityNameCustom,r),this.pushStr("publishedPayload",n(t.publishedPayload),r),this.pushStr("egressQualityMetrics",n(t.egressQualityMetrics),r),this.pushStr("egressIdentityMetrics",n(t.egressIdentityMetrics),r);let s={resourceMetrics:[{resource:{attributes:r},scopeMetrics:[{scope:{name:"seeka.telemetry.apps-server-host",version:"0.0.0"},metrics:[{name:"record.activity.egress",description:"Activity egress record",unit:"1",gauge:{dataPoints:[{asDouble:1}]}}]}]}]};await this.sendMetric(s,i)};sendMetric=async(t,i)=>{let{telemetryEndpointUrl:r,logger:n,issuerUrl:a,appId:s,appSecret:o}=this.options;if(!t||!Array.isArray(t.resourceMetrics))throw new Error("SeekaTelemetry: metric must be an OTLP ExportMetricsServiceRequest with a resourceMetrics array");let l={appId:s,appSecret:o,issuerUrl:a,ingestUrl:r,applicationInstallId:i.appInstallId,logger:n,grantedPermissions:[],runtime:this.getRuntimeInfo()},u=await(0,Ge.getNewOrCachedAppInstallToken)(l);if(!u||!u.access_token)throw new Error("SeekaTelemetry: failed to get access token for install");let v=r.endsWith("/")?r:r+"/",S=new URL("v1/metrics",v).toString(),A=ar(u.access_token),c=new nr;c.set("Content-Type",this.options.protobuf?"application/x-protobuf":"application/json"),c.set("Accept",this.options.protobuf?"application/x-protobuf":"application/json"),c.set("Authorization",`Bearer ${u.access_token}`),c.set("X-OrgId",A.tenantid);let w=t.resourceMetrics[0]?.resource?.attributes||[];this.pushStr("tenantId",A.tenantid,w),this.pushStr("organisationBrandId",A.org_brand_id,w),this.getStr("type",w)==="record.activity.egress"&&this.pushStr("convergeInstanceId",A.converge_instance_id,w);let We=this.options.protobuf?$e(t):JSON.stringify(t),x=await ir(S,{method:"POST",headers:c,body:We});if(x.ok)n?.debug("SeekaTelemetry: metric send succeeded");else{let He=await x.text().catch(()=>""),G=`SeekaTelemetry: metric send failed with status ${x.status} ${x.statusText}`;throw n?.error(G,{body:He}),new Error(G)}};shutdown=async()=>{};getRuntimeInfo(){return{type:"sdk/js/apps-server-telemetry-core",ver:"0.0.0",client:{type:"server",ver:process.versions?.node||"unknown"}}}},br=(e,t)=>new K({...e,appId:e?.appId||process.env.SEEKA_APP_ID,appSecret:e?.appSecret||process.env.SEEKA_APP_SECRET,telemetryEndpointUrl:e?.telemetryEndpointUrl||process.env.SEEKA_TELEMETRY_URL||$.urls.defaultTelemetryUrl,issuerUrl:e?.issuerUrl||process.env.SEEKA_ISSUER_URL||$.urls.defaultIssuerUrl,logger:t});var sr=(r=>(r[r.AGGREGATION_TEMPORALITY_UNSPECIFIED=0]="AGGREGATION_TEMPORALITY_UNSPECIFIED",r[r.AGGREGATION_TEMPORALITY_DELTA=1]="AGGREGATION_TEMPORALITY_DELTA",r[r.AGGREGATION_TEMPORALITY_CUMULATIVE=2]="AGGREGATION_TEMPORALITY_CUMULATIVE",r))(sr||{}),xr=(e,t,i)=>({...t,...e,personId:i.personId,originActivityId:i.activity?.activityId,occurredAt:new Date,originActivityName:i.activity?.activityName,originActivityNameCustom:i.activity?.activityNameCustom,originSessionIdentifier:i.source?.sess,originDnsName:new URL(i.source?.loc||"").hostname.toLowerCase()});export{sr as AggregationTemporality,xr as createEgressTelemetryRecord,br as createSeekaTelemetryClient,q as toIsoDateTime};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seeka-labs/sdk-apps-server-telemetry-core",
3
- "version": "3.9.18",
3
+ "version": "3.10.0",
4
4
  "description": "Seeka - Apps SDK - Server Telemetry Core (lightweight OTLP/HTTP exporter wrapper)",
5
5
  "author": "SEEKA <platform@seeka.co>",
6
6
  "license": "MIT",
@@ -44,8 +44,8 @@
44
44
  "@babel/core": "^7",
45
45
  "@babel/preset-env": "^7",
46
46
  "@babel/preset-typescript": "^7",
47
- "@seeka-labs/sdk-apps-core": "3.9.18",
48
- "@seeka-labs/sdk-apps-server": "3.9.18",
47
+ "@seeka-labs/sdk-apps-core": "3.10.0",
48
+ "@seeka-labs/sdk-apps-server": "3.10.0",
49
49
  "@types/node": "^22",
50
50
  "ava": "^6",
51
51
  "axios": "^1",