@seeka-labs/sdk-apps-server 2.0.16-alpha.0 → 2.0.19-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +19 -19
- package/dist/sdk-apps-server.js +1 -1
- package/dist/sdk-apps-server.js.map +1 -1
- package/dist/sdk-apps-server.module.js +1 -1
- package/dist/sdk-apps-server.module.js.map +1 -1
- package/dist/types/src/api/privacy/models/index.d.ts +0 -4
- package/dist/types/src/api/privacy/models/index.d.ts.map +1 -1
- package/dist/types/src/api/services/index.d.ts +369 -0
- package/dist/types/src/api/services/index.d.ts.map +1 -1
- package/package.json +2 -2
package/LICENSE
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
4
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
5
|
-
in the Software without restriction, including without limitation the rights
|
|
6
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
7
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
8
|
-
furnished to do so, subject to the following conditions:
|
|
9
|
-
|
|
10
|
-
The above copyright notice and this permission notice shall be included in all
|
|
11
|
-
copies or substantial portions of the Software.
|
|
12
|
-
|
|
13
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
14
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
15
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
16
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
17
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
18
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
19
|
-
SOFTWARE.
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
4
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
5
|
+
in the Software without restriction, including without limitation the rights
|
|
6
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
7
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
8
|
+
furnished to do so, subject to the following conditions:
|
|
9
|
+
|
|
10
|
+
The above copyright notice and this permission notice shall be included in all
|
|
11
|
+
copies or substantial portions of the Software.
|
|
12
|
+
|
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
16
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
17
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
18
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
19
|
+
SOFTWARE.
|
package/dist/sdk-apps-server.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var e=require("crypto"),t=require("axios"),i=require("openid-client"),r=require("winston"),s=require("memory-cache"),o=require("http"),n=require("https");function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function c(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach(function(i){if("default"!==i){var r=Object.getOwnPropertyDescriptor(e,i);Object.defineProperty(t,i,r.get?r:{enumerable:!0,get:function(){return e[i]}})}}),t.default=e,t}var l,d,p,u,h,g,v,m,f,y,k,A,P,S,I,x,w=/*#__PURE__*/c(e),C=/*#__PURE__*/a(e),b=/*#__PURE__*/a(t),T=/*#__PURE__*/c(i),E=/*#__PURE__*/a(r),N=/*#__PURE__*/c(s),_=/*#__PURE__*/a(o),U=/*#__PURE__*/a(n);class O{constructor(){this.appId=void 0,this.appSecret=void 0,this.ingestUrl=void 0,this.issuerUrl=void 0,this.organisationId=void 0,this.applicationInstallId=void 0,this.runtime=void 0,this.logger=void 0,this.grantedPermissions=void 0,this.transformApiRequest=void 0,this.transformApiResponse=void 0,this.hasAnyPermissions=void 0,this.hasAllPermissions=void 0,this.hasPermission=void 0}}class F{constructor(e){this.config=void 0,this.transformOptions=async e=>await this.config.transformApiRequest(e),this.transformResult=async(e,t,i)=>await this.config.transformApiResponse(e,t,i),this.config=e}}class B extends F{constructor(e,t,i){super(e),this.instance=void 0,this.baseUrl=void 0,this.jsonParseReviver=void 0,this.instance=i||b.default.create(),this.baseUrl=null!=t?t:"https://api-localdev-env0-seeka.au.ngrok.io"}merge(e,t){let i=this.baseUrl+"/api/identity";i=i.replace(/[?&]$/,"");const r=JSON.stringify(e);return this.transformOptions({data:r,method:"POST",url:i,headers:{"Content-Type":"application/json",Accept:"application/json"},cancelToken:t}).then(e=>this.instance.request(e)).catch(e=>{if($(e)&&e.response)return e.response;throw e}).then(e=>this.transformResult(i,e,e=>this.processMerge(e)))}processMerge(e){const t=e.status;let i={};if(e.headers&&"object"==typeof e.headers)for(const t in e.headers)e.headers.hasOwnProperty(t)&&(i[t]=e.headers[t]);if(200===t){let t=null;return t=JSON.parse(e.data),Promise.resolve(t)}if(401===t){const r=e.data;let s=null;return s=JSON.parse(r),R("A server side error occurred.",t,r,i,s)}if(422===t){const r=e.data;let s=null;return s=JSON.parse(r),R("A server side error occurred.",t,r,i,s)}if(400===t){const r=e.data;let s=null;return s=JSON.parse(r),R("A server side error occurred.",t,r,i,s)}return 200!==t&&204!==t?R("An unexpected server error occurred.",t,e.data,i):Promise.resolve(null)}}class L extends F{constructor(e,t,i){super(e),this.instance=void 0,this.baseUrl=void 0,this.jsonParseReviver=void 0,this.instance=i||b.default.create(),this.baseUrl=null!=t?t:"https://api-localdev-env0-seeka.au.ngrok.io"}batch(e,t){let i=this.baseUrl+"/api/ingest";i=i.replace(/[?&]$/,"");const r=JSON.stringify(e);return this.transformOptions({data:r,method:"POST",url:i,headers:{"Content-Type":"application/json"},cancelToken:t}).then(e=>this.instance.request(e)).catch(e=>{if($(e)&&e.response)return e.response;throw e}).then(e=>this.transformResult(i,e,e=>this.processBatch(e)))}processBatch(e){const t=e.status;let i={};if(e.headers&&"object"==typeof e.headers)for(const t in e.headers)e.headers.hasOwnProperty(t)&&(i[t]=e.headers[t]);if(202===t)return Promise.resolve(null);if(401===t){const r=e.data;let s=null;return s=JSON.parse(r),R("A server side error occurred.",t,r,i,s)}if(422===t){const r=e.data;let s=null;return s=JSON.parse(r),R("A server side error occurred.",t,r,i,s)}if(400===t){const r=e.data;let s=null;return s=JSON.parse(r),R("A server side error occurred.",t,r,i,s)}return 200!==t&&204!==t?R("An unexpected server error occurred.",t,e.data,i):Promise.resolve(null)}}exports.ResponseResultType=void 0,(l=exports.ResponseResultType||(exports.ResponseResultType={})).Undefined="undefined",l.Success="success",l.Failed="failed",exports.PrivacyConsentType=void 0,(d=exports.PrivacyConsentType||(exports.PrivacyConsentType={})).Unknown="unknown",d.Informed="informed",d.Implied="implied",d.Explicit="explicit",d.Active="active",d.Passive="passive",exports.TrackingEventSourceOriginType=void 0,(p=exports.TrackingEventSourceOriginType||(exports.TrackingEventSourceOriginType={})).Browser="browser",p.Server="server",p.Mobile="mobile",p.Desktop="desktop",p.PhysicalStore="physicalStore",p.Email="email",p.Phone="phone",p.Chat="chat",p.Automatic="automatic",exports.TrackingActivityNames=void 0,(u=exports.TrackingActivityNames||(exports.TrackingActivityNames={})).Undefined="undefined",u.PageViewOrganic="pageViewOrganic",u.PageViewUtmAttributed="pageViewUtmAttributed",u.AddPaymentMethod="addPaymentMethod",u.AddToWishlist="addToWishlist",u.ContactMessage="contactMessage",u.Custom="custom",u.SyncCart="syncCart",u.Order="order",u.InitiateCheckout="initiateCheckout",u.AddToCart="addToCart",u.RemoveFromCart="removeFromCart",u.OneTimeItemPurchase="oneTimeItemPurchase",u.SubscriptionItemPurchase="subscriptionItemPurchase",u.ViewProduct="viewProduct",u.ViewPage="viewPage",u.ApplyPromotionalCode="applyPromotionalCode",u.KeywordSearch="keywordSearch",u.UserLoginSignup="userLoginSignup",u.UserLogin="userLogin",u.NewsletterSignup="newsletterSignup",u.Lead="lead",u.ChangeProductAttribute="changeProductAttribute",u.FilterItemsByAttribute="filterItemsByAttribute",u.Schedule="schedule",u.ViewContentItem="viewContentItem",u.StartTrial="startTrial",exports.ECommerceContentType=void 0,(h=exports.ECommerceContentType||(exports.ECommerceContentType={})).Undefined="undefined",h.SingleProduct="singleProduct",h.SingleVariant="singleVariant",h.Collection="collection",exports.ECommercePlatform=void 0,(g=exports.ECommercePlatform||(exports.ECommercePlatform={})).None="none",g.BigCommerce="bigCommerce",g.Shopify="shopify",g.OrderGroove="orderGroove",g.Magento="magento",g.Generic="generic",g.WooCommerce="wooCommerce",g.Demandware="demandware",exports.ECommerceFulfillmentStatus=void 0,(v=exports.ECommerceFulfillmentStatus||(exports.ECommerceFulfillmentStatus={})).Undefined="undefined",v.Fulfilled="fulfilled",v.NoneFulfilled="noneFulfilled",v.PartiallyFulfilled="partiallyFulfilled",v.RestockedOrCancelled="restockedOrCancelled",v.Pending="pending",exports.ECommerceFinancialStatus=void 0,(m=exports.ECommerceFinancialStatus||(exports.ECommerceFinancialStatus={})).Undefined="undefined",m.Pending="pending",m.Authorized="authorized",m.PartiallyPaid="partiallyPaid",m.Paid="paid",m.PartiallyRefunded="partiallyRefunded",m.Refunded="refunded",m.Voided="voided",exports.ConvergePipelineLoggableActivityType=void 0,(f=exports.ConvergePipelineLoggableActivityType||(exports.ConvergePipelineLoggableActivityType={})).Generic="generic",f.ActivityIngress="activityIngress",f.ActivityEgress="activityEgress",f.UserProfile="userProfile",f.SdkLog="sdkLog",f.Detections="detections",f.ActivityEgressFilter="activityEgressFilter",f.Diagnosis="diagnosis",f.PipelineIntegrationOutput="pipelineIntegrationOutput",exports.SdkLogEventLevel=void 0,(y=exports.SdkLogEventLevel||(exports.SdkLogEventLevel={})).Information="information",y.Warning="warning",y.Error="error",y.Verbose="verbose",exports.SeekaWebhookCallType=void 0,(k=exports.SeekaWebhookCallType||(exports.SeekaWebhookCallType={})).None="none",k.Probe="probe",k.AppInstalled="appInstalled",k.IdentityChanged="identityChanged",k.ActivityAccepted="activityAccepted",k.AppInstallSettingsUpdated="appInstallSettingsUpdated",k.AppUninstalled="appUninstalled",k.BrowserSdkPlugin="browserSdkPlugin",exports.ClickAttributionSourcePlatform=void 0,(A=exports.ClickAttributionSourcePlatform||(exports.ClickAttributionSourcePlatform={})).Unknown="unknown",A.Google="google",A.Meta="meta",A.Snapchat="snapchat",A.Pinterest="pinterest",A.TikTok="tikTok",exports.ActivityPipelineActivityFilterType=void 0,(P=exports.ActivityPipelineActivityFilterType||(exports.ActivityPipelineActivityFilterType={})).Undefined="undefined",P.PurchaseMade="purchaseMade",P.ActivityTracked="activityTracked",exports.ConditionComparer=void 0,(S=exports.ConditionComparer||(exports.ConditionComparer={})).Undefined="undefined",S.And="and",S.Or="or",exports.ActivityPipelineActivityFilterSourceItemType=void 0,(I=exports.ActivityPipelineActivityFilterSourceItemType||(exports.ActivityPipelineActivityFilterSourceItemType={})).Undefined="undefined",I.Domain="domain",I.Pipeline="pipeline",I.Wildcard="wildcard",I.Url="url",I.PagePath="pagePath",exports.ConditionOperator=void 0,(x=exports.ConditionOperator||(exports.ConditionOperator={})).Undefined="undefined",x.Equals="equals",x.NotEquals="notEquals",x.Contains="contains",x.NotContains="notContains",x.StartsWith="startsWith",x.EndsWith="endsWith",x.IsNull="isNull",x.NotNull="notNull",x.IsTrue="isTrue",x.IsFalse="isFalse",x.GreaterThanOrEquals="greaterThanOrEquals",x.LessThanOrEquals="lessThanOrEquals",x.GreaterThan="greaterThan",x.LessThan="lessThan",x.Before="before",x.After="after",x.Between="between",x.In="in",x.NotIn="notIn",x.Regex="regEx",x.Any="any";class M extends Error{constructor(e,t,i,r,s){super(),this.message=void 0,this.status=void 0,this.response=void 0,this.headers=void 0,this.result=void 0,this.isApiException=!0,this.message=e,this.status=t,this.response=i,this.headers=r,this.result=s}static isApiException(e){return!0===e.isApiException}}function R(e,t,i,r,s){throw null!=s?s:new M(e,t,i,r,null)}function $(e){return e&&!0===e.isAxiosError}const q=()=>`${W(new Date)}.${j()}`,j=()=>Math.floor(8999999999*Math.random()+1e9).toString(),W=e=>{let t=(e.getUTCMonth()+1).toString();t.length<2&&(t="0"+t);let i=e.getUTCDate().toString();i.length<2&&(i="0"+i);let r=e.getUTCHours().toString();r.length<2&&(r="0"+r);let s=e.getUTCMinutes().toString();s.length<2&&(s="0"+s);let o=e.getUTCSeconds().toString();return o.length<2&&(o="0"+o),`${e.getUTCFullYear()}${t}${i}.${r}${s}${o}`},D=(e,t)=>e.reduce((e,i,r)=>{const s=Math.floor(r/t);return e[s]||(e[s]=[]),e[s].push(i),e},[]),G={identity:{receiveFull:"Identity.Receive.Pii",send:"Identity.Send"},activity:{receiveAnon:"Activity.Receive.Anon",receiveFull:"Activity.Receive.Pii",send:"Activity.Send"}},z="seeka:sdk";class V{constructor(e,t){this.appId=void 0,this.appInstallationId=void 0,this.set=async(e,t,i)=>{const r=this.getKey(e);N.put(r,JSON.stringify(t),i)},this.getOrSet=async(e,t,i)=>{const r=this.getKey(e),s=N.get(r);if(s){const e=JSON.parse(s);return i&&await i(e),e}const o=await t();return o?(N.put(r,JSON.stringify(o.value),o.expiryAbsoluteMilliseconds),o.value):null},this.getKey=e=>this.appInstallationId?`${z}:${this.appId}:${this.appInstallationId}:${e}`:`${z}:${this.appId}:${e}`,this.appId=e,this.appInstallationId=t}}const J=async e=>{const 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});const i=new V(e.appId,e.applicationInstallId),r=(s=e.issuerUrl+"_"+e.appId,w.createHash("md5").update(s).digest("hex"));var s;const o=await i.getOrSet(r,async()=>{try{const i=await K(e);return i&&i.meta&&i.raw?(e.logger?e.logger.verbose("Seeka auth: got issuer from remote",{...t}):console.debug("Seeka auth: got issuer from remote",{...t}),{value:i.meta,expiryAbsoluteMilliseconds:36e5}):null}catch(i){return e.logger?e.logger.error("Seeka auth: failed getting issuer",{...t,ex:E.default.exceptions.getAllInfo(i)}):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 null===o?null:new T.Configuration(o.serverMetadata,o.clientId,e.appSecret)},K=async e=>{const 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{const i=e.appId.replace(/-/g,""),r=await T.discovery(new URL(e.issuerUrl),i,void 0,T.None(),{timeout:1e4});return e.logger?e.logger.verbose("Seeka auth: discovered issuer from remote",{...t,client_id:r.clientMetadata().client_id}):console.info("Seeka auth: discovered issuer from remote",{...t,client_id:r.clientMetadata().client_id}),{meta:{serverMetadata:r.serverMetadata(),clientMetadata:r.clientMetadata(),timeout:r.timeout,clientId:i},raw:r}}catch(i){return e.logger?e.logger.error("Seeka auth: failed discovering issuer from remote",{...t,ex:E.default.exceptions.getAllInfo(i)}):console.error("Seeka auth: failed discovering issuer from remote",{...t}),null}},H=async e=>{const t=new V(e.appId,e.applicationInstallId),i={applicationId:e.appId,issuer:{url:e.issuerUrl}};return await t.getOrSet("auth:token:appinstall",async()=>{const t=await(async e=>{const t={applicationId:e.appId,issuer:{url:e.issuerUrl}},i=await J(e);if(!i)return null;try{let r=await T.clientCredentialsGrant(i,{resource:i.clientMetadata().client_id});const s={...t,token:{expires_at:r.expires_at,token_type:r.token_type,scope:r.scope}};return e.logger?e.logger.verbose("Seeka auth: got client access token from server",{...s}):console.info("Seeka auth: got app client token from server",{...s}),{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(i){const r={...t,error:i};return e.logger?e.logger.error("Seeka auth: failed to get client access token from server",{...r}):console.debug("Seeka auth: failed to get client access token from server",{...r}),null}})(e);if(!t||!t.access_token)return null;const i=await(async(e,t)=>{const i={applicationId:t.appId,issuer:{url:t.issuerUrl}},r=await J(t);if(!r||!r)return null;try{const s=await T.genericGrantRequest(r,"app_install_token",{applicationInstallId:t.applicationInstallId,access_token:e,scope:"Seeka.API.Ingest"}),o={...i,token:{expires_at:s.expires_at,token_type:s.token_type,scope:s.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:s.token_type,access_token:s.access_token,expires_in:s.expires_in,id_token:s.id_token,refresh_token:s.refresh_token,scope:s.scope,authorization_details:s.authorization_details}}catch(e){const r={...i,error:e};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}})(t.access_token,e);return i?{value:i,expiryAbsoluteMilliseconds:((i.expires_in>t.expires_in?t.expires_in:i.expires_in)||9e5)-6e4}: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})})},X=new _.default.Agent({keepAlive:!0,scheduling:"fifo"}),Y=new U.default.Agent({keepAlive:!0,scheduling:"fifo"}),Q=e=>{const t=b.default.create({httpAgent:X,httpsAgent:Y});return t.interceptors.request.use(function(t){let i={url:t.url,method:t.method};return"silly"===process.env.LOGGING_LEVEL&&(i={...i,body:t.data,params:t.params}),e.logger?e.logger.debug(`Seeka API: making call to ${i.url}`,{...i}):console.debug(`Seeka API: making call to ${i.url}`,{...i}),t},function(t){const i={error:t};return e.logger?e.logger.http("Seeka API: failed to send request",{...i}):console.debug("Seeka API: failed to send request",{...i}),Promise.reject(t)}),t.interceptors.response.use(function(t){var i,r;const s={url:(null==(i=t.request)?void 0:i.url)||t.config.url,method:(null==(r=t.request)?void 0:r.method)||t.config.method,response:{status:t.status}};return e.logger?e.logger.http(`Seeka API: call to ${s.url} succeeded`,{...s}):console.debug(`Seeka API: call to ${s.url} succeeded`,{...s}),t},function(t){var i;const{code:r,status:s,message:o}=t,{headers:n,url:a,method:c}=null==t?void 0:t.config,l={code:r,status:s,message:o,headers:n,url:a,method:c,content:null==t||null==(i=t.response)?void 0:i.data};return e.logger?e.logger.error(`Seeka API: call to ${l.url} failed`,{...l}):console.error(`Seeka API: call to ${l.url} failed`,{...l}),Promise.reject(t)}),t};class Z{constructor(e){this.config=void 0,this.maxBatchSize=50,this.refreshOrPrimeTokenCache=async()=>{await H(this.config)},this.ingestionService=void 0,this.identityService=void 0,this.checkPermission=(e,t)=>{if(!this.config.hasPermission(e))throw new Error("Cannot perform operation "+t+" on installationId "+this.config.applicationInstallId+" without permission "+e+". Currently granted permissions: "+(this.config.grantedPermissions?this.config.grantedPermissions.join(", "):"none"));return!0},this.mergeIdentity=async(e,t)=>{var i;this.checkPermission(G.identity.send,"mergeIdentity");const r=q();return null==(i=(await this.identityService.merge({id:e,src:{method:"",origin:t.origin,time:void 0,loc:t.loc,sess:r,diag:"true"===process.env.SEEKA_DEBUG_ENABLED?r:void 0,runtime:this.config.runtime}})).result)?void 0:i.personId},this.mergeIdentityBatch=async(e,t)=>{this.checkPermission(G.identity.send,"mergeIdentityBatch");const i=q();var r;if(0===e.length)return void(null==(r=this.config.logger)||r.debug("No identities in batch"));const s={method:"",origin:t.origin,time:void 0,loc:t.loc,sess:i,diag:"true"===process.env.SEEKA_DEBUG_ENABLED?i:void 0,runtime:this.config.runtime},o=D(e,this.maxBatchSize);if(o.length>1&&this.config.logger&&this.config.logger.debug(`Identity batch size ${e} is greater than ${this.maxBatchSize}, splitting into ${o.length} batches`),await this.trackActivityBatchRaw({data:o[0].map(e=>({id:{id:e||{},src:{...s}}}))}),o.length>1){const e=o.map((e,t)=>{var i;return 0===t?Promise.resolve():(null==(i=this.config.logger)||i.verbose(`Processing identity batch ${t+1} of ${o.length}`),this.trackActivityBatchRaw({data:e.map(e=>({id:{id:e||{},src:{...s}}}))}))});await Promise.all(e)}},this.trackActivityBatch=async(e,t)=>{this.checkPermission(G.activity.send,"trackActivityBatch");const i=q();var r;if(0===e.length)return void(null==(r=this.config.logger)||r.debug("No activities in batch"));const s={method:"",origin:t.origin,time:void 0,loc:t.loc,sess:i,diag:"true"===process.env.SEEKA_DEBUG_ENABLED?i:void 0,runtime:this.config.runtime},o=D(e,this.maxBatchSize);if(o.length>1&&this.config.logger&&this.config.logger.debug(`Activity batch size ${e.length} is greater than ${this.maxBatchSize}, splitting into ${o.length} batches`),await this.trackActivityBatchRaw({data:o[0].map(e=>({ev:{id:e.profile||{},src:{...s},payload:e.activity}}))}),o.length>1){const e=o.map((e,t)=>{var i;return 0===t?Promise.resolve():(null==(i=this.config.logger)||i.verbose(`Processing activity batch ${t+1} of ${o.length}`),this.trackActivityBatchRaw({data:e.map(e=>({ev:{id:e.profile||{},src:{...s},payload:e.activity}}))}))});await Promise.all(e)}},this.trackActivityBatchRaw=async e=>{await this.ingestionService.batch(e)},this.trackActivityForProfileId=async(e,t,i)=>{this.checkPermission(G.activity.send,"trackActivityForProfileId"),await this.trackActivityForProfileIdBatch([e],t,i)},this.trackActivityForProfileIdBatch=async(e,t,i)=>{this.checkPermission(G.activity.send,"trackActivityForProfileIdBatch"),await this.trackActivityBatch(e.map(e=>({activity:e,profile:t?{seekaPId:t}:void 0})),i)},this.trackActivityForProfile=async(e,t,i)=>{this.checkPermission(G.activity.send,"trackActivityForProfile"),await this.trackActivityForProfileBatch([e],t,i)},this.trackActivityForProfileBatch=async(e,t,i)=>{this.checkPermission(G.activity.send,"trackActivityForProfileBatch"),await this.trackActivityBatch(e.map(e=>({activity:e,profile:t})),i)},this.config=e,this.ingestionService=(e=>new L(e,e.ingestUrl,Q(e)))(e),this.identityService=(e=>new B(e,e.ingestUrl,Q(e)))(e)}}const ee="x-seeka-signature-sha256",te=(e,t,i)=>{if(!t)return!1;let r=null;if(t.get&&"function"==typeof t.get)r=t.get(ee);else{const e=t[ee];e&&(Array.isArray(e)&&e.length>0?r=e[0]:("string"==typeof e||e instanceof String)&&(r=e))}if(!r)return!1;const s=ie(e,i)===r;return s||console.warn("Invalid webhook signature"),s},ie=(e,t)=>w.createHmac("sha256",e).update(t).digest("hex"),re=(e,t,i,r,s)=>{const o=new O;return o.appId=e.applicationId,o.appSecret=t,o.ingestUrl=process.env.SEEKA_INGEST_URL||"https://router.seeka.services",o.issuerUrl=process.env.SEEKA_ISSUER_URL||"https://account.seeka.app",o.organisationId=e.organisationId,o.applicationInstallId=e.applicationInstallId,o.runtime={type:"sdk/js/apps-server",ver:"2.0.16-alpha.0".split("-")[0],client:i},o.logger=s,o.grantedPermissions=r,o.transformApiRequest=e=>se(o,e),o.transformApiResponse=async(e,t,i)=>oe(o,e,t,i),o.hasAnyPermissions=e=>!(!o.grantedPermissions||0===o.grantedPermissions.length)&&(!e||0===e.length||e.some(e=>o.grantedPermissions.includes(e))),o.hasAllPermissions=e=>!(!o.grantedPermissions||0===o.grantedPermissions.length)&&(!e||0===e.length||e.every(e=>o.grantedPermissions.includes(e))),o.hasPermission=e=>!(!o.grantedPermissions||0===o.grantedPermissions.length)&&(!e||o.grantedPermissions.includes(e)),o},se=async(e,t)=>{const i=await H(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 "+(null==i?void 0:i.access_token)},t},oe=async(e,t,i,r)=>(i.data=JSON.stringify(i.data),r(i)),ne="aes-192-cbc",ae=(e,t)=>{if(!e)return"";if(!t)throw new Error("Secret is required to encrypt data");const i=C.default.scryptSync(t,"salt",24),r=C.default.randomBytes(16),s=C.default.createCipheriv(ne,i,r);return[s.update(e,"utf8","hex")+s.final("hex"),Buffer.from(r).toString("hex")].join("|")},ce=(e,t)=>{if(!e)return"";if(!t)throw new Error("Secret is required to decrypt data");const[i,r]=e.split("|");if(!r)throw new Error("IV not found");const s=C.default.scryptSync(t,"salt",24),o=C.default.createDecipheriv(ne,s,Buffer.from(r,"hex"));return o.update(i,"hex","utf8")+o.final("utf8")};class le{constructor(e){this.appSecret=void 0,this.encryptWithAppSecret=e=>{if(!this.appSecret)throw new Error("App secret is required to encrypt data");return ae(e,this.appSecret)},this.decryptWithAppSecret=e=>{if(!this.appSecret)throw new Error("App secret is required to decrypt data");return ce(e,this.appSecret)},this.appSecret=e}}var de;class pe{constructor(e,t){this.context=void 0,this.appCache=void 0,this.appInstallCache=void 0,this.api=void 0,this.logger=void 0,this.crypto=void 0,this.context=e,this.api=new Z(e.config),this.appCache=new V(e.config.appId),this.appInstallCache=new V(e.config.appId,e.config.applicationInstallId),this.crypto=new le(e.config.appSecret),this.logger=t}}de=pe,pe.create=(e,t,i,r,s)=>new de({config:re({...t},e,{type:i.name,ver:i.version.split("-")[0]},r,s)},s);const ue=[exports.TrackingActivityNames.Order,exports.TrackingActivityNames.SubscriptionItemPurchase,exports.TrackingActivityNames.OneTimeItemPurchase];var he;exports.IabPrivacyConsentPurposeId=void 0,(he=exports.IabPrivacyConsentPurposeId||(exports.IabPrivacyConsentPurposeId={})).Undefined="undefined",he.MeasureAdvertisingPerformance="measureAdvertisingPerformance";const ge={[exports.IabPrivacyConsentPurposeId.MeasureAdvertisingPerformance]:7};exports.ApiException=M,exports.ApiServiceProxyBase=F,exports.AppPermissionKeys=G,exports.IabPrivacyConsentPurposeIdMap=ge,exports.IdentityServiceProxy=B,exports.IngestServiceProxy=L,exports.SeekaApiHelper=Z,exports.SeekaAppCacheManager=V,exports.SeekaAppConfig=O,exports.SeekaAppHelper=pe,exports.chunk=D,exports.decryptText=ce,exports.encryptText=ae,exports.getActivityName=e=>{const t=Object.keys(exports.TrackingActivityNames),i=e.toLowerCase(),r=t.find(e=>e.toLowerCase()===i);return r?exports.TrackingActivityNames[r]:exports.TrackingActivityNames.Custom},exports.isValidSeekaProfileId=function(e){if(!e||0===e.trim().length)return!1;const t=e.split(".").filter(e=>e.trim().length>0);return 4===t.length&&t[0].toLowerCase()==="sk".toLowerCase()&&t[1].toLowerCase()==="1".toLowerCase()&&!isNaN(parseInt(t[2],10))&&!isNaN(parseInt(t[3],10))},exports.matchActivityPipelineFilters=(e,t,i)=>{if(!e.activity)return[];const r=e.activity,s=r.activityName===exports.TrackingActivityNames.Custom?r.activityNameCustom:r.activityName;if(!s)return[];const o=s.toLowerCase(),n=[];return t.forEach(t=>{var a;if(!t)return;switch(t.type){case exports.ActivityPipelineActivityFilterType.ActivityTracked:if(!t.activityNames)return;if(!t.activityNames.find(e=>e.toLowerCase()===o))return;i.verbose("Matched activity tracked filter",{filter:t,activityName:s});break;case exports.ActivityPipelineActivityFilterType.PurchaseMade:if(!r.activityName||!ue.includes(r.activityName))return;i.verbose("Matched purchase made activity filter",{filter:t,activityName:s});break;default:return void i.warn("Unknown activity filter type",{filter:t})}const c=t.sourceFilter;if(!c)return;const l=e.source,d=null!=l&&l.loc?new URL(l.loc).hostname.toLowerCase():null,p=null==l?void 0:l.pipeline,u=null==p||null==(a=p.convergePipelineIntegrationInstanceId)?void 0:a.toLowerCase(),h=c.filters?c.filters.map(e=>{switch(e.type){case exports.ActivityPipelineActivityFilterSourceItemType.Wildcard:return i.verbose("Matched wildcard source filter",{sourceFilter:e}),!0;case exports.ActivityPipelineActivityFilterSourceItemType.Domain:return!(!d||!e.key||d!==e.key.toLowerCase()||(i.verbose("Matched domain source filter",{sourceFilter:e,activityHostname:d}),0));case exports.ActivityPipelineActivityFilterSourceItemType.Pipeline:return!(!u||!e.key||u!==e.key.toLowerCase()||(i.verbose("Matched pipeline source filter",{sourceFilter:e,sourceConvergePipelineIntegrationInstanceId:u}),0))}}):[];switch(c.comparer){case exports.ConditionComparer.And:h.every(e=>!0===e)||n.push(t);break;case exports.ConditionComparer.Or:h.some(e=>!0===e)&&n.push(t);break;default:i.warn("Unknown source filter comparer",{sourceFilters:c})}}),n},exports.separatePersonFullName=e=>{if(!e)return{firstName:null,lastName:null};const t=e.trim().split(" ");return 1===t.length?{firstName:e,lastName:null}:2===t.length?{firstName:t[0],lastName:t[1]}:{firstName:t[0],lastName:t.slice(1).join(" ")}},exports.throwOnInvalidWebhookSignature=(e,t,i)=>{if(!te(e,t,i))throw new Error("Invalid webhook signature")},exports.validateWebhookSignature=te,exports.webhookSignatureHeaderName=ee;
|
|
1
|
+
var e=require("crypto"),t=require("axios"),i=require("openid-client"),r=require("winston"),s=require("memory-cache"),o=require("http"),n=require("https");function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function c(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach(function(i){if("default"!==i){var r=Object.getOwnPropertyDescriptor(e,i);Object.defineProperty(t,i,r.get?r:{enumerable:!0,get:function(){return e[i]}})}}),t.default=e,t}var l,d,p,u,h,g,v,f,m,y,k,A,P,x,I,S,w,C,b,T,E,O,N,U,_=/*#__PURE__*/c(e),M=/*#__PURE__*/a(e),F=/*#__PURE__*/a(t),B=/*#__PURE__*/c(i),L=/*#__PURE__*/a(r),D=/*#__PURE__*/c(s),R=/*#__PURE__*/a(o),$=/*#__PURE__*/a(n);class q{constructor(){this.appId=void 0,this.appSecret=void 0,this.ingestUrl=void 0,this.issuerUrl=void 0,this.organisationId=void 0,this.applicationInstallId=void 0,this.runtime=void 0,this.logger=void 0,this.grantedPermissions=void 0,this.transformApiRequest=void 0,this.transformApiResponse=void 0,this.hasAnyPermissions=void 0,this.hasAllPermissions=void 0,this.hasPermission=void 0}}class W{constructor(e){this.config=void 0,this.transformOptions=async e=>await this.config.transformApiRequest(e),this.transformResult=async(e,t,i)=>await this.config.transformApiResponse(e,t,i),this.config=e}}class G extends W{constructor(e,t,i){super(e),this.instance=void 0,this.baseUrl=void 0,this.jsonParseReviver=void 0,this.instance=i||F.default.create(),this.baseUrl=null!=t?t:"https://api-localdev-env0-seeka.au.ngrok.io"}merge(e,t){let i=this.baseUrl+"/api/identity";i=i.replace(/[?&]$/,"");const r=JSON.stringify(e);return this.transformOptions({data:r,method:"POST",url:i,headers:{"Content-Type":"application/json",Accept:"application/json"},cancelToken:t}).then(e=>this.instance.request(e)).catch(e=>{if(J(e)&&e.response)return e.response;throw e}).then(e=>this.transformResult(i,e,e=>this.processMerge(e)))}processMerge(e){const t=e.status;let i={};if(e.headers&&"object"==typeof e.headers)for(const t in e.headers)e.headers.hasOwnProperty(t)&&(i[t]=e.headers[t]);if(200===t){let t=null;return t=JSON.parse(e.data),Promise.resolve(t)}if(401===t){const r=e.data;let s=null;return s=JSON.parse(r),z("A server side error occurred.",t,r,i,s)}if(422===t){const r=e.data;let s=null;return s=JSON.parse(r),z("A server side error occurred.",t,r,i,s)}if(400===t){const r=e.data;let s=null;return s=JSON.parse(r),z("A server side error occurred.",t,r,i,s)}return 200!==t&&204!==t?z("An unexpected server error occurred.",t,e.data,i):Promise.resolve(null)}}class V extends W{constructor(e,t,i){super(e),this.instance=void 0,this.baseUrl=void 0,this.jsonParseReviver=void 0,this.instance=i||F.default.create(),this.baseUrl=null!=t?t:"https://api-localdev-env0-seeka.au.ngrok.io"}batch(e,t){let i=this.baseUrl+"/api/ingest";i=i.replace(/[?&]$/,"");const r=JSON.stringify(e);return this.transformOptions({data:r,method:"POST",url:i,headers:{"Content-Type":"application/json"},cancelToken:t}).then(e=>this.instance.request(e)).catch(e=>{if(J(e)&&e.response)return e.response;throw e}).then(e=>this.transformResult(i,e,e=>this.processBatch(e)))}processBatch(e){const t=e.status;let i={};if(e.headers&&"object"==typeof e.headers)for(const t in e.headers)e.headers.hasOwnProperty(t)&&(i[t]=e.headers[t]);if(202===t)return Promise.resolve(null);if(401===t){const r=e.data;let s=null;return s=JSON.parse(r),z("A server side error occurred.",t,r,i,s)}if(422===t){const r=e.data;let s=null;return s=JSON.parse(r),z("A server side error occurred.",t,r,i,s)}if(400===t){const r=e.data;let s=null;return s=JSON.parse(r),z("A server side error occurred.",t,r,i,s)}return 200!==t&&204!==t?z("An unexpected server error occurred.",t,e.data,i):Promise.resolve(null)}}exports.ResponseResultType=void 0,(l=exports.ResponseResultType||(exports.ResponseResultType={})).Undefined="undefined",l.Success="success",l.Failed="failed",exports.PrivacyConsentType=void 0,(d=exports.PrivacyConsentType||(exports.PrivacyConsentType={})).Unknown="unknown",d.Informed="informed",d.Implied="implied",d.Explicit="explicit",d.Active="active",d.Passive="passive",exports.TrackingEventSourceOriginType=void 0,(p=exports.TrackingEventSourceOriginType||(exports.TrackingEventSourceOriginType={})).Browser="browser",p.Server="server",p.Mobile="mobile",p.Desktop="desktop",p.PhysicalStore="physicalStore",p.Email="email",p.Phone="phone",p.Chat="chat",p.Automatic="automatic",exports.TrackingActivityNames=void 0,(u=exports.TrackingActivityNames||(exports.TrackingActivityNames={})).Undefined="undefined",u.PageViewOrganic="pageViewOrganic",u.PageViewUtmAttributed="pageViewUtmAttributed",u.AddPaymentMethod="addPaymentMethod",u.AddToWishlist="addToWishlist",u.ContactMessage="contactMessage",u.Custom="custom",u.SyncCart="syncCart",u.Order="order",u.InitiateCheckout="initiateCheckout",u.AddToCart="addToCart",u.RemoveFromCart="removeFromCart",u.OneTimeItemPurchase="oneTimeItemPurchase",u.SubscriptionItemPurchase="subscriptionItemPurchase",u.ViewProduct="viewProduct",u.ViewPage="viewPage",u.ApplyPromotionalCode="applyPromotionalCode",u.KeywordSearch="keywordSearch",u.UserLoginSignup="userLoginSignup",u.UserLogin="userLogin",u.NewsletterSignup="newsletterSignup",u.Lead="lead",u.ChangeProductAttribute="changeProductAttribute",u.FilterItemsByAttribute="filterItemsByAttribute",u.Schedule="schedule",u.ViewContentItem="viewContentItem",u.StartTrial="startTrial",exports.ECommerceContentType=void 0,(h=exports.ECommerceContentType||(exports.ECommerceContentType={})).Undefined="undefined",h.SingleProduct="singleProduct",h.SingleVariant="singleVariant",h.Collection="collection",exports.ECommercePlatform=void 0,(g=exports.ECommercePlatform||(exports.ECommercePlatform={})).None="none",g.BigCommerce="bigCommerce",g.Shopify="shopify",g.OrderGroove="orderGroove",g.Magento="magento",g.Generic="generic",g.WooCommerce="wooCommerce",g.Demandware="demandware",exports.ECommerceFulfillmentStatus=void 0,(v=exports.ECommerceFulfillmentStatus||(exports.ECommerceFulfillmentStatus={})).Undefined="undefined",v.Fulfilled="fulfilled",v.NoneFulfilled="noneFulfilled",v.PartiallyFulfilled="partiallyFulfilled",v.RestockedOrCancelled="restockedOrCancelled",v.Pending="pending",exports.ECommerceFinancialStatus=void 0,(f=exports.ECommerceFinancialStatus||(exports.ECommerceFinancialStatus={})).Undefined="undefined",f.Pending="pending",f.Authorized="authorized",f.PartiallyPaid="partiallyPaid",f.Paid="paid",f.PartiallyRefunded="partiallyRefunded",f.Refunded="refunded",f.Voided="voided",exports.ConvergePipelineLoggableActivityType=void 0,(m=exports.ConvergePipelineLoggableActivityType||(exports.ConvergePipelineLoggableActivityType={})).Generic="generic",m.ActivityIngress="activityIngress",m.ActivityEgress="activityEgress",m.UserProfile="userProfile",m.SdkLog="sdkLog",m.Detections="detections",m.ActivityEgressFilter="activityEgressFilter",m.Diagnosis="diagnosis",m.PipelineIntegrationOutput="pipelineIntegrationOutput",exports.SdkLogEventLevel=void 0,(y=exports.SdkLogEventLevel||(exports.SdkLogEventLevel={})).Information="information",y.Warning="warning",y.Error="error",y.Verbose="verbose",exports.SeekaWebhookCallType=void 0,(k=exports.SeekaWebhookCallType||(exports.SeekaWebhookCallType={})).None="none",k.Probe="probe",k.AppInstalled="appInstalled",k.IdentityChanged="identityChanged",k.ActivityAccepted="activityAccepted",k.AppInstallSettingsUpdated="appInstallSettingsUpdated",k.AppUninstalled="appUninstalled",k.BrowserSdkPlugin="browserSdkPlugin",exports.ClickAttributionSourcePlatform=void 0,(A=exports.ClickAttributionSourcePlatform||(exports.ClickAttributionSourcePlatform={})).Unknown="unknown",A.Google="google",A.Meta="meta",A.Snapchat="snapchat",A.Pinterest="pinterest",A.TikTok="tikTok",exports.ActivityPipelineActivityFilterType=void 0,(P=exports.ActivityPipelineActivityFilterType||(exports.ActivityPipelineActivityFilterType={})).Undefined="undefined",P.PurchaseMade="purchaseMade",P.ActivityTracked="activityTracked",exports.ConditionComparer=void 0,(x=exports.ConditionComparer||(exports.ConditionComparer={})).Undefined="undefined",x.And="and",x.Or="or",exports.ActivityPipelineActivityFilterSourceItemType=void 0,(I=exports.ActivityPipelineActivityFilterSourceItemType||(exports.ActivityPipelineActivityFilterSourceItemType={})).Undefined="undefined",I.Domain="domain",I.Pipeline="pipeline",I.Wildcard="wildcard",I.Url="url",I.PagePath="pagePath",exports.ConditionOperator=void 0,(S=exports.ConditionOperator||(exports.ConditionOperator={})).Undefined="undefined",S.Equals="equals",S.NotEquals="notEquals",S.Contains="contains",S.NotContains="notContains",S.StartsWith="startsWith",S.EndsWith="endsWith",S.IsNull="isNull",S.NotNull="notNull",S.IsTrue="isTrue",S.IsFalse="isFalse",S.GreaterThanOrEquals="greaterThanOrEquals",S.LessThanOrEquals="lessThanOrEquals",S.GreaterThan="greaterThan",S.LessThan="lessThan",S.Before="before",S.After="after",S.Between="between",S.In="in",S.NotIn="notIn",S.Regex="regEx",S.Any="any",exports.AnalyticsLibrary=void 0,(w=exports.AnalyticsLibrary||(exports.AnalyticsLibrary={})).Undefined="undefined",w.Seeka="seeka",w.DynamicYield="dynamicYield",w.Segment="segment",w.FacebookPixel="facebookPixel",w.GoogleAnalytics="googleAnalytics",w.Braze="braze",w.SnapchatPixel="snapchatPixel",w.Pinterest="pinterest",w.TikTokPixel="tikTokPixel",w.GoogleAds="googleAds",exports.ContentIdentificationBehavior=void 0,(C=exports.ContentIdentificationBehavior||(exports.ContentIdentificationBehavior={})).Default="default",C.Sku="sku",C.ProductId="productId",C.VariantId="variantId",C.ProductIdAndVariantIdUnderscore="productIdAndVariantIdUnderscore",C.VariantIdOrProductId="variantIdOrProductId",exports.ConvergeVendorDestinationPublishStrategy=void 0,(b=exports.ConvergeVendorDestinationPublishStrategy||(exports.ConvergeVendorDestinationPublishStrategy={})).DeliverAllTraitsAndDeliverAllEvents="deliverAllTraitsAndDeliverAllEvents",b.DeliverAllTraitsAndDeliverEventsOnlyIfMaxWeightedTraitsPresent="deliverAllTraitsAndDeliverEventsOnlyIfMaxWeightedTraitsPresent",b.DeliverMaxWeightedTraitsOnlyAndDeliverAllEvents="deliverMaxWeightedTraitsOnlyAndDeliverAllEvents",b.DeliverMaxWeightedTraitsOnlyAndDeliverEventsOnlyIfMaxWeightedTraitsPresent="deliverMaxWeightedTraitsOnlyAndDeliverEventsOnlyIfMaxWeightedTraitsPresent",exports.CrossDomainTrackingUtmBehavior=void 0,(T=exports.CrossDomainTrackingUtmBehavior||(exports.CrossDomainTrackingUtmBehavior={})).None="none",T.SessionPassthrough="sessionPassthrough",T.UrlPassthrough="urlPassthrough",exports.RegionalConsentGrantOption=void 0,(E=exports.RegionalConsentGrantOption||(exports.RegionalConsentGrantOption={})).Unset="unset",E.Granted="granted",E.Denied="denied",exports.IabPrivacyConsentPurposeId=void 0,(O=exports.IabPrivacyConsentPurposeId||(exports.IabPrivacyConsentPurposeId={})).Undefined="undefined",O.MeasureAdvertisingPerformance="measureAdvertisingPerformance",exports.ConsentMappingMatchType=void 0,(N=exports.ConsentMappingMatchType||(exports.ConsentMappingMatchType={})).Undefined="undefined",N.AllOf="allOf",N.AnyOf="anyOf",exports.PrivacyDataControlMode=void 0,(U=exports.PrivacyDataControlMode||(exports.PrivacyDataControlMode={})).Disabled="disabled",U.Explicit="explicit",U.Implicit="implicit";class j extends Error{constructor(e,t,i,r,s){super(),this.message=void 0,this.status=void 0,this.response=void 0,this.headers=void 0,this.result=void 0,this.isApiException=!0,this.message=e,this.status=t,this.response=i,this.headers=r,this.result=s}static isApiException(e){return!0===e.isApiException}}function z(e,t,i,r,s){throw null!=s?s:new j(e,t,i,r,null)}function J(e){return e&&!0===e.isAxiosError}const K=()=>`${Y(new Date)}.${H()}`,H=()=>Math.floor(8999999999*Math.random()+1e9).toString(),Y=e=>{let t=(e.getUTCMonth()+1).toString();t.length<2&&(t="0"+t);let i=e.getUTCDate().toString();i.length<2&&(i="0"+i);let r=e.getUTCHours().toString();r.length<2&&(r="0"+r);let s=e.getUTCMinutes().toString();s.length<2&&(s="0"+s);let o=e.getUTCSeconds().toString();return o.length<2&&(o="0"+o),`${e.getUTCFullYear()}${t}${i}.${r}${s}${o}`},X=(e,t)=>e.reduce((e,i,r)=>{const s=Math.floor(r/t);return e[s]||(e[s]=[]),e[s].push(i),e},[]),Q={identity:{receiveFull:"Identity.Receive.Pii",send:"Identity.Send"},activity:{receiveAnon:"Activity.Receive.Anon",receiveFull:"Activity.Receive.Pii",send:"Activity.Send"}},Z="seeka:sdk";class ee{constructor(e,t){this.appId=void 0,this.appInstallationId=void 0,this.set=async(e,t,i)=>{const r=this.getKey(e);D.put(r,JSON.stringify(t),i)},this.getOrSet=async(e,t,i)=>{const r=this.getKey(e),s=D.get(r);if(s){const e=JSON.parse(s);return i&&await i(e),e}const o=await t();return o?(D.put(r,JSON.stringify(o.value),o.expiryAbsoluteMilliseconds),o.value):null},this.getKey=e=>this.appInstallationId?`${Z}:${this.appId}:${this.appInstallationId}:${e}`:`${Z}:${this.appId}:${e}`,this.appId=e,this.appInstallationId=t}}const te=async e=>{const 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});const i=new ee(e.appId,e.applicationInstallId),r=(s=e.issuerUrl+"_"+e.appId,_.createHash("md5").update(s).digest("hex"));var s;const o=await i.getOrSet(r,async()=>{try{const i=await ie(e);return i&&i.meta&&i.raw?(e.logger?e.logger.verbose("Seeka auth: got issuer from remote",{...t}):console.debug("Seeka auth: got issuer from remote",{...t}),{value:i.meta,expiryAbsoluteMilliseconds:36e5}):null}catch(i){return e.logger?e.logger.error("Seeka auth: failed getting issuer",{...t,ex:L.default.exceptions.getAllInfo(i)}):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 null===o?null:new B.Configuration(o.serverMetadata,o.clientId,e.appSecret)},ie=async e=>{const 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{const i=e.appId.replace(/-/g,""),r=await B.discovery(new URL(e.issuerUrl),i,void 0,B.None(),{timeout:1e4});return e.logger?e.logger.verbose("Seeka auth: discovered issuer from remote",{...t,client_id:r.clientMetadata().client_id}):console.info("Seeka auth: discovered issuer from remote",{...t,client_id:r.clientMetadata().client_id}),{meta:{serverMetadata:r.serverMetadata(),clientMetadata:r.clientMetadata(),timeout:r.timeout,clientId:i},raw:r}}catch(i){return e.logger?e.logger.error("Seeka auth: failed discovering issuer from remote",{...t,ex:L.default.exceptions.getAllInfo(i)}):console.error("Seeka auth: failed discovering issuer from remote",{...t}),null}},re=async e=>{const t=new ee(e.appId,e.applicationInstallId),i={applicationId:e.appId,issuer:{url:e.issuerUrl}};return await t.getOrSet("auth:token:appinstall",async()=>{const t=await(async e=>{const t={applicationId:e.appId,issuer:{url:e.issuerUrl}},i=await te(e);if(!i)return null;try{let r=await B.clientCredentialsGrant(i,{resource:i.clientMetadata().client_id});const s={...t,token:{expires_at:r.expires_at,token_type:r.token_type,scope:r.scope}};return e.logger?e.logger.verbose("Seeka auth: got client access token from server",{...s}):console.info("Seeka auth: got app client token from server",{...s}),{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(i){const r={...t,error:i};return e.logger?e.logger.error("Seeka auth: failed to get client access token from server",{...r}):console.debug("Seeka auth: failed to get client access token from server",{...r}),null}})(e);if(!t||!t.access_token)return null;const i=await(async(e,t)=>{const i={applicationId:t.appId,issuer:{url:t.issuerUrl}},r=await te(t);if(!r||!r)return null;try{const s=await B.genericGrantRequest(r,"app_install_token",{applicationInstallId:t.applicationInstallId,access_token:e,scope:"Seeka.API.Ingest"}),o={...i,token:{expires_at:s.expires_at,token_type:s.token_type,scope:s.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:s.token_type,access_token:s.access_token,expires_in:s.expires_in,id_token:s.id_token,refresh_token:s.refresh_token,scope:s.scope,authorization_details:s.authorization_details}}catch(e){const r={...i,error:e};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}})(t.access_token,e);return i?{value:i,expiryAbsoluteMilliseconds:((i.expires_in>t.expires_in?t.expires_in:i.expires_in)||9e5)-6e4}: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})})},se=new R.default.Agent({keepAlive:!0,scheduling:"fifo"}),oe=new $.default.Agent({keepAlive:!0,scheduling:"fifo"}),ne=e=>{const t=F.default.create({httpAgent:se,httpsAgent:oe});return t.interceptors.request.use(function(t){let i={url:t.url,method:t.method};return"silly"===process.env.LOGGING_LEVEL&&(i={...i,body:t.data,params:t.params}),e.logger?e.logger.debug(`Seeka API: making call to ${i.url}`,{...i}):console.debug(`Seeka API: making call to ${i.url}`,{...i}),t},function(t){const i={error:t};return e.logger?e.logger.http("Seeka API: failed to send request",{...i}):console.debug("Seeka API: failed to send request",{...i}),Promise.reject(t)}),t.interceptors.response.use(function(t){var i,r;const s={url:(null==(i=t.request)?void 0:i.url)||t.config.url,method:(null==(r=t.request)?void 0:r.method)||t.config.method,response:{status:t.status}};return e.logger?e.logger.http(`Seeka API: call to ${s.url} succeeded`,{...s}):console.debug(`Seeka API: call to ${s.url} succeeded`,{...s}),t},function(t){var i;const{code:r,status:s,message:o}=t,{headers:n,url:a,method:c}=null==t?void 0:t.config,l={code:r,status:s,message:o,headers:n,url:a,method:c,content:null==t||null==(i=t.response)?void 0:i.data};return e.logger?e.logger.error(`Seeka API: call to ${l.url} failed`,{...l}):console.error(`Seeka API: call to ${l.url} failed`,{...l}),Promise.reject(t)}),t};class ae{constructor(e){this.config=void 0,this.maxBatchSize=50,this.refreshOrPrimeTokenCache=async()=>{await re(this.config)},this.ingestionService=void 0,this.identityService=void 0,this.checkPermission=(e,t)=>{if(!this.config.hasPermission(e))throw new Error("Cannot perform operation "+t+" on installationId "+this.config.applicationInstallId+" without permission "+e+". Currently granted permissions: "+(this.config.grantedPermissions?this.config.grantedPermissions.join(", "):"none"));return!0},this.mergeIdentity=async(e,t)=>{var i;this.checkPermission(Q.identity.send,"mergeIdentity");const r=K();return null==(i=(await this.identityService.merge({id:e,src:{method:"",origin:t.origin,time:void 0,loc:t.loc,sess:r,diag:"true"===process.env.SEEKA_DEBUG_ENABLED?r:void 0,runtime:this.config.runtime}})).result)?void 0:i.personId},this.mergeIdentityBatch=async(e,t)=>{this.checkPermission(Q.identity.send,"mergeIdentityBatch");const i=K();var r;if(0===e.length)return void(null==(r=this.config.logger)||r.debug("No identities in batch"));const s={method:"",origin:t.origin,time:void 0,loc:t.loc,sess:i,diag:"true"===process.env.SEEKA_DEBUG_ENABLED?i:void 0,runtime:this.config.runtime},o=X(e,this.maxBatchSize);if(o.length>1&&this.config.logger&&this.config.logger.debug(`Identity batch size ${e} is greater than ${this.maxBatchSize}, splitting into ${o.length} batches`),await this.trackActivityBatchRaw({data:o[0].map(e=>({id:{id:e||{},src:{...s}}}))}),o.length>1){const e=o.map((e,t)=>{var i;return 0===t?Promise.resolve():(null==(i=this.config.logger)||i.verbose(`Processing identity batch ${t+1} of ${o.length}`),this.trackActivityBatchRaw({data:e.map(e=>({id:{id:e||{},src:{...s}}}))}))});await Promise.all(e)}},this.trackActivityBatch=async(e,t)=>{this.checkPermission(Q.activity.send,"trackActivityBatch");const i=K();var r;if(0===e.length)return void(null==(r=this.config.logger)||r.debug("No activities in batch"));const s={method:"",origin:t.origin,time:void 0,loc:t.loc,sess:i,diag:"true"===process.env.SEEKA_DEBUG_ENABLED?i:void 0,runtime:this.config.runtime},o=X(e,this.maxBatchSize);if(o.length>1&&this.config.logger&&this.config.logger.debug(`Activity batch size ${e.length} is greater than ${this.maxBatchSize}, splitting into ${o.length} batches`),await this.trackActivityBatchRaw({data:o[0].map(e=>({ev:{id:e.profile||{},src:{...s},payload:e.activity}}))}),o.length>1){const e=o.map((e,t)=>{var i;return 0===t?Promise.resolve():(null==(i=this.config.logger)||i.verbose(`Processing activity batch ${t+1} of ${o.length}`),this.trackActivityBatchRaw({data:e.map(e=>({ev:{id:e.profile||{},src:{...s},payload:e.activity}}))}))});await Promise.all(e)}},this.trackActivityBatchRaw=async e=>{await this.ingestionService.batch(e)},this.trackActivityForProfileId=async(e,t,i)=>{this.checkPermission(Q.activity.send,"trackActivityForProfileId"),await this.trackActivityForProfileIdBatch([e],t,i)},this.trackActivityForProfileIdBatch=async(e,t,i)=>{this.checkPermission(Q.activity.send,"trackActivityForProfileIdBatch"),await this.trackActivityBatch(e.map(e=>({activity:e,profile:t?{seekaPId:t}:void 0})),i)},this.trackActivityForProfile=async(e,t,i)=>{this.checkPermission(Q.activity.send,"trackActivityForProfile"),await this.trackActivityForProfileBatch([e],t,i)},this.trackActivityForProfileBatch=async(e,t,i)=>{this.checkPermission(Q.activity.send,"trackActivityForProfileBatch"),await this.trackActivityBatch(e.map(e=>({activity:e,profile:t})),i)},this.config=e,this.ingestionService=(e=>new V(e,e.ingestUrl,ne(e)))(e),this.identityService=(e=>new G(e,e.ingestUrl,ne(e)))(e)}}const ce="x-seeka-signature-sha256",le=(e,t,i)=>{if(!t)return!1;let r=null;if(t.get&&"function"==typeof t.get)r=t.get(ce);else{const e=t[ce];e&&(Array.isArray(e)&&e.length>0?r=e[0]:("string"==typeof e||e instanceof String)&&(r=e))}if(!r)return!1;const s=de(e,i)===r;return s||console.warn("Invalid webhook signature"),s},de=(e,t)=>_.createHmac("sha256",e).update(t).digest("hex"),pe=(e,t,i,r,s)=>{const o=new q;return o.appId=e.applicationId,o.appSecret=t,o.ingestUrl=process.env.SEEKA_INGEST_URL||"https://router.seeka.services",o.issuerUrl=process.env.SEEKA_ISSUER_URL||"https://account.seeka.app",o.organisationId=e.organisationId,o.applicationInstallId=e.applicationInstallId,o.runtime={type:"sdk/js/apps-server",ver:"2.0.19-alpha.0".split("-")[0],client:i},o.logger=s,o.grantedPermissions=r,o.transformApiRequest=e=>ue(o,e),o.transformApiResponse=async(e,t,i)=>he(o,e,t,i),o.hasAnyPermissions=e=>!(!o.grantedPermissions||0===o.grantedPermissions.length)&&(!e||0===e.length||e.some(e=>o.grantedPermissions.includes(e))),o.hasAllPermissions=e=>!(!o.grantedPermissions||0===o.grantedPermissions.length)&&(!e||0===e.length||e.every(e=>o.grantedPermissions.includes(e))),o.hasPermission=e=>!(!o.grantedPermissions||0===o.grantedPermissions.length)&&(!e||o.grantedPermissions.includes(e)),o},ue=async(e,t)=>{const i=await re(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 "+(null==i?void 0:i.access_token)},t},he=async(e,t,i,r)=>(i.data=JSON.stringify(i.data),r(i)),ge="aes-192-cbc",ve=(e,t)=>{if(!e)return"";if(!t)throw new Error("Secret is required to encrypt data");const i=M.default.scryptSync(t,"salt",24),r=M.default.randomBytes(16),s=M.default.createCipheriv(ge,i,r);return[s.update(e,"utf8","hex")+s.final("hex"),Buffer.from(r).toString("hex")].join("|")},fe=(e,t)=>{if(!e)return"";if(!t)throw new Error("Secret is required to decrypt data");const[i,r]=e.split("|");if(!r)throw new Error("IV not found");const s=M.default.scryptSync(t,"salt",24),o=M.default.createDecipheriv(ge,s,Buffer.from(r,"hex"));return o.update(i,"hex","utf8")+o.final("utf8")};class me{constructor(e){this.appSecret=void 0,this.encryptWithAppSecret=e=>{if(!this.appSecret)throw new Error("App secret is required to encrypt data");return ve(e,this.appSecret)},this.decryptWithAppSecret=e=>{if(!this.appSecret)throw new Error("App secret is required to decrypt data");return fe(e,this.appSecret)},this.appSecret=e}}var ye;class ke{constructor(e,t){this.context=void 0,this.appCache=void 0,this.appInstallCache=void 0,this.api=void 0,this.logger=void 0,this.crypto=void 0,this.context=e,this.api=new ae(e.config),this.appCache=new ee(e.config.appId),this.appInstallCache=new ee(e.config.appId,e.config.applicationInstallId),this.crypto=new me(e.config.appSecret),this.logger=t}}ye=ke,ke.create=(e,t,i,r,s)=>new ye({config:pe({...t},e,{type:i.name,ver:i.version.split("-")[0]},r,s)},s);const Ae=[exports.TrackingActivityNames.Order,exports.TrackingActivityNames.SubscriptionItemPurchase,exports.TrackingActivityNames.OneTimeItemPurchase],Pe={[exports.IabPrivacyConsentPurposeId.MeasureAdvertisingPerformance]:7};exports.ApiException=j,exports.ApiServiceProxyBase=W,exports.AppPermissionKeys=Q,exports.IabPrivacyConsentPurposeIdMap=Pe,exports.IdentityServiceProxy=G,exports.IngestServiceProxy=V,exports.SeekaApiHelper=ae,exports.SeekaAppCacheManager=ee,exports.SeekaAppConfig=q,exports.SeekaAppHelper=ke,exports.chunk=X,exports.decryptText=fe,exports.encryptText=ve,exports.getActivityName=e=>{const t=Object.keys(exports.TrackingActivityNames),i=e.toLowerCase(),r=t.find(e=>e.toLowerCase()===i);return r?exports.TrackingActivityNames[r]:exports.TrackingActivityNames.Custom},exports.isValidSeekaProfileId=function(e){if(!e||0===e.trim().length)return!1;const t=e.split(".").filter(e=>e.trim().length>0);return 4===t.length&&t[0].toLowerCase()==="sk".toLowerCase()&&t[1].toLowerCase()==="1".toLowerCase()&&!isNaN(parseInt(t[2],10))&&!isNaN(parseInt(t[3],10))},exports.matchActivityPipelineFilters=(e,t,i)=>{if(!e.activity)return[];const r=e.activity,s=r.activityName===exports.TrackingActivityNames.Custom?r.activityNameCustom:r.activityName;if(!s)return[];const o=s.toLowerCase(),n=[];return t.forEach(t=>{var a;if(!t)return;switch(t.type){case exports.ActivityPipelineActivityFilterType.ActivityTracked:if(!t.activityNames)return;if(!t.activityNames.find(e=>e.toLowerCase()===o))return;i.verbose("Matched activity tracked filter",{filter:t,activityName:s});break;case exports.ActivityPipelineActivityFilterType.PurchaseMade:if(!r.activityName||!Ae.includes(r.activityName))return;i.verbose("Matched purchase made activity filter",{filter:t,activityName:s});break;default:return void i.warn("Unknown activity filter type",{filter:t})}const c=t.sourceFilter;if(!c)return;const l=e.source,d=null!=l&&l.loc?new URL(l.loc).hostname.toLowerCase():null,p=null==l?void 0:l.pipeline,u=null==p||null==(a=p.convergePipelineIntegrationInstanceId)?void 0:a.toLowerCase(),h=c.filters?c.filters.map(e=>{switch(e.type){case exports.ActivityPipelineActivityFilterSourceItemType.Wildcard:return i.verbose("Matched wildcard source filter",{sourceFilter:e}),!0;case exports.ActivityPipelineActivityFilterSourceItemType.Domain:return!(!d||!e.key||d!==e.key.toLowerCase()||(i.verbose("Matched domain source filter",{sourceFilter:e,activityHostname:d}),0));case exports.ActivityPipelineActivityFilterSourceItemType.Pipeline:return!(!u||!e.key||u!==e.key.toLowerCase()||(i.verbose("Matched pipeline source filter",{sourceFilter:e,sourceConvergePipelineIntegrationInstanceId:u}),0))}}):[];switch(c.comparer){case exports.ConditionComparer.And:h.every(e=>!0===e)||n.push(t);break;case exports.ConditionComparer.Or:h.some(e=>!0===e)&&n.push(t);break;default:i.warn("Unknown source filter comparer",{sourceFilters:c})}}),n},exports.separatePersonFullName=e=>{if(!e)return{firstName:null,lastName:null};const t=e.trim().split(" ");return 1===t.length?{firstName:e,lastName:null}:2===t.length?{firstName:t[0],lastName:t[1]}:{firstName:t[0],lastName:t.slice(1).join(" ")}},exports.throwOnInvalidWebhookSignature=(e,t,i)=>{if(!le(e,t,i))throw new Error("Invalid webhook signature")},exports.validateWebhookSignature=le,exports.webhookSignatureHeaderName=ce;
|
|
2
2
|
//# sourceMappingURL=sdk-apps-server.js.map
|