@seeka-labs/sdk-apps-server-host 3.10.1 → 3.10.2

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 Bt=Object.create;var H=Object.defineProperty;var $t=Object.getOwnPropertyDescriptor;var Ft=Object.getOwnPropertyNames;var Mt=Object.getPrototypeOf,jt=Object.prototype.hasOwnProperty;var qt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),Ht=(e,t)=>{for(var n in t)H(e,n,{get:t[n],enumerable:!0})},we=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Ft(t))!jt.call(e,i)&&i!==n&&H(e,i,{get:()=>t[i],enumerable:!(r=$t(t,i))||r.enumerable});return e};var k=(e,t,n)=>(n=e!=null?Bt(Mt(e)):{},we(t||!e||!e.__esModule?H(n,"default",{value:e,enumerable:!0}):n,e)),Wt=e=>we(H({},"__esModule",{value:!0}),e);var kt=qt((an,vt)=>{"use strict";var Jt=Object.create,V=Object.defineProperty,Vt=Object.getOwnPropertyDescriptor,Kt=Object.getOwnPropertyNames,Gt=Object.getPrototypeOf,zt=Object.prototype.hasOwnProperty,Yt=(e,t)=>{for(var n in t)V(e,n,{get:t[n],enumerable:!0})},xe=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Kt(t))!zt.call(e,i)&&i!==n&&V(e,i,{get:()=>t[i],enumerable:!(r=Vt(t,i))||r.enumerable});return e},I=(e,t,n)=>(n=e!=null?Jt(Gt(e)):{},xe(t||!e||!e.__esModule?V(n,"default",{value:e,enumerable:!0}):n,e)),Qt=e=>xe(V({},"__esModule",{value:!0}),e),be={};Yt(be,{ActivityPipelineActivityFilterSourceItemType:()=>Ve,ActivityPipelineActivityFilterType:()=>We,AnalyticsLibrary:()=>Ge,ApiException:()=>rt,ApiServiceProxyBase:()=>se,AppPermissionKeys:()=>x,ClickAttributionSourcePlatform:()=>He,ConditionComparer:()=>Je,ConditionOperator:()=>Ke,ConsentMappingMatchType:()=>et,ContentIdentificationBehavior:()=>ze,ConvergePipelineLoggableActivityType:()=>Me,ConvergeVendorDestinationPublishStrategy:()=>Ye,CrossDomainTrackingUtmBehavior:()=>Qe,ECommerceContentType:()=>De,ECommerceFinancialStatus:()=>Fe,ECommerceFulfillmentStatus:()=>$e,ECommercePlatform:()=>Be,IabPrivacyConsentPurposeId:()=>Ze,IabPrivacyConsentPurposeIdMap:()=>gr,IdentityServiceProxy:()=>_e,IngestServiceProxy:()=>Oe,PrivacyConsentType:()=>Ue,PrivacyDataControlMode:()=>tt,RegionalConsentGrantOption:()=>Xe,ResponseResultType:()=>Re,SdkLogEventLevel:()=>je,SeekaApiHelper:()=>pt,SeekaAppCacheManager:()=>B,SeekaAppConfig:()=>Ne,SeekaAppHelper:()=>vr,SeekaWebhookCallType:()=>qe,TrackingActivityNames:()=>J,TrackingEventSourceOriginType:()=>Le,chunk:()=>ne,cloneDeep:()=>Ar,dateToUtcDateTimeReferenceString:()=>st,decryptText:()=>ft,emailAddress:()=>br,encryptText:()=>gt,generateNewSessionId:()=>W,getActivityName:()=>er,getActivityValue:()=>Or,getContentIdFromProduct:()=>Rr,getContentNameFromProduct:()=>Ur,getIssuer:()=>ae,getNestedProperty:()=>Cr,getNewAppInstallToken:()=>at,getNewOrCachedAppInstallToken:()=>ce,getRandomNumberString:()=>it,isDeepEqual:()=>xr,isNumber:()=>wr,isValidSeekaProfileId:()=>Lr,last:()=>yt,lastOrDefault:()=>Pr,matchActivityPipelineFilters:()=>_r,md5Hash:()=>ot,parseFloat:()=>ht,parseInt:()=>Sr,parseMoney:()=>Ir,parseStr:()=>y,phoneNumberToE164:()=>Er,separatePersonFullName:()=>tr,setNestedProperty:()=>Tr,throwOnInvalidWebhookSignature:()=>hr,urls:()=>Dr,validateWebhookSignature:()=>dt,webhookSignatureHeaderName:()=>ie});vt.exports=Qt(be);var Xt="3.10.1",Ee=I(require("axios")),Ne=class{appId;appSecret;ingestUrl;issuerUrl;organisationId;applicationInstallId;runtime;logger;grantedPermissions;transformApiRequest;transformApiResponse;hasAnyPermissions;hasAllPermissions;hasPermission},se=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)},_e=class extends se{instance;baseUrl;jsonParseReviver=void 0;constructor(e,t,n){super(e),this.instance=n||Ee.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(nt(i)&&i.response)return i.response;throw i}).then(i=>this.transformResult(n,i,s=>this.processMerge(s)))}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),b("A server side error occurred.",t,r,n,i)}else if(t===401){let r=e.data,i=null;return i=JSON.parse(r),b("A server side error occurred.",t,r,n,i)}else if(t===422){let r=e.data,i=null;return i=JSON.parse(r),b("A server side error occurred.",t,r,n,i)}else if(t!==200&&t!==204){let r=e.data;return b("An unexpected server error occurred.",t,r,n)}return Promise.resolve(null)}},Oe=class extends se{instance;baseUrl;jsonParseReviver=void 0;constructor(e,t,n){super(e),this.instance=n||Ee.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(nt(i)&&i.response)return i.response;throw i}).then(i=>this.transformResult(n,i,s=>this.processBatch(s)))}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),b("A server side error occurred.",t,r,n,i)}else if(t===401){let r=e.data,i=null;return i=JSON.parse(r),b("A server side error occurred.",t,r,n,i)}else if(t===422){let r=e.data,i=null;return i=JSON.parse(r),b("A server side error occurred.",t,r,n,i)}else if(t!==200&&t!==204){let r=e.data;return b("An unexpected server error occurred.",t,r,n)}return Promise.resolve(null)}},Re=(e=>(e.Undefined="undefined",e.Success="success",e.Failed="failed",e))(Re||{}),Ue=(e=>(e.Unknown="unknown",e.Informed="informed",e.Implied="implied",e.Explicit="explicit",e.Active="active",e.Passive="passive",e))(Ue||{}),Le=(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))(Le||{}),J=(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))(J||{}),De=(e=>(e.Undefined="undefined",e.SingleProduct="singleProduct",e.SingleVariant="singleVariant",e.Collection="collection",e))(De||{}),Be=(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))(Be||{}),$e=(e=>(e.Undefined="undefined",e.Fulfilled="fulfilled",e.NoneFulfilled="noneFulfilled",e.PartiallyFulfilled="partiallyFulfilled",e.RestockedOrCancelled="restockedOrCancelled",e.Pending="pending",e))($e||{}),Fe=(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))(Fe||{}),Me=(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))(Me||{}),je=(e=>(e.Information="information",e.Warning="warning",e.Error="error",e.Verbose="verbose",e))(je||{}),qe=(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))(qe||{}),He=(e=>(e.Unknown="unknown",e.Google="google",e.Meta="meta",e.Snapchat="snapchat",e.Pinterest="pinterest",e.TikTok="tikTok",e))(He||{}),We=(e=>(e.Undefined="undefined",e.PurchaseMade="purchaseMade",e.ActivityTracked="activityTracked",e))(We||{}),Je=(e=>(e.Undefined="undefined",e.And="and",e.Or="or",e))(Je||{}),Ve=(e=>(e.Undefined="undefined",e.Domain="domain",e.Pipeline="pipeline",e.Wildcard="wildcard",e.Url="url",e.PagePath="pagePath",e))(Ve||{}),Ke=(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))(Ke||{}),Ge=(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))(Ge||{}),ze=(e=>(e.Default="default",e.Sku="sku",e.ProductId="productId",e.VariantId="variantId",e.ProductIdAndVariantIdUnderscore="productIdAndVariantIdUnderscore",e.VariantIdOrProductId="variantIdOrProductId",e))(ze||{}),Ye=(e=>(e.DeliverAllTraitsAndDeliverAllEvents="deliverAllTraitsAndDeliverAllEvents",e.DeliverAllTraitsAndDeliverEventsOnlyIfMaxWeightedTraitsPresent="deliverAllTraitsAndDeliverEventsOnlyIfMaxWeightedTraitsPresent",e.DeliverMaxWeightedTraitsOnlyAndDeliverAllEvents="deliverMaxWeightedTraitsOnlyAndDeliverAllEvents",e.DeliverMaxWeightedTraitsOnlyAndDeliverEventsOnlyIfMaxWeightedTraitsPresent="deliverMaxWeightedTraitsOnlyAndDeliverEventsOnlyIfMaxWeightedTraitsPresent",e))(Ye||{}),Qe=(e=>(e.None="none",e.SessionPassthrough="sessionPassthrough",e.UrlPassthrough="urlPassthrough",e))(Qe||{}),Xe=(e=>(e.Unset="unset",e.Granted="granted",e.Denied="denied",e))(Xe||{}),Ze=(e=>(e.Undefined="undefined",e.MeasureAdvertisingPerformance="measureAdvertisingPerformance",e))(Ze||{}),et=(e=>(e.Undefined="undefined",e.AllOf="allOf",e.AnyOf="anyOf",e))(et||{}),tt=(e=>(e.Disabled="disabled",e.Explicit="explicit",e.Implicit="implicit",e))(tt||{}),rt=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 b(e,t,n,r,i){throw i??new rt(e,t,n,r,null)}function nt(e){return e&&e.isAxiosError===!0}var D=require("openid-client"),oe=I(require("winston")),re=I(require("memory-cache")),Pe="seeka:sdk",B=class{constructor(e,t){this.appId=e,this.appInstallationId=t}appId;appInstallationId;set=async(e,t,n)=>{let r=this.getKey(e);re.default.put(r,JSON.stringify(t),n)};getOrSet=async(e,t,n)=>{let r=this.getKey(e),i=re.default.get(r);if(i){let o=JSON.parse(i);return n&&await n(o),o}let s=await t();return s?(re.default.put(r,JSON.stringify(s.value),s.expiryAbsoluteMilliseconds),s.value):null};getKey=e=>this.appInstallationId?`${Pe}:${this.appId}:${this.appInstallationId}:${e}`:`${Pe}:${this.appId}:${e}`},Zt=I(require("crypto")),W=()=>{let e=st(new Date),t=it();return`${e}.${t}`},er=e=>{let t=Object.keys(J),n=e.toLowerCase(),r=t.find(i=>i.toLowerCase()===n);return r?J[r]:"custom"},it=()=>Math.floor(Math.random()*(9999999999-1e9)+1e9).toString(),st=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 s=e.getUTCSeconds().toString();return s.length<2&&(s="0"+s),`${e.getUTCFullYear()}${t}${n}.${r}${i}${s}`},ot=e=>Zt.createHash("md5").update(e).digest("hex"),tr=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(" ")}},ne=(e,t)=>e.reduce((n,r,i)=>{let s=Math.floor(i/t);return n[s]||(n[s]=[]),n[s].push(r),n},[]),ae=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 B(e.appId,e.applicationInstallId),r=ot(e.issuerUrl+"_"+e.appId),i=await n.getOrSet(r,async()=>{try{let s=await rr(e);return!s||!s.meta||!s.raw?null:(e.logger?e.logger.verbose("Seeka auth: got issuer from remote",{...t}):console.debug("Seeka auth: got issuer from remote",{...t}),{value:s.meta,expiryAbsoluteMilliseconds:1e3*60*60})}catch(s){return e.logger?e.logger.error("Seeka auth: failed getting issuer",{...t,ex:oe.default.exceptions.getAllInfo(s)}):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 D.Configuration(i.serverMetadata,i.clientId,e.appSecret)},rr=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,D.discovery)(new URL(e.issuerUrl),n,void 0,(0,D.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:oe.default.exceptions.getAllInfo(n)}):console.error("Seeka auth: failed discovering issuer from remote",{...t,err:n}),null}},nr=async e=>{let t={applicationId:e.appId,issuer:{url:e.issuerUrl}},n=await ae(e);if(!n)return null;try{let r=await(0,D.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:oe.default.exceptions.getAllInfo(r)}),null}},at=async(e,t)=>{let n={applicationId:t.appId,issuer:{url:t.issuerUrl}},r=await ae(t);if(!r||!r)return null;try{let i=await(0,D.genericGrantRequest)(r,"app_install_token",{applicationInstallId:t.applicationInstallId,access_token:e,scope:"Seeka.API.Ingest"}),s={...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",{...s}):console.info("Seeka auth: got app access token from server",{...s}),{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 s={...n,error:i};return t.logger?t.logger.error("Seeka auth: failed to get app access token from server",{...s}):console.debug("Seeka auth: failed to get app access token from server",{...s}),null}},ce=async e=>{let t=new B(e.appId,e.applicationInstallId),n={applicationId:e.appId,issuer:{url:e.issuerUrl}};return await t.getOrSet("auth:token:appinstall",async()=>{let r=await nr(e);if(!r||!r.access_token)return null;let i=await at(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})})},ct="https://router.seeka.services",ir="https://router.seeka.services/tel/otel",lt="https://account.seeka.app",sr=(e,t,n,r,i)=>{let s=new Ne;return s.appId=e.applicationId,s.appSecret=t,s.ingestUrl=process.env.SEEKA_INGEST_URL||ct,s.issuerUrl=process.env.SEEKA_ISSUER_URL||lt,s.organisationId=e.organisationId,s.applicationInstallId=e.applicationInstallId,s.runtime={type:"sdk/js/apps-server",ver:Xt.split("-")[0],client:n},s.logger=i,s.grantedPermissions=r,s.transformApiRequest=o=>or(s,o),s.transformApiResponse=async(o,c,a)=>ar(s,o,c,a),s.hasAnyPermissions=o=>!s.grantedPermissions||s.grantedPermissions.length===0?!1:!o||o.length===0?!0:o.some(c=>s.grantedPermissions.includes(c)),s.hasAllPermissions=o=>!s.grantedPermissions||s.grantedPermissions.length===0?!1:!o||o.length===0?!0:o.every(c=>s.grantedPermissions.includes(c)),s.hasPermission=o=>!s.grantedPermissions||s.grantedPermissions.length===0?!1:o?s.grantedPermissions.includes(o):!0,s},or=async(e,t)=>{let n=await ce(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},ar=async(e,t,n,r)=>(n.data=JSON.stringify(n.data),r(n)),x={identity:{receiveFull:"Identity.Receive.Pii",send:"Identity.Send"},activity:{receiveAnon:"Activity.Receive.Anon",receiveFull:"Activity.Receive.Pii",send:"Activity.Send"}},cr=I(require("axios")),lr=I(require("http")),pr=I(require("https")),dr=new lr.default.Agent({keepAlive:!0,scheduling:"fifo"}),ur=new pr.default.Agent({keepAlive:!0,scheduling:"fifo"}),Ce=e=>{let t=cr.default.create({httpAgent:dr,httpsAgent:ur});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:s}=n,{headers:o,url:c,method:a}=n?.config,l={code:r,status:i,message:s,headers:o,url:c,method:a,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},Te={getIdentityService:e=>new _e(e,e.ingestUrl,Ce(e)),getIngestService:e=>new Oe(e,e.ingestUrl,Ce(e))},pt=class{constructor(e){this.config=e,this.ingestionService=Te.getIngestService(e),this.identityService=Te.getIdentityService(e)}config;maxBatchSize=50;refreshOrPrimeTokenCache=async()=>{await ce(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(x.identity.send,"mergeIdentity");let n=W();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(x.identity.send,"mergeIdentityBatch");let n=W();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=ne(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(s=>({id:{id:s||{},src:{...r}}}))}),i.length>1){let s=i.map((o,c)=>c===0?Promise.resolve():(this.config.logger?.verbose(`Processing identity batch ${c+1} of ${i.length}`),this.trackActivityBatchRaw({data:o.map(a=>({id:{id:a||{},src:{...r}}}))})));await Promise.all(s)}};trackActivityBatch=async(e,t)=>{this.checkPermission(x.activity.send,"trackActivityBatch");let n=W();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=ne(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(s=>({ev:{id:s.profile||{},src:{...r},payload:s.activity}}))}),i.length>1){let s=i.map((o,c)=>c===0?Promise.resolve():(this.config.logger?.verbose(`Processing activity batch ${c+1} of ${i.length}`),this.trackActivityBatchRaw({data:o.map(a=>({ev:{id:a.profile||{},src:{...r},payload:a.activity}}))})));await Promise.all(s)}};trackActivityBatchRaw=async e=>{await this.ingestionService.batch(e)};trackActivityForProfileId=async(e,t,n)=>{this.checkPermission(x.activity.send,"trackActivityForProfileId"),await this.trackActivityForProfileIdBatch([e],t,n)};trackActivityForProfileIdBatch=async(e,t,n)=>{this.checkPermission(x.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(x.activity.send,"trackActivityForProfile"),await this.trackActivityForProfileBatch([e],t,n)};trackActivityForProfileBatch=async(e,t,n)=>{this.checkPermission(x.activity.send,"trackActivityForProfileBatch"),await this.trackActivityBatch(e.map(r=>({activity:r,profile:t})),n)}},gr={measureAdvertisingPerformance:7},fr=I(require("crypto")),ie="x-seeka-signature-sha256",dt=(e,t,n)=>{if(!t)return!1;let r=null;if(t.get&&typeof t.get=="function")r=t.get(ie);else{let s=t[ie];s&&(Array.isArray(s)&&s.length>0?r=s[0]:(typeof s=="string"||s instanceof String)&&(r=s))}if(!r)return!1;let i=mr(e,n)===r;return i||console.warn("Invalid webhook signature"),i},mr=(e,t)=>fr.createHmac("sha256",e).update(t).digest("hex"),hr=(e,t,n)=>{if(!dt(e,t,n))throw new Error("Invalid webhook signature")},L=I(require("crypto")),ut="aes-192-cbc",gt=(e,t)=>{if(!e)return"";if(!t)throw new Error("Secret is required to encrypt data");let n=L.default.scryptSync(t,"salt",24),r=L.default.randomBytes(16),i=L.default.createCipheriv(ut,n,r);return[i.update(e,"utf8","hex")+i.final("hex"),Buffer.from(r).toString("hex")].join("|")},ft=(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=L.default.scryptSync(t,"salt",24),s=L.default.createDecipheriv(ut,i,Buffer.from(r,"hex"));return s.update(n,"hex","utf8")+s.final("utf8")},yr=class{constructor(e){this.appSecret=e}appSecret;encryptWithAppSecret=e=>{if(!this.appSecret)throw new Error("App secret is required to encrypt data");return gt(e,this.appSecret)};decryptWithAppSecret=e=>{if(!this.appSecret)throw new Error("App secret is required to decrypt data");return ft(e,this.appSecret)}},vr=class mt{constructor(t,n){this.context=t,this.api=new pt(t.config),this.appCache=new B(t.config.appId),this.appInstallCache=new B(t.config.appId,t.config.applicationInstallId),this.crypto=new yr(t.config.appSecret),this.logger=n}context;appCache;appInstallCache;api;logger;crypto;static create=(t,n,r,i,s)=>new mt({config:sr({...n},t,{type:r.name,ver:r.version.split("-")[0]},i,s)},s)},kr=I(require("winston")),K=require("lodash-es"),y=e=>e==null||e===""||String(e).trim()===""?"":String(e);function ht(e){if(e==null||e==="")return 0;let t=e.toString().replace(/[^0-9.]/g,"");return Number.isNaN(Number(t))?0:Number(t)}function Ir(e){if(e==null||e===0||e==="")return+"0.00";let t=ht(e);return Number(t.toFixed(3))}function Sr(e){return e==null||e===""||Number.isNaN(Number(e.toString()))?0:Math.floor(Number(e))}function Ar(e){return JSON.parse(JSON.stringify(e))}function wr(e){return/^-?\d+$/.test(e)}function Pr(e){if(!(e==null||e.length===0))return yt(e)}function yt(e){return(0,K.last)(e)}function Cr(e,t){return(0,K.get)(e,t)}function Tr(e,t,n){return(0,K.set)(e,t,n)}function xr(e,t){return(0,K.isEqual)(e,t)}function br(e){return e?e.trim().toLowerCase():""}function Er(e){return e==null?"":(e=e.trim().replace(/-/gi,"").replace(/\(/gi,"").replace(/\)/gi,"").replace(/ /g,"").replace(/\+/g,""),e)}var Nr=["order","subscriptionItemPurchase","oneTimeItemPurchase"],_r=(e,t,n)=>{if(!e.activity)return[];let r=e.activity,i=r.activityName==="custom"?r.activityNameCustom:r.activityName;if(!i)return[];let s=i.toLowerCase(),o=[];return t.forEach(c=>{if(!c)return;switch(c.type){case"activityTracked":{if(!c.activityNames||!c.activityNames.find(p=>p.toLowerCase()===s))return;n.verbose("Matched activity tracked filter",{filter:c,activityName:i});break}case"purchaseMade":{if(!r.activityName||!Nr.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 a=c.sourceFilter;if(!a)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:kr.default.exceptions.getAllInfo(p),activitySource:l}),d=null}let v=l?.pipeline?.convergePipelineIntegrationInstanceId?.toLowerCase(),u=a.filters?a.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(a.comparer){case"and":{u.every(p=>p===!0)&&o.push(c);break}case"or":{u.some(p=>p===!0)&&o.push(c);break}default:{n.warn("Unknown source filter comparer",{sourceFilters:a});break}}}),o},Or=(e,t=!1)=>{let n=e.commerce,r=n?.totalPrice||n?.products?.map(s=>(s.unitPrice||0)*(s.quantity||1)).reduce((s,o)=>s+o,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(s=>s&&s.unitPrice?s.unitPrice*(s.quantity||1):0).reduce((s,o)=>s+o,0)),r&&(i=e?.contentItem?.currencyCode||e?.commerce?.currencyCode||null,!i))){let s=e?.contentItem?.items?.filter(o=>o.currencyCode)||[];s.length>0&&(i=s[0].currencyCode||null)}if((!r||r<=0)&&e?.commerce?.products&&e?.commerce?.products.length>0&&(r=e?.commerce?.products.map(s=>s&&s.unitPrice?s.unitPrice*(s.quantity||1):0).reduce((s,o)=>s+o,0),r&&(i=e?.commerce?.currencyCode||null,!i))){let s=e?.commerce?.products?.filter(o=>o.currencyCode)||[];s.length>0&&(i=s[0].currencyCode||null)}return(!r||r<=0)&&!i?null:{value:r===0&&t?null:r||null,currencyCode:i}};function Rr(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=y(t.analytics?.libraries?.googleAnalytics?.merchant?.productItemIdPrefix));let s;switch(r){case"sku":s=e?.sku;break;case"productId":s=e?.productIdentifier;break;case"variantId":s=e?.variantIdentifier;break;case"productIdAndVariantIdUnderscore":y(e.variantIdentifier)&&y(e.productIdentifier)?s=`${e.productIdentifier}_${e.variantIdentifier}`:y(e.variantIdentifier)?s=e.variantIdentifier:s=e.productIdentifier;break;case"variantIdOrProductId":y(e.variantIdentifier)?s=e.variantIdentifier:s=e.productIdentifier;break;default:s=y(e?.sku)||y(e?.variantIdentifier)||y(e?.productIdentifier);break}return i?`${i}${s}`:s}function Ur(e,t){return y(e?.variantName)||y(e?.productName)}function Lr(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 Dr={defaultIssuerUrl:lt,defaultTelemetryUrl:ir,defaultIngestUrl:ct}});var nn={};Ht(nn,{appLogger:()=>N,backgroundJobLogger:()=>Jr,checkAuth:()=>bt,childLogger:()=>_,connect:()=>St,createOrUpdateInstallation:()=>jr,deleteInstallation:()=>qr,disconnect:()=>At,generateAppUiHttpRequestResponse:()=>Zr,getAccessTokenAndCheck:()=>ke,getKey:()=>M,getList:()=>ge,getOrCreate:()=>$r,getOrCreateClient:()=>S,getOrInitLogger:()=>Hr,getSeekaBrowserPlugin:()=>rn,getSeekaBrowserPluginByName:()=>Dt,isConnected:()=>pe,listInstallations:()=>Mr,remove:()=>me,set:()=>fe,startServices:()=>he,stopServices:()=>Fr,tryGet:()=>ue,tryGetInstallation:()=>Q,webhookLogger:()=>Wr});module.exports=Wt(nn);var It=require("redis"),G=k(require("winston")),z=k(kt()),Br=()=>{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}`},le="__SEEKA_REDIS_CLIENT__",S=e=>{if(global[le])return global[le];let t=(0,It.createClient)({url:Br(),disableClientInfo:!0}).on("error",n=>e.error("Redis Client ",{ex:G.exceptions.getAllInfo(n)}));return global[le]=t,t},St=async e=>{await S(e).connect()},pe=async e=>S(e).isOpen,At=async e=>{S(e).destroy()},wt=e=>`seeka:app:${process.env.SEEKA_APP_ID}:${e}`,M=(e,t)=>`${wt(e)}:${t}`,$=e=>e==="install",Pt=()=>{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)},de=e=>{if(!Ct(e))return{plainText:e,wasEncrypted:!1};let t=Pt();return{plainText:(0,z.decryptText)(e,t),wasEncrypted:!0}},F=e=>{if(Ct(e))return{encryptedText:e,wasEncrypted:!0};let t=Pt();return{encryptedText:(0,z.encryptText)(e,t),wasEncrypted:!1}};async function $r(e,t,n,r="string",i){let s=M(e,t),o=S(i),c=await Tt(o,s);if(c){if(r==="string"&&$(e)){let{plainText:a,wasEncrypted:l}=de(c);if(!l){let{encryptedText:d}=F(c);await o.set(s,d)}return JSON.parse(a)}return JSON.parse(c)}if(r==="json")await o.json.set(s,"$",n);else{let a=JSON.stringify(n);if($(e)){let{encryptedText:l}=F(a);await o.set(s,l)}else await o.set(s,a)}return n}async function ue(e,t,n="string",r){let i=M(e,t),s=S(r);if(n==="json"){let o=await s.json.get(i);if(o)return o}else{let o=await Tt(s,i);if(o){if($(e)){let{plainText:c,wasEncrypted:a}=de(o);if(!a){let{encryptedText:l}=F(o);await s.set(i,l)}return JSON.parse(c)}return JSON.parse(o)}}return null}async function ge(e,t){let n=wt(e),r=S(t),i=await r.keys(`${n}:*`),s=await r.mGet(i);if(s){let o=[];for(let c=0;c<s.length;c++){let a=s[c],l=i[c];if(!a)continue;let d=a;if($(e)){let{plainText:v,wasEncrypted:u}=de(d);if(!u){let{encryptedText:p}=F(d);await r.set(l,p)}o.push(JSON.parse(v))}else o.push(JSON.parse(d))}return o}return[]}async function fe(e,t,n,r="string",i){let s=M(e,t),o=S(i);if(r==="json")await o.json.set(s,"$",n);else{let c=JSON.stringify(n);if($(e)){let{encryptedText:a}=F(c);await o.set(s,a)}else await o.set(s,c)}}async function me(e,t,n){let r=M(e,t);await S(n).del(r)}async function Tt(e,t){let n=await e.get(t);return typeof n=="string"?n:n?n.toString():""}var he=async e=>{e.debug(`Trying to connect to Redis - ${process.env.REDIS_CONNECTION_HOST}`);try{await pe(e)?e.verbose(`Redis already connected - ${process.env.REDIS_CONNECTION_HOST}`):(e.profile("service.redis.connect"),await St(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:G.exceptions.getAllInfo(t)}),t}},Fr=async e=>{e.debug(`Trying to disconnect from Redis - ${process.env.REDIS_CONNECTION_HOST}`);try{await pe(e)===!1?e.verbose(`Redis already disconnected - ${process.env.REDIS_CONNECTION_HOST}`):(e.profile("service.redis.disconnect"),await At(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:G.exceptions.getAllInfo(t)}),t}};var Y="install",Q=async(e,t,n)=>{let r=await ue(Y,e,"string",n);if(r==null&&t)throw n.error(`Seeka installation ${e} not found`),new Error(`Seeka installation ${e} not found`);return r},Mr=async e=>await ge(Y,e),jr=async(e,t)=>{e.installationState||(e.installationState={}),e.installedAt||(e.installedAt=new Date().toISOString());let n=await Q(e.applicationInstallId,!1,t)===null;return await fe(Y,e.applicationInstallId,e,"string",t),t.info(n?"Created installation state":"Updated installation state",{applicationInstallId:e.applicationInstallId,organisationId:e.organisationId,organisationBrandId:e.organisationBrandId}),e},qr=async(e,t)=>{await me(Y,e,t),t.info("Deleted installation state",{applicationInstallId:e})};var X=e=>"seeka_app_"+e+"_at_app",Z=e=>"seeka_app_"+e+"_at_core",ye="X-Seeka-App-Token",ve="X-Seeka-CoreApi-Token",R="at_app",U="at_core";var xt=k(require("jsonwebtoken"));var ke=async(e,t,n,r)=>{let i=new URL(e),s=t.get("Cookie"),o=i.searchParams.get(R)||"";if(!o&&t.get(ye)&&(o=t.get(ye)?.split("Bearer ")[1]),!o&&s){let a=s.split(";").find(l=>l.trim().startsWith(X(process.env.SEEKA_APP_ID)));a&&(o=a.split("=")[1])}let c=i.searchParams.get(U)||"";if(!c&&t.get(ve)&&(c=t.get(ve)?.split("Bearer ")[1]),!c&&s){let a=s.split(";").find(l=>l.trim().startsWith(Z(process.env.SEEKA_APP_ID)));a&&(c=a.split("=")[1])}return await bt(o,c,n,r)},bt=async(e,t,n,r)=>{let i,s,o;if(e)try{let a=xt.default.verify(e,process.env.SEEKA_APP_SECRET,{ignoreNotBefore:!0});if(r.info("Decoded token",{decoded:a}),!a.appId||a.appId.replace(/-/g,"")!==process.env.SEEKA_APP_ID.replace(/-/g,"")){r.error("Invalid token - app id does not match",{decoded:a,appIdToken:a.appId,appIdEnv:process.env.SEEKA_APP_ID});return}else i=a.appId;if(a.appInstallId)s=a.appInstallId;else{r.error("Invalid token - no appInstallId",{decoded:a});return}o=a.exp}catch(a){r.error("Failed to validate token",{err:a});return}else{r.error("No access token present");return}n&&await n(r);let c=await Q(s,!1,r);if(c==null){r.warn("UI call cannot be processed as the installation ID is not known by this app",{seekaAppInstallId:s});return}return{appAccessToken:e,coreApiAccessToken:t,seekaAppId:i,seekaAppInstallId:s,expiresAt:o,installation:c}};var P=k(require("fs/promises")),w=k(require("path"));var A=k(require("winston")),N,Et={},Hr=(e,t)=>{if(N)return N;let n=[new A.transports.Console({level:t.LOGGING_LEVEL,format:A.format.combine(A.format.errors({stack:!0}),A.format.cli(),A.format.splat()),handleExceptions:!0,handleRejections:!0})];return N=A.createLogger({level:t.LOGGING_LEVEL,transports:n,exitOnError:!1,defaultMeta:Et}),N.info("Seeka app logger initialized"),N},_=(e,t,n=N,r={})=>n.child({...Et,...e,...t?{"seeka.app.install.id":t.applicationInstallId,"seeka.app.install.brand.id":t.organisationBrandId,"seeka.app.install.org.id":t.organisationId,...r?.invocationId?{"faas.invocation_id":r.invocationId}:{}}:{}}),Wr=(e,t)=>{let n={"seeka.app.webhook.type":e.type,"seeka.app.webhook.test":e.isTest,"seeka.app.webhook.id":e.requestId,"seeka.app.webhook.correlationId":e.causationId,"seeka.app.webhook.causationId":e.causationId,"faas.invocation_id":t.invocationId},r=e.context;return r&&(n["seeka.app.install.id"]=r.applicationInstallId,n["seeka.app.install.brand.id"]=r.organisationBrandId,n["seeka.app.install.org.id"]=r.organisationId),_(n)},Jr=(e,t,n)=>{let r={jobContext:t,jobName:e,"faas.invocation_id":n.invocationId,"seeka.app.job.correlationId":t?.causationId,"seeka.app.job.causationId":t?.causationId,"seeka.app.install.id":t?.applicationInstallId??t?.payload.applicationInstallId,"seeka.app.install.brand.id":t?.organisationBrandId,"seeka.app.install.org.id":t?.organisationId};return _(r)};var Vr="seeka-cli-developer",Kr="https://api.seeka.services",Nt="http://localhost:3000",q=()=>process.env.SEEKA_DEVELOPER_MODE==="true";async function Ut(e){try{let t=await P.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async function Gr(e,t){await P.mkdir(w.default.dirname(e),{recursive:!0}),await P.writeFile(e,JSON.stringify(t,null,2),{mode:384})}async function zr(e){let n=`${e.issuerUrl.replace(/\/+$/,"")}/connect/token`,r=new URLSearchParams({grant_type:"refresh_token",refresh_token:e.refreshToken,client_id:Vr}),i=await fetch(n,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:r.toString()});if(!i.ok){let s=await i.text();throw new Error(`Token refresh failed (${i.status}): ${s}`)}return i.json()}async function Yr(e){let t=w.default.join(e,".seeka","developer","credentials.json"),n=await Ut(t);if(!n)throw new Error("Developer credentials not found. Run `seeka auth login` first.");if(new Date(n.expiresAt)<new Date){let r=await zr(n),i={...n,accessToken:r.access_token,refreshToken:r.refresh_token||n.refreshToken,expiresAt:new Date(Date.now()+r.expires_in*1e3).toISOString()};return await Gr(t,i),i.accessToken}return n.accessToken}async function Qr(e){let t=process.cwd(),n=w.default.join(t,".seeka","developer","context","active.json"),r=await Ut(n);if(!r)return{status:500,jsonBody:{error:"No active developer context found. Run `seeka app context set` first."}};e.info("Developer mode: /dev/open",{brandId:r.brandId,installId:r.installId});let i;try{i=await Yr(t)}catch(f){return e.error("Developer mode: failed to get access token",{err:f}),{status:500,jsonBody:{error:"Failed to get developer access token. Check server logs for details."}}}let o=`${process.env.SEEKA_DEVELOPER_API_URL||Kr}/api/converge/pipeline/integration/connection/${r.installId}/url/landing`,c;try{c=await fetch(o,{method:"GET",headers:{Authorization:`Bearer ${i}`}})}catch(f){return e.error("Developer mode: failed to call landing URL API",{err:f}),{status:502,jsonBody:{error:"Failed to call Seeka API. Check server logs for details."}}}if(!c.ok){let f=await c.text();return e.error("Developer mode: landing URL API returned error",{status:c.status,text:f}),{status:502,jsonBody:{error:`Seeka API returned status ${c.status}. Check server logs for details.`}}}let a=await c.json(),l=a.result!==void 0?a.result:a;if(!l||typeof l!="string")return e.error("Developer mode: unexpected landing URL response",{responseJson:a}),{status:502,jsonBody:{error:"Unexpected response from Seeka API: no landing URL returned"}};let d=new URL(l),v=d.searchParams.get(R)||"",u=d.searchParams.get(U)||"",p=`/app/?${R}=${encodeURIComponent(v)}&${U}=${encodeURIComponent(u)}`;return e.info("Developer mode: redirecting to app with tokens",{localRedirect:p.substring(0,50)+"..."}),{status:302,headers:{Location:p}}}async function Ie(e,t){let n=`${Nt}${e}`;try{let r=await fetch(n);if(!r.ok){if(r.status===404){let o=await fetch(`${Nt}/index.html`);if(o.ok){let c=await o.text();return{status:200,headers:{"Content-Type":"text/html"},body:c,textBody:c}}}return null}let i=r.headers.get("Content-Type")||"application/octet-stream";if(i.includes("text/")||i.includes("javascript")||i.includes("json")){let o=await r.text();return{status:200,headers:{"Content-Type":i},body:o,textBody:o}}let s=await r.arrayBuffer();return{status:200,headers:{"Content-Type":i},body:Buffer.from(s)}}catch(r){return t.warn("Developer mode: Vite dev server proxy failed, falling back to static files",{err:r,viteUrl:n}),null}}var _t=!1;function Xr(e){_t||(_t=!0,q()&&e.info("Seeka Developer Mode is ACTIVE - /dev/open route enabled, Vite HMR proxy enabled (port 3000)"))}async function Ot(e,t){return await P.readFile(e,{encoding:t})}var j="config.js",Zr=async(e,t,n,r,i,s)=>{let o=_(null,void 0,void 0,r);o.profile("http.seeka.webhook.app.ui"),Xr(o);let a=new URL(e).pathname?.replace(/^\/app/,"")||"/";if(o.verbose("Received Seeka UI request",{requestedPath:a,url:e,method:t}),q()&&a==="/dev/open")return Qr(o);let l=w.default.resolve("./dist/src/ui/build"),d=null,v=null,u,p={},f=[],m,ee=async()=>a==="/health"?null:(m=await ke(e,n,()=>he(o),o),m?(d=m.seekaAppId,v=m.seekaAppInstallId,u=m.installation,o=_(null,u,o,r),o.verbose("Authenticated Seeka UI request",{requestedPath:a,url:e,method:t}),o=_(null,u,o,r),f.push({name:X(process.env.SEEKA_APP_ID),value:m.appAccessToken,httpOnly:!0,secure:!0,sameSite:"None",expires:new Date(m.expiresAt*1e3)}),f.push({name:Z(process.env.SEEKA_APP_ID),value:m.coreApiAccessToken,httpOnly:!0,secure:!0,sameSite:"None",expires:new Date(m.expiresAt*1e3)}),null):{status:403,jsonBody:{error:"Invalid token"}}),C=w.default.join(l,a),E;try{if(a==="/health")return{status:200,jsonBody:{status:"ok"}};if(a==="/"+j){let g=await ee();if(g)return g;let h=process.env.APP_UI_BASE_PATH?`${process.env.APP_UI_BASE_PATH}`:"",T=`${process.env.SELF_HOST_BASEURL}${h}`,O={seekaAppId:d||"",seekaAppInstallId:v||"",organisationBrandId:u?.organisationBrandId||"",appBaseUrl:T,state:await i(u,o)};E=`window.seekaAppConfig = ${JSON.stringify(O)}`}if(a.startsWith("/api")){let g=await ee();if(g)return g;let h=await s(a,t,u,o);return h||{status:404,jsonBody:{error:"Not found"}}}if(a==="/"||a==="/index.html"){let g=await ee();if(g)return g;let h=`?${R}=${encodeURIComponent(m?.appAccessToken||"")}&${U}=${encodeURIComponent(m?.coreApiAccessToken||"")}&`;if(q()){let O=await Ie("/index.html",o);if(O?.textBody){let te=O.textBody;return te=te.replace(j+"?",j+h),{status:200,headers:{"Content-Type":"text/html","Referrer-Policy":"no-referrer",...p},cookies:f,body:te}}}C=w.default.join(l,"index.html");let T=await Ot(C,"utf-8");T=T.replace(j+"?",j+h),E=T}else if(!E){if(q()){let g=await Ie(a,o);if(g){let{textBody:h,...T}=g;return{...T,cookies:f}}}C=w.default.join(l,a),await P.access(C)}}catch(g){if(q()){let h=await Ie("/index.html",o);if(h){let{textBody:T,...O}=h;return{...O,cookies:f}}}C=w.default.join(l,"index.html"),console.log("File not found, serving index.html",{err:g,requestedPath:a,buildPath:l,filePath:C,content:E})}return E||(E=await Ot(C)),{status:200,headers:{"Content-Type":await en(C),"Referrer-Policy":"no-referrer",...p},cookies:f,body:E}},Rt=new Map;async function en(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=Rt.get(t);if(n)return n;let i=(await import("mime-types")).lookup(e);return i?(Rt.set(t,i),i):"application/octet-stream"}var Ae=k(require("fs/promises")),Se=k(require("path")),Lt=k(require("winston")),tn=async e=>Ae.default.stat(e).then(()=>!0).catch(()=>!1);async function rn(e,t,n,r){let s=Se.default.resolve(Se.default.join(t,"seeka-browser-plugin.min.js"));return await Dt(e,s,n,r)}async function Dt(e,t,n,r){r.profile("http.seeka.browser.plugin");let i,s;try{r.verbose("Handling request for browser plugin content",{path:t}),await tn(t)?(r.verbose("Browser plugin content found",{path:t}),i=await Ae.default.readFile(t,"utf8"),s=`${e}(${JSON.stringify(n)})`):r.error("Browser plugin content not found",{path:t})}catch(o){r.error("Failed to handle request for browser plugin content",{ex:Lt.default.exceptions.getAllInfo(o)})}finally{r.profile("http.seeka.browser.plugin"),r.verbose("Request for browser plugin content handled")}if(!i||!s)throw new Error("Failed to handle request for browser plugin content");return{content:i,init:s}}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
+ "use strict";var Bt=Object.create;var H=Object.defineProperty;var $t=Object.getOwnPropertyDescriptor;var Ft=Object.getOwnPropertyNames;var Mt=Object.getPrototypeOf,jt=Object.prototype.hasOwnProperty;var qt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),Ht=(e,t)=>{for(var n in t)H(e,n,{get:t[n],enumerable:!0})},we=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Ft(t))!jt.call(e,i)&&i!==n&&H(e,i,{get:()=>t[i],enumerable:!(r=$t(t,i))||r.enumerable});return e};var k=(e,t,n)=>(n=e!=null?Bt(Mt(e)):{},we(t||!e||!e.__esModule?H(n,"default",{value:e,enumerable:!0}):n,e)),Wt=e=>we(H({},"__esModule",{value:!0}),e);var kt=qt((an,vt)=>{"use strict";var Jt=Object.create,V=Object.defineProperty,Vt=Object.getOwnPropertyDescriptor,Kt=Object.getOwnPropertyNames,Gt=Object.getPrototypeOf,zt=Object.prototype.hasOwnProperty,Yt=(e,t)=>{for(var n in t)V(e,n,{get:t[n],enumerable:!0})},xe=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Kt(t))!zt.call(e,i)&&i!==n&&V(e,i,{get:()=>t[i],enumerable:!(r=Vt(t,i))||r.enumerable});return e},I=(e,t,n)=>(n=e!=null?Jt(Gt(e)):{},xe(t||!e||!e.__esModule?V(n,"default",{value:e,enumerable:!0}):n,e)),Qt=e=>xe(V({},"__esModule",{value:!0}),e),be={};Yt(be,{ActivityPipelineActivityFilterSourceItemType:()=>Ve,ActivityPipelineActivityFilterType:()=>We,AnalyticsLibrary:()=>Ge,ApiException:()=>rt,ApiServiceProxyBase:()=>se,AppPermissionKeys:()=>x,ClickAttributionSourcePlatform:()=>He,ConditionComparer:()=>Je,ConditionOperator:()=>Ke,ConsentMappingMatchType:()=>et,ContentIdentificationBehavior:()=>ze,ConvergePipelineLoggableActivityType:()=>Me,ConvergeVendorDestinationPublishStrategy:()=>Ye,CrossDomainTrackingUtmBehavior:()=>Qe,ECommerceContentType:()=>De,ECommerceFinancialStatus:()=>Fe,ECommerceFulfillmentStatus:()=>$e,ECommercePlatform:()=>Be,IabPrivacyConsentPurposeId:()=>Ze,IabPrivacyConsentPurposeIdMap:()=>gr,IdentityServiceProxy:()=>_e,IngestServiceProxy:()=>Oe,PrivacyConsentType:()=>Ue,PrivacyDataControlMode:()=>tt,RegionalConsentGrantOption:()=>Xe,ResponseResultType:()=>Re,SdkLogEventLevel:()=>je,SeekaApiHelper:()=>pt,SeekaAppCacheManager:()=>B,SeekaAppConfig:()=>Ne,SeekaAppHelper:()=>vr,SeekaWebhookCallType:()=>qe,TrackingActivityNames:()=>J,TrackingEventSourceOriginType:()=>Le,chunk:()=>ne,cloneDeep:()=>Ar,dateToUtcDateTimeReferenceString:()=>st,decryptText:()=>ft,emailAddress:()=>br,encryptText:()=>gt,generateNewSessionId:()=>W,getActivityName:()=>er,getActivityValue:()=>Or,getContentIdFromProduct:()=>Rr,getContentNameFromProduct:()=>Ur,getIssuer:()=>ae,getNestedProperty:()=>Cr,getNewAppInstallToken:()=>at,getNewOrCachedAppInstallToken:()=>ce,getRandomNumberString:()=>it,isDeepEqual:()=>xr,isNumber:()=>wr,isValidSeekaProfileId:()=>Lr,last:()=>yt,lastOrDefault:()=>Pr,matchActivityPipelineFilters:()=>_r,md5Hash:()=>ot,parseFloat:()=>ht,parseInt:()=>Sr,parseMoney:()=>Ir,parseStr:()=>y,phoneNumberToE164:()=>Er,separatePersonFullName:()=>tr,setNestedProperty:()=>Tr,throwOnInvalidWebhookSignature:()=>hr,urls:()=>Dr,validateWebhookSignature:()=>dt,webhookSignatureHeaderName:()=>ie});vt.exports=Qt(be);var Xt="3.10.2",Ee=I(require("axios")),Ne=class{appId;appSecret;ingestUrl;issuerUrl;organisationId;applicationInstallId;runtime;logger;grantedPermissions;transformApiRequest;transformApiResponse;hasAnyPermissions;hasAllPermissions;hasPermission},se=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)},_e=class extends se{instance;baseUrl;jsonParseReviver=void 0;constructor(e,t,n){super(e),this.instance=n||Ee.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(nt(i)&&i.response)return i.response;throw i}).then(i=>this.transformResult(n,i,s=>this.processMerge(s)))}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),b("A server side error occurred.",t,r,n,i)}else if(t===401){let r=e.data,i=null;return i=JSON.parse(r),b("A server side error occurred.",t,r,n,i)}else if(t===422){let r=e.data,i=null;return i=JSON.parse(r),b("A server side error occurred.",t,r,n,i)}else if(t!==200&&t!==204){let r=e.data;return b("An unexpected server error occurred.",t,r,n)}return Promise.resolve(null)}},Oe=class extends se{instance;baseUrl;jsonParseReviver=void 0;constructor(e,t,n){super(e),this.instance=n||Ee.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(nt(i)&&i.response)return i.response;throw i}).then(i=>this.transformResult(n,i,s=>this.processBatch(s)))}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),b("A server side error occurred.",t,r,n,i)}else if(t===401){let r=e.data,i=null;return i=JSON.parse(r),b("A server side error occurred.",t,r,n,i)}else if(t===422){let r=e.data,i=null;return i=JSON.parse(r),b("A server side error occurred.",t,r,n,i)}else if(t!==200&&t!==204){let r=e.data;return b("An unexpected server error occurred.",t,r,n)}return Promise.resolve(null)}},Re=(e=>(e.Undefined="undefined",e.Success="success",e.Failed="failed",e))(Re||{}),Ue=(e=>(e.Unknown="unknown",e.Informed="informed",e.Implied="implied",e.Explicit="explicit",e.Active="active",e.Passive="passive",e))(Ue||{}),Le=(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))(Le||{}),J=(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))(J||{}),De=(e=>(e.Undefined="undefined",e.SingleProduct="singleProduct",e.SingleVariant="singleVariant",e.Collection="collection",e))(De||{}),Be=(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))(Be||{}),$e=(e=>(e.Undefined="undefined",e.Fulfilled="fulfilled",e.NoneFulfilled="noneFulfilled",e.PartiallyFulfilled="partiallyFulfilled",e.RestockedOrCancelled="restockedOrCancelled",e.Pending="pending",e))($e||{}),Fe=(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))(Fe||{}),Me=(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))(Me||{}),je=(e=>(e.Information="information",e.Warning="warning",e.Error="error",e.Verbose="verbose",e))(je||{}),qe=(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))(qe||{}),He=(e=>(e.Unknown="unknown",e.Google="google",e.Meta="meta",e.Snapchat="snapchat",e.Pinterest="pinterest",e.TikTok="tikTok",e))(He||{}),We=(e=>(e.Undefined="undefined",e.PurchaseMade="purchaseMade",e.ActivityTracked="activityTracked",e))(We||{}),Je=(e=>(e.Undefined="undefined",e.And="and",e.Or="or",e))(Je||{}),Ve=(e=>(e.Undefined="undefined",e.Domain="domain",e.Pipeline="pipeline",e.Wildcard="wildcard",e.Url="url",e.PagePath="pagePath",e))(Ve||{}),Ke=(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))(Ke||{}),Ge=(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))(Ge||{}),ze=(e=>(e.Default="default",e.Sku="sku",e.ProductId="productId",e.VariantId="variantId",e.ProductIdAndVariantIdUnderscore="productIdAndVariantIdUnderscore",e.VariantIdOrProductId="variantIdOrProductId",e))(ze||{}),Ye=(e=>(e.DeliverAllTraitsAndDeliverAllEvents="deliverAllTraitsAndDeliverAllEvents",e.DeliverAllTraitsAndDeliverEventsOnlyIfMaxWeightedTraitsPresent="deliverAllTraitsAndDeliverEventsOnlyIfMaxWeightedTraitsPresent",e.DeliverMaxWeightedTraitsOnlyAndDeliverAllEvents="deliverMaxWeightedTraitsOnlyAndDeliverAllEvents",e.DeliverMaxWeightedTraitsOnlyAndDeliverEventsOnlyIfMaxWeightedTraitsPresent="deliverMaxWeightedTraitsOnlyAndDeliverEventsOnlyIfMaxWeightedTraitsPresent",e))(Ye||{}),Qe=(e=>(e.None="none",e.SessionPassthrough="sessionPassthrough",e.UrlPassthrough="urlPassthrough",e))(Qe||{}),Xe=(e=>(e.Unset="unset",e.Granted="granted",e.Denied="denied",e))(Xe||{}),Ze=(e=>(e.Undefined="undefined",e.MeasureAdvertisingPerformance="measureAdvertisingPerformance",e))(Ze||{}),et=(e=>(e.Undefined="undefined",e.AllOf="allOf",e.AnyOf="anyOf",e))(et||{}),tt=(e=>(e.Disabled="disabled",e.Explicit="explicit",e.Implicit="implicit",e))(tt||{}),rt=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 b(e,t,n,r,i){throw i??new rt(e,t,n,r,null)}function nt(e){return e&&e.isAxiosError===!0}var D=require("openid-client"),oe=I(require("winston")),re=I(require("memory-cache")),Pe="seeka:sdk",B=class{constructor(e,t){this.appId=e,this.appInstallationId=t}appId;appInstallationId;set=async(e,t,n)=>{let r=this.getKey(e);re.default.put(r,JSON.stringify(t),n)};getOrSet=async(e,t,n)=>{let r=this.getKey(e),i=re.default.get(r);if(i){let o=JSON.parse(i);return n&&await n(o),o}let s=await t();return s?(re.default.put(r,JSON.stringify(s.value),s.expiryAbsoluteMilliseconds),s.value):null};getKey=e=>this.appInstallationId?`${Pe}:${this.appId}:${this.appInstallationId}:${e}`:`${Pe}:${this.appId}:${e}`},Zt=I(require("crypto")),W=()=>{let e=st(new Date),t=it();return`${e}.${t}`},er=e=>{let t=Object.keys(J),n=e.toLowerCase(),r=t.find(i=>i.toLowerCase()===n);return r?J[r]:"custom"},it=()=>Math.floor(Math.random()*(9999999999-1e9)+1e9).toString(),st=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 s=e.getUTCSeconds().toString();return s.length<2&&(s="0"+s),`${e.getUTCFullYear()}${t}${n}.${r}${i}${s}`},ot=e=>Zt.createHash("md5").update(e).digest("hex"),tr=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(" ")}},ne=(e,t)=>e.reduce((n,r,i)=>{let s=Math.floor(i/t);return n[s]||(n[s]=[]),n[s].push(r),n},[]),ae=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 B(e.appId,e.applicationInstallId),r=ot(e.issuerUrl+"_"+e.appId),i=await n.getOrSet(r,async()=>{try{let s=await rr(e);return!s||!s.meta||!s.raw?null:(e.logger?e.logger.verbose("Seeka auth: got issuer from remote",{...t}):console.debug("Seeka auth: got issuer from remote",{...t}),{value:s.meta,expiryAbsoluteMilliseconds:1e3*60*60})}catch(s){return e.logger?e.logger.error("Seeka auth: failed getting issuer",{...t,ex:oe.default.exceptions.getAllInfo(s)}):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 D.Configuration(i.serverMetadata,i.clientId,e.appSecret)},rr=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,D.discovery)(new URL(e.issuerUrl),n,void 0,(0,D.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:oe.default.exceptions.getAllInfo(n)}):console.error("Seeka auth: failed discovering issuer from remote",{...t,err:n}),null}},nr=async e=>{let t={applicationId:e.appId,issuer:{url:e.issuerUrl}},n=await ae(e);if(!n)return null;try{let r=await(0,D.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:oe.default.exceptions.getAllInfo(r)}),null}},at=async(e,t)=>{let n={applicationId:t.appId,issuer:{url:t.issuerUrl}},r=await ae(t);if(!r||!r)return null;try{let i=await(0,D.genericGrantRequest)(r,"app_install_token",{applicationInstallId:t.applicationInstallId,access_token:e,scope:"Seeka.API.Ingest"}),s={...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",{...s}):console.info("Seeka auth: got app access token from server",{...s}),{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 s={...n,error:i};return t.logger?t.logger.error("Seeka auth: failed to get app access token from server",{...s}):console.debug("Seeka auth: failed to get app access token from server",{...s}),null}},ce=async e=>{let t=new B(e.appId,e.applicationInstallId),n={applicationId:e.appId,issuer:{url:e.issuerUrl}};return await t.getOrSet("auth:token:appinstall",async()=>{let r=await nr(e);if(!r||!r.access_token)return null;let i=await at(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})})},ct="https://router.seeka.services",ir="https://router.seeka.services/tel/otel",lt="https://account.seeka.app",sr=(e,t,n,r,i)=>{let s=new Ne;return s.appId=e.applicationId,s.appSecret=t,s.ingestUrl=process.env.SEEKA_INGEST_URL||ct,s.issuerUrl=process.env.SEEKA_ISSUER_URL||lt,s.organisationId=e.organisationId,s.applicationInstallId=e.applicationInstallId,s.runtime={type:"sdk/js/apps-server",ver:Xt.split("-")[0],client:n},s.logger=i,s.grantedPermissions=r,s.transformApiRequest=o=>or(s,o),s.transformApiResponse=async(o,c,a)=>ar(s,o,c,a),s.hasAnyPermissions=o=>!s.grantedPermissions||s.grantedPermissions.length===0?!1:!o||o.length===0?!0:o.some(c=>s.grantedPermissions.includes(c)),s.hasAllPermissions=o=>!s.grantedPermissions||s.grantedPermissions.length===0?!1:!o||o.length===0?!0:o.every(c=>s.grantedPermissions.includes(c)),s.hasPermission=o=>!s.grantedPermissions||s.grantedPermissions.length===0?!1:o?s.grantedPermissions.includes(o):!0,s},or=async(e,t)=>{let n=await ce(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},ar=async(e,t,n,r)=>(n.data=JSON.stringify(n.data),r(n)),x={identity:{receiveFull:"Identity.Receive.Pii",send:"Identity.Send"},activity:{receiveAnon:"Activity.Receive.Anon",receiveFull:"Activity.Receive.Pii",send:"Activity.Send"}},cr=I(require("axios")),lr=I(require("http")),pr=I(require("https")),dr=new lr.default.Agent({keepAlive:!0,scheduling:"fifo"}),ur=new pr.default.Agent({keepAlive:!0,scheduling:"fifo"}),Ce=e=>{let t=cr.default.create({httpAgent:dr,httpsAgent:ur});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:s}=n,{headers:o,url:c,method:a}=n?.config,l={code:r,status:i,message:s,headers:o,url:c,method:a,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},Te={getIdentityService:e=>new _e(e,e.ingestUrl,Ce(e)),getIngestService:e=>new Oe(e,e.ingestUrl,Ce(e))},pt=class{constructor(e){this.config=e,this.ingestionService=Te.getIngestService(e),this.identityService=Te.getIdentityService(e)}config;maxBatchSize=50;refreshOrPrimeTokenCache=async()=>{await ce(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(x.identity.send,"mergeIdentity");let n=W();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(x.identity.send,"mergeIdentityBatch");let n=W();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=ne(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(s=>({id:{id:s||{},src:{...r}}}))}),i.length>1){let s=i.map((o,c)=>c===0?Promise.resolve():(this.config.logger?.verbose(`Processing identity batch ${c+1} of ${i.length}`),this.trackActivityBatchRaw({data:o.map(a=>({id:{id:a||{},src:{...r}}}))})));await Promise.all(s)}};trackActivityBatch=async(e,t)=>{this.checkPermission(x.activity.send,"trackActivityBatch");let n=W();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=ne(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(s=>({ev:{id:s.profile||{},src:{...r},payload:s.activity}}))}),i.length>1){let s=i.map((o,c)=>c===0?Promise.resolve():(this.config.logger?.verbose(`Processing activity batch ${c+1} of ${i.length}`),this.trackActivityBatchRaw({data:o.map(a=>({ev:{id:a.profile||{},src:{...r},payload:a.activity}}))})));await Promise.all(s)}};trackActivityBatchRaw=async e=>{await this.ingestionService.batch(e)};trackActivityForProfileId=async(e,t,n)=>{this.checkPermission(x.activity.send,"trackActivityForProfileId"),await this.trackActivityForProfileIdBatch([e],t,n)};trackActivityForProfileIdBatch=async(e,t,n)=>{this.checkPermission(x.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(x.activity.send,"trackActivityForProfile"),await this.trackActivityForProfileBatch([e],t,n)};trackActivityForProfileBatch=async(e,t,n)=>{this.checkPermission(x.activity.send,"trackActivityForProfileBatch"),await this.trackActivityBatch(e.map(r=>({activity:r,profile:t})),n)}},gr={measureAdvertisingPerformance:7},fr=I(require("crypto")),ie="x-seeka-signature-sha256",dt=(e,t,n)=>{if(!t)return!1;let r=null;if(t.get&&typeof t.get=="function")r=t.get(ie);else{let s=t[ie];s&&(Array.isArray(s)&&s.length>0?r=s[0]:(typeof s=="string"||s instanceof String)&&(r=s))}if(!r)return!1;let i=mr(e,n)===r;return i||console.warn("Invalid webhook signature"),i},mr=(e,t)=>fr.createHmac("sha256",e).update(t).digest("hex"),hr=(e,t,n)=>{if(!dt(e,t,n))throw new Error("Invalid webhook signature")},L=I(require("crypto")),ut="aes-192-cbc",gt=(e,t)=>{if(!e)return"";if(!t)throw new Error("Secret is required to encrypt data");let n=L.default.scryptSync(t,"salt",24),r=L.default.randomBytes(16),i=L.default.createCipheriv(ut,n,r);return[i.update(e,"utf8","hex")+i.final("hex"),Buffer.from(r).toString("hex")].join("|")},ft=(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=L.default.scryptSync(t,"salt",24),s=L.default.createDecipheriv(ut,i,Buffer.from(r,"hex"));return s.update(n,"hex","utf8")+s.final("utf8")},yr=class{constructor(e){this.appSecret=e}appSecret;encryptWithAppSecret=e=>{if(!this.appSecret)throw new Error("App secret is required to encrypt data");return gt(e,this.appSecret)};decryptWithAppSecret=e=>{if(!this.appSecret)throw new Error("App secret is required to decrypt data");return ft(e,this.appSecret)}},vr=class mt{constructor(t,n){this.context=t,this.api=new pt(t.config),this.appCache=new B(t.config.appId),this.appInstallCache=new B(t.config.appId,t.config.applicationInstallId),this.crypto=new yr(t.config.appSecret),this.logger=n}context;appCache;appInstallCache;api;logger;crypto;static create=(t,n,r,i,s)=>new mt({config:sr({...n},t,{type:r.name,ver:r.version.split("-")[0]},i,s)},s)},kr=I(require("winston")),K=require("lodash-es"),y=e=>e==null||e===""||String(e).trim()===""?"":String(e);function ht(e){if(e==null||e==="")return 0;let t=e.toString().replace(/[^0-9.]/g,"");return Number.isNaN(Number(t))?0:Number(t)}function Ir(e){if(e==null||e===0||e==="")return+"0.00";let t=ht(e);return Number(t.toFixed(3))}function Sr(e){return e==null||e===""||Number.isNaN(Number(e.toString()))?0:Math.floor(Number(e))}function Ar(e){return JSON.parse(JSON.stringify(e))}function wr(e){return/^-?\d+$/.test(e)}function Pr(e){if(!(e==null||e.length===0))return yt(e)}function yt(e){return(0,K.last)(e)}function Cr(e,t){return(0,K.get)(e,t)}function Tr(e,t,n){return(0,K.set)(e,t,n)}function xr(e,t){return(0,K.isEqual)(e,t)}function br(e){return e?e.trim().toLowerCase():""}function Er(e){return e==null?"":(e=e.trim().replace(/-/gi,"").replace(/\(/gi,"").replace(/\)/gi,"").replace(/ /g,"").replace(/\+/g,""),e)}var Nr=["order","subscriptionItemPurchase","oneTimeItemPurchase"],_r=(e,t,n)=>{if(!e.activity)return[];let r=e.activity,i=r.activityName==="custom"?r.activityNameCustom:r.activityName;if(!i)return[];let s=i.toLowerCase(),o=[];return t.forEach(c=>{if(!c)return;switch(c.type){case"activityTracked":{if(!c.activityNames||!c.activityNames.find(p=>p.toLowerCase()===s))return;n.verbose("Matched activity tracked filter",{filter:c,activityName:i});break}case"purchaseMade":{if(!r.activityName||!Nr.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 a=c.sourceFilter;if(!a)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:kr.default.exceptions.getAllInfo(p),activitySource:l}),d=null}let v=l?.pipeline?.convergePipelineIntegrationInstanceId?.toLowerCase(),u=a.filters?a.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(a.comparer){case"and":{u.every(p=>p===!0)&&o.push(c);break}case"or":{u.some(p=>p===!0)&&o.push(c);break}default:{n.warn("Unknown source filter comparer",{sourceFilters:a});break}}}),o},Or=(e,t=!1)=>{let n=e.commerce,r=n?.totalPrice||n?.products?.map(s=>(s.unitPrice||0)*(s.quantity||1)).reduce((s,o)=>s+o,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(s=>s&&s.unitPrice?s.unitPrice*(s.quantity||1):0).reduce((s,o)=>s+o,0)),r&&(i=e?.contentItem?.currencyCode||e?.commerce?.currencyCode||null,!i))){let s=e?.contentItem?.items?.filter(o=>o.currencyCode)||[];s.length>0&&(i=s[0].currencyCode||null)}if((!r||r<=0)&&e?.commerce?.products&&e?.commerce?.products.length>0&&(r=e?.commerce?.products.map(s=>s&&s.unitPrice?s.unitPrice*(s.quantity||1):0).reduce((s,o)=>s+o,0),r&&(i=e?.commerce?.currencyCode||null,!i))){let s=e?.commerce?.products?.filter(o=>o.currencyCode)||[];s.length>0&&(i=s[0].currencyCode||null)}return(!r||r<=0)&&!i?null:{value:r===0&&t?null:r||null,currencyCode:i}};function Rr(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=y(t.analytics?.libraries?.googleAnalytics?.merchant?.productItemIdPrefix));let s;switch(r){case"sku":s=e?.sku;break;case"productId":s=e?.productIdentifier;break;case"variantId":s=e?.variantIdentifier;break;case"productIdAndVariantIdUnderscore":y(e.variantIdentifier)&&y(e.productIdentifier)?s=`${e.productIdentifier}_${e.variantIdentifier}`:y(e.variantIdentifier)?s=e.variantIdentifier:s=e.productIdentifier;break;case"variantIdOrProductId":y(e.variantIdentifier)?s=e.variantIdentifier:s=e.productIdentifier;break;default:s=y(e?.sku)||y(e?.variantIdentifier)||y(e?.productIdentifier);break}return i?`${i}${s}`:s}function Ur(e,t){return y(e?.variantName)||y(e?.productName)}function Lr(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 Dr={defaultIssuerUrl:lt,defaultTelemetryUrl:ir,defaultIngestUrl:ct}});var nn={};Ht(nn,{appLogger:()=>N,backgroundJobLogger:()=>Jr,checkAuth:()=>bt,childLogger:()=>_,connect:()=>St,createOrUpdateInstallation:()=>jr,deleteInstallation:()=>qr,disconnect:()=>At,generateAppUiHttpRequestResponse:()=>Zr,getAccessTokenAndCheck:()=>ke,getKey:()=>M,getList:()=>ge,getOrCreate:()=>$r,getOrCreateClient:()=>S,getOrInitLogger:()=>Hr,getSeekaBrowserPlugin:()=>rn,getSeekaBrowserPluginByName:()=>Dt,isConnected:()=>pe,listInstallations:()=>Mr,remove:()=>me,set:()=>fe,startServices:()=>he,stopServices:()=>Fr,tryGet:()=>ue,tryGetInstallation:()=>Q,webhookLogger:()=>Wr});module.exports=Wt(nn);var It=require("redis"),G=k(require("winston")),z=k(kt()),Br=()=>{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}`},le="__SEEKA_REDIS_CLIENT__",S=e=>{if(global[le])return global[le];let t=(0,It.createClient)({url:Br(),disableClientInfo:!0}).on("error",n=>e.error("Redis Client ",{ex:G.exceptions.getAllInfo(n)}));return global[le]=t,t},St=async e=>{await S(e).connect()},pe=async e=>S(e).isOpen,At=async e=>{S(e).destroy()},wt=e=>`seeka:app:${process.env.SEEKA_APP_ID}:${e}`,M=(e,t)=>`${wt(e)}:${t}`,$=e=>e==="install",Pt=()=>{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)},de=e=>{if(!Ct(e))return{plainText:e,wasEncrypted:!1};let t=Pt();return{plainText:(0,z.decryptText)(e,t),wasEncrypted:!0}},F=e=>{if(Ct(e))return{encryptedText:e,wasEncrypted:!0};let t=Pt();return{encryptedText:(0,z.encryptText)(e,t),wasEncrypted:!1}};async function $r(e,t,n,r="string",i){let s=M(e,t),o=S(i),c=await Tt(o,s);if(c){if(r==="string"&&$(e)){let{plainText:a,wasEncrypted:l}=de(c);if(!l){let{encryptedText:d}=F(c);await o.set(s,d)}return JSON.parse(a)}return JSON.parse(c)}if(r==="json")await o.json.set(s,"$",n);else{let a=JSON.stringify(n);if($(e)){let{encryptedText:l}=F(a);await o.set(s,l)}else await o.set(s,a)}return n}async function ue(e,t,n="string",r){let i=M(e,t),s=S(r);if(n==="json"){let o=await s.json.get(i);if(o)return o}else{let o=await Tt(s,i);if(o){if($(e)){let{plainText:c,wasEncrypted:a}=de(o);if(!a){let{encryptedText:l}=F(o);await s.set(i,l)}return JSON.parse(c)}return JSON.parse(o)}}return null}async function ge(e,t){let n=wt(e),r=S(t),i=await r.keys(`${n}:*`),s=await r.mGet(i);if(s){let o=[];for(let c=0;c<s.length;c++){let a=s[c],l=i[c];if(!a)continue;let d=a;if($(e)){let{plainText:v,wasEncrypted:u}=de(d);if(!u){let{encryptedText:p}=F(d);await r.set(l,p)}o.push(JSON.parse(v))}else o.push(JSON.parse(d))}return o}return[]}async function fe(e,t,n,r="string",i){let s=M(e,t),o=S(i);if(r==="json")await o.json.set(s,"$",n);else{let c=JSON.stringify(n);if($(e)){let{encryptedText:a}=F(c);await o.set(s,a)}else await o.set(s,c)}}async function me(e,t,n){let r=M(e,t);await S(n).del(r)}async function Tt(e,t){let n=await e.get(t);return typeof n=="string"?n:n?n.toString():""}var he=async e=>{e.debug(`Trying to connect to Redis - ${process.env.REDIS_CONNECTION_HOST}`);try{await pe(e)?e.verbose(`Redis already connected - ${process.env.REDIS_CONNECTION_HOST}`):(e.profile("service.redis.connect"),await St(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:G.exceptions.getAllInfo(t)}),t}},Fr=async e=>{e.debug(`Trying to disconnect from Redis - ${process.env.REDIS_CONNECTION_HOST}`);try{await pe(e)===!1?e.verbose(`Redis already disconnected - ${process.env.REDIS_CONNECTION_HOST}`):(e.profile("service.redis.disconnect"),await At(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:G.exceptions.getAllInfo(t)}),t}};var Y="install",Q=async(e,t,n)=>{let r=await ue(Y,e,"string",n);if(r==null&&t)throw n.error(`Seeka installation ${e} not found`),new Error(`Seeka installation ${e} not found`);return r},Mr=async e=>await ge(Y,e),jr=async(e,t)=>{e.installationState||(e.installationState={}),e.installedAt||(e.installedAt=new Date().toISOString());let n=await Q(e.applicationInstallId,!1,t)===null;return await fe(Y,e.applicationInstallId,e,"string",t),t.info(n?"Created installation state":"Updated installation state",{applicationInstallId:e.applicationInstallId,organisationId:e.organisationId,organisationBrandId:e.organisationBrandId}),e},qr=async(e,t)=>{await me(Y,e,t),t.info("Deleted installation state",{applicationInstallId:e})};var X=e=>"seeka_app_"+e+"_at_app",Z=e=>"seeka_app_"+e+"_at_core",ye="X-Seeka-App-Token",ve="X-Seeka-CoreApi-Token",R="at_app",U="at_core";var xt=k(require("jsonwebtoken"));var ke=async(e,t,n,r)=>{let i=new URL(e),s=t.get("Cookie"),o=i.searchParams.get(R)||"";if(!o&&t.get(ye)&&(o=t.get(ye)?.split("Bearer ")[1]),!o&&s){let a=s.split(";").find(l=>l.trim().startsWith(X(process.env.SEEKA_APP_ID)));a&&(o=a.split("=")[1])}let c=i.searchParams.get(U)||"";if(!c&&t.get(ve)&&(c=t.get(ve)?.split("Bearer ")[1]),!c&&s){let a=s.split(";").find(l=>l.trim().startsWith(Z(process.env.SEEKA_APP_ID)));a&&(c=a.split("=")[1])}return await bt(o,c,n,r)},bt=async(e,t,n,r)=>{let i,s,o;if(e)try{let a=xt.default.verify(e,process.env.SEEKA_APP_SECRET,{ignoreNotBefore:!0});if(r.info("Decoded token",{decoded:a}),!a.appId||a.appId.replace(/-/g,"")!==process.env.SEEKA_APP_ID.replace(/-/g,"")){r.error("Invalid token - app id does not match",{decoded:a,appIdToken:a.appId,appIdEnv:process.env.SEEKA_APP_ID});return}else i=a.appId;if(a.appInstallId)s=a.appInstallId;else{r.error("Invalid token - no appInstallId",{decoded:a});return}o=a.exp}catch(a){r.error("Failed to validate token",{err:a});return}else{r.error("No access token present");return}n&&await n(r);let c=await Q(s,!1,r);if(c==null){r.warn("UI call cannot be processed as the installation ID is not known by this app",{seekaAppInstallId:s});return}return{appAccessToken:e,coreApiAccessToken:t,seekaAppId:i,seekaAppInstallId:s,expiresAt:o,installation:c}};var P=k(require("fs/promises")),w=k(require("path"));var A=k(require("winston")),N,Et={},Hr=(e,t)=>{if(N)return N;let n=[new A.transports.Console({level:t.LOGGING_LEVEL,format:A.format.combine(A.format.errors({stack:!0}),A.format.cli(),A.format.splat()),handleExceptions:!0,handleRejections:!0})];return N=A.createLogger({level:t.LOGGING_LEVEL,transports:n,exitOnError:!1,defaultMeta:Et}),N.info("Seeka app logger initialized"),N},_=(e,t,n=N,r={})=>n.child({...Et,...e,...t?{"seeka.app.install.id":t.applicationInstallId,"seeka.app.install.brand.id":t.organisationBrandId,"seeka.app.install.org.id":t.organisationId,...r?.invocationId?{"faas.invocation_id":r.invocationId}:{}}:{}}),Wr=(e,t)=>{let n={"seeka.app.webhook.type":e.type,"seeka.app.webhook.test":e.isTest,"seeka.app.webhook.id":e.requestId,"seeka.app.webhook.correlationId":e.causationId,"seeka.app.webhook.causationId":e.causationId,"faas.invocation_id":t.invocationId},r=e.context;return r&&(n["seeka.app.install.id"]=r.applicationInstallId,n["seeka.app.install.brand.id"]=r.organisationBrandId,n["seeka.app.install.org.id"]=r.organisationId),_(n)},Jr=(e,t,n)=>{let r={jobContext:t,jobName:e,"faas.invocation_id":n.invocationId,"seeka.app.job.correlationId":t?.causationId,"seeka.app.job.causationId":t?.causationId,"seeka.app.install.id":t?.applicationInstallId??t?.payload.applicationInstallId,"seeka.app.install.brand.id":t?.organisationBrandId,"seeka.app.install.org.id":t?.organisationId};return _(r)};var Vr="seeka-cli-developer",Kr="https://api.seeka.services",Nt="http://localhost:3000",q=()=>process.env.SEEKA_DEVELOPER_MODE==="true";async function Ut(e){try{let t=await P.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async function Gr(e,t){await P.mkdir(w.default.dirname(e),{recursive:!0}),await P.writeFile(e,JSON.stringify(t,null,2),{mode:384})}async function zr(e){let n=`${e.issuerUrl.replace(/\/+$/,"")}/connect/token`,r=new URLSearchParams({grant_type:"refresh_token",refresh_token:e.refreshToken,client_id:Vr}),i=await fetch(n,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:r.toString()});if(!i.ok){let s=await i.text();throw new Error(`Token refresh failed (${i.status}): ${s}`)}return i.json()}async function Yr(e){let t=w.default.join(e,".seeka","developer","credentials.json"),n=await Ut(t);if(!n)throw new Error("Developer credentials not found. Run `seeka auth login` first.");if(new Date(n.expiresAt)<new Date){let r=await zr(n),i={...n,accessToken:r.access_token,refreshToken:r.refresh_token||n.refreshToken,expiresAt:new Date(Date.now()+r.expires_in*1e3).toISOString()};return await Gr(t,i),i.accessToken}return n.accessToken}async function Qr(e){let t=process.cwd(),n=w.default.join(t,".seeka","developer","context","active.json"),r=await Ut(n);if(!r)return{status:500,jsonBody:{error:"No active developer context found. Run `seeka app context set` first."}};e.info("Developer mode: /dev/open",{brandId:r.brandId,installId:r.installId});let i;try{i=await Yr(t)}catch(f){return e.error("Developer mode: failed to get access token",{err:f}),{status:500,jsonBody:{error:"Failed to get developer access token. Check server logs for details."}}}let o=`${process.env.SEEKA_DEVELOPER_API_URL||Kr}/api/converge/pipeline/integration/connection/${r.installId}/url/landing`,c;try{c=await fetch(o,{method:"GET",headers:{Authorization:`Bearer ${i}`}})}catch(f){return e.error("Developer mode: failed to call landing URL API",{err:f}),{status:502,jsonBody:{error:"Failed to call Seeka API. Check server logs for details."}}}if(!c.ok){let f=await c.text();return e.error("Developer mode: landing URL API returned error",{status:c.status,text:f}),{status:502,jsonBody:{error:`Seeka API returned status ${c.status}. Check server logs for details.`}}}let a=await c.json(),l=a.result!==void 0?a.result:a;if(!l||typeof l!="string")return e.error("Developer mode: unexpected landing URL response",{responseJson:a}),{status:502,jsonBody:{error:"Unexpected response from Seeka API: no landing URL returned"}};let d=new URL(l),v=d.searchParams.get(R)||"",u=d.searchParams.get(U)||"",p=`/app/?${R}=${encodeURIComponent(v)}&${U}=${encodeURIComponent(u)}`;return e.info("Developer mode: redirecting to app with tokens",{localRedirect:p.substring(0,50)+"..."}),{status:302,headers:{Location:p}}}async function Ie(e,t){let n=`${Nt}${e}`;try{let r=await fetch(n);if(!r.ok){if(r.status===404){let o=await fetch(`${Nt}/index.html`);if(o.ok){let c=await o.text();return{status:200,headers:{"Content-Type":"text/html"},body:c,textBody:c}}}return null}let i=r.headers.get("Content-Type")||"application/octet-stream";if(i.includes("text/")||i.includes("javascript")||i.includes("json")){let o=await r.text();return{status:200,headers:{"Content-Type":i},body:o,textBody:o}}let s=await r.arrayBuffer();return{status:200,headers:{"Content-Type":i},body:Buffer.from(s)}}catch(r){return t.warn("Developer mode: Vite dev server proxy failed, falling back to static files",{err:r,viteUrl:n}),null}}var _t=!1;function Xr(e){_t||(_t=!0,q()&&e.info("Seeka Developer Mode is ACTIVE - /dev/open route enabled, Vite HMR proxy enabled (port 3000)"))}async function Ot(e,t){return await P.readFile(e,{encoding:t})}var j="config.js",Zr=async(e,t,n,r,i,s)=>{let o=_(null,void 0,void 0,r);o.profile("http.seeka.webhook.app.ui"),Xr(o);let a=new URL(e).pathname?.replace(/^\/app/,"")||"/";if(o.verbose("Received Seeka UI request",{requestedPath:a,url:e,method:t}),q()&&a==="/dev/open")return Qr(o);let l=w.default.resolve("./dist/src/ui/build"),d=null,v=null,u,p={},f=[],m,ee=async()=>a==="/health"?null:(m=await ke(e,n,()=>he(o),o),m?(d=m.seekaAppId,v=m.seekaAppInstallId,u=m.installation,o=_(null,u,o,r),o.verbose("Authenticated Seeka UI request",{requestedPath:a,url:e,method:t}),o=_(null,u,o,r),f.push({name:X(process.env.SEEKA_APP_ID),value:m.appAccessToken,httpOnly:!0,secure:!0,sameSite:"None",expires:new Date(m.expiresAt*1e3)}),f.push({name:Z(process.env.SEEKA_APP_ID),value:m.coreApiAccessToken,httpOnly:!0,secure:!0,sameSite:"None",expires:new Date(m.expiresAt*1e3)}),null):{status:403,jsonBody:{error:"Invalid token"}}),C=w.default.join(l,a),E;try{if(a==="/health")return{status:200,jsonBody:{status:"ok"}};if(a==="/"+j){let g=await ee();if(g)return g;let h=process.env.APP_UI_BASE_PATH?`${process.env.APP_UI_BASE_PATH}`:"",T=`${process.env.SELF_HOST_BASEURL}${h}`,O={seekaAppId:d||"",seekaAppInstallId:v||"",organisationBrandId:u?.organisationBrandId||"",appBaseUrl:T,state:await i(u,o)};E=`window.seekaAppConfig = ${JSON.stringify(O)}`}if(a.startsWith("/api")){let g=await ee();if(g)return g;let h=await s(a,t,u,o);return h||{status:404,jsonBody:{error:"Not found"}}}if(a==="/"||a==="/index.html"){let g=await ee();if(g)return g;let h=`?${R}=${encodeURIComponent(m?.appAccessToken||"")}&${U}=${encodeURIComponent(m?.coreApiAccessToken||"")}&`;if(q()){let O=await Ie("/index.html",o);if(O?.textBody){let te=O.textBody;return te=te.replace(j+"?",j+h),{status:200,headers:{"Content-Type":"text/html","Referrer-Policy":"no-referrer",...p},cookies:f,body:te}}}C=w.default.join(l,"index.html");let T=await Ot(C,"utf-8");T=T.replace(j+"?",j+h),E=T}else if(!E){if(q()){let g=await Ie(a,o);if(g){let{textBody:h,...T}=g;return{...T,cookies:f}}}C=w.default.join(l,a),await P.access(C)}}catch(g){if(q()){let h=await Ie("/index.html",o);if(h){let{textBody:T,...O}=h;return{...O,cookies:f}}}C=w.default.join(l,"index.html"),console.log("File not found, serving index.html",{err:g,requestedPath:a,buildPath:l,filePath:C,content:E})}return E||(E=await Ot(C)),{status:200,headers:{"Content-Type":await en(C),"Referrer-Policy":"no-referrer",...p},cookies:f,body:E}},Rt=new Map;async function en(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=Rt.get(t);if(n)return n;let i=(await import("mime-types")).lookup(e);return i?(Rt.set(t,i),i):"application/octet-stream"}var Ae=k(require("fs/promises")),Se=k(require("path")),Lt=k(require("winston")),tn=async e=>Ae.default.stat(e).then(()=>!0).catch(()=>!1);async function rn(e,t,n,r){let s=Se.default.resolve(Se.default.join(t,"seeka-browser-plugin.min.js"));return await Dt(e,s,n,r)}async function Dt(e,t,n,r){r.profile("http.seeka.browser.plugin");let i,s;try{r.verbose("Handling request for browser plugin content",{path:t}),await tn(t)?(r.verbose("Browser plugin content found",{path:t}),i=await Ae.default.readFile(t,"utf8"),s=`${e}(${JSON.stringify(n)})`):r.error("Browser plugin content not found",{path:t})}catch(o){r.error("Failed to handle request for browser plugin content",{ex:Lt.default.exceptions.getAllInfo(o)})}finally{r.profile("http.seeka.browser.plugin"),r.verbose("Request for browser plugin content handled")}if(!i||!s)throw new Error("Failed to handle request for browser plugin content");return{content:i,init:s}}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 Et=Object.create;var ge=Object.defineProperty;var Nt=Object.getOwnPropertyDescriptor;var _t=Object.getOwnPropertyNames;var Ot=Object.getPrototypeOf,Rt=Object.prototype.hasOwnProperty;var m=(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 Ut=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Lt=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of _t(t))!Rt.call(e,i)&&i!==n&&ge(e,i,{get:()=>t[i],enumerable:!(r=Nt(t,i))||r.enumerable});return e};var Dt=(e,t,n)=>(n=e!=null?Et(Ot(e)):{},Lt(t||!e||!e.__esModule?ge(n,"default",{value:e,enumerable:!0}):n,e));var lt=Ut((Gr,ct)=>{"use strict";var Bt=Object.create,W=Object.defineProperty,$t=Object.getOwnPropertyDescriptor,Ft=Object.getOwnPropertyNames,Mt=Object.getPrototypeOf,jt=Object.prototype.hasOwnProperty,qt=(e,t)=>{for(var n in t)W(e,n,{get:t[n],enumerable:!0})},ye=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Ft(t))!jt.call(e,i)&&i!==n&&W(e,i,{get:()=>t[i],enumerable:!(r=$t(t,i))||r.enumerable});return e},I=(e,t,n)=>(n=e!=null?Bt(Mt(e)):{},ye(t||!e||!e.__esModule?W(n,"default",{value:e,enumerable:!0}):n,e)),Ht=e=>ye(W({},"__esModule",{value:!0}),e),ve={};qt(ve,{ActivityPipelineActivityFilterSourceItemType:()=>De,ActivityPipelineActivityFilterType:()=>Ue,AnalyticsLibrary:()=>$e,ApiException:()=>Ve,ApiServiceProxyBase:()=>ne,AppPermissionKeys:()=>C,ClickAttributionSourcePlatform:()=>Re,ConditionComparer:()=>Le,ConditionOperator:()=>Be,ConsentMappingMatchType:()=>We,ContentIdentificationBehavior:()=>Fe,ConvergePipelineLoggableActivityType:()=>Ne,ConvergeVendorDestinationPublishStrategy:()=>Me,CrossDomainTrackingUtmBehavior:()=>je,ECommerceContentType:()=>Te,ECommerceFinancialStatus:()=>Ee,ECommerceFulfillmentStatus:()=>be,ECommercePlatform:()=>xe,IabPrivacyConsentPurposeId:()=>He,IabPrivacyConsentPurposeIdMap:()=>sr,IdentityServiceProxy:()=>Se,IngestServiceProxy:()=>Ae,PrivacyConsentType:()=>Pe,PrivacyDataControlMode:()=>Je,RegionalConsentGrantOption:()=>qe,ResponseResultType:()=>we,SdkLogEventLevel:()=>_e,SeekaApiHelper:()=>et,SeekaAppCacheManager:()=>B,SeekaAppConfig:()=>Ie,SeekaAppHelper:()=>pr,SeekaWebhookCallType:()=>Oe,TrackingActivityNames:()=>H,TrackingEventSourceOriginType:()=>Ce,chunk:()=>te,cloneDeep:()=>fr,dateToUtcDateTimeReferenceString:()=>ze,decryptText:()=>it,emailAddress:()=>Ir,encryptText:()=>nt,generateNewSessionId:()=>q,getActivityName:()=>Vt,getActivityValue:()=>Pr,getContentIdFromProduct:()=>Cr,getContentNameFromProduct:()=>Tr,getIssuer:()=>se,getNestedProperty:()=>yr,getNewAppInstallToken:()=>Qe,getNewOrCachedAppInstallToken:()=>oe,getRandomNumberString:()=>Ge,isDeepEqual:()=>kr,isNumber:()=>mr,isValidSeekaProfileId:()=>xr,last:()=>at,lastOrDefault:()=>hr,matchActivityPipelineFilters:()=>wr,md5Hash:()=>Ye,parseFloat:()=>ot,parseInt:()=>gr,parseMoney:()=>ur,parseStr:()=>v,phoneNumberToE164:()=>Sr,separatePersonFullName:()=>Kt,setNestedProperty:()=>vr,throwOnInvalidWebhookSignature:()=>cr,urls:()=>br,validateWebhookSignature:()=>tt,webhookSignatureHeaderName:()=>re});ct.exports=Ht(ve);var Wt="3.10.1",ke=I(m("axios")),Ie=class{appId;appSecret;ingestUrl;issuerUrl;organisationId;applicationInstallId;runtime;logger;grantedPermissions;transformApiRequest;transformApiResponse;hasAnyPermissions;hasAllPermissions;hasPermission},ne=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)},Se=class extends ne{instance;baseUrl;jsonParseReviver=void 0;constructor(e,t,n){super(e),this.instance=n||ke.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(Ke(i)&&i.response)return i.response;throw i}).then(i=>this.transformResult(n,i,s=>this.processMerge(s)))}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),T("A server side error occurred.",t,r,n,i)}else if(t===401){let r=e.data,i=null;return i=JSON.parse(r),T("A server side error occurred.",t,r,n,i)}else if(t===422){let r=e.data,i=null;return i=JSON.parse(r),T("A server side error occurred.",t,r,n,i)}else if(t!==200&&t!==204){let r=e.data;return T("An unexpected server error occurred.",t,r,n)}return Promise.resolve(null)}},Ae=class extends ne{instance;baseUrl;jsonParseReviver=void 0;constructor(e,t,n){super(e),this.instance=n||ke.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(Ke(i)&&i.response)return i.response;throw i}).then(i=>this.transformResult(n,i,s=>this.processBatch(s)))}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),T("A server side error occurred.",t,r,n,i)}else if(t===401){let r=e.data,i=null;return i=JSON.parse(r),T("A server side error occurred.",t,r,n,i)}else if(t===422){let r=e.data,i=null;return i=JSON.parse(r),T("A server side error occurred.",t,r,n,i)}else if(t!==200&&t!==204){let r=e.data;return T("An unexpected server error occurred.",t,r,n)}return Promise.resolve(null)}},we=(e=>(e.Undefined="undefined",e.Success="success",e.Failed="failed",e))(we||{}),Pe=(e=>(e.Unknown="unknown",e.Informed="informed",e.Implied="implied",e.Explicit="explicit",e.Active="active",e.Passive="passive",e))(Pe||{}),Ce=(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))(Ce||{}),H=(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))(H||{}),Te=(e=>(e.Undefined="undefined",e.SingleProduct="singleProduct",e.SingleVariant="singleVariant",e.Collection="collection",e))(Te||{}),xe=(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))(xe||{}),be=(e=>(e.Undefined="undefined",e.Fulfilled="fulfilled",e.NoneFulfilled="noneFulfilled",e.PartiallyFulfilled="partiallyFulfilled",e.RestockedOrCancelled="restockedOrCancelled",e.Pending="pending",e))(be||{}),Ee=(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))(Ee||{}),Ne=(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))(Ne||{}),_e=(e=>(e.Information="information",e.Warning="warning",e.Error="error",e.Verbose="verbose",e))(_e||{}),Oe=(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))(Oe||{}),Re=(e=>(e.Unknown="unknown",e.Google="google",e.Meta="meta",e.Snapchat="snapchat",e.Pinterest="pinterest",e.TikTok="tikTok",e))(Re||{}),Ue=(e=>(e.Undefined="undefined",e.PurchaseMade="purchaseMade",e.ActivityTracked="activityTracked",e))(Ue||{}),Le=(e=>(e.Undefined="undefined",e.And="and",e.Or="or",e))(Le||{}),De=(e=>(e.Undefined="undefined",e.Domain="domain",e.Pipeline="pipeline",e.Wildcard="wildcard",e.Url="url",e.PagePath="pagePath",e))(De||{}),Be=(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))(Be||{}),$e=(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))($e||{}),Fe=(e=>(e.Default="default",e.Sku="sku",e.ProductId="productId",e.VariantId="variantId",e.ProductIdAndVariantIdUnderscore="productIdAndVariantIdUnderscore",e.VariantIdOrProductId="variantIdOrProductId",e))(Fe||{}),Me=(e=>(e.DeliverAllTraitsAndDeliverAllEvents="deliverAllTraitsAndDeliverAllEvents",e.DeliverAllTraitsAndDeliverEventsOnlyIfMaxWeightedTraitsPresent="deliverAllTraitsAndDeliverEventsOnlyIfMaxWeightedTraitsPresent",e.DeliverMaxWeightedTraitsOnlyAndDeliverAllEvents="deliverMaxWeightedTraitsOnlyAndDeliverAllEvents",e.DeliverMaxWeightedTraitsOnlyAndDeliverEventsOnlyIfMaxWeightedTraitsPresent="deliverMaxWeightedTraitsOnlyAndDeliverEventsOnlyIfMaxWeightedTraitsPresent",e))(Me||{}),je=(e=>(e.None="none",e.SessionPassthrough="sessionPassthrough",e.UrlPassthrough="urlPassthrough",e))(je||{}),qe=(e=>(e.Unset="unset",e.Granted="granted",e.Denied="denied",e))(qe||{}),He=(e=>(e.Undefined="undefined",e.MeasureAdvertisingPerformance="measureAdvertisingPerformance",e))(He||{}),We=(e=>(e.Undefined="undefined",e.AllOf="allOf",e.AnyOf="anyOf",e))(We||{}),Je=(e=>(e.Disabled="disabled",e.Explicit="explicit",e.Implicit="implicit",e))(Je||{}),Ve=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 T(e,t,n,r,i){throw i??new Ve(e,t,n,r,null)}function Ke(e){return e&&e.isAxiosError===!0}var D=m("openid-client"),ie=I(m("winston")),ee=I(m("memory-cache")),fe="seeka:sdk",B=class{constructor(e,t){this.appId=e,this.appInstallationId=t}appId;appInstallationId;set=async(e,t,n)=>{let r=this.getKey(e);ee.default.put(r,JSON.stringify(t),n)};getOrSet=async(e,t,n)=>{let r=this.getKey(e),i=ee.default.get(r);if(i){let o=JSON.parse(i);return n&&await n(o),o}let s=await t();return s?(ee.default.put(r,JSON.stringify(s.value),s.expiryAbsoluteMilliseconds),s.value):null};getKey=e=>this.appInstallationId?`${fe}:${this.appId}:${this.appInstallationId}:${e}`:`${fe}:${this.appId}:${e}`},Jt=I(m("crypto")),q=()=>{let e=ze(new Date),t=Ge();return`${e}.${t}`},Vt=e=>{let t=Object.keys(H),n=e.toLowerCase(),r=t.find(i=>i.toLowerCase()===n);return r?H[r]:"custom"},Ge=()=>Math.floor(Math.random()*(9999999999-1e9)+1e9).toString(),ze=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 s=e.getUTCSeconds().toString();return s.length<2&&(s="0"+s),`${e.getUTCFullYear()}${t}${n}.${r}${i}${s}`},Ye=e=>Jt.createHash("md5").update(e).digest("hex"),Kt=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(" ")}},te=(e,t)=>e.reduce((n,r,i)=>{let s=Math.floor(i/t);return n[s]||(n[s]=[]),n[s].push(r),n},[]),se=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 B(e.appId,e.applicationInstallId),r=Ye(e.issuerUrl+"_"+e.appId),i=await n.getOrSet(r,async()=>{try{let s=await Gt(e);return!s||!s.meta||!s.raw?null:(e.logger?e.logger.verbose("Seeka auth: got issuer from remote",{...t}):console.debug("Seeka auth: got issuer from remote",{...t}),{value:s.meta,expiryAbsoluteMilliseconds:1e3*60*60})}catch(s){return e.logger?e.logger.error("Seeka auth: failed getting issuer",{...t,ex:ie.default.exceptions.getAllInfo(s)}):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 D.Configuration(i.serverMetadata,i.clientId,e.appSecret)},Gt=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,D.discovery)(new URL(e.issuerUrl),n,void 0,(0,D.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:ie.default.exceptions.getAllInfo(n)}):console.error("Seeka auth: failed discovering issuer from remote",{...t,err:n}),null}},zt=async e=>{let t={applicationId:e.appId,issuer:{url:e.issuerUrl}},n=await se(e);if(!n)return null;try{let r=await(0,D.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:ie.default.exceptions.getAllInfo(r)}),null}},Qe=async(e,t)=>{let n={applicationId:t.appId,issuer:{url:t.issuerUrl}},r=await se(t);if(!r||!r)return null;try{let i=await(0,D.genericGrantRequest)(r,"app_install_token",{applicationInstallId:t.applicationInstallId,access_token:e,scope:"Seeka.API.Ingest"}),s={...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",{...s}):console.info("Seeka auth: got app access token from server",{...s}),{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 s={...n,error:i};return t.logger?t.logger.error("Seeka auth: failed to get app access token from server",{...s}):console.debug("Seeka auth: failed to get app access token from server",{...s}),null}},oe=async e=>{let t=new B(e.appId,e.applicationInstallId),n={applicationId:e.appId,issuer:{url:e.issuerUrl}};return await t.getOrSet("auth:token:appinstall",async()=>{let r=await zt(e);if(!r||!r.access_token)return null;let i=await Qe(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})})},Xe="https://router.seeka.services",Yt="https://router.seeka.services/tel/otel",Ze="https://account.seeka.app",Qt=(e,t,n,r,i)=>{let s=new Ie;return s.appId=e.applicationId,s.appSecret=t,s.ingestUrl=process.env.SEEKA_INGEST_URL||Xe,s.issuerUrl=process.env.SEEKA_ISSUER_URL||Ze,s.organisationId=e.organisationId,s.applicationInstallId=e.applicationInstallId,s.runtime={type:"sdk/js/apps-server",ver:Wt.split("-")[0],client:n},s.logger=i,s.grantedPermissions=r,s.transformApiRequest=o=>Xt(s,o),s.transformApiResponse=async(o,c,a)=>Zt(s,o,c,a),s.hasAnyPermissions=o=>!s.grantedPermissions||s.grantedPermissions.length===0?!1:!o||o.length===0?!0:o.some(c=>s.grantedPermissions.includes(c)),s.hasAllPermissions=o=>!s.grantedPermissions||s.grantedPermissions.length===0?!1:!o||o.length===0?!0:o.every(c=>s.grantedPermissions.includes(c)),s.hasPermission=o=>!s.grantedPermissions||s.grantedPermissions.length===0?!1:o?s.grantedPermissions.includes(o):!0,s},Xt=async(e,t)=>{let n=await oe(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},Zt=async(e,t,n,r)=>(n.data=JSON.stringify(n.data),r(n)),C={identity:{receiveFull:"Identity.Receive.Pii",send:"Identity.Send"},activity:{receiveAnon:"Activity.Receive.Anon",receiveFull:"Activity.Receive.Pii",send:"Activity.Send"}},er=I(m("axios")),tr=I(m("http")),rr=I(m("https")),nr=new tr.default.Agent({keepAlive:!0,scheduling:"fifo"}),ir=new rr.default.Agent({keepAlive:!0,scheduling:"fifo"}),me=e=>{let t=er.default.create({httpAgent:nr,httpsAgent:ir});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:s}=n,{headers:o,url:c,method:a}=n?.config,l={code:r,status:i,message:s,headers:o,url:c,method:a,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},he={getIdentityService:e=>new Se(e,e.ingestUrl,me(e)),getIngestService:e=>new Ae(e,e.ingestUrl,me(e))},et=class{constructor(e){this.config=e,this.ingestionService=he.getIngestService(e),this.identityService=he.getIdentityService(e)}config;maxBatchSize=50;refreshOrPrimeTokenCache=async()=>{await oe(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(C.identity.send,"mergeIdentity");let n=q();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(C.identity.send,"mergeIdentityBatch");let n=q();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=te(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(s=>({id:{id:s||{},src:{...r}}}))}),i.length>1){let s=i.map((o,c)=>c===0?Promise.resolve():(this.config.logger?.verbose(`Processing identity batch ${c+1} of ${i.length}`),this.trackActivityBatchRaw({data:o.map(a=>({id:{id:a||{},src:{...r}}}))})));await Promise.all(s)}};trackActivityBatch=async(e,t)=>{this.checkPermission(C.activity.send,"trackActivityBatch");let n=q();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=te(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(s=>({ev:{id:s.profile||{},src:{...r},payload:s.activity}}))}),i.length>1){let s=i.map((o,c)=>c===0?Promise.resolve():(this.config.logger?.verbose(`Processing activity batch ${c+1} of ${i.length}`),this.trackActivityBatchRaw({data:o.map(a=>({ev:{id:a.profile||{},src:{...r},payload:a.activity}}))})));await Promise.all(s)}};trackActivityBatchRaw=async e=>{await this.ingestionService.batch(e)};trackActivityForProfileId=async(e,t,n)=>{this.checkPermission(C.activity.send,"trackActivityForProfileId"),await this.trackActivityForProfileIdBatch([e],t,n)};trackActivityForProfileIdBatch=async(e,t,n)=>{this.checkPermission(C.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(C.activity.send,"trackActivityForProfile"),await this.trackActivityForProfileBatch([e],t,n)};trackActivityForProfileBatch=async(e,t,n)=>{this.checkPermission(C.activity.send,"trackActivityForProfileBatch"),await this.trackActivityBatch(e.map(r=>({activity:r,profile:t})),n)}},sr={measureAdvertisingPerformance:7},or=I(m("crypto")),re="x-seeka-signature-sha256",tt=(e,t,n)=>{if(!t)return!1;let r=null;if(t.get&&typeof t.get=="function")r=t.get(re);else{let s=t[re];s&&(Array.isArray(s)&&s.length>0?r=s[0]:(typeof s=="string"||s instanceof String)&&(r=s))}if(!r)return!1;let i=ar(e,n)===r;return i||console.warn("Invalid webhook signature"),i},ar=(e,t)=>or.createHmac("sha256",e).update(t).digest("hex"),cr=(e,t,n)=>{if(!tt(e,t,n))throw new Error("Invalid webhook signature")},L=I(m("crypto")),rt="aes-192-cbc",nt=(e,t)=>{if(!e)return"";if(!t)throw new Error("Secret is required to encrypt data");let n=L.default.scryptSync(t,"salt",24),r=L.default.randomBytes(16),i=L.default.createCipheriv(rt,n,r);return[i.update(e,"utf8","hex")+i.final("hex"),Buffer.from(r).toString("hex")].join("|")},it=(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=L.default.scryptSync(t,"salt",24),s=L.default.createDecipheriv(rt,i,Buffer.from(r,"hex"));return s.update(n,"hex","utf8")+s.final("utf8")},lr=class{constructor(e){this.appSecret=e}appSecret;encryptWithAppSecret=e=>{if(!this.appSecret)throw new Error("App secret is required to encrypt data");return nt(e,this.appSecret)};decryptWithAppSecret=e=>{if(!this.appSecret)throw new Error("App secret is required to decrypt data");return it(e,this.appSecret)}},pr=class st{constructor(t,n){this.context=t,this.api=new et(t.config),this.appCache=new B(t.config.appId),this.appInstallCache=new B(t.config.appId,t.config.applicationInstallId),this.crypto=new lr(t.config.appSecret),this.logger=n}context;appCache;appInstallCache;api;logger;crypto;static create=(t,n,r,i,s)=>new st({config:Qt({...n},t,{type:r.name,ver:r.version.split("-")[0]},i,s)},s)},dr=I(m("winston")),J=m("lodash-es"),v=e=>e==null||e===""||String(e).trim()===""?"":String(e);function ot(e){if(e==null||e==="")return 0;let t=e.toString().replace(/[^0-9.]/g,"");return Number.isNaN(Number(t))?0:Number(t)}function ur(e){if(e==null||e===0||e==="")return+"0.00";let t=ot(e);return Number(t.toFixed(3))}function gr(e){return e==null||e===""||Number.isNaN(Number(e.toString()))?0:Math.floor(Number(e))}function fr(e){return JSON.parse(JSON.stringify(e))}function mr(e){return/^-?\d+$/.test(e)}function hr(e){if(!(e==null||e.length===0))return at(e)}function at(e){return(0,J.last)(e)}function yr(e,t){return(0,J.get)(e,t)}function vr(e,t,n){return(0,J.set)(e,t,n)}function kr(e,t){return(0,J.isEqual)(e,t)}function Ir(e){return e?e.trim().toLowerCase():""}function Sr(e){return e==null?"":(e=e.trim().replace(/-/gi,"").replace(/\(/gi,"").replace(/\)/gi,"").replace(/ /g,"").replace(/\+/g,""),e)}var Ar=["order","subscriptionItemPurchase","oneTimeItemPurchase"],wr=(e,t,n)=>{if(!e.activity)return[];let r=e.activity,i=r.activityName==="custom"?r.activityNameCustom:r.activityName;if(!i)return[];let s=i.toLowerCase(),o=[];return t.forEach(c=>{if(!c)return;switch(c.type){case"activityTracked":{if(!c.activityNames||!c.activityNames.find(p=>p.toLowerCase()===s))return;n.verbose("Matched activity tracked filter",{filter:c,activityName:i});break}case"purchaseMade":{if(!r.activityName||!Ar.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 a=c.sourceFilter;if(!a)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:dr.default.exceptions.getAllInfo(p),activitySource:l}),d=null}let k=l?.pipeline?.convergePipelineIntegrationInstanceId?.toLowerCase(),u=a.filters?a.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(a.comparer){case"and":{u.every(p=>p===!0)&&o.push(c);break}case"or":{u.some(p=>p===!0)&&o.push(c);break}default:{n.warn("Unknown source filter comparer",{sourceFilters:a});break}}}),o},Pr=(e,t=!1)=>{let n=e.commerce,r=n?.totalPrice||n?.products?.map(s=>(s.unitPrice||0)*(s.quantity||1)).reduce((s,o)=>s+o,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(s=>s&&s.unitPrice?s.unitPrice*(s.quantity||1):0).reduce((s,o)=>s+o,0)),r&&(i=e?.contentItem?.currencyCode||e?.commerce?.currencyCode||null,!i))){let s=e?.contentItem?.items?.filter(o=>o.currencyCode)||[];s.length>0&&(i=s[0].currencyCode||null)}if((!r||r<=0)&&e?.commerce?.products&&e?.commerce?.products.length>0&&(r=e?.commerce?.products.map(s=>s&&s.unitPrice?s.unitPrice*(s.quantity||1):0).reduce((s,o)=>s+o,0),r&&(i=e?.commerce?.currencyCode||null,!i))){let s=e?.commerce?.products?.filter(o=>o.currencyCode)||[];s.length>0&&(i=s[0].currencyCode||null)}return(!r||r<=0)&&!i?null:{value:r===0&&t?null:r||null,currencyCode:i}};function Cr(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=v(t.analytics?.libraries?.googleAnalytics?.merchant?.productItemIdPrefix));let s;switch(r){case"sku":s=e?.sku;break;case"productId":s=e?.productIdentifier;break;case"variantId":s=e?.variantIdentifier;break;case"productIdAndVariantIdUnderscore":v(e.variantIdentifier)&&v(e.productIdentifier)?s=`${e.productIdentifier}_${e.variantIdentifier}`:v(e.variantIdentifier)?s=e.variantIdentifier:s=e.productIdentifier;break;case"variantIdOrProductId":v(e.variantIdentifier)?s=e.variantIdentifier:s=e.productIdentifier;break;default:s=v(e?.sku)||v(e?.variantIdentifier)||v(e?.productIdentifier);break}return i?`${i}${s}`:s}function Tr(e,t){return v(e?.variantName)||v(e?.productName)}function xr(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 br={defaultIssuerUrl:Ze,defaultTelemetryUrl:Yt,defaultIngestUrl:Xe}});var K=Dt(lt());import{createClient as Er}from"redis";import*as V from"winston";var Nr=()=>{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__",x=e=>{if(global[ae])return global[ae];let t=Er({url:Nr(),disableClientInfo:!0}).on("error",n=>e.error("Redis Client ",{ex:V.exceptions.getAllInfo(n)}));return global[ae]=t,t},_r=async e=>{await x(e).connect()},pt=async e=>x(e).isOpen,Or=async e=>{x(e).destroy()},dt=e=>`seeka:app:${process.env.SEEKA_APP_ID}:${e}`,G=(e,t)=>`${dt(e)}:${t}`,$=e=>e==="install",ut=()=>{let e=process.env.DATA_ENCRYPTION_KEY;if(!e)throw new Error("DATA_ENCRYPTION_KEY is required to encrypt/decrypt installation state");return e},gt=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)},ce=e=>{if(!gt(e))return{plainText:e,wasEncrypted:!1};let t=ut();return{plainText:(0,K.decryptText)(e,t),wasEncrypted:!0}},F=e=>{if(gt(e))return{encryptedText:e,wasEncrypted:!0};let t=ut();return{encryptedText:(0,K.encryptText)(e,t),wasEncrypted:!1}};async function on(e,t,n,r="string",i){let s=G(e,t),o=x(i),c=await vt(o,s);if(c){if(r==="string"&&$(e)){let{plainText:a,wasEncrypted:l}=ce(c);if(!l){let{encryptedText:d}=F(c);await o.set(s,d)}return JSON.parse(a)}return JSON.parse(c)}if(r==="json")await o.json.set(s,"$",n);else{let a=JSON.stringify(n);if($(e)){let{encryptedText:l}=F(a);await o.set(s,l)}else await o.set(s,a)}return n}async function ft(e,t,n="string",r){let i=G(e,t),s=x(r);if(n==="json"){let o=await s.json.get(i);if(o)return o}else{let o=await vt(s,i);if(o){if($(e)){let{plainText:c,wasEncrypted:a}=ce(o);if(!a){let{encryptedText:l}=F(o);await s.set(i,l)}return JSON.parse(c)}return JSON.parse(o)}}return null}async function mt(e,t){let n=dt(e),r=x(t),i=await r.keys(`${n}:*`),s=await r.mGet(i);if(s){let o=[];for(let c=0;c<s.length;c++){let a=s[c],l=i[c];if(!a)continue;let d=a;if($(e)){let{plainText:k,wasEncrypted:u}=ce(d);if(!u){let{encryptedText:p}=F(d);await r.set(l,p)}o.push(JSON.parse(k))}else o.push(JSON.parse(d))}return o}return[]}async function ht(e,t,n,r="string",i){let s=G(e,t),o=x(i);if(r==="json")await o.json.set(s,"$",n);else{let c=JSON.stringify(n);if($(e)){let{encryptedText:a}=F(c);await o.set(s,a)}else await o.set(s,c)}}async function yt(e,t,n){let r=G(e,t);await x(n).del(r)}async function vt(e,t){let n=await e.get(t);return typeof n=="string"?n:n?n.toString():""}var kt=async e=>{e.debug(`Trying to connect to Redis - ${process.env.REDIS_CONNECTION_HOST}`);try{await pt(e)?e.verbose(`Redis already connected - ${process.env.REDIS_CONNECTION_HOST}`):(e.profile("service.redis.connect"),await _r(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:V.exceptions.getAllInfo(t)}),t}},an=async e=>{e.debug(`Trying to disconnect from Redis - ${process.env.REDIS_CONNECTION_HOST}`);try{await pt(e)===!1?e.verbose(`Redis already disconnected - ${process.env.REDIS_CONNECTION_HOST}`):(e.profile("service.redis.disconnect"),await Or(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:V.exceptions.getAllInfo(t)}),t}};var z="install",le=async(e,t,n)=>{let r=await ft(z,e,"string",n);if(r==null&&t)throw n.error(`Seeka installation ${e} not found`),new Error(`Seeka installation ${e} not found`);return r},pn=async e=>await mt(z,e),dn=async(e,t)=>{e.installationState||(e.installationState={}),e.installedAt||(e.installedAt=new Date().toISOString());let n=await le(e.applicationInstallId,!1,t)===null;return await ht(z,e.applicationInstallId,e,"string",t),t.info(n?"Created installation state":"Updated installation state",{applicationInstallId:e.applicationInstallId,organisationId:e.organisationId,organisationBrandId:e.organisationBrandId}),e},un=async(e,t)=>{await yt(z,e,t),t.info("Deleted installation state",{applicationInstallId:e})};var Y=e=>"seeka_app_"+e+"_at_app",Q=e=>"seeka_app_"+e+"_at_core",pe="X-Seeka-App-Token",de="X-Seeka-CoreApi-Token",_="at_app",O="at_core";import Rr from"jsonwebtoken";var It=async(e,t,n,r)=>{let i=new URL(e),s=t.get("Cookie"),o=i.searchParams.get(_)||"";if(!o&&t.get(pe)&&(o=t.get(pe)?.split("Bearer ")[1]),!o&&s){let a=s.split(";").find(l=>l.trim().startsWith(Y(process.env.SEEKA_APP_ID)));a&&(o=a.split("=")[1])}let c=i.searchParams.get(O)||"";if(!c&&t.get(de)&&(c=t.get(de)?.split("Bearer ")[1]),!c&&s){let a=s.split(";").find(l=>l.trim().startsWith(Q(process.env.SEEKA_APP_ID)));a&&(c=a.split("=")[1])}return await Ur(o,c,n,r)},Ur=async(e,t,n,r)=>{let i,s,o;if(e)try{let a=Rr.verify(e,process.env.SEEKA_APP_SECRET,{ignoreNotBefore:!0});if(r.info("Decoded token",{decoded:a}),!a.appId||a.appId.replace(/-/g,"")!==process.env.SEEKA_APP_ID.replace(/-/g,"")){r.error("Invalid token - app id does not match",{decoded:a,appIdToken:a.appId,appIdEnv:process.env.SEEKA_APP_ID});return}else i=a.appId;if(a.appInstallId)s=a.appInstallId;else{r.error("Invalid token - no appInstallId",{decoded:a});return}o=a.exp}catch(a){r.error("Failed to validate token",{err:a});return}else{r.error("No access token present");return}n&&await n(r);let c=await le(s,!1,r);if(c==null){r.warn("UI call cannot be processed as the installation ID is not known by this app",{seekaAppInstallId:s});return}return{appAccessToken:e,coreApiAccessToken:t,seekaAppId:i,seekaAppInstallId:s,expiresAt:o,installation:c}};import*as A from"fs/promises";import b from"path";import*as S from"winston";var R,St={},kn=(e,t)=>{if(R)return R;let n=[new S.transports.Console({level:t.LOGGING_LEVEL,format:S.format.combine(S.format.errors({stack:!0}),S.format.cli(),S.format.splat()),handleExceptions:!0,handleRejections:!0})];return R=S.createLogger({level:t.LOGGING_LEVEL,transports:n,exitOnError:!1,defaultMeta:St}),R.info("Seeka app logger initialized"),R},U=(e,t,n=R,r={})=>n.child({...St,...e,...t?{"seeka.app.install.id":t.applicationInstallId,"seeka.app.install.brand.id":t.organisationBrandId,"seeka.app.install.org.id":t.organisationId,...r?.invocationId?{"faas.invocation_id":r.invocationId}:{}}:{}}),In=(e,t)=>{let n={"seeka.app.webhook.type":e.type,"seeka.app.webhook.test":e.isTest,"seeka.app.webhook.id":e.requestId,"seeka.app.webhook.correlationId":e.causationId,"seeka.app.webhook.causationId":e.causationId,"faas.invocation_id":t.invocationId},r=e.context;return r&&(n["seeka.app.install.id"]=r.applicationInstallId,n["seeka.app.install.brand.id"]=r.organisationBrandId,n["seeka.app.install.org.id"]=r.organisationId),U(n)},Sn=(e,t,n)=>{let r={jobContext:t,jobName:e,"faas.invocation_id":n.invocationId,"seeka.app.job.correlationId":t?.causationId,"seeka.app.job.causationId":t?.causationId,"seeka.app.install.id":t?.applicationInstallId??t?.payload.applicationInstallId,"seeka.app.install.brand.id":t?.organisationBrandId,"seeka.app.install.org.id":t?.organisationId};return U(r)};var Lr="seeka-cli-developer",Dr="https://api.seeka.services",At="http://localhost:3000",j=()=>process.env.SEEKA_DEVELOPER_MODE==="true";async function Tt(e){try{let t=await A.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async function Br(e,t){await A.mkdir(b.dirname(e),{recursive:!0}),await A.writeFile(e,JSON.stringify(t,null,2),{mode:384})}async function $r(e){let n=`${e.issuerUrl.replace(/\/+$/,"")}/connect/token`,r=new URLSearchParams({grant_type:"refresh_token",refresh_token:e.refreshToken,client_id:Lr}),i=await fetch(n,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:r.toString()});if(!i.ok){let s=await i.text();throw new Error(`Token refresh failed (${i.status}): ${s}`)}return i.json()}async function Fr(e){let t=b.join(e,".seeka","developer","credentials.json"),n=await Tt(t);if(!n)throw new Error("Developer credentials not found. Run `seeka auth login` first.");if(new Date(n.expiresAt)<new Date){let r=await $r(n),i={...n,accessToken:r.access_token,refreshToken:r.refresh_token||n.refreshToken,expiresAt:new Date(Date.now()+r.expires_in*1e3).toISOString()};return await Br(t,i),i.accessToken}return n.accessToken}async function Mr(e){let t=process.cwd(),n=b.join(t,".seeka","developer","context","active.json"),r=await Tt(n);if(!r)return{status:500,jsonBody:{error:"No active developer context found. Run `seeka app context set` first."}};e.info("Developer mode: /dev/open",{brandId:r.brandId,installId:r.installId});let i;try{i=await Fr(t)}catch(f){return e.error("Developer mode: failed to get access token",{err:f}),{status:500,jsonBody:{error:"Failed to get developer access token. Check server logs for details."}}}let o=`${process.env.SEEKA_DEVELOPER_API_URL||Dr}/api/converge/pipeline/integration/connection/${r.installId}/url/landing`,c;try{c=await fetch(o,{method:"GET",headers:{Authorization:`Bearer ${i}`}})}catch(f){return e.error("Developer mode: failed to call landing URL API",{err:f}),{status:502,jsonBody:{error:"Failed to call Seeka API. Check server logs for details."}}}if(!c.ok){let f=await c.text();return e.error("Developer mode: landing URL API returned error",{status:c.status,text:f}),{status:502,jsonBody:{error:`Seeka API returned status ${c.status}. Check server logs for details.`}}}let a=await c.json(),l=a.result!==void 0?a.result:a;if(!l||typeof l!="string")return e.error("Developer mode: unexpected landing URL response",{responseJson:a}),{status:502,jsonBody:{error:"Unexpected response from Seeka API: no landing URL returned"}};let d=new URL(l),k=d.searchParams.get(_)||"",u=d.searchParams.get(O)||"",p=`/app/?${_}=${encodeURIComponent(k)}&${O}=${encodeURIComponent(u)}`;return e.info("Developer mode: redirecting to app with tokens",{localRedirect:p.substring(0,50)+"..."}),{status:302,headers:{Location:p}}}async function ue(e,t){let n=`${At}${e}`;try{let r=await fetch(n);if(!r.ok){if(r.status===404){let o=await fetch(`${At}/index.html`);if(o.ok){let c=await o.text();return{status:200,headers:{"Content-Type":"text/html"},body:c,textBody:c}}}return null}let i=r.headers.get("Content-Type")||"application/octet-stream";if(i.includes("text/")||i.includes("javascript")||i.includes("json")){let o=await r.text();return{status:200,headers:{"Content-Type":i},body:o,textBody:o}}let s=await r.arrayBuffer();return{status:200,headers:{"Content-Type":i},body:Buffer.from(s)}}catch(r){return t.warn("Developer mode: Vite dev server proxy failed, falling back to static files",{err:r,viteUrl:n}),null}}var wt=!1;function jr(e){wt||(wt=!0,j()&&e.info("Seeka Developer Mode is ACTIVE - /dev/open route enabled, Vite HMR proxy enabled (port 3000)"))}async function Pt(e,t){return await A.readFile(e,{encoding:t})}var M="config.js",En=async(e,t,n,r,i,s)=>{let o=U(null,void 0,void 0,r);o.profile("http.seeka.webhook.app.ui"),jr(o);let a=new URL(e).pathname?.replace(/^\/app/,"")||"/";if(o.verbose("Received Seeka UI request",{requestedPath:a,url:e,method:t}),j()&&a==="/dev/open")return Mr(o);let l=b.resolve("./dist/src/ui/build"),d=null,k=null,u,p={},f=[],h,X=async()=>a==="/health"?null:(h=await It(e,n,()=>kt(o),o),h?(d=h.seekaAppId,k=h.seekaAppInstallId,u=h.installation,o=U(null,u,o,r),o.verbose("Authenticated Seeka UI request",{requestedPath:a,url:e,method:t}),o=U(null,u,o,r),f.push({name:Y(process.env.SEEKA_APP_ID),value:h.appAccessToken,httpOnly:!0,secure:!0,sameSite:"None",expires:new Date(h.expiresAt*1e3)}),f.push({name:Q(process.env.SEEKA_APP_ID),value:h.coreApiAccessToken,httpOnly:!0,secure:!0,sameSite:"None",expires:new Date(h.expiresAt*1e3)}),null):{status:403,jsonBody:{error:"Invalid token"}}),w=b.join(l,a),E;try{if(a==="/health")return{status:200,jsonBody:{status:"ok"}};if(a==="/"+M){let g=await X();if(g)return g;let y=process.env.APP_UI_BASE_PATH?`${process.env.APP_UI_BASE_PATH}`:"",P=`${process.env.SELF_HOST_BASEURL}${y}`,N={seekaAppId:d||"",seekaAppInstallId:k||"",organisationBrandId:u?.organisationBrandId||"",appBaseUrl:P,state:await i(u,o)};E=`window.seekaAppConfig = ${JSON.stringify(N)}`}if(a.startsWith("/api")){let g=await X();if(g)return g;let y=await s(a,t,u,o);return y||{status:404,jsonBody:{error:"Not found"}}}if(a==="/"||a==="/index.html"){let g=await X();if(g)return g;let y=`?${_}=${encodeURIComponent(h?.appAccessToken||"")}&${O}=${encodeURIComponent(h?.coreApiAccessToken||"")}&`;if(j()){let N=await ue("/index.html",o);if(N?.textBody){let Z=N.textBody;return Z=Z.replace(M+"?",M+y),{status:200,headers:{"Content-Type":"text/html","Referrer-Policy":"no-referrer",...p},cookies:f,body:Z}}}w=b.join(l,"index.html");let P=await Pt(w,"utf-8");P=P.replace(M+"?",M+y),E=P}else if(!E){if(j()){let g=await ue(a,o);if(g){let{textBody:y,...P}=g;return{...P,cookies:f}}}w=b.join(l,a),await A.access(w)}}catch(g){if(j()){let y=await ue("/index.html",o);if(y){let{textBody:P,...N}=y;return{...N,cookies:f}}}w=b.join(l,"index.html"),console.log("File not found, serving index.html",{err:g,requestedPath:a,buildPath:l,filePath:w,content:E})}return E||(E=await Pt(w)),{status:200,headers:{"Content-Type":await qr(w),"Referrer-Policy":"no-referrer",...p},cookies:f,body:E}},Ct=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=Ct.get(t);if(n)return n;let i=(await import("mime-types")).lookup(e);return i?(Ct.set(t,i),i):"application/octet-stream"}import bt from"fs/promises";import xt from"path";import Hr from"winston";var Wr=async e=>bt.stat(e).then(()=>!0).catch(()=>!1);async function Ln(e,t,n,r){let s=xt.resolve(xt.join(t,"seeka-browser-plugin.min.js"));return await Jr(e,s,n,r)}async function Jr(e,t,n,r){r.profile("http.seeka.browser.plugin");let i,s;try{r.verbose("Handling request for browser plugin content",{path:t}),await Wr(t)?(r.verbose("Browser plugin content found",{path:t}),i=await bt.readFile(t,"utf8"),s=`${e}(${JSON.stringify(n)})`):r.error("Browser plugin content not found",{path:t})}catch(o){r.error("Failed to handle request for browser plugin content",{ex:Hr.exceptions.getAllInfo(o)})}finally{r.profile("http.seeka.browser.plugin"),r.verbose("Request for browser plugin content handled")}if(!i||!s)throw new Error("Failed to handle request for browser plugin content");return{content:i,init:s}}export{R as appLogger,Sn as backgroundJobLogger,Ur as checkAuth,U as childLogger,_r as connect,dn as createOrUpdateInstallation,un as deleteInstallation,Or as disconnect,En as generateAppUiHttpRequestResponse,It as getAccessTokenAndCheck,G as getKey,mt as getList,on as getOrCreate,x as getOrCreateClient,kn as getOrInitLogger,Ln as getSeekaBrowserPlugin,Jr as getSeekaBrowserPluginByName,pt as isConnected,pn as listInstallations,yt as remove,ht as set,kt as startServices,an as stopServices,ft as tryGet,le as tryGetInstallation,In as webhookLogger};
1
+ var Et=Object.create;var ge=Object.defineProperty;var Nt=Object.getOwnPropertyDescriptor;var _t=Object.getOwnPropertyNames;var Ot=Object.getPrototypeOf,Rt=Object.prototype.hasOwnProperty;var m=(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 Ut=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Lt=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of _t(t))!Rt.call(e,i)&&i!==n&&ge(e,i,{get:()=>t[i],enumerable:!(r=Nt(t,i))||r.enumerable});return e};var Dt=(e,t,n)=>(n=e!=null?Et(Ot(e)):{},Lt(t||!e||!e.__esModule?ge(n,"default",{value:e,enumerable:!0}):n,e));var lt=Ut((Gr,ct)=>{"use strict";var Bt=Object.create,W=Object.defineProperty,$t=Object.getOwnPropertyDescriptor,Ft=Object.getOwnPropertyNames,Mt=Object.getPrototypeOf,jt=Object.prototype.hasOwnProperty,qt=(e,t)=>{for(var n in t)W(e,n,{get:t[n],enumerable:!0})},ye=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Ft(t))!jt.call(e,i)&&i!==n&&W(e,i,{get:()=>t[i],enumerable:!(r=$t(t,i))||r.enumerable});return e},I=(e,t,n)=>(n=e!=null?Bt(Mt(e)):{},ye(t||!e||!e.__esModule?W(n,"default",{value:e,enumerable:!0}):n,e)),Ht=e=>ye(W({},"__esModule",{value:!0}),e),ve={};qt(ve,{ActivityPipelineActivityFilterSourceItemType:()=>De,ActivityPipelineActivityFilterType:()=>Ue,AnalyticsLibrary:()=>$e,ApiException:()=>Ve,ApiServiceProxyBase:()=>ne,AppPermissionKeys:()=>C,ClickAttributionSourcePlatform:()=>Re,ConditionComparer:()=>Le,ConditionOperator:()=>Be,ConsentMappingMatchType:()=>We,ContentIdentificationBehavior:()=>Fe,ConvergePipelineLoggableActivityType:()=>Ne,ConvergeVendorDestinationPublishStrategy:()=>Me,CrossDomainTrackingUtmBehavior:()=>je,ECommerceContentType:()=>Te,ECommerceFinancialStatus:()=>Ee,ECommerceFulfillmentStatus:()=>be,ECommercePlatform:()=>xe,IabPrivacyConsentPurposeId:()=>He,IabPrivacyConsentPurposeIdMap:()=>sr,IdentityServiceProxy:()=>Se,IngestServiceProxy:()=>Ae,PrivacyConsentType:()=>Pe,PrivacyDataControlMode:()=>Je,RegionalConsentGrantOption:()=>qe,ResponseResultType:()=>we,SdkLogEventLevel:()=>_e,SeekaApiHelper:()=>et,SeekaAppCacheManager:()=>B,SeekaAppConfig:()=>Ie,SeekaAppHelper:()=>pr,SeekaWebhookCallType:()=>Oe,TrackingActivityNames:()=>H,TrackingEventSourceOriginType:()=>Ce,chunk:()=>te,cloneDeep:()=>fr,dateToUtcDateTimeReferenceString:()=>ze,decryptText:()=>it,emailAddress:()=>Ir,encryptText:()=>nt,generateNewSessionId:()=>q,getActivityName:()=>Vt,getActivityValue:()=>Pr,getContentIdFromProduct:()=>Cr,getContentNameFromProduct:()=>Tr,getIssuer:()=>se,getNestedProperty:()=>yr,getNewAppInstallToken:()=>Qe,getNewOrCachedAppInstallToken:()=>oe,getRandomNumberString:()=>Ge,isDeepEqual:()=>kr,isNumber:()=>mr,isValidSeekaProfileId:()=>xr,last:()=>at,lastOrDefault:()=>hr,matchActivityPipelineFilters:()=>wr,md5Hash:()=>Ye,parseFloat:()=>ot,parseInt:()=>gr,parseMoney:()=>ur,parseStr:()=>v,phoneNumberToE164:()=>Sr,separatePersonFullName:()=>Kt,setNestedProperty:()=>vr,throwOnInvalidWebhookSignature:()=>cr,urls:()=>br,validateWebhookSignature:()=>tt,webhookSignatureHeaderName:()=>re});ct.exports=Ht(ve);var Wt="3.10.2",ke=I(m("axios")),Ie=class{appId;appSecret;ingestUrl;issuerUrl;organisationId;applicationInstallId;runtime;logger;grantedPermissions;transformApiRequest;transformApiResponse;hasAnyPermissions;hasAllPermissions;hasPermission},ne=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)},Se=class extends ne{instance;baseUrl;jsonParseReviver=void 0;constructor(e,t,n){super(e),this.instance=n||ke.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(Ke(i)&&i.response)return i.response;throw i}).then(i=>this.transformResult(n,i,s=>this.processMerge(s)))}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),T("A server side error occurred.",t,r,n,i)}else if(t===401){let r=e.data,i=null;return i=JSON.parse(r),T("A server side error occurred.",t,r,n,i)}else if(t===422){let r=e.data,i=null;return i=JSON.parse(r),T("A server side error occurred.",t,r,n,i)}else if(t!==200&&t!==204){let r=e.data;return T("An unexpected server error occurred.",t,r,n)}return Promise.resolve(null)}},Ae=class extends ne{instance;baseUrl;jsonParseReviver=void 0;constructor(e,t,n){super(e),this.instance=n||ke.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(Ke(i)&&i.response)return i.response;throw i}).then(i=>this.transformResult(n,i,s=>this.processBatch(s)))}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),T("A server side error occurred.",t,r,n,i)}else if(t===401){let r=e.data,i=null;return i=JSON.parse(r),T("A server side error occurred.",t,r,n,i)}else if(t===422){let r=e.data,i=null;return i=JSON.parse(r),T("A server side error occurred.",t,r,n,i)}else if(t!==200&&t!==204){let r=e.data;return T("An unexpected server error occurred.",t,r,n)}return Promise.resolve(null)}},we=(e=>(e.Undefined="undefined",e.Success="success",e.Failed="failed",e))(we||{}),Pe=(e=>(e.Unknown="unknown",e.Informed="informed",e.Implied="implied",e.Explicit="explicit",e.Active="active",e.Passive="passive",e))(Pe||{}),Ce=(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))(Ce||{}),H=(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))(H||{}),Te=(e=>(e.Undefined="undefined",e.SingleProduct="singleProduct",e.SingleVariant="singleVariant",e.Collection="collection",e))(Te||{}),xe=(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))(xe||{}),be=(e=>(e.Undefined="undefined",e.Fulfilled="fulfilled",e.NoneFulfilled="noneFulfilled",e.PartiallyFulfilled="partiallyFulfilled",e.RestockedOrCancelled="restockedOrCancelled",e.Pending="pending",e))(be||{}),Ee=(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))(Ee||{}),Ne=(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))(Ne||{}),_e=(e=>(e.Information="information",e.Warning="warning",e.Error="error",e.Verbose="verbose",e))(_e||{}),Oe=(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))(Oe||{}),Re=(e=>(e.Unknown="unknown",e.Google="google",e.Meta="meta",e.Snapchat="snapchat",e.Pinterest="pinterest",e.TikTok="tikTok",e))(Re||{}),Ue=(e=>(e.Undefined="undefined",e.PurchaseMade="purchaseMade",e.ActivityTracked="activityTracked",e))(Ue||{}),Le=(e=>(e.Undefined="undefined",e.And="and",e.Or="or",e))(Le||{}),De=(e=>(e.Undefined="undefined",e.Domain="domain",e.Pipeline="pipeline",e.Wildcard="wildcard",e.Url="url",e.PagePath="pagePath",e))(De||{}),Be=(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))(Be||{}),$e=(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))($e||{}),Fe=(e=>(e.Default="default",e.Sku="sku",e.ProductId="productId",e.VariantId="variantId",e.ProductIdAndVariantIdUnderscore="productIdAndVariantIdUnderscore",e.VariantIdOrProductId="variantIdOrProductId",e))(Fe||{}),Me=(e=>(e.DeliverAllTraitsAndDeliverAllEvents="deliverAllTraitsAndDeliverAllEvents",e.DeliverAllTraitsAndDeliverEventsOnlyIfMaxWeightedTraitsPresent="deliverAllTraitsAndDeliverEventsOnlyIfMaxWeightedTraitsPresent",e.DeliverMaxWeightedTraitsOnlyAndDeliverAllEvents="deliverMaxWeightedTraitsOnlyAndDeliverAllEvents",e.DeliverMaxWeightedTraitsOnlyAndDeliverEventsOnlyIfMaxWeightedTraitsPresent="deliverMaxWeightedTraitsOnlyAndDeliverEventsOnlyIfMaxWeightedTraitsPresent",e))(Me||{}),je=(e=>(e.None="none",e.SessionPassthrough="sessionPassthrough",e.UrlPassthrough="urlPassthrough",e))(je||{}),qe=(e=>(e.Unset="unset",e.Granted="granted",e.Denied="denied",e))(qe||{}),He=(e=>(e.Undefined="undefined",e.MeasureAdvertisingPerformance="measureAdvertisingPerformance",e))(He||{}),We=(e=>(e.Undefined="undefined",e.AllOf="allOf",e.AnyOf="anyOf",e))(We||{}),Je=(e=>(e.Disabled="disabled",e.Explicit="explicit",e.Implicit="implicit",e))(Je||{}),Ve=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 T(e,t,n,r,i){throw i??new Ve(e,t,n,r,null)}function Ke(e){return e&&e.isAxiosError===!0}var D=m("openid-client"),ie=I(m("winston")),ee=I(m("memory-cache")),fe="seeka:sdk",B=class{constructor(e,t){this.appId=e,this.appInstallationId=t}appId;appInstallationId;set=async(e,t,n)=>{let r=this.getKey(e);ee.default.put(r,JSON.stringify(t),n)};getOrSet=async(e,t,n)=>{let r=this.getKey(e),i=ee.default.get(r);if(i){let o=JSON.parse(i);return n&&await n(o),o}let s=await t();return s?(ee.default.put(r,JSON.stringify(s.value),s.expiryAbsoluteMilliseconds),s.value):null};getKey=e=>this.appInstallationId?`${fe}:${this.appId}:${this.appInstallationId}:${e}`:`${fe}:${this.appId}:${e}`},Jt=I(m("crypto")),q=()=>{let e=ze(new Date),t=Ge();return`${e}.${t}`},Vt=e=>{let t=Object.keys(H),n=e.toLowerCase(),r=t.find(i=>i.toLowerCase()===n);return r?H[r]:"custom"},Ge=()=>Math.floor(Math.random()*(9999999999-1e9)+1e9).toString(),ze=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 s=e.getUTCSeconds().toString();return s.length<2&&(s="0"+s),`${e.getUTCFullYear()}${t}${n}.${r}${i}${s}`},Ye=e=>Jt.createHash("md5").update(e).digest("hex"),Kt=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(" ")}},te=(e,t)=>e.reduce((n,r,i)=>{let s=Math.floor(i/t);return n[s]||(n[s]=[]),n[s].push(r),n},[]),se=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 B(e.appId,e.applicationInstallId),r=Ye(e.issuerUrl+"_"+e.appId),i=await n.getOrSet(r,async()=>{try{let s=await Gt(e);return!s||!s.meta||!s.raw?null:(e.logger?e.logger.verbose("Seeka auth: got issuer from remote",{...t}):console.debug("Seeka auth: got issuer from remote",{...t}),{value:s.meta,expiryAbsoluteMilliseconds:1e3*60*60})}catch(s){return e.logger?e.logger.error("Seeka auth: failed getting issuer",{...t,ex:ie.default.exceptions.getAllInfo(s)}):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 D.Configuration(i.serverMetadata,i.clientId,e.appSecret)},Gt=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,D.discovery)(new URL(e.issuerUrl),n,void 0,(0,D.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:ie.default.exceptions.getAllInfo(n)}):console.error("Seeka auth: failed discovering issuer from remote",{...t,err:n}),null}},zt=async e=>{let t={applicationId:e.appId,issuer:{url:e.issuerUrl}},n=await se(e);if(!n)return null;try{let r=await(0,D.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:ie.default.exceptions.getAllInfo(r)}),null}},Qe=async(e,t)=>{let n={applicationId:t.appId,issuer:{url:t.issuerUrl}},r=await se(t);if(!r||!r)return null;try{let i=await(0,D.genericGrantRequest)(r,"app_install_token",{applicationInstallId:t.applicationInstallId,access_token:e,scope:"Seeka.API.Ingest"}),s={...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",{...s}):console.info("Seeka auth: got app access token from server",{...s}),{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 s={...n,error:i};return t.logger?t.logger.error("Seeka auth: failed to get app access token from server",{...s}):console.debug("Seeka auth: failed to get app access token from server",{...s}),null}},oe=async e=>{let t=new B(e.appId,e.applicationInstallId),n={applicationId:e.appId,issuer:{url:e.issuerUrl}};return await t.getOrSet("auth:token:appinstall",async()=>{let r=await zt(e);if(!r||!r.access_token)return null;let i=await Qe(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})})},Xe="https://router.seeka.services",Yt="https://router.seeka.services/tel/otel",Ze="https://account.seeka.app",Qt=(e,t,n,r,i)=>{let s=new Ie;return s.appId=e.applicationId,s.appSecret=t,s.ingestUrl=process.env.SEEKA_INGEST_URL||Xe,s.issuerUrl=process.env.SEEKA_ISSUER_URL||Ze,s.organisationId=e.organisationId,s.applicationInstallId=e.applicationInstallId,s.runtime={type:"sdk/js/apps-server",ver:Wt.split("-")[0],client:n},s.logger=i,s.grantedPermissions=r,s.transformApiRequest=o=>Xt(s,o),s.transformApiResponse=async(o,c,a)=>Zt(s,o,c,a),s.hasAnyPermissions=o=>!s.grantedPermissions||s.grantedPermissions.length===0?!1:!o||o.length===0?!0:o.some(c=>s.grantedPermissions.includes(c)),s.hasAllPermissions=o=>!s.grantedPermissions||s.grantedPermissions.length===0?!1:!o||o.length===0?!0:o.every(c=>s.grantedPermissions.includes(c)),s.hasPermission=o=>!s.grantedPermissions||s.grantedPermissions.length===0?!1:o?s.grantedPermissions.includes(o):!0,s},Xt=async(e,t)=>{let n=await oe(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},Zt=async(e,t,n,r)=>(n.data=JSON.stringify(n.data),r(n)),C={identity:{receiveFull:"Identity.Receive.Pii",send:"Identity.Send"},activity:{receiveAnon:"Activity.Receive.Anon",receiveFull:"Activity.Receive.Pii",send:"Activity.Send"}},er=I(m("axios")),tr=I(m("http")),rr=I(m("https")),nr=new tr.default.Agent({keepAlive:!0,scheduling:"fifo"}),ir=new rr.default.Agent({keepAlive:!0,scheduling:"fifo"}),me=e=>{let t=er.default.create({httpAgent:nr,httpsAgent:ir});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:s}=n,{headers:o,url:c,method:a}=n?.config,l={code:r,status:i,message:s,headers:o,url:c,method:a,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},he={getIdentityService:e=>new Se(e,e.ingestUrl,me(e)),getIngestService:e=>new Ae(e,e.ingestUrl,me(e))},et=class{constructor(e){this.config=e,this.ingestionService=he.getIngestService(e),this.identityService=he.getIdentityService(e)}config;maxBatchSize=50;refreshOrPrimeTokenCache=async()=>{await oe(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(C.identity.send,"mergeIdentity");let n=q();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(C.identity.send,"mergeIdentityBatch");let n=q();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=te(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(s=>({id:{id:s||{},src:{...r}}}))}),i.length>1){let s=i.map((o,c)=>c===0?Promise.resolve():(this.config.logger?.verbose(`Processing identity batch ${c+1} of ${i.length}`),this.trackActivityBatchRaw({data:o.map(a=>({id:{id:a||{},src:{...r}}}))})));await Promise.all(s)}};trackActivityBatch=async(e,t)=>{this.checkPermission(C.activity.send,"trackActivityBatch");let n=q();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=te(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(s=>({ev:{id:s.profile||{},src:{...r},payload:s.activity}}))}),i.length>1){let s=i.map((o,c)=>c===0?Promise.resolve():(this.config.logger?.verbose(`Processing activity batch ${c+1} of ${i.length}`),this.trackActivityBatchRaw({data:o.map(a=>({ev:{id:a.profile||{},src:{...r},payload:a.activity}}))})));await Promise.all(s)}};trackActivityBatchRaw=async e=>{await this.ingestionService.batch(e)};trackActivityForProfileId=async(e,t,n)=>{this.checkPermission(C.activity.send,"trackActivityForProfileId"),await this.trackActivityForProfileIdBatch([e],t,n)};trackActivityForProfileIdBatch=async(e,t,n)=>{this.checkPermission(C.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(C.activity.send,"trackActivityForProfile"),await this.trackActivityForProfileBatch([e],t,n)};trackActivityForProfileBatch=async(e,t,n)=>{this.checkPermission(C.activity.send,"trackActivityForProfileBatch"),await this.trackActivityBatch(e.map(r=>({activity:r,profile:t})),n)}},sr={measureAdvertisingPerformance:7},or=I(m("crypto")),re="x-seeka-signature-sha256",tt=(e,t,n)=>{if(!t)return!1;let r=null;if(t.get&&typeof t.get=="function")r=t.get(re);else{let s=t[re];s&&(Array.isArray(s)&&s.length>0?r=s[0]:(typeof s=="string"||s instanceof String)&&(r=s))}if(!r)return!1;let i=ar(e,n)===r;return i||console.warn("Invalid webhook signature"),i},ar=(e,t)=>or.createHmac("sha256",e).update(t).digest("hex"),cr=(e,t,n)=>{if(!tt(e,t,n))throw new Error("Invalid webhook signature")},L=I(m("crypto")),rt="aes-192-cbc",nt=(e,t)=>{if(!e)return"";if(!t)throw new Error("Secret is required to encrypt data");let n=L.default.scryptSync(t,"salt",24),r=L.default.randomBytes(16),i=L.default.createCipheriv(rt,n,r);return[i.update(e,"utf8","hex")+i.final("hex"),Buffer.from(r).toString("hex")].join("|")},it=(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=L.default.scryptSync(t,"salt",24),s=L.default.createDecipheriv(rt,i,Buffer.from(r,"hex"));return s.update(n,"hex","utf8")+s.final("utf8")},lr=class{constructor(e){this.appSecret=e}appSecret;encryptWithAppSecret=e=>{if(!this.appSecret)throw new Error("App secret is required to encrypt data");return nt(e,this.appSecret)};decryptWithAppSecret=e=>{if(!this.appSecret)throw new Error("App secret is required to decrypt data");return it(e,this.appSecret)}},pr=class st{constructor(t,n){this.context=t,this.api=new et(t.config),this.appCache=new B(t.config.appId),this.appInstallCache=new B(t.config.appId,t.config.applicationInstallId),this.crypto=new lr(t.config.appSecret),this.logger=n}context;appCache;appInstallCache;api;logger;crypto;static create=(t,n,r,i,s)=>new st({config:Qt({...n},t,{type:r.name,ver:r.version.split("-")[0]},i,s)},s)},dr=I(m("winston")),J=m("lodash-es"),v=e=>e==null||e===""||String(e).trim()===""?"":String(e);function ot(e){if(e==null||e==="")return 0;let t=e.toString().replace(/[^0-9.]/g,"");return Number.isNaN(Number(t))?0:Number(t)}function ur(e){if(e==null||e===0||e==="")return+"0.00";let t=ot(e);return Number(t.toFixed(3))}function gr(e){return e==null||e===""||Number.isNaN(Number(e.toString()))?0:Math.floor(Number(e))}function fr(e){return JSON.parse(JSON.stringify(e))}function mr(e){return/^-?\d+$/.test(e)}function hr(e){if(!(e==null||e.length===0))return at(e)}function at(e){return(0,J.last)(e)}function yr(e,t){return(0,J.get)(e,t)}function vr(e,t,n){return(0,J.set)(e,t,n)}function kr(e,t){return(0,J.isEqual)(e,t)}function Ir(e){return e?e.trim().toLowerCase():""}function Sr(e){return e==null?"":(e=e.trim().replace(/-/gi,"").replace(/\(/gi,"").replace(/\)/gi,"").replace(/ /g,"").replace(/\+/g,""),e)}var Ar=["order","subscriptionItemPurchase","oneTimeItemPurchase"],wr=(e,t,n)=>{if(!e.activity)return[];let r=e.activity,i=r.activityName==="custom"?r.activityNameCustom:r.activityName;if(!i)return[];let s=i.toLowerCase(),o=[];return t.forEach(c=>{if(!c)return;switch(c.type){case"activityTracked":{if(!c.activityNames||!c.activityNames.find(p=>p.toLowerCase()===s))return;n.verbose("Matched activity tracked filter",{filter:c,activityName:i});break}case"purchaseMade":{if(!r.activityName||!Ar.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 a=c.sourceFilter;if(!a)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:dr.default.exceptions.getAllInfo(p),activitySource:l}),d=null}let k=l?.pipeline?.convergePipelineIntegrationInstanceId?.toLowerCase(),u=a.filters?a.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(a.comparer){case"and":{u.every(p=>p===!0)&&o.push(c);break}case"or":{u.some(p=>p===!0)&&o.push(c);break}default:{n.warn("Unknown source filter comparer",{sourceFilters:a});break}}}),o},Pr=(e,t=!1)=>{let n=e.commerce,r=n?.totalPrice||n?.products?.map(s=>(s.unitPrice||0)*(s.quantity||1)).reduce((s,o)=>s+o,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(s=>s&&s.unitPrice?s.unitPrice*(s.quantity||1):0).reduce((s,o)=>s+o,0)),r&&(i=e?.contentItem?.currencyCode||e?.commerce?.currencyCode||null,!i))){let s=e?.contentItem?.items?.filter(o=>o.currencyCode)||[];s.length>0&&(i=s[0].currencyCode||null)}if((!r||r<=0)&&e?.commerce?.products&&e?.commerce?.products.length>0&&(r=e?.commerce?.products.map(s=>s&&s.unitPrice?s.unitPrice*(s.quantity||1):0).reduce((s,o)=>s+o,0),r&&(i=e?.commerce?.currencyCode||null,!i))){let s=e?.commerce?.products?.filter(o=>o.currencyCode)||[];s.length>0&&(i=s[0].currencyCode||null)}return(!r||r<=0)&&!i?null:{value:r===0&&t?null:r||null,currencyCode:i}};function Cr(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=v(t.analytics?.libraries?.googleAnalytics?.merchant?.productItemIdPrefix));let s;switch(r){case"sku":s=e?.sku;break;case"productId":s=e?.productIdentifier;break;case"variantId":s=e?.variantIdentifier;break;case"productIdAndVariantIdUnderscore":v(e.variantIdentifier)&&v(e.productIdentifier)?s=`${e.productIdentifier}_${e.variantIdentifier}`:v(e.variantIdentifier)?s=e.variantIdentifier:s=e.productIdentifier;break;case"variantIdOrProductId":v(e.variantIdentifier)?s=e.variantIdentifier:s=e.productIdentifier;break;default:s=v(e?.sku)||v(e?.variantIdentifier)||v(e?.productIdentifier);break}return i?`${i}${s}`:s}function Tr(e,t){return v(e?.variantName)||v(e?.productName)}function xr(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 br={defaultIssuerUrl:Ze,defaultTelemetryUrl:Yt,defaultIngestUrl:Xe}});var K=Dt(lt());import{createClient as Er}from"redis";import*as V from"winston";var Nr=()=>{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__",x=e=>{if(global[ae])return global[ae];let t=Er({url:Nr(),disableClientInfo:!0}).on("error",n=>e.error("Redis Client ",{ex:V.exceptions.getAllInfo(n)}));return global[ae]=t,t},_r=async e=>{await x(e).connect()},pt=async e=>x(e).isOpen,Or=async e=>{x(e).destroy()},dt=e=>`seeka:app:${process.env.SEEKA_APP_ID}:${e}`,G=(e,t)=>`${dt(e)}:${t}`,$=e=>e==="install",ut=()=>{let e=process.env.DATA_ENCRYPTION_KEY;if(!e)throw new Error("DATA_ENCRYPTION_KEY is required to encrypt/decrypt installation state");return e},gt=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)},ce=e=>{if(!gt(e))return{plainText:e,wasEncrypted:!1};let t=ut();return{plainText:(0,K.decryptText)(e,t),wasEncrypted:!0}},F=e=>{if(gt(e))return{encryptedText:e,wasEncrypted:!0};let t=ut();return{encryptedText:(0,K.encryptText)(e,t),wasEncrypted:!1}};async function on(e,t,n,r="string",i){let s=G(e,t),o=x(i),c=await vt(o,s);if(c){if(r==="string"&&$(e)){let{plainText:a,wasEncrypted:l}=ce(c);if(!l){let{encryptedText:d}=F(c);await o.set(s,d)}return JSON.parse(a)}return JSON.parse(c)}if(r==="json")await o.json.set(s,"$",n);else{let a=JSON.stringify(n);if($(e)){let{encryptedText:l}=F(a);await o.set(s,l)}else await o.set(s,a)}return n}async function ft(e,t,n="string",r){let i=G(e,t),s=x(r);if(n==="json"){let o=await s.json.get(i);if(o)return o}else{let o=await vt(s,i);if(o){if($(e)){let{plainText:c,wasEncrypted:a}=ce(o);if(!a){let{encryptedText:l}=F(o);await s.set(i,l)}return JSON.parse(c)}return JSON.parse(o)}}return null}async function mt(e,t){let n=dt(e),r=x(t),i=await r.keys(`${n}:*`),s=await r.mGet(i);if(s){let o=[];for(let c=0;c<s.length;c++){let a=s[c],l=i[c];if(!a)continue;let d=a;if($(e)){let{plainText:k,wasEncrypted:u}=ce(d);if(!u){let{encryptedText:p}=F(d);await r.set(l,p)}o.push(JSON.parse(k))}else o.push(JSON.parse(d))}return o}return[]}async function ht(e,t,n,r="string",i){let s=G(e,t),o=x(i);if(r==="json")await o.json.set(s,"$",n);else{let c=JSON.stringify(n);if($(e)){let{encryptedText:a}=F(c);await o.set(s,a)}else await o.set(s,c)}}async function yt(e,t,n){let r=G(e,t);await x(n).del(r)}async function vt(e,t){let n=await e.get(t);return typeof n=="string"?n:n?n.toString():""}var kt=async e=>{e.debug(`Trying to connect to Redis - ${process.env.REDIS_CONNECTION_HOST}`);try{await pt(e)?e.verbose(`Redis already connected - ${process.env.REDIS_CONNECTION_HOST}`):(e.profile("service.redis.connect"),await _r(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:V.exceptions.getAllInfo(t)}),t}},an=async e=>{e.debug(`Trying to disconnect from Redis - ${process.env.REDIS_CONNECTION_HOST}`);try{await pt(e)===!1?e.verbose(`Redis already disconnected - ${process.env.REDIS_CONNECTION_HOST}`):(e.profile("service.redis.disconnect"),await Or(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:V.exceptions.getAllInfo(t)}),t}};var z="install",le=async(e,t,n)=>{let r=await ft(z,e,"string",n);if(r==null&&t)throw n.error(`Seeka installation ${e} not found`),new Error(`Seeka installation ${e} not found`);return r},pn=async e=>await mt(z,e),dn=async(e,t)=>{e.installationState||(e.installationState={}),e.installedAt||(e.installedAt=new Date().toISOString());let n=await le(e.applicationInstallId,!1,t)===null;return await ht(z,e.applicationInstallId,e,"string",t),t.info(n?"Created installation state":"Updated installation state",{applicationInstallId:e.applicationInstallId,organisationId:e.organisationId,organisationBrandId:e.organisationBrandId}),e},un=async(e,t)=>{await yt(z,e,t),t.info("Deleted installation state",{applicationInstallId:e})};var Y=e=>"seeka_app_"+e+"_at_app",Q=e=>"seeka_app_"+e+"_at_core",pe="X-Seeka-App-Token",de="X-Seeka-CoreApi-Token",_="at_app",O="at_core";import Rr from"jsonwebtoken";var It=async(e,t,n,r)=>{let i=new URL(e),s=t.get("Cookie"),o=i.searchParams.get(_)||"";if(!o&&t.get(pe)&&(o=t.get(pe)?.split("Bearer ")[1]),!o&&s){let a=s.split(";").find(l=>l.trim().startsWith(Y(process.env.SEEKA_APP_ID)));a&&(o=a.split("=")[1])}let c=i.searchParams.get(O)||"";if(!c&&t.get(de)&&(c=t.get(de)?.split("Bearer ")[1]),!c&&s){let a=s.split(";").find(l=>l.trim().startsWith(Q(process.env.SEEKA_APP_ID)));a&&(c=a.split("=")[1])}return await Ur(o,c,n,r)},Ur=async(e,t,n,r)=>{let i,s,o;if(e)try{let a=Rr.verify(e,process.env.SEEKA_APP_SECRET,{ignoreNotBefore:!0});if(r.info("Decoded token",{decoded:a}),!a.appId||a.appId.replace(/-/g,"")!==process.env.SEEKA_APP_ID.replace(/-/g,"")){r.error("Invalid token - app id does not match",{decoded:a,appIdToken:a.appId,appIdEnv:process.env.SEEKA_APP_ID});return}else i=a.appId;if(a.appInstallId)s=a.appInstallId;else{r.error("Invalid token - no appInstallId",{decoded:a});return}o=a.exp}catch(a){r.error("Failed to validate token",{err:a});return}else{r.error("No access token present");return}n&&await n(r);let c=await le(s,!1,r);if(c==null){r.warn("UI call cannot be processed as the installation ID is not known by this app",{seekaAppInstallId:s});return}return{appAccessToken:e,coreApiAccessToken:t,seekaAppId:i,seekaAppInstallId:s,expiresAt:o,installation:c}};import*as A from"fs/promises";import b from"path";import*as S from"winston";var R,St={},kn=(e,t)=>{if(R)return R;let n=[new S.transports.Console({level:t.LOGGING_LEVEL,format:S.format.combine(S.format.errors({stack:!0}),S.format.cli(),S.format.splat()),handleExceptions:!0,handleRejections:!0})];return R=S.createLogger({level:t.LOGGING_LEVEL,transports:n,exitOnError:!1,defaultMeta:St}),R.info("Seeka app logger initialized"),R},U=(e,t,n=R,r={})=>n.child({...St,...e,...t?{"seeka.app.install.id":t.applicationInstallId,"seeka.app.install.brand.id":t.organisationBrandId,"seeka.app.install.org.id":t.organisationId,...r?.invocationId?{"faas.invocation_id":r.invocationId}:{}}:{}}),In=(e,t)=>{let n={"seeka.app.webhook.type":e.type,"seeka.app.webhook.test":e.isTest,"seeka.app.webhook.id":e.requestId,"seeka.app.webhook.correlationId":e.causationId,"seeka.app.webhook.causationId":e.causationId,"faas.invocation_id":t.invocationId},r=e.context;return r&&(n["seeka.app.install.id"]=r.applicationInstallId,n["seeka.app.install.brand.id"]=r.organisationBrandId,n["seeka.app.install.org.id"]=r.organisationId),U(n)},Sn=(e,t,n)=>{let r={jobContext:t,jobName:e,"faas.invocation_id":n.invocationId,"seeka.app.job.correlationId":t?.causationId,"seeka.app.job.causationId":t?.causationId,"seeka.app.install.id":t?.applicationInstallId??t?.payload.applicationInstallId,"seeka.app.install.brand.id":t?.organisationBrandId,"seeka.app.install.org.id":t?.organisationId};return U(r)};var Lr="seeka-cli-developer",Dr="https://api.seeka.services",At="http://localhost:3000",j=()=>process.env.SEEKA_DEVELOPER_MODE==="true";async function Tt(e){try{let t=await A.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async function Br(e,t){await A.mkdir(b.dirname(e),{recursive:!0}),await A.writeFile(e,JSON.stringify(t,null,2),{mode:384})}async function $r(e){let n=`${e.issuerUrl.replace(/\/+$/,"")}/connect/token`,r=new URLSearchParams({grant_type:"refresh_token",refresh_token:e.refreshToken,client_id:Lr}),i=await fetch(n,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:r.toString()});if(!i.ok){let s=await i.text();throw new Error(`Token refresh failed (${i.status}): ${s}`)}return i.json()}async function Fr(e){let t=b.join(e,".seeka","developer","credentials.json"),n=await Tt(t);if(!n)throw new Error("Developer credentials not found. Run `seeka auth login` first.");if(new Date(n.expiresAt)<new Date){let r=await $r(n),i={...n,accessToken:r.access_token,refreshToken:r.refresh_token||n.refreshToken,expiresAt:new Date(Date.now()+r.expires_in*1e3).toISOString()};return await Br(t,i),i.accessToken}return n.accessToken}async function Mr(e){let t=process.cwd(),n=b.join(t,".seeka","developer","context","active.json"),r=await Tt(n);if(!r)return{status:500,jsonBody:{error:"No active developer context found. Run `seeka app context set` first."}};e.info("Developer mode: /dev/open",{brandId:r.brandId,installId:r.installId});let i;try{i=await Fr(t)}catch(f){return e.error("Developer mode: failed to get access token",{err:f}),{status:500,jsonBody:{error:"Failed to get developer access token. Check server logs for details."}}}let o=`${process.env.SEEKA_DEVELOPER_API_URL||Dr}/api/converge/pipeline/integration/connection/${r.installId}/url/landing`,c;try{c=await fetch(o,{method:"GET",headers:{Authorization:`Bearer ${i}`}})}catch(f){return e.error("Developer mode: failed to call landing URL API",{err:f}),{status:502,jsonBody:{error:"Failed to call Seeka API. Check server logs for details."}}}if(!c.ok){let f=await c.text();return e.error("Developer mode: landing URL API returned error",{status:c.status,text:f}),{status:502,jsonBody:{error:`Seeka API returned status ${c.status}. Check server logs for details.`}}}let a=await c.json(),l=a.result!==void 0?a.result:a;if(!l||typeof l!="string")return e.error("Developer mode: unexpected landing URL response",{responseJson:a}),{status:502,jsonBody:{error:"Unexpected response from Seeka API: no landing URL returned"}};let d=new URL(l),k=d.searchParams.get(_)||"",u=d.searchParams.get(O)||"",p=`/app/?${_}=${encodeURIComponent(k)}&${O}=${encodeURIComponent(u)}`;return e.info("Developer mode: redirecting to app with tokens",{localRedirect:p.substring(0,50)+"..."}),{status:302,headers:{Location:p}}}async function ue(e,t){let n=`${At}${e}`;try{let r=await fetch(n);if(!r.ok){if(r.status===404){let o=await fetch(`${At}/index.html`);if(o.ok){let c=await o.text();return{status:200,headers:{"Content-Type":"text/html"},body:c,textBody:c}}}return null}let i=r.headers.get("Content-Type")||"application/octet-stream";if(i.includes("text/")||i.includes("javascript")||i.includes("json")){let o=await r.text();return{status:200,headers:{"Content-Type":i},body:o,textBody:o}}let s=await r.arrayBuffer();return{status:200,headers:{"Content-Type":i},body:Buffer.from(s)}}catch(r){return t.warn("Developer mode: Vite dev server proxy failed, falling back to static files",{err:r,viteUrl:n}),null}}var wt=!1;function jr(e){wt||(wt=!0,j()&&e.info("Seeka Developer Mode is ACTIVE - /dev/open route enabled, Vite HMR proxy enabled (port 3000)"))}async function Pt(e,t){return await A.readFile(e,{encoding:t})}var M="config.js",En=async(e,t,n,r,i,s)=>{let o=U(null,void 0,void 0,r);o.profile("http.seeka.webhook.app.ui"),jr(o);let a=new URL(e).pathname?.replace(/^\/app/,"")||"/";if(o.verbose("Received Seeka UI request",{requestedPath:a,url:e,method:t}),j()&&a==="/dev/open")return Mr(o);let l=b.resolve("./dist/src/ui/build"),d=null,k=null,u,p={},f=[],h,X=async()=>a==="/health"?null:(h=await It(e,n,()=>kt(o),o),h?(d=h.seekaAppId,k=h.seekaAppInstallId,u=h.installation,o=U(null,u,o,r),o.verbose("Authenticated Seeka UI request",{requestedPath:a,url:e,method:t}),o=U(null,u,o,r),f.push({name:Y(process.env.SEEKA_APP_ID),value:h.appAccessToken,httpOnly:!0,secure:!0,sameSite:"None",expires:new Date(h.expiresAt*1e3)}),f.push({name:Q(process.env.SEEKA_APP_ID),value:h.coreApiAccessToken,httpOnly:!0,secure:!0,sameSite:"None",expires:new Date(h.expiresAt*1e3)}),null):{status:403,jsonBody:{error:"Invalid token"}}),w=b.join(l,a),E;try{if(a==="/health")return{status:200,jsonBody:{status:"ok"}};if(a==="/"+M){let g=await X();if(g)return g;let y=process.env.APP_UI_BASE_PATH?`${process.env.APP_UI_BASE_PATH}`:"",P=`${process.env.SELF_HOST_BASEURL}${y}`,N={seekaAppId:d||"",seekaAppInstallId:k||"",organisationBrandId:u?.organisationBrandId||"",appBaseUrl:P,state:await i(u,o)};E=`window.seekaAppConfig = ${JSON.stringify(N)}`}if(a.startsWith("/api")){let g=await X();if(g)return g;let y=await s(a,t,u,o);return y||{status:404,jsonBody:{error:"Not found"}}}if(a==="/"||a==="/index.html"){let g=await X();if(g)return g;let y=`?${_}=${encodeURIComponent(h?.appAccessToken||"")}&${O}=${encodeURIComponent(h?.coreApiAccessToken||"")}&`;if(j()){let N=await ue("/index.html",o);if(N?.textBody){let Z=N.textBody;return Z=Z.replace(M+"?",M+y),{status:200,headers:{"Content-Type":"text/html","Referrer-Policy":"no-referrer",...p},cookies:f,body:Z}}}w=b.join(l,"index.html");let P=await Pt(w,"utf-8");P=P.replace(M+"?",M+y),E=P}else if(!E){if(j()){let g=await ue(a,o);if(g){let{textBody:y,...P}=g;return{...P,cookies:f}}}w=b.join(l,a),await A.access(w)}}catch(g){if(j()){let y=await ue("/index.html",o);if(y){let{textBody:P,...N}=y;return{...N,cookies:f}}}w=b.join(l,"index.html"),console.log("File not found, serving index.html",{err:g,requestedPath:a,buildPath:l,filePath:w,content:E})}return E||(E=await Pt(w)),{status:200,headers:{"Content-Type":await qr(w),"Referrer-Policy":"no-referrer",...p},cookies:f,body:E}},Ct=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=Ct.get(t);if(n)return n;let i=(await import("mime-types")).lookup(e);return i?(Ct.set(t,i),i):"application/octet-stream"}import bt from"fs/promises";import xt from"path";import Hr from"winston";var Wr=async e=>bt.stat(e).then(()=>!0).catch(()=>!1);async function Ln(e,t,n,r){let s=xt.resolve(xt.join(t,"seeka-browser-plugin.min.js"));return await Jr(e,s,n,r)}async function Jr(e,t,n,r){r.profile("http.seeka.browser.plugin");let i,s;try{r.verbose("Handling request for browser plugin content",{path:t}),await Wr(t)?(r.verbose("Browser plugin content found",{path:t}),i=await bt.readFile(t,"utf8"),s=`${e}(${JSON.stringify(n)})`):r.error("Browser plugin content not found",{path:t})}catch(o){r.error("Failed to handle request for browser plugin content",{ex:Hr.exceptions.getAllInfo(o)})}finally{r.profile("http.seeka.browser.plugin"),r.verbose("Request for browser plugin content handled")}if(!i||!s)throw new Error("Failed to handle request for browser plugin content");return{content:i,init:s}}export{R as appLogger,Sn as backgroundJobLogger,Ur as checkAuth,U as childLogger,_r as connect,dn as createOrUpdateInstallation,un as deleteInstallation,Or as disconnect,En as generateAppUiHttpRequestResponse,It as getAccessTokenAndCheck,G as getKey,mt as getList,on as getOrCreate,x as getOrCreateClient,kn as getOrInitLogger,Ln as getSeekaBrowserPlugin,Jr as getSeekaBrowserPluginByName,pt as isConnected,pn as listInstallations,yt as remove,ht as set,kt as startServices,an as stopServices,ft as tryGet,le as tryGetInstallation,In as webhookLogger};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seeka-labs/sdk-apps-server-host",
3
- "version": "3.10.1",
3
+ "version": "3.10.2",
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.10.1",
36
- "@seeka-labs/sdk-apps-server": "3.10.1",
35
+ "@seeka-labs/sdk-apps-core": "3.10.2",
36
+ "@seeka-labs/sdk-apps-server": "3.10.2",
37
37
  "@types/jest": "^30",
38
38
  "@types/memory-cache": "^0",
39
39
  "@types/mime-types": "^3",