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