{"version":3,"file":"messageProcessingHelpers.mjs","sources":["../../../../../../src/inAppMessaging/providers/pinpoint/utils/messageProcessingHelpers.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { ConsoleLogger, defaultStorage } from '@aws-amplify/core';\nimport { extractContent, extractMetadata, interpretLayout, isBeforeEndDate, matchesAttributes, matchesEventType, matchesMetrics, } from './helpers';\nconst MESSAGE_DAILY_COUNT_KEY = 'pinpointProvider_inAppMessages_dailyCount';\nconst MESSAGE_TOTAL_COUNT_KEY = 'pinpointProvider_inAppMessages_totalCount';\nconst logger = new ConsoleLogger('InAppMessaging.processInAppMessages');\nlet sessionMessageCountMap = {};\nexport async function processInAppMessages(messages, event) {\n    let highestPrioritySeen;\n    let acc = [];\n    for (const message of messages) {\n        const messageQualifies = matchesEventType(message, event) &&\n            matchesAttributes(message, event) &&\n            matchesMetrics(message, event) &&\n            isBeforeEndDate(message) &&\n            (await isBelowCap(message));\n        // filter all qualifying messages returning only those that are of (relative) highest priority\n        if (messageQualifies) {\n            // have not yet encountered message with priority\n            if (!highestPrioritySeen) {\n                // this message has priority, so reset the accumulator with this message only\n                if (message.Priority) {\n                    highestPrioritySeen = message.Priority;\n                    acc = [message];\n                }\n                else {\n                    // this message also has no priority, so just add this message to accumulator\n                    acc.push(message);\n                }\n                // have previously encountered message with priority, so only messages with priority matter now\n            }\n            else if (message.Priority) {\n                // this message has higher priority (lower number), so reset the accumulator with this message only\n                if (message.Priority < highestPrioritySeen) {\n                    highestPrioritySeen = message.Priority;\n                    acc = [message];\n                    // this message has the same priority, so just add this message to accumulator\n                }\n                else if (message.Priority === highestPrioritySeen) {\n                    acc.push(message);\n                }\n            }\n        }\n    }\n    return normalizeMessages(acc);\n}\nexport function sessionStateChangeHandler(state) {\n    if (state === 'started') {\n        // reset all session counts\n        sessionMessageCountMap = {};\n    }\n}\nexport async function incrementMessageCounts(messageId) {\n    const { sessionCount, dailyCount, totalCount } = await getMessageCounts(messageId);\n    setSessionCount(messageId, sessionCount + 1);\n    setDailyCount(dailyCount + 1);\n    await setTotalCount(messageId, totalCount + 1);\n}\nfunction normalizeMessages(messages) {\n    return messages.map(message => {\n        const { CampaignId, InAppMessage: pinpointInAppMessage } = message;\n        return {\n            // Default to empty string in rare cases we don't have a campaignId\n            id: CampaignId ?? '',\n            content: extractContent(message),\n            // Default to TOP_BANNER layout in rare cases we don't have a Layout\n            layout: pinpointInAppMessage?.Layout\n                ? interpretLayout(pinpointInAppMessage.Layout)\n                : 'TOP_BANNER',\n            metadata: extractMetadata(message),\n        };\n    });\n}\nasync function isBelowCap({ CampaignId, SessionCap, DailyCap, TotalCap, }) {\n    const { sessionCount, dailyCount, totalCount } = await getMessageCounts(CampaignId);\n    return ((!SessionCap || sessionCount < SessionCap) &&\n        (!DailyCap || dailyCount < DailyCap) &&\n        (!TotalCap || totalCount < TotalCap));\n}\nasync function getMessageCounts(messageId) {\n    let messageCounts = {\n        sessionCount: 0,\n        dailyCount: 0,\n        totalCount: 0,\n    };\n    try {\n        // only return true counts if there is a messageId else default to 0\n        if (messageId)\n            messageCounts = {\n                sessionCount: getSessionCount(messageId),\n                dailyCount: await getDailyCount(),\n                totalCount: await getTotalCount(messageId),\n            };\n        return messageCounts;\n    }\n    catch (err) {\n        logger.error('Failed to get message counts from storage', err);\n        // If there are no cached counts or there is an error,\n        // we default to 0 allowing all the messages to be eligible\n        return messageCounts;\n    }\n}\nfunction getSessionCount(messageId) {\n    return sessionMessageCountMap[messageId] ?? 0;\n}\nfunction setSessionCount(messageId, count) {\n    sessionMessageCountMap[messageId] = count;\n}\nfunction setDailyCount(count) {\n    const dailyCount = {\n        count,\n        lastCountTimestamp: getStartOfDay(),\n    };\n    try {\n        defaultStorage.setItem(MESSAGE_DAILY_COUNT_KEY, JSON.stringify(dailyCount));\n    }\n    catch (err) {\n        logger.error('Failed to save daily message count to storage', err);\n    }\n}\nfunction setTotalCountMap(countMap) {\n    try {\n        defaultStorage.setItem(MESSAGE_TOTAL_COUNT_KEY, JSON.stringify(countMap));\n    }\n    catch (err) {\n        logger.error('Failed to save total count to storage', err);\n    }\n}\nasync function setTotalCount(messageId, count) {\n    const totalCountMap = await getTotalCountMap();\n    const updatedMap = {\n        ...totalCountMap,\n        [messageId]: count,\n    };\n    setTotalCountMap(updatedMap);\n}\nasync function getDailyCount() {\n    const today = getStartOfDay();\n    const item = await defaultStorage.getItem(MESSAGE_DAILY_COUNT_KEY);\n    // Parse stored count or initialize as empty count\n    const counter = item\n        ? JSON.parse(item)\n        : { count: 0, lastCountTimestamp: today };\n    // If the stored counter timestamp is today, use it as the count, otherwise reset to 0\n    return counter.lastCountTimestamp === today ? counter.count : 0;\n}\nasync function getTotalCountMap() {\n    const item = await defaultStorage.getItem(MESSAGE_TOTAL_COUNT_KEY);\n    // Parse stored count map or initialize as empty\n    return item ? JSON.parse(item) : {};\n}\nasync function getTotalCount(messageId) {\n    const countMap = await getTotalCountMap();\n    // Return stored count or initialize as empty count\n    return countMap[messageId] || 0;\n}\nconst getStartOfDay = () => {\n    const now = new Date();\n    now.setHours(0, 0, 0, 0);\n    return now.toISOString();\n};\n"],"names":[],"mappings":"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"}