in typescript/src/services/appleValidateReceipts.ts [182:225]
function getReceiptInfo(): AppleValidatedReceiptServerInfo[] {
if (response.latest_receipt_info) {
if (Array.isArray(response.latest_receipt_info)) {
const latestReceipt = response.latest_receipt_info;
if (latestReceipt.length == 0) {
console.error(
`Invalid validation response, empty receipt info array`,
);
throw new ProcessingError(
`Invalid validation response, empty receipt info array`,
);
}
// only keep receipts that have an expiry date, those who don't aren't subscriptions or are pre 2011
const filteredLatestReceipt = latestReceipt.filter(
(receipt) => receipt.expires_date || receipt.expires_date_ms,
);
const deDupedReceipts = filteredLatestReceipt
.sort((r1, r2) => expiryDate(r1) - expiryDate(r2)) // most recent last
.reduce(
(acc: Record<string, AppleValidatedReceiptServerInfo>, current) => {
acc[current.original_transaction_id] = current;
return acc;
},
{},
);
return Object.values(deDupedReceipts);
} else {
return [response.latest_receipt_info];
}
} else {
if (response.latest_expired_receipt_info) {
return [response.latest_expired_receipt_info];
} else {
// should be impossible as this will be caught by checkResponseStatus
console.error(`No receipt info`);
throw new ProcessingError(
`Invalid validation response, no receipt info`,
);
}
}
}