function getReceiptInfo()

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`,
        );
      }
    }
  }