@seeka-labs/sdk-apps-server 2.2.1 → 2.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/index.ts", "../src/helpers/util/index.ts", "../src/api/services/index.ts", "../src/api/models/index.ts", "../src/api/helper/auth/index.ts", "../src/cache/appCacheManager/index.ts", "../src/api/helper/serviceResolver/index.ts", "../src/api/helper/index.ts", "../src/api/webhooks/index.ts", "../package.json", "../src/api/helper/config/index.ts", "../src/helpers/util/crypto/index.ts", "../src/helpers/crypto/index.ts", "../src/helpers/app/index.ts", "../src/helpers/util/activity/index.ts", "../src/helpers/util/identity/index.ts", "../src/api/privacy/models/index.ts"],
4
- "sourcesContent": ["\n\nexport { SeekaApiHelper } from './api/helper';\nexport { AppPermissionKeys } from './api/models/index';\nexport * from './api/services';\nexport { throwOnInvalidWebhookSignature, validateWebhookSignature, webhookSignatureHeaderName } from './api/webhooks';\nexport { SeekaAppCacheManager } from './cache/appCacheManager';\nexport { SeekaAppHelper } from './helpers/app';\nexport { chunk, getActivityName, separatePersonFullName } from './helpers/util';\n\nexport { decryptText, encryptText } from './helpers/util/crypto';\n\nexport * from './helpers/util/activity';\nexport * from './helpers/util/identity';\n\nexport * from './api/privacy/models';\n\n// Auth helpers (token issuance + caching) \u2013 re-exported for reuse by other packages\nexport { getNewOrCachedAppInstallToken, getIssuer, getNewAppInstallToken } from './api/helper/auth';\n\n\n\n", "import * as crypto from 'crypto';\nimport { TrackingActivityNames } from '../../api/services';\n\nexport const generateNewSessionId = (): string => {\n /** Session ID where the tracking event originated from. Format of UTC time YYYYMMDD.HHMMSS.{random 6 digits} */\n const dateReference = dateToUtcDateTimeReferenceString(new Date());\n const random = getRandomNumberString();\n\n return `${dateReference}.${random}`;\n}\n\nexport const getActivityName = (event: string): TrackingActivityNames => {\n const vals = Object.keys(TrackingActivityNames)\n const evLower = event.toLowerCase();\n\n const matched = vals.find(e => e.toLowerCase() === evLower);\n\n if (matched) {\n return TrackingActivityNames[matched as keyof typeof TrackingActivityNames];\n }\n\n return TrackingActivityNames.Custom;\n}\n\nexport const getRandomNumberString = (): string => {\n const min = 1000000000;\n const max = 9999999999;\n return Math.floor(Math.random() * (max - min) + min).toString();\n}\n\nexport const dateToUtcDateTimeReferenceString = (forDateTime: Date): string => {\n let month = (forDateTime.getUTCMonth() + 1).toString();\n if (month.length < 2) {\n month = \"0\" + month;\n }\n let day = forDateTime.getUTCDate().toString();\n if (day.length < 2) {\n day = \"0\" + day;\n }\n let hour = forDateTime.getUTCHours().toString();\n if (hour.length < 2) {\n hour = \"0\" + hour;\n }\n let minute = forDateTime.getUTCMinutes().toString();\n if (minute.length < 2) {\n minute = \"0\" + minute;\n }\n let second = forDateTime.getUTCSeconds().toString();\n if (second.length < 2) {\n second = \"0\" + second;\n }\n\n return `${forDateTime.getUTCFullYear()}${month}${day}.${hour}${minute}${second}`;\n}\n\nexport const md5Hash = (input: string): string => {\n return crypto.createHash('md5').update(input).digest(\"hex\");\n}\n\nexport const separatePersonFullName = (fullname: string): { firstName: string | null, lastName: string | null } => {\n if (!fullname) return { firstName: null, lastName: null };\n\n const parts = fullname.trim().split(' ');\n if (parts.length === 1) return { firstName: fullname, lastName: null };\n else if (parts.length === 2) return { firstName: parts[0], lastName: parts[1] };\n else return { firstName: parts[0], lastName: parts.slice(1).join(' ') };\n}\n\n// Replicates lodash chunk method\nexport const chunk = <T>(array: T[], size: number): T[][] => {\n return array.reduce((resultArray: Array<T[]>, item, index) => {\n const chunkIndex = Math.floor(index / size)\n\n if (!resultArray[chunkIndex]) {\n resultArray[chunkIndex] = [] // start a new chunk\n }\n\n resultArray[chunkIndex].push(item)\n\n return resultArray\n }, [])\n}", "//----------------------\n// <auto-generated>\n// Generated using the NSwag toolchain v14.4.0.0 (NJsonSchema v11.3.2.0 (Newtonsoft.Json v13.0.0.0)) (http://NSwag.org)\n// </auto-generated>\n//----------------------\n\n/* tslint:disable */\n/* eslint-disable */\n// ReSharper disable InconsistentNaming\n\nimport axios, { AxiosError } from 'axios';\nimport { Logger } from 'winston';\nimport type { AxiosInstance, AxiosRequestConfig, AxiosResponse, CancelToken, Canceler } from 'axios';\nexport class SeekaAppConfig {\n appId!: string;\n appSecret!: string;\n ingestUrl!: string;\n issuerUrl!: string;\n organisationId!: string;\n applicationInstallId!: string;\n runtime!: AppRuntimeInfo;\n logger?: Logger\n grantedPermissions!: string[];\n\n transformApiRequest!: (options: AxiosRequestConfig) => Promise<AxiosRequestConfig>;\n transformApiResponse!: (url: string, response: AxiosResponse<any, any>, processor: (response: AxiosResponse<any, any>) => any) => any;\n hasAnyPermissions!: (permissionKeys: string[]) => boolean\n hasAllPermissions!: (permissionKeys: string[]) => boolean\n hasPermission!: (permissionKey: string) => boolean\n}\n\nexport class ApiServiceProxyBase {\n private readonly config: SeekaAppConfig;\n\n protected constructor(config: SeekaAppConfig) {\n this.config = config;\n }\n\n protected transformOptions = async (options: AxiosRequestConfig): Promise<AxiosRequestConfig> => {\n return await this.config.transformApiRequest(options);\n };\n\n protected transformResult = async (url: string, response: AxiosResponse<any, any>, processor: (response: AxiosResponse<any, any>) => any) => {\n return await this.config.transformApiResponse(url, response, processor);\n }\n}\n\nexport class IdentityServiceProxy extends ApiServiceProxyBase {\n protected instance: AxiosInstance;\n protected baseUrl: string;\n protected jsonParseReviver: ((key: string, value: any) => any) | undefined = undefined;\n\n constructor(configuration: SeekaAppConfig, baseUrl?: string, instance?: AxiosInstance) {\n\n super(configuration);\n\n this.instance = instance || axios.create();\n\n this.baseUrl = baseUrl ?? \"https://api-localdev-env0-seeka.au.ngrok.io\";\n\n }\n\n /**\n * Merge identity\n */\n merge(payload: PersonIdentificationRequest, cancelToken?: CancelToken): Promise<ApiResponseDtoOfPersonIdentificationResolutionResponse> {\n let url_ = this.baseUrl + \"/api/identity\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n const content_ = JSON.stringify(payload);\n\n let options_: AxiosRequestConfig = {\n data: content_,\n method: \"POST\",\n url: url_,\n headers: {\n \"Content-Type\": \"application/json\",\n \"Accept\": \"application/json\"\n },\n cancelToken\n };\n\n return this.transformOptions(options_).then(transformedOptions_ => {\n return this.instance.request(transformedOptions_);\n }).catch((_error: any) => {\n if (isAxiosError(_error) && _error.response) {\n return _error.response;\n } else {\n throw _error;\n }\n }).then((_response: AxiosResponse) => {\n return this.transformResult(url_, _response, (_response: AxiosResponse) => this.processMerge(_response));\n });\n }\n\n protected processMerge(response: AxiosResponse): Promise<ApiResponseDtoOfPersonIdentificationResolutionResponse> {\n const status = response.status;\n let _headers: any = {};\n if (response.headers && typeof response.headers === \"object\") {\n for (const k in response.headers) {\n if (response.headers.hasOwnProperty(k)) {\n _headers[k] = response.headers[k];\n }\n }\n }\n if (status === 200) {\n const _responseText = response.data;\n let result200: any = null;\n let resultData200 = _responseText;\n result200 = JSON.parse(resultData200);\n return Promise.resolve<ApiResponseDtoOfPersonIdentificationResolutionResponse>(result200);\n\n } else if (status === 401) {\n const _responseText = response.data;\n let result401: any = null;\n let resultData401 = _responseText;\n result401 = JSON.parse(resultData401);\n return throwException(\"A server side error occurred.\", status, _responseText, _headers, result401);\n\n } else if (status === 422) {\n const _responseText = response.data;\n let result422: any = null;\n let resultData422 = _responseText;\n result422 = JSON.parse(resultData422);\n return throwException(\"A server side error occurred.\", status, _responseText, _headers, result422);\n\n } else if (status === 400) {\n const _responseText = response.data;\n let result400: any = null;\n let resultData400 = _responseText;\n result400 = JSON.parse(resultData400);\n return throwException(\"A server side error occurred.\", status, _responseText, _headers, result400);\n\n } else if (status !== 200 && status !== 204) {\n const _responseText = response.data;\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n }\n return Promise.resolve<ApiResponseDtoOfPersonIdentificationResolutionResponse>(null as any);\n }\n}\n\nexport class IngestServiceProxy extends ApiServiceProxyBase {\n protected instance: AxiosInstance;\n protected baseUrl: string;\n protected jsonParseReviver: ((key: string, value: any) => any) | undefined = undefined;\n\n constructor(configuration: SeekaAppConfig, baseUrl?: string, instance?: AxiosInstance) {\n\n super(configuration);\n\n this.instance = instance || axios.create();\n\n this.baseUrl = baseUrl ?? \"https://api-localdev-env0-seeka.au.ngrok.io\";\n\n }\n\n /**\n * Track activity\n */\n batch(payload: DataIngestBatchHttpRequest, cancelToken?: CancelToken): Promise<void> {\n let url_ = this.baseUrl + \"/api/ingest\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n const content_ = JSON.stringify(payload);\n\n let options_: AxiosRequestConfig = {\n data: content_,\n method: \"POST\",\n url: url_,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n cancelToken\n };\n\n return this.transformOptions(options_).then(transformedOptions_ => {\n return this.instance.request(transformedOptions_);\n }).catch((_error: any) => {\n if (isAxiosError(_error) && _error.response) {\n return _error.response;\n } else {\n throw _error;\n }\n }).then((_response: AxiosResponse) => {\n return this.transformResult(url_, _response, (_response: AxiosResponse) => this.processBatch(_response));\n });\n }\n\n protected processBatch(response: AxiosResponse): Promise<void> {\n const status = response.status;\n let _headers: any = {};\n if (response.headers && typeof response.headers === \"object\") {\n for (const k in response.headers) {\n if (response.headers.hasOwnProperty(k)) {\n _headers[k] = response.headers[k];\n }\n }\n }\n if (status === 202) {\n const _responseText = response.data;\n return Promise.resolve<void>(null as any);\n\n } else if (status === 401) {\n const _responseText = response.data;\n let result401: any = null;\n let resultData401 = _responseText;\n result401 = JSON.parse(resultData401);\n return throwException(\"A server side error occurred.\", status, _responseText, _headers, result401);\n\n } else if (status === 422) {\n const _responseText = response.data;\n let result422: any = null;\n let resultData422 = _responseText;\n result422 = JSON.parse(resultData422);\n return throwException(\"A server side error occurred.\", status, _responseText, _headers, result422);\n\n } else if (status === 400) {\n const _responseText = response.data;\n let result400: any = null;\n let resultData400 = _responseText;\n result400 = JSON.parse(resultData400);\n return throwException(\"A server side error occurred.\", status, _responseText, _headers, result400);\n\n } else if (status !== 200 && status !== 204) {\n const _responseText = response.data;\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n }\n return Promise.resolve<void>(null as any);\n }\n}\n\nexport interface ApiResponseDtoOfPersonIdentificationResolutionResponse {\n result?: PersonIdentificationResolutionResponse;\n}\n\nexport interface PersonIdentificationResolutionResponse {\n personId?: string;\n}\n\nexport interface ApiResponseDtoOfObject {\n result?: any;\n}\n\nexport interface DetailedApiResponseDtoOfObject extends ApiResponseDtoOfObject {\n type?: ResponseResultType;\n error?: ErrorInfo;\n success?: boolean;\n}\n\nexport interface ApiResponseErrorDtoOfObject extends DetailedApiResponseDtoOfObject {\n}\n\nexport interface ApiResponseError extends ApiResponseErrorDtoOfObject {\n}\n\nexport enum ResponseResultType {\n Undefined = \"undefined\",\n Success = \"success\",\n Failed = \"failed\",\n}\n\nexport interface ErrorInfo {\n message?: string;\n code?: number;\n correlationId?: string;\n validation?: ValidationSummary;\n}\n\nexport interface ValidationSummary {\n properties?: PropertyValidationError[];\n}\n\nexport interface PropertyValidationError {\n errorKey?: string;\n helpActions?: HelpAction[];\n propertyName?: string;\n attemptedValue?: any;\n errorMessage?: string;\n children?: PropertyValidationError[];\n}\n\nexport interface HelpAction {\n helpActionUrl?: string;\n helpActionTitle?: string;\n}\n\nexport interface PersonIdentificationRequest {\n /** Collection of identifiers used to calculate the identity graph. */\n id: PersonIdentifiers;\n /** Source of the identification request. */\n src: TrackingEventSource;\n}\n\nexport interface PersonIdentifiersBase {\n /** Browser user agent */\n ua?: string[];\n /** IP Address */\n ip?: string[];\n /** Seeka Person ID - Identity graph ID */\n seekaPId?: string;\n /** Seeka Browser ID */\n seekaBId?: string[];\n /** Email address */\n email?: string[];\n /** Gender */\n gender?: string[];\n /** Phone number. Recommended to provide in E.164 format. */\n phone?: string[];\n /** External ID */\n eid?: string[];\n /** First name */\n firstName?: string[];\n /** Last name / surname */\n lastName?: string[];\n /** Shipping, mailing or residential address */\n address?: PlaceAddress[];\n /** Date of birth */\n dob?: Date[];\n /** Shopify identifiers */\n shopify?: ShopifyPersonIdentifiers;\n /** WooCommerce identifiers */\n wooCommerce?: WooCommercePersonIdentifiers;\n /** BigCommerce identifiers */\n bigCommerce?: BigCommercePersonIdentifiers;\n /** Magento identifiers */\n magento?: MagentoPersonIdentifiers;\n /** Klaviyo identifiers scoped by Klaviyo account ID */\n klaviyo?: ScopedIdentifiersOfKlaviyoPersonIdentifiersDtoAndString;\n /** Arbitrary traits */\n traits?: { [key: string]: any; };\n}\n\nexport interface PersonIdentifiers extends PersonIdentifiersBase {\n /** Facebook identifiers */\n facebook?: FacebookPersonIdentifiers;\n /** Snapchat identifiers */\n snapchat?: SnapchatPersonIdentifiers;\n /** TikTok identifiers */\n tiktok?: TikTokPersonIdentifiers;\n /** Google identifiers */\n google?: GooglePersonIdentifiers;\n /** Pinterest identifiers */\n pinterest?: PinterestPersonIdentifiers;\n /** Marketing, analytics and other third-party opt in/consent information */\n consent?: PersonConsentInfo;\n}\n\nexport interface BrandScopedFacebookPersonIdentifiers {\n /** Facebook user login ID */\n login?: string[];\n /** Facebook click ID */\n fbc?: string[];\n /** Facebook lead ID */\n lead?: string[];\n}\n\nexport interface FacebookPersonIdentifiers extends BrandScopedFacebookPersonIdentifiers {\n /** Facebook pixel / browser ID */\n fbp?: string[];\n}\n\nexport interface BrandScopedSnapchatPersonIdentifiers {\n /** Snapchat click ID */\n sccid?: string[];\n}\n\nexport interface SnapchatPersonIdentifiers extends BrandScopedSnapchatPersonIdentifiers {\n /** Snapchat pixel / browser ID */\n scid?: string[];\n}\n\nexport interface BrandScopedTikTokPersonIdentifiers {\n /** TikTok click ID */\n ttclid?: string[];\n /** TikTok lead ID */\n lead?: string[];\n}\n\nexport interface TikTokPersonIdentifiers extends BrandScopedTikTokPersonIdentifiers {\n /** TikTok pixel / browser ID */\n ttp?: string[];\n}\n\nexport interface BrandScopedGooglePersonIdentifiers {\n /** Google click ID */\n gclid?: string[];\n /** Google Braid ID */\n gbraid?: string[];\n /** Google Web Braid ID */\n wbraid?: string[];\n}\n\nexport interface GooglePersonIdentifiers extends BrandScopedGooglePersonIdentifiers {\n /** Google user client ID */\n userClientId?: string[];\n}\n\nexport interface BrandScopedPinterestPersonIdentifiers {\n /** Pinterest click ID / epik ID */\n epik?: string[];\n}\n\nexport interface PinterestPersonIdentifiers extends BrandScopedPinterestPersonIdentifiers {\n}\n\nexport interface PersonConsentInfo {\n /** Grant for sending data to 3rd party analytics and marketing platforms. */\n analytics?: ConsentInfo;\n /** Grant for marketing via re-marketing campaigns, EDMs etc. */\n marketing?: MarketingConsentInfo;\n /** Grant for enrolling and participating in loyalty programs. */\n loyalty?: ConsentInfo;\n privacy?: PrivacyState;\n}\n\nexport interface ConsentInfo {\n /** Type of consent */\n type?: PrivacyConsentType;\n /** When the consent was granted. */\n consentGrantedAt?: Date | undefined;\n /** The name of the source that provided the grant information. Set to the source platform like Shopify, Wordpress or your custom integration client name. */\n consentGrantedSourceName?: string;\n /** When the consent was not granted. */\n consentNotGrantedAt?: Date | undefined;\n /** The name of the source that provided the grant information. Set to the source platform like Shopify, Wordpress or your custom integration client name. */\n consentNotGrantedSourceName?: string;\n}\n\nexport enum PrivacyConsentType {\n Unknown = \"unknown\",\n Informed = \"informed\",\n Implied = \"implied\",\n Explicit = \"explicit\",\n Active = \"active\",\n Passive = \"passive\",\n}\n\nexport interface MarketingConsentInfo {\n email?: ConsentInfo;\n sms?: ConsentInfo;\n}\n\nexport interface PrivacyState {\n /** Transparency and Consent Framework (TCF) consent string v2.0\nSee https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20Consent%20string%20and%20vendor%20list%20formats%20v2.md */\n tcfConsentString?: string | undefined;\n}\n\nexport interface PlaceAddress {\n description?: string;\n addressLine1?: string;\n addressLine2?: string;\n streetName?: string;\n locality?: string;\n /** Full name of the state / province / territory */\n state?: string;\n /** ISO 3166-2 - Two or three character subdivision code */\n stateCode?: string;\n postcode?: string;\n /** Full name of the country */\n country?: string;\n /** ISO 3166-2 - Two character country code */\n countryCode?: string;\n googlePlaceId?: string;\n timeZone?: TimeZoneInfo;\n geoLocation?: GeographicalCoordinate;\n}\n\nexport interface TimeZoneInfo {\n /** IANA timezone ID */\n friendlyId?: string;\n description?: string;\n}\n\nexport interface GeographicalCoordinate {\n /** Longitude */\n longitude?: number;\n /** Latitude */\n latitude?: number;\n}\n\nexport interface ShopifyPersonIdentifiers {\n customerId?: string[];\n uniqueToken?: string[];\n microSessionId?: string[];\n visitToken?: string[];\n cartToken?: string[];\n checkoutToken?: string[];\n cartId?: string[];\n deviceId?: string[];\n checkoutId?: string[];\n orderId?: string[];\n sessionHash?: string[];\n}\n\nexport interface WooCommercePersonIdentifiers {\n customerId?: string[];\n orderId?: string[];\n cartHash?: string[];\n}\n\nexport interface BigCommercePersonIdentifiers {\n /** BigCommerce */\n customerId?: string[];\n /** BigCommerce */\n cartId?: string[];\n /** BigCommerce */\n orderId?: string[];\n}\n\nexport interface MagentoPersonIdentifiers {\n /** Magento customer */\n customerId?: string[];\n /** Magento cart */\n cartId?: string[];\n /** Magento order unique identifier */\n orderId?: string[];\n /** Magento order number / incremental ID */\n orderNumber?: string[];\n /** Magento checkout */\n checkoutId?: string[];\n}\n\nexport interface ScopedIdentifiersOfKlaviyoPersonIdentifiersDtoAndString {\n data?: { [key: string]: KlaviyoPersonIdentifiers; };\n}\n\nexport interface KlaviyoPersonIdentifiers {\n /** Klaviyo profile ID */\n profileId?: string[] | undefined;\n}\n\nexport interface TrackingEventSource {\n /** Source method that requested the tracking. */\n method: string;\n /** Type of origin that generated the tracking request.\nThis is not the same as where the tracking event originated from, this property specifies where the tracking event was tracked from. */\n origin?: TrackingEventSourceOriginType | undefined;\n /** Time occurred. Do not provide to use server time (recommended) */\n time?: Date | undefined;\n /** URL where the tracking event originated from. */\n loc: string;\n /** Title of the view or page where the tracking event originated from. */\n vt?: string | undefined;\n /** Session ID where the tracking event originated from. UTC date.time and then random digits.\nFormat YYYYMMDD.HHMMSS.{random 10 digits} */\n sess?: string | undefined;\n /** Diagnosis session ID. UTC date.time and then random digits.\nFormat YYYYMMDD.HHMMSS.{random 10 digits} */\n diag?: string | undefined;\n runtime?: SeekaSdkRuntimeInfo;\n /** Context of the pipeline integration that raised the tracking event. */\n pipeline?: SeekaPipelineIntegrationSource | undefined;\n /** IP address */\n ip?: string | undefined;\n device?: DeviceTrackingSource | undefined;\n privacy?: PrivacyState | undefined;\n}\n\nexport enum TrackingEventSourceOriginType {\n Browser = \"browser\",\n Server = \"server\",\n Mobile = \"mobile\",\n Desktop = \"desktop\",\n PhysicalStore = \"physicalStore\",\n Email = \"email\",\n Phone = \"phone\",\n Chat = \"chat\",\n Automatic = \"automatic\",\n}\n\nexport interface SeekaSdkRuntimeInfo {\n /** Version of the package or library being used to interact with the SDK */\n ver?: string;\n /** Type of the package or library being used to interact with the SDK */\n type?: string;\n client?: SeekaSdkClientRuntimeInfo;\n}\n\nexport interface SeekaSdkClientRuntimeInfo {\n /** Client version used to identify the implementation of the SDK */\n ver?: string;\n /** Name or type used to identify the implementation of the SDK. This could be specified as 'backend' for a backend integration with the SDK or 'website' for integrations placed on a website. */\n type?: string;\n origin?: SeekaSdkClientRuntimeOrigin | undefined;\n}\n\nexport interface SeekaSdkClientRuntimeOrigin {\n h?: string | undefined;\n}\n\nexport interface SeekaPipelineIntegrationSource {\n convergePipelineIntegrationInstanceId?: string;\n /** The IntegrationVendorNameKey could be set to \"Klaviyo\" for all Klaviyo pipeline integration classes so that the rate limit for certain operations are shared across all Klaviyo integration instances that share the same IntegrationInstanceUniqueKey\nAlpha only\nMax length of 12 characters */\n integrationVendorNameKey?: string;\n /** In format of IntegrationPublisherCompany.IntegrationVendorNameKey.IntegrationName. Eg. Seeka.Klaviyo.Identity */\n convergePipelineIntegrationTypeKey?: string;\n}\n\nexport interface DeviceTrackingSource {\n /** Browser name (Chrome, Firefox, Safari, etc) */\n bn?: string | undefined;\n /** Browser version */\n bv?: string | undefined;\n /** Platform name (Win32, OSX etc) */\n pl?: string | undefined;\n /** Device fingerprint */\n fp?: string | undefined;\n}\n\nexport interface DataIngestBatchHttpRequest {\n /** Max batch size is 50 */\n data?: DataIngestBatchHttpItem[];\n}\n\nexport interface DataIngestBatchHttpItem {\n ev?: ActivityTrackingRequest | undefined;\n id?: PersonIdentificationRequest | undefined;\n bot?: BotMetricTrackingRequest | undefined;\n log?: ActivityLogRequest | undefined;\n}\n\nexport interface ActivityTrackingRequest {\n /** Collection of identifiers used to calculate the identity graph. */\n id: PersonIdentifiers;\n /** Source of the identification request. */\n src: TrackingEventSource;\n /** Custom properties to attach to tracking event */\n props?: { [key: string]: string; };\n /** UTM tracking information */\n utm?: UtmTrackingEvent[];\n /** Activity tracking information */\n payload?: ActivityPayload;\n}\n\nexport interface UtmTrackingEvent {\n /** UTM ID */\n id?: string;\n /** UTM content */\n content?: string;\n /** UTM source */\n source?: string;\n /** UTM campaign */\n campaign?: string;\n /** UTM term */\n term?: string;\n /** UTM medium */\n medium?: string;\n}\n\nexport interface ActivityPayloadBase {\n /** Standard or custom activity / behavior activity name. */\n activityName?: TrackingActivityNames;\n /** Required if ActivityName is set to Custom.\nWhen setting this parameter in conjunction with setting ActivityName to a standard event name, Seeka will process the event\nas a standard event with the exception of conversion based data destinations being sent the event as the ActivityNameCustom value\nwith the parameters of the standard event. */\n activityNameCustom?: string;\n /** Unique identifier used to de-duplicate activities */\n activityId?: string;\n /** E-Commerce specific activity properties */\n commerce?: CommerceActivityTrackingEventMetadata;\n /** Search function specific activity properties */\n search?: SearchActivityTrackingEventMetadata;\n /** Sign up / newsletter function specific activity properties */\n signUp?: SignUpActivityTrackingEventMetadata;\n /** User account specific activity properties */\n userAccount?: UserAccountActivityTrackingEventMetadata;\n /** Promotion specific activity properties */\n promotion?: PromotionalActivityTrackingEventMetadata;\n /** Content behavior specific activity properties */\n contentBehaviour?: ContentBehaviourActivityTrackingEventMetadata;\n /** Lead activity properties */\n lead?: LeadActivityTrackingEventMetadata;\n /** Content item activity properties */\n contentItem?: ContentItemActivityTrackingEventMetadata;\n /** Custom properties attached to the tracking event */\n properties?: { [key: string]: string; };\n}\n\nexport interface ActivityPayload extends ActivityPayloadBase {\n /** Time activity occurred. Do not provide to use server time (recommended) */\n time?: Date | undefined;\n}\n\nexport enum TrackingActivityNames {\n Undefined = \"undefined\",\n PageViewOrganic = \"pageViewOrganic\",\n PageViewUtmAttributed = \"pageViewUtmAttributed\",\n AddPaymentMethod = \"addPaymentMethod\",\n AddToWishlist = \"addToWishlist\",\n ContactMessage = \"contactMessage\",\n Custom = \"custom\",\n SyncCart = \"syncCart\",\n Order = \"order\",\n InitiateCheckout = \"initiateCheckout\",\n AddToCart = \"addToCart\",\n RemoveFromCart = \"removeFromCart\",\n OneTimeItemPurchase = \"oneTimeItemPurchase\",\n SubscriptionItemPurchase = \"subscriptionItemPurchase\",\n ViewProduct = \"viewProduct\",\n ViewPage = \"viewPage\",\n ApplyPromotionalCode = \"applyPromotionalCode\",\n KeywordSearch = \"keywordSearch\",\n UserLoginSignup = \"userLoginSignup\",\n UserLogin = \"userLogin\",\n NewsletterSignup = \"newsletterSignup\",\n Lead = \"lead\",\n ChangeProductAttribute = \"changeProductAttribute\",\n FilterItemsByAttribute = \"filterItemsByAttribute\",\n Schedule = \"schedule\",\n ViewContentItem = \"viewContentItem\",\n StartTrial = \"startTrial\",\n}\n\nexport interface CommerceActivityTrackingEventMetadata {\n products?: CommerceActivityTrackingEventProductMetadata[];\n /** Identifier of the checkout */\n checkoutIdentifier?: string;\n /** Identifier of the cart */\n cartIdentifier?: string;\n /** Identifier of the order */\n orderIdentifier?: string;\n /** Incremental ID of the order */\n orderNumber?: string;\n /** Identifier of the customer */\n customerIdentifier?: string;\n /** Where the order was placed */\n sourceChannelName?: string;\n /** Type of the e-commerce platform */\n platformType?: ECommercePlatform;\n /** Payment method name */\n paymentMethodName?: string;\n /** ISO 4217 3 letter currency code */\n currencyCode?: string;\n /** Test order */\n isTest?: boolean;\n /** Total refunds */\n totalRefunds?: number | undefined;\n /** Total discounts */\n totalDiscounts?: number | undefined;\n /** Total sum of all the line items in the order\nCan be left empty to auto calculate */\n totalLineItemsPrice?: number | undefined;\n /** Total price of the order paid by the purchaser */\n totalPrice?: number | undefined;\n /** Total tax */\n totalTax?: number | undefined;\n /** Total shipping price */\n totalShippingPrice?: number | undefined;\n /** Fulfillment status */\n fulfillmentStatus?: ECommerceFulfillmentStatus | undefined;\n /** Financial status */\n financialStatus?: ECommerceFinancialStatus | undefined;\n}\n\nexport interface CommerceActivityTrackingEventProductMetadata {\n /** ISO 4217 currency code */\n currencyCode?: string;\n /** Product ID */\n productIdentifier?: string;\n /** Variant ID */\n variantIdentifier?: string;\n /** SKU */\n sku?: string;\n /** Identifier of the line item */\n lineItemIdentifier?: string;\n /** Name of product */\n productName?: string;\n /** Name of variant */\n variantName?: string;\n /** Name of category */\n categoryName?: string;\n /** Brand of the item */\n brandName?: string;\n /** Price of a single item */\n unitPrice?: number | undefined;\n /** Quantity */\n quantity?: number | undefined;\n /** Total discounts */\n totalDiscount?: number | undefined;\n /** Type of product or collection */\n type?: ECommerceContentType | undefined;\n /** Additional attributes of the product */\n attributes?: { [key: string]: any; };\n}\n\nexport enum ECommerceContentType {\n Undefined = \"undefined\",\n SingleProduct = \"singleProduct\",\n SingleVariant = \"singleVariant\",\n Collection = \"collection\",\n}\n\nexport enum ECommercePlatform {\n None = \"none\",\n BigCommerce = \"bigCommerce\",\n Shopify = \"shopify\",\n OrderGroove = \"orderGroove\",\n Magento = \"magento\",\n Generic = \"generic\",\n WooCommerce = \"wooCommerce\",\n Demandware = \"demandware\",\n}\n\n/** https://shopify.dev/api/admin-rest/2022-01/resources/order#resource-object */\nexport enum ECommerceFulfillmentStatus {\n Undefined = \"undefined\",\n Fulfilled = \"fulfilled\",\n NoneFulfilled = \"noneFulfilled\",\n PartiallyFulfilled = \"partiallyFulfilled\",\n RestockedOrCancelled = \"restockedOrCancelled\",\n Pending = \"pending\",\n}\n\n/** https://shopify.dev/api/admin-rest/2022-01/resources/order#resource-object */\nexport enum ECommerceFinancialStatus {\n Undefined = \"undefined\",\n Pending = \"pending\",\n Authorized = \"authorized\",\n PartiallyPaid = \"partiallyPaid\",\n Paid = \"paid\",\n PartiallyRefunded = \"partiallyRefunded\",\n Refunded = \"refunded\",\n Voided = \"voided\",\n}\n\nexport interface SearchActivityTrackingEventMetadata {\n searchText?: string;\n}\n\nexport interface UserAccountActivityTrackingEventMetadata {\n emailAddress?: string | undefined;\n userAccountIdentifierValue?: string | undefined;\n userAccountIdentifierTypeName?: string | undefined;\n}\n\nexport interface SignUpActivityTrackingEventMetadata extends UserAccountActivityTrackingEventMetadata {\n}\n\nexport interface PromotionalActivityTrackingEventMetadata {\n code?: string;\n}\n\nexport interface ContentBehaviourActivityTrackingEventMetadata {\n /** Behavior that changes or customised a product via an attribute. */\n changeProduct?: ChangeProductAttributeActivityTrackingEventMetadata;\n /** Behavior that filters a list of items or content via an attribute. */\n filterItems?: FilterItemsByAttributeActivityTrackingEventMetadata;\n}\n\nexport interface ChangeProductAttributeActivityTrackingEventMetadata {\n /** Name of the type of attribute. */\n attributeTypeName?: string;\n /** Previous value of the attribute before the change. */\n previousAttributeValue?: string;\n /** Value the attribute was changed to. */\n newAttributeValue?: string;\n /** Product that relates to attribute change. */\n product?: CommerceActivityTrackingEventProductMetadata;\n}\n\nexport interface FilterItemsByAttributeActivityTrackingEventMetadata {\n /** Name of the type of attribute that is being filtered by. */\n attributeTypeName?: string;\n /** String value of the filter. Use only one of StringValue, NumericValue, BooleanValue or DateValue properties. */\n stringValue?: string;\n /** Numerical value of the filter. Use only one of StringValue, NumericValue, BooleanValue or DateValue properties. */\n numericValue?: number | undefined;\n /** Date value of the filter. Use only one of StringValue, NumericValue, BooleanValue or DateValue properties. */\n dateValue?: Date | undefined;\n /** Boolean (true/false) value of the filter. Use only one of StringValue, NumericValue, BooleanValue or DateValue properties. */\n booleanValue?: boolean | undefined;\n}\n\nexport interface LeadActivityTrackingEventMetadata {\n sourceContentName?: string;\n companySize?: string;\n companyName?: string;\n predictedLtv?: number | undefined;\n predictedValue?: number | undefined;\n /** ISO 4217 currency code */\n currencyCode?: string;\n}\n\nexport interface ContentItemActivityTrackingEventMetadata {\n contentName?: string;\n identifiers?: string[];\n categoryName?: string;\n /** ISO 4217 currency code */\n currencyCode?: string;\n value?: number | undefined;\n contentType?: ECommerceContentType | undefined;\n items?: CommerceActivityTrackingEventProductMetadata[];\n}\n\nexport interface BotMetricTrackingRequest extends PersonIdentificationRequest {\n}\n\nexport interface ActivityTrackingBase {\n id?: string;\n source?: TrackingEventSource;\n properties?: { [key: string]: string; };\n utm?: UtmTrackingEvent;\n}\n\nexport interface ActivityLogRequest extends ActivityTrackingBase {\n logType?: ConvergePipelineLoggableActivityType;\n logLevel?: SdkLogEventLevel;\n messageTemplate?: string;\n identifiers?: PersonIdentifiers;\n}\n\nexport enum ConvergePipelineLoggableActivityType {\n Generic = \"generic\",\n ActivityIngress = \"activityIngress\",\n ActivityEgress = \"activityEgress\",\n UserProfile = \"userProfile\",\n SdkLog = \"sdkLog\",\n Detections = \"detections\",\n ActivityEgressFilter = \"activityEgressFilter\",\n Diagnosis = \"diagnosis\",\n PipelineIntegrationOutput = \"pipelineIntegrationOutput\",\n}\n\nexport enum SdkLogEventLevel {\n Information = \"information\",\n Warning = \"warning\",\n Error = \"error\",\n Verbose = \"verbose\",\n}\n\nexport enum SeekaWebhookCallType {\n None = \"none\",\n Probe = \"probe\",\n AppInstalled = \"appInstalled\",\n IdentityChanged = \"identityChanged\",\n ActivityAccepted = \"activityAccepted\",\n AppInstallSettingsUpdated = \"appInstallSettingsUpdated\",\n AppUninstalled = \"appUninstalled\",\n BrowserSdkPlugin = \"browserSdkPlugin\",\n}\n\nexport interface SeekaWebhookPayload {\n type?: SeekaWebhookCallType;\n /** Determines if the webhook is sent as a result of a test call */\n isTest?: boolean;\n /** Unique identifier for the webhook request */\n requestId?: string;\n causationId?: string | undefined;\n}\n\nexport interface SeekaWebhookPayloadOfSeekaAppWebhookContext extends SeekaWebhookPayload {\n context?: SeekaAppWebhookContext;\n}\n\nexport interface SeekaAppWebhookContext {\n /** ID of the organisation that installed the app */\n organisationId?: string;\n /** ID of the brand that installed the app */\n organisationBrandId?: string;\n /** Pipeline integration ID / ID of the installation of the app */\n applicationInstallId?: string;\n /** The client / application ID */\n applicationId?: string;\n}\n\nexport interface SeekaBrowserSdkPluginWebhookResponse {\n content: string;\n init: string;\n}\n\nexport interface SeekaWebhookPayloadOfSeekaAppWebhookContextAndSeekaAppInstalledWebhookContent extends SeekaWebhookPayloadOfSeekaAppWebhookContext {\n content?: SeekaAppInstalledWebhookContent;\n}\n\nexport interface SeekaAppInstalledWebhookContent {\n installationSettings?: { [key: string]: any; };\n /** The permissions granted to the app install by the user that installed the app. */\n grantedPermissions?: string[];\n}\n\nexport interface SeekaAppInstalledWebhookPayload extends SeekaWebhookPayloadOfSeekaAppWebhookContext {\n content?: SeekaAppInstalledWebhookContent;\n}\n\nexport interface SeekaWebhookPayloadOfSeekaAppWebhookContextAndSeekaAppUninstalledWebhookContent extends SeekaWebhookPayloadOfSeekaAppWebhookContext {\n content?: SeekaAppUninstalledWebhookContent;\n}\n\nexport interface SeekaAppUninstalledWebhookContent {\n installationSettings?: { [key: string]: any; };\n}\n\nexport interface SeekaAppUninstalledWebhookPayload extends SeekaWebhookPayloadOfSeekaAppWebhookContext {\n content?: SeekaAppUninstalledWebhookContent;\n}\n\nexport interface SeekaWebhookPayloadOfSeekaAppWebhookContextAndSeekaAppInstallSettingsUpdatedWebhookContent extends SeekaWebhookPayloadOfSeekaAppWebhookContext {\n content?: SeekaAppInstallSettingsUpdatedWebhookContent;\n}\n\nexport interface SeekaAppInstallSettingsUpdatedWebhookContent {\n installationSettings?: { [key: string]: any; };\n /** The permissions granted to the app install by the user that installed the app. */\n grantedPermissions?: string[];\n}\n\nexport interface SeekaAppInstallSettingsUpdatedWebhookPayload extends SeekaWebhookPayloadOfSeekaAppWebhookContext {\n content?: SeekaAppInstallSettingsUpdatedWebhookContent;\n}\n\nexport interface SeekaWebhookPayloadOfSeekaAppWebhookContextAndSeekaActivityAcceptedWebhookContent extends SeekaWebhookPayloadOfSeekaAppWebhookContext {\n content?: SeekaActivityAcceptedWebhookContent;\n}\n\nexport interface SeekaActivityAcceptedWebhookContent {\n /** Source of the activity */\n source?: TrackingEventSource;\n /** Identifiers resolved to the activity */\n identifiers?: PersonIdentifiers;\n /** Activity metadata */\n activity?: WebsiteEventActivityAppsPayload;\n /** Attribution metadata */\n attribution?: AttributionInfo | undefined;\n /** Seeka Person ID - Identity Graph ID */\n personId?: string;\n}\n\nexport interface WebsiteEventActivityAppsPayload extends ActivityPayloadBase {\n /** Time activity occurred */\n time?: Date;\n}\n\nexport interface AttributionInfo {\n click?: ClickAttributionInfo | undefined;\n utm?: UtmTrackingEvent | undefined;\n}\n\nexport interface ClickAttributionInfo {\n platform?: ClickAttributionSourcePlatform | undefined;\n clickIdentifier?: string | undefined;\n}\n\nexport enum ClickAttributionSourcePlatform {\n Unknown = \"unknown\",\n Google = \"google\",\n Meta = \"meta\",\n Snapchat = \"snapchat\",\n Pinterest = \"pinterest\",\n TikTok = \"tikTok\",\n}\n\nexport interface SeekaActivityAcceptedWebhookPayload extends SeekaWebhookPayloadOfSeekaAppWebhookContext {\n content?: SeekaActivityAcceptedWebhookContent;\n}\n\nexport interface SeekaWebhookPayloadOfSeekaAppWebhookContextAndSeekaIdentityChangedWebhookContent extends SeekaWebhookPayloadOfSeekaAppWebhookContext {\n content?: SeekaIdentityChangedWebhookContent;\n}\n\nexport interface SeekaIdentityChangedWebhookContent {\n identifiers?: PersonIdentifiers;\n personId?: string;\n}\n\nexport interface SeekaIdentityChangedWebhookPayload extends SeekaWebhookPayloadOfSeekaAppWebhookContext {\n content?: SeekaIdentityChangedWebhookContent;\n}\n\nexport interface ActivityPipelineActivityFilter {\n id?: string;\n type?: ActivityPipelineActivityFilterType;\n sourceFilter?: ActivityPipelineActivitySourceFilter;\n activityNames?: string[];\n}\n\nexport enum ActivityPipelineActivityFilterType {\n Undefined = \"undefined\",\n PurchaseMade = \"purchaseMade\",\n ActivityTracked = \"activityTracked\",\n}\n\nexport interface ActivityPipelineActivitySourceFilter {\n comparer?: ConditionComparer;\n filters?: ActivityPipelineActivityFilterSourceItem[];\n description?: string | undefined;\n}\n\nexport enum ConditionComparer {\n Undefined = \"undefined\",\n And = \"and\",\n Or = \"or\",\n}\n\nexport interface ActivityPipelineActivityFilterSourceItem {\n label?: string;\n type?: ActivityPipelineActivityFilterSourceItemType;\n /** Criteria to match against. */\n key?: string;\n /** If key is null, this is the criteria to match against. */\n textMatch?: TextMatchInfo | undefined;\n}\n\nexport enum ActivityPipelineActivityFilterSourceItemType {\n Undefined = \"undefined\",\n Domain = \"domain\",\n Pipeline = \"pipeline\",\n Wildcard = \"wildcard\",\n Url = \"url\",\n PagePath = \"pagePath\",\n}\n\nexport interface TextMatchInfo {\n operator?: ConditionOperator;\n /** Can be a JSON string, number (as string), regex expression or text depending on the operator */\n matchValue?: string | undefined;\n}\n\nexport enum ConditionOperator {\n Undefined = \"undefined\",\n Equals = \"equals\",\n NotEquals = \"notEquals\",\n Contains = \"contains\",\n NotContains = \"notContains\",\n StartsWith = \"startsWith\",\n EndsWith = \"endsWith\",\n IsNull = \"isNull\",\n NotNull = \"notNull\",\n IsTrue = \"isTrue\",\n IsFalse = \"isFalse\",\n GreaterThanOrEquals = \"greaterThanOrEquals\",\n LessThanOrEquals = \"lessThanOrEquals\",\n GreaterThan = \"greaterThan\",\n LessThan = \"lessThan\",\n Before = \"before\",\n After = \"after\",\n Between = \"between\",\n In = \"in\",\n NotIn = \"notIn\",\n Regex = \"regEx\",\n Any = \"any\",\n}\n\nexport interface PipelineSdkConfiguration {\n containers?: PipelineRuleSdkContainer[];\n}\n\nexport interface PipelineRuleSdkContainer {\n pipelineRules?: PipelineRule[];\n processingOrder?: number;\n id?: string;\n}\n\nexport interface PipelineRule {\n pipelineRuleContainerId?: string;\n activityFilter?: ActivityPipelineActivityFilter;\n activityModifiers?: PipelineRuleActivityModifiers;\n id?: string;\n}\n\nexport interface PipelineRuleActivityModifiers {\n pipelineRuleId?: string;\n activityName?: TrackingActivityNames;\n activityNameCustom?: string;\n /** If provided, this will override the activity name sent to the platform.\nThis will disable normalising (eg. AddToCart -> add_to_cart) and also disable changing of the\nactivity name casing. */\n activityNameOverride?: string;\n id?: string;\n}\n\nexport interface ConvergeEmbedTrackingWebsiteConfiguration {\n /** SEEKA API endpoint */\n endpoint?: string;\n /** SEEKA API ingestion endpoint */\n ingestEndpoint?: string;\n isDomainIngestRulesEnabled?: boolean;\n debug?: ConvergeEmbedTrackingWebsiteDebugConfiguration;\n defaults?: ConvergeEmbedTrackingJsTenantDefaultsConfiguration;\n analytics?: ConvergeEmbedTrackingJsTenantAnalyticsConfiguration;\n processing?: ConvergeEmbedTrackingWebsiteProcessingConfiguration;\n browserSdkVersion?: string;\n}\n\nexport interface ConvergeEmbedTrackingWebsiteDebugConfiguration {\n /** Enables debugging on browser SDK. This setting is strongly not recommended to be kept enabled in production environments. */\n isEnabled?: boolean;\n /** Enables diagnosis on browser SDK. This setting is strongly not recommended to be kept enabled in production environments. */\n isDiagnosisEnabled?: boolean;\n}\n\nexport interface ConvergeEmbedTrackingJsTenantDefaultsConfiguration {\n /** ISO 4217 currency code to use as a fallback if events ingested do not carry the parameter. */\n currencyCode?: string;\n /** ISO 3166-2 country code to use as a fallback if events ingested do not carry the parameter. */\n countryCode?: string;\n /** IANA timezone ID to use as a fallback if events ingested do not carry the parameter. */\n timezoneId?: string;\n}\n\nexport interface ConvergeEmbedTrackingJsTenantAnalyticsConfigurationBase {\n autoCollection?: ConvergeEmbedTrackingJsAutoCollectionConfiguration;\n identity?: ConvergeEmbedTrackingJsIdentityConfiguration;\n crossDomain?: ConvergeEmbedTrackingJsTenantAnalyticsCrossDomainConfiguration | undefined;\n}\n\nexport interface ConvergeEmbedTrackingJsTenantAnalyticsConfiguration extends ConvergeEmbedTrackingJsTenantAnalyticsConfigurationBase {\n libraries?: ConvergeEmbedTrackingJsTenantAnalyticsLibrariesConfiguration;\n}\n\nexport interface ConvergeEmbedTrackingJsTenantAnalyticsLibrariesConfiguration {\n seeka?: SeekaConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration;\n googleAnalytics?: GoogleAnalyticsConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration;\n facebookPixel?: FacebookPixelConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration;\n tikTokPixel?: TikTokPixelConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration;\n dynamicYield?: DynamicYieldConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration;\n segment?: SegmentConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration;\n snapchatPixel?: ConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration;\n pinterestPixel?: ConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration;\n}\n\nexport interface ConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration {\n /** Whether push of events to the platform is enabled. */\n isPushEnabled?: boolean;\n /** The library to push event to. */\n library?: AnalyticsLibrary;\n}\n\nexport interface SeekaConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration extends ConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration {\n}\n\nexport enum AnalyticsLibrary {\n Undefined = \"undefined\",\n Seeka = \"seeka\",\n DynamicYield = \"dynamicYield\",\n Segment = \"segment\",\n FacebookPixel = \"facebookPixel\",\n GoogleAnalytics = \"googleAnalytics\",\n Braze = \"braze\",\n SnapchatPixel = \"snapchatPixel\",\n Pinterest = \"pinterest\",\n TikTokPixel = \"tikTokPixel\",\n GoogleAds = \"googleAds\",\n}\n\nexport interface GoogleAnalyticsConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration extends ConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration {\n /** Additional tags to be used for tracking which will be configured on every page via the gtag('config', ...) command. */\n googleTags?: GoogleAnalyticsConvergeEmbedTrackingJsAnalyticsLibraryTagConfiguration[];\n /** Used to augment product IDs sent to Google Analytics for use with Google Merchant Center. */\n merchant?: GoogleAnalyticsConvergeEmbedTrackingJsAnalyticsLibraryMerchantConfiguration;\n}\n\nexport interface GoogleAnalyticsConvergeEmbedTrackingJsAnalyticsLibraryTagConfiguration {\n /** The ID of the tag. */\n tagId?: string;\n phoneConversions?: GoogleAnalyticsConvergeEmbedTrackingJsAnalyticsLibraryPhoneConversionConfiguration[];\n}\n\nexport interface GoogleAnalyticsConvergeEmbedTrackingJsAnalyticsLibraryPhoneConversionConfiguration {\n /** The phone number in human form as it appears on the page. This number will be replaced by Google to allow them to track inbound calls. */\n phoneConversionNumber?: string;\n /** The label of the conversion. */\n conversionLabel?: string;\n}\n\nexport interface GoogleAnalyticsConvergeEmbedTrackingJsAnalyticsLibraryMerchantConfiguration {\n /** Used to augment product IDs sent to Google Analytics for use with Google Merchant Center. */\n productItemIdPrefix?: string;\n /** Used to augment product IDs sent to Google Analytics for use with Google Merchant Center. */\n productItemIdBehavior?: ContentIdentificationBehavior | undefined;\n}\n\n/** Defines the behavior to identify content based on product ID, variant ID or SKU when sending events to platforms. */\nexport enum ContentIdentificationBehavior {\n Default = \"default\",\n Sku = \"sku\",\n ProductId = \"productId\",\n VariantId = \"variantId\",\n ProductIdAndVariantIdUnderscore = \"productIdAndVariantIdUnderscore\",\n VariantIdOrProductId = \"variantIdOrProductId\",\n}\n\nexport interface FacebookPixelConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration extends ConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration {\n /** Test event code as retrieved from your Facebook Events Manager for diagnosing and debugging events. */\n testEventCode?: string;\n /** Publish strategy */\n publishMode?: ConvergeVendorDestinationPublishStrategy;\n}\n\nexport enum ConvergeVendorDestinationPublishStrategy {\n DeliverAllTraitsAndDeliverAllEvents = \"deliverAllTraitsAndDeliverAllEvents\",\n DeliverAllTraitsAndDeliverEventsOnlyIfMaxWeightedTraitsPresent = \"deliverAllTraitsAndDeliverEventsOnlyIfMaxWeightedTraitsPresent\",\n DeliverMaxWeightedTraitsOnlyAndDeliverAllEvents = \"deliverMaxWeightedTraitsOnlyAndDeliverAllEvents\",\n DeliverMaxWeightedTraitsOnlyAndDeliverEventsOnlyIfMaxWeightedTraitsPresent = \"deliverMaxWeightedTraitsOnlyAndDeliverEventsOnlyIfMaxWeightedTraitsPresent\",\n}\n\nexport interface TikTokPixelConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration extends ConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration {\n /** Publish mode */\n publishMode?: ConvergeVendorDestinationPublishStrategy;\n}\n\nexport interface DynamicYieldConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration extends ConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration {\n siteId?: string;\n scriptEndpoint?: string;\n}\n\nexport interface SegmentConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration extends ConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration {\n writeKey?: string;\n}\n\nexport interface ConvergeEmbedTrackingJsAutoCollectionConfiguration {\n /** Activities or events that will be automatically collected from user behaviour. */\n activityNames?: TrackingActivityNames[];\n /** Name of query parameter that contains the search text for site searches.\nA KeywordSearchQueryParamName of 'q' will resolve the search text 'awesome product' from the url https://examplewebsite.com?q=awesome%20product */\n keywordSearchQueryParamName?: string;\n /** Regex to match and identify order status page URL for the site to allow for automatic order event collection. */\n orderSuccessUrlPathMatchRegex?: string;\n activityDefinitions?: ConvergeEmbedTrackingActivityDefinition[];\n /** The currency amount to apply to activities sent to data destinations that require a value\nbut no value was provided in the tracking. */\n defaultActivityCurrencyAmount?: CurrencyAmount | undefined;\n /** Milliseconds to wait until initialising the interceptors that support automatic activity collection.\nNull or 0 will disable the delay and initialise the interceptors immediately.\n-1 will disable the interceptors. */\n interceptorStartDelayMs?: number | undefined;\n}\n\nexport interface ConvergeEmbedTrackingActivityDefinition {\n triggerSettings?: ConvergeEmbedTrackingActivityDefinitionTriggerSettings;\n vendorSettings?: ConvergeEmbedTrackingActivityDefinitionVendorSettings;\n consentSettings?: ConvergeEmbedTrackingActivityDefinitionConsentSettings;\n /** Standard or custom activity / behavior activity name. */\n activityName?: TrackingActivityNames;\n /** Required if ActivityName is set to Custom.\nWhen setting this parameter in conjunction with setting ActivityName to a standard event name, Seeka will process the event\nas a standard event with the exception of conversion based data destinations being sent the event as the ActivityNameCustom value\nwith the parameters of the standard event. */\n activityNameCustom?: string | undefined;\n /** Parameters to be sent with the activity. */\n activityParameters?: { [key: string]: any; };\n importProcessId?: string | undefined;\n id?: string;\n description?: string;\n}\n\nexport interface ConvergeEmbedTrackingActivityDefinitionTriggerSettings {\n schemaVersion?: number;\n /** Specify if all or one triggers should raise the activity */\n firingTriggersComparer?: ConditionComparer;\n firingTriggers?: ConvergeEmbedTrackingActivityDefinitionTrigger[] | undefined;\n /** Specify if all or one triggers should raise the activity */\n blockingTriggersComparer?: ConditionComparer;\n blockingTriggers?: ConvergeEmbedTrackingActivityDefinitionTrigger[] | undefined;\n triggerComparer?: ConditionComparer | undefined;\n triggers?: ConvergeEmbedTrackingActivityDefinitionTriggerV1[] | undefined;\n}\n\nexport interface ConvergeEmbedTrackingActivityDefinitionTrigger extends ActivityPipelineActivitySourceFilter {\n /** The HTML elements that if captured should cause this trigger to match. */\n htmlElements?: ConvergeEmbedTrackingActivityDefinitionTriggerHtmlElement[] | undefined;\n}\n\nexport interface ConvergeEmbedTrackingActivityDefinitionTriggerHtmlElement {\n locator?: HtmlElementLocator;\n /** The HTML element event types that if captured on the locator HTML element should cause this trigger to match. https://developer.mozilla.org/en-US/docs/Web/Events. */\n eventTypes?: string[];\n}\n\nexport interface HtmlElementLocator {\n /** List of HTML element class names to match. */\n classNames?: string[] | undefined;\n /** HTML elements type name to match. See https://developer.mozilla.org/en-US/docs/Web/HTML/Element for list.\nbutton */\n elementTypes?: string[] | undefined;\n /** ID of the HTML element to match. */\n elementId?: string | undefined;\n /** HTML element type name to match. See https://developer.mozilla.org/en-US/docs/Web/HTML/Element for list.\nbutton */\n elementType?: string;\n /** Inner text of the HTML element to match. */\n innerText?: string | undefined;\n /** Inner text of the HTML element to match. */\n innerTextMatch?: TextMatchInfo | undefined;\n /** ID of the HTML element to match. */\n elementIdMatch?: TextMatchInfo | undefined;\n /** URL of the anchor, button etc. HTML element to match. */\n linkUrlMatch?: TextMatchInfo | undefined;\n}\n\nexport interface ConvergeEmbedTrackingActivityDefinitionTriggerV1 {\n /** Regex to match a URL path to trigger the activity. */\n urlPathMatchRegex?: string;\n htmlElement?: ConvergeEmbedTrackingActivityDefinitionTriggerHtmlElement;\n}\n\nexport interface ConvergeEmbedTrackingActivityDefinitionVendorSettings {\n google?: ConvergeEmbedTrackingActivityDefinitionGoogleTriggerSettings;\n}\n\nexport interface ConvergeEmbedTrackingActivityDefinitionGoogleTriggerSettings {\n googleAdsConversionTriggers?: GoogleAdsConversionTriggerData[];\n}\n\nexport interface GoogleAdsConversionTriggerData {\n /** Conversion ID */\n conversionId?: string;\n /** Conversion label */\n conversionLabel?: string;\n}\n\nexport interface ConvergeEmbedTrackingActivityDefinitionConsentSettings {\n /** Grant for sending data to 3rd party analytics and marketing platforms. */\n analytics?: ConvergeEmbedTrackingActivityDefinitionConsentTypeSettings;\n /** Grant for marketing via re-marketing campaigns, EDMs etc. */\n marketing?: ConvergeEmbedTrackingActivityDefinitionMarketingConsentSettings;\n /** Grant for enrolling and participating in loyalty programs. */\n loyalty?: ConvergeEmbedTrackingActivityDefinitionConsentTypeSettings;\n}\n\nexport interface ConvergeEmbedTrackingActivityDefinitionConsentTypeSettings {\n /** The name of the source that provided the grant information. Set to the source platform like Shopify, Wordpress or your custom integration client name.\nIf this is left empty then the source of the data will be assumed. Eg for an event fired on a website the source name will be set to the domain name of the website. */\n consentSourceName?: string | undefined;\n /** If the consent has been granted or not granted. */\n consentGranted?: boolean | undefined;\n}\n\nexport interface ConvergeEmbedTrackingActivityDefinitionMarketingConsentSettings {\n email?: ConvergeEmbedTrackingActivityDefinitionConsentTypeSettings;\n sms?: ConvergeEmbedTrackingActivityDefinitionConsentTypeSettings;\n}\n\nexport interface CurrencyAmount {\n amount?: number;\n /** ISO 4217 currency code */\n currencyCode?: string;\n /** Currency symbol */\n currencySymbol?: string;\n}\n\nexport interface ConvergeEmbedTrackingJsIdentityConfiguration {\n /** The timeout to inform the time to live for a user session. */\n userSessionTimeoutSeconds?: number;\n}\n\nexport interface ConvergeEmbedTrackingJsTenantAnalyticsCrossDomainConfiguration {\n rules?: CrossDomainTrackingDomainRule[] | undefined;\n}\n\nexport interface CrossDomainTrackingDomainRule {\n /** The hostname to match for the source hostname.\nIf the source hostname matches the current URL, links matching the destination link will be modified. */\n sourceHostname?: TextMatchInfo;\n /** The link to match.\nIf the source hostname matches the current URL, links matching the destination link will be modified. */\n destinationLink: TextMatchInfo;\n identifiers?: CrossDomainTrackingDomainRuleIdentifierSettings;\n utm?: CrossDomainTrackingDomainRuleUtmSettings;\n id?: string;\n}\n\nexport interface CrossDomainTrackingDomainRuleIdentifierSettings {\n /** If disabled, Seeka will not append Seeka profile ID and ad platform identifiers\nonto the destination URL. */\n isIdentifierPassthroughDisabled?: boolean;\n}\n\nexport interface CrossDomainTrackingDomainRuleUtmSettings {\n behavior?: CrossDomainTrackingUtmBehavior;\n}\n\nexport enum CrossDomainTrackingUtmBehavior {\n None = \"none\",\n SessionPassthrough = \"sessionPassthrough\",\n UrlPassthrough = \"urlPassthrough\",\n}\n\nexport interface ConvergeEmbedTrackingWebsiteProcessingConfiguration {\n /** Disable browser events from being sent from the browser to platforms and SEEKA API directly. */\n isBrowserEventsDisabled?: boolean;\n /** Disable events from being ingested by SEEKA API. This will also disable the delivery of events to platforms. */\n isServerEventsDisabled?: boolean;\n /** Disable identity resolution on the browser SDK. */\n isIdentityDisabled?: boolean;\n /** Controls identity resolution delay. */\n publishToVendorsTimeoutSeconds?: number | undefined;\n /** Amount of time to retain untouched anonymous/partial identities for until purging. */\n anonymousIdentityRetentionPeriod?: string | undefined;\n /** Amount of time to retain untouched enriched/partial identities for until purging. */\n enrichedIdentityRetentionPeriod?: string | undefined;\n /** Defines the behavior to identify content based on product ID, variant ID or SKU when sending events to platforms. */\n contentIdentificationBehavior?: ContentIdentificationBehavior | undefined;\n /** JavaScript object reference that all Converge.track and Converge.identity api calls will be mediated to.\nCan be used to forward all tracking calls to Shopify.analytics.publish('seeka_mediate', { api: 'track', method: TrackingActivityNames.AddToCart, params: [{ productIdentifier: '123' }, commonProps] }) by setting this to Shopify.analytics.publish. */\n mediateBrowserMethodsToWindowReference?: string;\n /** Consent management settings. */\n consent?: ConsentSettings | undefined;\n /** Privacy data control settings */\n privacyDataControl?: PrivacyDataControlSettings | undefined;\n}\n\nexport interface ConsentSettings {\n /** Settings for regional consent management. */\n regionalConsent?: RegionalConsentSettings[] | undefined;\n /** Settings for consent management platforms. */\n consentManagementPlatform?: ConsentManagementPlatformSettings | undefined;\n /** If using a consent management platform, this should be set to true to disable Seeka's consent management. */\n disableConsentManagement?: boolean;\n}\n\nexport interface RegionalConsentSettings {\n /** ISO-3166-1 alpha-2 country code\nSee https://en.wikipedia.org/wiki/ISO_3166-2 for list.\nShould be null for \"default\" / \"fallback\" settings. */\n countryCode?: string | undefined;\n /** ISO-3166-1 alpha-2 subdivision code\nSee https://en.wikipedia.org/wiki/ISO_3166-2 for list.\n/// Should be null for \"default\" region or for targeting a whole country when used in conjunction with CountryCode. */\n subdivisionCode?: string | undefined;\n configuration?: ConsentConfiguration;\n}\n\nexport interface ConsentConfiguration {\n adStorage?: RegionalConsentGrantOption;\n adUserData?: RegionalConsentGrantOption;\n adPersonalisation?: RegionalConsentGrantOption;\n functionalityStorage?: RegionalConsentGrantOption;\n personalisationStorage?: RegionalConsentGrantOption;\n securityStorage?: RegionalConsentGrantOption;\n analyticsStorage?: RegionalConsentGrantOption;\n}\n\nexport enum RegionalConsentGrantOption {\n Unset = \"unset\",\n Granted = \"granted\",\n Denied = \"denied\",\n}\n\nexport interface ConsentManagementPlatformSettings {\n oneTrust?: OneTrustConsentManagementPlatformSettings | undefined;\n}\n\nexport interface OneTrustConsentManagementPlatformSettings {\n purposeMappings?: OneTrustConsentManagementPurposeMapping[];\n}\n\nexport interface OneTrustConsentManagementPurposeMapping {\n /** The IAB purpose ID that maps to the OneTrust categories. */\n iabPurposeId?: IabPrivacyConsentPurposeId;\n /** OneTrust category IDs that map to the IAB purpose.\nC0001 */\n oneTrustCategoryIds?: string[];\n matchType?: ConsentMappingMatchType;\n}\n\nexport enum IabPrivacyConsentPurposeId {\n Undefined = \"undefined\",\n MeasureAdvertisingPerformance = \"measureAdvertisingPerformance\",\n}\n\nexport enum ConsentMappingMatchType {\n Undefined = \"undefined\",\n AllOf = \"allOf\",\n AnyOf = \"anyOf\",\n}\n\nexport interface PrivacyDataControlSettings {\n mode?: PrivacyDataControlMode;\n}\n\nexport enum PrivacyDataControlMode {\n Disabled = \"disabled\",\n Explicit = \"explicit\",\n Implicit = \"implicit\",\n}\n\nexport interface ConvergeTrackingConfiguration {\n /** SEEKA API endpoint */\n endpoint?: string;\n /** SEEKA API ingestion endpoint */\n ingestEndpoint?: string;\n isDomainIngestRulesEnabled?: boolean;\n debug?: ConvergeEmbedTrackingWebsiteDebugConfiguration;\n defaults?: ConvergeEmbedTrackingJsTenantDefaultsConfiguration;\n analytics?: ConvergeEmbedTrackingJsTenantAnalyticsConfiguration;\n processing?: ConvergeEmbedTrackingWebsiteProcessingConfiguration;\n browserSdkVersion?: string;\n}\n\nexport interface ActivityPipelineActivityFilterResult {\n filter?: ActivityPipelineActivityFilter;\n resultDescriptions?: string[];\n isMatch?: boolean;\n}\n\nexport class ApiException extends Error {\n override message: string;\n status: number;\n response: string;\n headers: { [key: string]: any; };\n result: any;\n\n constructor(message: string, status: number, response: string, headers: { [key: string]: any; }, result: any) {\n super();\n\n this.message = message;\n this.status = status;\n this.response = response;\n this.headers = headers;\n this.result = result;\n }\n\n protected isApiException = true;\n\n static isApiException(obj: any): obj is ApiException {\n return obj.isApiException === true;\n }\n}\n\nfunction throwException(message: string, status: number, response: string, headers: { [key: string]: any; }, result?: any): any {\n if (result !== null && result !== undefined)\n throw result;\n else\n throw new ApiException(message, status, response, headers, null);\n}\n\nfunction isAxiosError(obj: any): obj is AxiosError {\n return obj && obj.isAxiosError === true;\n}\n\n// Dont remove unused imports as they are used in the generated code\n\n// Dont remove unused imports as they are used in the generated code\n\nexport interface AppClientRuntimeInfo {\n /** Client version used to identify the implementation of the SDK */\n ver: string;\n /** Name or type used to identify the implementation of the SDK. This could be specified as 'backend' for a backend integration with the SDK or 'website' for integrations placed on a website. */\n type: string;\n}\n\nexport interface AppRuntimeInfo {\n /** Version of the package or library being used to interact with the SDK */\n ver: string;\n /** Type of the package or library being used to interact with the SDK */\n type: string;\n client: AppClientRuntimeInfo;\n}", "import { SeekaPipelineIntegrationSource, TrackingEventSourceOriginType } from '../../api/services';\n\nexport interface ServiceCallSource {\n /** Source method that requested the tracking. */\n method?: string;\n\n /** Type of origin that generated the tracking request.\n This is not the same as where the tracking event originated from, this property specifies where the tracking event was tracked from. */\n origin?: TrackingEventSourceOriginType;\n\n /** URL where the tracking event originated from. */\n loc?: string;\n\n pipeline?: SeekaPipelineIntegrationSource\n}\n\nexport const AppPermissionKeys = {\n identity: {\n receiveFull: 'Identity.Receive.Pii',\n send: 'Identity.Send'\n },\n activity: {\n receiveAnon: 'Activity.Receive.Anon',\n receiveFull: 'Activity.Receive.Pii',\n send: 'Activity.Send'\n }\n}", "import {\n ClientMetadata, ServerMetadata, Configuration, TokenEndpointResponse, genericGrantRequest,\n clientCredentialsGrant, discovery, None\n} from 'openid-client';\n\nimport winston from 'winston';\nimport { SeekaAppConfig } from '../../services';\nimport { SeekaAppCacheManager } from '../../../cache/appCacheManager';\nimport {md5Hash} from \"../../../helpers/util\";\n\ntype IssuerMetadata = {\n clientMetadata: ClientMetadata,\n serverMetadata: ServerMetadata,\n clientId: string\n timeout: number | undefined\n} | null\n\nexport const getIssuer = async (config: SeekaAppConfig): Promise<Configuration | null> => {\n const logParams = { applicationId: config.appId, issuer: { url: config.issuerUrl } }\n\n if (config.logger) {\n config.logger.debug(`Seeka auth: getting issuer`, { ...logParams });\n }\n else {\n console.debug(`Seeka auth: getting issuer`, { ...logParams });\n }\n\n const cache = new SeekaAppCacheManager(config.appId, config.applicationInstallId);\n const cacheKey = md5Hash(config.issuerUrl + '_' + config.appId);\n\n const meta = await cache.getOrSet<IssuerMetadata>(cacheKey, async () => {\n try {\n const seekaIssuer = await discoverIssuerMetadata(config);\n if (!seekaIssuer || !seekaIssuer.meta || !seekaIssuer.raw) return null;\n\n if (config.logger) {\n config.logger.verbose(`Seeka auth: got issuer from remote`, { ...logParams });\n }\n else {\n console.debug(`Seeka auth: got issuer from remote`, { ...logParams });\n }\n\n // return new openid.Configuration(seekaIssuer.meta.serverMetadata, seekaIssuer.meta.clientId, config.appSecret);\n\n return {\n value: seekaIssuer.meta,\n expiryAbsoluteMilliseconds: 1000 * 60 * 60 // 1 hour\n }\n }\n catch (err) {\n if (config.logger) {\n config.logger.error(`Seeka auth: failed getting issuer`, { ...logParams, ex: winston.exceptions.getAllInfo(err as any) });\n }\n else {\n console.error(`Seeka auth: failed getting issuer`, { ...logParams });\n }\n return null\n }\n }, async () => {\n if (config.logger) {\n config.logger.verbose(`Seeka auth: got issuer from cache`, { ...logParams });\n }\n else {\n console.debug(`Seeka auth: got issuer from cache`, { ...logParams });\n }\n });\n\n if (meta === null) return null;\n\n return new Configuration(meta.serverMetadata, meta.clientId, config.appSecret);\n}\n\nexport const discoverIssuerMetadata = async (config: SeekaAppConfig): Promise<{ meta: IssuerMetadata, raw: Configuration } | null> => {\n const logParams = { applicationId: config.appId, issuer: { url: config.issuerUrl } }\n\n if (config.logger) {\n config.logger.verbose(`Seeka auth: discovering issuer from remote`, { ...logParams });\n }\n else {\n console.info(`Seeka auth: discovering issuer from remote`, { ...logParams });\n }\n\n try {\n const clientId = config.appId.replace(/-/g, '')\n const meta = await discovery(\n new URL(config.issuerUrl),\n clientId,\n undefined,\n None(),\n {\n\n timeout: 10000\n }\n )\n\n if (config.logger) {\n config.logger.verbose(`Seeka auth: discovered issuer from remote`, { ...logParams, client_id: meta.clientMetadata().client_id });\n }\n else {\n console.info(`Seeka auth: discovered issuer from remote`, { ...logParams, client_id: meta.clientMetadata().client_id });\n }\n\n const cachableMeta = {\n meta: {\n serverMetadata: meta.serverMetadata(),\n clientMetadata: meta.clientMetadata(),\n timeout: meta.timeout,\n clientId,\n },\n raw: meta\n }\n\n return cachableMeta;\n }\n catch (err) {\n if (config.logger) {\n config.logger.error(`Seeka auth: failed discovering issuer from remote`, { ...logParams, ex: winston.exceptions.getAllInfo(err as any) });\n }\n else {\n console.error(`Seeka auth: failed discovering issuer from remote`, { ...logParams, err });\n }\n return null\n }\n}\n\nconst getNewClientToken = async (config: SeekaAppConfig): Promise<TokenEndpointResponse | null> => {\n const logParams = { applicationId: config.appId, issuer: { url: config.issuerUrl } }\n const issuer = await getIssuer(config);\n if (!issuer) return null;\n\n try {\n let token: TokenEndpointResponse = await clientCredentialsGrant(\n issuer,\n {\n resource: issuer.clientMetadata().client_id\n },\n )\n\n const successLogParams = {\n ...logParams,\n token: {\n expires_at: token.expires_at,\n token_type: token.token_type,\n scope: token.scope\n }\n }\n\n if (config.logger) {\n config.logger.verbose(`Seeka auth: got client access token from server`, { ...successLogParams });\n }\n else {\n console.info(`Seeka auth: got app client token from server`, { ...successLogParams });\n }\n\n return {\n token_type: token.token_type,\n access_token: token.access_token,\n expires_in: token.expires_in,\n id_token: token.id_token,\n refresh_token: token.refresh_token,\n scope: token.scope,\n authorization_details: token.authorization_details,\n }\n }\n catch (err) {\n const errorLogParams = {\n ...logParams,\n error: err\n }\n if (config.logger) {\n config.logger.error(`Seeka auth: failed to get client access token from server`, { ...errorLogParams });\n }\n else {\n console.error(`Seeka auth: failed to get client access token from server`, { ...errorLogParams, err: winston.exceptions.getAllInfo(err as any) });\n }\n\n return null;\n }\n}\n\nexport const getNewAppInstallToken = async (clientAccessToken: string, config: SeekaAppConfig): Promise<TokenEndpointResponse | null> => {\n const logParams = { applicationId: config.appId, issuer: { url: config.issuerUrl } }\n const issuer = await getIssuer(config);\n if (!issuer || !issuer) return null;\n\n try {\n const token = await genericGrantRequest(issuer, \"app_install_token\", {\n applicationInstallId: config.applicationInstallId,\n access_token: clientAccessToken,\n scope: 'Seeka.API.Ingest'\n })\n\n // console.log('Got new app install token', {\n // expires_at: token.expires_at,\n // token_type: token.token_type,\n // scope: token.scope\n // });\n const successLogParams = {\n ...logParams,\n token: {\n expires_at: token.expires_at,\n token_type: token.token_type,\n scope: token.scope\n }\n }\n if (config.logger) {\n config.logger.verbose(`Seeka auth: got app access token from server`, { ...successLogParams });\n }\n else {\n console.info(`Seeka auth: got app access token from server`, { ...successLogParams });\n }\n\n return {\n token_type: token.token_type,\n access_token: token.access_token,\n expires_in: token.expires_in,\n id_token: token.id_token,\n refresh_token: token.refresh_token,\n scope: token.scope,\n authorization_details: token.authorization_details,\n }\n }\n catch (err) {\n const errorLogParams = {\n ...logParams,\n error: err\n }\n if (config.logger) {\n config.logger.error(`Seeka auth: failed to get app access token from server`, { ...errorLogParams });\n }\n else {\n console.debug(`Seeka auth: failed to get app access token from server`, { ...errorLogParams });\n }\n\n return null;\n }\n}\n\nexport const getNewOrCachedAppInstallToken = async (config: SeekaAppConfig): Promise<TokenEndpointResponse | null> => {\n const appInstallCache = new SeekaAppCacheManager(config.appId, config.applicationInstallId);\n const logParams = { applicationId: config.appId, issuer: { url: config.issuerUrl } }\n\n return await appInstallCache.getOrSet('auth:token:appinstall', async () => {\n const clientToken = await getNewClientToken(config);\n if (!clientToken || !clientToken.access_token) return null;\n\n const appToken = await getNewAppInstallToken(clientToken.access_token as string, config);\n if (!appToken) return null;\n\n return {\n value: appToken,\n expiryAbsoluteMilliseconds: (((appToken.expires_in as number) > (clientToken.expires_in as number) ? clientToken.expires_in : appToken.expires_in) || 15 * 60 * 1000) - (60 * 1000)\n }\n }, async () => {\n if (config.logger) {\n config.logger.verbose(`Seeka auth: got app token from cache`, { ...logParams });\n }\n else {\n console.debug(`Seeka auth: got app token from cache`, { ...logParams });\n }\n })\n}\n", "import memoryCache from 'memory-cache';\n\nconst prefix = 'seeka:sdk';\n\nexport class SeekaAppCacheManager {\n constructor(appId: string, appInstallationId?: string) {\n this.appId = appId;\n this.appInstallationId = appInstallationId;\n }\n\n private readonly appId: string;\n private readonly appInstallationId?: string;\n\n public set = async (key: string, value: any, expiryAbsoluteMilliseconds?: number): Promise<void> => {\n const cacheKey = this.getKey(key);\n memoryCache.put(cacheKey, JSON.stringify(value), expiryAbsoluteMilliseconds);\n }\n\n public getOrSet = async <TValue>(key: string, getValueAndExpiryFunc: () => Promise<{ value: TValue, expiryAbsoluteMilliseconds?: number } | null>, onGetFromCache?: (val: TValue | null) => Promise<void>): Promise<TValue | null> => {\n const cacheKey = this.getKey(key);\n\n const existing = memoryCache.get(cacheKey);\n if (existing) {\n const cached = JSON.parse(existing) as TValue;\n if (onGetFromCache) {\n await onGetFromCache(cached)\n }\n return cached;\n }\n\n const newVal = await getValueAndExpiryFunc();\n if (!newVal) return null;\n\n memoryCache.put(cacheKey, JSON.stringify(newVal.value), newVal.expiryAbsoluteMilliseconds);\n\n return newVal.value;\n }\n\n private getKey = (key: string): string => {\n if (this.appInstallationId) {\n return `${prefix}:${this.appId}:${this.appInstallationId}:${key}`;\n }\n return `${prefix}:${this.appId}:${key}`;\n }\n}\n", "import axios from 'axios';\nimport http from 'http';\nimport https from 'https';\n\nimport { IdentityServiceProxy, IngestServiceProxy, SeekaAppConfig } from '../../services';\n\nconst httpAgent = new http.Agent({ keepAlive: true, scheduling: 'fifo' });\nconst httpsAgent = new https.Agent({ keepAlive: true, scheduling: 'fifo' });\n\nconst createAxiosInstance = (config: SeekaAppConfig) => {\n const instance = axios.create({\n httpAgent,\n httpsAgent,\n });\n\n instance.interceptors.request.use(function (reqConfig) {\n let logParams: any = {\n url: reqConfig.url,\n method: reqConfig.method,\n };\n if (process.env.LOGGING_LEVEL === 'silly') {\n logParams = {\n ...logParams,\n body: reqConfig.data,\n params: reqConfig.params,\n }\n }\n if (config.logger) {\n config.logger.debug(`Seeka API: making call to ${logParams.url}`, { ...logParams });\n }\n else {\n console.debug(`Seeka API: making call to ${logParams.url}`, { ...logParams });\n }\n\n return reqConfig;\n }, function (error) {\n const logParams = {\n // url: response.request?.url || response.config.url,\n // method: response.request?.method || response.config.method,\n error\n };\n if (config.logger) {\n config.logger.http(`Seeka API: failed to send request`, { ...logParams });\n }\n else {\n console.debug(`Seeka API: failed to send request`, { ...logParams });\n }\n return Promise.reject(error);\n });\n\n instance.interceptors.response.use(function (response) {\n const logParams = {\n url: response.request?.url || response.config.url,\n method: response.request?.method || response.config.method,\n response: {\n status: response.status,\n }\n };\n if (config.logger) {\n config.logger.http(`Seeka API: call to ${logParams.url} succeeded`, { ...logParams });\n }\n else {\n console.debug(`Seeka API: call to ${logParams.url} succeeded`, { ...logParams });\n }\n\n return response;\n }, function (error) {\n const { code, status, message } = error\n const { headers, url, method } = error?.config;\n const errorLogParams = {\n code,\n status,\n message,\n headers,\n url,\n method,\n content: error?.response?.data\n }\n if (config.logger) {\n config.logger.error(`Seeka API: call to ${errorLogParams.url} failed`, { ...errorLogParams });\n }\n else {\n console.error(`Seeka API: call to ${errorLogParams.url} failed`, { ...errorLogParams });\n }\n\n return Promise.reject(error);\n });\n\n return instance;\n}\n\nexport const serviceResolver = {\n getIdentityService: (config: SeekaAppConfig) => new IdentityServiceProxy(config, config.ingestUrl, createAxiosInstance(config)),\n getIngestService: (config: SeekaAppConfig) => new IngestServiceProxy(config, config.ingestUrl, createAxiosInstance(config)),\n}", "import { chunk, generateNewSessionId } from '../../helpers/util';\nimport { AppPermissionKeys, ServiceCallSource } from '../models';\nimport {\n ActivityPayload, DataIngestBatchHttpRequest, IdentityServiceProxy, IngestServiceProxy,\n PersonIdentifiers, SeekaAppConfig\n} from '../services';\nimport { getNewOrCachedAppInstallToken } from './auth';\nimport { serviceResolver } from './serviceResolver';\n\nexport class SeekaApiHelper {\n constructor(config: SeekaAppConfig) {\n this.config = config;\n this.ingestionService = serviceResolver.getIngestService(config);\n this.identityService = serviceResolver.getIdentityService(config);\n }\n\n private readonly config;\n\n private maxBatchSize = 50;\n\n // Used to prime the token cache and issue refresh tokens if required\n public refreshOrPrimeTokenCache = async (): Promise<void> => {\n await getNewOrCachedAppInstallToken(this.config);\n }\n\n public ingestionService: IngestServiceProxy;\n public identityService: IdentityServiceProxy;\n\n private checkPermission = (permissionKey: string, opName: string): boolean => {\n if (!this.config.hasPermission(permissionKey)) {\n throw new Error('Cannot perform operation ' + opName + ' on installationId ' + this.config.applicationInstallId + ' without permission ' + permissionKey + '. Currently granted permissions: ' + (this.config.grantedPermissions ? this.config.grantedPermissions.join(', ') : 'none'));\n }\n\n return true;\n }\n\n public mergeIdentity = async (identity: PersonIdentifiers, src: ServiceCallSource): Promise<string> => {\n this.checkPermission(AppPermissionKeys.identity.send, 'mergeIdentity');\n\n const sessionId = generateNewSessionId();\n\n const result = await this.identityService.merge({\n id: identity,\n src: {\n method: '', // TODO\n origin: src.origin,\n time: undefined,\n loc: src.loc as string,\n sess: sessionId,\n diag: process.env.SEEKA_DEBUG_ENABLED === 'true' ? sessionId : undefined,\n runtime: this.config.runtime\n }\n })\n\n return result.result?.personId as string;\n }\n\n public mergeIdentityBatch = async (batch: PersonIdentifiers[], src: ServiceCallSource): Promise<void> => {\n this.checkPermission(AppPermissionKeys.identity.send, 'mergeIdentityBatch');\n\n const sessionId = generateNewSessionId();\n if (batch.length === 0) {\n this.config.logger?.debug('No identities in batch');\n return;\n }\n\n const sourceMetadata = {\n method: '', // TODO\n origin: src.origin,\n time: undefined,\n loc: src.loc as string,\n sess: sessionId,\n diag: process.env.SEEKA_DEBUG_ENABLED === 'true' ? sessionId : undefined,\n runtime: this.config.runtime\n }\n\n // Make ingestion is ${this.maxBatchSize} per batch, send in parallel\n const chunks = chunk(batch, this.maxBatchSize);\n if (chunks.length > 1) {\n if (this.config.logger) {\n this.config.logger.debug(`Identity batch size ${batch} is greater than ${this.maxBatchSize}, splitting into ${chunks.length} batches`);\n }\n }\n\n // Process first batch to prime authorization, then process the rest of the batches\n await this.trackActivityBatchRaw({\n data: chunks[0].map(profile => {\n return {\n id: {\n id: profile || {},\n src: { ...sourceMetadata },\n }\n }\n })\n })\n\n if (chunks.length > 1) {\n const promises = chunks.map((chunk, index) => {\n if (index === 0) return Promise.resolve();\n\n this.config.logger?.verbose(`Processing identity batch ${index + 1} of ${chunks.length}`);\n return this.trackActivityBatchRaw({\n data: chunk.map(profile => {\n return {\n id: {\n id: profile || {},\n src: { ...sourceMetadata },\n }\n }\n })\n })\n })\n\n await Promise.all(promises);\n }\n }\n\n public trackActivityBatch = async (batch: { activity: ActivityPayload, profile?: PersonIdentifiers | undefined }[], src: ServiceCallSource): Promise<void> => {\n this.checkPermission(AppPermissionKeys.activity.send, 'trackActivityBatch');\n\n const sessionId = generateNewSessionId();\n if (batch.length === 0) {\n this.config.logger?.debug('No activities in batch');\n return;\n }\n\n const sourceMetadata = {\n method: '', // TODO\n origin: src.origin,\n time: undefined,\n loc: src.loc as string,\n sess: sessionId,\n diag: process.env.SEEKA_DEBUG_ENABLED === 'true' ? sessionId : undefined,\n runtime: this.config.runtime\n }\n\n // Make ingestion is ${this.maxBatchSize} per batch, send in parallel\n const chunks = chunk(batch, this.maxBatchSize);\n if (chunks.length > 1) {\n if (this.config.logger) {\n this.config.logger.debug(`Activity batch size ${batch.length} is greater than ${this.maxBatchSize}, splitting into ${chunks.length} batches`);\n }\n }\n\n // Process first batch to prime authorization, then process the rest of the batches\n await this.trackActivityBatchRaw({\n data: chunks[0].map(item => {\n return {\n ev: {\n id: item.profile || {},\n src: { ...sourceMetadata },\n payload: item.activity\n }\n }\n })\n })\n\n if (chunks.length > 1) {\n const promises = chunks.map((chunk, index) => {\n if (index === 0) return Promise.resolve();\n\n this.config.logger?.verbose(`Processing activity batch ${index + 1} of ${chunks.length}`);\n return this.trackActivityBatchRaw({\n data: chunk.map(item => {\n return {\n ev: {\n id: item.profile || {},\n src: { ...sourceMetadata },\n payload: item.activity\n }\n }\n })\n })\n })\n\n await Promise.all(promises);\n }\n }\n\n public trackActivityBatchRaw = async (data: DataIngestBatchHttpRequest): Promise<void> => {\n await this.ingestionService.batch(data);\n }\n\n public trackActivityForProfileId = async (activity: ActivityPayload, profileId: string | undefined, src: ServiceCallSource): Promise<void> => {\n this.checkPermission(AppPermissionKeys.activity.send, 'trackActivityForProfileId');\n\n await this.trackActivityForProfileIdBatch([activity], profileId, src);\n }\n\n public trackActivityForProfileIdBatch = async (activities: ActivityPayload[], profileId: string | undefined, src: ServiceCallSource): Promise<void> => {\n this.checkPermission(AppPermissionKeys.activity.send, 'trackActivityForProfileIdBatch');\n\n await this.trackActivityBatch(activities.map(e => {\n return {\n activity: e,\n profile: profileId ? { seekaPId: profileId } : undefined\n }\n }), src);\n }\n\n public trackActivityForProfile = async (activity: ActivityPayload, profile: PersonIdentifiers, src: ServiceCallSource): Promise<void> => {\n this.checkPermission(AppPermissionKeys.activity.send, 'trackActivityForProfile');\n\n await this.trackActivityForProfileBatch([activity], profile, src);\n }\n\n public trackActivityForProfileBatch = async (activities: ActivityPayload[], profile: PersonIdentifiers, src: ServiceCallSource): Promise<void> => {\n this.checkPermission(AppPermissionKeys.activity.send, 'trackActivityForProfileBatch');\n\n await this.trackActivityBatch(activities.map(e => {\n return {\n activity: e,\n profile: profile\n }\n }), src);\n }\n}\n", "import * as crypto from 'crypto';\n\nimport type { Headers as UndiciHeaders } from 'undici';\n\nexport const webhookSignatureHeaderName = 'x-seeka-signature-sha256';\n\nexport const validateWebhookSignature = (secret: string, headers: UndiciHeaders | Headers | NodeJS.Dict<string | string[]>, requestBody: string): boolean => {\n if (!headers) return false;\n\n let signature: string | null = null;\n\n if (headers.get && typeof headers.get === 'function') {\n // undici and fetch\n signature = (headers as Headers).get(webhookSignatureHeaderName);\n }\n else {\n // express\n const signatures = (headers as NodeJS.Dict<string | string[]>)[webhookSignatureHeaderName];\n if (signatures) {\n if (Array.isArray(signatures) && signatures.length > 0) {\n signature = signatures[0]\n }\n else if (typeof signatures === 'string' || signatures instanceof String) {\n signature = signatures as string;\n }\n }\n }\n if (!signature) return false;\n\n // Check hash\n const hash = getHmacSignature(secret, requestBody);\n const valid = hash === signature;\n\n if (!valid) {\n console.warn(\"Invalid webhook signature\")\n }\n\n return valid;\n}\n\nexport const getHmacSignature = (secret: string, requestBody: string): string => {\n return crypto.createHmac('sha256', secret)\n .update(requestBody)\n .digest('hex');\n}\n\nexport const throwOnInvalidWebhookSignature = (secret: string, headers: UndiciHeaders | Headers | NodeJS.Dict<string | string[]>, requestBody: string): void => {\n if (!validateWebhookSignature(secret, headers, requestBody)) throw new Error('Invalid webhook signature');\n} ", "{\n \"name\": \"@seeka-labs/sdk-apps-server\",\n \"version\": \"2.2.1\",\n \"description\": \"Seeka - Apps SDK - Node.js\",\n \"author\": \"SEEKA <platform@seeka.co>\",\n \"license\": \"MIT\",\n \"keywords\": [\n \"apps\",\n \"seeka\",\n \"node\"\n ],\n \"files\": [\n \"dist/\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"types\": \"./dist/types/index.d.ts\",\n \"source\": \"src/index.ts\",\n \"main\": \"./dist/sdk-apps-server.commonjs.js\",\n \"module\": \"./dist/sdk-apps-server.module.mjs\",\n \"scripts\": {\n \"clean\": \"rimraf dist build package\",\n \"build:ci\": \"yarn run build\",\n \"build\": \"yarn esbuild src/index.ts --outfile=dist/sdk-apps-server.module.mjs --bundle --analyze --platform=node --format=esm --packages=external --minify --sourcemap && yarn esbuild src/index.ts --outfile=dist/sdk-apps-server.commonjs.js --bundle --analyze --platform=node --format=cjs --packages=external --minify --sourcemap && yarn tsc --emitDeclarationOnly\",\n \"dev\": \"yarn esbuild src/index.ts --outfile=dist/sdk-apps-server.module.mjs --bundle --analyze --platform=node --format=esm --packages=external --sourcemap && yarn tsc --emitDeclarationOnly\",\n \"watch\": \"yarn esbuild watch --platform=node --sourcemap --format=esm\",\n \"refreshapi:local\": \"nswag run scaffolding/api/service.config.nswag /variables:ApiBaseUrl=https://localhost:22744\",\n \"refreshapi:prod\": \"nswag run scaffolding/api/service.config.nswag /variables:ApiBaseUrl=https://api.seeka.services\",\n \"test\": \"cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 jest\"\n },\n \"devDependencies\": {\n \"@jest/globals\": \"^30\",\n \"@seeka-labs/sdk-apps-core\": \"workspace:*\",\n \"@types/jest\": \"^30\",\n \"@types/memory-cache\": \"^0\",\n \"@types/node\": \"^24\",\n \"axios\": \"^1\",\n \"cross-env\": \"^10\",\n \"esbuild\": \"^0\",\n \"jest\": \"^30\",\n \"memory-cache\": \"^0\",\n \"nswag\": \"^14\",\n \"openid-client\": \"^6\",\n \"ts-jest\": \"^29\",\n \"ts-node\": \"^10\",\n \"typescript\": \"^5\",\n \"undici\": \"^7\",\n \"winston\": \"^3\"\n },\n \"gitHead\": \"65c32750ca303751aa6589e933d67a2a26a7d836\",\n \"peerDependencies\": {\n \"@seeka-labs/sdk-apps-core\": \"^2\",\n \"axios\": \"^1\",\n \"memory-cache\": \"^0\",\n \"openid-client\": \"^6\",\n \"undici\": \"^7\",\n \"winston\": \"^3\"\n },\n \"stableVersion\": \"2.0.6\"\n}\n", "import { AxiosRequestConfig, AxiosResponse } from 'axios';\nimport { Logger } from 'winston';\n\nimport { version } from '../../../../package.json';\nimport { AppClientRuntimeInfo, SeekaAppConfig } from '../../services';\nimport { getNewOrCachedAppInstallToken } from '../auth';\n\nconst defaultIngestUrl = 'https://router.seeka.services';\nconst defaultIssuerUrl = 'https://account.seeka.app'\n\nexport const getAppConfig = (context: { applicationId: string, organisationId: string, applicationInstallId: string }, appSecret: string, client: AppClientRuntimeInfo, grantedPermissions: string[], logger?: Logger): SeekaAppConfig => {\n const config = new SeekaAppConfig();\n config.appId = context.applicationId;\n config.appSecret = appSecret;\n config.ingestUrl = process.env.SEEKA_INGEST_URL || defaultIngestUrl;\n config.issuerUrl = process.env.SEEKA_ISSUER_URL || defaultIssuerUrl;\n config.organisationId = context.organisationId;\n config.applicationInstallId = context.applicationInstallId;\n config.runtime = {\n type: 'sdk/js/apps-server',\n ver: version.split('-')[0],\n client: client\n };\n config.logger = logger;\n config.grantedPermissions = grantedPermissions;\n\n config.transformApiRequest = (options: AxiosRequestConfig) => transformApiRequest(config, options);\n config.transformApiResponse = async (url: string, response: AxiosResponse<any, any>, processor: (response: AxiosResponse<any, any>) => any) => transformApiResponse(config, url, response, processor)\n\n config.hasAnyPermissions = (permissionKeys: string[]): boolean => {\n if (!config.grantedPermissions || config.grantedPermissions.length === 0) return false;\n if (!permissionKeys || permissionKeys.length === 0) return true;\n\n return permissionKeys.some(key => config.grantedPermissions.includes(key));\n }\n config.hasAllPermissions = (permissionKeys: string[]): boolean => {\n if (!config.grantedPermissions || config.grantedPermissions.length === 0) return false;\n if (!permissionKeys || permissionKeys.length === 0) return true;\n\n return permissionKeys.every(key => config.grantedPermissions.includes(key));\n }\n config.hasPermission = (permissionKey: string): boolean => {\n if (!config.grantedPermissions || config.grantedPermissions.length === 0) return false;\n if (!permissionKey) return true;\n\n return config.grantedPermissions.includes(permissionKey);\n }\n\n return config;\n}\n\nconst transformApiRequest = async (config: SeekaAppConfig, options: AxiosRequestConfig): Promise<AxiosRequestConfig> => {\n const token = await getNewOrCachedAppInstallToken(config);\n if (!token || !token.access_token) throw new Error(\"Could not get access token for API request\")\n\n options.headers = {\n ...options.headers,\n 'X-OrgId': config.organisationId,\n Authorization: 'Bearer ' + token?.access_token,\n };\n\n // if(!token){\n // // TODO: Test\n // options.cancelToken = new axios.CancelToken((cancel: Canceler) => {\n // cancel();\n // }) \n // } \n\n return options;\n}\n\nconst transformApiResponse = async (config: SeekaAppConfig, url: string, response: AxiosResponse<any, any>, processor: (response: AxiosResponse<any, any>) => any) => {\n // Force string response, for some reason nswag is trying to JSON.parse the response when it is already deserialised to an object\n response.data = JSON.stringify(response.data);\n\n return processor(response);\n}\n\n// // export const handleApiError = (error: any, operationName: string) => {\n// // if(error.isAxiosError){\n// // const err = error as AxiosError;\n// // console.error(`Failed to ${operationName} - response ${err.code || err.status}`, {\n// // url: err.config?.url,\n// // code: err.code,\n// // message: err.message,\n// // response: err.response?.data\n// // });\n// // }\n// // else{\n// // console.error('Failed to ' + operationName, error)\n// // }\n// // }", "import crypto from 'crypto';\n\nconst algorithm = \"aes-192-cbc\";\n\nexport const encryptText = (plainText: string, secret: string): string => {\n if (!plainText) return '';\n if (!secret) throw new Error('Secret is required to encrypt data');\n\n const key = crypto.scryptSync(secret, \"salt\", 24);\n const iv = crypto.randomBytes(16);\n const cipher = crypto.createCipheriv(algorithm, key, iv);\n const encrypted = cipher.update(plainText, \"utf8\", \"hex\");\n return [\n encrypted + cipher.final(\"hex\"),\n Buffer.from(iv).toString(\"hex\"),\n ].join(\"|\");\n}\n\nexport const decryptText = (encryptedText: string, secret: string): string => {\n if (!encryptedText) return '';\n if (!secret) throw new Error('Secret is required to decrypt data');\n\n const [encrypted, iv] = encryptedText.split(\"|\");\n if (!iv) throw new Error(\"IV not found\");\n const key = crypto.scryptSync(secret, \"salt\", 24);\n\n const decipher = crypto.createDecipheriv(\n algorithm,\n key,\n Buffer.from(iv, \"hex\")\n );\n\n return decipher.update(encrypted, \"hex\", \"utf8\") + decipher.final(\"utf8\");\n}", "import { decryptText, encryptText } from \"../util/crypto\";\n\nexport class SeekaAppCryptoHelper {\n constructor(appSecret: string) {\n this.appSecret = appSecret;\n }\n\n private readonly appSecret: string;\n\n /** Encrypts a string with your app secret. CAUTION: If your app secret is regenerated the encrypted data will not be readable */\n public encryptWithAppSecret = (value: string): string => {\n if (!this.appSecret) throw new Error('App secret is required to encrypt data');\n\n return encryptText(value, this.appSecret);\n }\n\n /** Decrypts a string with your app secret. CAUTION: If your encrypted data is encrypted with a previous app secret, this method will fail */\n public decryptWithAppSecret = (value: string): string => {\n if (!this.appSecret) throw new Error('App secret is required to decrypt data');\n\n return decryptText(value, this.appSecret);\n }\n}", "import { Logger } from 'winston';\n\nimport { SeekaApiHelper } from '../../api/helper';\nimport { getAppConfig } from '../../api/helper/config';\nimport { SeekaAppConfig } from '../../api/services';\nimport { SeekaAppCacheManager } from '../../cache/appCacheManager';\nimport { SeekaAppCryptoHelper } from '../crypto';\n\nexport interface SeekaAppHelperContext {\n config: SeekaAppConfig;\n}\n\nexport class SeekaAppHelper {\n constructor(context: SeekaAppHelperContext, logger?: Logger) {\n this.context = context;\n this.api = new SeekaApiHelper(context.config);\n this.appCache = new SeekaAppCacheManager(context.config.appId);\n this.appInstallCache = new SeekaAppCacheManager(context.config.appId, context.config.applicationInstallId);\n this.crypto = new SeekaAppCryptoHelper(context.config.appSecret);\n this.logger = logger;\n }\n\n private readonly context;\n public appCache: SeekaAppCacheManager;\n public appInstallCache: SeekaAppCacheManager;\n public api: SeekaApiHelper;\n public logger?: Logger;\n public crypto: SeekaAppCryptoHelper;\n\n public static create = (appSecret: string, context: { applicationId: string, organisationId: string, applicationInstallId: string }, client: { name: string, version: string }, grantedPermissions: string[], logger?: Logger): SeekaAppHelper => {\n return new SeekaAppHelper({\n config: getAppConfig({\n ...context\n }, appSecret, {\n type: client.name,\n ver: client.version.split('-')[0],\n }, grantedPermissions, logger)\n }, logger)\n }\n}", "import winston, { Logger } from 'winston';\nimport { ActivityPipelineActivityFilter, ActivityPipelineActivityFilterSourceItemType, ActivityPipelineActivityFilterType, ConditionComparer, SeekaActivityAcceptedWebhookContent, TrackingActivityNames } from '../../../api/services';\n\nconst purchaseMadeActivities = [TrackingActivityNames.Order, TrackingActivityNames.SubscriptionItemPurchase, TrackingActivityNames.OneTimeItemPurchase];\nexport const matchActivityPipelineFilters = (content: SeekaActivityAcceptedWebhookContent, filters: ActivityPipelineActivityFilter[], logger: Logger): ActivityPipelineActivityFilter[] => {\n if (!content.activity) return [];\n const activity = content.activity;\n const activityName = activity.activityName === TrackingActivityNames.Custom ? activity.activityNameCustom : activity.activityName as string;\n if (!activityName) return [];\n\n const activityNameLower = activityName.toLowerCase();\n\n const matchedFilters: ActivityPipelineActivityFilter[] = [];\n filters.forEach((filter) => {\n if (!filter) return;\n\n // Match activity\n switch (filter.type) {\n case ActivityPipelineActivityFilterType.ActivityTracked:\n {\n if (!filter.activityNames) return;\n\n const matchedActivity = filter.activityNames.find(e => e.toLowerCase() === activityNameLower);\n if (!matchedActivity) return;\n logger.verbose('Matched activity tracked filter', { filter, activityName });\n break;\n }\n case ActivityPipelineActivityFilterType.PurchaseMade:\n {\n if (!activity.activityName || !purchaseMadeActivities.includes(activity.activityName)) return;\n logger.verbose('Matched purchase made activity filter', { filter, activityName });\n break;\n }\n default:\n {\n logger.warn('Unknown activity filter type', { filter });\n return;\n }\n }\n\n // Match source\n const sourceFilters = filter.sourceFilter;\n if (!sourceFilters) return;\n const activitySource = content.source;\n\n let activityHostname: string | null;\n try {\n activityHostname = activitySource?.loc ? new URL(activitySource.loc).hostname.toLowerCase() : null;\n }\n catch (err) {\n logger.error('Failed to parse activity source URL', { ex: winston.exceptions.getAllInfo(err as any), activitySource });\n activityHostname = null;\n }\n\n const activityPipeline = activitySource?.pipeline;\n const sourceConvergePipelineIntegrationInstanceId = activityPipeline?.convergePipelineIntegrationInstanceId?.toLowerCase();\n const matchedSourceFilters = !sourceFilters.filters ? [] : sourceFilters.filters.map(sourceFilter => {\n switch (sourceFilter.type) {\n case ActivityPipelineActivityFilterSourceItemType.Wildcard:\n {\n logger.verbose('Matched wildcard source filter', { sourceFilter });\n return true;\n }\n case ActivityPipelineActivityFilterSourceItemType.Domain:\n {\n if (!activityHostname || !sourceFilter.key) return false;\n if (activityHostname === sourceFilter.key.toLowerCase()) {\n logger.verbose('Matched domain source filter', { sourceFilter, activityHostname });\n return true\n }\n return false;\n }\n case ActivityPipelineActivityFilterSourceItemType.Pipeline:\n {\n if (!sourceConvergePipelineIntegrationInstanceId || !sourceFilter.key) return false;\n if (sourceConvergePipelineIntegrationInstanceId === sourceFilter.key.toLowerCase()) {\n logger.verbose('Matched pipeline source filter', { sourceFilter, sourceConvergePipelineIntegrationInstanceId });\n return true\n }\n return false;\n }\n }\n })\n switch (sourceFilters.comparer) {\n case ConditionComparer.And: {\n if (matchedSourceFilters.every(e => e === true)) {\n matchedFilters.push(filter);\n }\n break;\n }\n case ConditionComparer.Or: {\n if (matchedSourceFilters.some(e => e === true)) {\n matchedFilters.push(filter);\n }\n break;\n }\n default: {\n logger.warn('Unknown source filter comparer', { sourceFilters });\n break;\n }\n }\n })\n\n return matchedFilters;\n}\n", "const SeekaProfileIdSegmentSeparator = '.';\nconst SeekaProfileIdPrefix = 'sk';\nconst SeekaProfileIdVersionPrefix = '1';\n\nexport function isValidSeekaProfileId(profileId: string | null | undefined): boolean {\n if (!profileId || profileId.trim().length === 0) return false;\n\n const parts = profileId.split(SeekaProfileIdSegmentSeparator).filter(part => part.trim().length > 0);\n if (parts.length !== 4) return false;\n\n if (parts[0].toLowerCase() !== SeekaProfileIdPrefix.toLowerCase()) return false;\n if (parts[1].toLowerCase() !== SeekaProfileIdVersionPrefix.toLowerCase()) return false;\n\n if (isNaN(parseInt(parts[2], 10))) return false;\n if (isNaN(parseInt(parts[3], 10))) return false;\n\n return true;\n}\n", "\n// Mirrors converge\\src\\sdk\\privacy\\models\\index.ts\nimport {IabPrivacyConsentPurposeId} from \"../../services\";\n\nexport const IabPrivacyConsentPurposeIdMap: { [key: string]: number } = {\n [IabPrivacyConsentPurposeId.MeasureAdvertisingPerformance]: 7\n}\n"],
5
- "mappings": "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",
6
- "names": ["index_exports", "__export", "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", "decryptText", "encryptText", "getActivityName", "getIssuer", "getNewAppInstallToken", "getNewOrCachedAppInstallToken", "isValidSeekaProfileId", "matchActivityPipelineFilters", "separatePersonFullName", "throwOnInvalidWebhookSignature", "validateWebhookSignature", "webhookSignatureHeaderName", "__toCommonJS", "crypto", "import_axios", "SeekaAppConfig", "ApiServiceProxyBase", "config", "options", "url", "response", "processor", "IdentityServiceProxy", "configuration", "baseUrl", "instance", "axios", "payload", "cancelToken", "url_", "options_", "transformedOptions_", "_error", "isAxiosError", "_response", "status", "_headers", "k", "_responseText", "result200", "result401", "throwException", "result422", "result400", "IngestServiceProxy", "ResponseResultType", "PrivacyConsentType", "TrackingEventSourceOriginType", "TrackingActivityNames", "ECommerceContentType", "ECommercePlatform", "ECommerceFulfillmentStatus", "ECommerceFinancialStatus", "ConvergePipelineLoggableActivityType", "SdkLogEventLevel", "SeekaWebhookCallType", "ClickAttributionSourcePlatform", "ActivityPipelineActivityFilterType", "ConditionComparer", "ActivityPipelineActivityFilterSourceItemType", "ConditionOperator", "AnalyticsLibrary", "ContentIdentificationBehavior", "ConvergeVendorDestinationPublishStrategy", "CrossDomainTrackingUtmBehavior", "RegionalConsentGrantOption", "IabPrivacyConsentPurposeId", "ConsentMappingMatchType", "PrivacyDataControlMode", "ApiException", "message", "headers", "result", "obj", "generateNewSessionId", "dateReference", "dateToUtcDateTimeReferenceString", "random", "getRandomNumberString", "getActivityName", "event", "vals", "TrackingActivityNames", "evLower", "matched", "e", "forDateTime", "month", "day", "hour", "minute", "second", "md5Hash", "input", "separatePersonFullName", "fullname", "parts", "chunk", "array", "size", "resultArray", "item", "index", "chunkIndex", "AppPermissionKeys", "import_openid_client", "import_winston", "import_memory_cache", "prefix", "SeekaAppCacheManager", "appId", "appInstallationId", "key", "value", "expiryAbsoluteMilliseconds", "cacheKey", "memoryCache", "getValueAndExpiryFunc", "onGetFromCache", "existing", "cached", "newVal", "getIssuer", "config", "logParams", "cache", "SeekaAppCacheManager", "cacheKey", "md5Hash", "meta", "seekaIssuer", "discoverIssuerMetadata", "err", "winston", "clientId", "getNewClientToken", "issuer", "token", "successLogParams", "errorLogParams", "getNewAppInstallToken", "clientAccessToken", "getNewOrCachedAppInstallToken", "appInstallCache", "clientToken", "appToken", "import_axios", "import_http", "import_https", "httpAgent", "http", "httpsAgent", "https", "createAxiosInstance", "config", "instance", "axios", "reqConfig", "logParams", "error", "response", "code", "status", "message", "headers", "url", "method", "errorLogParams", "serviceResolver", "IdentityServiceProxy", "IngestServiceProxy", "SeekaApiHelper", "config", "serviceResolver", "getNewOrCachedAppInstallToken", "permissionKey", "opName", "identity", "src", "AppPermissionKeys", "sessionId", "generateNewSessionId", "batch", "sourceMetadata", "chunks", "chunk", "profile", "promises", "index", "item", "data", "activity", "profileId", "activities", "e", "crypto", "webhookSignatureHeaderName", "validateWebhookSignature", "secret", "headers", "requestBody", "signature", "signatures", "valid", "getHmacSignature", "throwOnInvalidWebhookSignature", "version", "defaultIngestUrl", "defaultIssuerUrl", "getAppConfig", "context", "appSecret", "client", "grantedPermissions", "logger", "config", "SeekaAppConfig", "version", "options", "transformApiRequest", "url", "response", "processor", "transformApiResponse", "permissionKeys", "key", "permissionKey", "token", "getNewOrCachedAppInstallToken", "import_crypto", "algorithm", "encryptText", "plainText", "secret", "key", "crypto", "iv", "cipher", "decryptText", "encryptedText", "encrypted", "decipher", "SeekaAppCryptoHelper", "appSecret", "value", "encryptText", "decryptText", "SeekaAppHelper", "_SeekaAppHelper", "context", "logger", "SeekaApiHelper", "SeekaAppCacheManager", "SeekaAppCryptoHelper", "appSecret", "client", "grantedPermissions", "getAppConfig", "import_winston", "purchaseMadeActivities", "matchActivityPipelineFilters", "content", "filters", "logger", "activity", "activityName", "activityNameLower", "matchedFilters", "filter", "e", "sourceFilters", "activitySource", "activityHostname", "err", "winston", "sourceConvergePipelineIntegrationInstanceId", "matchedSourceFilters", "sourceFilter", "isValidSeekaProfileId", "profileId", "parts", "part", "IabPrivacyConsentPurposeIdMap"]
3
+ "sources": ["../src/index.ts", "../package.json", "../src/api/services/index.ts", "../src/api/helper/auth/index.ts", "../src/cache/appCacheManager/index.ts", "../src/helpers/util/index.ts", "../src/api/helper/config/index.ts", "../src/api/models/index.ts", "../src/api/helper/serviceResolver/index.ts", "../src/api/helper/index.ts", "../src/api/webhooks/index.ts", "../src/helpers/util/crypto/index.ts", "../src/helpers/crypto/index.ts", "../src/helpers/app/index.ts", "../src/helpers/util/activity/index.ts", "../src/helpers/util/identity/index.ts", "../src/api/privacy/models/index.ts"],
4
+ "sourcesContent": ["import {defaultIngestUrl, defaultIssuerUrl, defaultTelemetryUrl} from \"./api/helper/config\";\n\n\nexport { SeekaApiHelper } from './api/helper';\nexport { AppPermissionKeys } from './api/models/index';\nexport * from './api/services';\nexport { throwOnInvalidWebhookSignature, validateWebhookSignature, webhookSignatureHeaderName } from './api/webhooks';\nexport { SeekaAppCacheManager } from './cache/appCacheManager';\nexport { SeekaAppHelper } from './helpers/app';\nexport { chunk, getActivityName, separatePersonFullName } from './helpers/util';\n\nexport { decryptText, encryptText } from './helpers/util/crypto';\n\nexport * from './helpers/util/activity';\nexport * from './helpers/util/identity';\n\nexport * from './api/privacy/models';\n\n// Auth helpers (token issuance + caching) \u2013 re-exported for reuse by other packages\nexport { getNewOrCachedAppInstallToken, getIssuer, getNewAppInstallToken } from './api/helper/auth';\n\nexport const urls = {\n defaultIssuerUrl, defaultTelemetryUrl, defaultIngestUrl\n}\n", "{\n \"name\": \"@seeka-labs/sdk-apps-server\",\n \"version\": \"2.2.2\",\n \"description\": \"Seeka - Apps SDK - Node.js\",\n \"author\": \"SEEKA <platform@seeka.co>\",\n \"license\": \"MIT\",\n \"keywords\": [\n \"apps\",\n \"seeka\",\n \"node\"\n ],\n \"files\": [\n \"dist/\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"types\": \"./dist/types/index.d.ts\",\n \"source\": \"src/index.ts\",\n \"main\": \"./dist/sdk-apps-server.commonjs.js\",\n \"module\": \"./dist/sdk-apps-server.module.mjs\",\n \"scripts\": {\n \"clean\": \"rimraf dist build package\",\n \"build:ci\": \"yarn run build\",\n \"build\": \"yarn esbuild src/index.ts --outfile=dist/sdk-apps-server.module.mjs --bundle --analyze --platform=node --format=esm --packages=external --minify --sourcemap && yarn esbuild src/index.ts --outfile=dist/sdk-apps-server.commonjs.js --bundle --analyze --platform=node --format=cjs --packages=external --minify --sourcemap && yarn tsc --emitDeclarationOnly\",\n \"dev\": \"yarn esbuild src/index.ts --outfile=dist/sdk-apps-server.module.mjs --bundle --analyze --platform=node --format=esm --packages=external --sourcemap && yarn tsc --emitDeclarationOnly\",\n \"watch\": \"yarn esbuild watch --platform=node --sourcemap --format=esm\",\n \"refreshapi:local\": \"nswag run scaffolding/api/service.config.nswag /variables:ApiBaseUrl=https://localhost:22744\",\n \"refreshapi:prod\": \"nswag run scaffolding/api/service.config.nswag /variables:ApiBaseUrl=https://api.seeka.services\",\n \"test\": \"cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 jest\"\n },\n \"devDependencies\": {\n \"@jest/globals\": \"^30\",\n \"@seeka-labs/sdk-apps-core\": \"workspace:*\",\n \"@types/jest\": \"^30\",\n \"@types/memory-cache\": \"^0\",\n \"@types/node\": \"^24\",\n \"axios\": \"^1\",\n \"cross-env\": \"^10\",\n \"esbuild\": \"^0\",\n \"jest\": \"^30\",\n \"memory-cache\": \"^0\",\n \"nswag\": \"^14\",\n \"openid-client\": \"^6\",\n \"ts-jest\": \"^29\",\n \"ts-node\": \"^10\",\n \"typescript\": \"^5\",\n \"undici\": \"^7\",\n \"winston\": \"^3\"\n },\n \"gitHead\": \"65c32750ca303751aa6589e933d67a2a26a7d836\",\n \"peerDependencies\": {\n \"@seeka-labs/sdk-apps-core\": \"^2\",\n \"axios\": \"^1\",\n \"memory-cache\": \"^0\",\n \"openid-client\": \"^6\",\n \"undici\": \"^7\",\n \"winston\": \"^3\"\n }\n}\n", "//----------------------\n// <auto-generated>\n// Generated using the NSwag toolchain v14.4.0.0 (NJsonSchema v11.3.2.0 (Newtonsoft.Json v13.0.0.0)) (http://NSwag.org)\n// </auto-generated>\n//----------------------\n\n/* tslint:disable */\n/* eslint-disable */\n// ReSharper disable InconsistentNaming\n\nimport axios, { AxiosError } from 'axios';\nimport { Logger } from 'winston';\nimport type { AxiosInstance, AxiosRequestConfig, AxiosResponse, CancelToken, Canceler } from 'axios';\nexport class SeekaAppConfig {\n appId!: string;\n appSecret!: string;\n ingestUrl!: string;\n issuerUrl!: string;\n organisationId!: string;\n applicationInstallId!: string;\n runtime!: AppRuntimeInfo;\n logger?: Logger\n grantedPermissions!: string[];\n\n transformApiRequest!: (options: AxiosRequestConfig) => Promise<AxiosRequestConfig>;\n transformApiResponse!: (url: string, response: AxiosResponse<any, any>, processor: (response: AxiosResponse<any, any>) => any) => any;\n hasAnyPermissions!: (permissionKeys: string[]) => boolean\n hasAllPermissions!: (permissionKeys: string[]) => boolean\n hasPermission!: (permissionKey: string) => boolean\n}\n\nexport class ApiServiceProxyBase {\n private readonly config: SeekaAppConfig;\n\n protected constructor(config: SeekaAppConfig) {\n this.config = config;\n }\n\n protected transformOptions = async (options: AxiosRequestConfig): Promise<AxiosRequestConfig> => {\n return await this.config.transformApiRequest(options);\n };\n\n protected transformResult = async (url: string, response: AxiosResponse<any, any>, processor: (response: AxiosResponse<any, any>) => any) => {\n return await this.config.transformApiResponse(url, response, processor);\n }\n}\n\nexport class IdentityServiceProxy extends ApiServiceProxyBase {\n protected instance: AxiosInstance;\n protected baseUrl: string;\n protected jsonParseReviver: ((key: string, value: any) => any) | undefined = undefined;\n\n constructor(configuration: SeekaAppConfig, baseUrl?: string, instance?: AxiosInstance) {\n\n super(configuration);\n\n this.instance = instance || axios.create();\n\n this.baseUrl = baseUrl ?? \"https://api-localdev-env0-seeka.au.ngrok.io\";\n\n }\n\n /**\n * Merge identity\n */\n merge(payload: PersonIdentificationRequest, cancelToken?: CancelToken): Promise<ApiResponseDtoOfPersonIdentificationResolutionResponse> {\n let url_ = this.baseUrl + \"/api/identity\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n const content_ = JSON.stringify(payload);\n\n let options_: AxiosRequestConfig = {\n data: content_,\n method: \"POST\",\n url: url_,\n headers: {\n \"Content-Type\": \"application/json\",\n \"Accept\": \"application/json\"\n },\n cancelToken\n };\n\n return this.transformOptions(options_).then(transformedOptions_ => {\n return this.instance.request(transformedOptions_);\n }).catch((_error: any) => {\n if (isAxiosError(_error) && _error.response) {\n return _error.response;\n } else {\n throw _error;\n }\n }).then((_response: AxiosResponse) => {\n return this.transformResult(url_, _response, (_response: AxiosResponse) => this.processMerge(_response));\n });\n }\n\n protected processMerge(response: AxiosResponse): Promise<ApiResponseDtoOfPersonIdentificationResolutionResponse> {\n const status = response.status;\n let _headers: any = {};\n if (response.headers && typeof response.headers === \"object\") {\n for (const k in response.headers) {\n if (response.headers.hasOwnProperty(k)) {\n _headers[k] = response.headers[k];\n }\n }\n }\n if (status === 200) {\n const _responseText = response.data;\n let result200: any = null;\n let resultData200 = _responseText;\n result200 = JSON.parse(resultData200);\n return Promise.resolve<ApiResponseDtoOfPersonIdentificationResolutionResponse>(result200);\n\n } else if (status === 401) {\n const _responseText = response.data;\n let result401: any = null;\n let resultData401 = _responseText;\n result401 = JSON.parse(resultData401);\n return throwException(\"A server side error occurred.\", status, _responseText, _headers, result401);\n\n } else if (status === 422) {\n const _responseText = response.data;\n let result422: any = null;\n let resultData422 = _responseText;\n result422 = JSON.parse(resultData422);\n return throwException(\"A server side error occurred.\", status, _responseText, _headers, result422);\n\n } else if (status === 400) {\n const _responseText = response.data;\n let result400: any = null;\n let resultData400 = _responseText;\n result400 = JSON.parse(resultData400);\n return throwException(\"A server side error occurred.\", status, _responseText, _headers, result400);\n\n } else if (status !== 200 && status !== 204) {\n const _responseText = response.data;\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n }\n return Promise.resolve<ApiResponseDtoOfPersonIdentificationResolutionResponse>(null as any);\n }\n}\n\nexport class IngestServiceProxy extends ApiServiceProxyBase {\n protected instance: AxiosInstance;\n protected baseUrl: string;\n protected jsonParseReviver: ((key: string, value: any) => any) | undefined = undefined;\n\n constructor(configuration: SeekaAppConfig, baseUrl?: string, instance?: AxiosInstance) {\n\n super(configuration);\n\n this.instance = instance || axios.create();\n\n this.baseUrl = baseUrl ?? \"https://api-localdev-env0-seeka.au.ngrok.io\";\n\n }\n\n /**\n * Track activity\n */\n batch(payload: DataIngestBatchHttpRequest, cancelToken?: CancelToken): Promise<void> {\n let url_ = this.baseUrl + \"/api/ingest\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n const content_ = JSON.stringify(payload);\n\n let options_: AxiosRequestConfig = {\n data: content_,\n method: \"POST\",\n url: url_,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n cancelToken\n };\n\n return this.transformOptions(options_).then(transformedOptions_ => {\n return this.instance.request(transformedOptions_);\n }).catch((_error: any) => {\n if (isAxiosError(_error) && _error.response) {\n return _error.response;\n } else {\n throw _error;\n }\n }).then((_response: AxiosResponse) => {\n return this.transformResult(url_, _response, (_response: AxiosResponse) => this.processBatch(_response));\n });\n }\n\n protected processBatch(response: AxiosResponse): Promise<void> {\n const status = response.status;\n let _headers: any = {};\n if (response.headers && typeof response.headers === \"object\") {\n for (const k in response.headers) {\n if (response.headers.hasOwnProperty(k)) {\n _headers[k] = response.headers[k];\n }\n }\n }\n if (status === 202) {\n const _responseText = response.data;\n return Promise.resolve<void>(null as any);\n\n } else if (status === 401) {\n const _responseText = response.data;\n let result401: any = null;\n let resultData401 = _responseText;\n result401 = JSON.parse(resultData401);\n return throwException(\"A server side error occurred.\", status, _responseText, _headers, result401);\n\n } else if (status === 422) {\n const _responseText = response.data;\n let result422: any = null;\n let resultData422 = _responseText;\n result422 = JSON.parse(resultData422);\n return throwException(\"A server side error occurred.\", status, _responseText, _headers, result422);\n\n } else if (status === 400) {\n const _responseText = response.data;\n let result400: any = null;\n let resultData400 = _responseText;\n result400 = JSON.parse(resultData400);\n return throwException(\"A server side error occurred.\", status, _responseText, _headers, result400);\n\n } else if (status !== 200 && status !== 204) {\n const _responseText = response.data;\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n }\n return Promise.resolve<void>(null as any);\n }\n}\n\nexport interface ApiResponseDtoOfPersonIdentificationResolutionResponse {\n result?: PersonIdentificationResolutionResponse;\n}\n\nexport interface PersonIdentificationResolutionResponse {\n personId?: string;\n}\n\nexport interface ApiResponseDtoOfObject {\n result?: any;\n}\n\nexport interface DetailedApiResponseDtoOfObject extends ApiResponseDtoOfObject {\n type?: ResponseResultType;\n error?: ErrorInfo;\n success?: boolean;\n}\n\nexport interface ApiResponseErrorDtoOfObject extends DetailedApiResponseDtoOfObject {\n}\n\nexport interface ApiResponseError extends ApiResponseErrorDtoOfObject {\n}\n\nexport enum ResponseResultType {\n Undefined = \"undefined\",\n Success = \"success\",\n Failed = \"failed\",\n}\n\nexport interface ErrorInfo {\n message?: string;\n code?: number;\n correlationId?: string;\n validation?: ValidationSummary;\n}\n\nexport interface ValidationSummary {\n properties?: PropertyValidationError[];\n}\n\nexport interface PropertyValidationError {\n errorKey?: string;\n helpActions?: HelpAction[];\n propertyName?: string;\n attemptedValue?: any;\n errorMessage?: string;\n children?: PropertyValidationError[];\n}\n\nexport interface HelpAction {\n helpActionUrl?: string;\n helpActionTitle?: string;\n}\n\nexport interface PersonIdentificationRequest {\n /** Collection of identifiers used to calculate the identity graph. */\n id: PersonIdentifiers;\n /** Source of the identification request. */\n src: TrackingEventSource;\n}\n\nexport interface PersonIdentifiersBase {\n /** Browser user agent */\n ua?: string[];\n /** IP Address */\n ip?: string[];\n /** Seeka Person ID - Identity graph ID */\n seekaPId?: string;\n /** Seeka Browser ID */\n seekaBId?: string[];\n /** Email address */\n email?: string[];\n /** Gender */\n gender?: string[];\n /** Phone number. Recommended to provide in E.164 format. */\n phone?: string[];\n /** External ID */\n eid?: string[];\n /** First name */\n firstName?: string[];\n /** Last name / surname */\n lastName?: string[];\n /** Shipping, mailing or residential address */\n address?: PlaceAddress[];\n /** Date of birth */\n dob?: Date[];\n /** Shopify identifiers */\n shopify?: ShopifyPersonIdentifiers;\n /** WooCommerce identifiers */\n wooCommerce?: WooCommercePersonIdentifiers;\n /** BigCommerce identifiers */\n bigCommerce?: BigCommercePersonIdentifiers;\n /** Magento identifiers */\n magento?: MagentoPersonIdentifiers;\n /** Klaviyo identifiers scoped by Klaviyo account ID */\n klaviyo?: ScopedIdentifiersOfKlaviyoPersonIdentifiersDtoAndString;\n /** Arbitrary traits */\n traits?: { [key: string]: any; };\n}\n\nexport interface PersonIdentifiers extends PersonIdentifiersBase {\n /** Facebook identifiers */\n facebook?: FacebookPersonIdentifiers;\n /** Snapchat identifiers */\n snapchat?: SnapchatPersonIdentifiers;\n /** TikTok identifiers */\n tiktok?: TikTokPersonIdentifiers;\n /** Google identifiers */\n google?: GooglePersonIdentifiers;\n /** Pinterest identifiers */\n pinterest?: PinterestPersonIdentifiers;\n /** Marketing, analytics and other third-party opt in/consent information */\n consent?: PersonConsentInfo;\n}\n\nexport interface BrandScopedFacebookPersonIdentifiers {\n /** Facebook user login ID */\n login?: string[];\n /** Facebook click ID */\n fbc?: string[];\n /** Facebook lead ID */\n lead?: string[];\n}\n\nexport interface FacebookPersonIdentifiers extends BrandScopedFacebookPersonIdentifiers {\n /** Facebook pixel / browser ID */\n fbp?: string[];\n}\n\nexport interface BrandScopedSnapchatPersonIdentifiers {\n /** Snapchat click ID */\n sccid?: string[];\n}\n\nexport interface SnapchatPersonIdentifiers extends BrandScopedSnapchatPersonIdentifiers {\n /** Snapchat pixel / browser ID */\n scid?: string[];\n}\n\nexport interface BrandScopedTikTokPersonIdentifiers {\n /** TikTok click ID */\n ttclid?: string[];\n /** TikTok lead ID */\n lead?: string[];\n}\n\nexport interface TikTokPersonIdentifiers extends BrandScopedTikTokPersonIdentifiers {\n /** TikTok pixel / browser ID */\n ttp?: string[];\n}\n\nexport interface BrandScopedGooglePersonIdentifiers {\n /** Google click ID */\n gclid?: string[];\n /** Google Braid ID */\n gbraid?: string[];\n /** Google Web Braid ID */\n wbraid?: string[];\n}\n\nexport interface GooglePersonIdentifiers extends BrandScopedGooglePersonIdentifiers {\n /** Google user client ID */\n userClientId?: string[];\n}\n\nexport interface BrandScopedPinterestPersonIdentifiers {\n /** Pinterest click ID / epik ID */\n epik?: string[];\n}\n\nexport interface PinterestPersonIdentifiers extends BrandScopedPinterestPersonIdentifiers {\n}\n\nexport interface PersonConsentInfo {\n /** Grant for sending data to 3rd party analytics and marketing platforms. */\n analytics?: ConsentInfo;\n /** Grant for marketing via re-marketing campaigns, EDMs etc. */\n marketing?: MarketingConsentInfo;\n /** Grant for enrolling and participating in loyalty programs. */\n loyalty?: ConsentInfo;\n privacy?: PrivacyState;\n}\n\nexport interface ConsentInfo {\n /** Type of consent */\n type?: PrivacyConsentType;\n /** When the consent was granted. */\n consentGrantedAt?: Date | undefined;\n /** The name of the source that provided the grant information. Set to the source platform like Shopify, Wordpress or your custom integration client name. */\n consentGrantedSourceName?: string;\n /** When the consent was not granted. */\n consentNotGrantedAt?: Date | undefined;\n /** The name of the source that provided the grant information. Set to the source platform like Shopify, Wordpress or your custom integration client name. */\n consentNotGrantedSourceName?: string;\n}\n\nexport enum PrivacyConsentType {\n Unknown = \"unknown\",\n Informed = \"informed\",\n Implied = \"implied\",\n Explicit = \"explicit\",\n Active = \"active\",\n Passive = \"passive\",\n}\n\nexport interface MarketingConsentInfo {\n email?: ConsentInfo;\n sms?: ConsentInfo;\n}\n\nexport interface PrivacyState {\n /** Transparency and Consent Framework (TCF) consent string v2.0\nSee https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20Consent%20string%20and%20vendor%20list%20formats%20v2.md */\n tcfConsentString?: string | undefined;\n}\n\nexport interface PlaceAddress {\n description?: string;\n addressLine1?: string;\n addressLine2?: string;\n streetName?: string;\n locality?: string;\n /** Full name of the state / province / territory */\n state?: string;\n /** ISO 3166-2 - Two or three character subdivision code */\n stateCode?: string;\n postcode?: string;\n /** Full name of the country */\n country?: string;\n /** ISO 3166-2 - Two character country code */\n countryCode?: string;\n googlePlaceId?: string;\n timeZone?: TimeZoneInfo;\n geoLocation?: GeographicalCoordinate;\n}\n\nexport interface TimeZoneInfo {\n /** IANA timezone ID */\n friendlyId?: string;\n description?: string;\n}\n\nexport interface GeographicalCoordinate {\n /** Longitude */\n longitude?: number;\n /** Latitude */\n latitude?: number;\n}\n\nexport interface ShopifyPersonIdentifiers {\n customerId?: string[];\n uniqueToken?: string[];\n microSessionId?: string[];\n visitToken?: string[];\n cartToken?: string[];\n checkoutToken?: string[];\n cartId?: string[];\n deviceId?: string[];\n checkoutId?: string[];\n orderId?: string[];\n sessionHash?: string[];\n}\n\nexport interface WooCommercePersonIdentifiers {\n customerId?: string[];\n orderId?: string[];\n cartHash?: string[];\n}\n\nexport interface BigCommercePersonIdentifiers {\n /** BigCommerce */\n customerId?: string[];\n /** BigCommerce */\n cartId?: string[];\n /** BigCommerce */\n orderId?: string[];\n}\n\nexport interface MagentoPersonIdentifiers {\n /** Magento customer */\n customerId?: string[];\n /** Magento cart */\n cartId?: string[];\n /** Magento order unique identifier */\n orderId?: string[];\n /** Magento order number / incremental ID */\n orderNumber?: string[];\n /** Magento checkout */\n checkoutId?: string[];\n}\n\nexport interface ScopedIdentifiersOfKlaviyoPersonIdentifiersDtoAndString {\n data?: { [key: string]: KlaviyoPersonIdentifiers; };\n}\n\nexport interface KlaviyoPersonIdentifiers {\n /** Klaviyo profile ID */\n profileId?: string[] | undefined;\n}\n\nexport interface TrackingEventSource {\n /** Source method that requested the tracking. */\n method: string;\n /** Type of origin that generated the tracking request.\nThis is not the same as where the tracking event originated from, this property specifies where the tracking event was tracked from. */\n origin?: TrackingEventSourceOriginType | undefined;\n /** Time occurred. Do not provide to use server time (recommended) */\n time?: Date | undefined;\n /** URL where the tracking event originated from. */\n loc: string;\n /** Title of the view or page where the tracking event originated from. */\n vt?: string | undefined;\n /** Session ID where the tracking event originated from. UTC date.time and then random digits.\nFormat YYYYMMDD.HHMMSS.{random 10 digits} */\n sess?: string | undefined;\n /** Diagnosis session ID. UTC date.time and then random digits.\nFormat YYYYMMDD.HHMMSS.{random 10 digits} */\n diag?: string | undefined;\n runtime?: SeekaSdkRuntimeInfo;\n /** Context of the pipeline integration that raised the tracking event. */\n pipeline?: SeekaPipelineIntegrationSource | undefined;\n /** IP address */\n ip?: string | undefined;\n device?: DeviceTrackingSource | undefined;\n privacy?: PrivacyState | undefined;\n}\n\nexport enum TrackingEventSourceOriginType {\n Browser = \"browser\",\n Server = \"server\",\n Mobile = \"mobile\",\n Desktop = \"desktop\",\n PhysicalStore = \"physicalStore\",\n Email = \"email\",\n Phone = \"phone\",\n Chat = \"chat\",\n Automatic = \"automatic\",\n}\n\nexport interface SeekaSdkRuntimeInfo {\n /** Version of the package or library being used to interact with the SDK */\n ver?: string;\n /** Type of the package or library being used to interact with the SDK */\n type?: string;\n client?: SeekaSdkClientRuntimeInfo;\n}\n\nexport interface SeekaSdkClientRuntimeInfo {\n /** Client version used to identify the implementation of the SDK */\n ver?: string;\n /** Name or type used to identify the implementation of the SDK. This could be specified as 'backend' for a backend integration with the SDK or 'website' for integrations placed on a website. */\n type?: string;\n origin?: SeekaSdkClientRuntimeOrigin | undefined;\n}\n\nexport interface SeekaSdkClientRuntimeOrigin {\n h?: string | undefined;\n}\n\nexport interface SeekaPipelineIntegrationSource {\n convergePipelineIntegrationInstanceId?: string;\n /** The IntegrationVendorNameKey could be set to \"Klaviyo\" for all Klaviyo pipeline integration classes so that the rate limit for certain operations are shared across all Klaviyo integration instances that share the same IntegrationInstanceUniqueKey\nAlpha only\nMax length of 12 characters */\n integrationVendorNameKey?: string;\n /** In format of IntegrationPublisherCompany.IntegrationVendorNameKey.IntegrationName. Eg. Seeka.Klaviyo.Identity */\n convergePipelineIntegrationTypeKey?: string;\n}\n\nexport interface DeviceTrackingSource {\n /** Browser name (Chrome, Firefox, Safari, etc) */\n bn?: string | undefined;\n /** Browser version */\n bv?: string | undefined;\n /** Platform name (Win32, OSX etc) */\n pl?: string | undefined;\n /** Device fingerprint */\n fp?: string | undefined;\n}\n\nexport interface DataIngestBatchHttpRequest {\n /** Max batch size is 50 */\n data?: DataIngestBatchHttpItem[];\n}\n\nexport interface DataIngestBatchHttpItem {\n ev?: ActivityTrackingRequest | undefined;\n id?: PersonIdentificationRequest | undefined;\n bot?: BotMetricTrackingRequest | undefined;\n log?: ActivityLogRequest | undefined;\n}\n\nexport interface ActivityTrackingRequest {\n /** Collection of identifiers used to calculate the identity graph. */\n id: PersonIdentifiers;\n /** Source of the identification request. */\n src: TrackingEventSource;\n /** Custom properties to attach to tracking event */\n props?: { [key: string]: string; };\n /** UTM tracking information */\n utm?: UtmTrackingEvent[];\n /** Activity tracking information */\n payload?: ActivityPayload;\n}\n\nexport interface UtmTrackingEvent {\n /** UTM ID */\n id?: string;\n /** UTM content */\n content?: string;\n /** UTM source */\n source?: string;\n /** UTM campaign */\n campaign?: string;\n /** UTM term */\n term?: string;\n /** UTM medium */\n medium?: string;\n}\n\nexport interface ActivityPayloadBase {\n /** Standard or custom activity / behavior activity name. */\n activityName?: TrackingActivityNames;\n /** Required if ActivityName is set to Custom.\nWhen setting this parameter in conjunction with setting ActivityName to a standard event name, Seeka will process the event\nas a standard event with the exception of conversion based data destinations being sent the event as the ActivityNameCustom value\nwith the parameters of the standard event. */\n activityNameCustom?: string;\n /** Unique identifier used to de-duplicate activities */\n activityId?: string;\n /** E-Commerce specific activity properties */\n commerce?: CommerceActivityTrackingEventMetadata;\n /** Search function specific activity properties */\n search?: SearchActivityTrackingEventMetadata;\n /** Sign up / newsletter function specific activity properties */\n signUp?: SignUpActivityTrackingEventMetadata;\n /** User account specific activity properties */\n userAccount?: UserAccountActivityTrackingEventMetadata;\n /** Promotion specific activity properties */\n promotion?: PromotionalActivityTrackingEventMetadata;\n /** Content behavior specific activity properties */\n contentBehaviour?: ContentBehaviourActivityTrackingEventMetadata;\n /** Lead activity properties */\n lead?: LeadActivityTrackingEventMetadata;\n /** Content item activity properties */\n contentItem?: ContentItemActivityTrackingEventMetadata;\n /** Custom properties attached to the tracking event */\n properties?: { [key: string]: string; };\n}\n\nexport interface ActivityPayload extends ActivityPayloadBase {\n /** Time activity occurred. Do not provide to use server time (recommended) */\n time?: Date | undefined;\n}\n\nexport enum TrackingActivityNames {\n Undefined = \"undefined\",\n PageViewOrganic = \"pageViewOrganic\",\n PageViewUtmAttributed = \"pageViewUtmAttributed\",\n AddPaymentMethod = \"addPaymentMethod\",\n AddToWishlist = \"addToWishlist\",\n ContactMessage = \"contactMessage\",\n Custom = \"custom\",\n SyncCart = \"syncCart\",\n Order = \"order\",\n InitiateCheckout = \"initiateCheckout\",\n AddToCart = \"addToCart\",\n RemoveFromCart = \"removeFromCart\",\n OneTimeItemPurchase = \"oneTimeItemPurchase\",\n SubscriptionItemPurchase = \"subscriptionItemPurchase\",\n ViewProduct = \"viewProduct\",\n ViewPage = \"viewPage\",\n ApplyPromotionalCode = \"applyPromotionalCode\",\n KeywordSearch = \"keywordSearch\",\n UserLoginSignup = \"userLoginSignup\",\n UserLogin = \"userLogin\",\n NewsletterSignup = \"newsletterSignup\",\n Lead = \"lead\",\n ChangeProductAttribute = \"changeProductAttribute\",\n FilterItemsByAttribute = \"filterItemsByAttribute\",\n Schedule = \"schedule\",\n ViewContentItem = \"viewContentItem\",\n StartTrial = \"startTrial\",\n}\n\nexport interface CommerceActivityTrackingEventMetadata {\n products?: CommerceActivityTrackingEventProductMetadata[];\n /** Identifier of the checkout */\n checkoutIdentifier?: string;\n /** Identifier of the cart */\n cartIdentifier?: string;\n /** Identifier of the order */\n orderIdentifier?: string;\n /** Incremental ID of the order */\n orderNumber?: string;\n /** Identifier of the customer */\n customerIdentifier?: string;\n /** Where the order was placed */\n sourceChannelName?: string;\n /** Type of the e-commerce platform */\n platformType?: ECommercePlatform;\n /** Payment method name */\n paymentMethodName?: string;\n /** ISO 4217 3 letter currency code */\n currencyCode?: string;\n /** Test order */\n isTest?: boolean;\n /** Total refunds */\n totalRefunds?: number | undefined;\n /** Total discounts */\n totalDiscounts?: number | undefined;\n /** Total sum of all the line items in the order\nCan be left empty to auto calculate */\n totalLineItemsPrice?: number | undefined;\n /** Total price of the order paid by the purchaser */\n totalPrice?: number | undefined;\n /** Total tax */\n totalTax?: number | undefined;\n /** Total shipping price */\n totalShippingPrice?: number | undefined;\n /** Fulfillment status */\n fulfillmentStatus?: ECommerceFulfillmentStatus | undefined;\n /** Financial status */\n financialStatus?: ECommerceFinancialStatus | undefined;\n}\n\nexport interface CommerceActivityTrackingEventProductMetadata {\n /** ISO 4217 currency code */\n currencyCode?: string;\n /** Product ID */\n productIdentifier?: string;\n /** Variant ID */\n variantIdentifier?: string;\n /** SKU */\n sku?: string;\n /** Identifier of the line item */\n lineItemIdentifier?: string;\n /** Name of product */\n productName?: string;\n /** Name of variant */\n variantName?: string;\n /** Name of category */\n categoryName?: string;\n /** Brand of the item */\n brandName?: string;\n /** Price of a single item */\n unitPrice?: number | undefined;\n /** Quantity */\n quantity?: number | undefined;\n /** Total discounts */\n totalDiscount?: number | undefined;\n /** Type of product or collection */\n type?: ECommerceContentType | undefined;\n /** Additional attributes of the product */\n attributes?: { [key: string]: any; };\n}\n\nexport enum ECommerceContentType {\n Undefined = \"undefined\",\n SingleProduct = \"singleProduct\",\n SingleVariant = \"singleVariant\",\n Collection = \"collection\",\n}\n\nexport enum ECommercePlatform {\n None = \"none\",\n BigCommerce = \"bigCommerce\",\n Shopify = \"shopify\",\n OrderGroove = \"orderGroove\",\n Magento = \"magento\",\n Generic = \"generic\",\n WooCommerce = \"wooCommerce\",\n Demandware = \"demandware\",\n}\n\n/** https://shopify.dev/api/admin-rest/2022-01/resources/order#resource-object */\nexport enum ECommerceFulfillmentStatus {\n Undefined = \"undefined\",\n Fulfilled = \"fulfilled\",\n NoneFulfilled = \"noneFulfilled\",\n PartiallyFulfilled = \"partiallyFulfilled\",\n RestockedOrCancelled = \"restockedOrCancelled\",\n Pending = \"pending\",\n}\n\n/** https://shopify.dev/api/admin-rest/2022-01/resources/order#resource-object */\nexport enum ECommerceFinancialStatus {\n Undefined = \"undefined\",\n Pending = \"pending\",\n Authorized = \"authorized\",\n PartiallyPaid = \"partiallyPaid\",\n Paid = \"paid\",\n PartiallyRefunded = \"partiallyRefunded\",\n Refunded = \"refunded\",\n Voided = \"voided\",\n}\n\nexport interface SearchActivityTrackingEventMetadata {\n searchText?: string;\n}\n\nexport interface UserAccountActivityTrackingEventMetadata {\n emailAddress?: string | undefined;\n userAccountIdentifierValue?: string | undefined;\n userAccountIdentifierTypeName?: string | undefined;\n}\n\nexport interface SignUpActivityTrackingEventMetadata extends UserAccountActivityTrackingEventMetadata {\n}\n\nexport interface PromotionalActivityTrackingEventMetadata {\n code?: string;\n}\n\nexport interface ContentBehaviourActivityTrackingEventMetadata {\n /** Behavior that changes or customised a product via an attribute. */\n changeProduct?: ChangeProductAttributeActivityTrackingEventMetadata;\n /** Behavior that filters a list of items or content via an attribute. */\n filterItems?: FilterItemsByAttributeActivityTrackingEventMetadata;\n}\n\nexport interface ChangeProductAttributeActivityTrackingEventMetadata {\n /** Name of the type of attribute. */\n attributeTypeName?: string;\n /** Previous value of the attribute before the change. */\n previousAttributeValue?: string;\n /** Value the attribute was changed to. */\n newAttributeValue?: string;\n /** Product that relates to attribute change. */\n product?: CommerceActivityTrackingEventProductMetadata;\n}\n\nexport interface FilterItemsByAttributeActivityTrackingEventMetadata {\n /** Name of the type of attribute that is being filtered by. */\n attributeTypeName?: string;\n /** String value of the filter. Use only one of StringValue, NumericValue, BooleanValue or DateValue properties. */\n stringValue?: string;\n /** Numerical value of the filter. Use only one of StringValue, NumericValue, BooleanValue or DateValue properties. */\n numericValue?: number | undefined;\n /** Date value of the filter. Use only one of StringValue, NumericValue, BooleanValue or DateValue properties. */\n dateValue?: Date | undefined;\n /** Boolean (true/false) value of the filter. Use only one of StringValue, NumericValue, BooleanValue or DateValue properties. */\n booleanValue?: boolean | undefined;\n}\n\nexport interface LeadActivityTrackingEventMetadata {\n sourceContentName?: string;\n companySize?: string;\n companyName?: string;\n predictedLtv?: number | undefined;\n predictedValue?: number | undefined;\n /** ISO 4217 currency code */\n currencyCode?: string;\n}\n\nexport interface ContentItemActivityTrackingEventMetadata {\n contentName?: string;\n identifiers?: string[];\n categoryName?: string;\n /** ISO 4217 currency code */\n currencyCode?: string;\n value?: number | undefined;\n contentType?: ECommerceContentType | undefined;\n items?: CommerceActivityTrackingEventProductMetadata[];\n}\n\nexport interface BotMetricTrackingRequest extends PersonIdentificationRequest {\n}\n\nexport interface ActivityTrackingBase {\n id?: string;\n source?: TrackingEventSource;\n properties?: { [key: string]: string; };\n utm?: UtmTrackingEvent;\n}\n\nexport interface ActivityLogRequest extends ActivityTrackingBase {\n logType?: ConvergePipelineLoggableActivityType;\n logLevel?: SdkLogEventLevel;\n messageTemplate?: string;\n identifiers?: PersonIdentifiers;\n}\n\nexport enum ConvergePipelineLoggableActivityType {\n Generic = \"generic\",\n ActivityIngress = \"activityIngress\",\n ActivityEgress = \"activityEgress\",\n UserProfile = \"userProfile\",\n SdkLog = \"sdkLog\",\n Detections = \"detections\",\n ActivityEgressFilter = \"activityEgressFilter\",\n Diagnosis = \"diagnosis\",\n PipelineIntegrationOutput = \"pipelineIntegrationOutput\",\n}\n\nexport enum SdkLogEventLevel {\n Information = \"information\",\n Warning = \"warning\",\n Error = \"error\",\n Verbose = \"verbose\",\n}\n\nexport enum SeekaWebhookCallType {\n None = \"none\",\n Probe = \"probe\",\n AppInstalled = \"appInstalled\",\n IdentityChanged = \"identityChanged\",\n ActivityAccepted = \"activityAccepted\",\n AppInstallSettingsUpdated = \"appInstallSettingsUpdated\",\n AppUninstalled = \"appUninstalled\",\n BrowserSdkPlugin = \"browserSdkPlugin\",\n}\n\nexport interface SeekaWebhookPayload {\n type?: SeekaWebhookCallType;\n /** Determines if the webhook is sent as a result of a test call */\n isTest?: boolean;\n /** Unique identifier for the webhook request */\n requestId?: string;\n causationId?: string | undefined;\n}\n\nexport interface SeekaWebhookPayloadOfSeekaAppWebhookContext extends SeekaWebhookPayload {\n context?: SeekaAppWebhookContext;\n}\n\nexport interface SeekaAppWebhookContext {\n /** ID of the organisation that installed the app */\n organisationId?: string;\n /** ID of the brand that installed the app */\n organisationBrandId?: string;\n /** Pipeline integration ID / ID of the installation of the app */\n applicationInstallId?: string;\n /** The client / application ID */\n applicationId?: string;\n}\n\nexport interface SeekaBrowserSdkPluginWebhookResponse {\n content: string;\n init: string;\n}\n\nexport interface SeekaWebhookPayloadOfSeekaAppWebhookContextAndSeekaAppInstalledWebhookContent extends SeekaWebhookPayloadOfSeekaAppWebhookContext {\n content?: SeekaAppInstalledWebhookContent;\n}\n\nexport interface SeekaAppInstalledWebhookContent {\n installationSettings?: { [key: string]: any; };\n /** The permissions granted to the app install by the user that installed the app. */\n grantedPermissions?: string[];\n}\n\nexport interface SeekaAppInstalledWebhookPayload extends SeekaWebhookPayloadOfSeekaAppWebhookContext {\n content?: SeekaAppInstalledWebhookContent;\n}\n\nexport interface SeekaWebhookPayloadOfSeekaAppWebhookContextAndSeekaAppUninstalledWebhookContent extends SeekaWebhookPayloadOfSeekaAppWebhookContext {\n content?: SeekaAppUninstalledWebhookContent;\n}\n\nexport interface SeekaAppUninstalledWebhookContent {\n installationSettings?: { [key: string]: any; };\n}\n\nexport interface SeekaAppUninstalledWebhookPayload extends SeekaWebhookPayloadOfSeekaAppWebhookContext {\n content?: SeekaAppUninstalledWebhookContent;\n}\n\nexport interface SeekaWebhookPayloadOfSeekaAppWebhookContextAndSeekaAppInstallSettingsUpdatedWebhookContent extends SeekaWebhookPayloadOfSeekaAppWebhookContext {\n content?: SeekaAppInstallSettingsUpdatedWebhookContent;\n}\n\nexport interface SeekaAppInstallSettingsUpdatedWebhookContent {\n installationSettings?: { [key: string]: any; };\n /** The permissions granted to the app install by the user that installed the app. */\n grantedPermissions?: string[];\n}\n\nexport interface SeekaAppInstallSettingsUpdatedWebhookPayload extends SeekaWebhookPayloadOfSeekaAppWebhookContext {\n content?: SeekaAppInstallSettingsUpdatedWebhookContent;\n}\n\nexport interface SeekaWebhookPayloadOfSeekaAppWebhookContextAndSeekaActivityAcceptedWebhookContent extends SeekaWebhookPayloadOfSeekaAppWebhookContext {\n content?: SeekaActivityAcceptedWebhookContent;\n}\n\nexport interface SeekaActivityAcceptedWebhookContent {\n /** Source of the activity */\n source?: TrackingEventSource;\n /** Identifiers resolved to the activity */\n identifiers?: PersonIdentifiers;\n /** Activity metadata */\n activity?: WebsiteEventActivityAppsPayload;\n /** Attribution metadata */\n attribution?: AttributionInfo | undefined;\n /** Seeka Person ID - Identity Graph ID */\n personId?: string;\n}\n\nexport interface WebsiteEventActivityAppsPayload extends ActivityPayloadBase {\n /** Time activity occurred */\n time?: Date;\n}\n\nexport interface AttributionInfo {\n click?: ClickAttributionInfo | undefined;\n utm?: UtmTrackingEvent | undefined;\n}\n\nexport interface ClickAttributionInfo {\n platform?: ClickAttributionSourcePlatform | undefined;\n clickIdentifier?: string | undefined;\n}\n\nexport enum ClickAttributionSourcePlatform {\n Unknown = \"unknown\",\n Google = \"google\",\n Meta = \"meta\",\n Snapchat = \"snapchat\",\n Pinterest = \"pinterest\",\n TikTok = \"tikTok\",\n}\n\nexport interface SeekaActivityAcceptedWebhookPayload extends SeekaWebhookPayloadOfSeekaAppWebhookContext {\n content?: SeekaActivityAcceptedWebhookContent;\n}\n\nexport interface SeekaWebhookPayloadOfSeekaAppWebhookContextAndSeekaIdentityChangedWebhookContent extends SeekaWebhookPayloadOfSeekaAppWebhookContext {\n content?: SeekaIdentityChangedWebhookContent;\n}\n\nexport interface SeekaIdentityChangedWebhookContent {\n identifiers?: PersonIdentifiers;\n personId?: string;\n}\n\nexport interface SeekaIdentityChangedWebhookPayload extends SeekaWebhookPayloadOfSeekaAppWebhookContext {\n content?: SeekaIdentityChangedWebhookContent;\n}\n\nexport interface ActivityPipelineActivityFilter {\n id?: string;\n type?: ActivityPipelineActivityFilterType;\n sourceFilter?: ActivityPipelineActivitySourceFilter;\n activityNames?: string[];\n}\n\nexport enum ActivityPipelineActivityFilterType {\n Undefined = \"undefined\",\n PurchaseMade = \"purchaseMade\",\n ActivityTracked = \"activityTracked\",\n}\n\nexport interface ActivityPipelineActivitySourceFilter {\n comparer?: ConditionComparer;\n filters?: ActivityPipelineActivityFilterSourceItem[];\n description?: string | undefined;\n}\n\nexport enum ConditionComparer {\n Undefined = \"undefined\",\n And = \"and\",\n Or = \"or\",\n}\n\nexport interface ActivityPipelineActivityFilterSourceItem {\n label?: string;\n type?: ActivityPipelineActivityFilterSourceItemType;\n /** Criteria to match against. */\n key?: string;\n /** If key is null, this is the criteria to match against. */\n textMatch?: TextMatchInfo | undefined;\n}\n\nexport enum ActivityPipelineActivityFilterSourceItemType {\n Undefined = \"undefined\",\n Domain = \"domain\",\n Pipeline = \"pipeline\",\n Wildcard = \"wildcard\",\n Url = \"url\",\n PagePath = \"pagePath\",\n}\n\nexport interface TextMatchInfo {\n operator?: ConditionOperator;\n /** Can be a JSON string, number (as string), regex expression or text depending on the operator */\n matchValue?: string | undefined;\n}\n\nexport enum ConditionOperator {\n Undefined = \"undefined\",\n Equals = \"equals\",\n NotEquals = \"notEquals\",\n Contains = \"contains\",\n NotContains = \"notContains\",\n StartsWith = \"startsWith\",\n EndsWith = \"endsWith\",\n IsNull = \"isNull\",\n NotNull = \"notNull\",\n IsTrue = \"isTrue\",\n IsFalse = \"isFalse\",\n GreaterThanOrEquals = \"greaterThanOrEquals\",\n LessThanOrEquals = \"lessThanOrEquals\",\n GreaterThan = \"greaterThan\",\n LessThan = \"lessThan\",\n Before = \"before\",\n After = \"after\",\n Between = \"between\",\n In = \"in\",\n NotIn = \"notIn\",\n Regex = \"regEx\",\n Any = \"any\",\n}\n\nexport interface PipelineSdkConfiguration {\n containers?: PipelineRuleSdkContainer[];\n}\n\nexport interface PipelineRuleSdkContainer {\n pipelineRules?: PipelineRule[];\n processingOrder?: number;\n id?: string;\n}\n\nexport interface PipelineRule {\n pipelineRuleContainerId?: string;\n activityFilter?: ActivityPipelineActivityFilter;\n activityModifiers?: PipelineRuleActivityModifiers;\n id?: string;\n}\n\nexport interface PipelineRuleActivityModifiers {\n pipelineRuleId?: string;\n activityName?: TrackingActivityNames;\n activityNameCustom?: string;\n /** If provided, this will override the activity name sent to the platform.\nThis will disable normalising (eg. AddToCart -> add_to_cart) and also disable changing of the\nactivity name casing. */\n activityNameOverride?: string;\n id?: string;\n}\n\nexport interface ConvergeEmbedTrackingWebsiteConfiguration {\n /** SEEKA API endpoint */\n endpoint?: string;\n /** SEEKA API ingestion endpoint */\n ingestEndpoint?: string;\n isDomainIngestRulesEnabled?: boolean;\n debug?: ConvergeEmbedTrackingWebsiteDebugConfiguration;\n defaults?: ConvergeEmbedTrackingJsTenantDefaultsConfiguration;\n analytics?: ConvergeEmbedTrackingJsTenantAnalyticsConfiguration;\n processing?: ConvergeEmbedTrackingWebsiteProcessingConfiguration;\n browserSdkVersion?: string;\n}\n\nexport interface ConvergeEmbedTrackingWebsiteDebugConfiguration {\n /** Enables debugging on browser SDK. This setting is strongly not recommended to be kept enabled in production environments. */\n isEnabled?: boolean;\n /** Enables diagnosis on browser SDK. This setting is strongly not recommended to be kept enabled in production environments. */\n isDiagnosisEnabled?: boolean;\n}\n\nexport interface ConvergeEmbedTrackingJsTenantDefaultsConfiguration {\n /** ISO 4217 currency code to use as a fallback if events ingested do not carry the parameter. */\n currencyCode?: string;\n /** ISO 3166-2 country code to use as a fallback if events ingested do not carry the parameter. */\n countryCode?: string;\n /** IANA timezone ID to use as a fallback if events ingested do not carry the parameter. */\n timezoneId?: string;\n}\n\nexport interface ConvergeEmbedTrackingJsTenantAnalyticsConfigurationBase {\n autoCollection?: ConvergeEmbedTrackingJsAutoCollectionConfiguration;\n identity?: ConvergeEmbedTrackingJsIdentityConfiguration;\n crossDomain?: ConvergeEmbedTrackingJsTenantAnalyticsCrossDomainConfiguration | undefined;\n}\n\nexport interface ConvergeEmbedTrackingJsTenantAnalyticsConfiguration extends ConvergeEmbedTrackingJsTenantAnalyticsConfigurationBase {\n libraries?: ConvergeEmbedTrackingJsTenantAnalyticsLibrariesConfiguration;\n}\n\nexport interface ConvergeEmbedTrackingJsTenantAnalyticsLibrariesConfiguration {\n seeka?: SeekaConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration;\n googleAnalytics?: GoogleAnalyticsConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration;\n facebookPixel?: FacebookPixelConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration;\n tikTokPixel?: TikTokPixelConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration;\n dynamicYield?: DynamicYieldConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration;\n segment?: SegmentConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration;\n snapchatPixel?: ConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration;\n pinterestPixel?: ConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration;\n}\n\nexport interface ConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration {\n /** Whether push of events to the platform is enabled. */\n isPushEnabled?: boolean;\n /** The library to push event to. */\n library?: AnalyticsLibrary;\n}\n\nexport interface SeekaConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration extends ConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration {\n}\n\nexport enum AnalyticsLibrary {\n Undefined = \"undefined\",\n Seeka = \"seeka\",\n DynamicYield = \"dynamicYield\",\n Segment = \"segment\",\n FacebookPixel = \"facebookPixel\",\n GoogleAnalytics = \"googleAnalytics\",\n Braze = \"braze\",\n SnapchatPixel = \"snapchatPixel\",\n Pinterest = \"pinterest\",\n TikTokPixel = \"tikTokPixel\",\n GoogleAds = \"googleAds\",\n}\n\nexport interface GoogleAnalyticsConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration extends ConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration {\n /** Additional tags to be used for tracking which will be configured on every page via the gtag('config', ...) command. */\n googleTags?: GoogleAnalyticsConvergeEmbedTrackingJsAnalyticsLibraryTagConfiguration[];\n /** Used to augment product IDs sent to Google Analytics for use with Google Merchant Center. */\n merchant?: GoogleAnalyticsConvergeEmbedTrackingJsAnalyticsLibraryMerchantConfiguration;\n}\n\nexport interface GoogleAnalyticsConvergeEmbedTrackingJsAnalyticsLibraryTagConfiguration {\n /** The ID of the tag. */\n tagId?: string;\n phoneConversions?: GoogleAnalyticsConvergeEmbedTrackingJsAnalyticsLibraryPhoneConversionConfiguration[];\n}\n\nexport interface GoogleAnalyticsConvergeEmbedTrackingJsAnalyticsLibraryPhoneConversionConfiguration {\n /** The phone number in human form as it appears on the page. This number will be replaced by Google to allow them to track inbound calls. */\n phoneConversionNumber?: string;\n /** The label of the conversion. */\n conversionLabel?: string;\n}\n\nexport interface GoogleAnalyticsConvergeEmbedTrackingJsAnalyticsLibraryMerchantConfiguration {\n /** Used to augment product IDs sent to Google Analytics for use with Google Merchant Center. */\n productItemIdPrefix?: string;\n /** Used to augment product IDs sent to Google Analytics for use with Google Merchant Center. */\n productItemIdBehavior?: ContentIdentificationBehavior | undefined;\n}\n\n/** Defines the behavior to identify content based on product ID, variant ID or SKU when sending events to platforms. */\nexport enum ContentIdentificationBehavior {\n Default = \"default\",\n Sku = \"sku\",\n ProductId = \"productId\",\n VariantId = \"variantId\",\n ProductIdAndVariantIdUnderscore = \"productIdAndVariantIdUnderscore\",\n VariantIdOrProductId = \"variantIdOrProductId\",\n}\n\nexport interface FacebookPixelConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration extends ConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration {\n /** Test event code as retrieved from your Facebook Events Manager for diagnosing and debugging events. */\n testEventCode?: string;\n /** Publish strategy */\n publishMode?: ConvergeVendorDestinationPublishStrategy;\n}\n\nexport enum ConvergeVendorDestinationPublishStrategy {\n DeliverAllTraitsAndDeliverAllEvents = \"deliverAllTraitsAndDeliverAllEvents\",\n DeliverAllTraitsAndDeliverEventsOnlyIfMaxWeightedTraitsPresent = \"deliverAllTraitsAndDeliverEventsOnlyIfMaxWeightedTraitsPresent\",\n DeliverMaxWeightedTraitsOnlyAndDeliverAllEvents = \"deliverMaxWeightedTraitsOnlyAndDeliverAllEvents\",\n DeliverMaxWeightedTraitsOnlyAndDeliverEventsOnlyIfMaxWeightedTraitsPresent = \"deliverMaxWeightedTraitsOnlyAndDeliverEventsOnlyIfMaxWeightedTraitsPresent\",\n}\n\nexport interface TikTokPixelConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration extends ConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration {\n /** Publish mode */\n publishMode?: ConvergeVendorDestinationPublishStrategy;\n}\n\nexport interface DynamicYieldConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration extends ConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration {\n siteId?: string;\n scriptEndpoint?: string;\n}\n\nexport interface SegmentConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration extends ConvergeEmbedTrackingJsAnalyticsLibraryActivityConfiguration {\n writeKey?: string;\n}\n\nexport interface ConvergeEmbedTrackingJsAutoCollectionConfiguration {\n /** Activities or events that will be automatically collected from user behaviour. */\n activityNames?: TrackingActivityNames[];\n /** Name of query parameter that contains the search text for site searches.\nA KeywordSearchQueryParamName of 'q' will resolve the search text 'awesome product' from the url https://examplewebsite.com?q=awesome%20product */\n keywordSearchQueryParamName?: string;\n /** Regex to match and identify order status page URL for the site to allow for automatic order event collection. */\n orderSuccessUrlPathMatchRegex?: string;\n activityDefinitions?: ConvergeEmbedTrackingActivityDefinition[];\n /** The currency amount to apply to activities sent to data destinations that require a value\nbut no value was provided in the tracking. */\n defaultActivityCurrencyAmount?: CurrencyAmount | undefined;\n /** Milliseconds to wait until initialising the interceptors that support automatic activity collection.\nNull or 0 will disable the delay and initialise the interceptors immediately.\n-1 will disable the interceptors. */\n interceptorStartDelayMs?: number | undefined;\n}\n\nexport interface ConvergeEmbedTrackingActivityDefinition {\n triggerSettings?: ConvergeEmbedTrackingActivityDefinitionTriggerSettings;\n vendorSettings?: ConvergeEmbedTrackingActivityDefinitionVendorSettings;\n consentSettings?: ConvergeEmbedTrackingActivityDefinitionConsentSettings;\n /** Standard or custom activity / behavior activity name. */\n activityName?: TrackingActivityNames;\n /** Required if ActivityName is set to Custom.\nWhen setting this parameter in conjunction with setting ActivityName to a standard event name, Seeka will process the event\nas a standard event with the exception of conversion based data destinations being sent the event as the ActivityNameCustom value\nwith the parameters of the standard event. */\n activityNameCustom?: string | undefined;\n /** Parameters to be sent with the activity. */\n activityParameters?: { [key: string]: any; };\n importProcessId?: string | undefined;\n id?: string;\n description?: string;\n}\n\nexport interface ConvergeEmbedTrackingActivityDefinitionTriggerSettings {\n schemaVersion?: number;\n /** Specify if all or one triggers should raise the activity */\n firingTriggersComparer?: ConditionComparer;\n firingTriggers?: ConvergeEmbedTrackingActivityDefinitionTrigger[] | undefined;\n /** Specify if all or one triggers should raise the activity */\n blockingTriggersComparer?: ConditionComparer;\n blockingTriggers?: ConvergeEmbedTrackingActivityDefinitionTrigger[] | undefined;\n triggerComparer?: ConditionComparer | undefined;\n triggers?: ConvergeEmbedTrackingActivityDefinitionTriggerV1[] | undefined;\n}\n\nexport interface ConvergeEmbedTrackingActivityDefinitionTrigger extends ActivityPipelineActivitySourceFilter {\n /** The HTML elements that if captured should cause this trigger to match. */\n htmlElements?: ConvergeEmbedTrackingActivityDefinitionTriggerHtmlElement[] | undefined;\n}\n\nexport interface ConvergeEmbedTrackingActivityDefinitionTriggerHtmlElement {\n locator?: HtmlElementLocator;\n /** The HTML element event types that if captured on the locator HTML element should cause this trigger to match. https://developer.mozilla.org/en-US/docs/Web/Events. */\n eventTypes?: string[];\n}\n\nexport interface HtmlElementLocator {\n /** List of HTML element class names to match. */\n classNames?: string[] | undefined;\n /** HTML elements type name to match. See https://developer.mozilla.org/en-US/docs/Web/HTML/Element for list.\nbutton */\n elementTypes?: string[] | undefined;\n /** ID of the HTML element to match. */\n elementId?: string | undefined;\n /** HTML element type name to match. See https://developer.mozilla.org/en-US/docs/Web/HTML/Element for list.\nbutton */\n elementType?: string;\n /** Inner text of the HTML element to match. */\n innerText?: string | undefined;\n /** Inner text of the HTML element to match. */\n innerTextMatch?: TextMatchInfo | undefined;\n /** ID of the HTML element to match. */\n elementIdMatch?: TextMatchInfo | undefined;\n /** URL of the anchor, button etc. HTML element to match. */\n linkUrlMatch?: TextMatchInfo | undefined;\n}\n\nexport interface ConvergeEmbedTrackingActivityDefinitionTriggerV1 {\n /** Regex to match a URL path to trigger the activity. */\n urlPathMatchRegex?: string;\n htmlElement?: ConvergeEmbedTrackingActivityDefinitionTriggerHtmlElement;\n}\n\nexport interface ConvergeEmbedTrackingActivityDefinitionVendorSettings {\n google?: ConvergeEmbedTrackingActivityDefinitionGoogleTriggerSettings;\n}\n\nexport interface ConvergeEmbedTrackingActivityDefinitionGoogleTriggerSettings {\n googleAdsConversionTriggers?: GoogleAdsConversionTriggerData[];\n}\n\nexport interface GoogleAdsConversionTriggerData {\n /** Conversion ID */\n conversionId?: string;\n /** Conversion label */\n conversionLabel?: string;\n}\n\nexport interface ConvergeEmbedTrackingActivityDefinitionConsentSettings {\n /** Grant for sending data to 3rd party analytics and marketing platforms. */\n analytics?: ConvergeEmbedTrackingActivityDefinitionConsentTypeSettings;\n /** Grant for marketing via re-marketing campaigns, EDMs etc. */\n marketing?: ConvergeEmbedTrackingActivityDefinitionMarketingConsentSettings;\n /** Grant for enrolling and participating in loyalty programs. */\n loyalty?: ConvergeEmbedTrackingActivityDefinitionConsentTypeSettings;\n}\n\nexport interface ConvergeEmbedTrackingActivityDefinitionConsentTypeSettings {\n /** The name of the source that provided the grant information. Set to the source platform like Shopify, Wordpress or your custom integration client name.\nIf this is left empty then the source of the data will be assumed. Eg for an event fired on a website the source name will be set to the domain name of the website. */\n consentSourceName?: string | undefined;\n /** If the consent has been granted or not granted. */\n consentGranted?: boolean | undefined;\n}\n\nexport interface ConvergeEmbedTrackingActivityDefinitionMarketingConsentSettings {\n email?: ConvergeEmbedTrackingActivityDefinitionConsentTypeSettings;\n sms?: ConvergeEmbedTrackingActivityDefinitionConsentTypeSettings;\n}\n\nexport interface CurrencyAmount {\n amount?: number;\n /** ISO 4217 currency code */\n currencyCode?: string;\n /** Currency symbol */\n currencySymbol?: string;\n}\n\nexport interface ConvergeEmbedTrackingJsIdentityConfiguration {\n /** The timeout to inform the time to live for a user session. */\n userSessionTimeoutSeconds?: number;\n}\n\nexport interface ConvergeEmbedTrackingJsTenantAnalyticsCrossDomainConfiguration {\n rules?: CrossDomainTrackingDomainRule[] | undefined;\n}\n\nexport interface CrossDomainTrackingDomainRule {\n /** The hostname to match for the source hostname.\nIf the source hostname matches the current URL, links matching the destination link will be modified. */\n sourceHostname?: TextMatchInfo;\n /** The link to match.\nIf the source hostname matches the current URL, links matching the destination link will be modified. */\n destinationLink: TextMatchInfo;\n identifiers?: CrossDomainTrackingDomainRuleIdentifierSettings;\n utm?: CrossDomainTrackingDomainRuleUtmSettings;\n id?: string;\n}\n\nexport interface CrossDomainTrackingDomainRuleIdentifierSettings {\n /** If disabled, Seeka will not append Seeka profile ID and ad platform identifiers\nonto the destination URL. */\n isIdentifierPassthroughDisabled?: boolean;\n}\n\nexport interface CrossDomainTrackingDomainRuleUtmSettings {\n behavior?: CrossDomainTrackingUtmBehavior;\n}\n\nexport enum CrossDomainTrackingUtmBehavior {\n None = \"none\",\n SessionPassthrough = \"sessionPassthrough\",\n UrlPassthrough = \"urlPassthrough\",\n}\n\nexport interface ConvergeEmbedTrackingWebsiteProcessingConfiguration {\n /** Disable browser events from being sent from the browser to platforms and SEEKA API directly. */\n isBrowserEventsDisabled?: boolean;\n /** Disable events from being ingested by SEEKA API. This will also disable the delivery of events to platforms. */\n isServerEventsDisabled?: boolean;\n /** Disable identity resolution on the browser SDK. */\n isIdentityDisabled?: boolean;\n /** Controls identity resolution delay. */\n publishToVendorsTimeoutSeconds?: number | undefined;\n /** Amount of time to retain untouched anonymous/partial identities for until purging. */\n anonymousIdentityRetentionPeriod?: string | undefined;\n /** Amount of time to retain untouched enriched/partial identities for until purging. */\n enrichedIdentityRetentionPeriod?: string | undefined;\n /** Defines the behavior to identify content based on product ID, variant ID or SKU when sending events to platforms. */\n contentIdentificationBehavior?: ContentIdentificationBehavior | undefined;\n /** JavaScript object reference that all Converge.track and Converge.identity api calls will be mediated to.\nCan be used to forward all tracking calls to Shopify.analytics.publish('seeka_mediate', { api: 'track', method: TrackingActivityNames.AddToCart, params: [{ productIdentifier: '123' }, commonProps] }) by setting this to Shopify.analytics.publish. */\n mediateBrowserMethodsToWindowReference?: string;\n /** Consent management settings. */\n consent?: ConsentSettings | undefined;\n /** Privacy data control settings */\n privacyDataControl?: PrivacyDataControlSettings | undefined;\n}\n\nexport interface ConsentSettings {\n /** Settings for regional consent management. */\n regionalConsent?: RegionalConsentSettings[] | undefined;\n /** Settings for consent management platforms. */\n consentManagementPlatform?: ConsentManagementPlatformSettings | undefined;\n /** If using a consent management platform, this should be set to true to disable Seeka's consent management. */\n disableConsentManagement?: boolean;\n}\n\nexport interface RegionalConsentSettings {\n /** ISO-3166-1 alpha-2 country code\nSee https://en.wikipedia.org/wiki/ISO_3166-2 for list.\nShould be null for \"default\" / \"fallback\" settings. */\n countryCode?: string | undefined;\n /** ISO-3166-1 alpha-2 subdivision code\nSee https://en.wikipedia.org/wiki/ISO_3166-2 for list.\n/// Should be null for \"default\" region or for targeting a whole country when used in conjunction with CountryCode. */\n subdivisionCode?: string | undefined;\n configuration?: ConsentConfiguration;\n}\n\nexport interface ConsentConfiguration {\n adStorage?: RegionalConsentGrantOption;\n adUserData?: RegionalConsentGrantOption;\n adPersonalisation?: RegionalConsentGrantOption;\n functionalityStorage?: RegionalConsentGrantOption;\n personalisationStorage?: RegionalConsentGrantOption;\n securityStorage?: RegionalConsentGrantOption;\n analyticsStorage?: RegionalConsentGrantOption;\n}\n\nexport enum RegionalConsentGrantOption {\n Unset = \"unset\",\n Granted = \"granted\",\n Denied = \"denied\",\n}\n\nexport interface ConsentManagementPlatformSettings {\n oneTrust?: OneTrustConsentManagementPlatformSettings | undefined;\n}\n\nexport interface OneTrustConsentManagementPlatformSettings {\n purposeMappings?: OneTrustConsentManagementPurposeMapping[];\n}\n\nexport interface OneTrustConsentManagementPurposeMapping {\n /** The IAB purpose ID that maps to the OneTrust categories. */\n iabPurposeId?: IabPrivacyConsentPurposeId;\n /** OneTrust category IDs that map to the IAB purpose.\nC0001 */\n oneTrustCategoryIds?: string[];\n matchType?: ConsentMappingMatchType;\n}\n\nexport enum IabPrivacyConsentPurposeId {\n Undefined = \"undefined\",\n MeasureAdvertisingPerformance = \"measureAdvertisingPerformance\",\n}\n\nexport enum ConsentMappingMatchType {\n Undefined = \"undefined\",\n AllOf = \"allOf\",\n AnyOf = \"anyOf\",\n}\n\nexport interface PrivacyDataControlSettings {\n mode?: PrivacyDataControlMode;\n}\n\nexport enum PrivacyDataControlMode {\n Disabled = \"disabled\",\n Explicit = \"explicit\",\n Implicit = \"implicit\",\n}\n\nexport interface ConvergeTrackingConfiguration {\n /** SEEKA API endpoint */\n endpoint?: string;\n /** SEEKA API ingestion endpoint */\n ingestEndpoint?: string;\n isDomainIngestRulesEnabled?: boolean;\n debug?: ConvergeEmbedTrackingWebsiteDebugConfiguration;\n defaults?: ConvergeEmbedTrackingJsTenantDefaultsConfiguration;\n analytics?: ConvergeEmbedTrackingJsTenantAnalyticsConfiguration;\n processing?: ConvergeEmbedTrackingWebsiteProcessingConfiguration;\n browserSdkVersion?: string;\n}\n\nexport interface ActivityPipelineActivityFilterResult {\n filter?: ActivityPipelineActivityFilter;\n resultDescriptions?: string[];\n isMatch?: boolean;\n}\n\nexport class ApiException extends Error {\n override message: string;\n status: number;\n response: string;\n headers: { [key: string]: any; };\n result: any;\n\n constructor(message: string, status: number, response: string, headers: { [key: string]: any; }, result: any) {\n super();\n\n this.message = message;\n this.status = status;\n this.response = response;\n this.headers = headers;\n this.result = result;\n }\n\n protected isApiException = true;\n\n static isApiException(obj: any): obj is ApiException {\n return obj.isApiException === true;\n }\n}\n\nfunction throwException(message: string, status: number, response: string, headers: { [key: string]: any; }, result?: any): any {\n if (result !== null && result !== undefined)\n throw result;\n else\n throw new ApiException(message, status, response, headers, null);\n}\n\nfunction isAxiosError(obj: any): obj is AxiosError {\n return obj && obj.isAxiosError === true;\n}\n\n// Dont remove unused imports as they are used in the generated code\n\n// Dont remove unused imports as they are used in the generated code\n\nexport interface AppClientRuntimeInfo {\n /** Client version used to identify the implementation of the SDK */\n ver: string;\n /** Name or type used to identify the implementation of the SDK. This could be specified as 'backend' for a backend integration with the SDK or 'website' for integrations placed on a website. */\n type: string;\n}\n\nexport interface AppRuntimeInfo {\n /** Version of the package or library being used to interact with the SDK */\n ver: string;\n /** Type of the package or library being used to interact with the SDK */\n type: string;\n client: AppClientRuntimeInfo;\n}", "import {\n ClientMetadata, ServerMetadata, Configuration, TokenEndpointResponse, genericGrantRequest,\n clientCredentialsGrant, discovery, None\n} from 'openid-client';\n\nimport winston from 'winston';\nimport { SeekaAppConfig } from '../../services';\nimport { SeekaAppCacheManager } from '../../../cache/appCacheManager';\nimport {md5Hash} from \"../../../helpers/util\";\n\ntype IssuerMetadata = {\n clientMetadata: ClientMetadata,\n serverMetadata: ServerMetadata,\n clientId: string\n timeout: number | undefined\n} | null\n\nexport const getIssuer = async (config: SeekaAppConfig): Promise<Configuration | null> => {\n const logParams = { applicationId: config.appId, issuer: { url: config.issuerUrl } }\n\n if (config.logger) {\n config.logger.debug(`Seeka auth: getting issuer`, { ...logParams });\n }\n else {\n console.debug(`Seeka auth: getting issuer`, { ...logParams });\n }\n\n const cache = new SeekaAppCacheManager(config.appId, config.applicationInstallId);\n const cacheKey = md5Hash(config.issuerUrl + '_' + config.appId);\n\n const meta = await cache.getOrSet<IssuerMetadata>(cacheKey, async () => {\n try {\n const seekaIssuer = await discoverIssuerMetadata(config);\n if (!seekaIssuer || !seekaIssuer.meta || !seekaIssuer.raw) return null;\n\n if (config.logger) {\n config.logger.verbose(`Seeka auth: got issuer from remote`, { ...logParams });\n }\n else {\n console.debug(`Seeka auth: got issuer from remote`, { ...logParams });\n }\n\n // return new openid.Configuration(seekaIssuer.meta.serverMetadata, seekaIssuer.meta.clientId, config.appSecret);\n\n return {\n value: seekaIssuer.meta,\n expiryAbsoluteMilliseconds: 1000 * 60 * 60 // 1 hour\n }\n }\n catch (err) {\n if (config.logger) {\n config.logger.error(`Seeka auth: failed getting issuer`, { ...logParams, ex: winston.exceptions.getAllInfo(err as any) });\n }\n else {\n console.error(`Seeka auth: failed getting issuer`, { ...logParams });\n }\n return null\n }\n }, async () => {\n if (config.logger) {\n config.logger.verbose(`Seeka auth: got issuer from cache`, { ...logParams });\n }\n else {\n console.debug(`Seeka auth: got issuer from cache`, { ...logParams });\n }\n });\n\n if (meta === null) return null;\n\n return new Configuration(meta.serverMetadata, meta.clientId, config.appSecret);\n}\n\nexport const discoverIssuerMetadata = async (config: SeekaAppConfig): Promise<{ meta: IssuerMetadata, raw: Configuration } | null> => {\n const logParams = { applicationId: config.appId, issuer: { url: config.issuerUrl } }\n\n if (config.logger) {\n config.logger.verbose(`Seeka auth: discovering issuer from remote`, { ...logParams });\n }\n else {\n console.info(`Seeka auth: discovering issuer from remote`, { ...logParams });\n }\n\n try {\n const clientId = config.appId.replace(/-/g, '')\n const meta = await discovery(\n new URL(config.issuerUrl),\n clientId,\n undefined,\n None(),\n {\n\n timeout: 10000\n }\n )\n\n if (config.logger) {\n config.logger.verbose(`Seeka auth: discovered issuer from remote`, { ...logParams, client_id: meta.clientMetadata().client_id });\n }\n else {\n console.info(`Seeka auth: discovered issuer from remote`, { ...logParams, client_id: meta.clientMetadata().client_id });\n }\n\n const cachableMeta = {\n meta: {\n serverMetadata: meta.serverMetadata(),\n clientMetadata: meta.clientMetadata(),\n timeout: meta.timeout,\n clientId,\n },\n raw: meta\n }\n\n return cachableMeta;\n }\n catch (err) {\n if (config.logger) {\n config.logger.error(`Seeka auth: failed discovering issuer from remote`, { ...logParams, ex: winston.exceptions.getAllInfo(err as any) });\n }\n else {\n console.error(`Seeka auth: failed discovering issuer from remote`, { ...logParams, err });\n }\n return null\n }\n}\n\nconst getNewClientToken = async (config: SeekaAppConfig): Promise<TokenEndpointResponse | null> => {\n const logParams = { applicationId: config.appId, issuer: { url: config.issuerUrl } }\n const issuer = await getIssuer(config);\n if (!issuer) return null;\n\n try {\n let token: TokenEndpointResponse = await clientCredentialsGrant(\n issuer,\n {\n resource: issuer.clientMetadata().client_id\n },\n )\n\n const successLogParams = {\n ...logParams,\n token: {\n expires_at: token.expires_at,\n token_type: token.token_type,\n scope: token.scope\n }\n }\n\n if (config.logger) {\n config.logger.verbose(`Seeka auth: got client access token from server`, { ...successLogParams });\n }\n else {\n console.info(`Seeka auth: got app client token from server`, { ...successLogParams });\n }\n\n return {\n token_type: token.token_type,\n access_token: token.access_token,\n expires_in: token.expires_in,\n id_token: token.id_token,\n refresh_token: token.refresh_token,\n scope: token.scope,\n authorization_details: token.authorization_details,\n }\n }\n catch (err) {\n const errorLogParams = {\n ...logParams,\n error: err\n }\n if (config.logger) {\n config.logger.error(`Seeka auth: failed to get client access token from server`, { ...errorLogParams });\n }\n else {\n console.error(`Seeka auth: failed to get client access token from server`, { ...errorLogParams, err: winston.exceptions.getAllInfo(err as any) });\n }\n\n return null;\n }\n}\n\nexport const getNewAppInstallToken = async (clientAccessToken: string, config: SeekaAppConfig): Promise<TokenEndpointResponse | null> => {\n const logParams = { applicationId: config.appId, issuer: { url: config.issuerUrl } }\n const issuer = await getIssuer(config);\n if (!issuer || !issuer) return null;\n\n try {\n const token = await genericGrantRequest(issuer, \"app_install_token\", {\n applicationInstallId: config.applicationInstallId,\n access_token: clientAccessToken,\n scope: 'Seeka.API.Ingest'\n })\n\n // console.log('Got new app install token', {\n // expires_at: token.expires_at,\n // token_type: token.token_type,\n // scope: token.scope\n // });\n const successLogParams = {\n ...logParams,\n token: {\n expires_at: token.expires_at,\n token_type: token.token_type,\n scope: token.scope\n }\n }\n if (config.logger) {\n config.logger.verbose(`Seeka auth: got app access token from server`, { ...successLogParams });\n }\n else {\n console.info(`Seeka auth: got app access token from server`, { ...successLogParams });\n }\n\n return {\n token_type: token.token_type,\n access_token: token.access_token,\n expires_in: token.expires_in,\n id_token: token.id_token,\n refresh_token: token.refresh_token,\n scope: token.scope,\n authorization_details: token.authorization_details,\n }\n }\n catch (err) {\n const errorLogParams = {\n ...logParams,\n error: err\n }\n if (config.logger) {\n config.logger.error(`Seeka auth: failed to get app access token from server`, { ...errorLogParams });\n }\n else {\n console.debug(`Seeka auth: failed to get app access token from server`, { ...errorLogParams });\n }\n\n return null;\n }\n}\n\nexport const getNewOrCachedAppInstallToken = async (config: SeekaAppConfig): Promise<TokenEndpointResponse | null> => {\n const appInstallCache = new SeekaAppCacheManager(config.appId, config.applicationInstallId);\n const logParams = { applicationId: config.appId, issuer: { url: config.issuerUrl } }\n\n return await appInstallCache.getOrSet('auth:token:appinstall', async () => {\n const clientToken = await getNewClientToken(config);\n if (!clientToken || !clientToken.access_token) return null;\n\n const appToken = await getNewAppInstallToken(clientToken.access_token as string, config);\n if (!appToken) return null;\n\n return {\n value: appToken,\n expiryAbsoluteMilliseconds: (((appToken.expires_in as number) > (clientToken.expires_in as number) ? clientToken.expires_in : appToken.expires_in) || 15 * 60 * 1000) - (60 * 1000)\n }\n }, async () => {\n if (config.logger) {\n config.logger.verbose(`Seeka auth: got app token from cache`, { ...logParams });\n }\n else {\n console.debug(`Seeka auth: got app token from cache`, { ...logParams });\n }\n })\n}\n", "import memoryCache from 'memory-cache';\n\nconst prefix = 'seeka:sdk';\n\nexport class SeekaAppCacheManager {\n constructor(appId: string, appInstallationId?: string) {\n this.appId = appId;\n this.appInstallationId = appInstallationId;\n }\n\n private readonly appId: string;\n private readonly appInstallationId?: string;\n\n public set = async (key: string, value: any, expiryAbsoluteMilliseconds?: number): Promise<void> => {\n const cacheKey = this.getKey(key);\n memoryCache.put(cacheKey, JSON.stringify(value), expiryAbsoluteMilliseconds);\n }\n\n public getOrSet = async <TValue>(key: string, getValueAndExpiryFunc: () => Promise<{ value: TValue, expiryAbsoluteMilliseconds?: number } | null>, onGetFromCache?: (val: TValue | null) => Promise<void>): Promise<TValue | null> => {\n const cacheKey = this.getKey(key);\n\n const existing = memoryCache.get(cacheKey);\n if (existing) {\n const cached = JSON.parse(existing) as TValue;\n if (onGetFromCache) {\n await onGetFromCache(cached)\n }\n return cached;\n }\n\n const newVal = await getValueAndExpiryFunc();\n if (!newVal) return null;\n\n memoryCache.put(cacheKey, JSON.stringify(newVal.value), newVal.expiryAbsoluteMilliseconds);\n\n return newVal.value;\n }\n\n private getKey = (key: string): string => {\n if (this.appInstallationId) {\n return `${prefix}:${this.appId}:${this.appInstallationId}:${key}`;\n }\n return `${prefix}:${this.appId}:${key}`;\n }\n}\n", "import * as crypto from 'crypto';\nimport { TrackingActivityNames } from '../../api/services';\n\nexport const generateNewSessionId = (): string => {\n /** Session ID where the tracking event originated from. Format of UTC time YYYYMMDD.HHMMSS.{random 6 digits} */\n const dateReference = dateToUtcDateTimeReferenceString(new Date());\n const random = getRandomNumberString();\n\n return `${dateReference}.${random}`;\n}\n\nexport const getActivityName = (event: string): TrackingActivityNames => {\n const vals = Object.keys(TrackingActivityNames)\n const evLower = event.toLowerCase();\n\n const matched = vals.find(e => e.toLowerCase() === evLower);\n\n if (matched) {\n return TrackingActivityNames[matched as keyof typeof TrackingActivityNames];\n }\n\n return TrackingActivityNames.Custom;\n}\n\nexport const getRandomNumberString = (): string => {\n const min = 1000000000;\n const max = 9999999999;\n return Math.floor(Math.random() * (max - min) + min).toString();\n}\n\nexport const dateToUtcDateTimeReferenceString = (forDateTime: Date): string => {\n let month = (forDateTime.getUTCMonth() + 1).toString();\n if (month.length < 2) {\n month = \"0\" + month;\n }\n let day = forDateTime.getUTCDate().toString();\n if (day.length < 2) {\n day = \"0\" + day;\n }\n let hour = forDateTime.getUTCHours().toString();\n if (hour.length < 2) {\n hour = \"0\" + hour;\n }\n let minute = forDateTime.getUTCMinutes().toString();\n if (minute.length < 2) {\n minute = \"0\" + minute;\n }\n let second = forDateTime.getUTCSeconds().toString();\n if (second.length < 2) {\n second = \"0\" + second;\n }\n\n return `${forDateTime.getUTCFullYear()}${month}${day}.${hour}${minute}${second}`;\n}\n\nexport const md5Hash = (input: string): string => {\n return crypto.createHash('md5').update(input).digest(\"hex\");\n}\n\nexport const separatePersonFullName = (fullname: string): { firstName: string | null, lastName: string | null } => {\n if (!fullname) return { firstName: null, lastName: null };\n\n const parts = fullname.trim().split(' ');\n if (parts.length === 1) return { firstName: fullname, lastName: null };\n else if (parts.length === 2) return { firstName: parts[0], lastName: parts[1] };\n else return { firstName: parts[0], lastName: parts.slice(1).join(' ') };\n}\n\n// Replicates lodash chunk method\nexport const chunk = <T>(array: T[], size: number): T[][] => {\n return array.reduce((resultArray: Array<T[]>, item, index) => {\n const chunkIndex = Math.floor(index / size)\n\n if (!resultArray[chunkIndex]) {\n resultArray[chunkIndex] = [] // start a new chunk\n }\n\n resultArray[chunkIndex].push(item)\n\n return resultArray\n }, [])\n}", "import { AxiosRequestConfig, AxiosResponse } from 'axios';\nimport { Logger } from 'winston';\n\nimport { version } from '../../../../package.json';\nimport { AppClientRuntimeInfo, SeekaAppConfig } from '../../services';\nimport { getNewOrCachedAppInstallToken } from '../auth';\n\nexport const defaultIngestUrl = 'https://router.seeka.services';\nexport const defaultTelemetryUrl = 'https://router.seeka.services/tel/otel';\nexport const defaultIssuerUrl = 'https://account.seeka.app'\n\nexport const getAppConfig = (context: { applicationId: string, organisationId: string, applicationInstallId: string }, appSecret: string, client: AppClientRuntimeInfo, grantedPermissions: string[], logger?: Logger): SeekaAppConfig => {\n const config = new SeekaAppConfig();\n config.appId = context.applicationId;\n config.appSecret = appSecret;\n config.ingestUrl = process.env.SEEKA_INGEST_URL || defaultIngestUrl;\n config.issuerUrl = process.env.SEEKA_ISSUER_URL || defaultIssuerUrl;\n config.organisationId = context.organisationId;\n config.applicationInstallId = context.applicationInstallId;\n config.runtime = {\n type: 'sdk/js/apps-server',\n ver: version.split('-')[0],\n client: client\n };\n config.logger = logger;\n config.grantedPermissions = grantedPermissions;\n\n config.transformApiRequest = (options: AxiosRequestConfig) => transformApiRequest(config, options);\n config.transformApiResponse = async (url: string, response: AxiosResponse<any, any>, processor: (response: AxiosResponse<any, any>) => any) => transformApiResponse(config, url, response, processor)\n\n config.hasAnyPermissions = (permissionKeys: string[]): boolean => {\n if (!config.grantedPermissions || config.grantedPermissions.length === 0) return false;\n if (!permissionKeys || permissionKeys.length === 0) return true;\n\n return permissionKeys.some(key => config.grantedPermissions.includes(key));\n }\n config.hasAllPermissions = (permissionKeys: string[]): boolean => {\n if (!config.grantedPermissions || config.grantedPermissions.length === 0) return false;\n if (!permissionKeys || permissionKeys.length === 0) return true;\n\n return permissionKeys.every(key => config.grantedPermissions.includes(key));\n }\n config.hasPermission = (permissionKey: string): boolean => {\n if (!config.grantedPermissions || config.grantedPermissions.length === 0) return false;\n if (!permissionKey) return true;\n\n return config.grantedPermissions.includes(permissionKey);\n }\n\n return config;\n}\n\nconst transformApiRequest = async (config: SeekaAppConfig, options: AxiosRequestConfig): Promise<AxiosRequestConfig> => {\n const token = await getNewOrCachedAppInstallToken(config);\n if (!token || !token.access_token) throw new Error(\"Could not get access token for API request\")\n\n options.headers = {\n ...options.headers,\n 'X-OrgId': config.organisationId,\n Authorization: 'Bearer ' + token?.access_token,\n };\n\n // if(!token){\n // // TODO: Test\n // options.cancelToken = new axios.CancelToken((cancel: Canceler) => {\n // cancel();\n // })\n // }\n\n return options;\n}\n\nconst transformApiResponse = async (config: SeekaAppConfig, url: string, response: AxiosResponse<any, any>, processor: (response: AxiosResponse<any, any>) => any) => {\n // Force string response, for some reason nswag is trying to JSON.parse the response when it is already deserialised to an object\n response.data = JSON.stringify(response.data);\n\n return processor(response);\n}\n\n// // export const handleApiError = (error: any, operationName: string) => {\n// // if(error.isAxiosError){\n// // const err = error as AxiosError;\n// // console.error(`Failed to ${operationName} - response ${err.code || err.status}`, {\n// // url: err.config?.url,\n// // code: err.code,\n// // message: err.message,\n// // response: err.response?.data\n// // });\n// // }\n// // else{\n// // console.error('Failed to ' + operationName, error)\n// // }\n// // }\n", "import { SeekaPipelineIntegrationSource, TrackingEventSourceOriginType } from '../../api/services';\n\nexport interface ServiceCallSource {\n /** Source method that requested the tracking. */\n method?: string;\n\n /** Type of origin that generated the tracking request.\n This is not the same as where the tracking event originated from, this property specifies where the tracking event was tracked from. */\n origin?: TrackingEventSourceOriginType;\n\n /** URL where the tracking event originated from. */\n loc?: string;\n\n pipeline?: SeekaPipelineIntegrationSource\n}\n\nexport const AppPermissionKeys = {\n identity: {\n receiveFull: 'Identity.Receive.Pii',\n send: 'Identity.Send'\n },\n activity: {\n receiveAnon: 'Activity.Receive.Anon',\n receiveFull: 'Activity.Receive.Pii',\n send: 'Activity.Send'\n }\n}", "import axios from 'axios';\nimport http from 'http';\nimport https from 'https';\n\nimport { IdentityServiceProxy, IngestServiceProxy, SeekaAppConfig } from '../../services';\n\nconst httpAgent = new http.Agent({ keepAlive: true, scheduling: 'fifo' });\nconst httpsAgent = new https.Agent({ keepAlive: true, scheduling: 'fifo' });\n\nconst createAxiosInstance = (config: SeekaAppConfig) => {\n const instance = axios.create({\n httpAgent,\n httpsAgent,\n });\n\n instance.interceptors.request.use(function (reqConfig) {\n let logParams: any = {\n url: reqConfig.url,\n method: reqConfig.method,\n };\n if (process.env.LOGGING_LEVEL === 'silly') {\n logParams = {\n ...logParams,\n body: reqConfig.data,\n params: reqConfig.params,\n }\n }\n if (config.logger) {\n config.logger.debug(`Seeka API: making call to ${logParams.url}`, { ...logParams });\n }\n else {\n console.debug(`Seeka API: making call to ${logParams.url}`, { ...logParams });\n }\n\n return reqConfig;\n }, function (error) {\n const logParams = {\n // url: response.request?.url || response.config.url,\n // method: response.request?.method || response.config.method,\n error\n };\n if (config.logger) {\n config.logger.http(`Seeka API: failed to send request`, { ...logParams });\n }\n else {\n console.debug(`Seeka API: failed to send request`, { ...logParams });\n }\n return Promise.reject(error);\n });\n\n instance.interceptors.response.use(function (response) {\n const logParams = {\n url: response.request?.url || response.config.url,\n method: response.request?.method || response.config.method,\n response: {\n status: response.status,\n }\n };\n if (config.logger) {\n config.logger.http(`Seeka API: call to ${logParams.url} succeeded`, { ...logParams });\n }\n else {\n console.debug(`Seeka API: call to ${logParams.url} succeeded`, { ...logParams });\n }\n\n return response;\n }, function (error) {\n const { code, status, message } = error\n const { headers, url, method } = error?.config;\n const errorLogParams = {\n code,\n status,\n message,\n headers,\n url,\n method,\n content: error?.response?.data\n }\n if (config.logger) {\n config.logger.error(`Seeka API: call to ${errorLogParams.url} failed`, { ...errorLogParams });\n }\n else {\n console.error(`Seeka API: call to ${errorLogParams.url} failed`, { ...errorLogParams });\n }\n\n return Promise.reject(error);\n });\n\n return instance;\n}\n\nexport const serviceResolver = {\n getIdentityService: (config: SeekaAppConfig) => new IdentityServiceProxy(config, config.ingestUrl, createAxiosInstance(config)),\n getIngestService: (config: SeekaAppConfig) => new IngestServiceProxy(config, config.ingestUrl, createAxiosInstance(config)),\n}", "import { chunk, generateNewSessionId } from '../../helpers/util';\nimport { AppPermissionKeys, ServiceCallSource } from '../models';\nimport {\n ActivityPayload, DataIngestBatchHttpRequest, IdentityServiceProxy, IngestServiceProxy,\n PersonIdentifiers, SeekaAppConfig\n} from '../services';\nimport { getNewOrCachedAppInstallToken } from './auth';\nimport { serviceResolver } from './serviceResolver';\n\nexport class SeekaApiHelper {\n constructor(config: SeekaAppConfig) {\n this.config = config;\n this.ingestionService = serviceResolver.getIngestService(config);\n this.identityService = serviceResolver.getIdentityService(config);\n }\n\n private readonly config;\n\n private maxBatchSize = 50;\n\n // Used to prime the token cache and issue refresh tokens if required\n public refreshOrPrimeTokenCache = async (): Promise<void> => {\n await getNewOrCachedAppInstallToken(this.config);\n }\n\n public ingestionService: IngestServiceProxy;\n public identityService: IdentityServiceProxy;\n\n private checkPermission = (permissionKey: string, opName: string): boolean => {\n if (!this.config.hasPermission(permissionKey)) {\n throw new Error('Cannot perform operation ' + opName + ' on installationId ' + this.config.applicationInstallId + ' without permission ' + permissionKey + '. Currently granted permissions: ' + (this.config.grantedPermissions ? this.config.grantedPermissions.join(', ') : 'none'));\n }\n\n return true;\n }\n\n public mergeIdentity = async (identity: PersonIdentifiers, src: ServiceCallSource): Promise<string> => {\n this.checkPermission(AppPermissionKeys.identity.send, 'mergeIdentity');\n\n const sessionId = generateNewSessionId();\n\n const result = await this.identityService.merge({\n id: identity,\n src: {\n method: '', // TODO\n origin: src.origin,\n time: undefined,\n loc: src.loc as string,\n sess: sessionId,\n diag: process.env.SEEKA_DEBUG_ENABLED === 'true' ? sessionId : undefined,\n runtime: this.config.runtime\n }\n })\n\n return result.result?.personId as string;\n }\n\n public mergeIdentityBatch = async (batch: PersonIdentifiers[], src: ServiceCallSource): Promise<void> => {\n this.checkPermission(AppPermissionKeys.identity.send, 'mergeIdentityBatch');\n\n const sessionId = generateNewSessionId();\n if (batch.length === 0) {\n this.config.logger?.debug('No identities in batch');\n return;\n }\n\n const sourceMetadata = {\n method: '', // TODO\n origin: src.origin,\n time: undefined,\n loc: src.loc as string,\n sess: sessionId,\n diag: process.env.SEEKA_DEBUG_ENABLED === 'true' ? sessionId : undefined,\n runtime: this.config.runtime\n }\n\n // Make ingestion is ${this.maxBatchSize} per batch, send in parallel\n const chunks = chunk(batch, this.maxBatchSize);\n if (chunks.length > 1) {\n if (this.config.logger) {\n this.config.logger.debug(`Identity batch size ${batch} is greater than ${this.maxBatchSize}, splitting into ${chunks.length} batches`);\n }\n }\n\n // Process first batch to prime authorization, then process the rest of the batches\n await this.trackActivityBatchRaw({\n data: chunks[0].map(profile => {\n return {\n id: {\n id: profile || {},\n src: { ...sourceMetadata },\n }\n }\n })\n })\n\n if (chunks.length > 1) {\n const promises = chunks.map((chunk, index) => {\n if (index === 0) return Promise.resolve();\n\n this.config.logger?.verbose(`Processing identity batch ${index + 1} of ${chunks.length}`);\n return this.trackActivityBatchRaw({\n data: chunk.map(profile => {\n return {\n id: {\n id: profile || {},\n src: { ...sourceMetadata },\n }\n }\n })\n })\n })\n\n await Promise.all(promises);\n }\n }\n\n public trackActivityBatch = async (batch: { activity: ActivityPayload, profile?: PersonIdentifiers | undefined }[], src: ServiceCallSource): Promise<void> => {\n this.checkPermission(AppPermissionKeys.activity.send, 'trackActivityBatch');\n\n const sessionId = generateNewSessionId();\n if (batch.length === 0) {\n this.config.logger?.debug('No activities in batch');\n return;\n }\n\n const sourceMetadata = {\n method: '', // TODO\n origin: src.origin,\n time: undefined,\n loc: src.loc as string,\n sess: sessionId,\n diag: process.env.SEEKA_DEBUG_ENABLED === 'true' ? sessionId : undefined,\n runtime: this.config.runtime\n }\n\n // Make ingestion is ${this.maxBatchSize} per batch, send in parallel\n const chunks = chunk(batch, this.maxBatchSize);\n if (chunks.length > 1) {\n if (this.config.logger) {\n this.config.logger.debug(`Activity batch size ${batch.length} is greater than ${this.maxBatchSize}, splitting into ${chunks.length} batches`);\n }\n }\n\n // Process first batch to prime authorization, then process the rest of the batches\n await this.trackActivityBatchRaw({\n data: chunks[0].map(item => {\n return {\n ev: {\n id: item.profile || {},\n src: { ...sourceMetadata },\n payload: item.activity\n }\n }\n })\n })\n\n if (chunks.length > 1) {\n const promises = chunks.map((chunk, index) => {\n if (index === 0) return Promise.resolve();\n\n this.config.logger?.verbose(`Processing activity batch ${index + 1} of ${chunks.length}`);\n return this.trackActivityBatchRaw({\n data: chunk.map(item => {\n return {\n ev: {\n id: item.profile || {},\n src: { ...sourceMetadata },\n payload: item.activity\n }\n }\n })\n })\n })\n\n await Promise.all(promises);\n }\n }\n\n public trackActivityBatchRaw = async (data: DataIngestBatchHttpRequest): Promise<void> => {\n await this.ingestionService.batch(data);\n }\n\n public trackActivityForProfileId = async (activity: ActivityPayload, profileId: string | undefined, src: ServiceCallSource): Promise<void> => {\n this.checkPermission(AppPermissionKeys.activity.send, 'trackActivityForProfileId');\n\n await this.trackActivityForProfileIdBatch([activity], profileId, src);\n }\n\n public trackActivityForProfileIdBatch = async (activities: ActivityPayload[], profileId: string | undefined, src: ServiceCallSource): Promise<void> => {\n this.checkPermission(AppPermissionKeys.activity.send, 'trackActivityForProfileIdBatch');\n\n await this.trackActivityBatch(activities.map(e => {\n return {\n activity: e,\n profile: profileId ? { seekaPId: profileId } : undefined\n }\n }), src);\n }\n\n public trackActivityForProfile = async (activity: ActivityPayload, profile: PersonIdentifiers, src: ServiceCallSource): Promise<void> => {\n this.checkPermission(AppPermissionKeys.activity.send, 'trackActivityForProfile');\n\n await this.trackActivityForProfileBatch([activity], profile, src);\n }\n\n public trackActivityForProfileBatch = async (activities: ActivityPayload[], profile: PersonIdentifiers, src: ServiceCallSource): Promise<void> => {\n this.checkPermission(AppPermissionKeys.activity.send, 'trackActivityForProfileBatch');\n\n await this.trackActivityBatch(activities.map(e => {\n return {\n activity: e,\n profile: profile\n }\n }), src);\n }\n}\n", "import * as crypto from 'crypto';\n\nimport type { Headers as UndiciHeaders } from 'undici';\n\nexport const webhookSignatureHeaderName = 'x-seeka-signature-sha256';\n\nexport const validateWebhookSignature = (secret: string, headers: UndiciHeaders | Headers | NodeJS.Dict<string | string[]>, requestBody: string): boolean => {\n if (!headers) return false;\n\n let signature: string | null = null;\n\n if (headers.get && typeof headers.get === 'function') {\n // undici and fetch\n signature = (headers as Headers).get(webhookSignatureHeaderName);\n }\n else {\n // express\n const signatures = (headers as NodeJS.Dict<string | string[]>)[webhookSignatureHeaderName];\n if (signatures) {\n if (Array.isArray(signatures) && signatures.length > 0) {\n signature = signatures[0]\n }\n else if (typeof signatures === 'string' || signatures instanceof String) {\n signature = signatures as string;\n }\n }\n }\n if (!signature) return false;\n\n // Check hash\n const hash = getHmacSignature(secret, requestBody);\n const valid = hash === signature;\n\n if (!valid) {\n console.warn(\"Invalid webhook signature\")\n }\n\n return valid;\n}\n\nexport const getHmacSignature = (secret: string, requestBody: string): string => {\n return crypto.createHmac('sha256', secret)\n .update(requestBody)\n .digest('hex');\n}\n\nexport const throwOnInvalidWebhookSignature = (secret: string, headers: UndiciHeaders | Headers | NodeJS.Dict<string | string[]>, requestBody: string): void => {\n if (!validateWebhookSignature(secret, headers, requestBody)) throw new Error('Invalid webhook signature');\n} ", "import crypto from 'crypto';\n\nconst algorithm = \"aes-192-cbc\";\n\nexport const encryptText = (plainText: string, secret: string): string => {\n if (!plainText) return '';\n if (!secret) throw new Error('Secret is required to encrypt data');\n\n const key = crypto.scryptSync(secret, \"salt\", 24);\n const iv = crypto.randomBytes(16);\n const cipher = crypto.createCipheriv(algorithm, key, iv);\n const encrypted = cipher.update(plainText, \"utf8\", \"hex\");\n return [\n encrypted + cipher.final(\"hex\"),\n Buffer.from(iv).toString(\"hex\"),\n ].join(\"|\");\n}\n\nexport const decryptText = (encryptedText: string, secret: string): string => {\n if (!encryptedText) return '';\n if (!secret) throw new Error('Secret is required to decrypt data');\n\n const [encrypted, iv] = encryptedText.split(\"|\");\n if (!iv) throw new Error(\"IV not found\");\n const key = crypto.scryptSync(secret, \"salt\", 24);\n\n const decipher = crypto.createDecipheriv(\n algorithm,\n key,\n Buffer.from(iv, \"hex\")\n );\n\n return decipher.update(encrypted, \"hex\", \"utf8\") + decipher.final(\"utf8\");\n}", "import { decryptText, encryptText } from \"../util/crypto\";\n\nexport class SeekaAppCryptoHelper {\n constructor(appSecret: string) {\n this.appSecret = appSecret;\n }\n\n private readonly appSecret: string;\n\n /** Encrypts a string with your app secret. CAUTION: If your app secret is regenerated the encrypted data will not be readable */\n public encryptWithAppSecret = (value: string): string => {\n if (!this.appSecret) throw new Error('App secret is required to encrypt data');\n\n return encryptText(value, this.appSecret);\n }\n\n /** Decrypts a string with your app secret. CAUTION: If your encrypted data is encrypted with a previous app secret, this method will fail */\n public decryptWithAppSecret = (value: string): string => {\n if (!this.appSecret) throw new Error('App secret is required to decrypt data');\n\n return decryptText(value, this.appSecret);\n }\n}", "import { Logger } from 'winston';\n\nimport { SeekaApiHelper } from '../../api/helper';\nimport { getAppConfig } from '../../api/helper/config';\nimport { SeekaAppConfig } from '../../api/services';\nimport { SeekaAppCacheManager } from '../../cache/appCacheManager';\nimport { SeekaAppCryptoHelper } from '../crypto';\n\nexport interface SeekaAppHelperContext {\n config: SeekaAppConfig;\n}\n\nexport class SeekaAppHelper {\n constructor(context: SeekaAppHelperContext, logger?: Logger) {\n this.context = context;\n this.api = new SeekaApiHelper(context.config);\n this.appCache = new SeekaAppCacheManager(context.config.appId);\n this.appInstallCache = new SeekaAppCacheManager(context.config.appId, context.config.applicationInstallId);\n this.crypto = new SeekaAppCryptoHelper(context.config.appSecret);\n this.logger = logger;\n }\n\n private readonly context;\n public appCache: SeekaAppCacheManager;\n public appInstallCache: SeekaAppCacheManager;\n public api: SeekaApiHelper;\n public logger?: Logger;\n public crypto: SeekaAppCryptoHelper;\n\n public static create = (appSecret: string, context: { applicationId: string, organisationId: string, applicationInstallId: string }, client: { name: string, version: string }, grantedPermissions: string[], logger?: Logger): SeekaAppHelper => {\n return new SeekaAppHelper({\n config: getAppConfig({\n ...context\n }, appSecret, {\n type: client.name,\n ver: client.version.split('-')[0],\n }, grantedPermissions, logger)\n }, logger)\n }\n}", "import winston, { Logger } from 'winston';\nimport { ActivityPipelineActivityFilter, ActivityPipelineActivityFilterSourceItemType, ActivityPipelineActivityFilterType, ConditionComparer, SeekaActivityAcceptedWebhookContent, TrackingActivityNames } from '../../../api/services';\n\nconst purchaseMadeActivities = [TrackingActivityNames.Order, TrackingActivityNames.SubscriptionItemPurchase, TrackingActivityNames.OneTimeItemPurchase];\nexport const matchActivityPipelineFilters = (content: SeekaActivityAcceptedWebhookContent, filters: ActivityPipelineActivityFilter[], logger: Logger): ActivityPipelineActivityFilter[] => {\n if (!content.activity) return [];\n const activity = content.activity;\n const activityName = activity.activityName === TrackingActivityNames.Custom ? activity.activityNameCustom : activity.activityName as string;\n if (!activityName) return [];\n\n const activityNameLower = activityName.toLowerCase();\n\n const matchedFilters: ActivityPipelineActivityFilter[] = [];\n filters.forEach((filter) => {\n if (!filter) return;\n\n // Match activity\n switch (filter.type) {\n case ActivityPipelineActivityFilterType.ActivityTracked:\n {\n if (!filter.activityNames) return;\n\n const matchedActivity = filter.activityNames.find(e => e.toLowerCase() === activityNameLower);\n if (!matchedActivity) return;\n logger.verbose('Matched activity tracked filter', { filter, activityName });\n break;\n }\n case ActivityPipelineActivityFilterType.PurchaseMade:\n {\n if (!activity.activityName || !purchaseMadeActivities.includes(activity.activityName)) return;\n logger.verbose('Matched purchase made activity filter', { filter, activityName });\n break;\n }\n default:\n {\n logger.warn('Unknown activity filter type', { filter });\n return;\n }\n }\n\n // Match source\n const sourceFilters = filter.sourceFilter;\n if (!sourceFilters) return;\n const activitySource = content.source;\n\n let activityHostname: string | null;\n try {\n activityHostname = activitySource?.loc ? new URL(activitySource.loc).hostname.toLowerCase() : null;\n }\n catch (err) {\n logger.error('Failed to parse activity source URL', { ex: winston.exceptions.getAllInfo(err as any), activitySource });\n activityHostname = null;\n }\n\n const activityPipeline = activitySource?.pipeline;\n const sourceConvergePipelineIntegrationInstanceId = activityPipeline?.convergePipelineIntegrationInstanceId?.toLowerCase();\n const matchedSourceFilters = !sourceFilters.filters ? [] : sourceFilters.filters.map(sourceFilter => {\n switch (sourceFilter.type) {\n case ActivityPipelineActivityFilterSourceItemType.Wildcard:\n {\n logger.verbose('Matched wildcard source filter', { sourceFilter });\n return true;\n }\n case ActivityPipelineActivityFilterSourceItemType.Domain:\n {\n if (!activityHostname || !sourceFilter.key) return false;\n if (activityHostname === sourceFilter.key.toLowerCase()) {\n logger.verbose('Matched domain source filter', { sourceFilter, activityHostname });\n return true\n }\n return false;\n }\n case ActivityPipelineActivityFilterSourceItemType.Pipeline:\n {\n if (!sourceConvergePipelineIntegrationInstanceId || !sourceFilter.key) return false;\n if (sourceConvergePipelineIntegrationInstanceId === sourceFilter.key.toLowerCase()) {\n logger.verbose('Matched pipeline source filter', { sourceFilter, sourceConvergePipelineIntegrationInstanceId });\n return true\n }\n return false;\n }\n }\n })\n switch (sourceFilters.comparer) {\n case ConditionComparer.And: {\n if (matchedSourceFilters.every(e => e === true)) {\n matchedFilters.push(filter);\n }\n break;\n }\n case ConditionComparer.Or: {\n if (matchedSourceFilters.some(e => e === true)) {\n matchedFilters.push(filter);\n }\n break;\n }\n default: {\n logger.warn('Unknown source filter comparer', { sourceFilters });\n break;\n }\n }\n })\n\n return matchedFilters;\n}\n", "const SeekaProfileIdSegmentSeparator = '.';\nconst SeekaProfileIdPrefix = 'sk';\nconst SeekaProfileIdVersionPrefix = '1';\n\nexport function isValidSeekaProfileId(profileId: string | null | undefined): boolean {\n if (!profileId || profileId.trim().length === 0) return false;\n\n const parts = profileId.split(SeekaProfileIdSegmentSeparator).filter(part => part.trim().length > 0);\n if (parts.length !== 4) return false;\n\n if (parts[0].toLowerCase() !== SeekaProfileIdPrefix.toLowerCase()) return false;\n if (parts[1].toLowerCase() !== SeekaProfileIdVersionPrefix.toLowerCase()) return false;\n\n if (isNaN(parseInt(parts[2], 10))) return false;\n if (isNaN(parseInt(parts[3], 10))) return false;\n\n return true;\n}\n", "\n// Mirrors converge\\src\\sdk\\privacy\\models\\index.ts\nimport {IabPrivacyConsentPurposeId} from \"../../services\";\n\nexport const IabPrivacyConsentPurposeIdMap: { [key: string]: number } = {\n [IabPrivacyConsentPurposeId.MeasureAdvertisingPerformance]: 7\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["index_exports", "__export", "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", "decryptText", "encryptText", "getActivityName", "getIssuer", "getNewAppInstallToken", "getNewOrCachedAppInstallToken", "isValidSeekaProfileId", "matchActivityPipelineFilters", "separatePersonFullName", "throwOnInvalidWebhookSignature", "urls", "validateWebhookSignature", "webhookSignatureHeaderName", "__toCommonJS", "version", "import_axios", "SeekaAppConfig", "ApiServiceProxyBase", "config", "options", "url", "response", "processor", "IdentityServiceProxy", "configuration", "baseUrl", "instance", "axios", "payload", "cancelToken", "url_", "options_", "transformedOptions_", "_error", "isAxiosError", "_response", "status", "_headers", "k", "_responseText", "result200", "result401", "throwException", "result422", "result400", "IngestServiceProxy", "ResponseResultType", "PrivacyConsentType", "TrackingEventSourceOriginType", "TrackingActivityNames", "ECommerceContentType", "ECommercePlatform", "ECommerceFulfillmentStatus", "ECommerceFinancialStatus", "ConvergePipelineLoggableActivityType", "SdkLogEventLevel", "SeekaWebhookCallType", "ClickAttributionSourcePlatform", "ActivityPipelineActivityFilterType", "ConditionComparer", "ActivityPipelineActivityFilterSourceItemType", "ConditionOperator", "AnalyticsLibrary", "ContentIdentificationBehavior", "ConvergeVendorDestinationPublishStrategy", "CrossDomainTrackingUtmBehavior", "RegionalConsentGrantOption", "IabPrivacyConsentPurposeId", "ConsentMappingMatchType", "PrivacyDataControlMode", "ApiException", "message", "headers", "result", "obj", "import_openid_client", "import_winston", "import_memory_cache", "prefix", "SeekaAppCacheManager", "appId", "appInstallationId", "key", "value", "expiryAbsoluteMilliseconds", "cacheKey", "memoryCache", "getValueAndExpiryFunc", "onGetFromCache", "existing", "cached", "newVal", "crypto", "generateNewSessionId", "dateReference", "dateToUtcDateTimeReferenceString", "random", "getRandomNumberString", "getActivityName", "event", "vals", "TrackingActivityNames", "evLower", "matched", "e", "forDateTime", "month", "day", "hour", "minute", "second", "md5Hash", "input", "separatePersonFullName", "fullname", "parts", "chunk", "array", "size", "resultArray", "item", "index", "chunkIndex", "getIssuer", "config", "logParams", "cache", "SeekaAppCacheManager", "cacheKey", "md5Hash", "meta", "seekaIssuer", "discoverIssuerMetadata", "err", "winston", "clientId", "getNewClientToken", "issuer", "token", "successLogParams", "errorLogParams", "getNewAppInstallToken", "clientAccessToken", "getNewOrCachedAppInstallToken", "appInstallCache", "clientToken", "appToken", "defaultIngestUrl", "defaultTelemetryUrl", "defaultIssuerUrl", "getAppConfig", "context", "appSecret", "client", "grantedPermissions", "logger", "config", "SeekaAppConfig", "version", "options", "transformApiRequest", "url", "response", "processor", "transformApiResponse", "permissionKeys", "key", "permissionKey", "token", "getNewOrCachedAppInstallToken", "AppPermissionKeys", "import_axios", "import_http", "import_https", "httpAgent", "http", "httpsAgent", "https", "createAxiosInstance", "config", "instance", "axios", "reqConfig", "logParams", "error", "response", "code", "status", "message", "headers", "url", "method", "errorLogParams", "serviceResolver", "IdentityServiceProxy", "IngestServiceProxy", "SeekaApiHelper", "config", "serviceResolver", "getNewOrCachedAppInstallToken", "permissionKey", "opName", "identity", "src", "AppPermissionKeys", "sessionId", "generateNewSessionId", "batch", "sourceMetadata", "chunks", "chunk", "profile", "promises", "index", "item", "data", "activity", "profileId", "activities", "e", "crypto", "webhookSignatureHeaderName", "validateWebhookSignature", "secret", "headers", "requestBody", "signature", "signatures", "valid", "getHmacSignature", "throwOnInvalidWebhookSignature", "import_crypto", "algorithm", "encryptText", "plainText", "secret", "key", "crypto", "iv", "cipher", "decryptText", "encryptedText", "encrypted", "decipher", "SeekaAppCryptoHelper", "appSecret", "value", "encryptText", "decryptText", "SeekaAppHelper", "_SeekaAppHelper", "context", "logger", "SeekaApiHelper", "SeekaAppCacheManager", "SeekaAppCryptoHelper", "appSecret", "client", "grantedPermissions", "getAppConfig", "import_winston", "purchaseMadeActivities", "matchActivityPipelineFilters", "content", "filters", "logger", "activity", "activityName", "activityNameLower", "matchedFilters", "filter", "e", "sourceFilters", "activitySource", "activityHostname", "err", "winston", "sourceConvergePipelineIntegrationInstanceId", "matchedSourceFilters", "sourceFilter", "isValidSeekaProfileId", "profileId", "parts", "part", "IabPrivacyConsentPurposeIdMap", "urls", "defaultIssuerUrl", "defaultTelemetryUrl", "defaultIngestUrl"]
7
7
  }