summaryrefslogtreecommitdiff
path: root/node_modules/@jet-app/app-store/tmp/src/common/personalization/on-device-impression-demotion.js
diff options
context:
space:
mode:
authorrxliuli <rxliuli@gmail.com>2025-11-04 05:03:50 +0800
committerrxliuli <rxliuli@gmail.com>2025-11-04 05:03:50 +0800
commitbce557cc2dc767628bed6aac87301a1be7c5431b (patch)
treeb51a051228d01fe3306cd7626d4a96768aadb944 /node_modules/@jet-app/app-store/tmp/src/common/personalization/on-device-impression-demotion.js
init commit
Diffstat (limited to 'node_modules/@jet-app/app-store/tmp/src/common/personalization/on-device-impression-demotion.js')
-rw-r--r--node_modules/@jet-app/app-store/tmp/src/common/personalization/on-device-impression-demotion.js73
1 files changed, 73 insertions, 0 deletions
diff --git a/node_modules/@jet-app/app-store/tmp/src/common/personalization/on-device-impression-demotion.js b/node_modules/@jet-app/app-store/tmp/src/common/personalization/on-device-impression-demotion.js
new file mode 100644
index 0000000..f2430e9
--- /dev/null
+++ b/node_modules/@jet-app/app-store/tmp/src/common/personalization/on-device-impression-demotion.js
@@ -0,0 +1,73 @@
+import * as serverData from "../../foundation/json-parsing/server-data";
+import { demoteByEngagements } from "@amp/amd-apps";
+// The AMD key used to retrieve the engagement events from the app store.
+export const AMSEngagementAppStoreEventKey = "appStore.getEngagementEvents";
+/**
+ * personalize the dataItems based on the impression data for that shelf.
+ *
+ * @param objectGraph The object graph.
+ * @param dataItems The data items to personalize.
+ * @param impressionData The impression data to use for personalization.
+ * @returns The personalized data items.
+ */
+export function personalizeDataItems(dataItems, impressionData, shelfRecoMetricsData) {
+ const shelfAlgoId = shelfRecoMetricsData["reco_algoId"];
+ if (serverData.isNullOrEmpty(shelfAlgoId) ||
+ serverData.isNullOrEmpty(dataItems) ||
+ serverData.isNullOrEmpty(impressionData[shelfAlgoId])) {
+ return dataItems;
+ }
+ // First create Candidate objects from the data items.
+ const candidates = dataItems.map((dataItem) => {
+ var _a;
+ const adamId = serverData.asNumber(dataItem.id);
+ const score = (_a = serverData.asNumber(dataItem, "meta.personalizationData.score")) !== null && _a !== void 0 ? _a : 0;
+ const candidate = { identifier: adamId, score: score };
+ return candidate;
+ });
+ // Demote the candidates based on the impression data.
+ const shelfRecoData = impressionData[shelfAlgoId];
+ const rerankedCandidates = demoteByEngagements(candidates, shelfRecoData);
+ // Create a lookup map from dataItems to allow faster rearranging
+ const dictionary = dataItems.reduce((acc, item) => ({ ...acc, [item.id]: item }), {});
+ // create a new array based on the rearranged Candidate array
+ const rearranged = rerankedCandidates.map((candidate) => dictionary[candidate.identifier.toString()]);
+ return rearranged;
+}
+/**
+ * Takes the AMD response and creates a map of EngagementEvent per shelf.
+ *
+ * @param objectGraph The object graph.
+ * @param data The data to convert.
+ * @returns The map of EngagementEvent per shelf.
+ */
+export function impressionEventsFromData(objectGraph, data) {
+ // go through all the impressionData and return the EgagementData
+ if (!serverData.isDefinedNonNullNonEmpty(data)) {
+ return {};
+ }
+ // Impression data is a map of shelf ids to impression arrays.
+ // We want to keep this relationship so only impressions for a given shelf are returned.
+ const impressionData = serverData.asDictionary(data, "data.engagementEvents.impression");
+ const convertedMap = {};
+ // Iterate over each key in the original map and convert the data into EngagementEvents which can be passed to the demoteByEngagements function.
+ for (const key in impressionData) {
+ if (serverData.isDefinedNonNullNonEmpty(key)) {
+ const impressions = serverData.asArrayOrEmpty(impressionData, key);
+ convertedMap[key] = impressions.map((impression) => {
+ const adamId = serverData.asNumber(impression["adamId"]);
+ const timestamp = serverData.asNumber(impression["eventTimeMillis"]);
+ const event = { adamIdentifier: adamId, timestamp: timestamp };
+ return event;
+ });
+ }
+ }
+ return convertedMap;
+}
+/**
+ * Convenience function for determining if data personalization is available.
+ */
+export function isImpressionDemotionAvailable(objectGraph) {
+ return objectGraph.client.isiOS && objectGraph.bag.enableRecoOnDeviceReordering;
+}
+//# sourceMappingURL=on-device-impression-demotion.js.map \ No newline at end of file