@seeka-labs/sdk-apps-server-host 3.9.10 → 3.9.11
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
|
-
"use strict";var _t=Object.create;var L=Object.defineProperty;var Rt=Object.getOwnPropertyDescriptor;var Ut=Object.getOwnPropertyNames;var Lt=Object.getPrototypeOf,Bt=Object.prototype.hasOwnProperty;var Dt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),$t=(e,t)=>{for(var n in t)L(e,n,{get:t[n],enumerable:!0})},Ie=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Ut(t))!Bt.call(e,i)&&i!==n&&L(e,i,{get:()=>t[i],enumerable:!(r=Rt(t,i))||r.enumerable});return e};var h=(e,t,n)=>(n=e!=null?_t(Lt(e)):{},Ie(t||!e||!e.__esModule?L(n,"default",{value:e,enumerable:!0}):n,e)),Ft=e=>Ie(L({},"__esModule",{value:!0}),e);var ft=Dt((Jr,gt)=>{"use strict";var Mt=Object.create,$=Object.defineProperty,qt=Object.getOwnPropertyDescriptor,jt=Object.getOwnPropertyNames,Ht=Object.getPrototypeOf,Wt=Object.prototype.hasOwnProperty,Gt=(e,t)=>{for(var n in t)$(e,n,{get:t[n],enumerable:!0})},Se=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of jt(t))!Wt.call(e,i)&&i!==n&&$(e,i,{get:()=>t[i],enumerable:!(r=qt(t,i))||r.enumerable});return e},y=(e,t,n)=>(n=e!=null?Mt(Ht(e)):{},Se(t||!e||!e.__esModule?$(n,"default",{value:e,enumerable:!0}):n,e)),Kt=e=>Se($({},"__esModule",{value:!0}),e),Pe={};Gt(Pe,{ActivityPipelineActivityFilterSourceItemType:()=>qe,ActivityPipelineActivityFilterType:()=>Fe,AnalyticsLibrary:()=>He,ApiException:()=>Qe,ApiServiceProxyBase:()=>ee,AppPermissionKeys:()=>S,ClickAttributionSourcePlatform:()=>$e,ConditionComparer:()=>Me,ConditionOperator:()=>je,ConsentMappingMatchType:()=>ze,ContentIdentificationBehavior:()=>We,ConvergePipelineLoggableActivityType:()=>Le,ConvergeVendorDestinationPublishStrategy:()=>Ge,CrossDomainTrackingUtmBehavior:()=>Ke,ECommerceContentType:()=>Oe,ECommerceFinancialStatus:()=>Ue,ECommerceFulfillmentStatus:()=>Re,ECommercePlatform:()=>_e,IabPrivacyConsentPurposeId:()=>Ve,IabPrivacyConsentPurposeIdMap:()=>cr,IdentityServiceProxy:()=>Te,IngestServiceProxy:()=>xe,PrivacyConsentType:()=>be,PrivacyDataControlMode:()=>Ye,RegionalConsentGrantOption:()=>Je,ResponseResultType:()=>Ne,SdkLogEventLevel:()=>Be,SeekaApiHelper:()=>at,SeekaAppCacheManager:()=>O,SeekaAppConfig:()=>Ce,SeekaAppHelper:()=>gr,SeekaWebhookCallType:()=>De,TrackingActivityNames:()=>D,TrackingEventSourceOriginType:()=>Ee,chunk:()=>X,cloneDeep:()=>yr,dateToUtcDateTimeReferenceString:()=>et,decryptText:()=>lt,emailAddress:()=>Pr,encryptText:()=>ct,generateNewSessionId:()=>B,getActivityName:()=>zt,getActivityValue:()=>xr,getContentIdFromProduct:()=>Nr,getContentNameFromProduct:()=>br,getIssuer:()=>re,getNestedProperty:()=>kr,getNewAppInstallToken:()=>rt,getNewOrCachedAppInstallToken:()=>ne,getRandomNumberString:()=>Ze,isDeepEqual:()=>Sr,isNumber:()=>Ir,isValidSeekaProfileId:()=>Er,last:()=>ut,lastOrDefault:()=>vr,matchActivityPipelineFilters:()=>Tr,md5Hash:()=>tt,parseFloat:()=>dt,parseInt:()=>hr,parseMoney:()=>mr,parseStr:()=>f,phoneNumberToE164:()=>wr,separatePersonFullName:()=>Yt,setNestedProperty:()=>Ar,throwOnInvalidWebhookSignature:()=>dr,urls:()=>Or,validateWebhookSignature:()=>st,webhookSignatureHeaderName:()=>Z});gt.exports=Kt(Pe);var Jt="3.9.10",we=y(require("axios")),Ce=class{appId;appSecret;ingestUrl;issuerUrl;organisationId;applicationInstallId;runtime;logger;grantedPermissions;transformApiRequest;transformApiResponse;hasAnyPermissions;hasAllPermissions;hasPermission},ee=class{config;constructor(e){this.config=e}transformOptions=async e=>await this.config.transformApiRequest(e);transformResult=async(e,t,n)=>await this.config.transformApiResponse(e,t,n)},Te=class extends ee{instance;baseUrl;jsonParseReviver=void 0;constructor(e,t,n){super(e),this.instance=n||we.default.create(),this.baseUrl=t??"https://api-localdev-env0-seeka.au.ngrok.io"}merge(e,t){let n=this.baseUrl+"/api/identity";n=n.replace(/[?&]$/,"");let r={data:JSON.stringify(e),method:"POST",url:n,headers:{"Content-Type":"application/json",Accept:"application/json"},cancelToken:t};return this.transformOptions(r).then(i=>this.instance.request(i)).catch(i=>{if(Xe(i)&&i.response)return i.response;throw i}).then(i=>this.transformResult(n,i,a=>this.processMerge(a)))}processMerge(e){let t=e.status,n={};if(e.headers&&typeof e.headers=="object")for(let r in e.headers)e.headers.hasOwnProperty(r)&&(n[r]=e.headers[r]);if(t===200){let r=e.data,i=null;return i=JSON.parse(r),Promise.resolve(i)}else if(t===400){let r=e.data,i=null;return i=JSON.parse(r),P("A server side error occurred.",t,r,n,i)}else if(t===401){let r=e.data,i=null;return i=JSON.parse(r),P("A server side error occurred.",t,r,n,i)}else if(t===422){let r=e.data,i=null;return i=JSON.parse(r),P("A server side error occurred.",t,r,n,i)}else if(t!==200&&t!==204){let r=e.data;return P("An unexpected server error occurred.",t,r,n)}return Promise.resolve(null)}},xe=class extends ee{instance;baseUrl;jsonParseReviver=void 0;constructor(e,t,n){super(e),this.instance=n||we.default.create(),this.baseUrl=t??"https://api-localdev-env0-seeka.au.ngrok.io"}batch(e,t){let n=this.baseUrl+"/api/ingest";n=n.replace(/[?&]$/,"");let r={data:JSON.stringify(e),method:"POST",url:n,headers:{"Content-Type":"application/json"},cancelToken:t};return this.transformOptions(r).then(i=>this.instance.request(i)).catch(i=>{if(Xe(i)&&i.response)return i.response;throw i}).then(i=>this.transformResult(n,i,a=>this.processBatch(a)))}processBatch(e){let t=e.status,n={};if(e.headers&&typeof e.headers=="object")for(let r in e.headers)e.headers.hasOwnProperty(r)&&(n[r]=e.headers[r]);if(t===202){let r=e.data;return Promise.resolve(null)}else if(t===400){let r=e.data,i=null;return i=JSON.parse(r),P("A server side error occurred.",t,r,n,i)}else if(t===401){let r=e.data,i=null;return i=JSON.parse(r),P("A server side error occurred.",t,r,n,i)}else if(t===422){let r=e.data,i=null;return i=JSON.parse(r),P("A server side error occurred.",t,r,n,i)}else if(t!==200&&t!==204){let r=e.data;return P("An unexpected server error occurred.",t,r,n)}return Promise.resolve(null)}},Ne=(e=>(e.Undefined="undefined",e.Success="success",e.Failed="failed",e))(Ne||{}),be=(e=>(e.Unknown="unknown",e.Informed="informed",e.Implied="implied",e.Explicit="explicit",e.Active="active",e.Passive="passive",e))(be||{}),Ee=(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))(Ee||{}),D=(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))(D||{}),Oe=(e=>(e.Undefined="undefined",e.SingleProduct="singleProduct",e.SingleVariant="singleVariant",e.Collection="collection",e))(Oe||{}),_e=(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))(_e||{}),Re=(e=>(e.Undefined="undefined",e.Fulfilled="fulfilled",e.NoneFulfilled="noneFulfilled",e.PartiallyFulfilled="partiallyFulfilled",e.RestockedOrCancelled="restockedOrCancelled",e.Pending="pending",e))(Re||{}),Ue=(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))(Ue||{}),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||{}),Be=(e=>(e.Information="information",e.Warning="warning",e.Error="error",e.Verbose="verbose",e))(Be||{}),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||{}),$e=(e=>(e.Unknown="unknown",e.Google="google",e.Meta="meta",e.Snapchat="snapchat",e.Pinterest="pinterest",e.TikTok="tikTok",e))($e||{}),Fe=(e=>(e.Undefined="undefined",e.PurchaseMade="purchaseMade",e.ActivityTracked="activityTracked",e))(Fe||{}),Me=(e=>(e.Undefined="undefined",e.And="and",e.Or="or",e))(Me||{}),qe=(e=>(e.Undefined="undefined",e.Domain="domain",e.Pipeline="pipeline",e.Wildcard="wildcard",e.Url="url",e.PagePath="pagePath",e))(qe||{}),je=(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))(je||{}),He=(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))(He||{}),We=(e=>(e.Default="default",e.Sku="sku",e.ProductId="productId",e.VariantId="variantId",e.ProductIdAndVariantIdUnderscore="productIdAndVariantIdUnderscore",e.VariantIdOrProductId="variantIdOrProductId",e))(We||{}),Ge=(e=>(e.DeliverAllTraitsAndDeliverAllEvents="deliverAllTraitsAndDeliverAllEvents",e.DeliverAllTraitsAndDeliverEventsOnlyIfMaxWeightedTraitsPresent="deliverAllTraitsAndDeliverEventsOnlyIfMaxWeightedTraitsPresent",e.DeliverMaxWeightedTraitsOnlyAndDeliverAllEvents="deliverMaxWeightedTraitsOnlyAndDeliverAllEvents",e.DeliverMaxWeightedTraitsOnlyAndDeliverEventsOnlyIfMaxWeightedTraitsPresent="deliverMaxWeightedTraitsOnlyAndDeliverEventsOnlyIfMaxWeightedTraitsPresent",e))(Ge||{}),Ke=(e=>(e.None="none",e.SessionPassthrough="sessionPassthrough",e.UrlPassthrough="urlPassthrough",e))(Ke||{}),Je=(e=>(e.Unset="unset",e.Granted="granted",e.Denied="denied",e))(Je||{}),Ve=(e=>(e.Undefined="undefined",e.MeasureAdvertisingPerformance="measureAdvertisingPerformance",e))(Ve||{}),ze=(e=>(e.Undefined="undefined",e.AllOf="allOf",e.AnyOf="anyOf",e))(ze||{}),Ye=(e=>(e.Disabled="disabled",e.Explicit="explicit",e.Implicit="implicit",e))(Ye||{}),Qe=class extends Error{message;status;response;headers;result;constructor(e,t,n,r,i){super(),this.message=e,this.status=t,this.response=n,this.headers=r,this.result=i}isApiException=!0;static isApiException(e){return e.isApiException===!0}};function P(e,t,n,r,i){throw i??new Qe(e,t,n,r,null)}function Xe(e){return e&&e.isAxiosError===!0}var E=require("openid-client"),te=y(require("winston")),Q=y(require("memory-cache")),ve="seeka:sdk",O=class{constructor(e,t){this.appId=e,this.appInstallationId=t}appId;appInstallationId;set=async(e,t,n)=>{let r=this.getKey(e);Q.default.put(r,JSON.stringify(t),n)};getOrSet=async(e,t,n)=>{let r=this.getKey(e),i=Q.default.get(r);if(i){let s=JSON.parse(i);return n&&await n(s),s}let a=await t();return a?(Q.default.put(r,JSON.stringify(a.value),a.expiryAbsoluteMilliseconds),a.value):null};getKey=e=>this.appInstallationId?`${ve}:${this.appId}:${this.appInstallationId}:${e}`:`${ve}:${this.appId}:${e}`},Vt=y(require("crypto")),B=()=>{let e=et(new Date),t=Ze();return`${e}.${t}`},zt=e=>{let t=Object.keys(D),n=e.toLowerCase(),r=t.find(i=>i.toLowerCase()===n);return r?D[r]:"custom"},Ze=()=>Math.floor(Math.random()*(9999999999-1e9)+1e9).toString(),et=e=>{let t=(e.getUTCMonth()+1).toString();t.length<2&&(t="0"+t);let n=e.getUTCDate().toString();n.length<2&&(n="0"+n);let r=e.getUTCHours().toString();r.length<2&&(r="0"+r);let i=e.getUTCMinutes().toString();i.length<2&&(i="0"+i);let a=e.getUTCSeconds().toString();return a.length<2&&(a="0"+a),`${e.getUTCFullYear()}${t}${n}.${r}${i}${a}`},tt=e=>Vt.createHash("md5").update(e).digest("hex"),Yt=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(" ")}},X=(e,t)=>e.reduce((n,r,i)=>{let a=Math.floor(i/t);return n[a]||(n[a]=[]),n[a].push(r),n},[]),re=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 n=new O(e.appId,e.applicationInstallId),r=tt(e.issuerUrl+"_"+e.appId),i=await n.getOrSet(r,async()=>{try{let a=await Qt(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:te.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 i===null?null:new E.Configuration(i.serverMetadata,i.clientId,e.appSecret)},Qt=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 n=e.appId.replace(/-/g,""),r=await(0,E.discovery)(new URL(e.issuerUrl),n,void 0,(0,E.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:n},raw:r}}catch(n){return e.logger?e.logger.error("Seeka auth: failed discovering issuer from remote",{...t,ex:te.default.exceptions.getAllInfo(n)}):console.error("Seeka auth: failed discovering issuer from remote",{...t,err:n}),null}},Xt=async e=>{let t={applicationId:e.appId,issuer:{url:e.issuerUrl}},n=await re(e);if(!n)return null;try{let r=await(0,E.clientCredentialsGrant)(n,{resource:n.clientMetadata().client_id}),i={...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",{...i}):console.info("Seeka auth: got app client token from server",{...i}),{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 i={...t,error:r};return e.logger?e.logger.error("Seeka auth: failed to get client access token from server",{...i}):console.error("Seeka auth: failed to get client access token from server",{...i,err:te.default.exceptions.getAllInfo(r)}),null}},rt=async(e,t)=>{let n={applicationId:t.appId,issuer:{url:t.issuerUrl}},r=await re(t);if(!r||!r)return null;try{let i=await(0,E.genericGrantRequest)(r,"app_install_token",{applicationInstallId:t.applicationInstallId,access_token:e,scope:"Seeka.API.Ingest"}),a={...n,token:{expires_at:i.expires_at,token_type:i.token_type,scope:i.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:i.token_type,access_token:i.access_token,expires_in:i.expires_in,id_token:i.id_token,refresh_token:i.refresh_token,scope:i.scope,authorization_details:i.authorization_details}}catch(i){let a={...n,error:i};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}},ne=async e=>{let t=new O(e.appId,e.applicationInstallId),n={applicationId:e.appId,issuer:{url:e.issuerUrl}};return await t.getOrSet("auth:token:appinstall",async()=>{let r=await Xt(e);if(!r||!r.access_token)return null;let i=await rt(r.access_token,e);return i?{value:i,expiryAbsoluteMilliseconds:((i.expires_in>r.expires_in?r.expires_in:i.expires_in)||900*1e3)-60*1e3}:null},async()=>{e.logger?e.logger.verbose("Seeka auth: got app token from cache",{...n}):console.debug("Seeka auth: got app token from cache",{...n})})},nt="https://router.seeka.services",Zt="https://router.seeka.services/tel/otel",it="https://account.seeka.app",er=(e,t,n,r,i)=>{let a=new Ce;return a.appId=e.applicationId,a.appSecret=t,a.ingestUrl=process.env.SEEKA_INGEST_URL||nt,a.issuerUrl=process.env.SEEKA_ISSUER_URL||it,a.organisationId=e.organisationId,a.applicationInstallId=e.applicationInstallId,a.runtime={type:"sdk/js/apps-server",ver:Jt.split("-")[0],client:n},a.logger=i,a.grantedPermissions=r,a.transformApiRequest=s=>tr(a,s),a.transformApiResponse=async(s,c,o)=>rr(a,s,c,o),a.hasAnyPermissions=s=>!a.grantedPermissions||a.grantedPermissions.length===0?!1:!s||s.length===0?!0:s.some(c=>a.grantedPermissions.includes(c)),a.hasAllPermissions=s=>!a.grantedPermissions||a.grantedPermissions.length===0?!1:!s||s.length===0?!0:s.every(c=>a.grantedPermissions.includes(c)),a.hasPermission=s=>!a.grantedPermissions||a.grantedPermissions.length===0?!1:s?a.grantedPermissions.includes(s):!0,a},tr=async(e,t)=>{let n=await ne(e);if(!n||!n.access_token)throw new Error("Could not get access token for API request");return t.headers={...t.headers,"X-OrgId":e.organisationId,Authorization:"Bearer "+n?.access_token},t},rr=async(e,t,n,r)=>(n.data=JSON.stringify(n.data),r(n)),S={identity:{receiveFull:"Identity.Receive.Pii",send:"Identity.Send"},activity:{receiveAnon:"Activity.Receive.Anon",receiveFull:"Activity.Receive.Pii",send:"Activity.Send"}},nr=y(require("axios")),ir=y(require("http")),ar=y(require("https")),sr=new ir.default.Agent({keepAlive:!0,scheduling:"fifo"}),or=new ar.default.Agent({keepAlive:!0,scheduling:"fifo"}),ke=e=>{let t=nr.default.create({httpAgent:sr,httpsAgent:or});return t.interceptors.request.use(function(n){let r={url:n.url,method:n.method};return process.env.LOGGING_LEVEL==="silly"&&(r={...r,body:n.data,params:n.params}),e.logger?e.logger.debug(`Seeka API: making call to ${r.url}`,{...r}):console.debug(`Seeka API: making call to ${r.url}`,{...r}),n},function(n){let r={error:n};return e.logger?e.logger.http("Seeka API: failed to send request",{...r}):console.debug("Seeka API: failed to send request",{...r}),Promise.reject(n)}),t.interceptors.response.use(function(n){let r={url:n.request?.url||n.config.url,method:n.request?.method||n.config.method,response:{status:n.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}),n},function(n){let{code:r,status:i,message:a}=n,{headers:s,url:c,method:o}=n?.config,l={code:r,status:i,message:a,headers:s,url:c,method:o,content:n?.response?.data};return e.logger?e.logger.error(`Seeka API: call to ${l.url} failed`,{...l}):console.error(`Seeka API: call to ${l.url} failed`,{...l}),Promise.reject(n)}),t},Ae={getIdentityService:e=>new Te(e,e.ingestUrl,ke(e)),getIngestService:e=>new xe(e,e.ingestUrl,ke(e))},at=class{constructor(e){this.config=e,this.ingestionService=Ae.getIngestService(e),this.identityService=Ae.getIdentityService(e)}config;maxBatchSize=50;refreshOrPrimeTokenCache=async()=>{await ne(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(S.identity.send,"mergeIdentity");let n=B();return(await this.identityService.merge({id:e,src:{method:"",origin:t.origin,time:void 0,loc:t.loc,sess:n,diag:process.env.SEEKA_DEBUG_ENABLED==="true"?n:void 0,runtime:this.config.runtime}})).result?.personId};mergeIdentityBatch=async(e,t)=>{this.checkPermission(S.identity.send,"mergeIdentityBatch");let n=B();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:n,diag:process.env.SEEKA_DEBUG_ENABLED==="true"?n:void 0,runtime:this.config.runtime},i=X(e,this.maxBatchSize);if(i.length>1&&this.config.logger&&this.config.logger.debug(`Identity batch size ${e} is greater than ${this.maxBatchSize}, splitting into ${i.length} batches`),await this.trackActivityBatchRaw({data:i[0].map(a=>({id:{id:a||{},src:{...r}}}))}),i.length>1){let a=i.map((s,c)=>c===0?Promise.resolve():(this.config.logger?.verbose(`Processing identity batch ${c+1} of ${i.length}`),this.trackActivityBatchRaw({data:s.map(o=>({id:{id:o||{},src:{...r}}}))})));await Promise.all(a)}};trackActivityBatch=async(e,t)=>{this.checkPermission(S.activity.send,"trackActivityBatch");let n=B();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:n,diag:process.env.SEEKA_DEBUG_ENABLED==="true"?n:void 0,runtime:this.config.runtime},i=X(e,this.maxBatchSize);if(i.length>1&&this.config.logger&&this.config.logger.debug(`Activity batch size ${e.length} is greater than ${this.maxBatchSize}, splitting into ${i.length} batches`),await this.trackActivityBatchRaw({data:i[0].map(a=>({ev:{id:a.profile||{},src:{...r},payload:a.activity}}))}),i.length>1){let a=i.map((s,c)=>c===0?Promise.resolve():(this.config.logger?.verbose(`Processing activity batch ${c+1} of ${i.length}`),this.trackActivityBatchRaw({data:s.map(o=>({ev:{id:o.profile||{},src:{...r},payload:o.activity}}))})));await Promise.all(a)}};trackActivityBatchRaw=async e=>{await this.ingestionService.batch(e)};trackActivityForProfileId=async(e,t,n)=>{this.checkPermission(S.activity.send,"trackActivityForProfileId"),await this.trackActivityForProfileIdBatch([e],t,n)};trackActivityForProfileIdBatch=async(e,t,n)=>{this.checkPermission(S.activity.send,"trackActivityForProfileIdBatch"),await this.trackActivityBatch(e.map(r=>({activity:r,profile:t?{seekaPId:t}:void 0})),n)};trackActivityForProfile=async(e,t,n)=>{this.checkPermission(S.activity.send,"trackActivityForProfile"),await this.trackActivityForProfileBatch([e],t,n)};trackActivityForProfileBatch=async(e,t,n)=>{this.checkPermission(S.activity.send,"trackActivityForProfileBatch"),await this.trackActivityBatch(e.map(r=>({activity:r,profile:t})),n)}},cr={measureAdvertisingPerformance:7},lr=y(require("crypto")),Z="x-seeka-signature-sha256",st=(e,t,n)=>{if(!t)return!1;let r=null;if(t.get&&typeof t.get=="function")r=t.get(Z);else{let a=t[Z];a&&(Array.isArray(a)&&a.length>0?r=a[0]:(typeof a=="string"||a instanceof String)&&(r=a))}if(!r)return!1;let i=pr(e,n)===r;return i||console.warn("Invalid webhook signature"),i},pr=(e,t)=>lr.createHmac("sha256",e).update(t).digest("hex"),dr=(e,t,n)=>{if(!st(e,t,n))throw new Error("Invalid webhook signature")},b=y(require("crypto")),ot="aes-192-cbc",ct=(e,t)=>{if(!e)return"";if(!t)throw new Error("Secret is required to encrypt data");let n=b.default.scryptSync(t,"salt",24),r=b.default.randomBytes(16),i=b.default.createCipheriv(ot,n,r);return[i.update(e,"utf8","hex")+i.final("hex"),Buffer.from(r).toString("hex")].join("|")},lt=(e,t)=>{if(!e)return"";if(!t)throw new Error("Secret is required to decrypt data");let[n,r]=e.split("|");if(!r)throw new Error("IV not found");let i=b.default.scryptSync(t,"salt",24),a=b.default.createDecipheriv(ot,i,Buffer.from(r,"hex"));return a.update(n,"hex","utf8")+a.final("utf8")},ur=class{constructor(e){this.appSecret=e}appSecret;encryptWithAppSecret=e=>{if(!this.appSecret)throw new Error("App secret is required to encrypt data");return ct(e,this.appSecret)};decryptWithAppSecret=e=>{if(!this.appSecret)throw new Error("App secret is required to decrypt data");return lt(e,this.appSecret)}},gr=class pt{constructor(t,n){this.context=t,this.api=new at(t.config),this.appCache=new O(t.config.appId),this.appInstallCache=new O(t.config.appId,t.config.applicationInstallId),this.crypto=new ur(t.config.appSecret),this.logger=n}context;appCache;appInstallCache;api;logger;crypto;static create=(t,n,r,i,a)=>new pt({config:er({...n},t,{type:r.name,ver:r.version.split("-")[0]},i,a)},a)},fr=y(require("winston")),F=require("lodash-es"),f=e=>e==null||e===""||String(e).trim()===""?"":String(e);function dt(e){if(e==null||e==="")return 0;let t=e.toString().replace(/[^0-9.]/g,"");return Number.isNaN(Number(t))?0:Number(t)}function mr(e){if(e==null||e===0||e==="")return+"0.00";let t=dt(e);return Number(t.toFixed(3))}function hr(e){return e==null||e===""||Number.isNaN(Number(e.toString()))?0:Math.floor(Number(e))}function yr(e){return JSON.parse(JSON.stringify(e))}function Ir(e){return/^-?\d+$/.test(e)}function vr(e){if(!(e==null||e.length===0))return ut(e)}function ut(e){return(0,F.last)(e)}function kr(e,t){return(0,F.get)(e,t)}function Ar(e,t,n){return(0,F.set)(e,t,n)}function Sr(e,t){return(0,F.isEqual)(e,t)}function Pr(e){return e?e.trim().toLowerCase():""}function wr(e){return e==null?"":(e=e.trim().replace(/-/gi,"").replace(/\(/gi,"").replace(/\)/gi,"").replace(/ /g,"").replace(/\+/g,""),e)}var Cr=["order","subscriptionItemPurchase","oneTimeItemPurchase"],Tr=(e,t,n)=>{if(!e.activity)return[];let r=e.activity,i=r.activityName==="custom"?r.activityNameCustom:r.activityName;if(!i)return[];let a=i.toLowerCase(),s=[];return t.forEach(c=>{if(!c)return;switch(c.type){case"activityTracked":{if(!c.activityNames||!c.activityNames.find(p=>p.toLowerCase()===a))return;n.verbose("Matched activity tracked filter",{filter:c,activityName:i});break}case"purchaseMade":{if(!r.activityName||!Cr.includes(r.activityName))return;n.verbose("Matched purchase made activity filter",{filter:c,activityName:i});break}default:{n.warn("Unknown activity filter type",{filter:c});return}}let o=c.sourceFilter;if(!o)return;let l=e.source,d;try{d=l?.loc?new URL(l.loc).hostname.toLowerCase():null}catch(p){n.error("Failed to parse activity source URL",{ex:fr.default.exceptions.getAllInfo(p),activitySource:l}),d=null}let k=l?.pipeline?.convergePipelineIntegrationInstanceId?.toLowerCase(),u=o.filters?o.filters.map(p=>{switch(p.type){case"wildcard":return n.verbose("Matched wildcard source filter",{sourceFilter:p}),!0;case"domain":return!d||!p.key?!1:d===p.key.toLowerCase()?(n.verbose("Matched domain source filter",{sourceFilter:p,activityHostname:d}),!0):!1;case"pipeline":return!k||!p.key?!1:k===p.key.toLowerCase()?(n.verbose("Matched pipeline source filter",{sourceFilter:p,sourceConvergePipelineIntegrationInstanceId:k}),!0):!1}}):[];switch(o.comparer){case"and":{u.every(p=>p===!0)&&s.push(c);break}case"or":{u.some(p=>p===!0)&&s.push(c);break}default:{n.warn("Unknown source filter comparer",{sourceFilters:o});break}}}),s},xr=(e,t=!1)=>{let n=e.commerce,r=n?.totalPrice||n?.products?.map(a=>(a.unitPrice||0)*(a.quantity||1)).reduce((a,s)=>a+s,0)||void 0,i=n?.currencyCode||null;if((!r||r<=0)&&(r=e?.lead?.predictedLtv||e?.lead?.predictedValue,r&&e?.lead?.currencyCode&&(i=e?.lead?.currencyCode||null)),(!r||r<=0)&&(r=e?.contentItem?.value,r&&e?.contentItem?.currencyCode&&(i=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&&(i=e?.contentItem?.currencyCode||e?.commerce?.currencyCode||null,!i))){let a=e?.contentItem?.items?.filter(s=>s.currencyCode)||[];a.length>0&&(i=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&&(i=e?.commerce?.currencyCode||null,!i))){let a=e?.commerce?.products?.filter(s=>s.currencyCode)||[];a.length>0&&(i=a[0].currencyCode||null)}return(!r||r<=0)&&!i?null:{value:r===0&&t?null:r||null,currencyCode:i}};function Nr(e,t,n){if(!e)return;let r=t.processing?.contentIdentificationBehavior,i=null;(n=="googleAnalytics"||n=="googleAds")&&(t.analytics?.libraries?.googleAnalytics?.merchant?.productItemIdBehavior!=null&&(r=t.analytics?.libraries?.googleAnalytics?.merchant?.productItemIdBehavior),i=f(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":f(e.variantIdentifier)&&f(e.productIdentifier)?a=`${e.productIdentifier}_${e.variantIdentifier}`:f(e.variantIdentifier)?a=e.variantIdentifier:a=e.productIdentifier;break;case"variantIdOrProductId":f(e.variantIdentifier)?a=e.variantIdentifier:a=e.productIdentifier;break;default:a=f(e?.sku)||f(e?.variantIdentifier)||f(e?.productIdentifier);break}return i?`${i}${a}`:a}function br(e,t){return f(e?.variantName)||f(e?.productName)}function Er(e){if(!e||e.trim().length===0)return!1;let t=e.split(".").filter(n=>n.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 Or={defaultIssuerUrl:it,defaultTelemetryUrl:Zt,defaultIngestUrl:nt}});var Wr={};$t(Wr,{appLogger:()=>Tt,backgroundJobLogger:()=>Fr,checkAuth:()=>Pt,childLogger:()=>C,connect:()=>ht,createOrUpdateInstallation:()=>Br,deleteInstallation:()=>Dr,disconnect:()=>yt,generateAppUiHttpRequestResponse:()=>Mr,getAccessTokenAndCheck:()=>fe,getKey:()=>U,getList:()=>ce,getOrCreate:()=>Rr,getOrCreateClient:()=>I,getSeekaBrowserPlugin:()=>Hr,getSeekaBrowserPluginByName:()=>Et,isConnected:()=>ae,listInstallations:()=>Lr,remove:()=>pe,set:()=>le,startServices:()=>de,stopServices:()=>Ur,tryGet:()=>oe,tryGetInstallation:()=>H,webhookLogger:()=>$r});module.exports=Ft(Wr);var mt=require("redis"),M=h(require("winston")),q=h(ft()),_r=()=>{let e=process.env.REDIS_CONNECTION_TLS==="true"?"rediss://":"redis://";return process.env.REDIS_CONNECTION_USER&&process.env.REDIS_CONNECTION_PASSWORD?`${e}${process.env.REDIS_CONNECTION_USER}:${process.env.REDIS_CONNECTION_PASSWORD}@${process.env.REDIS_CONNECTION_HOST}:${process.env.REDIS_CONNECTION_PORT}`:`${e}${process.env.REDIS_CONNECTION_HOST}:${process.env.REDIS_CONNECTION_PORT}`},ie="__SEEKA_REDIS_CLIENT__",I=e=>{if(global[ie])return global[ie];let t=(0,mt.createClient)({url:_r(),disableClientInfo:!0}).on("error",n=>e.error("Redis Client ",{ex:M.exceptions.getAllInfo(n)}));return global[ie]=t,t},ht=async e=>{await I(e).connect()},ae=async e=>I(e).isOpen,yt=async e=>{I(e).destroy()},It=e=>`seeka:app:${process.env.SEEKA_APP_ID}:${e}`,U=(e,t)=>`${It(e)}:${t}`,_=e=>e==="install",vt=()=>{let e=process.env.DATA_ENCRYPTION_KEY;if(!e)throw new Error("DATA_ENCRYPTION_KEY is required to encrypt/decrypt installation state");return e},kt=e=>{if(!e)return!1;let t=e.split("|");if(t.length!==2)return!1;let[n,r]=t;return!n||!r?!1:/^[0-9a-f]+$/i.test(n)&&/^[0-9a-f]{32}$/i.test(r)},se=e=>{if(!kt(e))return{plainText:e,wasEncrypted:!1};let t=vt();return{plainText:(0,q.decryptText)(e,t),wasEncrypted:!0}},R=e=>{if(kt(e))return{encryptedText:e,wasEncrypted:!0};let t=vt();return{encryptedText:(0,q.encryptText)(e,t),wasEncrypted:!1}};async function Rr(e,t,n,r="string",i){let a=U(e,t),s=I(i),c=await At(s,a);if(c){if(r==="string"&&_(e)){let{plainText:o,wasEncrypted:l}=se(c);if(!l){let{encryptedText:d}=R(c);await s.set(a,d)}return JSON.parse(o)}return JSON.parse(c)}if(r==="json")await s.json.set(a,"$",n);else{let o=JSON.stringify(n);if(_(e)){let{encryptedText:l}=R(o);await s.set(a,l)}else await s.set(a,o)}return n}async function oe(e,t,n="string",r){let i=U(e,t),a=I(r);if(n==="json"){let s=await a.json.get(i);if(s)return s}else{let s=await At(a,i);if(s){if(_(e)){let{plainText:c,wasEncrypted:o}=se(s);if(!o){let{encryptedText:l}=R(s);await a.set(i,l)}return JSON.parse(c)}return JSON.parse(s)}}return null}async function ce(e,t){let n=It(e),r=I(t),i=await r.keys(`${n}:*`),a=await r.mGet(i);if(a){let s=[];for(let c=0;c<a.length;c++){let o=a[c],l=i[c];if(!o)continue;let d=o;if(_(e)){let{plainText:k,wasEncrypted:u}=se(d);if(!u){let{encryptedText:p}=R(d);await r.set(l,p)}s.push(JSON.parse(k))}else s.push(JSON.parse(d))}return s}return[]}async function le(e,t,n,r="string",i){let a=U(e,t),s=I(i);if(r==="json")await s.json.set(a,"$",n);else{let c=JSON.stringify(n);if(_(e)){let{encryptedText:o}=R(c);await s.set(a,o)}else await s.set(a,c)}}async function pe(e,t,n){let r=U(e,t);await I(n).del(r)}async function At(e,t){let n=await e.get(t);return typeof n=="string"?n:n?n.toString():""}var de=async e=>{e.debug(`Trying to connect to Redis - ${process.env.REDIS_CONNECTION_HOST}`);try{await ae(e)?e.verbose(`Redis already connected - ${process.env.REDIS_CONNECTION_HOST}`):(e.profile("service.redis.connect"),await ht(e),e.profile("service.redis.connect"),e.debug(`Redis connected - ${process.env.REDIS_CONNECTION_HOST}`))}catch(t){throw e.error(`Failed to connect to Redis - ${process.env.REDIS_CONNECTION_HOST}`,{ex:M.exceptions.getAllInfo(t)}),t}},Ur=async e=>{e.debug(`Trying to disconnect from Redis - ${process.env.REDIS_CONNECTION_HOST}`);try{await ae(e)===!1?e.verbose(`Redis already disconnected - ${process.env.REDIS_CONNECTION_HOST}`):(e.profile("service.redis.disconnect"),await yt(e),e.profile("service.redis.disconnect"),e.verbose(`Redis disconnected - ${process.env.REDIS_CONNECTION_HOST}`))}catch(t){throw e.error(`Failed to disconnect from Redis - ${process.env.REDIS_CONNECTION_HOST}`,{ex:M.exceptions.getAllInfo(t)}),t}};var j="install",H=async(e,t,n)=>{let r=await oe(j,e,"string",n);if(r==null&&t)throw n.error(`Seeka installation ${e} not found`),new Error(`Seeka installation ${e} not found`);return r},Lr=async e=>await ce(j,e),Br=async(e,t)=>{e.installationState||(e.installationState={}),e.installedAt||(e.installedAt=new Date().toISOString());let n=await H(e.applicationInstallId,!1,t)===null;return await le(j,e.applicationInstallId,e,"string",t),t.info(n?"Created installation state":"Updated installation state",{applicationInstallId:e.applicationInstallId,organisationId:e.organisationId,organisationBrandId:e.organisationBrandId}),e},Dr=async(e,t)=>{await pe(j,e,t),t.info("Deleted installation state",{applicationInstallId:e})};var W=e=>"seeka_app_"+e+"_at_app",G=e=>"seeka_app_"+e+"_at_core",ue="X-Seeka-App-Token",ge="X-Seeka-CoreApi-Token",K="at_app",J="at_core";var St=h(require("jsonwebtoken"));var fe=async(e,t,n,r)=>{let i=new URL(e),a=t.get("Cookie"),s=i.searchParams.get(K)||"";if(!s&&t.get(ue)&&(s=t.get(ue)?.split("Bearer ")[1]),!s&&a){let o=a.split(";").find(l=>l.trim().startsWith(W(process.env.SEEKA_APP_ID)));o&&(s=o.split("=")[1])}let c=i.searchParams.get(J)||"";if(!c&&t.get(ge)&&(c=t.get(ge)?.split("Bearer ")[1]),!c&&a){let o=a.split(";").find(l=>l.trim().startsWith(G(process.env.SEEKA_APP_ID)));o&&(c=o.split("=")[1])}return await Pt(s,c,n,r)},Pt=async(e,t,n,r)=>{let i,a,s;if(e)try{let o=St.default.verify(e,process.env.SEEKA_APP_SECRET,{ignoreNotBefore:!0});if(r.info("Decoded token",{decoded:o}),!o.appId||o.appId.replace(/-/g,"")!==process.env.SEEKA_APP_ID.replace(/-/g,"")){r.error("Invalid token - app id does not match",{decoded:o,appIdToken:o.appId,appIdEnv:process.env.SEEKA_APP_ID});return}else i=o.appId;if(o.appInstallId)a=o.appInstallId;else{r.error("Invalid token - no appInstallId",{decoded:o});return}s=o.exp}catch(o){r.error("Failed to validate token",{err:o});return}else{r.error("No access token present");return}n&&await n(r);let c=await H(a,!1,r);if(c==null){r.warn("UI call cannot be processed as the installation ID is not known by this app",{seekaAppInstallId:a});return}return{appAccessToken:e,coreApiAccessToken:t,seekaAppId:i,seekaAppInstallId:a,expiresAt:s,installation:c}};var V=h(require("fs/promises")),x=h(require("path"));var wt=require("@opentelemetry/winston-transport"),v=h(require("winston")),Ct=[new v.transports.Console({level:process.env.LOGGING_LEVEL,format:v.format.combine(v.format.errors({stack:!0}),v.format.cli(),v.format.splat()),handleExceptions:!0,handleRejections:!0})];process.env.OTEL_SDK_DISABLED!=="true"&&Ct.push(new wt.OpenTelemetryTransportV3({handleExceptions:!0,handleRejections:!0}));var Tt=v.createLogger({level:process.env.LOGGING_LEVEL,transports:Ct,exitOnError:!1}),C=(e,t,n=Tt,r={})=>n.child({...e,...t?{seekaAppInstallId:t.applicationInstallId,seekaAppInstallOrganisationBrandId:t.organisationBrandId,seekaAppInstallOrganisationId:t.organisationId,...r?.invocationId?{"faas.invocation_id":r.invocationId}:{}}:{}}),$r=(e,t)=>{let n={seekaWebhookType:e.type,seekaWebhookIsTest:e.isTest,RequestId:e.requestId,"faas.invocation_id":t.invocationId,CausationId:e.causationId,CorrelationId:e.causationId},r=e.context;return r&&(n.seekaAppInstallId=r.applicationInstallId,n.seekaAppInstallOrganisationBrandId=r.organisationBrandId,n.seekaAppInstallOrganisationId=r.organisationId),C(n)},Fr=(e,t,n)=>{let r={jobContext:t,jobName:e,"faas.invocation_id":n.invocationId,CausationId:t?.causationId,CorrelationId:t?.causationId,seekaAppInstallId:t?.applicationInstallId??t?.payload.applicationInstallId,seekaAppInstallOrganisationBrandId:t?.organisationBrandId,seekaAppInstallOrganisationId:t?.organisationId};return C(r)};async function xt(e,t){return await V.readFile(e,{encoding:t})}var me="config.js",Mr=async(e,t,n,r,i,a)=>{let s=C(null,void 0,void 0,r);s.profile("http.seeka.webhook.app.ui");let o=new URL(e).pathname?.replace(/^\/app/,"")||"/";s.verbose("Received Seeka UI request",{requestedPath:o,url:e,method:t});let l=x.default.resolve("./dist/src/ui/build"),d=null,k=null,u,p={},z=[],g,Y=async()=>o==="/health"?null:(g=await fe(e,n,()=>de(s),s),g?(d=g.seekaAppId,k=g.seekaAppInstallId,u=g.installation,s=C(null,u,s,r),s.verbose("Authenticated Seeka UI request",{requestedPath:o,url:e,method:t}),s=C(null,u,s,r),z.push({name:W(process.env.SEEKA_APP_ID),value:g.appAccessToken,httpOnly:!0,secure:!0,sameSite:"None",expires:new Date(g.expiresAt*1e3)}),z.push({name:G(process.env.SEEKA_APP_ID),value:g.coreApiAccessToken,httpOnly:!0,secure:!0,sameSite:"None",expires:new Date(g.expiresAt*1e3)}),null):{status:403,jsonBody:{error:"Invalid token"}}),A=x.default.join(l,o),w;try{if(o==="/health")return{status:200,jsonBody:{status:"ok"}};if(o==="/"+me){let m=await Y();if(m)return m;let T=process.env.APP_UI_BASE_PATH?`${process.env.APP_UI_BASE_PATH}`:"",N=`${process.env.SELF_HOST_BASEURL}${T}`,Ot={seekaAppId:d||"",seekaAppInstallId:k||"",organisationBrandId:u?.organisationBrandId||"",appBaseUrl:N,state:await i(u,s)};w=`window.seekaAppConfig = ${JSON.stringify(Ot)}`}if(o.startsWith("/api")){let m=await Y();if(m)return m;let T=await a(o,t,u,s);return T||{status:404,jsonBody:{error:"Not found"}}}if(o==="/"||o==="/index.html"){let m=await Y();if(m)return m;let T=`?${K}=${encodeURIComponent(g?.appAccessToken||"")}&${J}=${encodeURIComponent(g?.coreApiAccessToken||"")}&`;A=x.default.join(l,"index.html");let N=await xt(A,"utf-8");N=N.replace(me+"?",me+T),w=N}else w||(A=x.default.join(l,o),await V.access(A))}catch(m){A=x.default.join(l,"index.html"),console.log("File not found, serving index.html",{err:m,requestedPath:o,buildPath:l,filePath:A,content:w})}return w||(w=await xt(A)),{status:200,headers:{"Content-Type":await qr(A),"Referrer-Policy":"no-referrer",...p},cookies:z,body:w}},Nt=new Map;async function qr(e){let t=e.split(".").pop()?.toLowerCase();if(!t)return"application/octet-stream";if(t==="html")return"text/html";if(t==="js")return"application/javascript";if(t==="css")return"text/css";if(t==="png")return"image/png";if(t==="svg")return"image/svg+xml";if(t==="jpg"||t=="jpeg")return"image/jpeg";if(t==="gif")return"image/gif";let n=Nt.get(t);if(n)return n;let i=(await import("mime-types")).lookup(e);return i?(Nt.set(t,i),i):"application/octet-stream"}var ye=h(require("fs/promises")),he=h(require("path")),bt=h(require("winston")),jr=async e=>ye.default.stat(e).then(()=>!0).catch(()=>!1);async function Hr(e,t,n,r){let a=he.default.resolve(he.default.join(t,"seeka-browser-plugin.min.js"));return await Et(e,a,n,r)}async function Et(e,t,n,r){r.profile("http.seeka.browser.plugin");let i,a;try{r.verbose("Handling request for browser plugin content",{path:t}),await jr(t)?(r.verbose("Browser plugin content found",{path:t}),i=await ye.default.readFile(t,"utf8"),a=`${e}(${JSON.stringify(n)})`):r.error("Browser plugin content not found",{path:t})}catch(s){r.error("Failed to handle request for browser plugin content",{ex:bt.default.exceptions.getAllInfo(s)})}finally{r.profile("http.seeka.browser.plugin"),r.verbose("Request for browser plugin content handled")}if(!i||!a)throw new Error("Failed to handle request for browser plugin content");return{content:i,init:a}}0&&(module.exports={appLogger,backgroundJobLogger,checkAuth,childLogger,connect,createOrUpdateInstallation,deleteInstallation,disconnect,generateAppUiHttpRequestResponse,getAccessTokenAndCheck,getKey,getList,getOrCreate,getOrCreateClient,getSeekaBrowserPlugin,getSeekaBrowserPluginByName,isConnected,listInstallations,remove,set,startServices,stopServices,tryGet,tryGetInstallation,webhookLogger});
|
|
1
|
+
"use strict";var _t=Object.create;var B=Object.defineProperty;var Rt=Object.getOwnPropertyDescriptor;var Lt=Object.getOwnPropertyNames;var Ut=Object.getPrototypeOf,Bt=Object.prototype.hasOwnProperty;var Dt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),$t=(e,t)=>{for(var n in t)B(e,n,{get:t[n],enumerable:!0})},ve=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Lt(t))!Bt.call(e,i)&&i!==n&&B(e,i,{get:()=>t[i],enumerable:!(r=Rt(t,i))||r.enumerable});return e};var h=(e,t,n)=>(n=e!=null?_t(Ut(e)):{},ve(t||!e||!e.__esModule?B(n,"default",{value:e,enumerable:!0}):n,e)),Ft=e=>ve(B({},"__esModule",{value:!0}),e);var mt=Dt((Vr,ft)=>{"use strict";var Mt=Object.create,F=Object.defineProperty,qt=Object.getOwnPropertyDescriptor,jt=Object.getOwnPropertyNames,Ht=Object.getPrototypeOf,Wt=Object.prototype.hasOwnProperty,Gt=(e,t)=>{for(var n in t)F(e,n,{get:t[n],enumerable:!0})},Pe=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of jt(t))!Wt.call(e,i)&&i!==n&&F(e,i,{get:()=>t[i],enumerable:!(r=qt(t,i))||r.enumerable});return e},y=(e,t,n)=>(n=e!=null?Mt(Ht(e)):{},Pe(t||!e||!e.__esModule?F(n,"default",{value:e,enumerable:!0}):n,e)),Jt=e=>Pe(F({},"__esModule",{value:!0}),e),we={};Gt(we,{ActivityPipelineActivityFilterSourceItemType:()=>je,ActivityPipelineActivityFilterType:()=>Me,AnalyticsLibrary:()=>We,ApiException:()=>Xe,ApiServiceProxyBase:()=>te,AppPermissionKeys:()=>A,ClickAttributionSourcePlatform:()=>Fe,ConditionComparer:()=>qe,ConditionOperator:()=>He,ConsentMappingMatchType:()=>Ye,ContentIdentificationBehavior:()=>Ge,ConvergePipelineLoggableActivityType:()=>Be,ConvergeVendorDestinationPublishStrategy:()=>Je,CrossDomainTrackingUtmBehavior:()=>Ke,ECommerceContentType:()=>_e,ECommerceFinancialStatus:()=>Ue,ECommerceFulfillmentStatus:()=>Le,ECommercePlatform:()=>Re,IabPrivacyConsentPurposeId:()=>ze,IabPrivacyConsentPurposeIdMap:()=>cr,IdentityServiceProxy:()=>xe,IngestServiceProxy:()=>Ne,PrivacyConsentType:()=>Ee,PrivacyDataControlMode:()=>Qe,RegionalConsentGrantOption:()=>Ve,ResponseResultType:()=>be,SdkLogEventLevel:()=>De,SeekaApiHelper:()=>st,SeekaAppCacheManager:()=>_,SeekaAppConfig:()=>Te,SeekaAppHelper:()=>gr,SeekaWebhookCallType:()=>$e,TrackingActivityNames:()=>$,TrackingEventSourceOriginType:()=>Oe,chunk:()=>Z,cloneDeep:()=>yr,dateToUtcDateTimeReferenceString:()=>tt,decryptText:()=>pt,emailAddress:()=>Pr,encryptText:()=>lt,generateNewSessionId:()=>D,getActivityName:()=>zt,getActivityValue:()=>xr,getContentIdFromProduct:()=>Nr,getContentNameFromProduct:()=>br,getIssuer:()=>ne,getNestedProperty:()=>kr,getNewAppInstallToken:()=>nt,getNewOrCachedAppInstallToken:()=>ie,getRandomNumberString:()=>et,isDeepEqual:()=>Ar,isNumber:()=>Ir,isValidSeekaProfileId:()=>Er,last:()=>gt,lastOrDefault:()=>vr,matchActivityPipelineFilters:()=>Tr,md5Hash:()=>rt,parseFloat:()=>ut,parseInt:()=>hr,parseMoney:()=>mr,parseStr:()=>f,phoneNumberToE164:()=>wr,separatePersonFullName:()=>Yt,setNestedProperty:()=>Sr,throwOnInvalidWebhookSignature:()=>dr,urls:()=>Or,validateWebhookSignature:()=>ot,webhookSignatureHeaderName:()=>ee});ft.exports=Jt(we);var Kt="3.9.11",Ce=y(require("axios")),Te=class{appId;appSecret;ingestUrl;issuerUrl;organisationId;applicationInstallId;runtime;logger;grantedPermissions;transformApiRequest;transformApiResponse;hasAnyPermissions;hasAllPermissions;hasPermission},te=class{config;constructor(e){this.config=e}transformOptions=async e=>await this.config.transformApiRequest(e);transformResult=async(e,t,n)=>await this.config.transformApiResponse(e,t,n)},xe=class extends te{instance;baseUrl;jsonParseReviver=void 0;constructor(e,t,n){super(e),this.instance=n||Ce.default.create(),this.baseUrl=t??"https://api-localdev-env0-seeka.au.ngrok.io"}merge(e,t){let n=this.baseUrl+"/api/identity";n=n.replace(/[?&]$/,"");let r={data:JSON.stringify(e),method:"POST",url:n,headers:{"Content-Type":"application/json",Accept:"application/json"},cancelToken:t};return this.transformOptions(r).then(i=>this.instance.request(i)).catch(i=>{if(Ze(i)&&i.response)return i.response;throw i}).then(i=>this.transformResult(n,i,a=>this.processMerge(a)))}processMerge(e){let t=e.status,n={};if(e.headers&&typeof e.headers=="object")for(let r in e.headers)e.headers.hasOwnProperty(r)&&(n[r]=e.headers[r]);if(t===200){let r=e.data,i=null;return i=JSON.parse(r),Promise.resolve(i)}else if(t===400){let r=e.data,i=null;return i=JSON.parse(r),P("A server side error occurred.",t,r,n,i)}else if(t===401){let r=e.data,i=null;return i=JSON.parse(r),P("A server side error occurred.",t,r,n,i)}else if(t===422){let r=e.data,i=null;return i=JSON.parse(r),P("A server side error occurred.",t,r,n,i)}else if(t!==200&&t!==204){let r=e.data;return P("An unexpected server error occurred.",t,r,n)}return Promise.resolve(null)}},Ne=class extends te{instance;baseUrl;jsonParseReviver=void 0;constructor(e,t,n){super(e),this.instance=n||Ce.default.create(),this.baseUrl=t??"https://api-localdev-env0-seeka.au.ngrok.io"}batch(e,t){let n=this.baseUrl+"/api/ingest";n=n.replace(/[?&]$/,"");let r={data:JSON.stringify(e),method:"POST",url:n,headers:{"Content-Type":"application/json"},cancelToken:t};return this.transformOptions(r).then(i=>this.instance.request(i)).catch(i=>{if(Ze(i)&&i.response)return i.response;throw i}).then(i=>this.transformResult(n,i,a=>this.processBatch(a)))}processBatch(e){let t=e.status,n={};if(e.headers&&typeof e.headers=="object")for(let r in e.headers)e.headers.hasOwnProperty(r)&&(n[r]=e.headers[r]);if(t===202){let r=e.data;return Promise.resolve(null)}else if(t===400){let r=e.data,i=null;return i=JSON.parse(r),P("A server side error occurred.",t,r,n,i)}else if(t===401){let r=e.data,i=null;return i=JSON.parse(r),P("A server side error occurred.",t,r,n,i)}else if(t===422){let r=e.data,i=null;return i=JSON.parse(r),P("A server side error occurred.",t,r,n,i)}else if(t!==200&&t!==204){let r=e.data;return P("An unexpected server error occurred.",t,r,n)}return Promise.resolve(null)}},be=(e=>(e.Undefined="undefined",e.Success="success",e.Failed="failed",e))(be||{}),Ee=(e=>(e.Unknown="unknown",e.Informed="informed",e.Implied="implied",e.Explicit="explicit",e.Active="active",e.Passive="passive",e))(Ee||{}),Oe=(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))(Oe||{}),$=(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))($||{}),_e=(e=>(e.Undefined="undefined",e.SingleProduct="singleProduct",e.SingleVariant="singleVariant",e.Collection="collection",e))(_e||{}),Re=(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))(Re||{}),Le=(e=>(e.Undefined="undefined",e.Fulfilled="fulfilled",e.NoneFulfilled="noneFulfilled",e.PartiallyFulfilled="partiallyFulfilled",e.RestockedOrCancelled="restockedOrCancelled",e.Pending="pending",e))(Le||{}),Ue=(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))(Ue||{}),Be=(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))(Be||{}),De=(e=>(e.Information="information",e.Warning="warning",e.Error="error",e.Verbose="verbose",e))(De||{}),$e=(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))($e||{}),Fe=(e=>(e.Unknown="unknown",e.Google="google",e.Meta="meta",e.Snapchat="snapchat",e.Pinterest="pinterest",e.TikTok="tikTok",e))(Fe||{}),Me=(e=>(e.Undefined="undefined",e.PurchaseMade="purchaseMade",e.ActivityTracked="activityTracked",e))(Me||{}),qe=(e=>(e.Undefined="undefined",e.And="and",e.Or="or",e))(qe||{}),je=(e=>(e.Undefined="undefined",e.Domain="domain",e.Pipeline="pipeline",e.Wildcard="wildcard",e.Url="url",e.PagePath="pagePath",e))(je||{}),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||{}),We=(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))(We||{}),Ge=(e=>(e.Default="default",e.Sku="sku",e.ProductId="productId",e.VariantId="variantId",e.ProductIdAndVariantIdUnderscore="productIdAndVariantIdUnderscore",e.VariantIdOrProductId="variantIdOrProductId",e))(Ge||{}),Je=(e=>(e.DeliverAllTraitsAndDeliverAllEvents="deliverAllTraitsAndDeliverAllEvents",e.DeliverAllTraitsAndDeliverEventsOnlyIfMaxWeightedTraitsPresent="deliverAllTraitsAndDeliverEventsOnlyIfMaxWeightedTraitsPresent",e.DeliverMaxWeightedTraitsOnlyAndDeliverAllEvents="deliverMaxWeightedTraitsOnlyAndDeliverAllEvents",e.DeliverMaxWeightedTraitsOnlyAndDeliverEventsOnlyIfMaxWeightedTraitsPresent="deliverMaxWeightedTraitsOnlyAndDeliverEventsOnlyIfMaxWeightedTraitsPresent",e))(Je||{}),Ke=(e=>(e.None="none",e.SessionPassthrough="sessionPassthrough",e.UrlPassthrough="urlPassthrough",e))(Ke||{}),Ve=(e=>(e.Unset="unset",e.Granted="granted",e.Denied="denied",e))(Ve||{}),ze=(e=>(e.Undefined="undefined",e.MeasureAdvertisingPerformance="measureAdvertisingPerformance",e))(ze||{}),Ye=(e=>(e.Undefined="undefined",e.AllOf="allOf",e.AnyOf="anyOf",e))(Ye||{}),Qe=(e=>(e.Disabled="disabled",e.Explicit="explicit",e.Implicit="implicit",e))(Qe||{}),Xe=class extends Error{message;status;response;headers;result;constructor(e,t,n,r,i){super(),this.message=e,this.status=t,this.response=n,this.headers=r,this.result=i}isApiException=!0;static isApiException(e){return e.isApiException===!0}};function P(e,t,n,r,i){throw i??new Xe(e,t,n,r,null)}function Ze(e){return e&&e.isAxiosError===!0}var O=require("openid-client"),re=y(require("winston")),X=y(require("memory-cache")),ke="seeka:sdk",_=class{constructor(e,t){this.appId=e,this.appInstallationId=t}appId;appInstallationId;set=async(e,t,n)=>{let r=this.getKey(e);X.default.put(r,JSON.stringify(t),n)};getOrSet=async(e,t,n)=>{let r=this.getKey(e),i=X.default.get(r);if(i){let s=JSON.parse(i);return n&&await n(s),s}let a=await t();return a?(X.default.put(r,JSON.stringify(a.value),a.expiryAbsoluteMilliseconds),a.value):null};getKey=e=>this.appInstallationId?`${ke}:${this.appId}:${this.appInstallationId}:${e}`:`${ke}:${this.appId}:${e}`},Vt=y(require("crypto")),D=()=>{let e=tt(new Date),t=et();return`${e}.${t}`},zt=e=>{let t=Object.keys($),n=e.toLowerCase(),r=t.find(i=>i.toLowerCase()===n);return r?$[r]:"custom"},et=()=>Math.floor(Math.random()*(9999999999-1e9)+1e9).toString(),tt=e=>{let t=(e.getUTCMonth()+1).toString();t.length<2&&(t="0"+t);let n=e.getUTCDate().toString();n.length<2&&(n="0"+n);let r=e.getUTCHours().toString();r.length<2&&(r="0"+r);let i=e.getUTCMinutes().toString();i.length<2&&(i="0"+i);let a=e.getUTCSeconds().toString();return a.length<2&&(a="0"+a),`${e.getUTCFullYear()}${t}${n}.${r}${i}${a}`},rt=e=>Vt.createHash("md5").update(e).digest("hex"),Yt=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(" ")}},Z=(e,t)=>e.reduce((n,r,i)=>{let a=Math.floor(i/t);return n[a]||(n[a]=[]),n[a].push(r),n},[]),ne=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 n=new _(e.appId,e.applicationInstallId),r=rt(e.issuerUrl+"_"+e.appId),i=await n.getOrSet(r,async()=>{try{let a=await Qt(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:re.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 i===null?null:new O.Configuration(i.serverMetadata,i.clientId,e.appSecret)},Qt=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 n=e.appId.replace(/-/g,""),r=await(0,O.discovery)(new URL(e.issuerUrl),n,void 0,(0,O.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:n},raw:r}}catch(n){return e.logger?e.logger.error("Seeka auth: failed discovering issuer from remote",{...t,ex:re.default.exceptions.getAllInfo(n)}):console.error("Seeka auth: failed discovering issuer from remote",{...t,err:n}),null}},Xt=async e=>{let t={applicationId:e.appId,issuer:{url:e.issuerUrl}},n=await ne(e);if(!n)return null;try{let r=await(0,O.clientCredentialsGrant)(n,{resource:n.clientMetadata().client_id}),i={...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",{...i}):console.info("Seeka auth: got app client token from server",{...i}),{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 i={...t,error:r};return e.logger?e.logger.error("Seeka auth: failed to get client access token from server",{...i}):console.error("Seeka auth: failed to get client access token from server",{...i,err:re.default.exceptions.getAllInfo(r)}),null}},nt=async(e,t)=>{let n={applicationId:t.appId,issuer:{url:t.issuerUrl}},r=await ne(t);if(!r||!r)return null;try{let i=await(0,O.genericGrantRequest)(r,"app_install_token",{applicationInstallId:t.applicationInstallId,access_token:e,scope:"Seeka.API.Ingest"}),a={...n,token:{expires_at:i.expires_at,token_type:i.token_type,scope:i.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:i.token_type,access_token:i.access_token,expires_in:i.expires_in,id_token:i.id_token,refresh_token:i.refresh_token,scope:i.scope,authorization_details:i.authorization_details}}catch(i){let a={...n,error:i};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}},ie=async e=>{let t=new _(e.appId,e.applicationInstallId),n={applicationId:e.appId,issuer:{url:e.issuerUrl}};return await t.getOrSet("auth:token:appinstall",async()=>{let r=await Xt(e);if(!r||!r.access_token)return null;let i=await nt(r.access_token,e);return i?{value:i,expiryAbsoluteMilliseconds:((i.expires_in>r.expires_in?r.expires_in:i.expires_in)||900*1e3)-60*1e3}:null},async()=>{e.logger?e.logger.verbose("Seeka auth: got app token from cache",{...n}):console.debug("Seeka auth: got app token from cache",{...n})})},it="https://router.seeka.services",Zt="https://router.seeka.services/tel/otel",at="https://account.seeka.app",er=(e,t,n,r,i)=>{let a=new Te;return a.appId=e.applicationId,a.appSecret=t,a.ingestUrl=process.env.SEEKA_INGEST_URL||it,a.issuerUrl=process.env.SEEKA_ISSUER_URL||at,a.organisationId=e.organisationId,a.applicationInstallId=e.applicationInstallId,a.runtime={type:"sdk/js/apps-server",ver:Kt.split("-")[0],client:n},a.logger=i,a.grantedPermissions=r,a.transformApiRequest=s=>tr(a,s),a.transformApiResponse=async(s,c,o)=>rr(a,s,c,o),a.hasAnyPermissions=s=>!a.grantedPermissions||a.grantedPermissions.length===0?!1:!s||s.length===0?!0:s.some(c=>a.grantedPermissions.includes(c)),a.hasAllPermissions=s=>!a.grantedPermissions||a.grantedPermissions.length===0?!1:!s||s.length===0?!0:s.every(c=>a.grantedPermissions.includes(c)),a.hasPermission=s=>!a.grantedPermissions||a.grantedPermissions.length===0?!1:s?a.grantedPermissions.includes(s):!0,a},tr=async(e,t)=>{let n=await ie(e);if(!n||!n.access_token)throw new Error("Could not get access token for API request");return t.headers={...t.headers,"X-OrgId":e.organisationId,Authorization:"Bearer "+n?.access_token},t},rr=async(e,t,n,r)=>(n.data=JSON.stringify(n.data),r(n)),A={identity:{receiveFull:"Identity.Receive.Pii",send:"Identity.Send"},activity:{receiveAnon:"Activity.Receive.Anon",receiveFull:"Activity.Receive.Pii",send:"Activity.Send"}},nr=y(require("axios")),ir=y(require("http")),ar=y(require("https")),sr=new ir.default.Agent({keepAlive:!0,scheduling:"fifo"}),or=new ar.default.Agent({keepAlive:!0,scheduling:"fifo"}),Se=e=>{let t=nr.default.create({httpAgent:sr,httpsAgent:or});return t.interceptors.request.use(function(n){let r={url:n.url,method:n.method};return process.env.LOGGING_LEVEL==="silly"&&(r={...r,body:n.data,params:n.params}),e.logger?e.logger.debug(`Seeka API: making call to ${r.url}`,{...r}):console.debug(`Seeka API: making call to ${r.url}`,{...r}),n},function(n){let r={error:n};return e.logger?e.logger.http("Seeka API: failed to send request",{...r}):console.debug("Seeka API: failed to send request",{...r}),Promise.reject(n)}),t.interceptors.response.use(function(n){let r={url:n.request?.url||n.config.url,method:n.request?.method||n.config.method,response:{status:n.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}),n},function(n){let{code:r,status:i,message:a}=n,{headers:s,url:c,method:o}=n?.config,l={code:r,status:i,message:a,headers:s,url:c,method:o,content:n?.response?.data};return e.logger?e.logger.error(`Seeka API: call to ${l.url} failed`,{...l}):console.error(`Seeka API: call to ${l.url} failed`,{...l}),Promise.reject(n)}),t},Ae={getIdentityService:e=>new xe(e,e.ingestUrl,Se(e)),getIngestService:e=>new Ne(e,e.ingestUrl,Se(e))},st=class{constructor(e){this.config=e,this.ingestionService=Ae.getIngestService(e),this.identityService=Ae.getIdentityService(e)}config;maxBatchSize=50;refreshOrPrimeTokenCache=async()=>{await ie(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(A.identity.send,"mergeIdentity");let n=D();return(await this.identityService.merge({id:e,src:{method:"",origin:t.origin,time:void 0,loc:t.loc,sess:n,diag:process.env.SEEKA_DEBUG_ENABLED==="true"?n:void 0,runtime:this.config.runtime}})).result?.personId};mergeIdentityBatch=async(e,t)=>{this.checkPermission(A.identity.send,"mergeIdentityBatch");let n=D();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:n,diag:process.env.SEEKA_DEBUG_ENABLED==="true"?n:void 0,runtime:this.config.runtime},i=Z(e,this.maxBatchSize);if(i.length>1&&this.config.logger&&this.config.logger.debug(`Identity batch size ${e} is greater than ${this.maxBatchSize}, splitting into ${i.length} batches`),await this.trackActivityBatchRaw({data:i[0].map(a=>({id:{id:a||{},src:{...r}}}))}),i.length>1){let a=i.map((s,c)=>c===0?Promise.resolve():(this.config.logger?.verbose(`Processing identity batch ${c+1} of ${i.length}`),this.trackActivityBatchRaw({data:s.map(o=>({id:{id:o||{},src:{...r}}}))})));await Promise.all(a)}};trackActivityBatch=async(e,t)=>{this.checkPermission(A.activity.send,"trackActivityBatch");let n=D();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:n,diag:process.env.SEEKA_DEBUG_ENABLED==="true"?n:void 0,runtime:this.config.runtime},i=Z(e,this.maxBatchSize);if(i.length>1&&this.config.logger&&this.config.logger.debug(`Activity batch size ${e.length} is greater than ${this.maxBatchSize}, splitting into ${i.length} batches`),await this.trackActivityBatchRaw({data:i[0].map(a=>({ev:{id:a.profile||{},src:{...r},payload:a.activity}}))}),i.length>1){let a=i.map((s,c)=>c===0?Promise.resolve():(this.config.logger?.verbose(`Processing activity batch ${c+1} of ${i.length}`),this.trackActivityBatchRaw({data:s.map(o=>({ev:{id:o.profile||{},src:{...r},payload:o.activity}}))})));await Promise.all(a)}};trackActivityBatchRaw=async e=>{await this.ingestionService.batch(e)};trackActivityForProfileId=async(e,t,n)=>{this.checkPermission(A.activity.send,"trackActivityForProfileId"),await this.trackActivityForProfileIdBatch([e],t,n)};trackActivityForProfileIdBatch=async(e,t,n)=>{this.checkPermission(A.activity.send,"trackActivityForProfileIdBatch"),await this.trackActivityBatch(e.map(r=>({activity:r,profile:t?{seekaPId:t}:void 0})),n)};trackActivityForProfile=async(e,t,n)=>{this.checkPermission(A.activity.send,"trackActivityForProfile"),await this.trackActivityForProfileBatch([e],t,n)};trackActivityForProfileBatch=async(e,t,n)=>{this.checkPermission(A.activity.send,"trackActivityForProfileBatch"),await this.trackActivityBatch(e.map(r=>({activity:r,profile:t})),n)}},cr={measureAdvertisingPerformance:7},lr=y(require("crypto")),ee="x-seeka-signature-sha256",ot=(e,t,n)=>{if(!t)return!1;let r=null;if(t.get&&typeof t.get=="function")r=t.get(ee);else{let a=t[ee];a&&(Array.isArray(a)&&a.length>0?r=a[0]:(typeof a=="string"||a instanceof String)&&(r=a))}if(!r)return!1;let i=pr(e,n)===r;return i||console.warn("Invalid webhook signature"),i},pr=(e,t)=>lr.createHmac("sha256",e).update(t).digest("hex"),dr=(e,t,n)=>{if(!ot(e,t,n))throw new Error("Invalid webhook signature")},E=y(require("crypto")),ct="aes-192-cbc",lt=(e,t)=>{if(!e)return"";if(!t)throw new Error("Secret is required to encrypt data");let n=E.default.scryptSync(t,"salt",24),r=E.default.randomBytes(16),i=E.default.createCipheriv(ct,n,r);return[i.update(e,"utf8","hex")+i.final("hex"),Buffer.from(r).toString("hex")].join("|")},pt=(e,t)=>{if(!e)return"";if(!t)throw new Error("Secret is required to decrypt data");let[n,r]=e.split("|");if(!r)throw new Error("IV not found");let i=E.default.scryptSync(t,"salt",24),a=E.default.createDecipheriv(ct,i,Buffer.from(r,"hex"));return a.update(n,"hex","utf8")+a.final("utf8")},ur=class{constructor(e){this.appSecret=e}appSecret;encryptWithAppSecret=e=>{if(!this.appSecret)throw new Error("App secret is required to encrypt data");return lt(e,this.appSecret)};decryptWithAppSecret=e=>{if(!this.appSecret)throw new Error("App secret is required to decrypt data");return pt(e,this.appSecret)}},gr=class dt{constructor(t,n){this.context=t,this.api=new st(t.config),this.appCache=new _(t.config.appId),this.appInstallCache=new _(t.config.appId,t.config.applicationInstallId),this.crypto=new ur(t.config.appSecret),this.logger=n}context;appCache;appInstallCache;api;logger;crypto;static create=(t,n,r,i,a)=>new dt({config:er({...n},t,{type:r.name,ver:r.version.split("-")[0]},i,a)},a)},fr=y(require("winston")),M=require("lodash-es"),f=e=>e==null||e===""||String(e).trim()===""?"":String(e);function ut(e){if(e==null||e==="")return 0;let t=e.toString().replace(/[^0-9.]/g,"");return Number.isNaN(Number(t))?0:Number(t)}function mr(e){if(e==null||e===0||e==="")return+"0.00";let t=ut(e);return Number(t.toFixed(3))}function hr(e){return e==null||e===""||Number.isNaN(Number(e.toString()))?0:Math.floor(Number(e))}function yr(e){return JSON.parse(JSON.stringify(e))}function Ir(e){return/^-?\d+$/.test(e)}function vr(e){if(!(e==null||e.length===0))return gt(e)}function gt(e){return(0,M.last)(e)}function kr(e,t){return(0,M.get)(e,t)}function Sr(e,t,n){return(0,M.set)(e,t,n)}function Ar(e,t){return(0,M.isEqual)(e,t)}function Pr(e){return e?e.trim().toLowerCase():""}function wr(e){return e==null?"":(e=e.trim().replace(/-/gi,"").replace(/\(/gi,"").replace(/\)/gi,"").replace(/ /g,"").replace(/\+/g,""),e)}var Cr=["order","subscriptionItemPurchase","oneTimeItemPurchase"],Tr=(e,t,n)=>{if(!e.activity)return[];let r=e.activity,i=r.activityName==="custom"?r.activityNameCustom:r.activityName;if(!i)return[];let a=i.toLowerCase(),s=[];return t.forEach(c=>{if(!c)return;switch(c.type){case"activityTracked":{if(!c.activityNames||!c.activityNames.find(p=>p.toLowerCase()===a))return;n.verbose("Matched activity tracked filter",{filter:c,activityName:i});break}case"purchaseMade":{if(!r.activityName||!Cr.includes(r.activityName))return;n.verbose("Matched purchase made activity filter",{filter:c,activityName:i});break}default:{n.warn("Unknown activity filter type",{filter:c});return}}let o=c.sourceFilter;if(!o)return;let l=e.source,d;try{d=l?.loc?new URL(l.loc).hostname.toLowerCase():null}catch(p){n.error("Failed to parse activity source URL",{ex:fr.default.exceptions.getAllInfo(p),activitySource:l}),d=null}let k=l?.pipeline?.convergePipelineIntegrationInstanceId?.toLowerCase(),u=o.filters?o.filters.map(p=>{switch(p.type){case"wildcard":return n.verbose("Matched wildcard source filter",{sourceFilter:p}),!0;case"domain":return!d||!p.key?!1:d===p.key.toLowerCase()?(n.verbose("Matched domain source filter",{sourceFilter:p,activityHostname:d}),!0):!1;case"pipeline":return!k||!p.key?!1:k===p.key.toLowerCase()?(n.verbose("Matched pipeline source filter",{sourceFilter:p,sourceConvergePipelineIntegrationInstanceId:k}),!0):!1}}):[];switch(o.comparer){case"and":{u.every(p=>p===!0)&&s.push(c);break}case"or":{u.some(p=>p===!0)&&s.push(c);break}default:{n.warn("Unknown source filter comparer",{sourceFilters:o});break}}}),s},xr=(e,t=!1)=>{let n=e.commerce,r=n?.totalPrice||n?.products?.map(a=>(a.unitPrice||0)*(a.quantity||1)).reduce((a,s)=>a+s,0)||void 0,i=n?.currencyCode||null;if((!r||r<=0)&&(r=e?.lead?.predictedLtv||e?.lead?.predictedValue,r&&e?.lead?.currencyCode&&(i=e?.lead?.currencyCode||null)),(!r||r<=0)&&(r=e?.contentItem?.value,r&&e?.contentItem?.currencyCode&&(i=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&&(i=e?.contentItem?.currencyCode||e?.commerce?.currencyCode||null,!i))){let a=e?.contentItem?.items?.filter(s=>s.currencyCode)||[];a.length>0&&(i=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&&(i=e?.commerce?.currencyCode||null,!i))){let a=e?.commerce?.products?.filter(s=>s.currencyCode)||[];a.length>0&&(i=a[0].currencyCode||null)}return(!r||r<=0)&&!i?null:{value:r===0&&t?null:r||null,currencyCode:i}};function Nr(e,t,n){if(!e)return;let r=t.processing?.contentIdentificationBehavior,i=null;(n=="googleAnalytics"||n=="googleAds")&&(t.analytics?.libraries?.googleAnalytics?.merchant?.productItemIdBehavior!=null&&(r=t.analytics?.libraries?.googleAnalytics?.merchant?.productItemIdBehavior),i=f(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":f(e.variantIdentifier)&&f(e.productIdentifier)?a=`${e.productIdentifier}_${e.variantIdentifier}`:f(e.variantIdentifier)?a=e.variantIdentifier:a=e.productIdentifier;break;case"variantIdOrProductId":f(e.variantIdentifier)?a=e.variantIdentifier:a=e.productIdentifier;break;default:a=f(e?.sku)||f(e?.variantIdentifier)||f(e?.productIdentifier);break}return i?`${i}${a}`:a}function br(e,t){return f(e?.variantName)||f(e?.productName)}function Er(e){if(!e||e.trim().length===0)return!1;let t=e.split(".").filter(n=>n.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 Or={defaultIssuerUrl:at,defaultTelemetryUrl:Zt,defaultIngestUrl:it}});var Gr={};$t(Gr,{appLogger:()=>C,backgroundJobLogger:()=>Mr,checkAuth:()=>wt,childLogger:()=>T,connect:()=>yt,createOrUpdateInstallation:()=>Br,deleteInstallation:()=>Dr,disconnect:()=>It,generateAppUiHttpRequestResponse:()=>qr,getAccessTokenAndCheck:()=>me,getKey:()=>U,getList:()=>le,getOrCreate:()=>Rr,getOrCreateClient:()=>I,getOrInitLogger:()=>$r,getSeekaBrowserPlugin:()=>Wr,getSeekaBrowserPluginByName:()=>Et,isConnected:()=>se,listInstallations:()=>Ur,remove:()=>de,set:()=>pe,startServices:()=>ue,stopServices:()=>Lr,tryGet:()=>ce,tryGetInstallation:()=>W,webhookLogger:()=>Fr});module.exports=Ft(Gr);var ht=require("redis"),q=h(require("winston")),j=h(mt()),_r=()=>{let e=process.env.REDIS_CONNECTION_TLS==="true"?"rediss://":"redis://";return process.env.REDIS_CONNECTION_USER&&process.env.REDIS_CONNECTION_PASSWORD?`${e}${process.env.REDIS_CONNECTION_USER}:${process.env.REDIS_CONNECTION_PASSWORD}@${process.env.REDIS_CONNECTION_HOST}:${process.env.REDIS_CONNECTION_PORT}`:`${e}${process.env.REDIS_CONNECTION_HOST}:${process.env.REDIS_CONNECTION_PORT}`},ae="__SEEKA_REDIS_CLIENT__",I=e=>{if(global[ae])return global[ae];let t=(0,ht.createClient)({url:_r(),disableClientInfo:!0}).on("error",n=>e.error("Redis Client ",{ex:q.exceptions.getAllInfo(n)}));return global[ae]=t,t},yt=async e=>{await I(e).connect()},se=async e=>I(e).isOpen,It=async e=>{I(e).destroy()},vt=e=>`seeka:app:${process.env.SEEKA_APP_ID}:${e}`,U=(e,t)=>`${vt(e)}:${t}`,R=e=>e==="install",kt=()=>{let e=process.env.DATA_ENCRYPTION_KEY;if(!e)throw new Error("DATA_ENCRYPTION_KEY is required to encrypt/decrypt installation state");return e},St=e=>{if(!e)return!1;let t=e.split("|");if(t.length!==2)return!1;let[n,r]=t;return!n||!r?!1:/^[0-9a-f]+$/i.test(n)&&/^[0-9a-f]{32}$/i.test(r)},oe=e=>{if(!St(e))return{plainText:e,wasEncrypted:!1};let t=kt();return{plainText:(0,j.decryptText)(e,t),wasEncrypted:!0}},L=e=>{if(St(e))return{encryptedText:e,wasEncrypted:!0};let t=kt();return{encryptedText:(0,j.encryptText)(e,t),wasEncrypted:!1}};async function Rr(e,t,n,r="string",i){let a=U(e,t),s=I(i),c=await At(s,a);if(c){if(r==="string"&&R(e)){let{plainText:o,wasEncrypted:l}=oe(c);if(!l){let{encryptedText:d}=L(c);await s.set(a,d)}return JSON.parse(o)}return JSON.parse(c)}if(r==="json")await s.json.set(a,"$",n);else{let o=JSON.stringify(n);if(R(e)){let{encryptedText:l}=L(o);await s.set(a,l)}else await s.set(a,o)}return n}async function ce(e,t,n="string",r){let i=U(e,t),a=I(r);if(n==="json"){let s=await a.json.get(i);if(s)return s}else{let s=await At(a,i);if(s){if(R(e)){let{plainText:c,wasEncrypted:o}=oe(s);if(!o){let{encryptedText:l}=L(s);await a.set(i,l)}return JSON.parse(c)}return JSON.parse(s)}}return null}async function le(e,t){let n=vt(e),r=I(t),i=await r.keys(`${n}:*`),a=await r.mGet(i);if(a){let s=[];for(let c=0;c<a.length;c++){let o=a[c],l=i[c];if(!o)continue;let d=o;if(R(e)){let{plainText:k,wasEncrypted:u}=oe(d);if(!u){let{encryptedText:p}=L(d);await r.set(l,p)}s.push(JSON.parse(k))}else s.push(JSON.parse(d))}return s}return[]}async function pe(e,t,n,r="string",i){let a=U(e,t),s=I(i);if(r==="json")await s.json.set(a,"$",n);else{let c=JSON.stringify(n);if(R(e)){let{encryptedText:o}=L(c);await s.set(a,o)}else await s.set(a,c)}}async function de(e,t,n){let r=U(e,t);await I(n).del(r)}async function At(e,t){let n=await e.get(t);return typeof n=="string"?n:n?n.toString():""}var ue=async e=>{e.debug(`Trying to connect to Redis - ${process.env.REDIS_CONNECTION_HOST}`);try{await se(e)?e.verbose(`Redis already connected - ${process.env.REDIS_CONNECTION_HOST}`):(e.profile("service.redis.connect"),await yt(e),e.profile("service.redis.connect"),e.debug(`Redis connected - ${process.env.REDIS_CONNECTION_HOST}`))}catch(t){throw e.error(`Failed to connect to Redis - ${process.env.REDIS_CONNECTION_HOST}`,{ex:q.exceptions.getAllInfo(t)}),t}},Lr=async e=>{e.debug(`Trying to disconnect from Redis - ${process.env.REDIS_CONNECTION_HOST}`);try{await se(e)===!1?e.verbose(`Redis already disconnected - ${process.env.REDIS_CONNECTION_HOST}`):(e.profile("service.redis.disconnect"),await It(e),e.profile("service.redis.disconnect"),e.verbose(`Redis disconnected - ${process.env.REDIS_CONNECTION_HOST}`))}catch(t){throw e.error(`Failed to disconnect from Redis - ${process.env.REDIS_CONNECTION_HOST}`,{ex:q.exceptions.getAllInfo(t)}),t}};var H="install",W=async(e,t,n)=>{let r=await ce(H,e,"string",n);if(r==null&&t)throw n.error(`Seeka installation ${e} not found`),new Error(`Seeka installation ${e} not found`);return r},Ur=async e=>await le(H,e),Br=async(e,t)=>{e.installationState||(e.installationState={}),e.installedAt||(e.installedAt=new Date().toISOString());let n=await W(e.applicationInstallId,!1,t)===null;return await pe(H,e.applicationInstallId,e,"string",t),t.info(n?"Created installation state":"Updated installation state",{applicationInstallId:e.applicationInstallId,organisationId:e.organisationId,organisationBrandId:e.organisationBrandId}),e},Dr=async(e,t)=>{await de(H,e,t),t.info("Deleted installation state",{applicationInstallId:e})};var G=e=>"seeka_app_"+e+"_at_app",J=e=>"seeka_app_"+e+"_at_core",ge="X-Seeka-App-Token",fe="X-Seeka-CoreApi-Token",K="at_app",V="at_core";var Pt=h(require("jsonwebtoken"));var me=async(e,t,n,r)=>{let i=new URL(e),a=t.get("Cookie"),s=i.searchParams.get(K)||"";if(!s&&t.get(ge)&&(s=t.get(ge)?.split("Bearer ")[1]),!s&&a){let o=a.split(";").find(l=>l.trim().startsWith(G(process.env.SEEKA_APP_ID)));o&&(s=o.split("=")[1])}let c=i.searchParams.get(V)||"";if(!c&&t.get(fe)&&(c=t.get(fe)?.split("Bearer ")[1]),!c&&a){let o=a.split(";").find(l=>l.trim().startsWith(J(process.env.SEEKA_APP_ID)));o&&(c=o.split("=")[1])}return await wt(s,c,n,r)},wt=async(e,t,n,r)=>{let i,a,s;if(e)try{let o=Pt.default.verify(e,process.env.SEEKA_APP_SECRET,{ignoreNotBefore:!0});if(r.info("Decoded token",{decoded:o}),!o.appId||o.appId.replace(/-/g,"")!==process.env.SEEKA_APP_ID.replace(/-/g,"")){r.error("Invalid token - app id does not match",{decoded:o,appIdToken:o.appId,appIdEnv:process.env.SEEKA_APP_ID});return}else i=o.appId;if(o.appInstallId)a=o.appInstallId;else{r.error("Invalid token - no appInstallId",{decoded:o});return}s=o.exp}catch(o){r.error("Failed to validate token",{err:o});return}else{r.error("No access token present");return}n&&await n(r);let c=await W(a,!1,r);if(c==null){r.warn("UI call cannot be processed as the installation ID is not known by this app",{seekaAppInstallId:a});return}return{appAccessToken:e,coreApiAccessToken:t,seekaAppId:i,seekaAppInstallId:a,expiresAt:s,installation:c}};var z=h(require("fs/promises")),N=h(require("path"));var Ct=require("@opentelemetry/winston-transport"),v=h(require("winston")),C,Tt={},$r=(e,t)=>{if(C)return C;let n=[new v.transports.Console({level:t.LOGGING_LEVEL,format:v.format.combine(v.format.errors({stack:!0}),v.format.cli(),v.format.splat()),handleExceptions:!0,handleRejections:!0})];return t.OTEL_SDK_DISABLED!=="true"&&n.push(new Ct.OpenTelemetryTransportV3({handleExceptions:!0,handleRejections:!0})),C=v.createLogger({level:t.LOGGING_LEVEL,transports:n,exitOnError:!1,defaultMeta:Tt}),C.info("Seeka app logger initialized"),C},T=(e,t,n=C,r={})=>n.child({...Tt,...e,...t?{"@Resource.seeka.app.install.id":t.applicationInstallId,seekaAppInstallOrganisationBrandId:t.organisationBrandId,seekaAppInstallOrganisationId:t.organisationId,...r?.invocationId?{"faas.invocation_id":r.invocationId}:{}}:{}}),Fr=(e,t)=>{let n={seekaWebhookType:e.type,seekaWebhookIsTest:e.isTest,RequestId:e.requestId,"faas.invocation_id":t.invocationId,CausationId:e.causationId,CorrelationId:e.causationId},r=e.context;return r&&(n["@Resource.seeka.app.install.id"]=r.applicationInstallId,n.seekaAppInstallOrganisationBrandId=r.organisationBrandId,n.seekaAppInstallOrganisationId=r.organisationId),T(n)},Mr=(e,t,n)=>{let r={jobContext:t,jobName:e,"faas.invocation_id":n.invocationId,CausationId:t?.causationId,CorrelationId:t?.causationId,"@Resource.seeka.app.install.id":t?.applicationInstallId??t?.payload.applicationInstallId,seekaAppInstallOrganisationBrandId:t?.organisationBrandId,seekaAppInstallOrganisationId:t?.organisationId};return T(r)};async function xt(e,t){return await z.readFile(e,{encoding:t})}var he="config.js",qr=async(e,t,n,r,i,a)=>{let s=T(null,void 0,void 0,r);s.profile("http.seeka.webhook.app.ui");let o=new URL(e).pathname?.replace(/^\/app/,"")||"/";s.verbose("Received Seeka UI request",{requestedPath:o,url:e,method:t});let l=N.default.resolve("./dist/src/ui/build"),d=null,k=null,u,p={},Y=[],g,Q=async()=>o==="/health"?null:(g=await me(e,n,()=>ue(s),s),g?(d=g.seekaAppId,k=g.seekaAppInstallId,u=g.installation,s=T(null,u,s,r),s.verbose("Authenticated Seeka UI request",{requestedPath:o,url:e,method:t}),s=T(null,u,s,r),Y.push({name:G(process.env.SEEKA_APP_ID),value:g.appAccessToken,httpOnly:!0,secure:!0,sameSite:"None",expires:new Date(g.expiresAt*1e3)}),Y.push({name:J(process.env.SEEKA_APP_ID),value:g.coreApiAccessToken,httpOnly:!0,secure:!0,sameSite:"None",expires:new Date(g.expiresAt*1e3)}),null):{status:403,jsonBody:{error:"Invalid token"}}),S=N.default.join(l,o),w;try{if(o==="/health")return{status:200,jsonBody:{status:"ok"}};if(o==="/"+he){let m=await Q();if(m)return m;let x=process.env.APP_UI_BASE_PATH?`${process.env.APP_UI_BASE_PATH}`:"",b=`${process.env.SELF_HOST_BASEURL}${x}`,Ot={seekaAppId:d||"",seekaAppInstallId:k||"",organisationBrandId:u?.organisationBrandId||"",appBaseUrl:b,state:await i(u,s)};w=`window.seekaAppConfig = ${JSON.stringify(Ot)}`}if(o.startsWith("/api")){let m=await Q();if(m)return m;let x=await a(o,t,u,s);return x||{status:404,jsonBody:{error:"Not found"}}}if(o==="/"||o==="/index.html"){let m=await Q();if(m)return m;let x=`?${K}=${encodeURIComponent(g?.appAccessToken||"")}&${V}=${encodeURIComponent(g?.coreApiAccessToken||"")}&`;S=N.default.join(l,"index.html");let b=await xt(S,"utf-8");b=b.replace(he+"?",he+x),w=b}else w||(S=N.default.join(l,o),await z.access(S))}catch(m){S=N.default.join(l,"index.html"),console.log("File not found, serving index.html",{err:m,requestedPath:o,buildPath:l,filePath:S,content:w})}return w||(w=await xt(S)),{status:200,headers:{"Content-Type":await jr(S),"Referrer-Policy":"no-referrer",...p},cookies:Y,body:w}},Nt=new Map;async function jr(e){let t=e.split(".").pop()?.toLowerCase();if(!t)return"application/octet-stream";if(t==="html")return"text/html";if(t==="js")return"application/javascript";if(t==="css")return"text/css";if(t==="png")return"image/png";if(t==="svg")return"image/svg+xml";if(t==="jpg"||t=="jpeg")return"image/jpeg";if(t==="gif")return"image/gif";let n=Nt.get(t);if(n)return n;let i=(await import("mime-types")).lookup(e);return i?(Nt.set(t,i),i):"application/octet-stream"}var Ie=h(require("fs/promises")),ye=h(require("path")),bt=h(require("winston")),Hr=async e=>Ie.default.stat(e).then(()=>!0).catch(()=>!1);async function Wr(e,t,n,r){let a=ye.default.resolve(ye.default.join(t,"seeka-browser-plugin.min.js"));return await Et(e,a,n,r)}async function Et(e,t,n,r){r.profile("http.seeka.browser.plugin");let i,a;try{r.verbose("Handling request for browser plugin content",{path:t}),await Hr(t)?(r.verbose("Browser plugin content found",{path:t}),i=await Ie.default.readFile(t,"utf8"),a=`${e}(${JSON.stringify(n)})`):r.error("Browser plugin content not found",{path:t})}catch(s){r.error("Failed to handle request for browser plugin content",{ex:bt.default.exceptions.getAllInfo(s)})}finally{r.profile("http.seeka.browser.plugin"),r.verbose("Request for browser plugin content handled")}if(!i||!a)throw new Error("Failed to handle request for browser plugin content");return{content:i,init:a}}0&&(module.exports={appLogger,backgroundJobLogger,checkAuth,childLogger,connect,createOrUpdateInstallation,deleteInstallation,disconnect,generateAppUiHttpRequestResponse,getAccessTokenAndCheck,getKey,getList,getOrCreate,getOrCreateClient,getOrInitLogger,getSeekaBrowserPlugin,getSeekaBrowserPluginByName,isConnected,listInstallations,remove,set,startServices,stopServices,tryGet,tryGetInstallation,webhookLogger});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var St=Object.create;var ce=Object.defineProperty;var Pt=Object.getOwnPropertyDescriptor;var wt=Object.getOwnPropertyNames;var Ct=Object.getPrototypeOf,Tt=Object.prototype.hasOwnProperty;var u=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var xt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Nt=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of wt(t))!Tt.call(e,i)&&i!==n&&ce(e,i,{get:()=>t[i],enumerable:!(r=Pt(t,i))||r.enumerable});return e};var bt=(e,t,n)=>(n=e!=null?St(Ct(e)):{},Nt(t||!e||!e.__esModule?ce(n,"default",{value:e,enumerable:!0}):n,e));var it=xt((Br,nt)=>{"use strict";var Et=Object.create,B=Object.defineProperty,Ot=Object.getOwnPropertyDescriptor,_t=Object.getOwnPropertyNames,Rt=Object.getPrototypeOf,Ut=Object.prototype.hasOwnProperty,Lt=(e,t)=>{for(var n in t)B(e,n,{get:t[n],enumerable:!0})},ue=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of _t(t))!Ut.call(e,i)&&i!==n&&B(e,i,{get:()=>t[i],enumerable:!(r=Ot(t,i))||r.enumerable});return e},y=(e,t,n)=>(n=e!=null?Et(Rt(e)):{},ue(t||!e||!e.__esModule?B(n,"default",{value:e,enumerable:!0}):n,e)),Bt=e=>ue(B({},"__esModule",{value:!0}),e),ge={};Lt(ge,{ActivityPipelineActivityFilterSourceItemType:()=>Oe,ActivityPipelineActivityFilterType:()=>be,AnalyticsLibrary:()=>Re,ApiException:()=>qe,ApiServiceProxyBase:()=>X,AppPermissionKeys:()=>A,ClickAttributionSourcePlatform:()=>Ne,ConditionComparer:()=>Ee,ConditionOperator:()=>_e,ConsentMappingMatchType:()=>Fe,ContentIdentificationBehavior:()=>Ue,ConvergePipelineLoggableActivityType:()=>Ce,ConvergeVendorDestinationPublishStrategy:()=>Le,CrossDomainTrackingUtmBehavior:()=>Be,ECommerceContentType:()=>Ae,ECommerceFinancialStatus:()=>we,ECommerceFulfillmentStatus:()=>Pe,ECommercePlatform:()=>Se,IabPrivacyConsentPurposeId:()=>$e,IabPrivacyConsentPurposeIdMap:()=>Xt,IdentityServiceProxy:()=>he,IngestServiceProxy:()=>ye,PrivacyConsentType:()=>ve,PrivacyDataControlMode:()=>Me,RegionalConsentGrantOption:()=>De,ResponseResultType:()=>Ie,SdkLogEventLevel:()=>Te,SeekaApiHelper:()=>ze,SeekaAppCacheManager:()=>E,SeekaAppConfig:()=>me,SeekaAppHelper:()=>nr,SeekaWebhookCallType:()=>xe,TrackingActivityNames:()=>L,TrackingEventSourceOriginType:()=>ke,chunk:()=>Y,cloneDeep:()=>or,dateToUtcDateTimeReferenceString:()=>We,decryptText:()=>Ze,emailAddress:()=>gr,encryptText:()=>Xe,generateNewSessionId:()=>U,getActivityName:()=>Ft,getActivityValue:()=>yr,getContentIdFromProduct:()=>Ir,getContentNameFromProduct:()=>vr,getIssuer:()=>ee,getNestedProperty:()=>pr,getNewAppInstallToken:()=>Ke,getNewOrCachedAppInstallToken:()=>te,getRandomNumberString:()=>He,isDeepEqual:()=>ur,isNumber:()=>cr,isValidSeekaProfileId:()=>kr,last:()=>rt,lastOrDefault:()=>lr,matchActivityPipelineFilters:()=>hr,md5Hash:()=>Ge,parseFloat:()=>tt,parseInt:()=>sr,parseMoney:()=>ar,parseStr:()=>m,phoneNumberToE164:()=>fr,separatePersonFullName:()=>Mt,setNestedProperty:()=>dr,throwOnInvalidWebhookSignature:()=>tr,urls:()=>Ar,validateWebhookSignature:()=>Ye,webhookSignatureHeaderName:()=>Q});nt.exports=Bt(ge);var Dt="3.9.10",fe=y(u("axios")),me=class{appId;appSecret;ingestUrl;issuerUrl;organisationId;applicationInstallId;runtime;logger;grantedPermissions;transformApiRequest;transformApiResponse;hasAnyPermissions;hasAllPermissions;hasPermission},X=class{config;constructor(e){this.config=e}transformOptions=async e=>await this.config.transformApiRequest(e);transformResult=async(e,t,n)=>await this.config.transformApiResponse(e,t,n)},he=class extends X{instance;baseUrl;jsonParseReviver=void 0;constructor(e,t,n){super(e),this.instance=n||fe.default.create(),this.baseUrl=t??"https://api-localdev-env0-seeka.au.ngrok.io"}merge(e,t){let n=this.baseUrl+"/api/identity";n=n.replace(/[?&]$/,"");let r={data:JSON.stringify(e),method:"POST",url:n,headers:{"Content-Type":"application/json",Accept:"application/json"},cancelToken:t};return this.transformOptions(r).then(i=>this.instance.request(i)).catch(i=>{if(je(i)&&i.response)return i.response;throw i}).then(i=>this.transformResult(n,i,a=>this.processMerge(a)))}processMerge(e){let t=e.status,n={};if(e.headers&&typeof e.headers=="object")for(let r in e.headers)e.headers.hasOwnProperty(r)&&(n[r]=e.headers[r]);if(t===200){let r=e.data,i=null;return i=JSON.parse(r),Promise.resolve(i)}else if(t===400){let r=e.data,i=null;return i=JSON.parse(r),S("A server side error occurred.",t,r,n,i)}else if(t===401){let r=e.data,i=null;return i=JSON.parse(r),S("A server side error occurred.",t,r,n,i)}else if(t===422){let r=e.data,i=null;return i=JSON.parse(r),S("A server side error occurred.",t,r,n,i)}else if(t!==200&&t!==204){let r=e.data;return S("An unexpected server error occurred.",t,r,n)}return Promise.resolve(null)}},ye=class extends X{instance;baseUrl;jsonParseReviver=void 0;constructor(e,t,n){super(e),this.instance=n||fe.default.create(),this.baseUrl=t??"https://api-localdev-env0-seeka.au.ngrok.io"}batch(e,t){let n=this.baseUrl+"/api/ingest";n=n.replace(/[?&]$/,"");let r={data:JSON.stringify(e),method:"POST",url:n,headers:{"Content-Type":"application/json"},cancelToken:t};return this.transformOptions(r).then(i=>this.instance.request(i)).catch(i=>{if(je(i)&&i.response)return i.response;throw i}).then(i=>this.transformResult(n,i,a=>this.processBatch(a)))}processBatch(e){let t=e.status,n={};if(e.headers&&typeof e.headers=="object")for(let r in e.headers)e.headers.hasOwnProperty(r)&&(n[r]=e.headers[r]);if(t===202){let r=e.data;return Promise.resolve(null)}else if(t===400){let r=e.data,i=null;return i=JSON.parse(r),S("A server side error occurred.",t,r,n,i)}else if(t===401){let r=e.data,i=null;return i=JSON.parse(r),S("A server side error occurred.",t,r,n,i)}else if(t===422){let r=e.data,i=null;return i=JSON.parse(r),S("A server side error occurred.",t,r,n,i)}else if(t!==200&&t!==204){let r=e.data;return S("An unexpected server error occurred.",t,r,n)}return Promise.resolve(null)}},Ie=(e=>(e.Undefined="undefined",e.Success="success",e.Failed="failed",e))(Ie||{}),ve=(e=>(e.Unknown="unknown",e.Informed="informed",e.Implied="implied",e.Explicit="explicit",e.Active="active",e.Passive="passive",e))(ve||{}),ke=(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))(ke||{}),L=(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))(L||{}),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||{}),Pe=(e=>(e.Undefined="undefined",e.Fulfilled="fulfilled",e.NoneFulfilled="noneFulfilled",e.PartiallyFulfilled="partiallyFulfilled",e.RestockedOrCancelled="restockedOrCancelled",e.Pending="pending",e))(Pe||{}),we=(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))(we||{}),Ce=(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))(Ce||{}),Te=(e=>(e.Information="information",e.Warning="warning",e.Error="error",e.Verbose="verbose",e))(Te||{}),xe=(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))(xe||{}),Ne=(e=>(e.Unknown="unknown",e.Google="google",e.Meta="meta",e.Snapchat="snapchat",e.Pinterest="pinterest",e.TikTok="tikTok",e))(Ne||{}),be=(e=>(e.Undefined="undefined",e.PurchaseMade="purchaseMade",e.ActivityTracked="activityTracked",e))(be||{}),Ee=(e=>(e.Undefined="undefined",e.And="and",e.Or="or",e))(Ee||{}),Oe=(e=>(e.Undefined="undefined",e.Domain="domain",e.Pipeline="pipeline",e.Wildcard="wildcard",e.Url="url",e.PagePath="pagePath",e))(Oe||{}),_e=(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))(_e||{}),Re=(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))(Re||{}),Ue=(e=>(e.Default="default",e.Sku="sku",e.ProductId="productId",e.VariantId="variantId",e.ProductIdAndVariantIdUnderscore="productIdAndVariantIdUnderscore",e.VariantIdOrProductId="variantIdOrProductId",e))(Ue||{}),Le=(e=>(e.DeliverAllTraitsAndDeliverAllEvents="deliverAllTraitsAndDeliverAllEvents",e.DeliverAllTraitsAndDeliverEventsOnlyIfMaxWeightedTraitsPresent="deliverAllTraitsAndDeliverEventsOnlyIfMaxWeightedTraitsPresent",e.DeliverMaxWeightedTraitsOnlyAndDeliverAllEvents="deliverMaxWeightedTraitsOnlyAndDeliverAllEvents",e.DeliverMaxWeightedTraitsOnlyAndDeliverEventsOnlyIfMaxWeightedTraitsPresent="deliverMaxWeightedTraitsOnlyAndDeliverEventsOnlyIfMaxWeightedTraitsPresent",e))(Le||{}),Be=(e=>(e.None="none",e.SessionPassthrough="sessionPassthrough",e.UrlPassthrough="urlPassthrough",e))(Be||{}),De=(e=>(e.Unset="unset",e.Granted="granted",e.Denied="denied",e))(De||{}),$e=(e=>(e.Undefined="undefined",e.MeasureAdvertisingPerformance="measureAdvertisingPerformance",e))($e||{}),Fe=(e=>(e.Undefined="undefined",e.AllOf="allOf",e.AnyOf="anyOf",e))(Fe||{}),Me=(e=>(e.Disabled="disabled",e.Explicit="explicit",e.Implicit="implicit",e))(Me||{}),qe=class extends Error{message;status;response;headers;result;constructor(e,t,n,r,i){super(),this.message=e,this.status=t,this.response=n,this.headers=r,this.result=i}isApiException=!0;static isApiException(e){return e.isApiException===!0}};function S(e,t,n,r,i){throw i??new qe(e,t,n,r,null)}function je(e){return e&&e.isAxiosError===!0}var b=u("openid-client"),Z=y(u("winston")),z=y(u("memory-cache")),le="seeka:sdk",E=class{constructor(e,t){this.appId=e,this.appInstallationId=t}appId;appInstallationId;set=async(e,t,n)=>{let r=this.getKey(e);z.default.put(r,JSON.stringify(t),n)};getOrSet=async(e,t,n)=>{let r=this.getKey(e),i=z.default.get(r);if(i){let s=JSON.parse(i);return n&&await n(s),s}let a=await t();return a?(z.default.put(r,JSON.stringify(a.value),a.expiryAbsoluteMilliseconds),a.value):null};getKey=e=>this.appInstallationId?`${le}:${this.appId}:${this.appInstallationId}:${e}`:`${le}:${this.appId}:${e}`},$t=y(u("crypto")),U=()=>{let e=We(new Date),t=He();return`${e}.${t}`},Ft=e=>{let t=Object.keys(L),n=e.toLowerCase(),r=t.find(i=>i.toLowerCase()===n);return r?L[r]:"custom"},He=()=>Math.floor(Math.random()*(9999999999-1e9)+1e9).toString(),We=e=>{let t=(e.getUTCMonth()+1).toString();t.length<2&&(t="0"+t);let n=e.getUTCDate().toString();n.length<2&&(n="0"+n);let r=e.getUTCHours().toString();r.length<2&&(r="0"+r);let i=e.getUTCMinutes().toString();i.length<2&&(i="0"+i);let a=e.getUTCSeconds().toString();return a.length<2&&(a="0"+a),`${e.getUTCFullYear()}${t}${n}.${r}${i}${a}`},Ge=e=>$t.createHash("md5").update(e).digest("hex"),Mt=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(" ")}},Y=(e,t)=>e.reduce((n,r,i)=>{let a=Math.floor(i/t);return n[a]||(n[a]=[]),n[a].push(r),n},[]),ee=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 n=new E(e.appId,e.applicationInstallId),r=Ge(e.issuerUrl+"_"+e.appId),i=await n.getOrSet(r,async()=>{try{let a=await qt(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:Z.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 i===null?null:new b.Configuration(i.serverMetadata,i.clientId,e.appSecret)},qt=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 n=e.appId.replace(/-/g,""),r=await(0,b.discovery)(new URL(e.issuerUrl),n,void 0,(0,b.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:n},raw:r}}catch(n){return e.logger?e.logger.error("Seeka auth: failed discovering issuer from remote",{...t,ex:Z.default.exceptions.getAllInfo(n)}):console.error("Seeka auth: failed discovering issuer from remote",{...t,err:n}),null}},jt=async e=>{let t={applicationId:e.appId,issuer:{url:e.issuerUrl}},n=await ee(e);if(!n)return null;try{let r=await(0,b.clientCredentialsGrant)(n,{resource:n.clientMetadata().client_id}),i={...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",{...i}):console.info("Seeka auth: got app client token from server",{...i}),{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 i={...t,error:r};return e.logger?e.logger.error("Seeka auth: failed to get client access token from server",{...i}):console.error("Seeka auth: failed to get client access token from server",{...i,err:Z.default.exceptions.getAllInfo(r)}),null}},Ke=async(e,t)=>{let n={applicationId:t.appId,issuer:{url:t.issuerUrl}},r=await ee(t);if(!r||!r)return null;try{let i=await(0,b.genericGrantRequest)(r,"app_install_token",{applicationInstallId:t.applicationInstallId,access_token:e,scope:"Seeka.API.Ingest"}),a={...n,token:{expires_at:i.expires_at,token_type:i.token_type,scope:i.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:i.token_type,access_token:i.access_token,expires_in:i.expires_in,id_token:i.id_token,refresh_token:i.refresh_token,scope:i.scope,authorization_details:i.authorization_details}}catch(i){let a={...n,error:i};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}},te=async e=>{let t=new E(e.appId,e.applicationInstallId),n={applicationId:e.appId,issuer:{url:e.issuerUrl}};return await t.getOrSet("auth:token:appinstall",async()=>{let r=await jt(e);if(!r||!r.access_token)return null;let i=await Ke(r.access_token,e);return i?{value:i,expiryAbsoluteMilliseconds:((i.expires_in>r.expires_in?r.expires_in:i.expires_in)||900*1e3)-60*1e3}:null},async()=>{e.logger?e.logger.verbose("Seeka auth: got app token from cache",{...n}):console.debug("Seeka auth: got app token from cache",{...n})})},Je="https://router.seeka.services",Ht="https://router.seeka.services/tel/otel",Ve="https://account.seeka.app",Wt=(e,t,n,r,i)=>{let a=new me;return a.appId=e.applicationId,a.appSecret=t,a.ingestUrl=process.env.SEEKA_INGEST_URL||Je,a.issuerUrl=process.env.SEEKA_ISSUER_URL||Ve,a.organisationId=e.organisationId,a.applicationInstallId=e.applicationInstallId,a.runtime={type:"sdk/js/apps-server",ver:Dt.split("-")[0],client:n},a.logger=i,a.grantedPermissions=r,a.transformApiRequest=s=>Gt(a,s),a.transformApiResponse=async(s,c,o)=>Kt(a,s,c,o),a.hasAnyPermissions=s=>!a.grantedPermissions||a.grantedPermissions.length===0?!1:!s||s.length===0?!0:s.some(c=>a.grantedPermissions.includes(c)),a.hasAllPermissions=s=>!a.grantedPermissions||a.grantedPermissions.length===0?!1:!s||s.length===0?!0:s.every(c=>a.grantedPermissions.includes(c)),a.hasPermission=s=>!a.grantedPermissions||a.grantedPermissions.length===0?!1:s?a.grantedPermissions.includes(s):!0,a},Gt=async(e,t)=>{let n=await te(e);if(!n||!n.access_token)throw new Error("Could not get access token for API request");return t.headers={...t.headers,"X-OrgId":e.organisationId,Authorization:"Bearer "+n?.access_token},t},Kt=async(e,t,n,r)=>(n.data=JSON.stringify(n.data),r(n)),A={identity:{receiveFull:"Identity.Receive.Pii",send:"Identity.Send"},activity:{receiveAnon:"Activity.Receive.Anon",receiveFull:"Activity.Receive.Pii",send:"Activity.Send"}},Jt=y(u("axios")),Vt=y(u("http")),zt=y(u("https")),Yt=new Vt.default.Agent({keepAlive:!0,scheduling:"fifo"}),Qt=new zt.default.Agent({keepAlive:!0,scheduling:"fifo"}),pe=e=>{let t=Jt.default.create({httpAgent:Yt,httpsAgent:Qt});return t.interceptors.request.use(function(n){let r={url:n.url,method:n.method};return process.env.LOGGING_LEVEL==="silly"&&(r={...r,body:n.data,params:n.params}),e.logger?e.logger.debug(`Seeka API: making call to ${r.url}`,{...r}):console.debug(`Seeka API: making call to ${r.url}`,{...r}),n},function(n){let r={error:n};return e.logger?e.logger.http("Seeka API: failed to send request",{...r}):console.debug("Seeka API: failed to send request",{...r}),Promise.reject(n)}),t.interceptors.response.use(function(n){let r={url:n.request?.url||n.config.url,method:n.request?.method||n.config.method,response:{status:n.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}),n},function(n){let{code:r,status:i,message:a}=n,{headers:s,url:c,method:o}=n?.config,l={code:r,status:i,message:a,headers:s,url:c,method:o,content:n?.response?.data};return e.logger?e.logger.error(`Seeka API: call to ${l.url} failed`,{...l}):console.error(`Seeka API: call to ${l.url} failed`,{...l}),Promise.reject(n)}),t},de={getIdentityService:e=>new he(e,e.ingestUrl,pe(e)),getIngestService:e=>new ye(e,e.ingestUrl,pe(e))},ze=class{constructor(e){this.config=e,this.ingestionService=de.getIngestService(e),this.identityService=de.getIdentityService(e)}config;maxBatchSize=50;refreshOrPrimeTokenCache=async()=>{await te(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(A.identity.send,"mergeIdentity");let n=U();return(await this.identityService.merge({id:e,src:{method:"",origin:t.origin,time:void 0,loc:t.loc,sess:n,diag:process.env.SEEKA_DEBUG_ENABLED==="true"?n:void 0,runtime:this.config.runtime}})).result?.personId};mergeIdentityBatch=async(e,t)=>{this.checkPermission(A.identity.send,"mergeIdentityBatch");let n=U();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:n,diag:process.env.SEEKA_DEBUG_ENABLED==="true"?n:void 0,runtime:this.config.runtime},i=Y(e,this.maxBatchSize);if(i.length>1&&this.config.logger&&this.config.logger.debug(`Identity batch size ${e} is greater than ${this.maxBatchSize}, splitting into ${i.length} batches`),await this.trackActivityBatchRaw({data:i[0].map(a=>({id:{id:a||{},src:{...r}}}))}),i.length>1){let a=i.map((s,c)=>c===0?Promise.resolve():(this.config.logger?.verbose(`Processing identity batch ${c+1} of ${i.length}`),this.trackActivityBatchRaw({data:s.map(o=>({id:{id:o||{},src:{...r}}}))})));await Promise.all(a)}};trackActivityBatch=async(e,t)=>{this.checkPermission(A.activity.send,"trackActivityBatch");let n=U();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:n,diag:process.env.SEEKA_DEBUG_ENABLED==="true"?n:void 0,runtime:this.config.runtime},i=Y(e,this.maxBatchSize);if(i.length>1&&this.config.logger&&this.config.logger.debug(`Activity batch size ${e.length} is greater than ${this.maxBatchSize}, splitting into ${i.length} batches`),await this.trackActivityBatchRaw({data:i[0].map(a=>({ev:{id:a.profile||{},src:{...r},payload:a.activity}}))}),i.length>1){let a=i.map((s,c)=>c===0?Promise.resolve():(this.config.logger?.verbose(`Processing activity batch ${c+1} of ${i.length}`),this.trackActivityBatchRaw({data:s.map(o=>({ev:{id:o.profile||{},src:{...r},payload:o.activity}}))})));await Promise.all(a)}};trackActivityBatchRaw=async e=>{await this.ingestionService.batch(e)};trackActivityForProfileId=async(e,t,n)=>{this.checkPermission(A.activity.send,"trackActivityForProfileId"),await this.trackActivityForProfileIdBatch([e],t,n)};trackActivityForProfileIdBatch=async(e,t,n)=>{this.checkPermission(A.activity.send,"trackActivityForProfileIdBatch"),await this.trackActivityBatch(e.map(r=>({activity:r,profile:t?{seekaPId:t}:void 0})),n)};trackActivityForProfile=async(e,t,n)=>{this.checkPermission(A.activity.send,"trackActivityForProfile"),await this.trackActivityForProfileBatch([e],t,n)};trackActivityForProfileBatch=async(e,t,n)=>{this.checkPermission(A.activity.send,"trackActivityForProfileBatch"),await this.trackActivityBatch(e.map(r=>({activity:r,profile:t})),n)}},Xt={measureAdvertisingPerformance:7},Zt=y(u("crypto")),Q="x-seeka-signature-sha256",Ye=(e,t,n)=>{if(!t)return!1;let r=null;if(t.get&&typeof t.get=="function")r=t.get(Q);else{let a=t[Q];a&&(Array.isArray(a)&&a.length>0?r=a[0]:(typeof a=="string"||a instanceof String)&&(r=a))}if(!r)return!1;let i=er(e,n)===r;return i||console.warn("Invalid webhook signature"),i},er=(e,t)=>Zt.createHmac("sha256",e).update(t).digest("hex"),tr=(e,t,n)=>{if(!Ye(e,t,n))throw new Error("Invalid webhook signature")},N=y(u("crypto")),Qe="aes-192-cbc",Xe=(e,t)=>{if(!e)return"";if(!t)throw new Error("Secret is required to encrypt data");let n=N.default.scryptSync(t,"salt",24),r=N.default.randomBytes(16),i=N.default.createCipheriv(Qe,n,r);return[i.update(e,"utf8","hex")+i.final("hex"),Buffer.from(r).toString("hex")].join("|")},Ze=(e,t)=>{if(!e)return"";if(!t)throw new Error("Secret is required to decrypt data");let[n,r]=e.split("|");if(!r)throw new Error("IV not found");let i=N.default.scryptSync(t,"salt",24),a=N.default.createDecipheriv(Qe,i,Buffer.from(r,"hex"));return a.update(n,"hex","utf8")+a.final("utf8")},rr=class{constructor(e){this.appSecret=e}appSecret;encryptWithAppSecret=e=>{if(!this.appSecret)throw new Error("App secret is required to encrypt data");return Xe(e,this.appSecret)};decryptWithAppSecret=e=>{if(!this.appSecret)throw new Error("App secret is required to decrypt data");return Ze(e,this.appSecret)}},nr=class et{constructor(t,n){this.context=t,this.api=new ze(t.config),this.appCache=new E(t.config.appId),this.appInstallCache=new E(t.config.appId,t.config.applicationInstallId),this.crypto=new rr(t.config.appSecret),this.logger=n}context;appCache;appInstallCache;api;logger;crypto;static create=(t,n,r,i,a)=>new et({config:Wt({...n},t,{type:r.name,ver:r.version.split("-")[0]},i,a)},a)},ir=y(u("winston")),D=u("lodash-es"),m=e=>e==null||e===""||String(e).trim()===""?"":String(e);function tt(e){if(e==null||e==="")return 0;let t=e.toString().replace(/[^0-9.]/g,"");return Number.isNaN(Number(t))?0:Number(t)}function ar(e){if(e==null||e===0||e==="")return+"0.00";let t=tt(e);return Number(t.toFixed(3))}function sr(e){return e==null||e===""||Number.isNaN(Number(e.toString()))?0:Math.floor(Number(e))}function or(e){return JSON.parse(JSON.stringify(e))}function cr(e){return/^-?\d+$/.test(e)}function lr(e){if(!(e==null||e.length===0))return rt(e)}function rt(e){return(0,D.last)(e)}function pr(e,t){return(0,D.get)(e,t)}function dr(e,t,n){return(0,D.set)(e,t,n)}function ur(e,t){return(0,D.isEqual)(e,t)}function gr(e){return e?e.trim().toLowerCase():""}function fr(e){return e==null?"":(e=e.trim().replace(/-/gi,"").replace(/\(/gi,"").replace(/\)/gi,"").replace(/ /g,"").replace(/\+/g,""),e)}var mr=["order","subscriptionItemPurchase","oneTimeItemPurchase"],hr=(e,t,n)=>{if(!e.activity)return[];let r=e.activity,i=r.activityName==="custom"?r.activityNameCustom:r.activityName;if(!i)return[];let a=i.toLowerCase(),s=[];return t.forEach(c=>{if(!c)return;switch(c.type){case"activityTracked":{if(!c.activityNames||!c.activityNames.find(p=>p.toLowerCase()===a))return;n.verbose("Matched activity tracked filter",{filter:c,activityName:i});break}case"purchaseMade":{if(!r.activityName||!mr.includes(r.activityName))return;n.verbose("Matched purchase made activity filter",{filter:c,activityName:i});break}default:{n.warn("Unknown activity filter type",{filter:c});return}}let o=c.sourceFilter;if(!o)return;let l=e.source,d;try{d=l?.loc?new URL(l.loc).hostname.toLowerCase():null}catch(p){n.error("Failed to parse activity source URL",{ex:ir.default.exceptions.getAllInfo(p),activitySource:l}),d=null}let v=l?.pipeline?.convergePipelineIntegrationInstanceId?.toLowerCase(),g=o.filters?o.filters.map(p=>{switch(p.type){case"wildcard":return n.verbose("Matched wildcard source filter",{sourceFilter:p}),!0;case"domain":return!d||!p.key?!1:d===p.key.toLowerCase()?(n.verbose("Matched domain source filter",{sourceFilter:p,activityHostname:d}),!0):!1;case"pipeline":return!v||!p.key?!1:v===p.key.toLowerCase()?(n.verbose("Matched pipeline source filter",{sourceFilter:p,sourceConvergePipelineIntegrationInstanceId:v}),!0):!1}}):[];switch(o.comparer){case"and":{g.every(p=>p===!0)&&s.push(c);break}case"or":{g.some(p=>p===!0)&&s.push(c);break}default:{n.warn("Unknown source filter comparer",{sourceFilters:o});break}}}),s},yr=(e,t=!1)=>{let n=e.commerce,r=n?.totalPrice||n?.products?.map(a=>(a.unitPrice||0)*(a.quantity||1)).reduce((a,s)=>a+s,0)||void 0,i=n?.currencyCode||null;if((!r||r<=0)&&(r=e?.lead?.predictedLtv||e?.lead?.predictedValue,r&&e?.lead?.currencyCode&&(i=e?.lead?.currencyCode||null)),(!r||r<=0)&&(r=e?.contentItem?.value,r&&e?.contentItem?.currencyCode&&(i=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&&(i=e?.contentItem?.currencyCode||e?.commerce?.currencyCode||null,!i))){let a=e?.contentItem?.items?.filter(s=>s.currencyCode)||[];a.length>0&&(i=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&&(i=e?.commerce?.currencyCode||null,!i))){let a=e?.commerce?.products?.filter(s=>s.currencyCode)||[];a.length>0&&(i=a[0].currencyCode||null)}return(!r||r<=0)&&!i?null:{value:r===0&&t?null:r||null,currencyCode:i}};function Ir(e,t,n){if(!e)return;let r=t.processing?.contentIdentificationBehavior,i=null;(n=="googleAnalytics"||n=="googleAds")&&(t.analytics?.libraries?.googleAnalytics?.merchant?.productItemIdBehavior!=null&&(r=t.analytics?.libraries?.googleAnalytics?.merchant?.productItemIdBehavior),i=m(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":m(e.variantIdentifier)&&m(e.productIdentifier)?a=`${e.productIdentifier}_${e.variantIdentifier}`:m(e.variantIdentifier)?a=e.variantIdentifier:a=e.productIdentifier;break;case"variantIdOrProductId":m(e.variantIdentifier)?a=e.variantIdentifier:a=e.productIdentifier;break;default:a=m(e?.sku)||m(e?.variantIdentifier)||m(e?.productIdentifier);break}return i?`${i}${a}`:a}function vr(e,t){return m(e?.variantName)||m(e?.productName)}function kr(e){if(!e||e.trim().length===0)return!1;let t=e.split(".").filter(n=>n.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 Ar={defaultIssuerUrl:Ve,defaultTelemetryUrl:Ht,defaultIngestUrl:Je}});var F=bt(it());import{createClient as Sr}from"redis";import*as $ from"winston";var Pr=()=>{let e=process.env.REDIS_CONNECTION_TLS==="true"?"rediss://":"redis://";return process.env.REDIS_CONNECTION_USER&&process.env.REDIS_CONNECTION_PASSWORD?`${e}${process.env.REDIS_CONNECTION_USER}:${process.env.REDIS_CONNECTION_PASSWORD}@${process.env.REDIS_CONNECTION_HOST}:${process.env.REDIS_CONNECTION_PORT}`:`${e}${process.env.REDIS_CONNECTION_HOST}:${process.env.REDIS_CONNECTION_PORT}`},re="__SEEKA_REDIS_CLIENT__",P=e=>{if(global[re])return global[re];let t=Sr({url:Pr(),disableClientInfo:!0}).on("error",n=>e.error("Redis Client ",{ex:$.exceptions.getAllInfo(n)}));return global[re]=t,t},wr=async e=>{await P(e).connect()},at=async e=>P(e).isOpen,Cr=async e=>{P(e).destroy()},st=e=>`seeka:app:${process.env.SEEKA_APP_ID}:${e}`,M=(e,t)=>`${st(e)}:${t}`,O=e=>e==="install",ot=()=>{let e=process.env.DATA_ENCRYPTION_KEY;if(!e)throw new Error("DATA_ENCRYPTION_KEY is required to encrypt/decrypt installation state");return e},ct=e=>{if(!e)return!1;let t=e.split("|");if(t.length!==2)return!1;let[n,r]=t;return!n||!r?!1:/^[0-9a-f]+$/i.test(n)&&/^[0-9a-f]{32}$/i.test(r)},ne=e=>{if(!ct(e))return{plainText:e,wasEncrypted:!1};let t=ot();return{plainText:(0,F.decryptText)(e,t),wasEncrypted:!0}},_=e=>{if(ct(e))return{encryptedText:e,wasEncrypted:!0};let t=ot();return{encryptedText:(0,F.encryptText)(e,t),wasEncrypted:!1}};async function Jr(e,t,n,r="string",i){let a=M(e,t),s=P(i),c=await gt(s,a);if(c){if(r==="string"&&O(e)){let{plainText:o,wasEncrypted:l}=ne(c);if(!l){let{encryptedText:d}=_(c);await s.set(a,d)}return JSON.parse(o)}return JSON.parse(c)}if(r==="json")await s.json.set(a,"$",n);else{let o=JSON.stringify(n);if(O(e)){let{encryptedText:l}=_(o);await s.set(a,l)}else await s.set(a,o)}return n}async function lt(e,t,n="string",r){let i=M(e,t),a=P(r);if(n==="json"){let s=await a.json.get(i);if(s)return s}else{let s=await gt(a,i);if(s){if(O(e)){let{plainText:c,wasEncrypted:o}=ne(s);if(!o){let{encryptedText:l}=_(s);await a.set(i,l)}return JSON.parse(c)}return JSON.parse(s)}}return null}async function pt(e,t){let n=st(e),r=P(t),i=await r.keys(`${n}:*`),a=await r.mGet(i);if(a){let s=[];for(let c=0;c<a.length;c++){let o=a[c],l=i[c];if(!o)continue;let d=o;if(O(e)){let{plainText:v,wasEncrypted:g}=ne(d);if(!g){let{encryptedText:p}=_(d);await r.set(l,p)}s.push(JSON.parse(v))}else s.push(JSON.parse(d))}return s}return[]}async function dt(e,t,n,r="string",i){let a=M(e,t),s=P(i);if(r==="json")await s.json.set(a,"$",n);else{let c=JSON.stringify(n);if(O(e)){let{encryptedText:o}=_(c);await s.set(a,o)}else await s.set(a,c)}}async function ut(e,t,n){let r=M(e,t);await P(n).del(r)}async function gt(e,t){let n=await e.get(t);return typeof n=="string"?n:n?n.toString():""}var ft=async e=>{e.debug(`Trying to connect to Redis - ${process.env.REDIS_CONNECTION_HOST}`);try{await at(e)?e.verbose(`Redis already connected - ${process.env.REDIS_CONNECTION_HOST}`):(e.profile("service.redis.connect"),await wr(e),e.profile("service.redis.connect"),e.debug(`Redis connected - ${process.env.REDIS_CONNECTION_HOST}`))}catch(t){throw e.error(`Failed to connect to Redis - ${process.env.REDIS_CONNECTION_HOST}`,{ex:$.exceptions.getAllInfo(t)}),t}},Vr=async e=>{e.debug(`Trying to disconnect from Redis - ${process.env.REDIS_CONNECTION_HOST}`);try{await at(e)===!1?e.verbose(`Redis already disconnected - ${process.env.REDIS_CONNECTION_HOST}`):(e.profile("service.redis.disconnect"),await Cr(e),e.profile("service.redis.disconnect"),e.verbose(`Redis disconnected - ${process.env.REDIS_CONNECTION_HOST}`))}catch(t){throw e.error(`Failed to disconnect from Redis - ${process.env.REDIS_CONNECTION_HOST}`,{ex:$.exceptions.getAllInfo(t)}),t}};var q="install",ie=async(e,t,n)=>{let r=await lt(q,e,"string",n);if(r==null&&t)throw n.error(`Seeka installation ${e} not found`),new Error(`Seeka installation ${e} not found`);return r},Qr=async e=>await pt(q,e),Xr=async(e,t)=>{e.installationState||(e.installationState={}),e.installedAt||(e.installedAt=new Date().toISOString());let n=await ie(e.applicationInstallId,!1,t)===null;return await dt(q,e.applicationInstallId,e,"string",t),t.info(n?"Created installation state":"Updated installation state",{applicationInstallId:e.applicationInstallId,organisationId:e.organisationId,organisationBrandId:e.organisationBrandId}),e},Zr=async(e,t)=>{await ut(q,e,t),t.info("Deleted installation state",{applicationInstallId:e})};var j=e=>"seeka_app_"+e+"_at_app",H=e=>"seeka_app_"+e+"_at_core",ae="X-Seeka-App-Token",se="X-Seeka-CoreApi-Token",W="at_app",G="at_core";import Tr from"jsonwebtoken";var mt=async(e,t,n,r)=>{let i=new URL(e),a=t.get("Cookie"),s=i.searchParams.get(W)||"";if(!s&&t.get(ae)&&(s=t.get(ae)?.split("Bearer ")[1]),!s&&a){let o=a.split(";").find(l=>l.trim().startsWith(j(process.env.SEEKA_APP_ID)));o&&(s=o.split("=")[1])}let c=i.searchParams.get(G)||"";if(!c&&t.get(se)&&(c=t.get(se)?.split("Bearer ")[1]),!c&&a){let o=a.split(";").find(l=>l.trim().startsWith(H(process.env.SEEKA_APP_ID)));o&&(c=o.split("=")[1])}return await xr(s,c,n,r)},xr=async(e,t,n,r)=>{let i,a,s;if(e)try{let o=Tr.verify(e,process.env.SEEKA_APP_SECRET,{ignoreNotBefore:!0});if(r.info("Decoded token",{decoded:o}),!o.appId||o.appId.replace(/-/g,"")!==process.env.SEEKA_APP_ID.replace(/-/g,"")){r.error("Invalid token - app id does not match",{decoded:o,appIdToken:o.appId,appIdEnv:process.env.SEEKA_APP_ID});return}else i=o.appId;if(o.appInstallId)a=o.appInstallId;else{r.error("Invalid token - no appInstallId",{decoded:o});return}s=o.exp}catch(o){r.error("Failed to validate token",{err:o});return}else{r.error("No access token present");return}n&&await n(r);let c=await ie(a,!1,r);if(c==null){r.warn("UI call cannot be processed as the installation ID is not known by this app",{seekaAppInstallId:a});return}return{appAccessToken:e,coreApiAccessToken:t,seekaAppId:i,seekaAppInstallId:a,expiresAt:s,installation:c}};import*as K from"fs/promises";import R from"path";import{OpenTelemetryTransportV3 as Nr}from"@opentelemetry/winston-transport";import*as I from"winston";var ht=[new I.transports.Console({level:process.env.LOGGING_LEVEL,format:I.format.combine(I.format.errors({stack:!0}),I.format.cli(),I.format.splat()),handleExceptions:!0,handleRejections:!0})];process.env.OTEL_SDK_DISABLED!=="true"&&ht.push(new Nr({handleExceptions:!0,handleRejections:!0}));var br=I.createLogger({level:process.env.LOGGING_LEVEL,transports:ht,exitOnError:!1}),T=(e,t,n=br,r={})=>n.child({...e,...t?{seekaAppInstallId:t.applicationInstallId,seekaAppInstallOrganisationBrandId:t.organisationBrandId,seekaAppInstallOrganisationId:t.organisationId,...r?.invocationId?{"faas.invocation_id":r.invocationId}:{}}:{}}),cn=(e,t)=>{let n={seekaWebhookType:e.type,seekaWebhookIsTest:e.isTest,RequestId:e.requestId,"faas.invocation_id":t.invocationId,CausationId:e.causationId,CorrelationId:e.causationId},r=e.context;return r&&(n.seekaAppInstallId=r.applicationInstallId,n.seekaAppInstallOrganisationBrandId=r.organisationBrandId,n.seekaAppInstallOrganisationId=r.organisationId),T(n)},ln=(e,t,n)=>{let r={jobContext:t,jobName:e,"faas.invocation_id":n.invocationId,CausationId:t?.causationId,CorrelationId:t?.causationId,seekaAppInstallId:t?.applicationInstallId??t?.payload.applicationInstallId,seekaAppInstallOrganisationBrandId:t?.organisationBrandId,seekaAppInstallOrganisationId:t?.organisationId};return T(r)};async function yt(e,t){return await K.readFile(e,{encoding:t})}var oe="config.js",yn=async(e,t,n,r,i,a)=>{let s=T(null,void 0,void 0,r);s.profile("http.seeka.webhook.app.ui");let o=new URL(e).pathname?.replace(/^\/app/,"")||"/";s.verbose("Received Seeka UI request",{requestedPath:o,url:e,method:t});let l=R.resolve("./dist/src/ui/build"),d=null,v=null,g,p={},J=[],f,V=async()=>o==="/health"?null:(f=await mt(e,n,()=>ft(s),s),f?(d=f.seekaAppId,v=f.seekaAppInstallId,g=f.installation,s=T(null,g,s,r),s.verbose("Authenticated Seeka UI request",{requestedPath:o,url:e,method:t}),s=T(null,g,s,r),J.push({name:j(process.env.SEEKA_APP_ID),value:f.appAccessToken,httpOnly:!0,secure:!0,sameSite:"None",expires:new Date(f.expiresAt*1e3)}),J.push({name:H(process.env.SEEKA_APP_ID),value:f.coreApiAccessToken,httpOnly:!0,secure:!0,sameSite:"None",expires:new Date(f.expiresAt*1e3)}),null):{status:403,jsonBody:{error:"Invalid token"}}),k=R.join(l,o),w;try{if(o==="/health")return{status:200,jsonBody:{status:"ok"}};if(o==="/"+oe){let h=await V();if(h)return h;let C=process.env.APP_UI_BASE_PATH?`${process.env.APP_UI_BASE_PATH}`:"",x=`${process.env.SELF_HOST_BASEURL}${C}`,At={seekaAppId:d||"",seekaAppInstallId:v||"",organisationBrandId:g?.organisationBrandId||"",appBaseUrl:x,state:await i(g,s)};w=`window.seekaAppConfig = ${JSON.stringify(At)}`}if(o.startsWith("/api")){let h=await V();if(h)return h;let C=await a(o,t,g,s);return C||{status:404,jsonBody:{error:"Not found"}}}if(o==="/"||o==="/index.html"){let h=await V();if(h)return h;let C=`?${W}=${encodeURIComponent(f?.appAccessToken||"")}&${G}=${encodeURIComponent(f?.coreApiAccessToken||"")}&`;k=R.join(l,"index.html");let x=await yt(k,"utf-8");x=x.replace(oe+"?",oe+C),w=x}else w||(k=R.join(l,o),await K.access(k))}catch(h){k=R.join(l,"index.html"),console.log("File not found, serving index.html",{err:h,requestedPath:o,buildPath:l,filePath:k,content:w})}return w||(w=await yt(k)),{status:200,headers:{"Content-Type":await Er(k),"Referrer-Policy":"no-referrer",...p},cookies:J,body:w}},It=new Map;async function Er(e){let t=e.split(".").pop()?.toLowerCase();if(!t)return"application/octet-stream";if(t==="html")return"text/html";if(t==="js")return"application/javascript";if(t==="css")return"text/css";if(t==="png")return"image/png";if(t==="svg")return"image/svg+xml";if(t==="jpg"||t=="jpeg")return"image/jpeg";if(t==="gif")return"image/gif";let n=It.get(t);if(n)return n;let i=(await import("mime-types")).lookup(e);return i?(It.set(t,i),i):"application/octet-stream"}import kt from"fs/promises";import vt from"path";import Or from"winston";var _r=async e=>kt.stat(e).then(()=>!0).catch(()=>!1);async function Pn(e,t,n,r){let a=vt.resolve(vt.join(t,"seeka-browser-plugin.min.js"));return await Rr(e,a,n,r)}async function Rr(e,t,n,r){r.profile("http.seeka.browser.plugin");let i,a;try{r.verbose("Handling request for browser plugin content",{path:t}),await _r(t)?(r.verbose("Browser plugin content found",{path:t}),i=await kt.readFile(t,"utf8"),a=`${e}(${JSON.stringify(n)})`):r.error("Browser plugin content not found",{path:t})}catch(s){r.error("Failed to handle request for browser plugin content",{ex:Or.exceptions.getAllInfo(s)})}finally{r.profile("http.seeka.browser.plugin"),r.verbose("Request for browser plugin content handled")}if(!i||!a)throw new Error("Failed to handle request for browser plugin content");return{content:i,init:a}}export{br as appLogger,ln as backgroundJobLogger,xr as checkAuth,T as childLogger,wr as connect,Xr as createOrUpdateInstallation,Zr as deleteInstallation,Cr as disconnect,yn as generateAppUiHttpRequestResponse,mt as getAccessTokenAndCheck,M as getKey,pt as getList,Jr as getOrCreate,P as getOrCreateClient,Pn as getSeekaBrowserPlugin,Rr as getSeekaBrowserPluginByName,at as isConnected,Qr as listInstallations,ut as remove,dt as set,ft as startServices,Vr as stopServices,lt as tryGet,ie as tryGetInstallation,cn as webhookLogger};
|
|
1
|
+
var Pt=Object.create;var le=Object.defineProperty;var wt=Object.getOwnPropertyDescriptor;var Ct=Object.getOwnPropertyNames;var Tt=Object.getPrototypeOf,xt=Object.prototype.hasOwnProperty;var u=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var Nt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var bt=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Ct(t))!xt.call(e,i)&&i!==n&&le(e,i,{get:()=>t[i],enumerable:!(r=wt(t,i))||r.enumerable});return e};var Et=(e,t,n)=>(n=e!=null?Pt(Tt(e)):{},bt(t||!e||!e.__esModule?le(n,"default",{value:e,enumerable:!0}):n,e));var at=Nt((Br,it)=>{"use strict";var Ot=Object.create,D=Object.defineProperty,_t=Object.getOwnPropertyDescriptor,Rt=Object.getOwnPropertyNames,Lt=Object.getPrototypeOf,Ut=Object.prototype.hasOwnProperty,Bt=(e,t)=>{for(var n in t)D(e,n,{get:t[n],enumerable:!0})},ge=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Rt(t))!Ut.call(e,i)&&i!==n&&D(e,i,{get:()=>t[i],enumerable:!(r=_t(t,i))||r.enumerable});return e},y=(e,t,n)=>(n=e!=null?Ot(Lt(e)):{},ge(t||!e||!e.__esModule?D(n,"default",{value:e,enumerable:!0}):n,e)),Dt=e=>ge(D({},"__esModule",{value:!0}),e),fe={};Bt(fe,{ActivityPipelineActivityFilterSourceItemType:()=>_e,ActivityPipelineActivityFilterType:()=>Ee,AnalyticsLibrary:()=>Le,ApiException:()=>je,ApiServiceProxyBase:()=>Z,AppPermissionKeys:()=>S,ClickAttributionSourcePlatform:()=>be,ConditionComparer:()=>Oe,ConditionOperator:()=>Re,ConsentMappingMatchType:()=>Me,ContentIdentificationBehavior:()=>Ue,ConvergePipelineLoggableActivityType:()=>Te,ConvergeVendorDestinationPublishStrategy:()=>Be,CrossDomainTrackingUtmBehavior:()=>De,ECommerceContentType:()=>Ae,ECommerceFinancialStatus:()=>Ce,ECommerceFulfillmentStatus:()=>we,ECommercePlatform:()=>Pe,IabPrivacyConsentPurposeId:()=>Fe,IabPrivacyConsentPurposeIdMap:()=>Zt,IdentityServiceProxy:()=>ye,IngestServiceProxy:()=>Ie,PrivacyConsentType:()=>ke,PrivacyDataControlMode:()=>qe,RegionalConsentGrantOption:()=>$e,ResponseResultType:()=>ve,SdkLogEventLevel:()=>xe,SeekaApiHelper:()=>Ye,SeekaAppCacheManager:()=>O,SeekaAppConfig:()=>he,SeekaAppHelper:()=>ir,SeekaWebhookCallType:()=>Ne,TrackingActivityNames:()=>B,TrackingEventSourceOriginType:()=>Se,chunk:()=>Q,cloneDeep:()=>cr,dateToUtcDateTimeReferenceString:()=>Ge,decryptText:()=>et,emailAddress:()=>fr,encryptText:()=>Ze,generateNewSessionId:()=>U,getActivityName:()=>Mt,getActivityValue:()=>Ir,getContentIdFromProduct:()=>vr,getContentNameFromProduct:()=>kr,getIssuer:()=>te,getNestedProperty:()=>dr,getNewAppInstallToken:()=>Ke,getNewOrCachedAppInstallToken:()=>re,getRandomNumberString:()=>We,isDeepEqual:()=>gr,isNumber:()=>lr,isValidSeekaProfileId:()=>Sr,last:()=>nt,lastOrDefault:()=>pr,matchActivityPipelineFilters:()=>yr,md5Hash:()=>Je,parseFloat:()=>rt,parseInt:()=>or,parseMoney:()=>sr,parseStr:()=>m,phoneNumberToE164:()=>mr,separatePersonFullName:()=>qt,setNestedProperty:()=>ur,throwOnInvalidWebhookSignature:()=>rr,urls:()=>Ar,validateWebhookSignature:()=>Qe,webhookSignatureHeaderName:()=>X});it.exports=Dt(fe);var $t="3.9.11",me=y(u("axios")),he=class{appId;appSecret;ingestUrl;issuerUrl;organisationId;applicationInstallId;runtime;logger;grantedPermissions;transformApiRequest;transformApiResponse;hasAnyPermissions;hasAllPermissions;hasPermission},Z=class{config;constructor(e){this.config=e}transformOptions=async e=>await this.config.transformApiRequest(e);transformResult=async(e,t,n)=>await this.config.transformApiResponse(e,t,n)},ye=class extends Z{instance;baseUrl;jsonParseReviver=void 0;constructor(e,t,n){super(e),this.instance=n||me.default.create(),this.baseUrl=t??"https://api-localdev-env0-seeka.au.ngrok.io"}merge(e,t){let n=this.baseUrl+"/api/identity";n=n.replace(/[?&]$/,"");let r={data:JSON.stringify(e),method:"POST",url:n,headers:{"Content-Type":"application/json",Accept:"application/json"},cancelToken:t};return this.transformOptions(r).then(i=>this.instance.request(i)).catch(i=>{if(He(i)&&i.response)return i.response;throw i}).then(i=>this.transformResult(n,i,a=>this.processMerge(a)))}processMerge(e){let t=e.status,n={};if(e.headers&&typeof e.headers=="object")for(let r in e.headers)e.headers.hasOwnProperty(r)&&(n[r]=e.headers[r]);if(t===200){let r=e.data,i=null;return i=JSON.parse(r),Promise.resolve(i)}else if(t===400){let r=e.data,i=null;return i=JSON.parse(r),A("A server side error occurred.",t,r,n,i)}else if(t===401){let r=e.data,i=null;return i=JSON.parse(r),A("A server side error occurred.",t,r,n,i)}else if(t===422){let r=e.data,i=null;return i=JSON.parse(r),A("A server side error occurred.",t,r,n,i)}else if(t!==200&&t!==204){let r=e.data;return A("An unexpected server error occurred.",t,r,n)}return Promise.resolve(null)}},Ie=class extends Z{instance;baseUrl;jsonParseReviver=void 0;constructor(e,t,n){super(e),this.instance=n||me.default.create(),this.baseUrl=t??"https://api-localdev-env0-seeka.au.ngrok.io"}batch(e,t){let n=this.baseUrl+"/api/ingest";n=n.replace(/[?&]$/,"");let r={data:JSON.stringify(e),method:"POST",url:n,headers:{"Content-Type":"application/json"},cancelToken:t};return this.transformOptions(r).then(i=>this.instance.request(i)).catch(i=>{if(He(i)&&i.response)return i.response;throw i}).then(i=>this.transformResult(n,i,a=>this.processBatch(a)))}processBatch(e){let t=e.status,n={};if(e.headers&&typeof e.headers=="object")for(let r in e.headers)e.headers.hasOwnProperty(r)&&(n[r]=e.headers[r]);if(t===202){let r=e.data;return Promise.resolve(null)}else if(t===400){let r=e.data,i=null;return i=JSON.parse(r),A("A server side error occurred.",t,r,n,i)}else if(t===401){let r=e.data,i=null;return i=JSON.parse(r),A("A server side error occurred.",t,r,n,i)}else if(t===422){let r=e.data,i=null;return i=JSON.parse(r),A("A server side error occurred.",t,r,n,i)}else if(t!==200&&t!==204){let r=e.data;return A("An unexpected server error occurred.",t,r,n)}return Promise.resolve(null)}},ve=(e=>(e.Undefined="undefined",e.Success="success",e.Failed="failed",e))(ve||{}),ke=(e=>(e.Unknown="unknown",e.Informed="informed",e.Implied="implied",e.Explicit="explicit",e.Active="active",e.Passive="passive",e))(ke||{}),Se=(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))(Se||{}),B=(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))(B||{}),Ae=(e=>(e.Undefined="undefined",e.SingleProduct="singleProduct",e.SingleVariant="singleVariant",e.Collection="collection",e))(Ae||{}),Pe=(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))(Pe||{}),we=(e=>(e.Undefined="undefined",e.Fulfilled="fulfilled",e.NoneFulfilled="noneFulfilled",e.PartiallyFulfilled="partiallyFulfilled",e.RestockedOrCancelled="restockedOrCancelled",e.Pending="pending",e))(we||{}),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||{}),Te=(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))(Te||{}),xe=(e=>(e.Information="information",e.Warning="warning",e.Error="error",e.Verbose="verbose",e))(xe||{}),Ne=(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))(Ne||{}),be=(e=>(e.Unknown="unknown",e.Google="google",e.Meta="meta",e.Snapchat="snapchat",e.Pinterest="pinterest",e.TikTok="tikTok",e))(be||{}),Ee=(e=>(e.Undefined="undefined",e.PurchaseMade="purchaseMade",e.ActivityTracked="activityTracked",e))(Ee||{}),Oe=(e=>(e.Undefined="undefined",e.And="and",e.Or="or",e))(Oe||{}),_e=(e=>(e.Undefined="undefined",e.Domain="domain",e.Pipeline="pipeline",e.Wildcard="wildcard",e.Url="url",e.PagePath="pagePath",e))(_e||{}),Re=(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))(Re||{}),Le=(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))(Le||{}),Ue=(e=>(e.Default="default",e.Sku="sku",e.ProductId="productId",e.VariantId="variantId",e.ProductIdAndVariantIdUnderscore="productIdAndVariantIdUnderscore",e.VariantIdOrProductId="variantIdOrProductId",e))(Ue||{}),Be=(e=>(e.DeliverAllTraitsAndDeliverAllEvents="deliverAllTraitsAndDeliverAllEvents",e.DeliverAllTraitsAndDeliverEventsOnlyIfMaxWeightedTraitsPresent="deliverAllTraitsAndDeliverEventsOnlyIfMaxWeightedTraitsPresent",e.DeliverMaxWeightedTraitsOnlyAndDeliverAllEvents="deliverMaxWeightedTraitsOnlyAndDeliverAllEvents",e.DeliverMaxWeightedTraitsOnlyAndDeliverEventsOnlyIfMaxWeightedTraitsPresent="deliverMaxWeightedTraitsOnlyAndDeliverEventsOnlyIfMaxWeightedTraitsPresent",e))(Be||{}),De=(e=>(e.None="none",e.SessionPassthrough="sessionPassthrough",e.UrlPassthrough="urlPassthrough",e))(De||{}),$e=(e=>(e.Unset="unset",e.Granted="granted",e.Denied="denied",e))($e||{}),Fe=(e=>(e.Undefined="undefined",e.MeasureAdvertisingPerformance="measureAdvertisingPerformance",e))(Fe||{}),Me=(e=>(e.Undefined="undefined",e.AllOf="allOf",e.AnyOf="anyOf",e))(Me||{}),qe=(e=>(e.Disabled="disabled",e.Explicit="explicit",e.Implicit="implicit",e))(qe||{}),je=class extends Error{message;status;response;headers;result;constructor(e,t,n,r,i){super(),this.message=e,this.status=t,this.response=n,this.headers=r,this.result=i}isApiException=!0;static isApiException(e){return e.isApiException===!0}};function A(e,t,n,r,i){throw i??new je(e,t,n,r,null)}function He(e){return e&&e.isAxiosError===!0}var E=u("openid-client"),ee=y(u("winston")),Y=y(u("memory-cache")),pe="seeka:sdk",O=class{constructor(e,t){this.appId=e,this.appInstallationId=t}appId;appInstallationId;set=async(e,t,n)=>{let r=this.getKey(e);Y.default.put(r,JSON.stringify(t),n)};getOrSet=async(e,t,n)=>{let r=this.getKey(e),i=Y.default.get(r);if(i){let s=JSON.parse(i);return n&&await n(s),s}let a=await t();return a?(Y.default.put(r,JSON.stringify(a.value),a.expiryAbsoluteMilliseconds),a.value):null};getKey=e=>this.appInstallationId?`${pe}:${this.appId}:${this.appInstallationId}:${e}`:`${pe}:${this.appId}:${e}`},Ft=y(u("crypto")),U=()=>{let e=Ge(new Date),t=We();return`${e}.${t}`},Mt=e=>{let t=Object.keys(B),n=e.toLowerCase(),r=t.find(i=>i.toLowerCase()===n);return r?B[r]:"custom"},We=()=>Math.floor(Math.random()*(9999999999-1e9)+1e9).toString(),Ge=e=>{let t=(e.getUTCMonth()+1).toString();t.length<2&&(t="0"+t);let n=e.getUTCDate().toString();n.length<2&&(n="0"+n);let r=e.getUTCHours().toString();r.length<2&&(r="0"+r);let i=e.getUTCMinutes().toString();i.length<2&&(i="0"+i);let a=e.getUTCSeconds().toString();return a.length<2&&(a="0"+a),`${e.getUTCFullYear()}${t}${n}.${r}${i}${a}`},Je=e=>Ft.createHash("md5").update(e).digest("hex"),qt=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(" ")}},Q=(e,t)=>e.reduce((n,r,i)=>{let a=Math.floor(i/t);return n[a]||(n[a]=[]),n[a].push(r),n},[]),te=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 n=new O(e.appId,e.applicationInstallId),r=Je(e.issuerUrl+"_"+e.appId),i=await n.getOrSet(r,async()=>{try{let a=await jt(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:ee.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 i===null?null:new E.Configuration(i.serverMetadata,i.clientId,e.appSecret)},jt=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 n=e.appId.replace(/-/g,""),r=await(0,E.discovery)(new URL(e.issuerUrl),n,void 0,(0,E.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:n},raw:r}}catch(n){return e.logger?e.logger.error("Seeka auth: failed discovering issuer from remote",{...t,ex:ee.default.exceptions.getAllInfo(n)}):console.error("Seeka auth: failed discovering issuer from remote",{...t,err:n}),null}},Ht=async e=>{let t={applicationId:e.appId,issuer:{url:e.issuerUrl}},n=await te(e);if(!n)return null;try{let r=await(0,E.clientCredentialsGrant)(n,{resource:n.clientMetadata().client_id}),i={...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",{...i}):console.info("Seeka auth: got app client token from server",{...i}),{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 i={...t,error:r};return e.logger?e.logger.error("Seeka auth: failed to get client access token from server",{...i}):console.error("Seeka auth: failed to get client access token from server",{...i,err:ee.default.exceptions.getAllInfo(r)}),null}},Ke=async(e,t)=>{let n={applicationId:t.appId,issuer:{url:t.issuerUrl}},r=await te(t);if(!r||!r)return null;try{let i=await(0,E.genericGrantRequest)(r,"app_install_token",{applicationInstallId:t.applicationInstallId,access_token:e,scope:"Seeka.API.Ingest"}),a={...n,token:{expires_at:i.expires_at,token_type:i.token_type,scope:i.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:i.token_type,access_token:i.access_token,expires_in:i.expires_in,id_token:i.id_token,refresh_token:i.refresh_token,scope:i.scope,authorization_details:i.authorization_details}}catch(i){let a={...n,error:i};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}},re=async e=>{let t=new O(e.appId,e.applicationInstallId),n={applicationId:e.appId,issuer:{url:e.issuerUrl}};return await t.getOrSet("auth:token:appinstall",async()=>{let r=await Ht(e);if(!r||!r.access_token)return null;let i=await Ke(r.access_token,e);return i?{value:i,expiryAbsoluteMilliseconds:((i.expires_in>r.expires_in?r.expires_in:i.expires_in)||900*1e3)-60*1e3}:null},async()=>{e.logger?e.logger.verbose("Seeka auth: got app token from cache",{...n}):console.debug("Seeka auth: got app token from cache",{...n})})},Ve="https://router.seeka.services",Wt="https://router.seeka.services/tel/otel",ze="https://account.seeka.app",Gt=(e,t,n,r,i)=>{let a=new he;return a.appId=e.applicationId,a.appSecret=t,a.ingestUrl=process.env.SEEKA_INGEST_URL||Ve,a.issuerUrl=process.env.SEEKA_ISSUER_URL||ze,a.organisationId=e.organisationId,a.applicationInstallId=e.applicationInstallId,a.runtime={type:"sdk/js/apps-server",ver:$t.split("-")[0],client:n},a.logger=i,a.grantedPermissions=r,a.transformApiRequest=s=>Jt(a,s),a.transformApiResponse=async(s,c,o)=>Kt(a,s,c,o),a.hasAnyPermissions=s=>!a.grantedPermissions||a.grantedPermissions.length===0?!1:!s||s.length===0?!0:s.some(c=>a.grantedPermissions.includes(c)),a.hasAllPermissions=s=>!a.grantedPermissions||a.grantedPermissions.length===0?!1:!s||s.length===0?!0:s.every(c=>a.grantedPermissions.includes(c)),a.hasPermission=s=>!a.grantedPermissions||a.grantedPermissions.length===0?!1:s?a.grantedPermissions.includes(s):!0,a},Jt=async(e,t)=>{let n=await re(e);if(!n||!n.access_token)throw new Error("Could not get access token for API request");return t.headers={...t.headers,"X-OrgId":e.organisationId,Authorization:"Bearer "+n?.access_token},t},Kt=async(e,t,n,r)=>(n.data=JSON.stringify(n.data),r(n)),S={identity:{receiveFull:"Identity.Receive.Pii",send:"Identity.Send"},activity:{receiveAnon:"Activity.Receive.Anon",receiveFull:"Activity.Receive.Pii",send:"Activity.Send"}},Vt=y(u("axios")),zt=y(u("http")),Yt=y(u("https")),Qt=new zt.default.Agent({keepAlive:!0,scheduling:"fifo"}),Xt=new Yt.default.Agent({keepAlive:!0,scheduling:"fifo"}),de=e=>{let t=Vt.default.create({httpAgent:Qt,httpsAgent:Xt});return t.interceptors.request.use(function(n){let r={url:n.url,method:n.method};return process.env.LOGGING_LEVEL==="silly"&&(r={...r,body:n.data,params:n.params}),e.logger?e.logger.debug(`Seeka API: making call to ${r.url}`,{...r}):console.debug(`Seeka API: making call to ${r.url}`,{...r}),n},function(n){let r={error:n};return e.logger?e.logger.http("Seeka API: failed to send request",{...r}):console.debug("Seeka API: failed to send request",{...r}),Promise.reject(n)}),t.interceptors.response.use(function(n){let r={url:n.request?.url||n.config.url,method:n.request?.method||n.config.method,response:{status:n.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}),n},function(n){let{code:r,status:i,message:a}=n,{headers:s,url:c,method:o}=n?.config,l={code:r,status:i,message:a,headers:s,url:c,method:o,content:n?.response?.data};return e.logger?e.logger.error(`Seeka API: call to ${l.url} failed`,{...l}):console.error(`Seeka API: call to ${l.url} failed`,{...l}),Promise.reject(n)}),t},ue={getIdentityService:e=>new ye(e,e.ingestUrl,de(e)),getIngestService:e=>new Ie(e,e.ingestUrl,de(e))},Ye=class{constructor(e){this.config=e,this.ingestionService=ue.getIngestService(e),this.identityService=ue.getIdentityService(e)}config;maxBatchSize=50;refreshOrPrimeTokenCache=async()=>{await re(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(S.identity.send,"mergeIdentity");let n=U();return(await this.identityService.merge({id:e,src:{method:"",origin:t.origin,time:void 0,loc:t.loc,sess:n,diag:process.env.SEEKA_DEBUG_ENABLED==="true"?n:void 0,runtime:this.config.runtime}})).result?.personId};mergeIdentityBatch=async(e,t)=>{this.checkPermission(S.identity.send,"mergeIdentityBatch");let n=U();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:n,diag:process.env.SEEKA_DEBUG_ENABLED==="true"?n:void 0,runtime:this.config.runtime},i=Q(e,this.maxBatchSize);if(i.length>1&&this.config.logger&&this.config.logger.debug(`Identity batch size ${e} is greater than ${this.maxBatchSize}, splitting into ${i.length} batches`),await this.trackActivityBatchRaw({data:i[0].map(a=>({id:{id:a||{},src:{...r}}}))}),i.length>1){let a=i.map((s,c)=>c===0?Promise.resolve():(this.config.logger?.verbose(`Processing identity batch ${c+1} of ${i.length}`),this.trackActivityBatchRaw({data:s.map(o=>({id:{id:o||{},src:{...r}}}))})));await Promise.all(a)}};trackActivityBatch=async(e,t)=>{this.checkPermission(S.activity.send,"trackActivityBatch");let n=U();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:n,diag:process.env.SEEKA_DEBUG_ENABLED==="true"?n:void 0,runtime:this.config.runtime},i=Q(e,this.maxBatchSize);if(i.length>1&&this.config.logger&&this.config.logger.debug(`Activity batch size ${e.length} is greater than ${this.maxBatchSize}, splitting into ${i.length} batches`),await this.trackActivityBatchRaw({data:i[0].map(a=>({ev:{id:a.profile||{},src:{...r},payload:a.activity}}))}),i.length>1){let a=i.map((s,c)=>c===0?Promise.resolve():(this.config.logger?.verbose(`Processing activity batch ${c+1} of ${i.length}`),this.trackActivityBatchRaw({data:s.map(o=>({ev:{id:o.profile||{},src:{...r},payload:o.activity}}))})));await Promise.all(a)}};trackActivityBatchRaw=async e=>{await this.ingestionService.batch(e)};trackActivityForProfileId=async(e,t,n)=>{this.checkPermission(S.activity.send,"trackActivityForProfileId"),await this.trackActivityForProfileIdBatch([e],t,n)};trackActivityForProfileIdBatch=async(e,t,n)=>{this.checkPermission(S.activity.send,"trackActivityForProfileIdBatch"),await this.trackActivityBatch(e.map(r=>({activity:r,profile:t?{seekaPId:t}:void 0})),n)};trackActivityForProfile=async(e,t,n)=>{this.checkPermission(S.activity.send,"trackActivityForProfile"),await this.trackActivityForProfileBatch([e],t,n)};trackActivityForProfileBatch=async(e,t,n)=>{this.checkPermission(S.activity.send,"trackActivityForProfileBatch"),await this.trackActivityBatch(e.map(r=>({activity:r,profile:t})),n)}},Zt={measureAdvertisingPerformance:7},er=y(u("crypto")),X="x-seeka-signature-sha256",Qe=(e,t,n)=>{if(!t)return!1;let r=null;if(t.get&&typeof t.get=="function")r=t.get(X);else{let a=t[X];a&&(Array.isArray(a)&&a.length>0?r=a[0]:(typeof a=="string"||a instanceof String)&&(r=a))}if(!r)return!1;let i=tr(e,n)===r;return i||console.warn("Invalid webhook signature"),i},tr=(e,t)=>er.createHmac("sha256",e).update(t).digest("hex"),rr=(e,t,n)=>{if(!Qe(e,t,n))throw new Error("Invalid webhook signature")},b=y(u("crypto")),Xe="aes-192-cbc",Ze=(e,t)=>{if(!e)return"";if(!t)throw new Error("Secret is required to encrypt data");let n=b.default.scryptSync(t,"salt",24),r=b.default.randomBytes(16),i=b.default.createCipheriv(Xe,n,r);return[i.update(e,"utf8","hex")+i.final("hex"),Buffer.from(r).toString("hex")].join("|")},et=(e,t)=>{if(!e)return"";if(!t)throw new Error("Secret is required to decrypt data");let[n,r]=e.split("|");if(!r)throw new Error("IV not found");let i=b.default.scryptSync(t,"salt",24),a=b.default.createDecipheriv(Xe,i,Buffer.from(r,"hex"));return a.update(n,"hex","utf8")+a.final("utf8")},nr=class{constructor(e){this.appSecret=e}appSecret;encryptWithAppSecret=e=>{if(!this.appSecret)throw new Error("App secret is required to encrypt data");return Ze(e,this.appSecret)};decryptWithAppSecret=e=>{if(!this.appSecret)throw new Error("App secret is required to decrypt data");return et(e,this.appSecret)}},ir=class tt{constructor(t,n){this.context=t,this.api=new Ye(t.config),this.appCache=new O(t.config.appId),this.appInstallCache=new O(t.config.appId,t.config.applicationInstallId),this.crypto=new nr(t.config.appSecret),this.logger=n}context;appCache;appInstallCache;api;logger;crypto;static create=(t,n,r,i,a)=>new tt({config:Gt({...n},t,{type:r.name,ver:r.version.split("-")[0]},i,a)},a)},ar=y(u("winston")),$=u("lodash-es"),m=e=>e==null||e===""||String(e).trim()===""?"":String(e);function rt(e){if(e==null||e==="")return 0;let t=e.toString().replace(/[^0-9.]/g,"");return Number.isNaN(Number(t))?0:Number(t)}function sr(e){if(e==null||e===0||e==="")return+"0.00";let t=rt(e);return Number(t.toFixed(3))}function or(e){return e==null||e===""||Number.isNaN(Number(e.toString()))?0:Math.floor(Number(e))}function cr(e){return JSON.parse(JSON.stringify(e))}function lr(e){return/^-?\d+$/.test(e)}function pr(e){if(!(e==null||e.length===0))return nt(e)}function nt(e){return(0,$.last)(e)}function dr(e,t){return(0,$.get)(e,t)}function ur(e,t,n){return(0,$.set)(e,t,n)}function gr(e,t){return(0,$.isEqual)(e,t)}function fr(e){return e?e.trim().toLowerCase():""}function mr(e){return e==null?"":(e=e.trim().replace(/-/gi,"").replace(/\(/gi,"").replace(/\)/gi,"").replace(/ /g,"").replace(/\+/g,""),e)}var hr=["order","subscriptionItemPurchase","oneTimeItemPurchase"],yr=(e,t,n)=>{if(!e.activity)return[];let r=e.activity,i=r.activityName==="custom"?r.activityNameCustom:r.activityName;if(!i)return[];let a=i.toLowerCase(),s=[];return t.forEach(c=>{if(!c)return;switch(c.type){case"activityTracked":{if(!c.activityNames||!c.activityNames.find(p=>p.toLowerCase()===a))return;n.verbose("Matched activity tracked filter",{filter:c,activityName:i});break}case"purchaseMade":{if(!r.activityName||!hr.includes(r.activityName))return;n.verbose("Matched purchase made activity filter",{filter:c,activityName:i});break}default:{n.warn("Unknown activity filter type",{filter:c});return}}let o=c.sourceFilter;if(!o)return;let l=e.source,d;try{d=l?.loc?new URL(l.loc).hostname.toLowerCase():null}catch(p){n.error("Failed to parse activity source URL",{ex:ar.default.exceptions.getAllInfo(p),activitySource:l}),d=null}let v=l?.pipeline?.convergePipelineIntegrationInstanceId?.toLowerCase(),g=o.filters?o.filters.map(p=>{switch(p.type){case"wildcard":return n.verbose("Matched wildcard source filter",{sourceFilter:p}),!0;case"domain":return!d||!p.key?!1:d===p.key.toLowerCase()?(n.verbose("Matched domain source filter",{sourceFilter:p,activityHostname:d}),!0):!1;case"pipeline":return!v||!p.key?!1:v===p.key.toLowerCase()?(n.verbose("Matched pipeline source filter",{sourceFilter:p,sourceConvergePipelineIntegrationInstanceId:v}),!0):!1}}):[];switch(o.comparer){case"and":{g.every(p=>p===!0)&&s.push(c);break}case"or":{g.some(p=>p===!0)&&s.push(c);break}default:{n.warn("Unknown source filter comparer",{sourceFilters:o});break}}}),s},Ir=(e,t=!1)=>{let n=e.commerce,r=n?.totalPrice||n?.products?.map(a=>(a.unitPrice||0)*(a.quantity||1)).reduce((a,s)=>a+s,0)||void 0,i=n?.currencyCode||null;if((!r||r<=0)&&(r=e?.lead?.predictedLtv||e?.lead?.predictedValue,r&&e?.lead?.currencyCode&&(i=e?.lead?.currencyCode||null)),(!r||r<=0)&&(r=e?.contentItem?.value,r&&e?.contentItem?.currencyCode&&(i=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&&(i=e?.contentItem?.currencyCode||e?.commerce?.currencyCode||null,!i))){let a=e?.contentItem?.items?.filter(s=>s.currencyCode)||[];a.length>0&&(i=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&&(i=e?.commerce?.currencyCode||null,!i))){let a=e?.commerce?.products?.filter(s=>s.currencyCode)||[];a.length>0&&(i=a[0].currencyCode||null)}return(!r||r<=0)&&!i?null:{value:r===0&&t?null:r||null,currencyCode:i}};function vr(e,t,n){if(!e)return;let r=t.processing?.contentIdentificationBehavior,i=null;(n=="googleAnalytics"||n=="googleAds")&&(t.analytics?.libraries?.googleAnalytics?.merchant?.productItemIdBehavior!=null&&(r=t.analytics?.libraries?.googleAnalytics?.merchant?.productItemIdBehavior),i=m(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":m(e.variantIdentifier)&&m(e.productIdentifier)?a=`${e.productIdentifier}_${e.variantIdentifier}`:m(e.variantIdentifier)?a=e.variantIdentifier:a=e.productIdentifier;break;case"variantIdOrProductId":m(e.variantIdentifier)?a=e.variantIdentifier:a=e.productIdentifier;break;default:a=m(e?.sku)||m(e?.variantIdentifier)||m(e?.productIdentifier);break}return i?`${i}${a}`:a}function kr(e,t){return m(e?.variantName)||m(e?.productName)}function Sr(e){if(!e||e.trim().length===0)return!1;let t=e.split(".").filter(n=>n.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 Ar={defaultIssuerUrl:ze,defaultTelemetryUrl:Wt,defaultIngestUrl:Ve}});var M=Et(at());import{createClient as Pr}from"redis";import*as F from"winston";var wr=()=>{let e=process.env.REDIS_CONNECTION_TLS==="true"?"rediss://":"redis://";return process.env.REDIS_CONNECTION_USER&&process.env.REDIS_CONNECTION_PASSWORD?`${e}${process.env.REDIS_CONNECTION_USER}:${process.env.REDIS_CONNECTION_PASSWORD}@${process.env.REDIS_CONNECTION_HOST}:${process.env.REDIS_CONNECTION_PORT}`:`${e}${process.env.REDIS_CONNECTION_HOST}:${process.env.REDIS_CONNECTION_PORT}`},ne="__SEEKA_REDIS_CLIENT__",P=e=>{if(global[ne])return global[ne];let t=Pr({url:wr(),disableClientInfo:!0}).on("error",n=>e.error("Redis Client ",{ex:F.exceptions.getAllInfo(n)}));return global[ne]=t,t},Cr=async e=>{await P(e).connect()},st=async e=>P(e).isOpen,Tr=async e=>{P(e).destroy()},ot=e=>`seeka:app:${process.env.SEEKA_APP_ID}:${e}`,q=(e,t)=>`${ot(e)}:${t}`,_=e=>e==="install",ct=()=>{let e=process.env.DATA_ENCRYPTION_KEY;if(!e)throw new Error("DATA_ENCRYPTION_KEY is required to encrypt/decrypt installation state");return e},lt=e=>{if(!e)return!1;let t=e.split("|");if(t.length!==2)return!1;let[n,r]=t;return!n||!r?!1:/^[0-9a-f]+$/i.test(n)&&/^[0-9a-f]{32}$/i.test(r)},ie=e=>{if(!lt(e))return{plainText:e,wasEncrypted:!1};let t=ct();return{plainText:(0,M.decryptText)(e,t),wasEncrypted:!0}},R=e=>{if(lt(e))return{encryptedText:e,wasEncrypted:!0};let t=ct();return{encryptedText:(0,M.encryptText)(e,t),wasEncrypted:!1}};async function Kr(e,t,n,r="string",i){let a=q(e,t),s=P(i),c=await ft(s,a);if(c){if(r==="string"&&_(e)){let{plainText:o,wasEncrypted:l}=ie(c);if(!l){let{encryptedText:d}=R(c);await s.set(a,d)}return JSON.parse(o)}return JSON.parse(c)}if(r==="json")await s.json.set(a,"$",n);else{let o=JSON.stringify(n);if(_(e)){let{encryptedText:l}=R(o);await s.set(a,l)}else await s.set(a,o)}return n}async function pt(e,t,n="string",r){let i=q(e,t),a=P(r);if(n==="json"){let s=await a.json.get(i);if(s)return s}else{let s=await ft(a,i);if(s){if(_(e)){let{plainText:c,wasEncrypted:o}=ie(s);if(!o){let{encryptedText:l}=R(s);await a.set(i,l)}return JSON.parse(c)}return JSON.parse(s)}}return null}async function dt(e,t){let n=ot(e),r=P(t),i=await r.keys(`${n}:*`),a=await r.mGet(i);if(a){let s=[];for(let c=0;c<a.length;c++){let o=a[c],l=i[c];if(!o)continue;let d=o;if(_(e)){let{plainText:v,wasEncrypted:g}=ie(d);if(!g){let{encryptedText:p}=R(d);await r.set(l,p)}s.push(JSON.parse(v))}else s.push(JSON.parse(d))}return s}return[]}async function ut(e,t,n,r="string",i){let a=q(e,t),s=P(i);if(r==="json")await s.json.set(a,"$",n);else{let c=JSON.stringify(n);if(_(e)){let{encryptedText:o}=R(c);await s.set(a,o)}else await s.set(a,c)}}async function gt(e,t,n){let r=q(e,t);await P(n).del(r)}async function ft(e,t){let n=await e.get(t);return typeof n=="string"?n:n?n.toString():""}var mt=async e=>{e.debug(`Trying to connect to Redis - ${process.env.REDIS_CONNECTION_HOST}`);try{await st(e)?e.verbose(`Redis already connected - ${process.env.REDIS_CONNECTION_HOST}`):(e.profile("service.redis.connect"),await Cr(e),e.profile("service.redis.connect"),e.debug(`Redis connected - ${process.env.REDIS_CONNECTION_HOST}`))}catch(t){throw e.error(`Failed to connect to Redis - ${process.env.REDIS_CONNECTION_HOST}`,{ex:F.exceptions.getAllInfo(t)}),t}},Vr=async e=>{e.debug(`Trying to disconnect from Redis - ${process.env.REDIS_CONNECTION_HOST}`);try{await st(e)===!1?e.verbose(`Redis already disconnected - ${process.env.REDIS_CONNECTION_HOST}`):(e.profile("service.redis.disconnect"),await Tr(e),e.profile("service.redis.disconnect"),e.verbose(`Redis disconnected - ${process.env.REDIS_CONNECTION_HOST}`))}catch(t){throw e.error(`Failed to disconnect from Redis - ${process.env.REDIS_CONNECTION_HOST}`,{ex:F.exceptions.getAllInfo(t)}),t}};var j="install",ae=async(e,t,n)=>{let r=await pt(j,e,"string",n);if(r==null&&t)throw n.error(`Seeka installation ${e} not found`),new Error(`Seeka installation ${e} not found`);return r},Qr=async e=>await dt(j,e),Xr=async(e,t)=>{e.installationState||(e.installationState={}),e.installedAt||(e.installedAt=new Date().toISOString());let n=await ae(e.applicationInstallId,!1,t)===null;return await ut(j,e.applicationInstallId,e,"string",t),t.info(n?"Created installation state":"Updated installation state",{applicationInstallId:e.applicationInstallId,organisationId:e.organisationId,organisationBrandId:e.organisationBrandId}),e},Zr=async(e,t)=>{await gt(j,e,t),t.info("Deleted installation state",{applicationInstallId:e})};var H=e=>"seeka_app_"+e+"_at_app",W=e=>"seeka_app_"+e+"_at_core",se="X-Seeka-App-Token",oe="X-Seeka-CoreApi-Token",G="at_app",J="at_core";import xr from"jsonwebtoken";var ht=async(e,t,n,r)=>{let i=new URL(e),a=t.get("Cookie"),s=i.searchParams.get(G)||"";if(!s&&t.get(se)&&(s=t.get(se)?.split("Bearer ")[1]),!s&&a){let o=a.split(";").find(l=>l.trim().startsWith(H(process.env.SEEKA_APP_ID)));o&&(s=o.split("=")[1])}let c=i.searchParams.get(J)||"";if(!c&&t.get(oe)&&(c=t.get(oe)?.split("Bearer ")[1]),!c&&a){let o=a.split(";").find(l=>l.trim().startsWith(W(process.env.SEEKA_APP_ID)));o&&(c=o.split("=")[1])}return await Nr(s,c,n,r)},Nr=async(e,t,n,r)=>{let i,a,s;if(e)try{let o=xr.verify(e,process.env.SEEKA_APP_SECRET,{ignoreNotBefore:!0});if(r.info("Decoded token",{decoded:o}),!o.appId||o.appId.replace(/-/g,"")!==process.env.SEEKA_APP_ID.replace(/-/g,"")){r.error("Invalid token - app id does not match",{decoded:o,appIdToken:o.appId,appIdEnv:process.env.SEEKA_APP_ID});return}else i=o.appId;if(o.appInstallId)a=o.appInstallId;else{r.error("Invalid token - no appInstallId",{decoded:o});return}s=o.exp}catch(o){r.error("Failed to validate token",{err:o});return}else{r.error("No access token present");return}n&&await n(r);let c=await ae(a,!1,r);if(c==null){r.warn("UI call cannot be processed as the installation ID is not known by this app",{seekaAppInstallId:a});return}return{appAccessToken:e,coreApiAccessToken:t,seekaAppId:i,seekaAppInstallId:a,expiresAt:s,installation:c}};import*as K from"fs/promises";import L from"path";import{OpenTelemetryTransportV3 as br}from"@opentelemetry/winston-transport";import*as I from"winston";var T,yt={},cn=(e,t)=>{if(T)return T;let n=[new I.transports.Console({level:t.LOGGING_LEVEL,format:I.format.combine(I.format.errors({stack:!0}),I.format.cli(),I.format.splat()),handleExceptions:!0,handleRejections:!0})];return t.OTEL_SDK_DISABLED!=="true"&&n.push(new br({handleExceptions:!0,handleRejections:!0})),T=I.createLogger({level:t.LOGGING_LEVEL,transports:n,exitOnError:!1,defaultMeta:yt}),T.info("Seeka app logger initialized"),T},x=(e,t,n=T,r={})=>n.child({...yt,...e,...t?{"@Resource.seeka.app.install.id":t.applicationInstallId,seekaAppInstallOrganisationBrandId:t.organisationBrandId,seekaAppInstallOrganisationId:t.organisationId,...r?.invocationId?{"faas.invocation_id":r.invocationId}:{}}:{}}),ln=(e,t)=>{let n={seekaWebhookType:e.type,seekaWebhookIsTest:e.isTest,RequestId:e.requestId,"faas.invocation_id":t.invocationId,CausationId:e.causationId,CorrelationId:e.causationId},r=e.context;return r&&(n["@Resource.seeka.app.install.id"]=r.applicationInstallId,n.seekaAppInstallOrganisationBrandId=r.organisationBrandId,n.seekaAppInstallOrganisationId=r.organisationId),x(n)},pn=(e,t,n)=>{let r={jobContext:t,jobName:e,"faas.invocation_id":n.invocationId,CausationId:t?.causationId,CorrelationId:t?.causationId,"@Resource.seeka.app.install.id":t?.applicationInstallId??t?.payload.applicationInstallId,seekaAppInstallOrganisationBrandId:t?.organisationBrandId,seekaAppInstallOrganisationId:t?.organisationId};return x(r)};async function It(e,t){return await K.readFile(e,{encoding:t})}var ce="config.js",In=async(e,t,n,r,i,a)=>{let s=x(null,void 0,void 0,r);s.profile("http.seeka.webhook.app.ui");let o=new URL(e).pathname?.replace(/^\/app/,"")||"/";s.verbose("Received Seeka UI request",{requestedPath:o,url:e,method:t});let l=L.resolve("./dist/src/ui/build"),d=null,v=null,g,p={},V=[],f,z=async()=>o==="/health"?null:(f=await ht(e,n,()=>mt(s),s),f?(d=f.seekaAppId,v=f.seekaAppInstallId,g=f.installation,s=x(null,g,s,r),s.verbose("Authenticated Seeka UI request",{requestedPath:o,url:e,method:t}),s=x(null,g,s,r),V.push({name:H(process.env.SEEKA_APP_ID),value:f.appAccessToken,httpOnly:!0,secure:!0,sameSite:"None",expires:new Date(f.expiresAt*1e3)}),V.push({name:W(process.env.SEEKA_APP_ID),value:f.coreApiAccessToken,httpOnly:!0,secure:!0,sameSite:"None",expires:new Date(f.expiresAt*1e3)}),null):{status:403,jsonBody:{error:"Invalid token"}}),k=L.join(l,o),w;try{if(o==="/health")return{status:200,jsonBody:{status:"ok"}};if(o==="/"+ce){let h=await z();if(h)return h;let C=process.env.APP_UI_BASE_PATH?`${process.env.APP_UI_BASE_PATH}`:"",N=`${process.env.SELF_HOST_BASEURL}${C}`,At={seekaAppId:d||"",seekaAppInstallId:v||"",organisationBrandId:g?.organisationBrandId||"",appBaseUrl:N,state:await i(g,s)};w=`window.seekaAppConfig = ${JSON.stringify(At)}`}if(o.startsWith("/api")){let h=await z();if(h)return h;let C=await a(o,t,g,s);return C||{status:404,jsonBody:{error:"Not found"}}}if(o==="/"||o==="/index.html"){let h=await z();if(h)return h;let C=`?${G}=${encodeURIComponent(f?.appAccessToken||"")}&${J}=${encodeURIComponent(f?.coreApiAccessToken||"")}&`;k=L.join(l,"index.html");let N=await It(k,"utf-8");N=N.replace(ce+"?",ce+C),w=N}else w||(k=L.join(l,o),await K.access(k))}catch(h){k=L.join(l,"index.html"),console.log("File not found, serving index.html",{err:h,requestedPath:o,buildPath:l,filePath:k,content:w})}return w||(w=await It(k)),{status:200,headers:{"Content-Type":await Er(k),"Referrer-Policy":"no-referrer",...p},cookies:V,body:w}},vt=new Map;async function Er(e){let t=e.split(".").pop()?.toLowerCase();if(!t)return"application/octet-stream";if(t==="html")return"text/html";if(t==="js")return"application/javascript";if(t==="css")return"text/css";if(t==="png")return"image/png";if(t==="svg")return"image/svg+xml";if(t==="jpg"||t=="jpeg")return"image/jpeg";if(t==="gif")return"image/gif";let n=vt.get(t);if(n)return n;let i=(await import("mime-types")).lookup(e);return i?(vt.set(t,i),i):"application/octet-stream"}import St from"fs/promises";import kt from"path";import Or from"winston";var _r=async e=>St.stat(e).then(()=>!0).catch(()=>!1);async function wn(e,t,n,r){let a=kt.resolve(kt.join(t,"seeka-browser-plugin.min.js"));return await Rr(e,a,n,r)}async function Rr(e,t,n,r){r.profile("http.seeka.browser.plugin");let i,a;try{r.verbose("Handling request for browser plugin content",{path:t}),await _r(t)?(r.verbose("Browser plugin content found",{path:t}),i=await St.readFile(t,"utf8"),a=`${e}(${JSON.stringify(n)})`):r.error("Browser plugin content not found",{path:t})}catch(s){r.error("Failed to handle request for browser plugin content",{ex:Or.exceptions.getAllInfo(s)})}finally{r.profile("http.seeka.browser.plugin"),r.verbose("Request for browser plugin content handled")}if(!i||!a)throw new Error("Failed to handle request for browser plugin content");return{content:i,init:a}}export{T as appLogger,pn as backgroundJobLogger,Nr as checkAuth,x as childLogger,Cr as connect,Xr as createOrUpdateInstallation,Zr as deleteInstallation,Tr as disconnect,In as generateAppUiHttpRequestResponse,ht as getAccessTokenAndCheck,q as getKey,dt as getList,Kr as getOrCreate,P as getOrCreateClient,cn as getOrInitLogger,wn as getSeekaBrowserPlugin,Rr as getSeekaBrowserPluginByName,st as isConnected,Qr as listInstallations,gt as remove,ut as set,mt as startServices,Vr as stopServices,pt as tryGet,ae as tryGetInstallation,ln as webhookLogger};
|
|
@@ -2,7 +2,9 @@ import type { SeekaAppInstallContext, ServerlessFunctionExecutionContext } from
|
|
|
2
2
|
import { BackgroundJobRequestContext } from "../jobs/models";
|
|
3
3
|
import { SeekaWebhookPayload } from "@seeka-labs/sdk-apps-server";
|
|
4
4
|
import * as winston from 'winston';
|
|
5
|
-
|
|
5
|
+
import { type Resource } from '@opentelemetry/resources';
|
|
6
|
+
export declare let appLogger: winston.Logger;
|
|
7
|
+
export declare const getOrInitLogger: (resource: Resource, processEnv: NodeJS.ProcessEnv) => winston.Logger;
|
|
6
8
|
export declare const childLogger: (meta: object | null, installation?: SeekaAppInstallContext<any>, l?: winston.Logger, serverlessContext?: ServerlessFunctionExecutionContext) => winston.Logger;
|
|
7
9
|
export declare const webhookLogger: (payload: SeekaWebhookPayload, serverlessContext: ServerlessFunctionExecutionContext) => winston.Logger;
|
|
8
10
|
export declare const backgroundJobLogger: (jobName: string, jobContext: BackgroundJobRequestContext<any> | undefined, serverlessContext: ServerlessFunctionExecutionContext) => winston.Logger;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/logger/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,sBAAsB,EAAE,kCAAkC,EAAC,MAAM,2BAA2B,CAAC;AAC1G,OAAO,EAAC,2BAA2B,EAAC,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAC,mBAAmB,EAA8C,MAAM,6BAA6B,CAAC;AAC7G,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/logger/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,sBAAsB,EAAE,kCAAkC,EAAC,MAAM,2BAA2B,CAAC;AAC1G,OAAO,EAAC,2BAA2B,EAAC,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAC,mBAAmB,EAA8C,MAAM,6BAA6B,CAAC;AAC7G,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,EAAC,KAAK,QAAQ,EAAC,MAAM,0BAA0B,CAAC;AAGvD,eAAO,IAAI,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC;AAGrC,eAAO,MAAM,eAAe,GAAI,UAAU,QAAQ,EAAE,YAAY,MAAM,CAAC,UAAU,KAAG,OAAO,CAAC,MAsC3F,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,GAAG,IAAI,EAAE,eAAe,sBAAsB,CAAC,GAAG,CAAC,EAAE,IAAG,OAAO,CAAC,MAAkB,EAAE,oBAAmB,kCAAuC,mBAOpL,CAAC;AAEH,eAAO,MAAM,aAAa,GAAI,SAAS,mBAAmB,EAAE,mBAAmB,kCAAkC,mBAmBhH,CAAA;AAED,eAAO,MAAM,mBAAmB,GAAI,SAAS,MAAM,EAAE,YAAY,2BAA2B,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,mBAAmB,kCAAkC,mBAgBnK,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seeka-labs/sdk-apps-server-host",
|
|
3
|
-
"version": "3.9.
|
|
3
|
+
"version": "3.9.11",
|
|
4
4
|
"description": "Seeka - Apps SDK - Node.js - hosting layer",
|
|
5
5
|
"author": "SEEKA <platform@seeka.co>",
|
|
6
6
|
"license": "MIT",
|
|
@@ -32,8 +32,8 @@
|
|
|
32
32
|
"@jest/globals": "^30",
|
|
33
33
|
"@redis/client": "^5",
|
|
34
34
|
"@redis/json": "^5",
|
|
35
|
-
"@seeka-labs/sdk-apps-core": "3.9.
|
|
36
|
-
"@seeka-labs/sdk-apps-server": "3.9.
|
|
35
|
+
"@seeka-labs/sdk-apps-core": "3.9.11",
|
|
36
|
+
"@seeka-labs/sdk-apps-server": "3.9.11",
|
|
37
37
|
"@types/jest": "^30",
|
|
38
38
|
"@types/memory-cache": "^0",
|
|
39
39
|
"@types/mime-types": "^3",
|
|
@@ -65,5 +65,5 @@
|
|
|
65
65
|
"undici": "^7",
|
|
66
66
|
"winston": "^3"
|
|
67
67
|
},
|
|
68
|
-
"gitHead": "
|
|
68
|
+
"gitHead": "c66cf05b536435b950026d77d5dfc2f288f59338"
|
|
69
69
|
}
|