{"version":3,"file":"3192.75224d3e2c78dafd.js","mappings":"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","names":["SubscriptionLabelComponent","_SubscriptionLabelComponent","constructor","store","this","subscriptionLabelTranslateKey$","select","selectSubscriptionLevelLabelTranslateKey","i0","i1","selectors","standalone","features","decls","vars","template","rf","ctx","AsyncPipe","TranslatePipe","SubscriptionDetailComponent_div_0_div_19_ng_template_1_Template","SubscriptionDetailComponent_div_0_div_19_p_3_Template","_r4","subscription_r2","ngIf","ctx_r2","editSubscription","proSubId","eventsSubIds","length","noEventsProTpl_r5","SubscriptionDetailComponent_div_0_ng_template_20_p_0_Template","SubscriptionDetailComponent_div_0_ng_template_20_ng_template_1_Template","_r6","subscribe","noEventTpl_r7","_c0","routeProjectDetail","project_r8","id","title","tmp_12_0","undefined","subscription","cf_project_name","expires","renews","eventDate","_r9","$implicit","editEventSubscription","SubscriptionDetailComponent_div_0_div_27_div_1_ion_item_5_ion_button_2_Template","SubscriptionDetailComponent_div_0_div_27_div_1_ion_item_5_ng_template_3_Template","SubscriptionDetailComponent_div_0_div_27_div_1_ion_item_5_div_12_Template","SubscriptionDetailComponent_div_0_div_27_div_1_ion_item_5_div_13_Template","SubscriptionDetailComponent_div_0_div_27_div_1_ion_item_5_div_14_Template","SubscriptionDetailComponent_div_0_div_27_div_1_ion_item_5_ion_button_17_Template","SubscriptionDetailComponent_div_0_div_27_div_1_ion_item_5_ng_template_18_Template","noId_r10","tmp_13_0","subLevel","subscriptionLevel","eventConfig","canEdit","subscriptionId","includes","noEditTpl_r11","SubscriptionDetailComponent_div_0_div_27_div_1_ion_item_5_Template","eventProjects_r12","SubscriptionDetailComponent_div_0_div_27_div_1_Template","_r13","addMinutes","minutes$","_r14","openBillingInfo","openPaymentMethods","openPurchaseHistory","SubscriptionDetailComponent_div_0_ng_container_28_ion_item_1_Template","SubscriptionDetailComponent_div_0_ng_container_28_ng_container_2_Template","minutesEnabled","isActive","_r1","subscriptionActionClick","SubscriptionDetailComponent_div_0_div_19_Template","SubscriptionDetailComponent_div_0_ng_template_20_Template","SubscriptionDetailComponent_div_0_div_27_Template","SubscriptionDetailComponent_div_0_ng_container_28_Template","name","notActiveDetail_r15","myEventProjectsVm","SubscriptionDetailComponent","_SubscriptionDetailComponent","userService","projectService","billingService","modalCtrl","navCtrl","subscriptionSignalVm","selectSignal","selectSubscriptionStatus","myEventProjectsSignal","selectEventSubscriptionProjects","userIdSignal","toSignal","userId$","computed","userId","filter","p","map","project","level","getEventSubscriptionDetail","isProjectAdmin","eventIsActive","isSubscriptionActive","selectMinutes","isPro$","selectIsPro","ENABLE_BILLING_MINUTES","PROJECT_DETAIL_ROUTE","_this","_asyncToGenerator","console","log","event","navigateForward","SIGNUP_RETURN_URL_PRO","_this2","openEditSubscription","_this3","modal","create","component","PlansModalComponent","componentProps","cssClass","present","data","onWillDismiss","openCheckout","warn","viewPlans","error","i2","i3","i4","i5","consts","SubscriptionDetailComponent_div_0_Template","NgIf","NgFor","RouterLink","UpperCasePipe","DatePipe","ButtonComponent","IonList","IonItem","IonLabel","IonNote","IonButton","IonIcon","IonGrid","IonRow","IonCol","styles","StudioArchiveModal","_StudioArchiveModal","dismiss","dismissed","navHelp","HELP_ROUTE","archive","inputs","NATIVE_APP_STORE_KEY_WEDDING","NATIVE_APP_STORE_KEY_PRO_ANNUALLY","NATIVE_APP_STORE_KEY_PRO_MONTHLY","NativeAppStoreService","_NativeAppStoreService","alertController","plt","products","signal","enabled","isPro","hasWedding","hasEvent","errorMessage","cdvPlatform","CdvPurchase","Platform","TEST","changeDetectionEmitter","EventEmitter","ready","then","Capacitor","isNativePlatform","verbosity","LogLevel","DEBUG","getPlatform","APPLE_APPSTORE","GOOGLE_PLAY","registerProducts","setupListeners","initialize","platform","options","needAppReceipt","set","getProductState","product","_a","findInLocalReceipts","state","TransactionState","UNKNOWN_STATE","productId","get","Error","getOffer","order","code","ErrorCode","PAYMENT_CANCELLED","hasActiveSubscription","owned","restore","restorePurchases","presentAlert","header","message","buttons","register","type","ProductType","NON_RENEWING_SUBSCRIPTION","PAID_SUBSCRIPTION","emit","when","productUpdated","refreshUI","approved","finishPurchase","verified","receipt","finish","transaction","find","verify","factory","ɵfac","providedIn","p_r3","_r2","ctx_r3","purchase","description","pricing","price","currency","NativeAppStoreComponent_div_0_ion_item_11_Template","NativeAppStoreComponent","_NativeAppStoreComponent","appStoreService","cdRef","detectChanges","err","NativeAppStoreComponent_div_0_Template","ctx_r1","cancel","EditStudioPage_ion_grid_2_ion_row_13_Template","isBusy","usernameMinLength","usernameMaxLength","usernamePatternDesc","EditStudioPage_ion_grid_7_div_21_div_1_Template","EditStudioPage_ion_grid_7_div_21_div_2_Template","EditStudioPage_ion_grid_7_div_21_div_3_Template","profileForm","errors","minlength","maxlength","pattern","email_r5","changePassword","EditStudioPage_ion_grid_7_ion_col_7_Template","_r3","save","EditStudioPage_ion_grid_7_div_21_Template","EditStudioPage_ion_grid_7_fs_button_37_Template","avatarUrl$","enableBilling","loading","invalid","dirty","touched","email$","EditStudioPage","_EditStudioPage","formBuilder","toaster","router","translate","ENABLE_BILLING","group","handle","Validators","compose","minLength","maxLength","bio","location","value","disabled","required","email","onDestroy$","Subject","ngOnInit","addIcons","imagesOutline","icons","dFz","archiveOutline","loggedIn$","isLoggedIn$","pipe","take","res","obs","field","username$","bio$","location$","forEach","takeUntil","val","updateProp","ngAfterViewInit","showTutorial","getCurrentNavigation","extras","tutorial","ngOnDestroy","next","complete","valid","controls","didSave","setUsername","replace","trim","setBio","setLocation","navigateBack","STUDIO_PAGE","key","patchValue","m","getErrorMessage","Object","keys","instant","Boolean","onDidDismiss","changeEmail","FORGOT_PASS_PAGE","i6","EditStudioPage_ion_grid_2_Template","EditStudioPage_ng_template_5_Template","EditStudioPage_ion_grid_7_Template","notAuthed_r6","FormsModule","ReactiveFormsModule","FormControlCastPipe","FormInputComponent","FormTextareaComponent","TopNavbarComponent","EditableAvatarComponent","IonHeader","IonContent","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","step","e","rejected","throw","result","done","adopt","apply","initCDVPurchase","oldStore","window","Store","assign","SETUP","ERROR_CODES_BASE","LOAD","PURCHASE","LOAD_RECEIPTS","CLIENT_INVALID","PAYMENT_INVALID","PAYMENT_NOT_ALLOWED","UNKNOWN","REFRESH_RECEIPTS","INVALID_PRODUCT_ID","FINISH","COMMUNICATION","SUBSCRIPTIONS_NOT_AVAILABLE","MISSING_TOKEN","VERIFICATION_FAILED","BAD_RESPONSE","REFRESH","PAYMENT_EXPIRED","DOWNLOAD","SUBSCRIPTION_UPDATE_NOT_AVAILABLE","PRODUCT_NOT_AVAILABLE","CLOUD_SERVICE_PERMISSION_DENIED","CLOUD_SERVICE_NETWORK_CONNECTION_FAILED","CLOUD_SERVICE_REVOKED","PRIVACY_ACKNOWLEDGEMENT_REQUIRED","UNAUTHORIZED_REQUEST_DATA","INVALID_OFFER_IDENTIFIER","INVALID_OFFER_PRICE","INVALID_SIGNATURE","MISSING_OFFER_PARAMS","VALIDATOR_SUBSCRIPTION_EXPIRED","storeError","isError","Iaptic","config","url","child","braintreeClientTokenProvider","callback","info","Utils","ajax","appName","apiKey","method","applicationUsername","getApplicationUsername","customerId","Braintree","success","body","JSON","stringify","clientToken","BRAINTREE","appStoreDiscountEligibilityDeterminer","latestReceipt","debug","determiner","_appStoreReceipt","requests","analyzeReceipt","onVerified","off","cacheReceipt","ineligibleIntro","raw","ineligible_for_intro_price","request","discountType","collection","validator","QUIET","ERROR","WARNING","INFO","Logger","prefix","o","toString","stack","logCallbackException","context","fileName","lineNumber","LOG_LEVEL_STRING","fullPrefix","str","nonEnumerable","target","desc","enumerable","defineProperty","writable","configurable","Product","decorator","className","offers","pricingPhases","canPurchase","addOffer","offer","push","objectValues","obj","ret","hasOwnProperty","platformName","WINDOWS_STORE","Internal","ReceiptsToValidate","array","concat","add","has","clear","pop","el","Validator","controller","receiptsToValidate","verifiedReceipts","numRequests","numResponses","cache","incrRequestsCounter","incrResponsesCounter","addVerifiedReceipt","vr","newVR","VerifiedReceipt","receiptOrTransaction","Transaction","parentReceipt","run","receipts","onResponse","r","payload","adapter","adapters","handleReceiptValidationResponse","ok","verifiedCallbacks","trigger","transactionId","lastTransaction","col","isExpired","unverifiedCallbacks","runOnReceipt","_b","Test","Adapter","transactions","latest_receipt","buildRequestBody","runValidatorFunction","runValidatorRequest","timeout","_c","receiptValidationBody","additionalData","device","getDeviceInfo","priceMicros","introPriceMicros","removeExpiredCache","now","Date","deleteList","hash","bodyTransactionHash","md5","cached","customHeaders","headers","response","isValidatorResponsePayload","status","fullMessage","Adapters","list","po","AppleAppStore","GooglePlay","platforms","newPlatforms","registeredProducts","byPlatform","all","platformToInit","platformProducts","isSupported","initResult","loadProductsResult","loadReceiptsResult","supportsParallelLoading","loadProducts","loadReceipts","loadedProducts","listener","productsUpdated","lr","a","findReady","StoreAdapterListener","delegate","supportedPlatforms","platformWithReceiptsReady","lastTransactionState","lastCallTimeForState","updatedReceiptsToProcess","makeTransactionToken","setSupportedPlatforms","join","receiptsReadyCallbacks","receiptsReady","indexOf","updatedCallbacks","receiptsUpdated","updatedReceiptsProcessor","clearTimeout","setTimeout","_processUpdatedReceipts","updatedReceiptCallbacks","transactionToken","tokenWithState","lastState","APPROVED","lastCalled","approvedCallbacks","Math","round","INITIATED","initiatedCallbacks","FINISHED","finishedCallbacks","PENDING","pendingCallbacks","Callbacks","logger","finalStateMode","callbacks","numTriggers","callbackName","lastTriggerArgument","existing","reason","safeCall","remove","ReadyCallbacks","isReady","readyCallbacks","cb","RegisteredProducts","rp","newProducts","Array","isArray","TransactionStateMonitors","monitors","isListening","findMonitors","monitor","startListening","callOnChange","finished","lastChange","onChange","start","monitorId","uuidv4","stop","ReceiptsMonitor","hasCalledReceiptsVerified","callReceiptsVerified","receiptsVerified","launch","check","numValidationResponses","numValidationRequests","intervalChecker","clearInterval","unverified","hasLocalReceipts","hasValidator","setInterval","ExpiryMonitor","activePurchases","notifiedPurchases","interval","gracePeriod","GRACE_PERIOD_MS","DEFAULT","expiryDate","onVerifiedPurchaseExpired","INTERVAL_MS","PLUGIN_VERSION","_readyCallbacks","updatedReceiptsCallbacks","receiptsVerifiedCallbacks","errorCallbacks","initializedHasBeenCalled","lastUpdate","minTimeBetweenUpdates","version","transactionStateMonitors","_validator","bind","localReceipts","validator_privacy_policy","expiryMonitor","verifiedPurchase","sourceReceipt","getAdapter","Function","defaultPlatform","triggerError","apiDecorators","refresh","update","registration","receiptUpdated","updated","initiated","pending","safeCallback","localTransactions","verifiedPurchases","VerifiedReceipts","getVerifiedPurchases","findInVerifiedReceipts","LocalReceipts","Offer","checkSupport","requestPayment","paymentRequest","_d","_e","PaymentRequestPromise","failed","amountMicros","item","items","promise","functionality","Receipt","manageSubscriptions","manageBilling","platformId","cordova","RecurrenceMode","PaymentMode","RenewalIntent","PriceConsentStatus","CancelationReason","CONSUMABLE","NON_CONSUMABLE","FREE_SUBSCRIPTION","APPLICATION","NON_RECURRING","FINITE_RECURRING","INFINITE_RECURRING","PAY_AS_YOU_GO","UP_FRONT","FREE_TRIAL","CANCELLED","LAPSE","RENEW","NOTIFIED","AGREED","NOT_CANCELED","DEVELOPER","SYSTEM","SYSTEM_REPLACED","SYSTEM_PRODUCT_UNAVAILABLE","SYSTEM_BILLING_ERROR","SYSTEM_DELETED","CUSTOMER","CUSTOMER_TECHNICAL_ISSUES","CUSTOMER_PRICE_INCREASE","CUSTOMER_COST","CUSTOMER_FOUND_BETTER_APP","CUSTOMER_NOT_USEFUL_ENOUGH","CUSTOMER_OTHER_REASON","productType","productGroup","failedCallbacks","PromiseLike","cancelledCallback","cancelled","argument","hasTransaction","t","found","trProducts","purchaseDate","isOwned","isConsumed","isPending","expirationDate","getTime","resolved","resolvedArgument","Retry","minTimeout","maxTimeout","retryTimeout","retries","document","addEventListener","i","tid","fn","call","retry","indexed","lastRenewalDate","ApplePay","ContactField","PaymentNetwork","MerchantCapability","Name","EmailAddress","PhoneNumber","PostalAddress","PhoneticName","Amex","Barcode","CartesBancaires","ChinaUnionPay","Dankort","Discover","Eftpos","Electron","Elo","Girocard","IDCredit","Interac","JCB","Mada","Maestro","MasterCard","Mir","Nanaco","PrivateLabel","QuicPay","Suica","Visa","VPay","Waon","ThreeDS","EMV","Credit","Debit","virtualTransactionId","appStoreError","_canMakePayments","forceReceiptReload","_products","validProducts","_paymentMonitor","_appStoreReceiptLoading","_appStoreReceiptCallbacks","bridge","Bridge","discountEligibilityDeterminer","autoFinish","pseudoReceipt","createDebouncer","_receiptsUpdated","getProduct","_receipt","addValidProducts","vp","upsertTransactionInProgress","tr","SKTransaction","removeTransactionInProgress","upsertTransaction","initializeAppReceipt","removeTransaction","setPaymentMonitor","callPaymentMonitor","bridgeLogger","init","msg","purchased","transactionIdentifier","originalTransactionIdentifier","transactionDate","discountId","purchaseEnqueued","quantity","purchaseFailed","purchasing","deferred","wait","restored","receiptsRefreshed","restoreFailed","errorCode","onRestoreCompleted","restoreCompleted","canMakePayments","nativeData","loadAppStoreReceipt","callCallbacks","arg","appStoreReceipt","SKApplicationReceipt","prepareReceipt","catch","loadEligibility","DiscountEligibilities","eligibilityRequests","discounts","discount","introPrice","applicationReceipt","callDiscountEligibilityDeterminer","load","invalidProducts","eligibilities","v","SKProduct","callResolve","DEFAULT_OFFER_ID","appStore","APPLICATION_VIRTUAL_TRANSACTION_ID","refreshReceipt","refreshReceipts","skReceipt","slice","bundleIdentifier","isEligible","localReceiptUpdated","vTransaction","original_purchase_date_ms","parseInt","payment","presentCodeRedemptionSheet","Bridge_1","noop","args","exec","methodName","protectCall","transactionsForProduct","initialized","needRestoreNotification","pendingUpdates","onPurchased","onFailed","onRestored","storekit","setupOk","processPendingTransactions","finalizeTransactionUpdates","purchaseOk","errMsg","productIds","loadOk","loadFailed","errMessage","transactionUpdated","errorText","transactionReceipt","lastTransactionUpdated","restoreCompletedTransactionsFinished","restoreCompletedTransactionsFailed","parseReceiptArgs","base64","bundleShortVersion","bundleNumericVersion","bundleSignature","successCb","errorCb","req","SKOffer","super","offerType","validProduct","removeIneligibleDiscounts","countryCode","finalPhase","billingPeriod","formatBillingPeriod","billingPeriodUnit","paymentMode","recurrenceMode","numCycles","period","discountPhase","periodUnit","billingCycles","hasIntroductoryOffer","defaultPhases","introPricePeriod","introPricePeriodUnit","introPricePaymentMode","numPeriods","needApplicationReceipt","offerId","originalTransactionId","VerifyReceipt","AppleExpirationIntent","CANCELED","BILLING_ERROR","PRICE_INCREASE","BraintreeReceipt","dropInResult","paymentMethodNonce","nonce","paymentMethodType","paymentDescription","_receipts","IosBridge","AndroidBridge","iosBridge","tokenizationKey","clientTokenProvider","braintreeError","applePay","androidBridge","launchDropIn","dropInRequest","_f","_g","_h","_j","braintree","ApplePayPlugin","applePayDisabled","googlePay","googlePayRequest","transactionInfo","currencyCode","totalPrice","totalPriceStatus","GooglePay","TotalPriceStatus","FINAL","threeDSecure","threeDSecureRequest","threeDS","amount","asDecimalString","amountCents","billingAddress","givenName","surname","countryCodeAlpha2","postalCode","locality","streetAddress","streetAddress1","extendedAddress","streetAddress2","line3","streetAddress3","phoneNumber","region","dropInResponseIsOK","dropInResponseError","isBraintreeReceipt","deviceData","lCustomerId","customer","PLUGIN_ID","getClientToken","token","isApplePaySupported","errCode","split","CdvPurchaseBraintreeApplePay","installed","applePayOptions","continueDropInForApplePay","DropInRequest","preparePaymentRequest","merchantCapabilities","paymentSummaryItems","index","label","total","companyName","userCancelled","isDefault","applePayCardNonce","onSuccess","DropIn","PaymentMethod","APPLE_PAY","onError","errorString","braintreePlugin","CdvPurchaseBraintree","CardFormFieldStatus","DISABLED","OPTIONAL","REQUIRED","GOOGLE_PAY","LASER","UK_MAESTRO","SWITCH","SOLOR","AMEX","DINERS_CLUB","DISCOVER","MAESTRO","MASTERCARD","PAYPAL","VISA","VENMO","UNIONPAY","HIPER","HIPERCARD","BillingAddressFormat","MIN","FULL","NOT_CURRENTLY_KNOWN","ESTIMATED","ThreeDSecure","AccountType","ShippingMethod","Version","UNSPECIFIED","CREDIT","DEBIT","SAME_DAY","EXPEDITED","PRIORITY","GROUND","ELECTRONIC_DELIVERY","SHIP_TO_STORE","V1","V2","nativePurchase","toState","fromConstructor","isAcknowledged","PurchaseState","PURCHASED","UNSPECIFIED_STATE","orderId","purchaseToken","purchaseId","purchaseTime","getPurchaseState","acknowledged","consumed","autoRenewing","renewalIntent","refreshPurchase","autoRefreshIntervalMillis","_instance","Products","initializationPromise","iabOptions","onSetPurchases","onPurchasesUpdated","onPurchaseConsumed","showLog","iabReady","getPurchases","playStoreError","getSkusOf","inAppSkus","subsSkus","iabLoaded","go","registeredProduct","addProduct","getAvailableProducts","firstProduct","onFailure","consumePurchase","acknowledgePurchase","purchases","existingReceipt","newReceipt","onPriceChangeConfirmationResult","failure","buySuccess","buyFailed","idAndToken","oldPurchaseToken","findOldPurchaseToken","googlePlay","buy","oldReceipt","signature","trimProductTitles","ProrationMode","ReplacementMode","IMMEDIATE_WITH_TIME_PRORATION","IMMEDIATE_AND_CHARGE_PRORATED_PRICE","IMMEDIATE_WITHOUT_PRORATION","DEFERRED","IMMEDIATE_AND_CHARGE_FULL_PRICE","WITH_TIME_PRORATION","CHARGE_PRORATED_PRICE","WITHOUT_PRORATION","CHARGE_FULL_PRICE","Bridge_2","fail","tokens","test","extendAdditionalData","ad","ensureObject","accountId","skus","launchPriceChangeConfirmationFlow","GProduct","InAppOffer","arguments","SubscriptionOffer","tags","existingProduct","product_format","product_type","onSubsV12Loaded","onInAppLoaded","productOffer","lastPhase","pricing_phases","recurrence_mode","baseOffer","findBasePlan","basePlanId","base_plan_id","offer_id","iabSubsOfferV12Loaded","makeOfferId","existingOffer","toPricingPhase","formatted_price","price_amount_micros","price_currency_code","newOffer","toPaymentMode","phase","toRecurrenceMode","mode","billing_period","billing_cycle_count","PublisherAPI","GoogleErrorReason","SUBSCRIPTION_NO_LONGER_AVAILABLE","PURCHASE_TOKEN_NO_LONGER_VALID","GONE","updateVerifiedPurchases","attributes","renewalIntentChangeDate","testStoreError","registerProduct","testProductsArray","testProducts","PAID_SUBSCRIPTION_ACTIVE","reportActiveSubscription","initTestProduct","prompt","toUpperCase","asyncDelay","alert","RENEWS_EVERY_MS","makeTransaction","n","extra","firstPurchase","transactionNumber","CONSUMABLE_FAILING","WindowsStore","windowsStoreError","Ajax","HTTP_REQUEST_TIMEOUT","plugin","http","ajaxWithHttpPlugin","doneCb","ajaxOptions","toLowerCase","serializer","ajaxDone","callExternal","parse","sendRequest","xhr","XMLHttpRequest","ontimeout","open","onreadystatechange","readyState","responseText","statusText","setRequestHeader","send","prototype","milliseconds","waiting","later","toCall","delay","debounce","formatBillingCycleEN","pricingPhase","fixedRecurrenceMode","cycles","formatDurationEN","omitOne","iso","l","D","W","M","Y","HEX2STR","toHexString","hexStringFromArray","out","arrayLength","add32","complexShift","u","shiftFunction","shiftAdd32","op0","op1","v1","add32x4","j0","j1","step1Function","f","step2Function","step3Function","step4Function","hashStep","inOutVec4","strAsInts","v0","v2","v3","step1","step2","step3","step4","stringToIntArray","charCodeAt","computeMD5","lastCharIndex","strLength","vec4","substring","vec16","reminderLength","vec16Index","errorAsError","c","getCryptoExtension","crypto","msCrypto","getRandomValues","Uint8Array","privacyPolicy","getPrivacyPolicy","allowed","policy","wdw","isObject","ionic","Ionic","model","manufacturer","serial","uuid","isVirtual","fingerprint","Request","nativeTransactions","warning","validationDate","date"],"ignoreList":[],"sourceRoot":"webpack:///","sources":["./src/app/billing/shared/components/subscription-label/subscription-label.component.ts","./src/app/billing/shared/components/subscription-label/subscription-label.component.html","./src/app/billing/shared/components/subscription-detail/subscription-detail.component.html","./src/app/billing/shared/components/subscription-detail/subscription-detail.component.ts","./src/app/studio/shared/components/studio-archive/studio-archive.modal.ts","./src/app/studio/shared/components/studio-archive/studio-archive.modal.html","./src/app/billing/shared/native-app-store.model.ts","./src/app/billing/shared/services/native-app-store.service.ts","./src/app/billing/shared/components/native-app-store/native-app-store.component.html","./src/app/billing/shared/components/native-app-store/native-app-store.component.ts","./src/app/studio/edit-studio/edit-studio.page.html","./src/app/studio/edit-studio/edit-studio.page.ts","./node_modules/cordova-plugin-purchase/www/store.js"],"sourcesContent":["/** @format */\n\nimport { Component } from '@angular/core';\nimport { AsyncPipe } from '@angular/common';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { Observable } from 'rxjs';\nimport { Store } from '@ngrx/store';\nimport { State } from '@app/billing/store/billing.reducer';\nimport { selectSubscriptionLevelLabelTranslateKey } from '@app/billing/store/billing.selectors';\n// import { SubscriptionLevel, SUB_LEVEL_TRANSLATE_KEYS } from '@app/billing/shared/billing.model';\n\n@Component({\n selector: 'fs-subscription-label',\n templateUrl: './subscription-label.component.html',\n styleUrls: ['./subscription-label.component.scss'],\n standalone: true,\n imports: [AsyncPipe, TranslatePipe],\n})\nexport class SubscriptionLabelComponent {\n subscriptionLabelTranslateKey$: Observable<string> = this.store.select(selectSubscriptionLevelLabelTranslateKey);\n\n constructor(private store: Store<State>) {}\n}\n","{{ subscriptionLabelTranslateKey$ | async | translate }}\n","<div *ngIf=\"subscriptionSignalVm() as subscription\" class=\"subscription-detail\">\n <h2>{{ 'AUTH.ACCOUNT' | translate }}</h2>\n <ion-list lines=\"none\">\n <ion-item class=\"sub-summary\">\n <ion-label>\n <h3 class=\"ion-text-wrap\">{{ 'AUTH.PLANS.SUBSCRIPTION_LEVEL' | translate }}</h3>\n <p class=\"ion-text-wrap\">\n <fs-subscription-label></fs-subscription-label>\n </p>\n </ion-label>\n <ion-note slot=\"end\" color=\"light\" class=\"well\">{{ subscription.name | translate | uppercase }}</ion-note>\n <ion-button\n slot=\"end\"\n shape=\"round\"\n fill=\"solid\"\n color=\"primary\"\n title=\"Edit\"\n class=\"icon-btn\"\n (click)=\"subscriptionActionClick(subscription)\">\n <ion-icon slot=\"icon-only\" name=\"create-outline\"></ion-icon>\n </ion-button>\n </ion-item>\n\n <div class=\"plan-options\">\n <!-- <pre>{{ subscription | json }}</pre> -->\n <div *ngIf=\"subscription.isActive && subscription?.proSubId else notActiveDetail\">\n <!-- <p class=\"bright\">{{ 'BILLING.ALREADY_PRO' | translate }}</p> -->\n <ng-template #noEventsProTpl>\n <p class=\"bright\">{{ 'ONBOARDING.COMMON.ACTIVE_DETAIL_PRO' | translate }}</p>\n </ng-template>\n <p *ngIf=\"subscription?.eventsSubIds?.length > 0 else noEventsProTpl\" class=\"bright\">{{ 'ONBOARDING.COMMON.ACTIVE_DETAIL_WITH_EVENT' | translate }}</p>\n <fs-button size=\"default\" (click)=\"editSubscription(subscription?.proSubId)\">{{ 'AUTH.PLANS.EDIT_SUBSCRIPTION' | translate }}</fs-button>\n </div>\n <ng-template #notActiveDetail>\n <p *ngIf=\"subscription?.eventsSubIds?.length > 0 else noEventTpl\" class=\"bright\">{{ 'ONBOARDING.COMMON.NOT_ACTIVE_DETAIL_WITH_EVENT' | translate }}</p>\n <ng-template #noEventTpl>\n <p class=\"bright\">{{ 'ONBOARDING.COMMON.NOT_ACTIVE_DETAIL' | translate }}</p>\n </ng-template>\n <fs-button size=\"large\" (click)=\"subscribe()\">{{ 'AUTH.PLANS.SUBSCRIBE' | translate }}</fs-button>\n </ng-template>\n <p class=\"ion-text-wrap\" style=\"line-height: 4em;margin:0;\">\n <ion-button class=\"btn-link-inline with-icon ion-text-wrap\" fill=\"clear\" href=\"https://filmstacker.com/plans-pricing\" target=\"_filmstacker\">\n {{ 'AUTH.PLANS.LEARN_MORE' | translate }}\n <ion-icon slot=\"end\" name=\"open-outline\"></ion-icon>\n </ion-button>\n </p>\n </div>\n\n <!-- \n Owner: Username (not shown if my event on edit studio)\n Status : Active: Expired\n Expires: Renews: \n Event Date\n\n - only show MY events\n -> move to studio page with links for places i can contribute\n -->\n <!-- <ng-container *ngIf=\"projectsWithEvents$ | async as eventProjects\">\n <div *ngIf=\"eventProjects?.length > 0\" class=\"project-events\">\n YOU HAVE PROJECT EVENTS!\n </div>\n </ng-container> -->\n <div *ngIf=\"myEventProjectsVm() as eventProjects\" class=\"project-events\">\n <div *ngIf=\"eventProjects?.length > 0\">\n <h4>{{ 'PROJECT.ACTIVE_EVENTS' | translate }}:</h4>\n <!-- \n <fs-events-list\n [eventProjects]=\"eventProjects\"\n [subscription]=\"subscription\"\n [showTitle]=\"false\"\n [showOwner]=\"false\"\n ></fs-events-list>\n -->\n <ion-list lines=\"none\">\n <!-- // eventType, canBeActive, \n eventIsActive, \n eventDate, \n eventConfig, \n subscriptionId,\n subscriptionBy, \n subscriptionLevel, \n subscriptionMinutes, \n subscriptionStatus\n -->\n <ion-item *ngFor=\"let project of eventProjects\" class=\"project-events__item\">\n <ion-label class=\"ion-text-wrap\">\n <ion-button *ngIf=\"project?.id else noId\" [routerLink]=\"[routeProjectDetail, project.id]\"\n fill=\"clear\"\n size=\"default\"\n class=\"ion-text-wrap ion-text-left\">\n {{ project.title }}\n </ion-button>\n <ng-template #noId>\n <!-- <pre>No ID: {{ project | json }}</pre> -->\n <div style=\"padding-left: 16px;\">\n <span class=\"italic\">{{ 'PROJECT.NOT_FOUND' | translate }}:</span> {{ project?.title ?? project?.subscription?.cf_project_name }}\n </div>\n </ng-template>\n <div class=\"ion-text-capitalize project-subscription-details\">\n <div>\n <span class=\"\">{{ 'AUTH.PLANS.SUBSCRIPTION_LEVEL' | translate }}: </span><b>{{ project?.subLevel ?? project?.subscriptionLevel ?? project.eventConfig?.subscriptionLevel }}</b>\n </div>\n <div *ngIf=\"project?.expires\">\n <span class=\"bold\">{{ 'COMMON.EXPIRES' | translate }}:</span> {{ project?.expires | date: 'medium' }}\n </div>\n <div *ngIf=\"project?.renews\">\n <span class=\"bold\">{{ 'COMMON.RENEWS' | translate }}:</span> {{ project?.renews | date: 'medium' }}\n </div>\n <div *ngIf=\"project?.eventDate && !project.renews && !project.expires\">\n <span class=\"italic\">{{ 'COMMON.DATE' | translate }}: </span>{{ project?.eventDate | date: 'medium' }}\n </div>\n </div>\n </ion-label>\n <div slot=\"end\" class=\"active-event-icon\" title=\"Active Event\">\n <ion-icon name=\"today-outline\" class=\"no-user\"></ion-icon>\n </div>\n <!-- added case where no project id but still active sub - allow to edit -->\n <ion-button *ngIf=\"!(project?.id?.length > 0) || (project?.canEdit && project?.subscriptionId && subscription.eventsSubIds.includes(project.subscriptionId)); else noEditTpl\" \n slot=\"end\" \n (click)=\"editEventSubscription(subscription, project)\" \n fill=\"outline\"\n class=\"round\"\n color=\"primary\" class=\"projects-action\">\n <ion-icon name=\"create-outline\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n <ng-template #noEditTpl>\n <ion-button \n slot=\"end\" \n [routerLink]=\"[routeProjectDetail, project.id]\"\n fill=\"outline\"\n class=\"round\"\n color=\"medium\" class=\"projects-action\">\n <ion-icon name=\"information\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </ng-template>\n </ion-item>\n </ion-list>\n </div>\n \n </div>\n\n <ng-container *ngIf=\"subscription.isActive\">\n <ion-item *ngIf=\"minutesEnabled\">\n <ion-label>\n <h3>Capture Minutes</h3>\n <p class=\"ion-text-wrap\">The minutes and seconds of each clip you capture will deduct from your balance.</p>\n </ion-label>\n <ion-note slot=\"end\" color=\"light\" class=\"well\">{{ minutes$ | async }}</ion-note>\n\n <ion-button\n slot=\"end\"\n color=\"primary\"\n title=\"Buy Minutes\"\n size=\"default\"\n (click)=\"addMinutes()\">\n Buy Minutes\n <ion-icon slot=\"end\" name=\"cart\"></ion-icon>\n </ion-button>\n <!-- icon button:\n <ion-button\n slot=\"end\"\n shape=\"round\"\n fill=\"outline\"\n color=\"light\"\n title=\"Checkout\"\n class=\"icon-btn\"\n (click)=\"openCheckout($event)\">\n <ion-icon slot=\"icon-only\" name=\"cart-outline\"></ion-icon>\n </ion-button> -->\n </ion-item>\n\n <ng-container *ngIf=\"subscription?.isActive && (subscription?.proSubId || subscription?.eventsSubIds?.length > 0)\">\n <ion-grid class=\"grid-buttons\">\n <ion-row>\n <ion-col size=\"12\" size-sm=\"4\">\n <ion-button\n fill=\"clear\"\n class=\"text-btn\"\n color=\"primary\"\n [title]=\"'BILLING.INFO' | translate\"\n (click)=\"openBillingInfo()\">\n {{ 'BILLING.INFO' | translate }}\n </ion-button>\n </ion-col>\n <ion-col size=\"12\" size-sm=\"4\">\n <ion-button\n fill=\"clear\"\n class=\"text-btn\"\n color=\"primary\"\n [title]=\"'BILLING.PAYMENT_METHODS' | translate\"\n (click)=\"openPaymentMethods()\">\n {{ 'BILLING.PAYMENT_METHODS' | translate }}\n </ion-button>\n </ion-col>\n <ion-col size=\"12\" size-sm=\"4\">\n <ion-button\n fill=\"clear\"\n class=\"text-btn\"\n color=\"primary\"\n [title]=\"'BILLING.PURCHASE_HISTORY' | translate\"\n (click)=\"openPurchaseHistory()\">\n {{ 'BILLING.PURCHASE_HISTORY' | translate }}\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ng-container>\n\n </ng-container>\n\n </ion-list>\n</div>\n","/** @format */\n\nimport { Component, computed, Signal } from '@angular/core';\nimport { NgIf, NgFor, AsyncPipe, UpperCasePipe, DatePipe } from '@angular/common';\nimport { RouterLink } from '@angular/router';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { Observable } from 'rxjs';\nimport { take } from 'rxjs/operators';\nimport {\n ModalController,\n NavController,\n IonList,\n IonItem,\n IonLabel,\n IonNote,\n IonButton,\n IonIcon,\n IonGrid,\n IonRow,\n IonCol,\n} from '@ionic/angular/standalone';\n\nimport { Store } from '@ngrx/store';\nimport { State } from '@app/billing/store/billing.reducer';\nimport {\n selectMinutes,\n selectSubscriptionStatus,\n SubscriptionViewModel,\n selectIsPro,\n selectEventSubscriptionProjects,\n} from '@app/billing/store/billing.selectors';\nimport {\n ChargebeePlanId,\n ChargebeeSubscription,\n getEventSubscriptionDetail,\n isSubscriptionActive,\n SubscriptionLevel,\n // SubscriptionStatus,\n} from '@app/billing/shared/billing.model';\nimport { BillingService } from '@app/billing/shared/services/billing.service';\nimport { PlansModalComponent } from '@app/billing/shared/components/plans-modal/plans-modal.component';\nimport { SubscriptionLabelComponent } from '@app/billing/shared/components/subscription-label/subscription-label.component';\n// import { CheckoutModalComponent } from '@app/billing/shared/components/checkout-modal/checkout-modal.component';\nimport { UserService } from '@app/core/services/user.service';\nimport { SIGNUP_RETURN_URL_PRO } from '@app/onboarding/shared/onboarding.model';\nimport { Project } from '@app/projects/shared/project.model';\nimport { ProjectService } from '@app/projects/shared/services/project.service';\nimport { ButtonComponent } from '@app/shared/components/ui/buttons/button/button.component';\nimport { ENABLE_BILLING_MINUTES } from '@app/app.config';\nimport { PROJECT_DETAIL_ROUTE } from '@app/app.routes';\n\n@Component({\n selector: 'fs-subscription-detail',\n templateUrl: './subscription-detail.component.html',\n styleUrls: ['./subscription-detail.component.scss'],\n standalone: true,\n imports: [\n NgIf,\n NgFor,\n RouterLink,\n AsyncPipe,\n UpperCasePipe,\n DatePipe,\n TranslatePipe,\n ButtonComponent,\n SubscriptionLabelComponent,\n IonList,\n IonItem,\n IonLabel,\n IonNote,\n IonButton,\n IonIcon,\n IonGrid,\n IonRow,\n IonCol,\n ],\n})\nexport class SubscriptionDetailComponent {\n // trying a signal with computed for viewmodel\n subscriptionSignalVm: Signal<SubscriptionViewModel> = this.store.selectSignal(selectSubscriptionStatus);\n /** MY EVENTS paid with MY credit card (account) */\n myEventProjectsSignal: Signal<\n (Project & {\n subscription?: ChargebeeSubscription;\n })[]\n > = this.store.selectSignal(selectEventSubscriptionProjects);\n\n userIdSignal = toSignal(this.userService.userId$);\n\n myEventProjectsVm: Signal<\n (Project & {\n canEdit: boolean;\n eventIsActive: boolean;\n subscription?: ChargebeeSubscription;\n subLevel: SubscriptionLevel;\n expires: string;\n renews: string;\n })[]\n > = computed(() => {\n const userId = this.userIdSignal();\n return this.myEventProjectsSignal()\n .filter((p) => typeof p !== 'undefined')\n .map((project) => {\n const { level, expires, renews } = getEventSubscriptionDetail(project?.subscription);\n return {\n ...project,\n subLevel: level,\n expires,\n renews,\n };\n })\n .map((project) => ({\n ...project,\n canEdit: this.projectService.isProjectAdmin(project, userId),\n eventIsActive: isSubscriptionActive(project?.subscription), // || project.subscriptionStatus === SubscriptionStatus.Active,\n }));\n });\n\n // deprecated - use computed signals\n // subscriptionVm$: Observable<SubscriptionViewModel> = this.store.select(selectSubscriptionStatus);\n // proSubscriptionId$: Observable<string> = this.store.select(selectProSubscriptionId);\n // eventSubscriptionIds$: Observable<string[]> = this.store.select(selectEventSubscriptionIds);\n // myEventProjects$: Observable<(Project & { canEdit: boolean })[]>;\n\n minutes$: Observable<number> = this.store.select(selectMinutes);\n isPro$: Observable<boolean> = this.store.select(selectIsPro);\n\n minutesEnabled = ENABLE_BILLING_MINUTES;\n\n routeProjectDetail = `/${PROJECT_DETAIL_ROUTE}`;\n\n // private onDestroy$ = new Subject<void>();\n\n constructor(\n private store: Store<State>,\n private userService: UserService,\n private projectService: ProjectService,\n private billingService: BillingService,\n private modalCtrl: ModalController,\n private navCtrl: NavController\n ) {}\n\n // ngOnDestroy() {\n // this.onDestroy$.next();\n // this.onDestroy$.complete();\n // }\n\n subscriptionActionClick(subscription: SubscriptionViewModel) {\n if (subscription.isActive && subscription?.proSubId) {\n this.editSubscription(subscription.proSubId);\n // } else if (subscription.isActive && subscription?.eventsSubIds) {\n } else {\n this.subscribe();\n }\n }\n\n async editEventSubscription(\n subscription: SubscriptionViewModel,\n project: Project & {\n canEdit: boolean;\n eventIsActive: boolean;\n subscription?: ChargebeeSubscription;\n subLevel: SubscriptionLevel;\n expires: string;\n renews: string;\n }\n ) {\n console.log({ event, subscription, project });\n\n if (project?.subscriptionId && subscription.eventsSubIds.includes(project.subscriptionId)) {\n // we have a valid event subID - open that edit\n this.editSubscription(project.subscriptionId);\n } else if (!(project?.id?.length > 0) && project?.subscription?.id?.length > 0) {\n // allow for an active sub to be edited, even if project DNE (!project.id)\n this.editSubscription(project.subscription.id);\n } else {\n console.log('Not Authorized to editEventSubscription..');\n this.navCtrl.navigateForward(SIGNUP_RETURN_URL_PRO);\n }\n }\n\n /**\n * Before calling me, validate that subscription.isActive\n */\n async editSubscription(subscriptionId: string) {\n if (subscriptionId) {\n this.billingService.openEditSubscription(subscriptionId);\n return;\n // this.userService.userId$.pipe(take(1)).subscribe(async (userId) => {\n // const iframeSrc = await this.billingService.getEditCheckoutHostedPageId({ userId, subscriptionId });\n // const modal = await this.modalCtrl.create({\n // component: CheckoutModalComponent,\n // componentProps: {\n // // id: subscription.id,\n // userId,\n // iframeSrc\n // },\n // cssClass: 'fullheight-iframe-modal',\n // });\n // await modal.present();\n\n // const { data } = await modal.onWillDismiss();\n // console.log(data);\n // });\n } else {\n this.navCtrl.navigateForward(SIGNUP_RETURN_URL_PRO);\n }\n }\n\n async subscribe() {\n const modal = await this.modalCtrl.create({\n component: PlansModalComponent,\n componentProps: {\n // userId,\n // planId,\n // priceId,\n // referralCode,\n // projectId,\n // projectTitle,\n // eventDate,\n // successRedirectPath,\n },\n cssClass: 'fullheight-iframe-modal',\n });\n await modal.present();\n const { data } = await modal.onWillDismiss();\n if (data) {\n console.log('PlansModal dismissed:', data);\n }\n }\n\n /*\n TODO: refactor all of the below:\n */\n\n /* eslint-disable @typescript-eslint/member-ordering */\n\n /**\n * @deprecated instead of this: use the checkout-button.component!\n */\n private async openCheckout() {\n // how do we determine this here? diff buttons, or allow from marketing site?\n const planId = ChargebeePlanId.Pro;\n console.warn('openCheckout: UNHANDLED');\n // this.userService.userId$.pipe(take(1)).subscribe(async (userId) => {\n // const modal = await this.modalCtrl.create({\n // component: CheckoutModalComponent,\n // componentProps: {\n // planId,\n // userId,\n // },\n // cssClass: 'fullheight-iframe-modal',\n // });\n // return await modal.present();\n // });\n\n // this.billingService.updateBillingInfoWithHostedPage('qx0lQY94Hyzrp2CK6zyolaVbqm4Imyie');\n try {\n // this.billingService.openCheckout(planId);\n } catch (error) {\n console.warn(`[SubscriptionDetail] openPortal caught:`, error);\n }\n }\n\n /**\n * billingService.initUser already done in the user-menu, do not need it again\n */\n // ngAfterViewInit() {\n // // console.log(`[SubscriptionDetail] afterViewInit -> initUser...`);\n // // this.billingService.initUser();\n // // this.billingService.generatePortalSession();\n // }\n\n /**\n * @todo: jd\n */\n viewPlans() {\n // console.log(`[SubscriptionDetail] getPlans`);\n // this.billingService.getPlans();\n }\n\n addMinutes() {\n // const planId = 'clip-minutes'; // @todo: jd\n // const planId = ChargebeePlanId.Pro;\n try {\n console.warn(`todo: you'll need a planId here and addons`);\n // this.billingService.openCheckout(planId);\n } catch (error) {\n console.warn(`[SubscriptionDetail] openPortal caught:`, error);\n }\n }\n\n openBillingInfo() {\n try {\n this.billingService.openBillingInfo();\n } catch (error) {\n console.warn(`[SubscriptionDetail] openBillingInfo caught:`, error);\n }\n }\n\n openPaymentMethods() {\n try {\n this.billingService.openPaymentMethods();\n } catch (error) {\n console.warn(`[SubscriptionDetail] openBillingInfo caught:`, error);\n }\n }\n\n openPurchaseHistory() {\n try {\n this.billingService.openPurchaseHistory();\n } catch (error) {\n console.warn(`[SubscriptionDetail] openBillingInfo caught:`, error);\n }\n }\n\n // openPortal(event) {\n // try {\n // this.billingService.openPortal({});\n // } catch (error) {\n // console.warn(`[SubscriptionDetail] openPortal caught:`, error);\n // }\n // }\n}\n","/** @format */\n\nimport { Component, Input } from '@angular/core';\nimport { ModalController, NavController, IonIcon, IonButton } from '@ionic/angular/standalone';\nimport { HELP_ROUTE } from '@app/app.routes';\n\n@Component({\n selector: 'app-studio-archive',\n templateUrl: './studio-archive.modal.html',\n styleUrls: ['./studio-archive.modal.scss'],\n standalone: true,\n imports: [IonIcon, IonButton],\n})\nexport class StudioArchiveModal {\n @Input() title: string = 'Archive Studio';\n\n constructor(private modalCtrl: ModalController, private navCtrl: NavController) {}\n\n dismiss() {\n // using the injected ModalController this page\n // can \"dismiss\" itself and optionally pass back data\n this.modalCtrl.dismiss({\n dismissed: true,\n });\n }\n\n navHelp() {\n this.dismiss();\n this.navCtrl.navigateForward(`/${HELP_ROUTE}`);\n }\n\n archive() {\n console.log(`TODO: Archive Studio!`);\n }\n}\n","<!-- @format -->\n\n<div class=\"ion-text-center ion-padding skinny-limit-width\">\n <div class=\"top-icon\">\n <ion-icon name=\"archive-outline\" size=\"large\" color=\"medium\"></ion-icon>\n </div>\n\n <h1>{{ title }}</h1>\n\n <h2>So you want to hit pause with your studio?</h2>\n\n <div class=\"input-wrap\">\n <!-- input: type ARCHIVE to continue -->\n <i> Feature Coming Soon... </i>\n </div>\n\n <div>\n <ion-button disabled=\"true\" fill=\"outline\" color=\"medium\" (click)=\"archive()\"> Archive </ion-button>\n <ion-button fill=\"clear\" color=\"medium\" (click)=\"dismiss()\"> Cancel </ion-button>\n </div>\n\n <div>\n <p>\n You will not lose any content. You can unarchive it when you're ready to focus on it again. To learn more, check\n out <a (click)=\"navHelp()\">Archive or Unarchive Your Studio</a>.\n </p>\n <p>If you'd rather delete your studio, you can do so here.</p>\n </div>\n</div>\n","/** AppStore Native */\nexport const NATIVE_APP_STORE_KEY_WEDDING = 'dev_wedding_project_nonrenewing';\nexport const NATIVE_APP_STORE_KEY_EVENT_MONTHLY = 'event_renewing_monthly_1';\nexport const NATIVE_APP_STORE_KEY_EVENT_ANNUALLY = 'event_renewing_annually_1';\nexport const NATIVE_APP_STORE_KEY_PRO_ANNUALLY = 'pro_renewing_annual_1';\nexport const NATIVE_APP_STORE_KEY_PRO_MONTHLY = 'pro_renewing_monthly_1';\n","/** @format */\n\nimport { EventEmitter, Injectable, signal } from '@angular/core';\nimport { Capacitor } from '@capacitor/core';\nimport { AlertController, Platform } from '@ionic/angular/standalone';\nimport 'cordova-plugin-purchase';\nimport {\n NATIVE_APP_STORE_KEY_WEDDING,\n NATIVE_APP_STORE_KEY_EVENT_MONTHLY,\n NATIVE_APP_STORE_KEY_EVENT_ANNUALLY,\n NATIVE_APP_STORE_KEY_PRO_ANNUALLY,\n NATIVE_APP_STORE_KEY_PRO_MONTHLY,\n} from '../native-app-store.model';\n\nexport type CdvPurchaseStore = CdvPurchase.Store; \nexport type CdvPurchaseProduct = CdvPurchase.Product; \nexport type CdvPurchaseProductType = CdvPurchase.ProductType; \nexport type CdvPurchaseTransaction = CdvPurchase.Transaction; \nexport type CdvPurchaseTransactionState = CdvPurchase.TransactionState; \n\nconst DEBUG = true;\n\n@Injectable({\n providedIn: 'root',\n})\nexport class NativeAppStoreService {\n // DO NOT initialize to CdvPurchase.store here\n store?: CdvPurchase.Store;\n products= signal<CdvPurchase.Product[]>([]);\n enabled = signal(false);\n isPro = signal(false);\n hasWedding = signal(false);\n hasEvent = signal(false);\n errorMessage = signal('');\n cdvPlatform: CdvPurchase.Platform = CdvPurchase.Platform.TEST;\n\n changeDetectionEmitter: EventEmitter<void> = new EventEmitter<void>();\n\n constructor(\n private alertController: AlertController, \n private plt: Platform,\n ) {\n this.plt.ready().then(() => {\n if (Capacitor.isNativePlatform()) {\n // MUST WAIT for Cordova to initialize before referencing CdvPurchase namespace\n this.store = CdvPurchase.store;\n // TODO: Setup receipt validation (recommended)\n // ref: https://github.com/j3k0/cordova-plugin-purchase?tab=readme-ov-file\n // store.validator = \"https://validator.iaptic.com/v1/validate?appName=demo&apiKey=12345678\";\n\n if (DEBUG) {\n this.store.verbosity = CdvPurchase.LogLevel.DEBUG;\n }\n if (Capacitor.getPlatform() === 'ios') {\n this.cdvPlatform = CdvPurchase.Platform.APPLE_APPSTORE;\n } else if (Capacitor.getPlatform() === 'android') {\n this.cdvPlatform = CdvPurchase.Platform.GOOGLE_PLAY;\n }\n this.registerProducts(this.cdvPlatform);\n this.setupListeners();\n // Initialize the store\n this.store.initialize([{\n platform: this.cdvPlatform as CdvPurchase.Platform.APPLE_APPSTORE | CdvPurchase.Platform.GOOGLE_PLAY,\n options: {\n needAppReceipt: true,\n }\n }]);\n this.enabled.set(true);\n } else {\n this.enabled.set(false);\n }\n });\n }\n\n getProductState(product: CdvPurchase.Product): CdvPurchase.TransactionState {\n return this.store.findInLocalReceipts(product)?.state ?? CdvPurchase.TransactionState.UNKNOWN_STATE;\n }\n\n /** Purchase a subscription */\n subscribe(productId: string) {\n const product = this.store.get(productId);\n if (!product) {\n throw new Error('Product not found');\n }\n product.getOffer()?.order()\n .then(error => {\n if (error) {\n if (error.code === CdvPurchase.ErrorCode.PAYMENT_CANCELLED) {\n console.log('Payment cancelled by user');\n throw new Error('Payment cancelled by user');\n } else {\n console.log('Failed to subscribe:', error);\n throw new Error('Failed to subscribe - please try again.');\n }\n }\n });\n }\n\n /** Check if user has an active subscription */\n hasActiveSubscription(productId: string): boolean {\n return this.store.owned(productId);\n }\n\n /** To comply with AppStore rules */\n restore() {\n this.store.restorePurchases();\n }\n\n async presentAlert(header, message) {\n const alert = await this.alertController.create({\n header,\n message,\n buttons: ['OK'],\n });\n\n await alert.present();\n }\n\n private registerProducts(platform: CdvPurchase.Platform) {\n this.store.register({\n id: NATIVE_APP_STORE_KEY_WEDDING,\n type: CdvPurchase.ProductType.NON_RENEWING_SUBSCRIPTION,\n platform,\n });\n // this.store.register({\n // id: NATIVE_APP_STORE_KEY_EVENT_MONTHLY,\n // type: CdvPurchase.ProductType.PAID_SUBSCRIPTION,\n // platform,\n // });\n // this.store.register({\n // id: NATIVE_APP_STORE_KEY_EVENT_ANNUALLY,\n // type: CdvPurchase.ProductType.PAID_SUBSCRIPTION,\n // platform,\n // });\n this.store.register({\n id: NATIVE_APP_STORE_KEY_PRO_MONTHLY,\n type: CdvPurchase.ProductType.PAID_SUBSCRIPTION,\n platform,\n });\n this.store.register({\n id: NATIVE_APP_STORE_KEY_PRO_ANNUALLY,\n type: CdvPurchase.ProductType.PAID_SUBSCRIPTION,\n platform,\n });\n\n // Get the real product information\n this.store.ready(() => {\n this.products.set(this.store.products);\n this.changeDetectionEmitter.emit();\n });\n }\n\n private setupListeners() {\n // General query to all products\n this.store.when()\n .productUpdated(this.refreshUI)\n .approved(this.finishPurchase)\n .verified((receipt: CdvPurchase.VerifiedReceipt) => {\n console.log('Purchase verified:', receipt);\n receipt.finish();\n this.refreshUI();\n });\n \n this.store.error((error) => {\n console.error('CdvPurchase ERROR: ' + error.message);\n this.presentAlert('CdvPurchase Error', error.message);\n });\n }\n\n private finishPurchase(transaction: CdvPurchase.Transaction) {\n // Handle the product deliverable\n \n if (transaction.products.find((p) => p?.id === NATIVE_APP_STORE_KEY_PRO_ANNUALLY || p?.id === NATIVE_APP_STORE_KEY_PRO_MONTHLY)?.id?.length > 0) {\n this.isPro.set(true);\n } \n if (transaction.products.find((p) => p?.id === NATIVE_APP_STORE_KEY_WEDDING)?.id?.length > 0) {\n this.hasWedding.set(true);\n }\n if (transaction.products.find((p) => p?.id === NATIVE_APP_STORE_KEY_EVENT_ANNUALLY || p?.id === NATIVE_APP_STORE_KEY_EVENT_MONTHLY)?.id?.length > 0) {\n this.hasEvent.set(true);\n }\n this.changeDetectionEmitter.emit();\n\n transaction.verify();\n this.refreshUI();\n }\n \n private refreshUI() {\n console.log('Products loaded from the store:', this.store.products);\n }\n\n}\n","<div *ngIf=\"isNativePlatform\">\n <h2>In-App Purchases</h2>\n\n <ion-list>\n <ion-item>\n <ion-label>\n Is Pro: {{ isPro() }}\n <br>\n Has Wedding: {{ hasWedding() }}\n <br>\n Has Event: {{ hasEvent() }}\n </ion-label>\n </ion-item>\n <ion-item button *ngFor=\"let p of products()\" (click)=\"purchase(p)\" detail=\"false\">\n <ion-label class=\"ion-text-wrap\">\n {{ p.title }}\n <p>{{ p.description }}</p>\n </ion-label>\n <ion-button slot=\"end\">\n {{ p.pricing.price }} {{ p.pricing.currency }}\n </ion-button>\n </ion-item>\n \n <ion-button expand=\"full\" (click)=\"restore()\">Restore Purchases</ion-button>\n </ion-list>\n</div>\n","/** @format */\n\nimport { ChangeDetectorRef, Component } from '@angular/core';\nimport { NgIf, NgFor } from '@angular/common';\nimport { Capacitor } from '@capacitor/core';\nimport { IonList, IonItem, IonLabel, IonButton, Platform } from '@ionic/angular/standalone';\nimport { NativeAppStoreService, CdvPurchaseProduct } from '@app/billing/shared/services/native-app-store.service';\n\n@Component({\n selector: 'fs-native-app-store',\n templateUrl: './native-app-store.component.html',\n styleUrl: './native-app-store.component.scss',\n standalone: true,\n imports: [NgIf, NgFor, IonButton, IonLabel, IonItem, IonList],\n})\nexport class NativeAppStoreComponent {\n isNativePlatform = false;\n\n enabled = this.appStoreService.enabled;\n products = this.appStoreService.products;\n isPro = this.appStoreService.isPro;\n hasWedding = this.appStoreService.hasWedding;\n hasEvent = this.appStoreService.hasEvent;\n\n constructor(private appStoreService: NativeAppStoreService, private plt: Platform, private cdRef: ChangeDetectorRef) {\n this.plt.ready().then(() => {\n this.isNativePlatform = Capacitor.isNativePlatform();\n });\n this.appStoreService.changeDetectionEmitter.subscribe(\n () => {\n this.cdRef.detectChanges();\n },\n (err) => {\n console.error(err);\n }\n );\n }\n\n purchase(product: CdvPurchaseProduct) {\n this.appStoreService.subscribe(product.id);\n }\n\n /** To comply with AppStore rules */\n restore() {\n this.appStoreService.restore();\n }\n}\n","<ion-header>\n <app-top-navbar [title]=\"title\"></app-top-navbar>\n <ion-grid *ngIf=\"loggedIn$ | async\" class=\"limit-width ion-padding\">\n <ion-row class=\"ion-align-items-end ion-justify-content-center\">\n <ion-col>\n <h1>{{ 'STUDIO.SETTINGS.TITLE' | translate }}</h1>\n </ion-col>\n <ion-col size=\"auto\">\n <fs-button\n type=\"submit\"\n form=\"profileForm\"\n [disabled]=\"isBusy\"\n >\n {{ 'COMMON.SAVE' | translate }}\n </fs-button>\n <fs-button buttonStyle=\"clear\" (click)=\"cancel()\">{{ 'COMMON.CANCEL' | translate }}</fs-button>\n </ion-col>\n </ion-row>\n <ion-row *ngIf=\"error\">\n <ion-col>\n <div class=\"form-error\">\n <div><strong>{{ 'ERRORS.ERROR' | translate }}:</strong> {{ error }}</div>\n </div>\n </ion-col>\n </ion-row>\n </ion-grid>\n</ion-header>\n\n<ion-content forceOverflow=\"false\">\n <ng-template #notAuthed>\n <div class=\"ion-padding ion-text-center\">\n <p class=\"ion-text-center\">{{ 'ERRORS.PAGE_AUTH' | translate }}</p>\n <ion-button routerLink=\"/login\">{{ 'COMMON.LOGIN' | translate }}</ion-button>\n </div>\n </ng-template>\n\n <ion-grid\n *ngIf=\"loggedIn$ | async; else notAuthed\"\n class=\"limit-width ion-padding\"\n >\n <ion-row class=\"ion-align-items-start ion-justify-content-center\">\n <ion-col size=\"12\" size-md=\"4\">\n <div class=\"avatar-wrap\">\n <app-editable-avatar\n [userId]=\"userId$ | async\"\n [avatarUrl]=\"avatarUrl$ | async\"\n [canEditAvatar]=\"true\"\n ></app-editable-avatar>\n </div>\n </ion-col>\n <ion-col *ngIf=\"enableBilling\" size=\"12\" size-md=\"8\">\n <fs-subscription-detail class=\"ion-margin-vertical\" style=\"display:block;\"></fs-subscription-detail>\n </ion-col>\n </ion-row>\n <ion-row>\n <ion-col>\n <fs-native-app-store></fs-native-app-store>\n </ion-col>\n </ion-row>\n <!-- id enableBilling: ion-justify-content-end -->\n <ion-row class=\"ion-justify-content-center\">\n <ion-col size=\"12\" size-md=\"8\">\n <h2>{{ 'STUDIO.SETTINGS.HEADING' | translate }}</h2>\n <form id=\"profileForm\" class=\"fs-profile-form\" [formGroup]=\"profileForm\" (ngSubmit)=\"save()\">\n <fs-form-input\n label=\"{{ 'STUDIO.SETTINGS.LABEL_HANDLE' | translate }}\"\n [hint]=\"'STUDIO.SETTINGS.INSTRUCTIONS' | translate\"\n [control]=\"profileForm.get('handle') | formControlCast\"\n [disabled]=\"loading\"\n ></fs-form-input>\n <!-- <div class=\"instructions\">\n {{ 'STUDIO.SETTINGS.INSTRUCTIONS' | translate }}\n </div> -->\n <div *ngIf=\"profileForm.get('handle').invalid && (profileForm.get('handle').dirty || profileForm.get('handle').touched)\" class=\"form-error\">\n <div *ngIf=\"profileForm.get('handle').errors['minlength']\">\n {{ 'ERRORS.FORM.HANDLE_MIN_LENGTH' | translate:{length: usernameMinLength} }}\n </div>\n <div *ngIf=\"profileForm.get('handle').errors['maxlength']\">\n {{ 'ERRORS.FORM.HANDLE_MAX_LENGTH' | translate:{length: usernameMaxLength} }}\n </div>\n <div *ngIf=\"profileForm.get('handle').errors['pattern']\">\n {{usernamePatternDesc}}\n </div>\n </div>\n \n <fs-form-input\n label=\"{{ 'STUDIO.SETTINGS.LABEL_LOCATION' | translate }}\"\n [control]=\"profileForm.get('location') | formControlCast\"\n [disabled]=\"loading\"\n ></fs-form-input>\n <fs-form-textarea\n label=\"{{ 'STUDIO.SETTINGS.LABEL_BIO' | translate }}\"\n [control]=\"profileForm.get('bio') | formControlCast\"\n [disabled]=\"loading\"\n ></fs-form-textarea>\n <fs-form-input\n label=\"{{ 'STUDIO.SETTINGS.LABEL_NAME' | translate }}\"\n [hint]=\"'STUDIO.SETTINGS.USERID_NOTE' | translate\"\n [control]=\"profileForm.get('userId') | formControlCast\"\n [disabled]=\"true\"\n ></fs-form-input>\n <!-- <div class=\"instructions\">\n {{ 'STUDIO.SETTINGS.USERID_NOTE' | translate }}\n </div> -->\n <fs-form-input\n label=\"{{ 'COMMON.EMAIL' | translate }}\"\n [hint]=\"'STUDIO.SETTINGS.EMAIL_NOTE' | translate\"\n [control]=\"profileForm.get('email') | formControlCast\"\n [disabled]=\"loading || true\"\n ></fs-form-input>\n <!-- <div class=\"instructions\">\n {{ 'STUDIO.SETTINGS.EMAIL_NOTE' | translate }}\n </div> -->\n </form>\n\n <div class=\"ion-padding ion-margin-top\" style=\"display: flex; align-items: center;\">\n <fs-button \n *ngIf=\"email$ | async as email\"\n buttonStyle=\"outline\"\n (click)=\"changePassword(email)\"\n >{{ 'AUTH.CHANGE_PASSWORD' | translate }}</fs-button>\n <fs-button \n class=\"ion-text-right\" \n buttonStyle=\"outline\" \n icon=\"archive-outline\" \n (click)=\"archive()\"\n >{{ 'COMMON.ARCHIVE' | translate }}</fs-button>\n </div>\n </ion-col>\n </ion-row>\n </ion-grid>\n <div class=\"tab-bottom-spacer\"></div>\n</ion-content>\n","/** @format */\n\nimport { Component, OnInit, OnDestroy, AfterViewInit } from '@angular/core';\nimport { NgIf, AsyncPipe } from '@angular/common';\nimport { NavigationExtras, Router, RouterLink } from '@angular/router';\nimport { UntypedFormBuilder, Validators, ValidationErrors, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport {\n ModalController,\n NavController,\n IonHeader,\n IonGrid,\n IonRow,\n IonCol,\n IonContent,\n IonButton,\n} from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport { archiveOutline, imagesOutline } from 'ionicons/icons';\nimport { TranslateService, TranslatePipe } from '@ngx-translate/core';\nimport { Observable, Subject } from 'rxjs';\nimport { take, takeUntil } from 'rxjs/operators';\nimport { ENABLE_BILLING } from '@app/app.config';\nimport { FORGOT_PASS_PAGE, STUDIO_PAGE } from '@app/app.routes';\nimport { UserService } from '@app/core/services/user.service';\nimport { ToasterService } from '@app/core/services/toaster.service';\nimport { TopNavbarComponent } from '@app/shared/components/top-navbar/top-navbar.component';\nimport { ButtonComponent } from '@app/shared/components/ui/buttons/button/button.component';\nimport { FormInputComponent } from '@app/shared/components/ui/form/form-input/form-input.component';\nimport { FormTextareaComponent } from '@app/shared/components/ui/form/form-textarea/form-textarea.component';\nimport { FormControlCastPipe } from '@app/shared/pipes/form-control-cast.pipe';\nimport { SubscriptionDetailComponent } from '@app/billing/shared/components/subscription-detail/subscription-detail.component';\nimport { EditableAvatarComponent } from '../shared/components/editable-avatar/editable-avatar.component';\nimport { StudioArchiveModal } from '../shared/components/studio-archive/studio-archive.modal';\nimport { NativeAppStoreComponent } from '@app/billing/shared/components/native-app-store/native-app-store.component';\n\n/**\n * @todo\n * controls to manage your information and protect your privacy and security.\n */\n\nconst DEBUG_LOGS = false;\nconst PAGE = '[EditStudio]';\n\n@Component({\n selector: 'app-edit-studio',\n templateUrl: './edit-studio.page.html',\n styleUrls: ['./edit-studio.page.scss'],\n standalone: true,\n imports: [\n NgIf,\n RouterLink,\n FormsModule,\n ReactiveFormsModule,\n AsyncPipe,\n TranslatePipe,\n FormControlCastPipe,\n NativeAppStoreComponent,\n FormInputComponent,\n FormTextareaComponent,\n TopNavbarComponent,\n SubscriptionDetailComponent,\n EditableAvatarComponent,\n ButtonComponent,\n IonHeader,\n IonGrid,\n IonRow,\n IonCol,\n IonContent,\n IonButton,\n ],\n})\nexport class EditStudioPage implements OnInit, OnDestroy, AfterViewInit {\n enableBilling = ENABLE_BILLING;\n\n usernameMinLength = 2;\n usernameMaxLength = 32;\n /** will be translated OnInit */\n usernamePatternDesc =\n 'Public Name must start with a letter and only contain letters, numbers, dashes(-) and underscores (_)';\n\n profileForm = this.formBuilder.group({\n handle: [\n '',\n Validators.compose([\n Validators.minLength(this.usernameMinLength),\n Validators.maxLength(this.usernameMaxLength),\n Validators.pattern('^[a-zA-Z]+[0-9a-zA-Z _-]+$'),\n ]),\n ],\n bio: [''],\n location: [''],\n userId: [{ value: '', disabled: true }, Validators.required],\n email: [{ value: '', disabled: true }, Validators.compose([Validators.required, Validators.email])],\n });\n\n error = '';\n loading = false;\n\n title: string = 'Studio';\n loggedIn$: Observable<boolean>;\n userId$: Observable<string>;\n // username$: Observable<string>;\n email$: Observable<string>;\n avatarUrl$: Observable<string>;\n // identityId$: Observable<string>;\n\n private onDestroy$ = new Subject<void>();\n\n constructor(\n private formBuilder: UntypedFormBuilder,\n private userService: UserService,\n private modalCtrl: ModalController,\n private navCtrl: NavController,\n private toaster: ToasterService,\n private router: Router,\n private translate: TranslateService\n ) {}\n\n ngOnInit() {\n addIcons({\n imagesOutline, archiveOutline,\n });\n this.loggedIn$ = this.userService.isLoggedIn$;\n this.userId$ = this.userService.userId$;\n // this.username$ = this.userService.username$;\n this.email$ = this.userService.email$;\n this.avatarUrl$ = this.userService.avatarUrl$;\n // this.identityId$ = this.userService.identityId$;\n\n this.translate\n .get('ERRORS.FORM.HANDLE_PATTERN')\n .pipe(take(1))\n .subscribe((res) => {\n this.usernamePatternDesc = res;\n });\n\n const formSubs = [\n {\n obs: this.userId$,\n field: 'userId',\n },\n {\n obs: this.userService.username$,\n field: 'handle',\n },\n {\n obs: this.userService.bio$,\n field: 'bio',\n },\n {\n obs: this.userService.location$,\n field: 'location',\n },\n {\n obs: this.email$,\n field: 'email',\n },\n ];\n\n formSubs.forEach(({ obs, field }) => {\n obs.pipe(takeUntil(this.onDestroy$)).subscribe((val: string) => {\n DEBUG_LOGS && console.log(`${PAGE} formSub(${field}):`, val);\n this.updateProp(field, val || '');\n });\n });\n }\n\n ngAfterViewInit() {\n // state.tutorial - definition of something to alert the user to\n const showTutorial = this.router.getCurrentNavigation().extras.state?.tutorial;\n if (showTutorial) {\n console.warn('navstate.showTutorial: ' + showTutorial);\n }\n }\n\n ngOnDestroy() {\n this.onDestroy$.next();\n this.onDestroy$.complete();\n }\n\n get isBusy() {\n return this.loading || this.profileForm.invalid;\n }\n\n async save() {\n this.loading = true;\n this.error = '';\n\n if (!this.profileForm.valid) {\n this.error = 'Form is not valid';\n return;\n }\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { handle, bio, location, userId, email } = this.profileForm.controls;\n DEBUG_LOGS && console.log(`${PAGE} save:`, this.profileForm.controls);\n let didSave = false;\n\n /**\n * I tried using the <fs-form-input>, but how can i tell if the FormControls have changed?\n * control.dirty, control.pristine, ?\n */\n\n // make the updates to the store, then the effects will update api..\n\n if (handle.dirty && handle.value) {\n // replace any repeating spaces with single space, and trim\n this.userService.setUsername(handle.value.replace(/\\s\\s+/g, ' ').trim());\n didSave = true;\n }\n\n if (bio.dirty && bio.value) {\n this.userService.setBio(bio.value.trim());\n didSave = true;\n }\n\n if (location.dirty && location.value) {\n this.userService.setLocation(location.value.trim());\n didSave = true;\n }\n\n if (didSave) {\n this.toaster.present(`Saved!`);\n }\n this.navCtrl.navigateBack(`/${STUDIO_PAGE}`);\n } catch (err) {\n this.error = err.message;\n } finally {\n this.loading = false;\n }\n }\n\n updateProp(key: string, value: string) {\n this.profileForm.patchValue({ [key]: value });\n }\n\n getErrorMessage(errors: ValidationErrors | undefined) {\n return Object.keys(errors || {})\n .filter((key) => errors[key])\n .map((key) => {\n switch (key) {\n case 'required':\n // return 'This field is required.';\n return this.translate.instant('ERRORS.REQUIRED_FIELD');\n }\n })\n .find(Boolean);\n }\n\n cancel() {\n this.navCtrl.navigateBack(`/${STUDIO_PAGE}`);\n }\n\n async archive() {\n // https://xd.adobe.com/view/61615fe1-b7c1-47a9-493b-3c7268fe8988-1750/screen/66b3edda-b47d-4cb3-822f-f9a42bb38f99/\n\n const modal = await this.modalCtrl.create({\n component: StudioArchiveModal,\n cssClass: 'modal-light',\n componentProps: {\n title: 'Archive My Studio',\n },\n });\n await modal.present();\n\n const res = await modal.onDidDismiss(); // or onWillDismiss\n console.log(`${PAGE} modalDismiss res:`, res);\n }\n\n changeEmail() {\n // https://filmstacker.atlassian.net/browse/MVP-521\n }\n\n changePassword(email: string) {\n const navigationExtras: NavigationExtras = {\n state: {\n email,\n title: 'Change Password',\n },\n };\n this.navCtrl.navigateForward(`/${FORGOT_PASS_PAGE}`, navigationExtras);\n }\n}\n","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar CdvPurchase;\n(function (CdvPurchase) {\n const ERROR_CODES_BASE = 6777000;\n /**\n * Error codes\n */\n let ErrorCode;\n (function (ErrorCode) {\n /** Error: Failed to intialize the in-app purchase library */\n ErrorCode[ErrorCode[\"SETUP\"] = ERROR_CODES_BASE + 1] = \"SETUP\";\n /** Error: Failed to load in-app products metadata */\n ErrorCode[ErrorCode[\"LOAD\"] = ERROR_CODES_BASE + 2] = \"LOAD\";\n /** Error: Failed to make a purchase */\n ErrorCode[ErrorCode[\"PURCHASE\"] = ERROR_CODES_BASE + 3] = \"PURCHASE\";\n /** Error: Failed to load the purchase receipt */\n ErrorCode[ErrorCode[\"LOAD_RECEIPTS\"] = ERROR_CODES_BASE + 4] = \"LOAD_RECEIPTS\";\n /** Error: Client is not allowed to issue the request */\n ErrorCode[ErrorCode[\"CLIENT_INVALID\"] = ERROR_CODES_BASE + 5] = \"CLIENT_INVALID\";\n /** Error: Purchase flow has been cancelled by user */\n ErrorCode[ErrorCode[\"PAYMENT_CANCELLED\"] = ERROR_CODES_BASE + 6] = \"PAYMENT_CANCELLED\";\n /** Error: Something is suspicious about a purchase */\n ErrorCode[ErrorCode[\"PAYMENT_INVALID\"] = ERROR_CODES_BASE + 7] = \"PAYMENT_INVALID\";\n /** Error: The user is not allowed to make a payment */\n ErrorCode[ErrorCode[\"PAYMENT_NOT_ALLOWED\"] = ERROR_CODES_BASE + 8] = \"PAYMENT_NOT_ALLOWED\";\n /** Error: Unknown error */\n ErrorCode[ErrorCode[\"UNKNOWN\"] = ERROR_CODES_BASE + 10] = \"UNKNOWN\";\n /** Error: Failed to refresh the purchase receipt */\n ErrorCode[ErrorCode[\"REFRESH_RECEIPTS\"] = ERROR_CODES_BASE + 11] = \"REFRESH_RECEIPTS\";\n /** Error: The product identifier is invalid */\n ErrorCode[ErrorCode[\"INVALID_PRODUCT_ID\"] = ERROR_CODES_BASE + 12] = \"INVALID_PRODUCT_ID\";\n /** Error: Cannot finalize a transaction or acknowledge a purchase */\n ErrorCode[ErrorCode[\"FINISH\"] = ERROR_CODES_BASE + 13] = \"FINISH\";\n /** Error: Failed to communicate with the server */\n ErrorCode[ErrorCode[\"COMMUNICATION\"] = ERROR_CODES_BASE + 14] = \"COMMUNICATION\";\n /** Error: Subscriptions are not available */\n ErrorCode[ErrorCode[\"SUBSCRIPTIONS_NOT_AVAILABLE\"] = ERROR_CODES_BASE + 15] = \"SUBSCRIPTIONS_NOT_AVAILABLE\";\n /** Error: Purchase information is missing token */\n ErrorCode[ErrorCode[\"MISSING_TOKEN\"] = ERROR_CODES_BASE + 16] = \"MISSING_TOKEN\";\n /** Error: Verification of store data failed */\n ErrorCode[ErrorCode[\"VERIFICATION_FAILED\"] = ERROR_CODES_BASE + 17] = \"VERIFICATION_FAILED\";\n /** Error: Bad response from the server */\n ErrorCode[ErrorCode[\"BAD_RESPONSE\"] = ERROR_CODES_BASE + 18] = \"BAD_RESPONSE\";\n /** Error: Failed to refresh the store */\n ErrorCode[ErrorCode[\"REFRESH\"] = ERROR_CODES_BASE + 19] = \"REFRESH\";\n /** Error: Payment has expired */\n ErrorCode[ErrorCode[\"PAYMENT_EXPIRED\"] = ERROR_CODES_BASE + 20] = \"PAYMENT_EXPIRED\";\n /** Error: Failed to download the content */\n ErrorCode[ErrorCode[\"DOWNLOAD\"] = ERROR_CODES_BASE + 21] = \"DOWNLOAD\";\n /** Error: Failed to update a subscription */\n ErrorCode[ErrorCode[\"SUBSCRIPTION_UPDATE_NOT_AVAILABLE\"] = ERROR_CODES_BASE + 22] = \"SUBSCRIPTION_UPDATE_NOT_AVAILABLE\";\n /** Error: The requested product is not available in the store. */\n ErrorCode[ErrorCode[\"PRODUCT_NOT_AVAILABLE\"] = ERROR_CODES_BASE + 23] = \"PRODUCT_NOT_AVAILABLE\";\n /** Error: The user has not allowed access to Cloud service information */\n ErrorCode[ErrorCode[\"CLOUD_SERVICE_PERMISSION_DENIED\"] = ERROR_CODES_BASE + 24] = \"CLOUD_SERVICE_PERMISSION_DENIED\";\n /** Error: The device could not connect to the network. */\n ErrorCode[ErrorCode[\"CLOUD_SERVICE_NETWORK_CONNECTION_FAILED\"] = ERROR_CODES_BASE + 25] = \"CLOUD_SERVICE_NETWORK_CONNECTION_FAILED\";\n /** Error: The user has revoked permission to use this cloud service. */\n ErrorCode[ErrorCode[\"CLOUD_SERVICE_REVOKED\"] = ERROR_CODES_BASE + 26] = \"CLOUD_SERVICE_REVOKED\";\n /** Error: The user has not yet acknowledged Apple’s privacy policy */\n ErrorCode[ErrorCode[\"PRIVACY_ACKNOWLEDGEMENT_REQUIRED\"] = ERROR_CODES_BASE + 27] = \"PRIVACY_ACKNOWLEDGEMENT_REQUIRED\";\n /** Error: The app is attempting to use a property for which it does not have the required entitlement. */\n ErrorCode[ErrorCode[\"UNAUTHORIZED_REQUEST_DATA\"] = ERROR_CODES_BASE + 28] = \"UNAUTHORIZED_REQUEST_DATA\";\n /** Error: The offer identifier is invalid. */\n ErrorCode[ErrorCode[\"INVALID_OFFER_IDENTIFIER\"] = ERROR_CODES_BASE + 29] = \"INVALID_OFFER_IDENTIFIER\";\n /** Error: The price you specified in App Store Connect is no longer valid. */\n ErrorCode[ErrorCode[\"INVALID_OFFER_PRICE\"] = ERROR_CODES_BASE + 30] = \"INVALID_OFFER_PRICE\";\n /** Error: The signature in a payment discount is not valid. */\n ErrorCode[ErrorCode[\"INVALID_SIGNATURE\"] = ERROR_CODES_BASE + 31] = \"INVALID_SIGNATURE\";\n /** Error: Parameters are missing in a payment discount. */\n ErrorCode[ErrorCode[\"MISSING_OFFER_PARAMS\"] = ERROR_CODES_BASE + 32] = \"MISSING_OFFER_PARAMS\";\n /**\n * Server code used when a subscription expired.\n *\n * @deprecated Validator should now return the transaction in the collection as expired.\n */\n ErrorCode[ErrorCode[\"VALIDATOR_SUBSCRIPTION_EXPIRED\"] = 6778003] = \"VALIDATOR_SUBSCRIPTION_EXPIRED\";\n })(ErrorCode = CdvPurchase.ErrorCode || (CdvPurchase.ErrorCode = {}));\n /**\n * Create an {@link IError} instance\n *\n * @internal\n */\n function storeError(code, message, platform, productId) {\n return { isError: true, code, message, platform, productId };\n }\n CdvPurchase.storeError = storeError;\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n /**\n * Integrate with https://www.iaptic.com/\n *\n * @example\n * const iaptic = new CdvPurchase.Iaptic({\n * url: 'https://validator.iaptic.com',\n * appName: 'test',\n * apiKey: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',\n * });\n * store.validator = iaptic.validator;\n */\n class Iaptic {\n constructor(config, store) {\n this.config = config;\n if (!config.url) {\n config.url = 'https://validator.iaptic.com';\n }\n this.store = store !== null && store !== void 0 ? store : CdvPurchase.store;\n this.log = this.store.log.child('Iaptic');\n }\n /**\n * Provides a client token generated on iaptic's servers\n *\n * Can be passed to the Braintree Adapter at initialization.\n *\n * @example\n * store.initialize([\n * {\n * platform: Platform.BRAINTREE,\n * options: {\n * clientTokenProvider: iaptic.braintreeClientTokenProvider\n * }\n * }\n * ]);\n */\n get braintreeClientTokenProvider() {\n return callback => {\n this.log.info('Calling Braintree clientTokenProvider');\n CdvPurchase.Utils.ajax(this.log, {\n url: `${this.config.url}/v3/braintree/client-token?appName=${this.config.appName}&apiKey=${this.config.apiKey}`,\n method: 'POST',\n data: {\n applicationUsername: CdvPurchase.store.getApplicationUsername(),\n customerId: CdvPurchase.Braintree.customerId,\n },\n success: body => {\n this.log.info('clientTokenProvider success: ' + JSON.stringify(body));\n callback(body.clientToken);\n },\n error: err => {\n this.log.info('clientTokenProvider error: ' + JSON.stringify(err));\n callback(CdvPurchase.storeError(err, 'ERROR ' + err, CdvPurchase.Platform.BRAINTREE, null));\n },\n });\n };\n }\n /**\n * Determine the eligibility of discounts based on the content of the application receipt.\n *\n * The secret sauce used here is to wait for validation of the application receipt.\n * The receipt validator will return the necessary data to determine eligibility.\n *\n * Receipt validation is expected to happen after loading product information, so the implementation here is to\n * wait for a validation response.\n */\n get appStoreDiscountEligibilityDeterminer() {\n // the user needs the appStoreDiscountEligibilityDeterminer, let's start listening to receipt validation events.\n let latestReceipt;\n this.log.debug(\"AppStore eligibility determiner is listening...\");\n this.store.when().verified(receipt => {\n if (receipt.platform === CdvPurchase.Platform.APPLE_APPSTORE) {\n this.log.debug(\"Got a verified AppStore receipt.\");\n latestReceipt = receipt;\n }\n }, 'appStoreDiscountEligibilityDeterminer_listening');\n const determiner = (_appStoreReceipt, requests, callback) => {\n this.log.debug(\"AppStore eligibility determiner\");\n if (latestReceipt) {\n this.log.debug(\"Using cached receipt\");\n return callback(analyzeReceipt(latestReceipt, requests));\n }\n const onVerified = (receipt) => {\n if (receipt.platform === CdvPurchase.Platform.APPLE_APPSTORE) {\n this.log.debug(\"Receipt is verified, let's analyze the content and respond.\");\n this.store.off(onVerified);\n callback(analyzeReceipt(receipt, requests));\n }\n };\n this.log.debug(\"Waiting for receipt\");\n this.store.when().verified(onVerified, 'appStoreDiscountEligibilityDeterminer_waiting');\n };\n determiner.cacheReceipt = function (receipt) {\n latestReceipt = receipt;\n };\n return determiner;\n function analyzeReceipt(receipt, requests) {\n const ineligibleIntro = receipt.raw.ineligible_for_intro_price;\n return requests.map(request => {\n var _a;\n if (request.discountType === 'Introductory' && ineligibleIntro && ineligibleIntro.find(id => request.productId === id)) {\n // User is not eligible for this introductory offer\n return false;\n }\n else if (request.discountType === 'Subscription') {\n // Discount only available if user is or was a subscriber\n const matchingPurchase = (_a = receipt.raw.collection) === null || _a === void 0 ? void 0 : _a.find(purchase => purchase.id === request.productId);\n return matchingPurchase ? true : false;\n }\n else {\n // In other cases, assume the user is eligible\n return true;\n }\n });\n }\n }\n /** Validator URL */\n get validator() {\n return `${this.config.url}/v1/validate?appName=${this.config.appName}&apiKey=${this.config.apiKey}`;\n }\n }\n CdvPurchase.Iaptic = Iaptic;\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n /**\n * Desired logging level for the {@link Logger}\n *\n * @see {@link Store.verbosity}\n */\n let LogLevel;\n (function (LogLevel) {\n /** Disable all logging (default) */\n LogLevel[LogLevel[\"QUIET\"] = 0] = \"QUIET\";\n /** Show only error messages */\n LogLevel[LogLevel[\"ERROR\"] = 1] = \"ERROR\";\n /** Show warnings and errors */\n LogLevel[LogLevel[\"WARNING\"] = 2] = \"WARNING\";\n /** Also show information messages */\n LogLevel[LogLevel[\"INFO\"] = 3] = \"INFO\";\n /** Enable internal debugging messages. */\n LogLevel[LogLevel[\"DEBUG\"] = 4] = \"DEBUG\";\n })(LogLevel = CdvPurchase.LogLevel || (CdvPurchase.LogLevel = {}));\n ;\n class Logger {\n /** @internal */\n constructor(store, prefix = '') {\n /** All log lines are prefixed with this string */\n this.prefix = '';\n this.store = store;\n this.prefix = prefix || 'CdvPurchase';\n }\n /**\n * Create a child logger, whose prefix will be this one's + the given string.\n *\n * @example\n * const log = store.log.child('AppStore')\n */\n child(prefix) {\n return new Logger(this.store, this.prefix + '.' + prefix);\n }\n /**\n * Logs an error message, only if `store.verbosity` >= store.ERROR\n */\n error(o) {\n log(this.store.verbosity, LogLevel.ERROR, this.prefix, o);\n // show the stack trace\n try {\n throw new Error(toString(o));\n }\n catch (e) {\n log(this.store.verbosity, LogLevel.ERROR, this.prefix, e.stack);\n }\n }\n /**\n * Logs a warning message, only if `store.verbosity` >= store.WARNING\n */\n warn(o) { log(this.store.verbosity, LogLevel.WARNING, this.prefix, o); }\n /**\n * Logs an info message, only if `store.verbosity` >= store.INFO\n */\n info(o) { log(this.store.verbosity, LogLevel.INFO, this.prefix, o); }\n /**\n * Logs a debug message, only if `store.verbosity` >= store.DEBUG\n */\n debug(o) { log(this.store.verbosity, LogLevel.DEBUG, this.prefix, o); }\n /**\n * Add warning logs on a console describing an exception.\n *\n * This method is mostly used when executing user registered callbacks.\n *\n * @param context - a string describing why the method was called\n * @param error - a javascript Error object thrown by an exception\n */\n logCallbackException(context, err) {\n this.warn(\"A callback in \\'\" + context + \"\\' failed with an exception.\");\n if (typeof err === 'string')\n this.warn(\" \" + err);\n else if (err) {\n const errAny = err;\n if (errAny.fileName)\n this.warn(\" \" + errAny.fileName + \":\" + errAny.lineNumber);\n if (err.message)\n this.warn(\" \" + err.message);\n if (err.stack)\n this.warn(\" \" + err.stack);\n }\n }\n }\n /**\n * Console object used to display log lines.\n *\n * It can be replaced by your implementation if you want to, for example, send logs to a remote server.\n *\n * @example\n * Logger.console = {\n * log: (message) => { remoteLog('LOG', message); },\n * warn: (message) => { remoteLog('WARN', message); },\n * error: (message) => { remoteLog('ERROR', message); }\n * }\n */\n Logger.console = window.console;\n CdvPurchase.Logger = Logger;\n const LOG_LEVEL_STRING = [\"QUIET\", \"ERROR\", \"WARNING\", \"INFO\", \"DEBUG\"];\n function toString(o) {\n if (typeof o !== 'string')\n o = JSON.stringify(o);\n return o;\n }\n function log(verbosity, level, prefix, o) {\n var maxLevel = verbosity === true ? 1 : verbosity;\n if (level > maxLevel)\n return;\n if (typeof o !== 'string')\n o = JSON.stringify(o);\n const fullPrefix = prefix ? `[${prefix}] ` : '';\n const logStr = (level === LogLevel.ERROR) ? ((str) => Logger.console.error(str))\n : (level === LogLevel.WARNING) ? ((str) => Logger.console.warn(str))\n : ((str) => Logger.console.log(str));\n if (LOG_LEVEL_STRING[level])\n logStr(`${fullPrefix}${LOG_LEVEL_STRING[level]}: ${o}`);\n else\n logStr(`${fullPrefix}${o}`);\n }\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n let Utils;\n (function (Utils) {\n Utils.nonEnumerable = (target, name, desc) => {\n if (desc) {\n desc.enumerable = false;\n return desc;\n }\n Object.defineProperty(target, name, {\n set(value) {\n Object.defineProperty(this, name, {\n value, writable: true, configurable: true,\n });\n },\n configurable: true,\n });\n };\n })(Utils = CdvPurchase.Utils || (CdvPurchase.Utils = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n /** Product definition from a store */\n class Product {\n /** @internal */\n constructor(p, decorator) {\n /** @internal */\n this.className = 'Product';\n /** Product title from the store. */\n this.title = '';\n /** Product full description from the store. */\n this.description = '';\n this.platform = p.platform;\n this.type = p.type;\n this.id = p.id;\n this.group = p.group;\n this.offers = [];\n Object.defineProperty(this, 'pricing', { enumerable: false, get: () => { var _a; return (_a = this.offers[0]) === null || _a === void 0 ? void 0 : _a.pricingPhases[0]; } });\n Object.defineProperty(this, 'canPurchase', { enumerable: false, get: () => decorator.canPurchase(this) });\n Object.defineProperty(this, 'owned', { enumerable: false, get: () => decorator.owned(this) });\n }\n /**\n * Shortcut to offers[0].pricingPhases[0]\n *\n * Useful when you know products have a single offer and a single pricing phase.\n */\n get pricing() {\n var _a;\n // see Object.defineProperty in the constructor for the actual implementation.\n return (_a = this.offers[0]) === null || _a === void 0 ? void 0 : _a.pricingPhases[0];\n }\n /**\n * Returns true if the product can be purchased.\n */\n get canPurchase() {\n // Pseudo implementation to make typescript happy.\n // see Object.defineProperty in the constructor for the actual implementation.\n return false;\n }\n /**\n * Returns true if the product is owned.\n *\n * Important: This value will be false when the app starts and will only become\n * true after purchase receipts have been loaded and validated. Without receipt validation,\n * it might remain false depending on the platform, make sure to store the ownership status\n * of non-consumable products in some way.\n */\n get owned() {\n // Pseudo implementation to make typescript happy.\n // see Object.defineProperty in the constructor for the actual implementation.\n return false;\n }\n /**\n * Find and return an offer for this product from its id\n *\n * If id isn't specified, returns the first offer.\n *\n * @param id - Identifier of the offer to return\n * @return An Offer or undefined if no match is found\n */\n getOffer(id = '') {\n if (!id)\n return this.offers[0];\n return this.offers.find(o => o.id === id);\n }\n /**\n * Add an offer to this product.\n *\n * @internal\n */\n addOffer(offer) {\n if (this.getOffer(offer.id))\n return this;\n this.offers.push(offer);\n return this;\n }\n }\n CdvPurchase.Product = Product;\n})(CdvPurchase || (CdvPurchase = {}));\n// Functions defined here so we can generate code compatible with old version of JS\nvar CdvPurchase;\n(function (CdvPurchase) {\n let Utils;\n (function (Utils) {\n /** Object.values() for ES6 */\n function objectValues(obj) {\n const ret = [];\n for (let key in obj) {\n if (obj.hasOwnProperty(key)) {\n ret.push(obj[key]);\n }\n }\n return ret;\n }\n Utils.objectValues = objectValues;\n })(Utils = CdvPurchase.Utils || (CdvPurchase.Utils = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n let Utils;\n (function (Utils) {\n /** Returns human format name for a given platform */\n function platformName(platform) {\n switch (platform) {\n case CdvPurchase.Platform.APPLE_APPSTORE:\n return \"App Store\";\n case CdvPurchase.Platform.GOOGLE_PLAY:\n return \"Google Play\";\n case CdvPurchase.Platform.WINDOWS_STORE:\n return \"Windows Store\";\n case CdvPurchase.Platform.BRAINTREE:\n return \"Braintree\";\n case CdvPurchase.Platform.TEST:\n return \"Test\";\n default: return platform;\n }\n }\n Utils.platformName = platformName;\n })(Utils = CdvPurchase.Utils || (CdvPurchase.Utils = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n /**\n * @internal\n */\n let Internal;\n (function (Internal) {\n /** Queue of receipts to validate */\n class ReceiptsToValidate {\n constructor() {\n this.array = [];\n }\n get length() {\n return this.array.length;\n }\n get() {\n return this.array.concat();\n }\n add(receipt) {\n if (!this.has(receipt))\n this.array.push(receipt);\n }\n clear() {\n while (this.array.length !== 0)\n this.array.pop();\n }\n has(receipt) {\n return !!this.array.find(el => el === receipt);\n }\n }\n Internal.ReceiptsToValidate = ReceiptsToValidate;\n /** Handles communication with the remote receipt validation service */\n class Validator {\n constructor(controller, log) {\n /** List of receipts waiting for validation */\n this.receiptsToValidate = new ReceiptsToValidate();\n /** List of verified receipts */\n this.verifiedReceipts = [];\n this.numRequests = 0;\n this.numResponses = 0;\n /**\n * For each md5-hashed values of the validator request's \".transaction\" field,\n * store the response from the server.\n *\n * This way, if a subsequent request is necessary (without a couple of minutes)\n * we just reuse the same data.\n */\n this.cache = {};\n this.controller = controller;\n this.log = log.child('Validator');\n }\n incrRequestsCounter() {\n this.numRequests = (this.numRequests + 1) | 0;\n this.log.debug(`Validation requests=${this.numRequests} responses=${this.numResponses}`);\n }\n incrResponsesCounter() {\n this.numResponses = (this.numResponses + 1) | 0;\n this.log.debug(`Validation requests=${this.numRequests} responses=${this.numResponses}`);\n }\n /** Add/update a verified receipt from the server response */\n addVerifiedReceipt(receipt, data) {\n for (const vr of this.verifiedReceipts) {\n if (vr.platform === receipt.platform && vr.id === data.id) {\n // update existing receipt\n this.log.debug(\"Updating existing receipt.\");\n vr.set(receipt, data);\n return vr;\n }\n }\n this.log.debug(\"Register a new verified receipt.\");\n const newVR = new CdvPurchase.VerifiedReceipt(receipt, data, this.controller);\n this.verifiedReceipts.push(newVR);\n return newVR;\n }\n /** Add a receipt to the validation queue. It'll get validated after a few milliseconds. */\n add(receiptOrTransaction) {\n this.log.debug(\"Schedule validation: \" + JSON.stringify(receiptOrTransaction));\n const receipt = (receiptOrTransaction instanceof CdvPurchase.Transaction) ? receiptOrTransaction.parentReceipt : receiptOrTransaction;\n if (!this.receiptsToValidate.has(receipt)) {\n this.incrRequestsCounter();\n this.receiptsToValidate.add(receipt);\n }\n }\n /** Run validation for all receipts in the queue */\n run() {\n // pseudo implementation\n const receipts = this.receiptsToValidate.get();\n this.receiptsToValidate.clear();\n const onResponse = (r) => __awaiter(this, void 0, void 0, function* () {\n var _a;\n const { receipt, payload } = r;\n this.incrResponsesCounter();\n try {\n const adapter = this.controller.adapters.find(receipt.platform);\n yield (adapter === null || adapter === void 0 ? void 0 : adapter.handleReceiptValidationResponse(receipt, payload));\n if (payload.ok) {\n const vr = this.addVerifiedReceipt(receipt, payload.data);\n this.controller.verifiedCallbacks.trigger(vr, 'payload_ok');\n // this.verifiedCallbacks.trigger(data.receipt);\n }\n else if (payload.code === CdvPurchase.ErrorCode.VALIDATOR_SUBSCRIPTION_EXPIRED) {\n // find the subscription in an existing verified receipt and mark as expired.\n const transactionId = (_a = receipt.lastTransaction()) === null || _a === void 0 ? void 0 : _a.transactionId;\n const vr = transactionId ? this.verifiedReceipts.find(r => { var _a; return ((_a = r.collection[0]) === null || _a === void 0 ? void 0 : _a.transactionId) === transactionId; }) : undefined;\n if (vr) {\n vr === null || vr === void 0 ? void 0 : vr.collection.forEach(col => {\n if (col.transactionId === transactionId)\n col.isExpired = true;\n });\n this.controller.verifiedCallbacks.trigger(vr, 'payload_expired');\n }\n else {\n this.controller.unverifiedCallbacks.trigger({ receipt, payload }, 'no_verified_receipt');\n }\n }\n else {\n this.controller.unverifiedCallbacks.trigger({ receipt, payload }, 'validator_error');\n }\n }\n catch (err) {\n this.log.error('Exception probably caused by an invalid response from the validator.' + err.message);\n this.controller.unverifiedCallbacks.trigger({ receipt, payload: {\n ok: false,\n code: CdvPurchase.ErrorCode.VERIFICATION_FAILED,\n message: err.message,\n } }, 'validator_exception');\n }\n });\n receipts.forEach(receipt => this.runOnReceipt(receipt, onResponse));\n }\n runOnReceipt(receipt, callback) {\n var _a, _b;\n return __awaiter(this, void 0, void 0, function* () {\n if (receipt.platform === CdvPurchase.Platform.TEST) {\n this.log.debug('Using Test Adapter mock verify function.');\n return CdvPurchase.Test.Adapter.verify(receipt, callback);\n }\n if (!this.controller.validator) {\n this.incrResponsesCounter();\n // for backward compatibility, we consider that the receipt is verified.\n callback({\n receipt,\n payload: {\n ok: true,\n data: {\n id: ((_b = (_a = receipt.transactions) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.transactionId) || 'unknown',\n latest_receipt: true,\n transaction: { type: 'test' } // dummy data\n }\n }\n });\n return;\n }\n const body = yield this.buildRequestBody(receipt);\n if (!body) {\n this.incrResponsesCounter();\n return;\n }\n if (typeof this.controller.validator === 'function')\n return this.runValidatorFunction(this.controller.validator, receipt, body, callback);\n const target = typeof this.controller.validator === 'string'\n ? {\n url: this.controller.validator,\n timeout: 20000, // validation request will timeout after 20 seconds by default\n }\n : this.controller.validator;\n return this.runValidatorRequest(target, receipt, body, callback);\n });\n }\n runValidatorFunction(validator, receipt, body, callback) {\n try {\n validator(body, (payload) => callback({ receipt, payload }));\n }\n catch (error) {\n this.log.warn(\"user provided validator function failed with error: \" + (error === null || error === void 0 ? void 0 : error.stack));\n }\n }\n buildRequestBody(receipt) {\n var _a, _b, _c;\n return __awaiter(this, void 0, void 0, function* () {\n // Let the adapter generate the initial content\n const adapter = this.controller.adapters.find(receipt.platform);\n const body = yield (adapter === null || adapter === void 0 ? void 0 : adapter.receiptValidationBody(receipt));\n if (!body)\n return;\n // Add the applicationUsername\n body.additionalData = Object.assign(Object.assign({}, (_a = body.additionalData) !== null && _a !== void 0 ? _a : {}), { applicationUsername: this.controller.getApplicationUsername() });\n if (!body.additionalData.applicationUsername)\n delete body.additionalData.applicationUsername;\n // Add device information\n body.device = Object.assign(Object.assign({}, (_b = body.device) !== null && _b !== void 0 ? _b : {}), CdvPurchase.Validator.Internal.getDeviceInfo(this.controller));\n // Add legacy pricing information\n if (((_c = body.offers) === null || _c === void 0 ? void 0 : _c.length) === 1) {\n const offer = body.offers[0];\n if (offer.pricingPhases.length === 1) {\n const pricing = offer.pricingPhases[0];\n body.currency = pricing.currency;\n body.priceMicros = pricing.priceMicros;\n }\n else if (offer.pricingPhases.length === 2) {\n const pricing = offer.pricingPhases[1];\n body.currency = pricing.currency;\n body.priceMicros = pricing.priceMicros;\n const intro = offer.pricingPhases[0];\n body.introPriceMicros = intro.priceMicros;\n }\n }\n return body;\n });\n }\n removeExpiredCache() {\n const now = +new Date();\n const deleteList = [];\n for (const hash in this.cache) {\n if (this.cache[hash].expires < now) {\n deleteList.push(hash);\n }\n }\n for (const hash of deleteList) {\n delete this.cache[hash];\n }\n }\n runValidatorRequest(target, receipt, body, callback) {\n this.removeExpiredCache();\n const bodyTransactionHash = CdvPurchase.Utils.md5(JSON.stringify(body.transaction));\n const cached = this.cache[bodyTransactionHash];\n if (cached) {\n this.log.debug(\"validator cache hit, using cached response\");\n return callback({ receipt, payload: cached.payload });\n }\n CdvPurchase.Utils.ajax(this.log.child(\"Ajax\"), {\n url: target.url,\n method: 'POST',\n customHeaders: target.headers,\n timeout: target.timeout,\n data: body,\n success: (response) => {\n var _a;\n this.log.debug(\"validator success, response: \" + JSON.stringify(response));\n if (!isValidatorResponsePayload(response))\n return callback({\n receipt,\n payload: {\n ok: false,\n code: CdvPurchase.ErrorCode.BAD_RESPONSE,\n message: 'Validator responded with invalid data',\n data: { latest_receipt: (_a = response === null || response === void 0 ? void 0 : response.data) === null || _a === void 0 ? void 0 : _a.latest_receipt },\n }\n });\n this.cache[bodyTransactionHash] = {\n payload: response,\n expires: (+new Date()) + 120000, // expires in 2 minutes\n };\n callback({ receipt, payload: response });\n },\n error: (status, message, data) => {\n var fullMessage = \"Error \" + status + \": \" + message;\n this.log.debug(\"validator failed, response: \" + JSON.stringify(fullMessage));\n this.log.debug(\"body => \" + JSON.stringify(data));\n callback({\n receipt,\n payload: {\n ok: false,\n message: fullMessage,\n code: CdvPurchase.ErrorCode.COMMUNICATION,\n status: status,\n data: {},\n }\n });\n }\n });\n }\n }\n Internal.Validator = Validator;\n /**\n * Check if a payload looks like a valid validator response.\n */\n function isValidatorResponsePayload(payload) {\n // TODO: could be made more robust.\n return (!!payload)\n && (typeof payload === 'object')\n && ('ok' in payload)\n && (typeof payload.ok === 'boolean');\n }\n })(Internal = CdvPurchase.Internal || (CdvPurchase.Internal = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n /** @internal */\n let Internal;\n (function (Internal) {\n /**\n * The list of active platform adapters\n */\n class Adapters {\n constructor() {\n /**\n * List of instantiated adapters.\n *\n * They are added to this list by \"initialize()\".\n */\n this.list = [];\n }\n add(log, adapters, context) {\n adapters.forEach(po => {\n log.info(\"\");\n if (this.find(po.platform))\n return;\n switch (po.platform) {\n case CdvPurchase.Platform.APPLE_APPSTORE:\n return this.list.push(new CdvPurchase.AppleAppStore.Adapter(context, po.options || {}));\n case CdvPurchase.Platform.GOOGLE_PLAY:\n return this.list.push(new CdvPurchase.GooglePlay.Adapter(context));\n case CdvPurchase.Platform.BRAINTREE:\n if (!po.options) {\n log.error('Options missing for Braintree initialization. Use {platform: Platform.BRAINTREE, options: {...}} in your call to store.initialize');\n }\n return this.list.push(new CdvPurchase.Braintree.Adapter(context, po.options));\n case CdvPurchase.Platform.TEST:\n return this.list.push(new CdvPurchase.Test.Adapter(context));\n default:\n return;\n }\n });\n }\n /**\n * Initialize some platform adapters.\n */\n initialize(platforms, context) {\n return __awaiter(this, void 0, void 0, function* () {\n if (typeof platforms === 'string') {\n platforms = [platforms];\n }\n const newPlatforms = platforms.map(p => typeof p === 'string' ? { platform: p } : p).filter(p => !this.find(p.platform));\n const log = context.log.child('Adapters');\n log.info(\"Adding platforms: \" + JSON.stringify(newPlatforms));\n this.add(log, newPlatforms, context);\n const products = context.registeredProducts.byPlatform();\n const result = yield Promise.all(newPlatforms.map((platformToInit) => __awaiter(this, void 0, void 0, function* () {\n var _a, _b, _c;\n const platformProducts = (_c = (_b = (_a = products.filter(p => p.platform === platformToInit.platform)) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.products) !== null && _c !== void 0 ? _c : [];\n const adapter = this.find(platformToInit.platform);\n if (!adapter)\n return;\n log.info(`${adapter.name} initializing...`);\n if (!adapter.isSupported) {\n log.info(`${adapter.name} is not supported.`);\n return; // skip unsupported adapters\n }\n const initResult = yield adapter.initialize();\n adapter.ready = true;\n log.info(`${adapter.name} initialized. ${initResult ? JSON.stringify(initResult) : ''}`);\n if (initResult === null || initResult === void 0 ? void 0 : initResult.code)\n return initResult;\n log.info(`${adapter.name} products: ${JSON.stringify(platformProducts)}`);\n if (platformProducts.length === 0)\n return;\n let loadProductsResult = [];\n let loadReceiptsResult = [];\n if (adapter.supportsParallelLoading) {\n [loadProductsResult, loadReceiptsResult] = yield Promise.all([\n adapter.loadProducts(platformProducts),\n adapter.loadReceipts()\n ]);\n }\n else {\n loadProductsResult = yield adapter.loadProducts(platformProducts);\n loadReceiptsResult = yield adapter.loadReceipts();\n }\n // const loadProductsResult = await adapter.loadProducts(platformProducts);\n log.info(`${adapter.name} products loaded: ${JSON.stringify(loadProductsResult)}`);\n const loadedProducts = loadProductsResult.filter(p => p instanceof CdvPurchase.Product);\n context.listener.productsUpdated(platformToInit.platform, loadedProducts);\n // const loadReceiptsResult = await adapter.loadReceipts();\n log.info(`${adapter.name} receipts loaded: ${JSON.stringify(loadReceiptsResult)}`);\n return loadProductsResult.filter(lr => 'code' in lr && 'message' in lr)[0];\n })));\n return result.filter(err => err);\n });\n }\n /**\n * Retrieve a platform adapter.\n */\n find(platform) {\n return this.list.filter(a => a.id === platform)[0];\n }\n /**\n * Retrieve the first platform adapter in the ready state, if any.\n *\n * You can optionally force the platform adapter you are looking for.\n *\n * Useful for methods that accept an optional \"platform\" argument, so they either act\n * on the only active adapter or on the one selected by the user, if it's ready.\n */\n findReady(platform) {\n return this.list.filter(adapter => (!platform || adapter.id === platform) && adapter.ready)[0];\n }\n }\n Internal.Adapters = Adapters;\n })(Internal = CdvPurchase.Internal || (CdvPurchase.Internal = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n let Internal;\n (function (Internal) {\n /**\n * Monitor the updates for products and receipt.\n *\n * Call the callbacks when appropriate.\n */\n class StoreAdapterListener {\n constructor(delegate, log) {\n /** The list of supported platforms, needs to be set by \"store.initialize\" */\n this.supportedPlatforms = [];\n /** Those platforms have reported that their receipts are ready */\n this.platformWithReceiptsReady = [];\n this.lastTransactionState = {};\n /** Store the listener's latest calling time (in ms) for a given transaction at a given state */\n this.lastCallTimeForState = {};\n this.updatedReceiptsToProcess = [];\n this.delegate = delegate;\n this.log = log.child('AdapterListener');\n }\n static makeTransactionToken(transaction) {\n return transaction.platform + '|' + transaction.transactionId;\n }\n /**\n * Set the list of supported platforms.\n *\n * Called by the store when it is initialized.\n */\n setSupportedPlatforms(platforms) {\n this.log.debug(`setSupportedPlatforms: ${platforms.join(',')} (${this.platformWithReceiptsReady.length} have their receipts ready)`);\n this.supportedPlatforms = platforms;\n if (this.supportedPlatforms.length === this.platformWithReceiptsReady.length) {\n this.log.debug('triggering receiptsReady()');\n this.delegate.receiptsReadyCallbacks.trigger(undefined, 'adapterListener_setSupportedPlatforms');\n }\n }\n /**\n * Trigger the \"receiptsReady\" event when all platforms have reported that their receipts are ready.\n *\n * This function is used by adapters to report that their receipts are ready.\n * Once all adapters have reported their receipts, the \"receiptsReady\" event is triggered.\n *\n * @param platform The platform that has its receipts ready.\n */\n receiptsReady(platform) {\n if (this.supportedPlatforms.length > 0 && this.platformWithReceiptsReady.length === this.supportedPlatforms.length) {\n this.log.debug('receiptsReady: ' + platform + '(skipping)');\n return;\n }\n if (this.platformWithReceiptsReady.indexOf(platform) < 0) {\n this.platformWithReceiptsReady.push(platform);\n this.log.debug(`receiptsReady: ${platform} (${this.platformWithReceiptsReady.length}/${this.supportedPlatforms.length})`);\n if (this.platformWithReceiptsReady.length === this.supportedPlatforms.length) {\n this.log.debug('triggering receiptsReady()');\n this.delegate.receiptsReadyCallbacks.trigger(undefined, 'adapterListener_receiptsReady');\n }\n }\n }\n /**\n * Trigger the \"updated\" event for each product.\n */\n productsUpdated(platform, products) {\n products.forEach(product => this.delegate.updatedCallbacks.trigger(product, 'adapterListener_productsUpdated'));\n }\n /**\n * Triggers the \"approved\", \"pending\" and \"finished\" events for transactions.\n *\n * - \"approved\" is triggered only if it hasn't been called for the same transaction in the last 5 seconds.\n * - \"finished\" and \"pending\" are triggered only if the transaction state has changed.\n *\n * @param platform The platform that has its receipts updated.\n * @param receipts The receipts that have been updated.\n */\n receiptsUpdated(platform, receipts) {\n this.log.debug(\"receiptsUpdated: \" + JSON.stringify(receipts.map(r => ({\n platform: r.platform,\n transactions: r.transactions,\n }))));\n for (const receipt of receipts) {\n if (this.updatedReceiptsToProcess.indexOf(receipt) < 0) {\n this.updatedReceiptsToProcess.push(receipt);\n }\n }\n if (this.updatedReceiptsProcessor !== undefined) {\n clearTimeout(this.updatedReceiptsProcessor);\n }\n this.updatedReceiptsProcessor = setTimeout(() => {\n this._processUpdatedReceipts();\n }, 500);\n }\n _processUpdatedReceipts() {\n this.log.debug(\"processing \" + this.updatedReceiptsToProcess.length + \" updated receipts\");\n const now = +new Date();\n const receipts = this.updatedReceiptsToProcess;\n this.updatedReceiptsToProcess = [];\n receipts.forEach(receipt => {\n this.delegate.updatedReceiptCallbacks.trigger(receipt, 'adapterListener_receiptsUpdated');\n receipt.transactions.forEach(transaction => {\n var _a;\n const transactionToken = StoreAdapterListener.makeTransactionToken(transaction);\n const tokenWithState = transactionToken + '@' + transaction.state;\n const lastState = this.lastTransactionState[transactionToken];\n // Retrigger \"approved\", so validation is rerun on potential update.\n if (transaction.state === CdvPurchase.TransactionState.APPROVED) {\n // prevent calling approved twice in a very short period (60 seconds).\n const lastCalled = (_a = this.lastCallTimeForState[tokenWithState]) !== null && _a !== void 0 ? _a : 0;\n if (now - lastCalled > 60000) {\n this.lastCallTimeForState[tokenWithState] = now;\n this.delegate.approvedCallbacks.trigger(transaction, 'adapterListener_receiptsUpdated_approved');\n }\n else {\n this.log.debug(`Skipping ${tokenWithState}, because it has been last called ${lastCalled > 0 ? Math.round(now - lastCalled) + 'ms ago (' + now + '-' + lastCalled + ')' : 'never'}`);\n }\n }\n else if (lastState !== transaction.state) {\n if (transaction.state === CdvPurchase.TransactionState.INITIATED) {\n this.lastCallTimeForState[tokenWithState] = now;\n this.delegate.initiatedCallbacks.trigger(transaction, 'adapterListener_receiptsUpdated_initiated');\n }\n else if (transaction.state === CdvPurchase.TransactionState.FINISHED) {\n this.lastCallTimeForState[tokenWithState] = now;\n this.delegate.finishedCallbacks.trigger(transaction, 'adapterListener_receiptsUpdated_finished');\n }\n else if (transaction.state === CdvPurchase.TransactionState.PENDING) {\n this.lastCallTimeForState[tokenWithState] = now;\n this.delegate.pendingCallbacks.trigger(transaction, 'adapterListener_receiptsUpdated_pending');\n }\n }\n this.lastTransactionState[transactionToken] = transaction.state;\n });\n });\n }\n }\n Internal.StoreAdapterListener = StoreAdapterListener;\n })(Internal = CdvPurchase.Internal || (CdvPurchase.Internal = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n let Internal;\n (function (Internal) {\n /**\n * Manage a list of callbacks\n */\n class Callbacks {\n /**\n * @param className - Type of callbacks (used to help with debugging)\n * @param finalStateMode - If true, newly registered callbacks will be called immediately when the event was already triggered.\n */\n constructor(logger, className, finalStateMode = false) {\n /** List of registered callbacks */\n this.callbacks = [];\n /** Number of times those callbacks have been triggered */\n this.numTriggers = 0;\n this.logger = logger;\n this.className = className;\n this.finalStateMode = finalStateMode;\n }\n /** Add a callback to the list */\n push(callback, callbackName) {\n if (this.finalStateMode && this.numTriggers > 0) {\n callback(this.lastTriggerArgument);\n }\n else {\n // Detecting double registration to help with debugging issues\n for (const existing of this.callbacks) {\n if (existing.callback === callback) {\n throw new Error('REGISTERING THE SAME CALLBACK TWICE? This is indicative of a bug in your integration.');\n }\n }\n this.callbacks.push({ callback, callbackName });\n }\n }\n /** Call all registered callbacks with the given value */\n trigger(value, reason) {\n this.lastTriggerArgument = value;\n this.numTriggers++;\n const callbacks = this.callbacks;\n if (this.finalStateMode) {\n // in final state mode, callbacks are only triggered once\n this.callbacks = [];\n }\n callbacks.forEach(callback => {\n CdvPurchase.Utils.safeCall(this.logger, this.className, callback.callback, value, callback.callbackName, reason);\n });\n }\n /** Remove a callback from the list */\n remove(callback) {\n this.callbacks = this.callbacks.filter(el => el.callback !== callback);\n }\n }\n Internal.Callbacks = Callbacks;\n })(Internal = CdvPurchase.Internal || (CdvPurchase.Internal = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n /** @internal */\n let Internal;\n (function (Internal) {\n /**\n * Ready callbacks\n */\n class ReadyCallbacks {\n constructor(logger) {\n /** True when the plugin is ready */\n this.isReady = false;\n /** Callbacks when the store is ready */\n this.readyCallbacks = [];\n this.logger = logger;\n }\n /** Register a callback to be called when the plugin is ready. */\n add(cb) {\n if (this.isReady)\n return setTimeout(cb, 0);\n this.readyCallbacks.push(cb);\n }\n /** Calls the ready callbacks */\n trigger(reason) {\n this.isReady = true;\n this.readyCallbacks.forEach(cb => CdvPurchase.Utils.safeCall(this.logger, 'ready()', cb, undefined, undefined, reason));\n this.readyCallbacks = [];\n }\n remove(cb) {\n this.readyCallbacks = this.readyCallbacks.filter(el => el !== cb);\n }\n }\n Internal.ReadyCallbacks = ReadyCallbacks;\n })(Internal = CdvPurchase.Internal || (CdvPurchase.Internal = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n let Internal;\n (function (Internal) {\n function isValidRegisteredProduct(product) {\n if (typeof product !== 'object')\n return false;\n return product.hasOwnProperty('platform')\n && product.hasOwnProperty('id')\n && product.hasOwnProperty('type');\n }\n class RegisteredProducts {\n constructor() {\n this.list = [];\n }\n find(platform, id) {\n return this.list.find(rp => rp.platform === platform && rp.id === id);\n }\n add(product) {\n const errors = [];\n const products = Array.isArray(product) ? product : [product];\n const newProducts = products.filter(p => !this.find(p.platform, p.id));\n for (const p of newProducts) {\n if (isValidRegisteredProduct(p))\n this.list.push(p);\n else\n errors.push(CdvPurchase.storeError(CdvPurchase.ErrorCode.LOAD, 'Invalid parameter to \"register\", expected \"id\", \"type\" and \"platform\". '\n + 'Got: ' + JSON.stringify(p), null, null));\n }\n return errors;\n }\n byPlatform() {\n const byPlatform = {};\n this.list.forEach(p => {\n byPlatform[p.platform] = (byPlatform[p.platform] || []).concat(p);\n });\n return Object.keys(byPlatform).map(platform => ({\n platform: platform,\n products: byPlatform[platform]\n }));\n }\n }\n Internal.RegisteredProducts = RegisteredProducts;\n })(Internal = CdvPurchase.Internal || (CdvPurchase.Internal = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n /** @internal */\n let Internal;\n (function (Internal) {\n /**\n * Helper class to monitor changes in transaction states.\n *\n * @example\n * const monitor = monitors.start(transaction, (state) => {\n * // ... transaction state has changed\n * });\n * monitor.stop();\n */\n class TransactionStateMonitors {\n constructor(when) {\n this.monitors = [];\n this.isListening = false;\n this.when = when;\n }\n findMonitors(transaction) {\n return this.monitors.filter(monitor => monitor.transaction.platform === transaction.platform\n && monitor.transaction.transactionId === transaction.transactionId);\n }\n startListening() {\n if (this.isListening) {\n return;\n }\n this.isListening = true;\n this.when\n .approved(transaction => this.callOnChange(transaction), 'transactionStateMonitors_callOnChange')\n .finished(transaction => this.callOnChange(transaction), 'transactionStateMonitors_callOnChange');\n }\n callOnChange(transaction) {\n this.findMonitors(transaction).forEach(monitor => {\n if (monitor.lastChange !== transaction.state) {\n monitor.lastChange = transaction.state;\n monitor.onChange(transaction.state);\n }\n });\n }\n /**\n * Start monitoring the provided transaction for state changes.\n */\n start(transaction, onChange) {\n this.startListening();\n const monitorId = CdvPurchase.Utils.uuidv4();\n this.monitors.push({ monitorId, transaction, onChange, lastChange: transaction.state });\n setTimeout(onChange, 0, transaction.state);\n return {\n transaction,\n stop: () => this.stop(monitorId),\n };\n }\n stop(monitorId) {\n this.monitors = this.monitors.filter(m => m.monitorId !== monitorId);\n }\n }\n Internal.TransactionStateMonitors = TransactionStateMonitors;\n })(Internal = CdvPurchase.Internal || (CdvPurchase.Internal = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n let Internal;\n (function (Internal) {\n class ReceiptsMonitor {\n constructor(controller) {\n this.hasCalledReceiptsVerified = false;\n this.controller = controller;\n this.log = controller.log.child('ReceiptsMonitor');\n }\n callReceiptsVerified() {\n if (this.hasCalledReceiptsVerified)\n return;\n this.hasCalledReceiptsVerified = true;\n this.log.info('receiptsVerified()');\n // ensure those 2 events are called in order.\n this.controller.when().receiptsReady(() => {\n setTimeout(() => {\n this.controller.receiptsVerified();\n }, 0);\n }, 'receiptsMonitor_callReceiptsVerified');\n }\n launch() {\n const check = () => {\n this.log.debug(`check(${this.controller.numValidationResponses()}/${this.controller.numValidationRequests()})`);\n if (this.controller.numValidationRequests() === this.controller.numValidationResponses()) {\n if (this.intervalChecker !== undefined) {\n clearInterval(this.intervalChecker);\n this.intervalChecker = undefined;\n }\n this.controller.off(check);\n this.callReceiptsVerified();\n }\n };\n this.controller.when()\n .verified(check, 'receiptsMonitor_check')\n .unverified(check, 'receiptsMonitor_check')\n .receiptsReady(() => {\n this.log.debug('receiptsReady...');\n if (!this.controller.hasLocalReceipts() || !this.controller.hasValidator()) {\n setTimeout(() => {\n check();\n }, 0);\n }\n // check every 10s, to handle cases where neither \"verified\" nor \"unverified\" have been triggered.\n this.intervalChecker = setInterval(() => {\n this.log.debug('keep checking every 10s...');\n check();\n }, 10000);\n }, 'receiptsMonitor_setup');\n }\n }\n Internal.ReceiptsMonitor = ReceiptsMonitor;\n })(Internal = CdvPurchase.Internal || (CdvPurchase.Internal = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n let Internal;\n (function (Internal) {\n /**\n * Send a notification when a subscription expires.\n *\n * The platform doesn't send notifications when a subscription expires.\n *\n * However this is useful, so let's do just that.\n */\n class ExpiryMonitor {\n /** Track active local transactions */\n // activeTransactions: {\n // [transactionId: string]: true;\n // } = {};\n /** Track notified local transactions */\n // notifiedTransactions: {\n // [transactionId: string]: true;\n // } = {};\n constructor(controller) {\n /** Track active verified purchases */\n this.activePurchases = {};\n /** Track notified verified purchases */\n this.notifiedPurchases = {};\n this.controller = controller;\n }\n launch() {\n this.interval = setInterval(() => {\n var _a, _b;\n const now = +new Date();\n // Check for verified purchases expiry\n for (const receipt of this.controller.verifiedReceipts) {\n const gracePeriod = (_a = ExpiryMonitor.GRACE_PERIOD_MS[receipt.platform]) !== null && _a !== void 0 ? _a : ExpiryMonitor.GRACE_PERIOD_MS.DEFAULT;\n for (const purchase of receipt.collection) {\n if (purchase.expiryDate) {\n const expiryDate = purchase.expiryDate + gracePeriod;\n const transactionId = (_b = purchase.transactionId) !== null && _b !== void 0 ? _b : `${expiryDate}`;\n if (expiryDate > now) {\n this.activePurchases[transactionId] = true;\n }\n if (expiryDate < now && this.activePurchases[transactionId] && !this.notifiedPurchases[transactionId]) {\n this.notifiedPurchases[transactionId] = true;\n this.controller.onVerifiedPurchaseExpired(purchase, receipt);\n }\n }\n }\n }\n // Check for local purchases expiry\n // for (const receipt of this.controller.localReceipts) {\n // for (const transaction of receipt.transactions) {\n // if (transaction.expirationDate) {\n // const expirationDate = +transaction.expirationDate + ExpiryMonitor.GRACE_PERIOD_MS;\n // const transactionId = transaction.transactionId ?? `${expirationDate}`;\n // if (expirationDate > now) {\n // this.activeTransactions[transactionId] = true;\n // }\n // if (expirationDate < now && this.activeTransactions[transactionId] && !this.notifiedTransactions[transactionId]) {\n // this.notifiedTransactions[transactionId] = true;\n // this.controller.onTransactionExpired(transaction);\n // }\n // }\n // }\n // }\n }, ExpiryMonitor.INTERVAL_MS);\n }\n }\n /** Time between checks for newly expired subscriptions */\n ExpiryMonitor.INTERVAL_MS = 10000;\n /**\n * Extra time until re-validating an expired subscription.\n *\n * The platform will take unspecified amount of time to report the renewal via their APIs.\n * Values below have been selected via trial-and-error, might require tweaking.\n */\n ExpiryMonitor.GRACE_PERIOD_MS = {\n DEFAULT: 60000,\n \"ios-appstore\": 60000,\n \"android-playstore\": 30000,\n };\n Internal.ExpiryMonitor = ExpiryMonitor;\n })(Internal = CdvPurchase.Internal || (CdvPurchase.Internal = {}));\n})(CdvPurchase || (CdvPurchase = {}));\n/// <reference path=\"types.ts\" />\n/// <reference path=\"utils/compatibility.ts\" />\n/// <reference path=\"utils/platform-name.ts\" />\n/// <reference path=\"validator/validator.ts\" />\n/// <reference path=\"log.ts\" />\n/// <reference path=\"internal/adapters.ts\" />\n/// <reference path=\"internal/adapter-listener.ts\" />\n/// <reference path=\"internal/callbacks.ts\" />\n/// <reference path=\"internal/ready.ts\" />\n/// <reference path=\"internal/register.ts\" />\n/// <reference path=\"internal/transaction-monitor.ts\" />\n/// <reference path=\"internal/receipts-monitor.ts\" />\n/// <reference path=\"internal/expiry-monitor.ts\" />\n/**\n * Namespace for the cordova-plugin-purchase plugin.\n *\n * All classes, enumerations and variables defined by the plugin are in this namespace.\n *\n * Throughout the documentation, in order to keep examples readable, we omit the `CdvPurchase` prefix.\n *\n * When you see, for example `ProductType.PAID_SUBSCRIPTION`, it refers to `CdvPurchase.ProductType.PAID_SUBSCRIPTION`.\n *\n * In the files that interact with the plugin, I recommend creating those shortcuts (and more if needed):\n *\n * ```ts\n * const {store, ProductType, Platform, LogLevel} = CdvPurchase;\n * ```\n */\nvar CdvPurchase;\n(function (CdvPurchase) {\n /**\n * Current release number of the plugin.\n */\n CdvPurchase.PLUGIN_VERSION = '13.12.1';\n /**\n * Entry class of the plugin.\n */\n class Store {\n constructor() {\n /**\n * Payment platform adapters.\n */\n this.adapters = new CdvPurchase.Internal.Adapters();\n /**\n * List of registered products.\n *\n * Products are added to this list of products by {@link Store.register}, an internal job will defer loading to the platform adapters.\n */\n this.registeredProducts = new CdvPurchase.Internal.RegisteredProducts();\n /** Logger */\n this.log = new CdvPurchase.Logger(this);\n /**\n * Verbosity level used by the plugin logger\n *\n * Set to:\n *\n * - LogLevel.QUIET or 0 to disable all logging (default)\n * - LogLevel.ERROR or 1 to show only error messages\n * - LogLevel.WARNING or 2 to show warnings and errors\n * - LogLevel.INFO or 3 to also show information messages\n * - LogLevel.DEBUG or 4 to enable internal debugging messages.\n *\n * @see {@link LogLevel}\n */\n this.verbosity = CdvPurchase.LogLevel.ERROR;\n /** List of callbacks for the \"ready\" events */\n this._readyCallbacks = new CdvPurchase.Internal.ReadyCallbacks(this.log);\n /** Callbacks when a product definition was updated */\n this.updatedCallbacks = new CdvPurchase.Internal.Callbacks(this.log, 'productUpdated()');\n /** Callback when a receipt was updated */\n this.updatedReceiptsCallbacks = new CdvPurchase.Internal.Callbacks(this.log, 'receiptUpdated()');\n /** Callbacks when a product is owned */\n // private ownedCallbacks = new Callbacks<Product>();\n /** Callbacks when a transaction is initiated */\n this.initiatedCallbacks = new CdvPurchase.Internal.Callbacks(this.log, 'initiated()');\n /** Callbacks when a transaction has been approved */\n this.approvedCallbacks = new CdvPurchase.Internal.Callbacks(this.log, 'approved()');\n /** Callbacks when a transaction has been finished */\n this.finishedCallbacks = new CdvPurchase.Internal.Callbacks(this.log, 'finished()');\n /** Callbacks when a transaction is pending */\n this.pendingCallbacks = new CdvPurchase.Internal.Callbacks(this.log, 'pending()');\n /** Callbacks when a receipt has been validated */\n this.verifiedCallbacks = new CdvPurchase.Internal.Callbacks(this.log, 'verified()');\n /** Callbacks when a receipt has been validated */\n this.unverifiedCallbacks = new CdvPurchase.Internal.Callbacks(this.log, 'unverified()');\n /** Callbacks when all receipts have been loaded */\n this.receiptsReadyCallbacks = new CdvPurchase.Internal.Callbacks(this.log, 'receiptsReady()', true);\n /** Callbacks when all receipts have been verified */\n this.receiptsVerifiedCallbacks = new CdvPurchase.Internal.Callbacks(this.log, 'receiptsVerified()', true);\n /** Callbacks for errors */\n this.errorCallbacks = new CdvPurchase.Internal.Callbacks(this.log, 'error()');\n this.initializedHasBeenCalled = false;\n /** Stores the last time the store was updated (or initialized), to skip calls in quick succession. */\n this.lastUpdate = 0;\n /**\n * Avoid invoking store.update() if the most recent call occurred within this specific number of milliseconds.\n */\n this.minTimeBetweenUpdates = 600000;\n /**\n * Version of the plugin currently installed.\n */\n this.version = CdvPurchase.PLUGIN_VERSION;\n const store = this;\n this.listener = new CdvPurchase.Internal.StoreAdapterListener({\n updatedCallbacks: this.updatedCallbacks,\n updatedReceiptCallbacks: this.updatedReceiptsCallbacks,\n initiatedCallbacks: this.initiatedCallbacks,\n approvedCallbacks: this.approvedCallbacks,\n finishedCallbacks: this.finishedCallbacks,\n pendingCallbacks: this.pendingCallbacks,\n receiptsReadyCallbacks: this.receiptsReadyCallbacks,\n }, this.log);\n this.transactionStateMonitors = new CdvPurchase.Internal.TransactionStateMonitors(this.when());\n this._validator = new CdvPurchase.Internal.Validator({\n adapters: this.adapters,\n getApplicationUsername: this.getApplicationUsername.bind(this),\n get localReceipts() { return store.localReceipts; },\n get validator() { return store.validator; },\n get validator_privacy_policy() { return store.validator_privacy_policy; },\n verifiedCallbacks: this.verifiedCallbacks,\n unverifiedCallbacks: this.unverifiedCallbacks,\n finish: (receipt) => this.finish(receipt),\n }, this.log);\n new CdvPurchase.Internal.ReceiptsMonitor({\n hasLocalReceipts: () => this.localReceipts.length > 0,\n hasValidator: () => !!this.validator,\n numValidationRequests: () => this._validator.numRequests,\n numValidationResponses: () => this._validator.numResponses,\n off: this.off.bind(this),\n when: this.when.bind(this),\n receiptsVerified: () => { store.receiptsVerifiedCallbacks.trigger(undefined, 'receipts_monitor_controller'); },\n log: this.log,\n }).launch();\n this.expiryMonitor = new CdvPurchase.Internal.ExpiryMonitor({\n // get localReceipts() { return store.localReceipts; },\n get verifiedReceipts() { return store.verifiedReceipts; },\n // onTransactionExpired(transaction) {\n // store.approvedCallbacks.trigger(transaction);\n // },\n onVerifiedPurchaseExpired(verifiedPurchase, receipt) {\n store.verify(receipt.sourceReceipt);\n },\n });\n this.expiryMonitor.launch();\n }\n /**\n * Retrieve a platform adapter.\n *\n * The platform adapter has to have been initialized before.\n *\n * @see {@link initialize}\n */\n getAdapter(platform) {\n return this.adapters.find(platform);\n }\n /**\n * Get the application username as a string by either calling or returning {@link Store.applicationUsername}\n */\n getApplicationUsername() {\n if (this.applicationUsername instanceof Function)\n return this.applicationUsername();\n return this.applicationUsername;\n }\n /**\n * Register a product.\n *\n * @example\n * store.register([{\n * id: 'subscription1',\n * type: ProductType.PAID_SUBSCRIPTION,\n * platform: Platform.APPLE_APPSTORE,\n * }, {\n * id: 'subscription1',\n * type: ProductType.PAID_SUBSCRIPTION,\n * platform: Platform.GOOGLE_PLAY,\n * }, {\n * id: 'consumable1',\n * type: ProductType.CONSUMABLE,\n * platform: Platform.BRAINTREE,\n * }]);\n */\n register(product) {\n const errors = this.registeredProducts.add(product);\n errors.forEach(error => {\n CdvPurchase.store.errorCallbacks.trigger(error, 'register_error');\n this.log.error(error);\n });\n }\n /**\n * Call to initialize the in-app purchase plugin.\n *\n * @param platforms - List of payment platforms to initialize, default to Store.defaultPlatform().\n */\n initialize(platforms = [this.defaultPlatform()]) {\n return __awaiter(this, void 0, void 0, function* () {\n if (this.initializedHasBeenCalled) {\n this.log.warn('store.initialized() has been called already.');\n return [];\n }\n this.log.info('initialize(' + JSON.stringify(platforms) + ') v' + CdvPurchase.PLUGIN_VERSION);\n this.initializedHasBeenCalled = true;\n this.lastUpdate = +new Date();\n const store = this;\n const ret = this.adapters.initialize(platforms, {\n error: this.triggerError.bind(this),\n get verbosity() { return store.verbosity; },\n getApplicationUsername() { return store.getApplicationUsername(); },\n get listener() { return store.listener; },\n get log() { return store.log; },\n get registeredProducts() { return store.registeredProducts; },\n apiDecorators: {\n canPurchase: this.canPurchase.bind(this),\n owned: this.owned.bind(this),\n finish: this.finish.bind(this),\n order: this.order.bind(this),\n verify: this.verify.bind(this),\n },\n });\n ret.then(() => {\n this._readyCallbacks.trigger('initialize_promise_resolved');\n this.listener.setSupportedPlatforms(this.adapters.list.filter(a => a.isSupported).map(a => a.id));\n });\n return ret;\n });\n }\n /**\n * @deprecated - use store.initialize(), store.update() or store.restorePurchases()\n */\n refresh() {\n throw new Error(\"use store.initialize() or store.update()\");\n }\n /**\n * Call to refresh the price of products and status of purchases.\n */\n update() {\n var _a;\n return __awaiter(this, void 0, void 0, function* () {\n this.log.info('update()');\n if (!this._readyCallbacks.isReady) {\n this.log.warn('Do not call store.update() at startup! It is meant to reload the price of products (if needed) long after initialization.');\n return;\n }\n const now = +new Date();\n if (this.lastUpdate > now - this.minTimeBetweenUpdates) {\n this.log.info('Skipping store.update() as the last call occurred less than store.minTimeBetweenUpdates millis ago.');\n return;\n }\n this.lastUpdate = now;\n // Load products metadata\n for (const registration of this.registeredProducts.byPlatform()) {\n const products = yield ((_a = this.adapters.findReady(registration.platform)) === null || _a === void 0 ? void 0 : _a.loadProducts(registration.products));\n products === null || products === void 0 ? void 0 : products.forEach(p => {\n if (p instanceof CdvPurchase.Product)\n this.updatedCallbacks.trigger(p, 'update_has_loaded_products');\n });\n }\n });\n }\n /**\n * Register a callback to be called when the plugin is ready.\n *\n * This happens when all the platforms are initialized and their products loaded.\n */\n ready(cb) { this._readyCallbacks.add(cb); }\n /** true if the plugin is initialized and ready */\n get isReady() { return this._readyCallbacks.isReady; }\n /**\n * Register event callbacks.\n *\n * Events overview:\n * - `productUpdated`: Called when product metadata is loaded from the store\n * - `receiptUpdated`: Called when local receipt information changes (ownership status change, for example)\n * - `verified`: Called after successful receipt validation (requires a receipt validator)\n *\n * @example\n * // Monitor ownership with receipt validation\n * store.when()\n * .approved(transaction => transaction.verify())\n * .verified(receipt => {\n * if (store.owned(\"my-product\")) {\n * // Product is owned and verified\n * }\n * });\n *\n * @example\n * // Monitor ownership without receipt validation\n * store.when().receiptUpdated(receipt => {\n * if (store.owned(\"my-product\")) {\n * // Product is owned according to local data\n * }\n * });\n */\n when() {\n const ret = {\n productUpdated: (cb, callbackName) => (this.updatedCallbacks.push(cb, callbackName), ret),\n receiptUpdated: (cb, callbackName) => (this.updatedReceiptsCallbacks.push(cb, callbackName), ret),\n updated: (cb, callbackName) => (this.updatedCallbacks.push(cb, callbackName), this.updatedReceiptsCallbacks.push(cb, callbackName), ret),\n // owned: (cb: Callback<Product>) => (this.ownedCallbacks.push(cb), ret),\n approved: (cb, callbackName) => (this.approvedCallbacks.push(cb, callbackName), ret),\n initiated: (cb, callbackName) => (this.initiatedCallbacks.push(cb, callbackName), ret),\n pending: (cb, callbackName) => (this.pendingCallbacks.push(cb, callbackName), ret),\n finished: (cb, callbackName) => (this.finishedCallbacks.push(cb, callbackName), ret),\n verified: (cb, callbackName) => (this.verifiedCallbacks.push(cb, callbackName), ret),\n unverified: (cb, callbackName) => (this.unverifiedCallbacks.push(cb, callbackName), ret),\n receiptsReady: (cb, callbackName) => (this.receiptsReadyCallbacks.push(cb, callbackName), ret),\n receiptsVerified: (cb, callbackName) => (this.receiptsVerifiedCallbacks.push(cb, callbackName), ret),\n };\n return ret;\n }\n /**\n * Remove a callback from any listener it might have been added to.\n */\n off(callback) {\n this.updatedCallbacks.remove(callback);\n this.updatedReceiptsCallbacks.remove(callback);\n this.approvedCallbacks.remove(callback);\n this.finishedCallbacks.remove(callback);\n this.pendingCallbacks.remove(callback);\n this.verifiedCallbacks.remove(callback);\n this.unverifiedCallbacks.remove(callback);\n this.receiptsReadyCallbacks.remove(callback);\n this.receiptsVerifiedCallbacks.remove(callback);\n this.errorCallbacks.remove(callback);\n this._readyCallbacks.remove(callback);\n }\n /**\n * Setup a function to be notified of changes to a transaction state.\n *\n * @param transaction The transaction to monitor.\n * @param onChange Function to be called when the transaction status changes.\n * @return A monitor which can be stopped with `monitor.stop()`\n *\n * @example\n * const monitor = store.monitor(transaction, state => {\n * console.log('new state: ' + state);\n * if (state === TransactionState.FINISHED)\n * monitor.stop();\n * });\n */\n monitor(transaction, onChange, callbackName) {\n return this.transactionStateMonitors.start(transaction, CdvPurchase.Utils.safeCallback(this.log, 'monitor()', onChange, callbackName, 'transactionStateMonitors_stateChanged'));\n }\n /**\n * List of all active products.\n *\n * Products are active if their details have been successfully loaded from the store.\n */\n get products() {\n // concatenate products all all active platforms\n return [].concat(...this.adapters.list.map(a => a.products));\n }\n /**\n * Find a product from its id and platform\n *\n * @param productId Product identifier on the platform.\n * @param platform The product the product exists in. Can be omitted if you're only using a single payment platform.\n */\n get(productId, platform) {\n var _a;\n return (_a = this.adapters.findReady(platform)) === null || _a === void 0 ? void 0 : _a.products.find(p => p.id === productId);\n }\n /**\n * List of all receipts present on the device.\n */\n get localReceipts() {\n // concatenate products all all active platforms\n return [].concat(...this.adapters.list.map(a => a.receipts));\n }\n /** List of all transaction from the local receipts. */\n get localTransactions() {\n const ret = [];\n for (const receipt of this.localReceipts) {\n ret.push(...receipt.transactions);\n }\n return ret;\n }\n /**\n * List of receipts verified with the receipt validation service.\n *\n * Those receipt contains more information and are generally more up-to-date than the local ones.\n */\n get verifiedReceipts() {\n return this._validator.verifiedReceipts;\n }\n /**\n * List of all purchases from the verified receipts.\n */\n get verifiedPurchases() {\n return CdvPurchase.Internal.VerifiedReceipts.getVerifiedPurchases(this.verifiedReceipts);\n }\n /**\n * Find the last verified purchase for a given product, from those verified by the receipt validator.\n */\n findInVerifiedReceipts(product) {\n return CdvPurchase.Internal.VerifiedReceipts.find(this.verifiedReceipts, product);\n }\n /**\n * Find the latest transaction for a given product, from those reported by the device.\n */\n findInLocalReceipts(product) {\n return CdvPurchase.Internal.LocalReceipts.find(this.localReceipts, product);\n }\n /** Return true if a product or offer can be purchased */\n canPurchase(offer) {\n const product = (offer instanceof CdvPurchase.Offer) ? this.get(offer.productId, offer.platform) : offer;\n const adapter = this.adapters.findReady(offer.platform);\n if (!(adapter === null || adapter === void 0 ? void 0 : adapter.checkSupport('order')))\n return false;\n return CdvPurchase.Internal.LocalReceipts.canPurchase(this.localReceipts, product);\n }\n /**\n * Return true if a product is owned\n *\n * Important: The value will be false when the app starts and will only become\n * true after purchase receipts have been loaded and validated. Without receipt validation,\n * it might remain false depending on the platform, make sure to store the ownership status\n * of non-consumable products in some way.\n *\n * @param product - The product object or identifier of the product.\n */\n owned(product) {\n return CdvPurchase.Internal.owned({\n product: typeof product === 'string' ? { id: product } : product,\n verifiedReceipts: this.validator ? this.verifiedReceipts : undefined,\n localReceipts: this.localReceipts,\n });\n }\n /**\n * Place an order for a given offer.\n */\n order(offer, additionalData) {\n return __awaiter(this, void 0, void 0, function* () {\n this.log.info(`order(${offer.productId})`);\n const adapter = this.adapters.findReady(offer.platform);\n if (!adapter)\n return CdvPurchase.storeError(CdvPurchase.ErrorCode.PAYMENT_NOT_ALLOWED, 'Adapter not found or not ready (' + offer.platform + ')', offer.platform, null);\n const ret = yield adapter.order(offer, additionalData || {});\n if (ret && 'isError' in ret)\n CdvPurchase.store.triggerError(ret);\n return ret;\n });\n }\n /**\n * Request a payment.\n *\n * A payment is a custom amount to charge the user. Make sure the selected payment platform\n * supports Payment Requests.\n *\n * @param paymentRequest Parameters of the payment request\n * @param additionalData Additional parameters\n */\n requestPayment(paymentRequest, additionalData) {\n var _a, _b, _c, _d, _e;\n const adapter = this.adapters.findReady(paymentRequest.platform);\n if (!adapter)\n return CdvPurchase.PaymentRequestPromise.failed(CdvPurchase.ErrorCode.PAYMENT_NOT_ALLOWED, 'Adapter not found or not ready (' + paymentRequest.platform + ')', paymentRequest.platform, null);\n // fill-in missing total amount as the sum of all items.\n if (!paymentRequest.amountMicros) {\n paymentRequest.amountMicros = 0;\n for (const item of paymentRequest.items) {\n paymentRequest.amountMicros += (_b = (_a = item === null || item === void 0 ? void 0 : item.pricing) === null || _a === void 0 ? void 0 : _a.priceMicros) !== null && _b !== void 0 ? _b : 0;\n }\n }\n // fill-in the missing if set in the items.\n if (!paymentRequest.currency) {\n for (const item of paymentRequest.items) {\n if ((_c = item === null || item === void 0 ? void 0 : item.pricing) === null || _c === void 0 ? void 0 : _c.currency) {\n paymentRequest.currency = item.pricing.currency;\n }\n }\n }\n else {\n for (const item of paymentRequest.items) {\n if ((_d = item === null || item === void 0 ? void 0 : item.pricing) === null || _d === void 0 ? void 0 : _d.currency) {\n if (paymentRequest.currency !== item.pricing.currency) {\n return CdvPurchase.PaymentRequestPromise.failed(CdvPurchase.ErrorCode.PAYMENT_INVALID, 'Currencies do not match', paymentRequest.platform, item.id);\n }\n }\n else if (item === null || item === void 0 ? void 0 : item.pricing) {\n item.pricing.currency = paymentRequest.currency;\n }\n }\n }\n // fill-in item amount when there's just 1 item.\n if (paymentRequest.items.length === 1) {\n const item = paymentRequest.items[0];\n if (item && !item.pricing) {\n item.pricing = {\n priceMicros: (_e = paymentRequest.amountMicros) !== null && _e !== void 0 ? _e : 0,\n currency: paymentRequest.currency,\n };\n }\n }\n const promise = new CdvPurchase.PaymentRequestPromise();\n adapter.requestPayment(paymentRequest, additionalData).then(result => {\n promise.trigger(result);\n if (result instanceof CdvPurchase.Transaction) {\n const onStateChange = (state) => {\n promise.trigger(result);\n if (result.state === CdvPurchase.TransactionState.FINISHED)\n monitor.stop();\n };\n const monitor = this.monitor(result, onStateChange, 'requestPayment_onStateChange');\n }\n });\n return promise;\n }\n /**\n * Returns true if a platform supports the requested functionality.\n *\n * @example\n * store.checkSupport(Platform.APPLE_APPSTORE, 'requestPayment');\n * // => false\n */\n checkSupport(platform, functionality) {\n const adapter = this.adapters.find(platform);\n if (!adapter)\n return false; // the selected adapter hasn't been initialized\n return adapter.checkSupport(functionality);\n }\n /**\n * Verify a receipt or transacting with the receipt validation service.\n *\n * This will be called from the Receipt or Transaction objects using the API decorators.\n */\n verify(receiptOrTransaction) {\n return __awaiter(this, void 0, void 0, function* () {\n this.log.info(`verify(${receiptOrTransaction.className})`);\n this._validator.add(receiptOrTransaction);\n // Run validation after 200ms, so if the same receipt is to be validated multiple times it will just create one call.\n setTimeout(() => this._validator.run(), 200);\n });\n }\n /**\n * Finalize a transaction.\n *\n * This will be called from the Receipt, Transaction or VerifiedReceipt objects using the API decorators.\n */\n finish(receipt) {\n return __awaiter(this, void 0, void 0, function* () {\n this.log.info(`finish(${receipt.className})`);\n const transactions = receipt instanceof CdvPurchase.VerifiedReceipt\n ? receipt.sourceReceipt.transactions\n : receipt instanceof CdvPurchase.Receipt\n ? receipt.transactions\n : [receipt];\n transactions.forEach(transaction => {\n var _a;\n const adapter = (_a = this.adapters.findReady(transaction.platform)) === null || _a === void 0 ? void 0 : _a.finish(transaction);\n });\n });\n }\n /**\n * Replay the users transactions.\n *\n * This method exists to cover an Apple AppStore requirement.\n */\n restorePurchases() {\n return __awaiter(this, void 0, void 0, function* () {\n let error;\n for (const adapter of this.adapters.list) {\n if (adapter.ready) {\n error = error !== null && error !== void 0 ? error : yield adapter.restorePurchases();\n }\n }\n return error;\n });\n }\n /**\n * Open the subscription management interface for the selected platform.\n *\n * If platform is not specified, the first available platform will be used.\n *\n * @example\n * const activeSubscription: Purchase = // ...\n * store.manageSubscriptions(activeSubscription.platform);\n */\n manageSubscriptions(platform) {\n return __awaiter(this, void 0, void 0, function* () {\n this.log.info('manageSubscriptions()');\n const adapter = this.adapters.findReady(platform);\n if (!adapter)\n return CdvPurchase.storeError(CdvPurchase.ErrorCode.SETUP, \"Found no adapter ready to handle 'manageSubscription'\", platform !== null && platform !== void 0 ? platform : null, null);\n return adapter.manageSubscriptions();\n });\n }\n /**\n * Opens the billing methods page on AppStore, Play, Microsoft, ...\n *\n * From this page, the user can update their payment methods.\n *\n * If platform is not specified, the first available platform will be used.\n *\n * @example\n * if (purchase.isBillingRetryPeriod)\n * store.manageBilling(purchase.platform);\n */\n manageBilling(platform) {\n return __awaiter(this, void 0, void 0, function* () {\n this.log.info('manageBilling()');\n const adapter = this.adapters.findReady(platform);\n if (!adapter)\n return CdvPurchase.storeError(CdvPurchase.ErrorCode.SETUP, \"Found no adapter ready to handle 'manageBilling'\", platform !== null && platform !== void 0 ? platform : null, null);\n return adapter.manageBilling();\n });\n }\n /**\n * The default payment platform to use depending on the OS.\n *\n * - on iOS: `APPLE_APPSTORE`\n * - on Android: `GOOGLE_PLAY`\n */\n defaultPlatform() {\n switch (CdvPurchase.Utils.platformId()) {\n case 'android': return CdvPurchase.Platform.GOOGLE_PLAY;\n case 'ios': return CdvPurchase.Platform.APPLE_APPSTORE;\n default: return CdvPurchase.Platform.TEST;\n }\n }\n /**\n * Register an error handler.\n *\n * @param error An error callback that takes the error as an argument\n *\n * @example\n * store.error(function(error) {\n * console.error('CdvPurchase ERROR: ' + error.message);\n * });\n */\n error(error) {\n this.errorCallbacks.push(error);\n }\n /**\n * Trigger an error event.\n *\n * @internal\n */\n triggerError(error) {\n this.errorCallbacks.trigger(error, 'triggerError');\n }\n }\n CdvPurchase.Store = Store;\n})(CdvPurchase || (CdvPurchase = {}));\n// Create the CdvPurchase.store object at startup.\nif (window.cordova) {\n setTimeout(initCDVPurchase, 0); // somehow with Cordova this needs to be delayed.\n}\nelse {\n initCDVPurchase();\n}\n/** @private */\nfunction initCDVPurchase() {\n var _a;\n console.log('Create CdvPurchase...');\n const oldStore = (_a = window.CdvPurchase) === null || _a === void 0 ? void 0 : _a.store;\n window.CdvPurchase = CdvPurchase;\n if (oldStore) {\n window.CdvPurchase.store = oldStore;\n }\n else {\n window.CdvPurchase.store = new CdvPurchase.Store();\n }\n // Let's maximize backward compatibility\n Object.assign(window.CdvPurchase.store, CdvPurchase.LogLevel, CdvPurchase.ProductType, CdvPurchase.ErrorCode, CdvPurchase.Platform);\n}\n// Ensure utility are included when compiling typescript.\n/// <reference path=\"utils/format-billing-cycle.ts\" />\n/// <reference path=\"store.ts\" />\nvar CdvPurchase;\n(function (CdvPurchase) {\n /** Types of In-App Products */\n let ProductType;\n (function (ProductType) {\n /** Type: An consumable product, that can be purchased multiple time */\n ProductType[\"CONSUMABLE\"] = \"consumable\";\n /** Type: A non-consumable product, that can purchased only once and the user keeps forever */\n ProductType[\"NON_CONSUMABLE\"] = \"non consumable\";\n /** @deprecated use PAID_SUBSCRIPTION */\n ProductType[\"FREE_SUBSCRIPTION\"] = \"free subscription\";\n /** Type: An auto-renewable subscription */\n ProductType[\"PAID_SUBSCRIPTION\"] = \"paid subscription\";\n /** Type: An non-renewing subscription */\n ProductType[\"NON_RENEWING_SUBSCRIPTION\"] = \"non renewing subscription\";\n /** Type: The application bundle */\n ProductType[\"APPLICATION\"] = \"application\";\n })(ProductType = CdvPurchase.ProductType || (CdvPurchase.ProductType = {}));\n /**\n * Type of recurring payment\n *\n * - FINITE_RECURRING: Payment recurs for a fixed number of billing period set in `paymentPhase.cycles`.\n * - INFINITE_RECURRING: Payment recurs for infinite billing periods unless cancelled.\n * - NON_RECURRING: A one time charge that does not repeat.\n */\n let RecurrenceMode;\n (function (RecurrenceMode) {\n RecurrenceMode[\"NON_RECURRING\"] = \"NON_RECURRING\";\n RecurrenceMode[\"FINITE_RECURRING\"] = \"FINITE_RECURRING\";\n RecurrenceMode[\"INFINITE_RECURRING\"] = \"INFINITE_RECURRING\";\n })(RecurrenceMode = CdvPurchase.RecurrenceMode || (CdvPurchase.RecurrenceMode = {}));\n /** Mode of payment */\n let PaymentMode;\n (function (PaymentMode) {\n /** Used for subscriptions, pay at the beginning of each billing period */\n PaymentMode[\"PAY_AS_YOU_GO\"] = \"PayAsYouGo\";\n /** Pay the whole amount up front */\n PaymentMode[\"UP_FRONT\"] = \"UpFront\";\n /** Nothing to be paid */\n PaymentMode[\"FREE_TRIAL\"] = \"FreeTrial\";\n })(PaymentMode = CdvPurchase.PaymentMode || (CdvPurchase.PaymentMode = {}));\n /**\n * Purchase platforms supported by the plugin\n */\n let Platform;\n (function (Platform) {\n /** Apple AppStore */\n Platform[\"APPLE_APPSTORE\"] = \"ios-appstore\";\n /** Google Play */\n Platform[\"GOOGLE_PLAY\"] = \"android-playstore\";\n /** Windows Store */\n Platform[\"WINDOWS_STORE\"] = \"windows-store-transaction\";\n /** Braintree */\n Platform[\"BRAINTREE\"] = \"braintree\";\n // /** Stripe */\n // STRIPE = 'stripe',\n /** Test platform */\n Platform[\"TEST\"] = \"test\";\n })(Platform = CdvPurchase.Platform || (CdvPurchase.Platform = {}));\n /**\n * Possible states of a transaction.\n *\n * ```\n * INITIATED → PENDING (optional) → APPROVED → FINISHED\n * ```\n */\n let TransactionState;\n (function (TransactionState) {\n // REQUESTED = 'requested',\n TransactionState[\"INITIATED\"] = \"initiated\";\n TransactionState[\"PENDING\"] = \"pending\";\n TransactionState[\"APPROVED\"] = \"approved\";\n TransactionState[\"CANCELLED\"] = \"cancelled\";\n TransactionState[\"FINISHED\"] = \"finished\";\n // OWNED = 'owned',\n // EXPIRED = 'expired',\n TransactionState[\"UNKNOWN_STATE\"] = \"\";\n })(TransactionState = CdvPurchase.TransactionState || (CdvPurchase.TransactionState = {}));\n /** Whether or not the user intends to let the subscription auto-renew. */\n let RenewalIntent;\n (function (RenewalIntent) {\n /** The user intends to let the subscription expire without renewing. */\n RenewalIntent[\"LAPSE\"] = \"Lapse\";\n /** The user intends to renew the subscription. */\n RenewalIntent[\"RENEW\"] = \"Renew\";\n })(RenewalIntent = CdvPurchase.RenewalIntent || (CdvPurchase.RenewalIntent = {}));\n /** Whether or not the user was notified or agreed to a price change */\n let PriceConsentStatus;\n (function (PriceConsentStatus) {\n PriceConsentStatus[\"NOTIFIED\"] = \"Notified\";\n PriceConsentStatus[\"AGREED\"] = \"Agreed\";\n })(PriceConsentStatus = CdvPurchase.PriceConsentStatus || (CdvPurchase.PriceConsentStatus = {}));\n /** Reason why a subscription has been canceled */\n let CancelationReason;\n (function (CancelationReason) {\n /** Not canceled */\n CancelationReason[\"NOT_CANCELED\"] = \"\";\n /** Subscription canceled by the developer. */\n CancelationReason[\"DEVELOPER\"] = \"Developer\";\n /** Subscription canceled by the system for an unspecified reason. */\n CancelationReason[\"SYSTEM\"] = \"System\";\n /** Subscription upgraded or downgraded to a new subscription. */\n CancelationReason[\"SYSTEM_REPLACED\"] = \"System.Replaced\";\n /** Product not available for purchase at the time of renewal. */\n CancelationReason[\"SYSTEM_PRODUCT_UNAVAILABLE\"] = \"System.ProductUnavailable\";\n /** Billing error; for example customer’s payment information is no longer valid. */\n CancelationReason[\"SYSTEM_BILLING_ERROR\"] = \"System.BillingError\";\n /** Transaction is gone; It has been deleted. */\n CancelationReason[\"SYSTEM_DELETED\"] = \"System.Deleted\";\n /** Subscription canceled by the user for an unspecified reason. */\n CancelationReason[\"CUSTOMER\"] = \"Customer\";\n /** Customer canceled their transaction due to an actual or perceived issue within your app. */\n CancelationReason[\"CUSTOMER_TECHNICAL_ISSUES\"] = \"Customer.TechnicalIssues\";\n /** Customer did not agree to a recent price increase. See also priceConsentStatus. */\n CancelationReason[\"CUSTOMER_PRICE_INCREASE\"] = \"Customer.PriceIncrease\";\n /** Customer canceled for cost-related reasons. */\n CancelationReason[\"CUSTOMER_COST\"] = \"Customer.Cost\";\n /** Customer claimed to have found a better app. */\n CancelationReason[\"CUSTOMER_FOUND_BETTER_APP\"] = \"Customer.FoundBetterApp\";\n /** Customer did not feel he is using this service enough. */\n CancelationReason[\"CUSTOMER_NOT_USEFUL_ENOUGH\"] = \"Customer.NotUsefulEnough\";\n /** Subscription canceled for another reason; for example, if the customer made the purchase accidentally. */\n CancelationReason[\"CUSTOMER_OTHER_REASON\"] = \"Customer.OtherReason\";\n /** Subscription canceled for unknown reasons. */\n CancelationReason[\"UNKNOWN\"] = \"Unknown\";\n })(CancelationReason = CdvPurchase.CancelationReason || (CdvPurchase.CancelationReason = {}));\n})(CdvPurchase || (CdvPurchase = {}));\n/// <reference path=\"utils/non-enumerable.ts\" />\n/// <reference path=\"product.ts\" />\n/// <reference path=\"types.ts\" />\nvar CdvPurchase;\n(function (CdvPurchase) {\n /**\n * One of the available offers to purchase a given product\n */\n class Offer {\n /** @internal */\n constructor(options, decorator) {\n /** className, used to make sure we're passing an actual instance of the \"Offer\" class. */\n this.className = 'Offer';\n this.id = options.id;\n this.pricingPhases = options.pricingPhases;\n // Object.defineProperty(this, 'product', { enumerable: false, get: () => options.product });\n Object.defineProperty(this, 'productId', { enumerable: true, get: () => options.product.id });\n Object.defineProperty(this, 'productType', { enumerable: true, get: () => options.product.type });\n Object.defineProperty(this, 'productGroup', { enumerable: true, get: () => options.product.group });\n Object.defineProperty(this, 'platform', { enumerable: true, get: () => options.product.platform });\n Object.defineProperty(this, 'order', { enumerable: false, get: () => (additionalData) => decorator.order(this, additionalData) });\n Object.defineProperty(this, 'canPurchase', { enumerable: false, get: () => decorator.canPurchase(this) });\n }\n /** Identifier of the product related to this offer */\n get productId() { return ''; }\n /** Type of the product related to this offer */\n get productType() { return CdvPurchase.ProductType.APPLICATION; }\n /** Group the product related to this offer is member of */\n get productGroup() { return undefined; }\n /** Platform this offer is available from */\n get platform() { return CdvPurchase.Platform.TEST; }\n /**\n * Initiate a purchase of this offer.\n *\n * @example\n * store.get(\"my-product\").getOffer().order();\n */\n order(additionalData) {\n return __awaiter(this, void 0, void 0, function* () {\n // Pseudo implementation to make typescript happy.\n // see Object.defineProperty in the constructor for the actual implementation.\n return;\n });\n }\n /**\n * true if the offer can be purchased.\n */\n get canPurchase() {\n // Pseudo implementation to make typescript happy.\n // see Object.defineProperty in the constructor for the actual implementation.\n return false;\n }\n }\n CdvPurchase.Offer = Offer;\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n class PaymentRequestPromise {\n constructor() {\n this.failedCallbacks = new CdvPurchase.Internal.PromiseLike();\n this.initiatedCallbacks = new CdvPurchase.Internal.PromiseLike();\n this.approvedCallbacks = new CdvPurchase.Internal.PromiseLike();\n this.finishedCallbacks = new CdvPurchase.Internal.PromiseLike();\n this.cancelledCallback = new CdvPurchase.Internal.PromiseLike();\n }\n failed(callback) {\n this.failedCallbacks.push(callback);\n return this;\n }\n initiated(callback) {\n this.initiatedCallbacks.push(callback);\n return this;\n }\n approved(callback) {\n this.approvedCallbacks.push(callback);\n return this;\n }\n finished(callback) {\n this.finishedCallbacks.push(callback);\n return this;\n }\n cancelled(callback) {\n this.cancelledCallback.push(callback);\n return this;\n }\n /** @internal */\n trigger(argument) {\n if (!argument) {\n this.cancelledCallback.resolve();\n }\n else if ('isError' in argument) {\n this.failedCallbacks.resolve(argument);\n }\n else {\n switch (argument.state) {\n case CdvPurchase.TransactionState.INITIATED:\n this.initiatedCallbacks.resolve(argument);\n break;\n case CdvPurchase.TransactionState.APPROVED:\n this.approvedCallbacks.resolve(argument);\n break;\n case CdvPurchase.TransactionState.FINISHED:\n this.finishedCallbacks.resolve(argument);\n break;\n }\n }\n return this;\n }\n /**\n * Return a failed promise.\n *\n * @internal\n */\n static failed(code, message, platform, productId) {\n return new PaymentRequestPromise().trigger(CdvPurchase.storeError(code, message, platform, productId));\n }\n /**\n * Return a failed promise.\n *\n * @internal\n */\n static cancelled() {\n return new PaymentRequestPromise().trigger();\n }\n /**\n * Return an initiated transaction.\n *\n * @internal\n */\n static initiated(transaction) {\n return new PaymentRequestPromise().trigger(transaction);\n }\n }\n CdvPurchase.PaymentRequestPromise = PaymentRequestPromise;\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n class Receipt {\n /** @internal */\n constructor(platform, decorator) {\n /** @internal */\n this.className = 'Receipt';\n /** List of transactions contained in the receipt, ordered by date ascending. */\n this.transactions = [];\n this.platform = platform;\n Object.defineProperty(this, 'verify', { 'enumerable': false, get() { return () => decorator.verify(this); } });\n Object.defineProperty(this, 'finish', { 'enumerable': false, get() { return () => decorator.finish(this); } });\n }\n /** Verify a receipt */\n verify() {\n return __awaiter(this, void 0, void 0, function* () { });\n }\n /** Finish all transactions in a receipt */\n finish() {\n return __awaiter(this, void 0, void 0, function* () { });\n }\n /** Return true if the receipt contains the given transaction */\n hasTransaction(value) {\n return !!this.transactions.find(t => t === value);\n }\n /** Return the last transaction in this receipt */\n lastTransaction() {\n return this.transactions[this.transactions.length - 1];\n }\n }\n CdvPurchase.Receipt = Receipt;\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n /**\n * Transaction as reported by the device\n *\n * @see {@link Receipt}\n * @see {@link store.localTransactions}\n */\n class Transaction {\n /** @internal */\n constructor(platform, parentReceipt, decorator) {\n /** @internal */\n this.className = 'Transaction';\n /** Transaction identifier. */\n this.transactionId = '';\n /** State this transaction is in */\n this.state = CdvPurchase.TransactionState.UNKNOWN_STATE;\n /** Purchased products */\n this.products = [];\n this.platform = platform;\n Object.defineProperty(this, 'finish', { 'enumerable': false, get() { return () => decorator.finish(this); } });\n Object.defineProperty(this, 'verify', { 'enumerable': false, get() { return () => decorator.verify(this); } });\n Object.defineProperty(this, 'parentReceipt', { 'enumerable': false, get() { return parentReceipt; } });\n }\n /**\n * Finish a transaction.\n *\n * When the application has delivered the product, it should finalizes the order.\n * Only after that, money will be transferred to your account.\n * This method ensures that no customers is charged for a product that couldn't be delivered.\n *\n * @example\n * store.when()\n * .approved(transaction => transaction.verify())\n * .verified(receipt => receipt.finish())\n */\n finish() {\n return __awaiter(this, void 0, void 0, function* () { });\n } // actual implementation in the constructor\n /**\n * Verify a transaction.\n *\n * This will trigger a call to the receipt validation service for the attached receipt.\n * Once the receipt has been verified, you can finish the transaction.\n *\n * @example\n * store.when()\n * .approved(transaction => transaction.verify())\n * .verified(receipt => receipt.finish())\n */\n verify() {\n return __awaiter(this, void 0, void 0, function* () { });\n } // actual implementation in the constructor\n /**\n * Return the receipt this transaction is part of.\n */\n get parentReceipt() { return {}; } // actual implementation in the constructor\n }\n CdvPurchase.Transaction = Transaction;\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n let Internal;\n (function (Internal) {\n /** Analyze the list of local receipts. */\n class LocalReceipts {\n /**\n * Find the latest transaction for a given product, from those reported by the device.\n */\n static find(localReceipts, product) {\n var _a, _b;\n if (!product)\n return undefined;\n let found;\n for (const receipt of localReceipts) {\n if (product.platform && receipt.platform !== product.platform)\n continue;\n for (const transaction of receipt.transactions) {\n for (const trProducts of transaction.products) {\n if (trProducts.id === product.id) {\n // No matching transaction has been found or the tested one is newer than the already found one?\n // Then we chose the tested one.\n if (!found || ((_a = transaction.purchaseDate) !== null && _a !== void 0 ? _a : 0) < ((_b = found.purchaseDate) !== null && _b !== void 0 ? _b : 1))\n found = transaction;\n }\n }\n }\n }\n return found;\n }\n /** Return true if a product is owned */\n static isOwned(localReceipts, product) {\n if (!product)\n return false;\n const transaction = LocalReceipts.find(localReceipts, product);\n if (!transaction)\n return false;\n if (transaction.isConsumed)\n return false;\n if (transaction.isPending)\n return false;\n if (transaction.expirationDate)\n return transaction.expirationDate.getTime() > +new Date();\n return true;\n }\n static canPurchase(localReceipts, product) {\n if (!product)\n return false;\n const transaction = LocalReceipts.find(localReceipts, product);\n if (!transaction)\n return true;\n if (transaction.isConsumed)\n return true;\n if (transaction.expirationDate)\n return transaction.expirationDate.getTime() <= +new Date();\n return true;\n }\n }\n Internal.LocalReceipts = LocalReceipts;\n })(Internal = CdvPurchase.Internal || (CdvPurchase.Internal = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n let Internal;\n (function (Internal) {\n /**\n * Return true if a product is owned.\n *\n * Will use the list of verified receipts if provided.\n * Will only use the list of local receipts if verifiedReceipt is undefined.\n */\n function owned(options) {\n if (options.verifiedReceipts !== undefined) {\n return Internal.VerifiedReceipts.isOwned(options.verifiedReceipts, options.product);\n }\n else if (options.localReceipts !== undefined) {\n return Internal.LocalReceipts.isOwned(options.localReceipts, options.product);\n }\n else {\n return false;\n }\n }\n Internal.owned = owned;\n })(Internal = CdvPurchase.Internal || (CdvPurchase.Internal = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n let Internal;\n (function (Internal) {\n class PromiseLike {\n constructor() {\n this.resolved = false;\n /** List of registered callbacks */\n this.callbacks = [];\n }\n /** Add a callback to the list */\n push(callback) {\n if (this.resolved)\n setTimeout(callback, 0, this.resolvedArgument);\n else\n this.callbacks.push(callback);\n }\n /** Call all registered callbacks with the given value */\n resolve(value) {\n if (this.resolved)\n return; // do not resolve twice\n this.resolved = true;\n this.resolvedArgument = value;\n this.callbacks.forEach(cb => setTimeout(cb, 0, value));\n this.callbacks = [];\n }\n }\n Internal.PromiseLike = PromiseLike;\n })(Internal = CdvPurchase.Internal || (CdvPurchase.Internal = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n let Internal;\n (function (Internal) {\n /**\n * Retry failed requests\n *\n * When setup and/or load failed, the plugin will retry over and over till it can connect\n * to the store.\n *\n * However, to be nice with the battery, it'll double the retry timeout each time.\n *\n * Special case, when the device goes online, it'll trigger all retry callback in the queue.\n */\n class Retry {\n constructor(minTimeout = 5000, maxTimeout = 120000) {\n this.maxTimeout = 120000;\n this.minTimeout = 5000;\n this.retryTimeout = 5000;\n this.retries = [];\n this.minTimeout = minTimeout;\n this.maxTimeout = maxTimeout;\n this.retryTimeout = minTimeout;\n // From https://github.com/apache/cordova-plugin-network-information\n // This event fires when an application goes online, and the device becomes connected to the Internet.\n document.addEventListener(\"online\", () => {\n const a = this.retries;\n this.retries = [];\n this.retryTimeout = this.minTimeout;\n for (var i = 0; i < a.length; ++i) {\n clearTimeout(a[i].tid);\n a[i].fn.call(this);\n }\n }, false);\n }\n retry(fn) {\n var tid = setTimeout(() => {\n this.retries = this.retries.filter(function (o) {\n return tid !== o.tid;\n });\n fn();\n }, this.retryTimeout);\n this.retries.push({ tid: tid, fn: fn });\n this.retryTimeout *= 2;\n // Max out the waiting time to 2 minutes.\n if (this.retryTimeout > this.maxTimeout)\n this.retryTimeout = this.maxTimeout;\n }\n }\n Internal.Retry = Retry;\n })(Internal = CdvPurchase.Internal || (CdvPurchase.Internal = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n let Internal;\n (function (Internal) {\n /** Analyze the list of local receipts. */\n class VerifiedReceipts {\n /**\n * Find the last verified purchase for a given product, from those verified by the receipt validator.\n */\n static find(verifiedReceipts, product) {\n var _a, _b;\n if (!product)\n return undefined;\n let found;\n for (const receipt of verifiedReceipts) {\n if (product.platform && receipt.platform !== product.platform)\n continue;\n for (const purchase of receipt.collection) {\n if (purchase.id === product.id) {\n if (((_a = found === null || found === void 0 ? void 0 : found.purchaseDate) !== null && _a !== void 0 ? _a : 0) < ((_b = purchase.purchaseDate) !== null && _b !== void 0 ? _b : 1))\n found = purchase;\n }\n }\n }\n return found;\n }\n /** Return true if a product is owned, based on the content of the list of verified receipts */\n static isOwned(verifiedReceipts, product) {\n if (!product)\n return false;\n const purchase = VerifiedReceipts.find(verifiedReceipts, product);\n if (!purchase)\n return false;\n if (purchase === null || purchase === void 0 ? void 0 : purchase.isExpired)\n return false;\n if (purchase === null || purchase === void 0 ? void 0 : purchase.expiryDate) {\n return (purchase.expiryDate > +new Date());\n }\n return true;\n }\n static getVerifiedPurchases(verifiedReceipts) {\n var _a, _b, _c, _d;\n const indexed = {};\n for (const receipt of verifiedReceipts) {\n for (const purchase of receipt.collection) {\n const key = receipt.platform + ':' + purchase.id;\n const existing = indexed[key];\n if (!existing || (existing && ((_b = (_a = existing.lastRenewalDate) !== null && _a !== void 0 ? _a : existing.purchaseDate) !== null && _b !== void 0 ? _b : 0) < ((_d = (_c = purchase.lastRenewalDate) !== null && _c !== void 0 ? _c : purchase.purchaseDate) !== null && _d !== void 0 ? _d : 0))) {\n indexed[key] = Object.assign(Object.assign({}, purchase), { platform: receipt.platform });\n }\n }\n }\n return Object.keys(indexed).map(key => indexed[key]);\n }\n }\n Internal.VerifiedReceipts = VerifiedReceipts;\n })(Internal = CdvPurchase.Internal || (CdvPurchase.Internal = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n /**\n * Define types for ApplePay\n *\n * At the moment Apple Pay is only supported as an extension for Braintree.\n */\n let ApplePay;\n (function (ApplePay) {\n /** The fields that describe a contact. */\n let ContactField;\n (function (ContactField) {\n ContactField[\"Name\"] = \"name\";\n ContactField[\"EmailAddress\"] = \"emailAddress\";\n ContactField[\"PhoneNumber\"] = \"phoneNumber\";\n ContactField[\"PostalAddress\"] = \"postalAddress\";\n ContactField[\"PhoneticName\"] = \"phoneticName\";\n })(ContactField = ApplePay.ContactField || (ApplePay.ContactField = {}));\n /** A type that represents a payment method. */\n let PaymentNetwork;\n (function (PaymentNetwork) {\n /** An American Express payment card. */\n PaymentNetwork[\"Amex\"] = \"Amex\";\n /** A QR code used for payment. */\n PaymentNetwork[\"Barcode\"] = \"Barcode\";\n /** A Cartes Bancaires payment card. */\n PaymentNetwork[\"CartesBancaires\"] = \"CartesBancaires\";\n /** A China Union Pay payment card. */\n PaymentNetwork[\"ChinaUnionPay\"] = \"ChinaUnionPay\";\n /** The Dankort payment card. */\n PaymentNetwork[\"Dankort\"] = \"Dankort\";\n /** A Discover payment card. */\n PaymentNetwork[\"Discover\"] = \"Discover\";\n /** The electronic funds transfer at point of sale (EFTPOS) payment method. */\n PaymentNetwork[\"Eftpos\"] = \"Eftpos\";\n /** An Electron debit card. */\n PaymentNetwork[\"Electron\"] = \"Electron\";\n /** The Elo payment card. */\n PaymentNetwork[\"Elo\"] = \"Elo\";\n /** A Girocard payment method. */\n PaymentNetwork[\"Girocard\"] = \"Girocard\";\n /** An iD payment card. */\n PaymentNetwork[\"IDCredit\"] = \"IDCredit\";\n /** The Interac payment method. */\n PaymentNetwork[\"Interac\"] = \"Interac\";\n /** A JCB payment card. */\n PaymentNetwork[\"JCB\"] = \"JCB\";\n /** A mada payment card. */\n PaymentNetwork[\"Mada\"] = \"Mada\";\n /** A Maestro payment card. */\n PaymentNetwork[\"Maestro\"] = \"Maestro\";\n /** A MasterCard payment card. */\n PaymentNetwork[\"MasterCard\"] = \"MasterCard\";\n /** A Mir payment card. */\n PaymentNetwork[\"Mir\"] = \"Mir\";\n /** A Nanaco payment card. */\n PaymentNetwork[\"Nanaco\"] = \"Nanaco\";\n /** Store credit and debit cards. */\n PaymentNetwork[\"PrivateLabel\"] = \"PrivateLabel\";\n /** A QUICPay payment card. */\n PaymentNetwork[\"QuicPay\"] = \"QuicPay\";\n /** A Suica payment card. */\n PaymentNetwork[\"Suica\"] = \"Suica\";\n /** A Visa payment card. */\n PaymentNetwork[\"Visa\"] = \"Visa\";\n /** A Visa V Pay payment card. */\n PaymentNetwork[\"VPay\"] = \"VPay\";\n /** A WAON payment card. */\n PaymentNetwork[\"Waon\"] = \"Waon\";\n })(PaymentNetwork = ApplePay.PaymentNetwork || (ApplePay.PaymentNetwork = {}));\n /** Capabilities for processing payment. */\n let MerchantCapability;\n (function (MerchantCapability) {\n /** Support for the 3-D Secure protocol. */\n MerchantCapability[\"ThreeDS\"] = \"3DS\";\n /** Support for the EMV protocol. */\n MerchantCapability[\"EMV\"] = \"EMV\";\n /** Support for credit cards. */\n MerchantCapability[\"Credit\"] = \"Credit\";\n /** Support for debit cards. */\n MerchantCapability[\"Debit\"] = \"Debit\";\n })(MerchantCapability = ApplePay.MerchantCapability || (ApplePay.MerchantCapability = {}));\n })(ApplePay = CdvPurchase.ApplePay || (CdvPurchase.ApplePay = {}));\n})(CdvPurchase || (CdvPurchase = {}));\n/// <reference path=\"../../types.ts\" />\n/// <reference path=\"../../product.ts\" />\n/// <reference path=\"../../receipt.ts\" />\n/// <reference path=\"../../offer.ts\" />\n/// <reference path=\"../../transaction.ts\" />\nvar CdvPurchase;\n(function (CdvPurchase) {\n /**\n * Apple AppStore adapter using StoreKit version 1\n */\n let AppleAppStore;\n (function (AppleAppStore) {\n /**\n * In the first stages of a purchase, the transaction doesn't have an identifier.\n *\n * In the meantime, we generate a virtual transaction identifier.\n */\n function virtualTransactionId(productId) {\n return `virtual.${productId}`;\n }\n /**\n * Adapter for Apple AppStore using StoreKit version 1\n */\n class Adapter {\n constructor(context, options) {\n var _a, _b;\n this.id = CdvPurchase.Platform.APPLE_APPSTORE;\n this.name = 'AppStore';\n this.ready = false;\n this._canMakePayments = false;\n /**\n * Set to true to force a full refresh of the receipt when preparing a receipt validation call.\n *\n * This is typically done when placing an order and restoring purchases.\n */\n this.forceReceiptReload = false;\n /** List of products loaded from AppStore */\n this._products = [];\n this.validProducts = {};\n this._paymentMonitor = () => { };\n this.supportsParallelLoading = true;\n /** True iff the appStoreReceipt is already being initialized */\n this._appStoreReceiptLoading = false;\n /** List of functions waiting for the appStoreReceipt to be initialized */\n this._appStoreReceiptCallbacks = [];\n this.context = context;\n this.bridge = new AppleAppStore.Bridge.Bridge();\n this.log = context.log.child('AppleAppStore');\n this.discountEligibilityDeterminer = options.discountEligibilityDeterminer;\n this.needAppReceipt = (_a = options.needAppReceipt) !== null && _a !== void 0 ? _a : true;\n this.autoFinish = (_b = options.autoFinish) !== null && _b !== void 0 ? _b : false;\n this.pseudoReceipt = new CdvPurchase.Receipt(CdvPurchase.Platform.APPLE_APPSTORE, this.context.apiDecorators);\n this.receiptsUpdated = CdvPurchase.Utils.createDebouncer(() => {\n this._receiptsUpdated();\n }, 300);\n }\n get products() { return this._products; }\n /** Find a given product from ID */\n getProduct(id) { return this._products.find(p => p.id === id); }\n get receipts() {\n if (!this.isSupported)\n return [];\n return (this._receipt ? [this._receipt] : [])\n .concat(this.pseudoReceipt ? this.pseudoReceipt : []);\n }\n addValidProducts(registerProducts, validProducts) {\n validProducts.forEach(vp => {\n const rp = registerProducts.find(p => p.id === vp.id);\n if (!rp)\n return;\n this.validProducts[vp.id] = Object.assign(Object.assign({}, vp), rp);\n });\n }\n /** Returns true on iOS, the only platform supported by this adapter */\n get isSupported() {\n return CdvPurchase.Utils.platformId() === 'ios';\n }\n upsertTransactionInProgress(productId, state) {\n const transactionId = virtualTransactionId(productId);\n return new Promise(resolve => {\n const existing = this.pseudoReceipt.transactions.find(t => t.transactionId === transactionId);\n if (existing) {\n existing.state = state;\n existing.refresh(productId);\n resolve(existing);\n }\n else {\n const tr = new AppleAppStore.SKTransaction(CdvPurchase.Platform.APPLE_APPSTORE, this.pseudoReceipt, this.context.apiDecorators);\n tr.state = state;\n tr.transactionId = transactionId;\n tr.refresh(productId);\n this.pseudoReceipt.transactions.push(tr);\n resolve(tr);\n }\n });\n }\n /** Remove a transaction from the pseudo receipt */\n removeTransactionInProgress(productId) {\n const transactionId = virtualTransactionId(productId);\n this.pseudoReceipt.transactions = this.pseudoReceipt.transactions.filter(t => t.transactionId !== transactionId);\n }\n /** Insert or update a transaction in the pseudo receipt, based on data collected from the native side */\n upsertTransaction(productId, transactionId, state) {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise(resolve => {\n this.initializeAppReceipt(() => {\n var _a;\n if (!this._receipt) {\n // this should not happen\n this.log.warn('Failed to load the application receipt, cannot proceed with handling the purchase');\n return;\n }\n const existing = (_a = this._receipt) === null || _a === void 0 ? void 0 : _a.transactions.find(t => t.transactionId === transactionId);\n if (existing) {\n existing.state = state;\n existing.refresh(productId);\n resolve(existing);\n }\n else {\n const tr = new AppleAppStore.SKTransaction(CdvPurchase.Platform.APPLE_APPSTORE, this._receipt, this.context.apiDecorators);\n tr.state = state;\n tr.transactionId = transactionId;\n tr.refresh(productId);\n this._receipt.transactions.push(tr);\n resolve(tr);\n }\n });\n });\n });\n }\n removeTransaction(transactionId) {\n if (this._receipt) {\n this._receipt.transactions = this._receipt.transactions.filter(t => t.transactionId !== transactionId);\n }\n }\n /** Notify the store that the receipts have been updated */\n _receiptsUpdated() {\n if (this._receipt) {\n this.log.debug(\"receipt updated and ready.\");\n this.context.listener.receiptsUpdated(CdvPurchase.Platform.APPLE_APPSTORE, [this._receipt, this.pseudoReceipt]);\n this.context.listener.receiptsReady(CdvPurchase.Platform.APPLE_APPSTORE);\n }\n else {\n this.log.debug(\"receipt updated.\");\n this.context.listener.receiptsUpdated(CdvPurchase.Platform.APPLE_APPSTORE, [this.pseudoReceipt]);\n }\n }\n setPaymentMonitor(fn) {\n this._paymentMonitor = fn;\n }\n callPaymentMonitor(status, code, message) {\n this._paymentMonitor(status);\n }\n initialize() {\n return new Promise(resolve => {\n this.log.info('bridge.init');\n const bridgeLogger = this.log.child('Bridge');\n this.bridge.init({\n autoFinish: this.autoFinish,\n debug: this.context.verbosity === CdvPurchase.LogLevel.DEBUG,\n log: msg => bridgeLogger.debug(msg),\n error: (code, message, options) => {\n this.log.error('ERROR: ' + code + ' - ' + message);\n if (code === CdvPurchase.ErrorCode.PAYMENT_CANCELLED) {\n // When the user closes the payment sheet, this generates a\n // PAYMENT_CANCELLED error that isn't an error anymore since version 13\n // of the plugin.\n this.callPaymentMonitor('cancelled', CdvPurchase.ErrorCode.PAYMENT_CANCELLED, message);\n return;\n }\n else {\n this.context.error(appStoreError(code, message, (options === null || options === void 0 ? void 0 : options.productId) || null));\n }\n },\n ready: () => {\n this.log.info('ready');\n },\n purchased: (transactionIdentifier, productId, originalTransactionIdentifier, transactionDate, discountId) => __awaiter(this, void 0, void 0, function* () {\n this.log.info('purchase: id:' + transactionIdentifier + ' product:' + productId + ' originalTransaction:' + originalTransactionIdentifier + ' - date:' + transactionDate + ' - discount:' + discountId);\n // we can add the transaction to the receipt here\n const transaction = yield this.upsertTransaction(productId, transactionIdentifier, CdvPurchase.TransactionState.APPROVED);\n transaction.refresh(productId, originalTransactionIdentifier, transactionDate, discountId);\n this.removeTransactionInProgress(productId);\n this.receiptsUpdated.call();\n this.callPaymentMonitor('purchased');\n }),\n purchaseEnqueued: (productId, quantity) => __awaiter(this, void 0, void 0, function* () {\n this.log.info('purchaseEnqueued: ' + productId + ' - ' + quantity);\n // let create a temporary transaction\n yield this.upsertTransactionInProgress(productId, CdvPurchase.TransactionState.INITIATED);\n this.context.listener.receiptsUpdated(CdvPurchase.Platform.APPLE_APPSTORE, [this.pseudoReceipt]);\n }),\n purchaseFailed: (productId, code, message) => {\n this.log.info('purchaseFailed: ' + productId + ' - ' + code + ' - ' + message);\n this.removeTransactionInProgress(productId);\n this.context.listener.receiptsUpdated(CdvPurchase.Platform.APPLE_APPSTORE, [this.pseudoReceipt]);\n this.callPaymentMonitor('failed', code, message);\n },\n purchasing: (productId) => __awaiter(this, void 0, void 0, function* () {\n // purchase has been requested, but there's no transactionIdentifier yet.\n // we can create a dummy transaction\n this.log.info('purchasing: ' + productId);\n yield this.upsertTransactionInProgress(productId, CdvPurchase.TransactionState.INITIATED);\n // In order to prevent a receipt validation attempt here\n // (which might happen if it hasn't been possible earlier)\n // We should add \"purchasing\" transactions into a second, pseudo receipt.\n this.context.listener.receiptsUpdated(CdvPurchase.Platform.APPLE_APPSTORE, [this.pseudoReceipt]);\n }),\n deferred: (productId) => __awaiter(this, void 0, void 0, function* () {\n this.log.info('deferred: ' + productId);\n yield this.upsertTransactionInProgress(productId, CdvPurchase.TransactionState.PENDING);\n this.context.listener.receiptsUpdated(CdvPurchase.Platform.APPLE_APPSTORE, [this.pseudoReceipt]);\n this.callPaymentMonitor('deferred');\n }),\n finished: (transactionIdentifier, productId) => __awaiter(this, void 0, void 0, function* () {\n // An issue occurs here if finished is triggered the \"debounced\" receiptUpdated call has\n // been performed for the APPROVED event. Because the transaction will go straight to\n // FINISHED, skipping validation.\n //\n // This was observed specifically when \"autoFinish\" is set.\n //\n // In order to get rid of that bug, we want to wait for processing of the previous\n // receiptUpdated call.\n //\n // A side effect will be that when there are many \"finished\" transactions, how could we process\n // them all in batch?\n yield this.receiptsUpdated.wait();\n this.log.info('finish: ' + transactionIdentifier + ' - ' + productId);\n this.removeTransactionInProgress(productId);\n yield this.upsertTransaction(productId, transactionIdentifier, CdvPurchase.TransactionState.FINISHED);\n this.receiptsUpdated.call();\n }),\n restored: (transactionIdentifier, productId) => __awaiter(this, void 0, void 0, function* () {\n this.log.info('restore: ' + transactionIdentifier + ' - ' + productId);\n yield this.upsertTransaction(productId, transactionIdentifier, CdvPurchase.TransactionState.APPROVED);\n this.receiptsUpdated.call();\n }),\n receiptsRefreshed: (receipt) => {\n this.log.info('receiptsRefreshed');\n if (this._receipt)\n this._receipt.refresh(receipt, this.needAppReceipt, this.context.apiDecorators);\n },\n restoreFailed: (errorCode) => {\n this.log.info('restoreFailed: ' + errorCode);\n if (this.onRestoreCompleted) {\n this.onRestoreCompleted(appStoreError(errorCode, 'Restore purchases failed', null));\n this.onRestoreCompleted = undefined;\n }\n },\n restoreCompleted: () => {\n this.log.info('restoreCompleted');\n if (this.onRestoreCompleted) {\n this.onRestoreCompleted(undefined);\n this.onRestoreCompleted = undefined;\n }\n },\n }, () => __awaiter(this, void 0, void 0, function* () {\n this.log.info('bridge.init done');\n yield this.canMakePayments();\n resolve(undefined);\n }), (code, message) => {\n this.log.info('bridge.init failed: ' + code + ' - ' + message);\n resolve(appStoreError(code, message, null));\n });\n });\n }\n loadReceipts() {\n return new Promise((resolve) => {\n setTimeout(() => {\n this.initializeAppReceipt(() => {\n this.receiptsUpdated.call();\n if (this._receipt) {\n resolve([this._receipt, this.pseudoReceipt]);\n }\n else {\n resolve([this.pseudoReceipt]);\n }\n });\n }, 300);\n });\n }\n canMakePayments() {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise(resolve => {\n this.bridge.canMakePayments(() => {\n this._canMakePayments = true;\n resolve(true);\n }, (message) => {\n this.log.warn(`canMakePayments: ${message}`);\n this._canMakePayments = false;\n resolve(false);\n });\n });\n });\n }\n /**\n * Create the application receipt\n */\n initializeAppReceipt(callback) {\n return __awaiter(this, void 0, void 0, function* () {\n if (this._receipt) {\n this.log.debug('initializeAppReceipt() => already initialized.');\n return callback(undefined);\n }\n this._appStoreReceiptCallbacks.push(callback);\n if (this._appStoreReceiptLoading) {\n this.log.debug('initializeAppReceipt() => already loading.');\n return;\n }\n this._appStoreReceiptLoading = true;\n const nativeData = yield this.loadAppStoreReceipt();\n const callCallbacks = (arg) => {\n const callbacks = this._appStoreReceiptCallbacks;\n this._appStoreReceiptCallbacks = [];\n callbacks.forEach(cb => {\n cb(arg);\n });\n };\n if (!(nativeData === null || nativeData === void 0 ? void 0 : nativeData.appStoreReceipt)) {\n this.log.warn('no appStoreReceipt');\n this._appStoreReceiptLoading = false;\n callCallbacks(appStoreError(CdvPurchase.ErrorCode.REFRESH, 'No appStoreReceipt', null));\n return;\n }\n this._receipt = new AppleAppStore.SKApplicationReceipt(nativeData, this.needAppReceipt, this.context.apiDecorators);\n callCallbacks(undefined);\n });\n }\n prepareReceipt(nativeData) {\n if (nativeData === null || nativeData === void 0 ? void 0 : nativeData.appStoreReceipt) {\n if (!this._receipt) {\n this._receipt = new AppleAppStore.SKApplicationReceipt(nativeData, this.needAppReceipt, this.context.apiDecorators);\n }\n else {\n this._receipt.refresh(nativeData, this.needAppReceipt, this.context.apiDecorators);\n }\n }\n }\n /** Promisified loading of the AppStore receipt */\n loadAppStoreReceipt() {\n return __awaiter(this, void 0, void 0, function* () {\n let resolved = false;\n return new Promise(resolve => {\n var _a;\n if (((_a = this.bridge.appStoreReceipt) === null || _a === void 0 ? void 0 : _a.appStoreReceipt) && !this.forceReceiptReload) {\n this.log.debug('using cached appstore receipt');\n return resolve(this.bridge.appStoreReceipt);\n }\n this.log.debug('loading appstore receipt...');\n this.forceReceiptReload = false;\n this.bridge.loadReceipts(receipt => {\n this.log.debug('appstore receipt loaded');\n if (!resolved)\n resolve(receipt);\n resolved = true;\n }, (code, message) => {\n // this should not happen: native side never triggers an error\n this.log.warn('Failed to load appStoreReceipt: ' + code + ' - ' + message);\n if (!resolved)\n resolve(undefined);\n resolved = true;\n });\n // If the receipt cannot be loaded, timeout after 5 seconds\n setTimeout(function () {\n if (!resolved)\n resolve(undefined);\n resolved = true;\n }, 5000);\n }).then(result => {\n this.context.listener.receiptsReady(CdvPurchase.Platform.APPLE_APPSTORE);\n return result;\n }).catch(reason => {\n this.context.listener.receiptsReady(CdvPurchase.Platform.APPLE_APPSTORE);\n return reason;\n });\n });\n }\n loadEligibility(validProducts) {\n return __awaiter(this, void 0, void 0, function* () {\n this.log.debug('load eligibility: ' + JSON.stringify(validProducts));\n if (!this.discountEligibilityDeterminer) {\n this.log.debug('No discount eligibility determiner, skipping...');\n return new AppleAppStore.Internal.DiscountEligibilities([], []);\n }\n const eligibilityRequests = [];\n validProducts.forEach(valid => {\n var _a, _b, _c;\n (_a = valid.discounts) === null || _a === void 0 ? void 0 : _a.forEach(discount => {\n eligibilityRequests.push({\n productId: valid.id,\n discountId: discount.id,\n discountType: discount.type,\n });\n });\n if (((_c = (_b = valid.discounts) === null || _b === void 0 ? void 0 : _b.length) !== null && _c !== void 0 ? _c : 0) === 0 && valid.introPrice) {\n // sometime apple returns the discounts in the deprecated \"introductory\" info\n // we create a special \"discount\" with the id \"intro\" to check for eligibility.\n eligibilityRequests.push({\n productId: valid.id,\n discountId: 'intro',\n discountType: 'Introductory',\n });\n }\n });\n if (eligibilityRequests.length > 0) {\n const applicationReceipt = yield this.loadAppStoreReceipt();\n if (!applicationReceipt || !applicationReceipt.appStoreReceipt) {\n this.log.debug('no receipt, assuming introductory price are available.');\n return new AppleAppStore.Internal.DiscountEligibilities(eligibilityRequests, eligibilityRequests.map(r => r.discountType === \"Introductory\"));\n }\n else {\n this.log.debug('calling discount eligibility determiner.');\n const response = yield this.callDiscountEligibilityDeterminer(applicationReceipt, eligibilityRequests);\n this.log.debug('response: ' + JSON.stringify(response));\n return new AppleAppStore.Internal.DiscountEligibilities(eligibilityRequests, response);\n }\n }\n else {\n return new AppleAppStore.Internal.DiscountEligibilities([], []);\n }\n });\n }\n callDiscountEligibilityDeterminer(applicationReceipt, eligibilityRequests) {\n return new Promise(resolve => {\n if (!this.discountEligibilityDeterminer)\n return resolve([]);\n this.discountEligibilityDeterminer(applicationReceipt, eligibilityRequests, resolve);\n });\n }\n loadProducts(products) {\n return new Promise(resolve => {\n this.log.info('bridge.load');\n this.bridge.load(products.map(p => p.id), (validProducts, invalidProducts) => __awaiter(this, void 0, void 0, function* () {\n this.log.info('bridge.loaded: ' + JSON.stringify({ validProducts, invalidProducts }));\n this.addValidProducts(products, validProducts);\n const eligibilities = yield this.loadEligibility(validProducts);\n this.log.info('eligibilities ready: ' + JSON.stringify(eligibilities));\n // for any valid product that includes a discount, check the eligibility.\n const ret = products.map(p => {\n if (invalidProducts.indexOf(p.id) >= 0) {\n this.log.debug(`${p.id} is invalid`);\n return appStoreError(CdvPurchase.ErrorCode.INVALID_PRODUCT_ID, 'Product not found in AppStore. #400', p.id);\n }\n else {\n const valid = validProducts.find(v => v.id === p.id);\n this.log.debug(`${p.id} is valid: ${JSON.stringify(valid)}`);\n if (!valid)\n return appStoreError(CdvPurchase.ErrorCode.INVALID_PRODUCT_ID, 'Product not found in AppStore. #404', p.id);\n let product = this.getProduct(p.id);\n if (product) {\n this.log.debug('refreshing existing product');\n product === null || product === void 0 ? void 0 : product.refresh(valid, this.context.apiDecorators, eligibilities);\n }\n else {\n this.log.debug('registering new product');\n product = new AppleAppStore.SKProduct(valid, p, this.context.apiDecorators, eligibilities);\n this._products.push(product);\n }\n return product;\n }\n });\n this.log.debug(`Products loaded: ${JSON.stringify(ret)}`);\n resolve(ret);\n }), (code, message) => {\n return products.map(p => appStoreError(code, message, null));\n });\n });\n }\n order(offer, additionalData) {\n return __awaiter(this, void 0, void 0, function* () {\n let resolved = false;\n return new Promise(resolve => {\n var _a;\n const callResolve = (result) => {\n if (resolved)\n return;\n this.setPaymentMonitor(() => { });\n resolved = true;\n resolve(result);\n };\n this.log.info('order');\n const discountId = offer.id !== AppleAppStore.DEFAULT_OFFER_ID ? offer.id : undefined;\n const discount = (_a = additionalData === null || additionalData === void 0 ? void 0 : additionalData.appStore) === null || _a === void 0 ? void 0 : _a.discount;\n if (discountId && !discount) {\n return callResolve(appStoreError(CdvPurchase.ErrorCode.MISSING_OFFER_PARAMS, 'Missing additionalData.appStore.discount when ordering a discount offer', offer.productId));\n }\n if (discountId && ((discount === null || discount === void 0 ? void 0 : discount.id) !== discountId)) {\n return callResolve(appStoreError(CdvPurchase.ErrorCode.INVALID_OFFER_IDENTIFIER, 'Offer identifier does not match additionalData.appStore.discount.id', offer.productId));\n }\n this.setPaymentMonitor((status, code, message) => {\n this.log.info('order.paymentMonitor => ' + status + ' ' + (code !== null && code !== void 0 ? code : '') + ' ' + (message !== null && message !== void 0 ? message : ''));\n if (resolved)\n return;\n switch (status) {\n case 'cancelled':\n callResolve(appStoreError(code !== null && code !== void 0 ? code : CdvPurchase.ErrorCode.PAYMENT_CANCELLED, message !== null && message !== void 0 ? message : 'The user cancelled the order.', offer.productId));\n break;\n case 'failed':\n // note, \"failed\" might be triggered before \"cancelled\",\n // so we'll give some time to catch the \"cancelled\" event.\n setTimeout(() => {\n callResolve(appStoreError(code !== null && code !== void 0 ? code : CdvPurchase.ErrorCode.PURCHASE, message !== null && message !== void 0 ? message : 'Purchase failed', offer.productId));\n }, 500);\n break;\n case 'purchased':\n case 'deferred':\n callResolve(undefined);\n break;\n }\n });\n const success = () => {\n this.log.info('order.success');\n // We'll monitor the payment before resolving.\n };\n const error = () => {\n this.log.info('order.error');\n callResolve(appStoreError(CdvPurchase.ErrorCode.PURCHASE, 'Failed to place order', offer.productId));\n };\n // When we switch AppStore user, the cached receipt isn't from the new user.\n // so after a purchase, we want to make sure we're using the receipt from the logged in user.\n this.forceReceiptReload = true;\n this.bridge.purchase(offer.productId, 1, this.context.getApplicationUsername(), discount, success, error);\n });\n });\n }\n finish(transaction) {\n return new Promise(resolve => {\n this.log.info('finish(' + transaction.transactionId + ')');\n if (transaction.transactionId === AppleAppStore.APPLICATION_VIRTUAL_TRANSACTION_ID || transaction.transactionId === virtualTransactionId(transaction.products[0].id)) {\n // this is a virtual transaction, nothing to do.\n transaction.state = CdvPurchase.TransactionState.FINISHED;\n this.context.listener.receiptsUpdated(CdvPurchase.Platform.APPLE_APPSTORE, [transaction.parentReceipt]);\n return resolve(undefined);\n }\n const success = () => {\n transaction.state = CdvPurchase.TransactionState.FINISHED;\n this.context.listener.receiptsUpdated(CdvPurchase.Platform.APPLE_APPSTORE, [transaction.parentReceipt]);\n resolve(undefined);\n };\n const error = (msg) => {\n var _a, _b;\n if (msg === null || msg === void 0 ? void 0 : msg.includes('[#CdvPurchase:100]')) {\n // already finished\n success();\n }\n else {\n resolve(appStoreError(CdvPurchase.ErrorCode.FINISH, 'Failed to finish transaction', (_b = (_a = transaction.products[0]) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : null));\n }\n };\n this.bridge.finish(transaction.transactionId, success, error);\n });\n }\n refreshReceipt() {\n return new Promise(resolve => {\n const success = (receipt) => {\n // at that point, the receipt should have been refreshed.\n resolve(receipt);\n };\n const error = (code, message) => {\n resolve(appStoreError(code, message, null));\n };\n this.bridge.refreshReceipts(success, error);\n });\n }\n receiptValidationBody(receipt) {\n return __awaiter(this, void 0, void 0, function* () {\n if (receipt.platform !== CdvPurchase.Platform.APPLE_APPSTORE)\n return;\n if (receipt !== this._receipt)\n return; // do not validate the pseudo receipt\n const skReceipt = receipt;\n let applicationReceipt = skReceipt.nativeData;\n if (this.forceReceiptReload) {\n const nativeData = yield this.loadAppStoreReceipt();\n this.forceReceiptReload = false;\n if (nativeData) {\n applicationReceipt = nativeData;\n this.prepareReceipt(nativeData);\n }\n }\n if (!skReceipt.nativeData.appStoreReceipt) {\n this.log.info('Cannot prepare the receipt validation body, because appStoreReceipt is missing. Refreshing...');\n const result = yield this.refreshReceipt();\n if (!result || 'isError' in result) {\n this.log.warn('Failed to refresh receipt, cannot run receipt validation.');\n if (result)\n this.log.error(result);\n return;\n }\n this.log.info('Receipt refreshed.');\n applicationReceipt = result;\n }\n const transaction = skReceipt.transactions.slice(-1)[0];\n return {\n id: applicationReceipt.bundleIdentifier,\n type: CdvPurchase.ProductType.APPLICATION,\n // send all products and offers so validator get pricing information\n products: CdvPurchase.Utils.objectValues(this.validProducts).map(vp => new AppleAppStore.SKProduct(vp, vp, this.context.apiDecorators, { isEligible: () => true })),\n transaction: {\n type: 'ios-appstore',\n id: transaction === null || transaction === void 0 ? void 0 : transaction.transactionId,\n appStoreReceipt: applicationReceipt.appStoreReceipt,\n }\n };\n });\n }\n handleReceiptValidationResponse(_receipt, response) {\n var _a, _b;\n return __awaiter(this, void 0, void 0, function* () {\n // we can add the purchaseDate to the application transaction\n let localReceiptUpdated = false;\n if (response.ok) {\n const vTransaction = (_a = response.data) === null || _a === void 0 ? void 0 : _a.transaction;\n if ((vTransaction === null || vTransaction === void 0 ? void 0 : vTransaction.type) === 'ios-appstore' && 'original_application_version' in vTransaction) {\n (_b = this._receipt) === null || _b === void 0 ? void 0 : _b.transactions.forEach(t => {\n if (t.transactionId === AppleAppStore.APPLICATION_VIRTUAL_TRANSACTION_ID) {\n if (vTransaction.original_purchase_date_ms) {\n t.purchaseDate = new Date(parseInt(vTransaction.original_purchase_date_ms));\n localReceiptUpdated = true;\n }\n }\n });\n }\n }\n if (localReceiptUpdated)\n this.context.listener.receiptsUpdated(CdvPurchase.Platform.APPLE_APPSTORE, [_receipt]);\n });\n }\n requestPayment(payment, additionalData) {\n return __awaiter(this, void 0, void 0, function* () {\n return appStoreError(CdvPurchase.ErrorCode.UNKNOWN, 'requestPayment not supported', null);\n });\n }\n manageSubscriptions() {\n return __awaiter(this, void 0, void 0, function* () {\n this.bridge.manageSubscriptions();\n return;\n });\n }\n manageBilling() {\n return __awaiter(this, void 0, void 0, function* () {\n this.bridge.manageBilling();\n return;\n });\n }\n checkSupport(functionality) {\n if (functionality === 'order')\n return this._canMakePayments;\n const supported = [\n 'order', 'manageBilling', 'manageSubscriptions'\n ];\n return supported.indexOf(functionality) >= 0;\n }\n restorePurchases() {\n return new Promise(resolve => {\n this.onRestoreCompleted = (error) => {\n this.onRestoreCompleted = undefined;\n this.bridge.refreshReceipts(obj => {\n resolve(error);\n }, (code, message) => {\n resolve(error || appStoreError(code, message, null));\n });\n };\n this.forceReceiptReload = true;\n this.bridge.restore();\n });\n }\n presentCodeRedemptionSheet() {\n return new Promise(resolve => {\n this.bridge.presentCodeRedemptionSheet(resolve);\n });\n }\n }\n AppleAppStore.Adapter = Adapter;\n function appStoreError(code, message, productId) {\n return CdvPurchase.storeError(code, message, CdvPurchase.Platform.APPLE_APPSTORE, productId);\n }\n })(AppleAppStore = CdvPurchase.AppleAppStore || (CdvPurchase.AppleAppStore = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n let AppleAppStore;\n (function (AppleAppStore) {\n let Bridge;\n (function (Bridge_1) {\n /** No-operation function, used as a default for callbacks */\n const noop = (args) => { };\n /** Logger */\n let log = noop;\n /** Execute a native method */\n function exec(methodName, options, success, error) {\n window.cordova.exec(success, error, \"InAppPurchase\", methodName, options);\n }\n ;\n /** Execute a javascript-side method in a try-catch block */\n function protectCall(callback, context, ...args) {\n if (!callback) {\n return;\n }\n try {\n // const args = Array.prototype.slice.call(arguments, 2);\n callback.apply(this, args);\n }\n catch (err) {\n log('exception in ' + context + ': \"' + err + '\"');\n }\n }\n ;\n class Bridge {\n constructor() {\n /** Transactions for a given product */\n this.transactionsForProduct = {};\n /** True when the SDK has been initialized */\n this.initialized = false;\n /** List of registered product identifiers */\n this.registeredProducts = [];\n /** True if \"restoreCompleted\" or \"restoreFailed\" should be called when restore is done */\n this.needRestoreNotification = false;\n /*\n private eventQueue: {\n state: TransactionState;\n errorCode: ErrorCode | undefined;\n errorText: string | undefined;\n transactionIdentifier: string;\n productId: string;\n /** @deprecated *\n transactionReceipt: never;\n originalTransactionIdentifier: string | undefined;\n transactionDate: string;\n discountId: string;\n }[] = [];\n \n private timer: number | null = null;\n */\n /** List of transaction updates to process */\n this.pendingUpdates = [];\n /** @deprecated */\n this.onPurchased = false;\n /** @deprecated */\n this.onFailed = false;\n /** @deprecated */\n this.onRestored = false;\n window.storekit = this; // used by native to communicate with this bridge\n this.options = {\n error: noop,\n ready: noop,\n purchased: noop,\n purchaseEnqueued: noop,\n purchasing: noop,\n purchaseFailed: noop,\n deferred: noop,\n finished: noop,\n restored: noop,\n receiptsRefreshed: noop,\n restoreFailed: noop,\n restoreCompleted: noop,\n };\n // if (window.localStorage && window.localStorage.sk_transactionForProduct)\n // this.transactionsForProduct = JSON.parse(window.localStorage.sk_transactionForProduct);\n // Remove support for receipt.forTransaction(...)\n // `appStoreReceipt` is now the only supported receipt format on iOS (drops support for iOS <= 6)\n // if (window.localStorage.sk_receiptForTransaction)\n // delete window.localStorage.sk_receiptForTransaction;\n }\n /**\n * Initialize the AppStore bridge.\n *\n * This calls the native \"setup\" method from the \"InAppPurchase\" Objective-C class.\n *\n * @param options Options for the bridge\n * @param success Called when the bridge is ready\n * @param error Called when the bridge failed to initialize\n */\n init(options, success, error) {\n this.options = {\n error: options.error || noop,\n ready: options.ready || noop,\n purchased: options.purchased || noop,\n purchaseEnqueued: options.purchaseEnqueued || noop,\n purchasing: options.purchasing || noop,\n purchaseFailed: options.purchaseFailed || noop,\n deferred: options.deferred || noop,\n finished: options.finished || noop,\n restored: options.restored || noop,\n receiptsRefreshed: options.receiptsRefreshed || noop,\n restoreFailed: options.restoreFailed || noop,\n restoreCompleted: options.restoreCompleted || noop,\n };\n if (options.debug) {\n exec('debug', [], noop, noop);\n log = options.log || function (msg) {\n console.log(\"[CdvPurchase.AppAppStore.Bridge] \" + msg);\n };\n }\n if (options.autoFinish) {\n exec('autoFinish', [], noop, noop);\n }\n const setupOk = () => {\n log('setup ok');\n protectCall(this.options.ready, 'options.ready');\n protectCall(success, 'init.success');\n this.initialized = true;\n setTimeout(() => this.processPendingTransactions(), 50);\n };\n const setupFailed = (err) => {\n log('setup failed');\n // protectCall(this.options.error, 'options.error', ErrorCode.SETUP, 'Setup failed');\n protectCall(error, 'init.error', CdvPurchase.ErrorCode.SETUP, 'Setup failed: ' + err);\n };\n exec('setup', [], setupOk, setupFailed);\n }\n processPendingTransactions() {\n log('processing pending transactions');\n exec('processPendingTransactions', [], () => {\n this.finalizeTransactionUpdates();\n }, undefined);\n }\n /**\n * Makes an in-app purchase.\n *\n * @param {String} productId The product identifier. e.g. \"com.example.MyApp.myproduct\"\n * @param {int} quantity Quantity of product to purchase\n */\n purchase(productId, quantity, applicationUsername, discount, success, error) {\n quantity = (quantity | 0) || 1;\n const options = this.options;\n // Many people forget to load information about their products from apple's servers before allowing\n // users to purchase them... leading them to spam us with useless issues and comments.\n // Let's chase them down!\n if (this.registeredProducts.indexOf(productId) < 0) {\n const msg = 'Purchasing ' + productId + ' failed. Ensure the product was loaded first with Bridge.load(...)!';\n log(msg);\n if (typeof options.error === 'function') {\n protectCall(options.error, 'options.error', CdvPurchase.ErrorCode.PURCHASE, 'Trying to purchase a unknown product.', { productId, quantity });\n }\n return;\n }\n const purchaseOk = () => {\n log('Purchase enqueued ' + productId);\n if (typeof options.purchaseEnqueued === 'function') {\n protectCall(options.purchaseEnqueued, 'options.purchaseEnqueued', productId, quantity);\n }\n protectCall(success, 'purchase.success');\n };\n const purchaseFailed = () => {\n const errMsg = 'Purchase failed: ' + productId;\n log(errMsg);\n if (typeof options.error === 'function') {\n protectCall(options.error, 'options.error', CdvPurchase.ErrorCode.PURCHASE, errMsg, { productId, quantity });\n }\n protectCall(error, 'purchase.error');\n };\n exec('purchase', [productId, quantity, applicationUsername, discount || {}], purchaseOk, purchaseFailed);\n }\n /**\n * Checks if device/user is allowed to make in-app purchases\n */\n canMakePayments(success, error) {\n return exec(\"canMakePayments\", [], success, error);\n }\n /**\n * Asks the payment queue to restore previously completed purchases.\n *\n * The restored transactions are passed to the onRestored callback, so make sure you define a handler for that first.\n */\n restore(callback) {\n this.needRestoreNotification = true;\n exec('restoreCompletedTransactions', [], callback, callback);\n }\n manageSubscriptions(callback) {\n exec('manageSubscriptions', [], callback, callback);\n }\n manageBilling(callback) {\n exec('manageBilling', [], callback, callback);\n }\n presentCodeRedemptionSheet(callback) {\n exec('presentCodeRedemptionSheet', [], callback, callback);\n }\n /**\n * Retrieves localized product data, including price (as localized\n * string), name, description of multiple products.\n *\n * @param {Array} productIds\n * An array of product identifier strings.\n *\n * @param {Function} callback\n * Called once with the result of the products request. Signature:\n *\n * function(validProducts, invalidProductIds)\n *\n * where validProducts receives an array of objects of the form:\n *\n * {\n * id: \"<productId>\",\n * title: \"<localised title>\",\n * description: \"<localised escription>\",\n * price: \"<localised price>\"\n * }\n *\n * and invalidProductIds receives an array of product identifier\n * strings which were rejected by the app store.\n */\n load(productIds, success, error) {\n const options = this.options;\n if (typeof productIds === \"string\") {\n productIds = [productIds];\n }\n if (!productIds) {\n // Empty array, nothing to do.\n protectCall(success, 'load.success', [], []);\n }\n else if (!productIds.length) {\n // Empty array, nothing to do.\n protectCall(success, 'load.success', [], []);\n }\n else {\n if (typeof productIds[0] !== 'string') {\n const msg = 'invalid productIds given to store.load: ' + JSON.stringify(productIds);\n log(msg);\n protectCall(options.error, 'options.error', CdvPurchase.ErrorCode.LOAD, msg);\n protectCall(error, 'load.error', CdvPurchase.ErrorCode.LOAD, msg);\n return;\n }\n log('load ' + JSON.stringify(productIds));\n const loadOk = (array) => {\n const valid = array[0];\n const invalid = array[1];\n log('load ok: { valid:' + JSON.stringify(valid) + ' invalid:' + JSON.stringify(invalid) + ' }');\n protectCall(success, 'load.success', valid, invalid);\n };\n const loadFailed = (errMessage) => {\n log('load failed');\n log(errMessage);\n const message = 'Load failed: ' + errMessage;\n protectCall(options.error, 'options.error', CdvPurchase.ErrorCode.LOAD, message);\n protectCall(error, 'load.error', CdvPurchase.ErrorCode.LOAD, message);\n };\n this.registeredProducts = this.registeredProducts.concat(productIds);\n exec('load', [productIds], loadOk, loadFailed);\n }\n }\n /*\n * Finish an unfinished transaction.\n *\n * @param {String} transactionId\n * Identifier of the transaction to finish.\n *\n * You have to call this method manually except when using the autoFinish option.\n */\n finish(transactionId, success, error) {\n exec('finishTransaction', [transactionId], success, error);\n }\n finalizeTransactionUpdates() {\n for (let i = 0; i < this.pendingUpdates.length; ++i) {\n const args = this.pendingUpdates[i];\n this.transactionUpdated(args.state, args.errorCode, args.errorText, args.transactionIdentifier, args.productId, args.transactionReceipt, args.originalTransactionIdentifier, args.transactionDate, args.discountId);\n }\n this.pendingUpdates = [];\n }\n lastTransactionUpdated() {\n // no more pending transactions\n }\n // This is called from native.\n //\n // Note that it may eventually be called before initialization... unfortunately.\n // In this case, we'll just keep pending updates in a list for later processing.\n transactionUpdated(state, errorCode, errorText, transactionIdentifier, productId, transactionReceipt, originalTransactionIdentifier, transactionDate, discountId) {\n if (!this.initialized) {\n this.pendingUpdates.push({ state, errorCode, errorText, transactionIdentifier, productId, transactionReceipt, originalTransactionIdentifier, transactionDate, discountId });\n return;\n }\n log(\"transaction updated:\" + transactionIdentifier + \" state:\" + state + \" product:\" + productId);\n if (productId && transactionIdentifier) {\n if (this.transactionsForProduct[productId]) {\n this.transactionsForProduct[productId].push(transactionIdentifier);\n }\n else {\n this.transactionsForProduct[productId] = [transactionIdentifier];\n }\n }\n switch (state) {\n case \"PaymentTransactionStatePurchasing\":\n protectCall(this.options.purchasing, 'options.purchasing', productId);\n return;\n case \"PaymentTransactionStatePurchased\":\n protectCall(this.options.purchased, 'options.purchase', transactionIdentifier, productId, originalTransactionIdentifier, transactionDate, discountId);\n return;\n case \"PaymentTransactionStateDeferred\":\n protectCall(this.options.deferred, 'options.deferred', productId);\n return;\n case \"PaymentTransactionStateFailed\":\n protectCall(this.options.purchaseFailed, 'options.purchaseFailed', productId, errorCode || CdvPurchase.ErrorCode.UNKNOWN, errorText || 'ERROR');\n protectCall(this.options.error, 'options.error', errorCode || CdvPurchase.ErrorCode.UNKNOWN, errorText || 'ERROR', { productId });\n return;\n case \"PaymentTransactionStateRestored\":\n protectCall(this.options.restored, 'options.restore', transactionIdentifier, productId);\n return;\n case \"PaymentTransactionStateFinished\":\n protectCall(this.options.finished, 'options.finish', transactionIdentifier, productId);\n return;\n }\n }\n restoreCompletedTransactionsFinished() {\n if (!this.needRestoreNotification)\n return;\n this.needRestoreNotification = false;\n protectCall(this.options.restoreCompleted, 'options.restoreCompleted');\n }\n restoreCompletedTransactionsFailed(errorCode) {\n if (!this.needRestoreNotification)\n return;\n this.needRestoreNotification = false;\n protectCall(this.options.restoreFailed, 'options.restoreFailed', errorCode);\n }\n parseReceiptArgs(args) {\n const base64 = args[0];\n const bundleIdentifier = args[1];\n const bundleShortVersion = args[2];\n const bundleNumericVersion = args[3];\n const bundleSignature = args[4];\n log('infoPlist: ' + bundleIdentifier + \",\" + bundleShortVersion + \",\" + bundleNumericVersion + \",\" + bundleSignature);\n return {\n appStoreReceipt: base64,\n bundleIdentifier: bundleIdentifier,\n bundleShortVersion: bundleShortVersion,\n bundleNumericVersion: bundleNumericVersion,\n bundleSignature: bundleSignature\n };\n }\n refreshReceipts(successCb, errorCb) {\n const loaded = (args) => {\n const data = this.parseReceiptArgs(args);\n this.appStoreReceipt = data;\n protectCall(this.options.receiptsRefreshed, 'options.receiptsRefreshed', data);\n protectCall(successCb, \"refreshReceipts.success\", data);\n };\n const error = (errMessage) => {\n log('refresh receipt failed: ' + errMessage);\n if (errMessage.includes(\"(@AMSErrorDomain:100)\")) {\n log('authentication failed, indicated by the string \"(@AMSErrorDomain:100)\"');\n }\n protectCall(this.options.error, 'options.error', CdvPurchase.ErrorCode.REFRESH_RECEIPTS, 'Failed to refresh receipt: ' + errMessage);\n protectCall(errorCb, \"refreshReceipts.error\", CdvPurchase.ErrorCode.REFRESH_RECEIPTS, 'Failed to refresh receipt: ' + errMessage);\n };\n this.appStoreReceipt = null;\n log('refreshing appStoreReceipt');\n exec('appStoreRefreshReceipt', [], loaded, error);\n }\n loadReceipts(callback, errorCb) {\n const loaded = (args) => {\n const data = this.parseReceiptArgs(args);\n this.appStoreReceipt = data;\n protectCall(callback, 'loadReceipts.callback', data);\n };\n const error = (errMessage) => {\n // should not happen (native side never triggers an error)\n // log('load failed: ' + errMessage);\n // protectCall(this.options.error, 'options.error', ErrorCode.LOAD_RECEIPTS, 'Failed to load receipt: ' + errMessage);\n // protectCall(errorCb, 'loadReceipts.error', ErrorCode.LOAD_RECEIPTS, 'Failed to load receipt: ' + errMessage);\n };\n log('loading appStoreReceipt');\n exec('appStoreReceipt', [], loaded, error);\n }\n }\n Bridge_1.Bridge = Bridge;\n })(Bridge = AppleAppStore.Bridge || (AppleAppStore.Bridge = {}));\n })(AppleAppStore = CdvPurchase.AppleAppStore || (CdvPurchase.AppleAppStore = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n /**\n * Apple AppStore adapter using StoreKit version 1\n */\n let AppleAppStore;\n (function (AppleAppStore) {\n /** @internal */\n let Internal;\n (function (Internal) {\n class DiscountEligibilities {\n constructor(request, response) {\n this.request = request;\n this.response = response;\n }\n isEligible(productId, discountType, discountId) {\n var _a;\n for (let i = 0; i < this.request.length; ++i) {\n const req = this.request[i];\n if (req.productId === productId && req.discountId === discountId && req.discountType === discountType) {\n return (_a = this.response[i]) !== null && _a !== void 0 ? _a : false;\n }\n }\n // No request for this product, let's say it's eligible.\n return true;\n }\n }\n Internal.DiscountEligibilities = DiscountEligibilities;\n })(Internal = AppleAppStore.Internal || (AppleAppStore.Internal = {}));\n })(AppleAppStore = CdvPurchase.AppleAppStore || (CdvPurchase.AppleAppStore = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n /**\n * Apple AppStore adapter using StoreKit version 1\n */\n let AppleAppStore;\n (function (AppleAppStore) {\n AppleAppStore.DEFAULT_OFFER_ID = '$';\n class SKOffer extends CdvPurchase.Offer {\n constructor(options, decorator) {\n super(options, decorator);\n this.offerType = options.offerType;\n }\n }\n AppleAppStore.SKOffer = SKOffer;\n class SKProduct extends CdvPurchase.Product {\n constructor(validProduct, p, decorator, eligibilities) {\n super(p, decorator);\n this.raw = validProduct;\n this.refresh(validProduct, decorator, eligibilities);\n }\n removeIneligibleDiscounts(eligibilities) {\n this.offers = this.offers.filter(offer => {\n const skOffer = offer;\n if (skOffer.offerType === 'Default')\n return true;\n return eligibilities.isEligible(this.id, skOffer.offerType, offer.id);\n });\n }\n refresh(valid, decorator, eligibilities) {\n var _a;\n this.raw = valid;\n this.title = valid.title;\n this.description = valid.description;\n this.countryCode = valid.countryCode;\n if (valid.group)\n this.group = valid.group;\n this.removeIneligibleDiscounts(eligibilities);\n // default offer\n const finalPhase = {\n price: valid.price,\n priceMicros: valid.priceMicros,\n currency: valid.currency,\n billingPeriod: formatBillingPeriod(valid.billingPeriod, valid.billingPeriodUnit),\n paymentMode: this.type === CdvPurchase.ProductType.PAID_SUBSCRIPTION ? CdvPurchase.PaymentMode.PAY_AS_YOU_GO : CdvPurchase.PaymentMode.UP_FRONT,\n recurrenceMode: this.type === CdvPurchase.ProductType.PAID_SUBSCRIPTION ? CdvPurchase.RecurrenceMode.INFINITE_RECURRING : CdvPurchase.RecurrenceMode.NON_RECURRING,\n };\n // discounts\n (_a = valid.discounts) === null || _a === void 0 ? void 0 : _a.forEach(discount => {\n if (eligibilities.isEligible(valid.id, discount.type, discount.id)) {\n const pricingPhases = [];\n const numCycles = discount.paymentMode === CdvPurchase.PaymentMode.PAY_AS_YOU_GO ? discount.period : 1;\n const numPeriods = discount.paymentMode === CdvPurchase.PaymentMode.PAY_AS_YOU_GO ? 1 : discount.period;\n const discountPhase = {\n price: discount.price,\n priceMicros: discount.priceMicros,\n currency: valid.currency,\n billingPeriod: formatBillingPeriod(numPeriods, discount.periodUnit),\n billingCycles: numCycles,\n paymentMode: discount.paymentMode,\n recurrenceMode: CdvPurchase.RecurrenceMode.FINITE_RECURRING,\n };\n pricingPhases.push(discountPhase);\n pricingPhases.push(finalPhase);\n this.addOffer(new SKOffer({ id: discount.id, product: this, pricingPhases, offerType: discount.type }, decorator));\n }\n });\n if (!hasIntroductoryOffer(this)) {\n const defaultPhases = [];\n // According to specs, intro price should be in the discounts array, but it turns out\n // it's not always the case (when there are no discount offers maybe?)...\n if (valid.introPrice && valid.introPriceMicros !== undefined && eligibilities.isEligible(valid.id, 'Introductory', 'intro')) {\n const introPrice = {\n price: valid.introPrice,\n priceMicros: valid.introPriceMicros,\n currency: valid.currency,\n billingPeriod: formatBillingPeriod(valid.introPricePeriod, valid.introPricePeriodUnit),\n paymentMode: valid.introPricePaymentMode,\n recurrenceMode: CdvPurchase.RecurrenceMode.FINITE_RECURRING,\n billingCycles: 1,\n };\n defaultPhases.push(introPrice);\n }\n defaultPhases.push(finalPhase);\n this.addOffer(new SKOffer({\n id: AppleAppStore.DEFAULT_OFFER_ID,\n product: this,\n pricingPhases: defaultPhases,\n offerType: 'Default',\n }, decorator));\n }\n function hasIntroductoryOffer(product) {\n return product.offers.filter(offer => {\n const skOffer = offer;\n return (skOffer.offerType === 'Introductory') || (skOffer.offerType === 'Default' && skOffer.pricingPhases.length > 1);\n // return (offer as SKOffer).offerType === 'Introductory';\n }).length > 0;\n }\n /**\n * Return ISO form of an IPeriodUnit + number of periods\n */\n function formatBillingPeriod(numPeriods, period) {\n if (numPeriods && period)\n return `P${numPeriods}${period[0]}`;\n else\n return undefined;\n }\n }\n }\n AppleAppStore.SKProduct = SKProduct;\n })(AppleAppStore = CdvPurchase.AppleAppStore || (CdvPurchase.AppleAppStore = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n let AppleAppStore;\n (function (AppleAppStore) {\n /**\n * Transaction ID used for the application virtual transaction\n */\n AppleAppStore.APPLICATION_VIRTUAL_TRANSACTION_ID = 'appstore.application';\n /**\n * StoreKit 1 exposes a single receipt that contains all transactions.\n */\n class SKApplicationReceipt extends CdvPurchase.Receipt {\n constructor(applicationReceipt, needApplicationReceipt, decorator) {\n super(CdvPurchase.Platform.APPLE_APPSTORE, decorator);\n this.nativeData = applicationReceipt;\n this.refresh(this.nativeData, needApplicationReceipt, decorator);\n }\n refresh(nativeData, needApplicationReceipt, decorator) {\n this.nativeData = nativeData;\n if (needApplicationReceipt) {\n const existing = this.transactions.find(t => t.transactionId === AppleAppStore.APPLICATION_VIRTUAL_TRANSACTION_ID);\n if (existing) {\n return;\n }\n const t = new CdvPurchase.Transaction(CdvPurchase.Platform.APPLE_APPSTORE, this, decorator);\n t.transactionId = AppleAppStore.APPLICATION_VIRTUAL_TRANSACTION_ID;\n t.state = CdvPurchase.TransactionState.APPROVED;\n t.products.push({\n id: nativeData.bundleIdentifier,\n });\n this.transactions.push(t);\n }\n }\n }\n AppleAppStore.SKApplicationReceipt = SKApplicationReceipt;\n /** StoreKit transaction */\n class SKTransaction extends CdvPurchase.Transaction {\n refresh(productId, originalTransactionIdentifier, transactionDate, discountId) {\n if (productId)\n this.products = [{ id: productId, offerId: discountId }];\n if (originalTransactionIdentifier)\n this.originalTransactionId = originalTransactionIdentifier;\n if (transactionDate)\n this.purchaseDate = new Date(+transactionDate);\n }\n }\n AppleAppStore.SKTransaction = SKTransaction;\n })(AppleAppStore = CdvPurchase.AppleAppStore || (CdvPurchase.AppleAppStore = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n let AppleAppStore;\n (function (AppleAppStore) {\n let VerifyReceipt;\n (function (VerifyReceipt) {\n /** The reason a subscription expired.\n * https://developer.apple.com/documentation/appstorereceipts/expiration_intent\n */\n let AppleExpirationIntent;\n (function (AppleExpirationIntent) {\n /** The customer voluntarily canceled their subscription. */\n AppleExpirationIntent[\"CANCELED\"] = \"1\";\n /** Billing error; for example, the customer\"s payment information was no longer valid. */\n AppleExpirationIntent[\"BILLING_ERROR\"] = \"2\";\n /** The customer did not agree to a recent price increase. */\n AppleExpirationIntent[\"PRICE_INCREASE\"] = \"3\";\n /** The product was not available for purchase at the time of renewal. */\n AppleExpirationIntent[\"PRODUCT_NOT_AVAILABLE\"] = \"4\";\n /** Unknown error. */\n AppleExpirationIntent[\"UNKNOWN\"] = \"5\";\n })(AppleExpirationIntent = VerifyReceipt.AppleExpirationIntent || (VerifyReceipt.AppleExpirationIntent = {}));\n })(VerifyReceipt = AppleAppStore.VerifyReceipt || (AppleAppStore.VerifyReceipt = {}));\n })(AppleAppStore = CdvPurchase.AppleAppStore || (CdvPurchase.AppleAppStore = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n let Braintree;\n (function (Braintree) {\n // export type Nonce = {\n // type: PaymentMethod.THREE_D_SECURE;\n // value: string;\n // };\n // export type NonceProvider = (type: PaymentMethod, callback: Callback<Nonce | IError>) => void;\n // export enum PaymentMethod {\n // THREE_D_SECURE = 'THREE_D_SECURE',\n // }\n class BraintreeReceipt extends CdvPurchase.Receipt {\n constructor(paymentRequest, dropInResult, decorator) {\n // Now we have to send this to the server + the request\n // result.paymentDescription; // \"1111\"\n // result.paymentMethodType; // \"VISA\"\n // result.deviceData; // undefined\n // result.paymentMethodNonce; // {\"isDefault\":false,\"nonce\":\"tokencc_bh_rdjmsc_76vjtq_9tzsv3_4467mg_tt4\"}\n var _a, _b, _c;\n super(CdvPurchase.Platform.BRAINTREE, decorator);\n const transaction = new CdvPurchase.Transaction(CdvPurchase.Platform.BRAINTREE, this, decorator);\n transaction.purchaseDate = new Date();\n transaction.products = ((_a = paymentRequest.items) === null || _a === void 0 ? void 0 : _a.filter(p => p).map(product => ({ id: (product === null || product === void 0 ? void 0 : product.id) || '' }))) || [];\n transaction.state = CdvPurchase.TransactionState.APPROVED;\n transaction.transactionId = (_c = (_b = dropInResult.paymentMethodNonce) === null || _b === void 0 ? void 0 : _b.nonce) !== null && _c !== void 0 ? _c : `UNKNOWN_${dropInResult.paymentMethodType}_${dropInResult.paymentDescription}`;\n this.transactions = [transaction];\n this.dropInResult = dropInResult;\n this.paymentRequest = paymentRequest;\n this.refresh(paymentRequest, dropInResult, decorator);\n }\n refresh(paymentRequest, dropInResult, decorator) {\n var _a, _b;\n this.dropInResult = dropInResult;\n this.paymentRequest = paymentRequest;\n const transaction = new CdvPurchase.Transaction(CdvPurchase.Platform.BRAINTREE, this, decorator);\n transaction.products = paymentRequest.items.filter(p => p).map(product => ({ id: (product === null || product === void 0 ? void 0 : product.id) || '' }));\n transaction.state = CdvPurchase.TransactionState.APPROVED;\n transaction.transactionId = (_b = (_a = dropInResult.paymentMethodNonce) === null || _a === void 0 ? void 0 : _a.nonce) !== null && _b !== void 0 ? _b : `UNKNOWN_${dropInResult.paymentMethodType}_${dropInResult.paymentDescription}`;\n transaction.amountMicros = paymentRequest.amountMicros;\n transaction.currency = paymentRequest.currency;\n this.transactions = [transaction];\n }\n }\n Braintree.BraintreeReceipt = BraintreeReceipt;\n class Adapter {\n constructor(context, options) {\n this.id = CdvPurchase.Platform.BRAINTREE;\n this.name = 'BrainTree';\n this.ready = false;\n this.products = [];\n this._receipts = [];\n this.supportsParallelLoading = false;\n this.context = context;\n this.log = context.log.child(\"Braintree\");\n this.options = options;\n }\n get receipts() { return this._receipts; }\n get isSupported() {\n return Braintree.IosBridge.Bridge.isSupported() || Braintree.AndroidBridge.Bridge.isSupported();\n }\n /**\n * Initialize the Braintree Adapter.\n */\n initialize() {\n return new Promise(resolve => {\n this.log.info(\"initialize()\");\n if (Braintree.IosBridge.Bridge.isSupported()) {\n this.log.info(\"instantiating ios bridge...\");\n this.iosBridge = new Braintree.IosBridge.Bridge(this.log, (callback) => {\n if (this.options.tokenizationKey)\n callback(this.options.tokenizationKey);\n else if (this.options.clientTokenProvider)\n this.options.clientTokenProvider(callback);\n else\n callback(braintreeError(CdvPurchase.ErrorCode.CLIENT_INVALID, 'Braintree iOS Bridge requires a clientTokenProvider or tokenizationKey'));\n }, this.options.applePay);\n this.iosBridge.initialize(this.context, resolve);\n }\n else if (Braintree.AndroidBridge.Bridge.isSupported() && !this.androidBridge) {\n this.log.info(\"instantiating android bridge...\");\n this.androidBridge = new Braintree.AndroidBridge.Bridge(this.log);\n this.log.info(\"calling android bridge -> initialize...\");\n const auth = this.options.tokenizationKey\n ? this.options.tokenizationKey\n : this.options.clientTokenProvider\n ? this.options.clientTokenProvider\n : '';\n this.androidBridge.initialize(auth, resolve);\n }\n else {\n this.log.info(\"platform not supported...\");\n resolve(undefined);\n }\n this.context.listener.receiptsReady(CdvPurchase.Platform.BRAINTREE);\n });\n }\n loadProducts(products) {\n return __awaiter(this, void 0, void 0, function* () {\n return products.map(p => braintreeError(CdvPurchase.ErrorCode.PRODUCT_NOT_AVAILABLE, 'N/A'));\n });\n }\n loadReceipts() {\n return __awaiter(this, void 0, void 0, function* () {\n this.context.listener.receiptsReady(CdvPurchase.Platform.BRAINTREE);\n return [];\n });\n }\n order(offer) {\n return __awaiter(this, void 0, void 0, function* () {\n return braintreeError(CdvPurchase.ErrorCode.UNKNOWN, 'N/A: Not implemented with Braintree');\n });\n }\n finish(transaction) {\n return __awaiter(this, void 0, void 0, function* () {\n transaction.state = CdvPurchase.TransactionState.FINISHED;\n this.context.listener.receiptsUpdated(CdvPurchase.Platform.TEST, [transaction.parentReceipt]);\n return;\n });\n }\n manageSubscriptions() {\n return __awaiter(this, void 0, void 0, function* () {\n this.log.info('N/A: manageSubscriptions() is not available with Braintree');\n return;\n });\n }\n manageBilling() {\n return __awaiter(this, void 0, void 0, function* () {\n this.log.info('N/A: manageBilling() is not available with Braintree');\n return;\n });\n }\n // async getNonce(paymentMethod: PaymentMethod): Promise<Nonce | IError> {\n // return new Promise(resolve => {\n // if (this.options.nonceProvider) {\n // this.options.nonceProvider(paymentMethod, resolve);\n // }\n // else {\n // resolve({\n // code: ErrorCode.UNAUTHORIZED_REQUEST_DATA,\n // message: 'Braintree requires a nonceProvider',\n // });\n // }\n // });\n // }\n launchDropIn(paymentRequest, dropInRequest) {\n return __awaiter(this, void 0, void 0, function* () {\n if (this.androidBridge)\n return this.androidBridge.launchDropIn(dropInRequest);\n if (this.iosBridge)\n return this.iosBridge.launchDropIn(paymentRequest, dropInRequest);\n return braintreeError(CdvPurchase.ErrorCode.PURCHASE, 'Braintree is not available');\n });\n }\n requestPayment(paymentRequest, additionalData) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j;\n return __awaiter(this, void 0, void 0, function* () {\n this.log.info(\"requestPayment()\" + JSON.stringify(paymentRequest));\n const dropInRequest = ((_a = additionalData === null || additionalData === void 0 ? void 0 : additionalData.braintree) === null || _a === void 0 ? void 0 : _a.dropInRequest) || {};\n // Apple Pay\n if (!(yield Braintree.IosBridge.ApplePayPlugin.isSupported(this.log))) {\n this.log.info(\"Apple Pay is not supported.\");\n dropInRequest.applePayDisabled = true;\n }\n // Google Pay\n if (this.options.googlePay || dropInRequest.googlePayRequest) {\n const googlePay = Object.assign(Object.assign({}, ((_b = this.options.googlePay) !== null && _b !== void 0 ? _b : {})), ((_c = dropInRequest.googlePayRequest) !== null && _c !== void 0 ? _c : {}));\n if (!googlePay.transactionInfo) {\n googlePay.transactionInfo = {\n currencyCode: ((_d = paymentRequest.currency) !== null && _d !== void 0 ? _d : ''),\n totalPrice: ((_e = paymentRequest.amountMicros) !== null && _e !== void 0 ? _e : 0) / 1000000,\n totalPriceStatus: Braintree.GooglePay.TotalPriceStatus.FINAL,\n };\n }\n dropInRequest.googlePayRequest = googlePay;\n }\n // 3DS\n if (this.options.threeDSecure || dropInRequest.threeDSecureRequest) {\n const threeDS = Object.assign(Object.assign({}, ((_f = this.options.threeDSecure) !== null && _f !== void 0 ? _f : {})), ((_g = dropInRequest.threeDSecureRequest) !== null && _g !== void 0 ? _g : {}));\n if (!threeDS.amount) {\n threeDS.amount = asDecimalString((_h = paymentRequest.amountMicros) !== null && _h !== void 0 ? _h : 0);\n }\n if (!threeDS.billingAddress && paymentRequest.billingAddress) {\n threeDS.billingAddress = {\n givenName: paymentRequest.billingAddress.givenName,\n surname: paymentRequest.billingAddress.surname,\n countryCodeAlpha2: paymentRequest.billingAddress.countryCode,\n postalCode: paymentRequest.billingAddress.postalCode,\n locality: paymentRequest.billingAddress.locality,\n streetAddress: paymentRequest.billingAddress.streetAddress1,\n extendedAddress: paymentRequest.billingAddress.streetAddress2,\n line3: paymentRequest.billingAddress.streetAddress3,\n phoneNumber: paymentRequest.billingAddress.phoneNumber,\n region: paymentRequest.billingAddress.region,\n };\n }\n if (!threeDS.email) {\n threeDS.email = paymentRequest.email;\n }\n dropInRequest.threeDSecureRequest = threeDS;\n }\n const response = yield this.launchDropIn(paymentRequest, dropInRequest);\n if (!dropInResponseIsOK(response))\n return dropInResponseError(this.log, response);\n const dropInResult = response;\n this.log.info(\"launchDropIn success: \" + JSON.stringify({ paymentRequest, dropInResult }));\n if (!((_j = dropInResult.paymentMethodNonce) === null || _j === void 0 ? void 0 : _j.nonce)) {\n return braintreeError(CdvPurchase.ErrorCode.BAD_RESPONSE, 'launchDropIn returned no paymentMethodNonce');\n }\n let receipt = this._receipts.find(r => { var _a, _b; return ((_a = r.dropInResult.paymentMethodNonce) === null || _a === void 0 ? void 0 : _a.nonce) === ((_b = dropInResult.paymentMethodNonce) === null || _b === void 0 ? void 0 : _b.nonce); });\n if (receipt) {\n receipt.refresh(paymentRequest, dropInResult, this.context.apiDecorators);\n }\n else {\n receipt = new BraintreeReceipt(paymentRequest, dropInResult, this.context.apiDecorators);\n this.receipts.push(receipt);\n }\n this.context.listener.receiptsUpdated(CdvPurchase.Platform.BRAINTREE, [receipt]);\n return receipt.transactions[0];\n });\n }\n receiptValidationBody(receipt) {\n var _a, _b, _c, _d, _e;\n return __awaiter(this, void 0, void 0, function* () {\n if (!isBraintreeReceipt(receipt)) {\n this.log.error(\"Unexpected error, expecting a BraintreeReceipt: \" + JSON.stringify(receipt));\n return;\n }\n this.log.info(\"create receiptValidationBody for: \" + JSON.stringify(receipt));\n return {\n id: (_c = (_b = (_a = receipt.paymentRequest.items) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.id) !== null && _c !== void 0 ? _c : 'unknown',\n type: CdvPurchase.ProductType.CONSUMABLE,\n priceMicros: receipt.paymentRequest.amountMicros,\n currency: receipt.paymentRequest.currency,\n products: [],\n transaction: {\n type: CdvPurchase.Platform.BRAINTREE,\n deviceData: receipt.dropInResult.deviceData,\n id: 'nonce',\n paymentMethodNonce: (_e = (_d = receipt.dropInResult.paymentMethodNonce) === null || _d === void 0 ? void 0 : _d.nonce) !== null && _e !== void 0 ? _e : '',\n paymentDescription: receipt.dropInResult.paymentDescription,\n paymentMethodType: receipt.dropInResult.paymentMethodType,\n }\n };\n });\n }\n /**\n * Handle a response from a receipt validation process.\n *\n * @param receipt The receipt being validated.\n * @param response The response payload from the receipt validation process.\n * @returns A promise that resolves when the response has been handled.\n */\n handleReceiptValidationResponse(receipt, response) {\n var _a;\n return __awaiter(this, void 0, void 0, function* () {\n this.log.info(\"receipt validation response: \" + JSON.stringify(response));\n if ((response === null || response === void 0 ? void 0 : response.data) && ('transaction' in response.data)) {\n if (response.data.transaction.type === 'braintree') {\n const lCustomerId = (_a = response.data.transaction.data.transaction) === null || _a === void 0 ? void 0 : _a.customer.id;\n if (lCustomerId && !Braintree.customerId) {\n this.log.info(\"customerId updated: \" + lCustomerId);\n Braintree.customerId = lCustomerId;\n }\n }\n }\n });\n }\n checkSupport(functionality) {\n return functionality === 'requestPayment';\n }\n restorePurchases() {\n return __awaiter(this, void 0, void 0, function* () {\n return undefined;\n });\n }\n }\n Braintree.Adapter = Adapter;\n function asDecimalString(amountMicros) {\n const amountCents = '' + (amountMicros / 10000);\n return (amountCents.slice(0, -2) || '0') + '.' + (amountCents.slice(-2, -1) || '0') + (amountCents.slice(-1) || '0');\n }\n function isBraintreeReceipt(receipt) {\n return receipt.platform === CdvPurchase.Platform.BRAINTREE;\n }\n const dropInResponseIsOK = (response) => {\n return (!!response) && !('code' in response && 'message' in response);\n };\n /**\n * Returns the error response from Drop In\n *\n * If the \"error\" is that the user cancelled the payment, then returns undefined\n * (as per the specification for requestPayment)\n */\n const dropInResponseError = (log, response) => {\n if (!response) {\n log.warn(\"launchDropIn failed: no response\");\n return braintreeError(CdvPurchase.ErrorCode.BAD_RESPONSE, 'Braintree failed to launch drop in');\n }\n else {\n // Failed\n if (response.code === CdvPurchase.ErrorCode.PAYMENT_CANCELLED) {\n log.info(\"User cancelled the payment request\");\n return undefined;\n }\n log.warn(\"launchDropIn failed: \" + JSON.stringify(response));\n return response;\n }\n };\n function braintreeError(code, message) {\n return CdvPurchase.storeError(code, message, CdvPurchase.Platform.BRAINTREE, null);\n }\n Braintree.braintreeError = braintreeError;\n })(Braintree = CdvPurchase.Braintree || (CdvPurchase.Braintree = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n let Braintree;\n (function (Braintree) {\n /**\n * Cordova plugin ID for the braintree plugin.\n */\n const PLUGIN_ID = 'BraintreePlugin';\n let AndroidBridge;\n (function (AndroidBridge) {\n /**\n * Bridge to access native functions.\n *\n * This tries to export pretty raw functions from the underlying native SDKs.\n */\n class Bridge {\n constructor(log) {\n this.log = log.child(\"AndroidBridge\");\n }\n /** Receive asynchronous messages from the native side */\n listener(msg) {\n // Handle changes to purchase that are being notified\n // through the PurchasesUpdatedListener on the native side (android)\n this.log.debug('listener: ' + JSON.stringify(msg));\n if (!msg || !msg.type) {\n return;\n }\n if (msg.type === \"getClientToken\") {\n this.getClientToken();\n }\n else if (msg.type === \"ready\") {\n }\n }\n // Braintree reported an error\n // private onError(message: string) {\n // this.log.warn(\"Braintree reported an error: \" + message);\n // // TODO - bubble that up to the client\n // }\n /*\n * Initialize the braintree client.\n *\n * @param clientTokenProvider Provide clientTokens to the SDK when it needs them.\n */\n initialize(clientTokenProvider, callback) {\n try {\n // Set a listener (see \"listener()\" function above)\n if (typeof clientTokenProvider === 'string') {\n const token = clientTokenProvider;\n this.clientTokenProvider = (callback) => { callback(token); };\n }\n else {\n this.clientTokenProvider = clientTokenProvider;\n }\n this.log.info(\"exec.setListener()\");\n const listener = this.listener.bind(this);\n window.cordova.exec(listener, null, PLUGIN_ID, \"setListener\", []);\n callback(undefined);\n }\n catch (err) {\n this.log.warn(\"initialization failed: \" + (err === null || err === void 0 ? void 0 : err.message));\n callback(Braintree.braintreeError(CdvPurchase.ErrorCode.SETUP, 'Failed to initialize Braintree Android Bridge: ' + (err === null || err === void 0 ? void 0 : err.message)));\n }\n }\n /**\n * Fetches a client token and sends it to the SDK.\n *\n * This method is called by the native side when the SDK requests a Client Token.\n */\n getClientToken() {\n this.log.info(\"getClientToken()\");\n if (this.clientTokenProvider) {\n this.log.debug(\"clientTokenProvider set, calling.\");\n this.clientTokenProvider((value) => {\n if (typeof value === 'string') {\n window.cordova.exec(null, null, PLUGIN_ID, \"onClientTokenSuccess\", [value]);\n }\n else {\n window.cordova.exec(null, null, PLUGIN_ID, \"onClientTokenFailure\", [value.code, value.message]);\n }\n });\n }\n else {\n this.log.debug(\"clientTokenProvider not set, retrying later...\");\n setTimeout(() => this.getClientToken(), 1000); // retry after 1s (over and over)\n }\n }\n /** Returns true on Android, the only platform supported by this Braintree bridge */\n static isSupported() {\n return CdvPurchase.Utils.platformId() === 'android';\n }\n isApplePaySupported() {\n return __awaiter(this, void 0, void 0, function* () {\n return false;\n });\n }\n launchDropIn(dropInRequest) {\n return new Promise(resolve => {\n window.cordova.exec((result) => {\n this.log.info(\"dropInSuccess: \" + JSON.stringify(result));\n resolve(result);\n }, (err) => {\n this.log.info(\"dropInFailure: \" + err);\n const errCode = err.split(\"|\")[0];\n const errMessage = err.split(\"|\").slice(1).join('');\n if (errCode === \"UserCanceledException\") {\n resolve(Braintree.braintreeError(CdvPurchase.ErrorCode.PAYMENT_CANCELLED, errMessage));\n }\n else if (errCode === \"AuthorizationException\") {\n resolve(Braintree.braintreeError(CdvPurchase.ErrorCode.UNAUTHORIZED_REQUEST_DATA, errMessage));\n }\n else {\n resolve(Braintree.braintreeError(CdvPurchase.ErrorCode.UNKNOWN, err));\n }\n }, PLUGIN_ID, \"launchDropIn\", [dropInRequest]);\n });\n }\n }\n AndroidBridge.Bridge = Bridge;\n // /**\n // * Successful callback result for the presentDropInPaymentUI method.\n // */\n // interface PaymentUIResult {\n // /**\n // * Indicates if the user used the cancel button to close the dialog without\n // * completing the payment.\n // */\n // userCancelled: boolean;\n // /**\n // * The nonce for the payment transaction (if a payment was completed).\n // */\n // nonce: string;\n // /**\n // * The payment type (if a payment was completed).\n // */\n // type: string;\n // /**\n // * A description of the payment method (if a payment was completed).\n // */\n // localizedDescription: string;\n // /**\n // * Information about the credit card used to complete a payment (if a credit card was used).\n // */\n // card: {\n // /**\n // * The last two digits of the credit card used.\n // */\n // lastTwo: string;\n // /**\n // * An enumerated value used to indicate the type of credit card used.\n // *\n // * Can be one of the following values:\n // *\n // * BTCardNetworkUnknown\n // * BTCardNetworkAMEX\n // * BTCardNetworkDinersClub\n // * BTCardNetworkDiscover\n // * BTCardNetworkMasterCard\n // * BTCardNetworkVisa\n // * BTCardNetworkJCB\n // * BTCardNetworkLaser\n // * BTCardNetworkMaestro\n // * BTCardNetworkUnionPay\n // * BTCardNetworkSolo\n // * BTCardNetworkSwitch\n // * BTCardNetworkUKMaestro\n // */\n // network: string;\n // };\n // /**\n // * Information about the PayPal account used to complete a payment (if a PayPal account was used).\n // */\n // payPalAccount: {\n // email: string;\n // firstName: string;\n // lastName: string;\n // phone: string;\n // billingAddress: string;\n // shippingAddress: string;\n // clientMetadataId: string;\n // payerId: string;\n // };\n // /**\n // * Information about the Apple Pay card used to complete a payment (if Apple Pay was used).\n // */\n // applePaycard: {\n // };\n // /**\n // * Information about 3D Secure card used to complete a payment (if 3D Secure was used).\n // */\n // threeDSecureInfo: {\n // liabilityShifted: boolean;\n // liabilityShiftPossible: boolean;\n // };\n // /**\n // * Information about Venmo account used to complete a payment (if a Venmo account was used).\n // */\n // venmoAccount: {\n // username: string;\n // };\n // }\n })(AndroidBridge = Braintree.AndroidBridge || (Braintree.AndroidBridge = {}));\n })(Braintree = CdvPurchase.Braintree || (CdvPurchase.Braintree = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n let Braintree;\n (function (Braintree) {\n let IosBridge;\n (function (IosBridge) {\n /**\n * Cordova plugin ID for the braintree-applepay plugin.\n */\n const PLUGIN_ID = 'BraintreeApplePayPlugin';\n /**\n * Bridge to the cordova-plugin-purchase-braintree-applepay plugin\n */\n class ApplePayPlugin {\n /**\n * Retrieve the plugin definition.\n *\n * Useful to check if it is installed.\n */\n static get() {\n return window.CdvPurchaseBraintreeApplePay;\n }\n /**\n * Initiate a payment with Apple Pay.\n */\n static requestPayment(request) {\n return new Promise(resolve => {\n var _a;\n if (!((_a = ApplePayPlugin.get()) === null || _a === void 0 ? void 0 : _a.installed)) {\n return resolve(Braintree.braintreeError(CdvPurchase.ErrorCode.SETUP, 'cordova-plugin-purchase-braintree-applepay does not appear to be installed.'));\n }\n else {\n const success = (result) => {\n resolve(result);\n };\n const failure = (err) => {\n const message = err !== null && err !== void 0 ? err : 'payment request failed';\n resolve(Braintree.braintreeError(CdvPurchase.ErrorCode.PURCHASE, 'Braintree+ApplePay ERROR: ' + message));\n };\n window.cordova.exec(success, failure, PLUGIN_ID, 'presentDropInPaymentUI', [request]);\n }\n });\n }\n /**\n * Returns true if the device supports Apple Pay.\n *\n * This does not necessarily mean the user has a card setup already.\n */\n static isSupported(log) {\n return new Promise(resolve => {\n var _a;\n if (CdvPurchase.Utils.platformId() !== 'ios') {\n log.info('BraintreeApplePayPlugin is only available for ios.');\n return resolve(false);\n }\n if (!((_a = ApplePayPlugin.get()) === null || _a === void 0 ? void 0 : _a.installed)) {\n log.info('BraintreeApplePayPlugin does not appear to be installed.');\n return resolve(false);\n }\n try {\n window.cordova.exec((result) => {\n resolve(result);\n }, () => {\n log.info('BraintreeApplePayPlugin is not available.');\n resolve(false);\n }, PLUGIN_ID, \"isApplePaySupported\", []);\n }\n catch (err) {\n log.info('BraintreeApplePayPlugin is not installed.');\n resolve(false);\n }\n });\n }\n }\n IosBridge.ApplePayPlugin = ApplePayPlugin;\n })(IosBridge = Braintree.IosBridge || (Braintree.IosBridge = {}));\n })(Braintree = CdvPurchase.Braintree || (CdvPurchase.Braintree = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n let Braintree;\n (function (Braintree) {\n /**\n * Cordova plugin ID for the braintree ios plugin.\n */\n const PLUGIN_ID = 'BraintreePlugin';\n let IosBridge;\n (function (IosBridge) {\n class Bridge {\n constructor(log, clientTokenProvider, applePayOptions) {\n this.log = log.child(\"IosBridge\");\n this.clientTokenProvider = clientTokenProvider;\n this.applePayOptions = applePayOptions;\n }\n initialize(verbosity, callback) {\n window.cordova.exec(null, null, \"BraintreePlugin\", \"setVerbosity\", [verbosity.verbosity]);\n window.cordova.exec(message => this.log.debug('(Native) ' + message), null, \"BraintreePlugin\", \"setLogger\", []);\n setTimeout(() => callback(undefined), 0);\n }\n continueDropInForApplePay(paymentRequest, DropInRequest, dropInResult) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j;\n return __awaiter(this, void 0, void 0, function* () {\n const request = ((_b = (_a = this.applePayOptions) === null || _a === void 0 ? void 0 : _a.preparePaymentRequest) === null || _b === void 0 ? void 0 : _b.call(_a, paymentRequest)) || {\n merchantCapabilities: [CdvPurchase.ApplePay.MerchantCapability.ThreeDS],\n };\n if (!request.paymentSummaryItems) {\n const items = paymentRequest.items.filter(p => p).map((product, index) => {\n var _a, _b, _c;\n return ({\n type: 'final',\n label: (product === null || product === void 0 ? void 0 : product.title) || (product === null || product === void 0 ? void 0 : product.id) || `Item #${index + 1}`,\n amount: `${Math.round(((_c = (_b = (_a = product === null || product === void 0 ? void 0 : product.pricing) === null || _a === void 0 ? void 0 : _a.priceMicros) !== null && _b !== void 0 ? _b : paymentRequest.amountMicros) !== null && _c !== void 0 ? _c : 0) / 10000) / 100}`,\n });\n });\n const total = {\n type: 'final',\n label: (_d = (_c = this.applePayOptions) === null || _c === void 0 ? void 0 : _c.companyName) !== null && _d !== void 0 ? _d : 'Total',\n amount: `${Math.round(((_e = paymentRequest.amountMicros) !== null && _e !== void 0 ? _e : 0) / 10000) / 100}`,\n };\n request.paymentSummaryItems = [...items, total];\n }\n const result = yield IosBridge.ApplePayPlugin.requestPayment(request);\n this.log.info('Result from Apple Pay: ' + JSON.stringify(result));\n if ('isError' in result)\n return result;\n if (result.userCancelled) {\n return Braintree.braintreeError(CdvPurchase.ErrorCode.PAYMENT_CANCELLED, 'User cancelled the payment request');\n }\n return {\n paymentMethodNonce: {\n isDefault: false,\n nonce: (_g = (_f = result.applePayCardNonce) === null || _f === void 0 ? void 0 : _f.nonce) !== null && _g !== void 0 ? _g : '',\n type: (_j = (_h = result.applePayCardNonce) === null || _h === void 0 ? void 0 : _h.type) !== null && _j !== void 0 ? _j : '',\n },\n paymentMethodType: dropInResult.paymentMethodType,\n deviceData: dropInResult.deviceData,\n paymentDescription: dropInResult.paymentDescription,\n };\n });\n }\n launchDropIn(paymentRequest, dropInRequest) {\n return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {\n const onSuccess = (result) => {\n this.log.info(\"dropInSuccess: \" + JSON.stringify(result));\n if (result.paymentMethodType === Braintree.DropIn.PaymentMethod.APPLE_PAY) {\n this.log.info(\"it's an ApplePay request, we have to process it.\");\n this.continueDropInForApplePay(paymentRequest, dropInRequest, result).then(resolve);\n }\n else {\n resolve(result);\n }\n };\n const onError = (errorString) => {\n this.log.info(\"dropInFailure: \" + errorString);\n const [errCode, errMessage] = errorString.split('|');\n if (errCode === \"UserCanceledException\") {\n resolve(Braintree.braintreeError(CdvPurchase.ErrorCode.PAYMENT_CANCELLED, errMessage));\n }\n else {\n resolve(Braintree.braintreeError(CdvPurchase.ErrorCode.UNKNOWN, 'ERROR ' + errCode + ': ' + errMessage));\n }\n };\n this.clientTokenProvider((clientToken) => {\n if (typeof clientToken === 'string')\n window.cordova.exec(onSuccess, onError, \"BraintreePlugin\", \"launchDropIn\", [clientToken, dropInRequest]);\n else // failed to get token\n resolve(clientToken);\n });\n }));\n }\n braintreePlugin() {\n return window.CdvPurchaseBraintree;\n }\n static isSupported() {\n return CdvPurchase.Utils.platformId() === 'ios';\n }\n }\n IosBridge.Bridge = Bridge;\n })(IosBridge = Braintree.IosBridge || (Braintree.IosBridge = {}));\n })(Braintree = CdvPurchase.Braintree || (CdvPurchase.Braintree = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n let Braintree;\n (function (Braintree) {\n let DropIn;\n (function (DropIn) {\n /** How a field will behave in CardForm. */\n let CardFormFieldStatus;\n (function (CardFormFieldStatus) {\n CardFormFieldStatus[CardFormFieldStatus[\"DISABLED\"] = 0] = \"DISABLED\";\n CardFormFieldStatus[CardFormFieldStatus[\"OPTIONAL\"] = 1] = \"OPTIONAL\";\n CardFormFieldStatus[CardFormFieldStatus[\"REQUIRED\"] = 2] = \"REQUIRED\";\n })(CardFormFieldStatus = DropIn.CardFormFieldStatus || (DropIn.CardFormFieldStatus = {}));\n })(DropIn = Braintree.DropIn || (Braintree.DropIn = {}));\n })(Braintree = CdvPurchase.Braintree || (CdvPurchase.Braintree = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n let Braintree;\n (function (Braintree) {\n let DropIn;\n (function (DropIn) {\n /** Payment method used or selected by the user. */\n let PaymentMethod;\n (function (PaymentMethod) {\n /** Google only */\n PaymentMethod[\"GOOGLE_PAY\"] = \"GOOGLE_PAY\";\n /** ios only */\n PaymentMethod[\"LASER\"] = \"LASER\";\n /** ios only */\n PaymentMethod[\"UK_MAESTRO\"] = \"UK_MAESTRO\";\n /** ios only */\n PaymentMethod[\"SWITCH\"] = \"SWITCH\";\n /** ios only */\n PaymentMethod[\"SOLOR\"] = \"SOLO\";\n /** ios only */\n PaymentMethod[\"APPLE_PAY\"] = \"APPLE_PAY\";\n PaymentMethod[\"AMEX\"] = \"AMEX\";\n PaymentMethod[\"DINERS_CLUB\"] = \"DINERS_CLUB\";\n PaymentMethod[\"DISCOVER\"] = \"DISCOVER\";\n PaymentMethod[\"JCB\"] = \"JCB\";\n PaymentMethod[\"MAESTRO\"] = \"MAESTRO\";\n PaymentMethod[\"MASTERCARD\"] = \"MASTERCARD\";\n PaymentMethod[\"PAYPAL\"] = \"PAYPAL\";\n PaymentMethod[\"VISA\"] = \"VISA\";\n PaymentMethod[\"VENMO\"] = \"VENMO\";\n PaymentMethod[\"UNIONPAY\"] = \"UNIONPAY\";\n PaymentMethod[\"HIPER\"] = \"HIPER\";\n PaymentMethod[\"HIPERCARD\"] = \"HIPERCARD\";\n PaymentMethod[\"UNKNOWN\"] = \"UNKNOWN\";\n })(PaymentMethod = DropIn.PaymentMethod || (DropIn.PaymentMethod = {}));\n })(DropIn = Braintree.DropIn || (Braintree.DropIn = {}));\n })(Braintree = CdvPurchase.Braintree || (CdvPurchase.Braintree = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n let Braintree;\n (function (Braintree) {\n let GooglePay;\n (function (GooglePay) {\n /**\n * The Google Pay API will collect the billing address for you if required\n */\n let BillingAddressFormat;\n (function (BillingAddressFormat) {\n /**\n * When this format is used, the billing address returned will only contain the minimal info, including name, country code, and postal code.\n *\n * Note that some countries do not use postal codes, so the postal code field will be empty in those countries.\n */\n BillingAddressFormat[BillingAddressFormat[\"MIN\"] = 0] = \"MIN\";\n /**\n * When this format is used, the billing address returned will be the full address.\n *\n * Only select this format when it's required to process the order since it can increase friction during the checkout process and can lead to a lower conversion rate.\n */\n BillingAddressFormat[BillingAddressFormat[\"FULL\"] = 1] = \"FULL\";\n })(BillingAddressFormat = GooglePay.BillingAddressFormat || (GooglePay.BillingAddressFormat = {}));\n /**\n * This enum represents the status of the total price of a transaction.\n *\n * It can take on one of the following values:\n * - TotalPriceStatus.NOT_CURRENTLY_KNOWN: The total price is not currently known.\n * - TotalPriceStatus.ESTIMATED: The total price is an estimate.\n * - TotalPriceStatus.FINAL: The total price is final.\n */\n let TotalPriceStatus;\n (function (TotalPriceStatus) {\n /** The total price is not currently known. */\n TotalPriceStatus[TotalPriceStatus[\"NOT_CURRENTLY_KNOWN\"] = 1] = \"NOT_CURRENTLY_KNOWN\";\n /** The total price is an estimate. */\n TotalPriceStatus[TotalPriceStatus[\"ESTIMATED\"] = 2] = \"ESTIMATED\";\n /** The total price is final. */\n TotalPriceStatus[TotalPriceStatus[\"FINAL\"] = 3] = \"FINAL\";\n })(TotalPriceStatus = GooglePay.TotalPriceStatus || (GooglePay.TotalPriceStatus = {}));\n })(GooglePay = Braintree.GooglePay || (Braintree.GooglePay = {}));\n })(Braintree = CdvPurchase.Braintree || (CdvPurchase.Braintree = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n let Braintree;\n (function (Braintree) {\n let ThreeDSecure;\n (function (ThreeDSecure) {\n /** The account type */\n let AccountType;\n (function (AccountType) {\n AccountType[\"UNSPECIFIED\"] = \"00\";\n AccountType[\"CREDIT\"] = \"01\";\n AccountType[\"DEBIT\"] = \"02\";\n })(AccountType = ThreeDSecure.AccountType || (ThreeDSecure.AccountType = {}));\n /** The shipping method */\n let ShippingMethod;\n (function (ShippingMethod) {\n /** Unspecified */\n ShippingMethod[ShippingMethod[\"UNSPECIFIED\"] = 0] = \"UNSPECIFIED\";\n /** Same say */\n ShippingMethod[ShippingMethod[\"SAME_DAY\"] = 1] = \"SAME_DAY\";\n /** Overnight / Expedited */\n ShippingMethod[ShippingMethod[\"EXPEDITED\"] = 2] = \"EXPEDITED\";\n /** Priority */\n ShippingMethod[ShippingMethod[\"PRIORITY\"] = 3] = \"PRIORITY\";\n /** Ground */\n ShippingMethod[ShippingMethod[\"GROUND\"] = 4] = \"GROUND\";\n /** Electronic delivery */\n ShippingMethod[ShippingMethod[\"ELECTRONIC_DELIVERY\"] = 5] = \"ELECTRONIC_DELIVERY\";\n /** Ship to store */\n ShippingMethod[ShippingMethod[\"SHIP_TO_STORE\"] = 6] = \"SHIP_TO_STORE\";\n })(ShippingMethod = ThreeDSecure.ShippingMethod || (ThreeDSecure.ShippingMethod = {}));\n let Version;\n (function (Version) {\n /** 3DS 1.0 */\n Version[Version[\"V1\"] = 0] = \"V1\";\n /** 3DS 2.0 */\n Version[Version[\"V2\"] = 1] = \"V2\";\n })(Version = ThreeDSecure.Version || (ThreeDSecure.Version = {}));\n })(ThreeDSecure = Braintree.ThreeDSecure || (Braintree.ThreeDSecure = {}));\n })(Braintree = CdvPurchase.Braintree || (CdvPurchase.Braintree = {}));\n})(CdvPurchase || (CdvPurchase = {}));\n/// <reference path=\"../../receipt.ts\" />\n/// <reference path=\"../../transaction.ts\" />\nvar CdvPurchase;\n(function (CdvPurchase) {\n let GooglePlay;\n (function (GooglePlay) {\n class Transaction extends CdvPurchase.Transaction {\n constructor(purchase, parentReceipt, decorator) {\n super(CdvPurchase.Platform.GOOGLE_PLAY, parentReceipt, decorator);\n this.nativePurchase = purchase;\n this.refresh(purchase, true);\n }\n static toState(fromConstructor, state, isAcknowledged, isConsumed) {\n switch (state) {\n case GooglePlay.Bridge.PurchaseState.PENDING:\n return CdvPurchase.TransactionState.INITIATED;\n case GooglePlay.Bridge.PurchaseState.PURCHASED:\n // Note: we still want to validate acknowledged non-consumables and subscriptions,\n // so we don't return APPROVED\n if (isConsumed)\n return CdvPurchase.TransactionState.FINISHED;\n else if (isAcknowledged)\n return CdvPurchase.TransactionState.APPROVED;\n else if (fromConstructor)\n return CdvPurchase.TransactionState.INITIATED;\n else\n return CdvPurchase.TransactionState.APPROVED;\n case GooglePlay.Bridge.PurchaseState.UNSPECIFIED_STATE:\n return CdvPurchase.TransactionState.UNKNOWN_STATE;\n }\n }\n /**\n * Refresh the value in the transaction based on the native purchase update\n */\n refresh(purchase, fromConstructor) {\n var _a, _b;\n this.nativePurchase = purchase;\n this.transactionId = `${purchase.orderId || purchase.purchaseToken}`;\n this.purchaseId = `${purchase.purchaseToken}`;\n this.products = purchase.productIds.map(productId => ({ id: productId }));\n if (purchase.purchaseTime)\n this.purchaseDate = new Date(purchase.purchaseTime);\n this.isPending = (purchase.getPurchaseState === GooglePlay.Bridge.PurchaseState.PENDING);\n if (typeof purchase.acknowledged !== 'undefined')\n this.isAcknowledged = purchase.acknowledged;\n if (typeof purchase.consumed !== 'undefined')\n this.isConsumed = purchase.consumed;\n if (typeof purchase.autoRenewing !== 'undefined')\n this.renewalIntent = purchase.autoRenewing ? CdvPurchase.RenewalIntent.RENEW : CdvPurchase.RenewalIntent.LAPSE;\n this.state = Transaction.toState(fromConstructor !== null && fromConstructor !== void 0 ? fromConstructor : false, purchase.getPurchaseState, (_a = this.isAcknowledged) !== null && _a !== void 0 ? _a : false, (_b = this.isConsumed) !== null && _b !== void 0 ? _b : false);\n }\n }\n GooglePlay.Transaction = Transaction;\n class Receipt extends CdvPurchase.Receipt {\n /** @internal */\n constructor(purchase, decorator) {\n super(CdvPurchase.Platform.GOOGLE_PLAY, decorator);\n this.transactions = [new Transaction(purchase, this, decorator)];\n this.purchaseToken = purchase.purchaseToken;\n this.orderId = purchase.orderId;\n }\n /** Refresh the content of the purchase based on the native BridgePurchase */\n refreshPurchase(purchase) {\n var _a;\n (_a = this.transactions[0]) === null || _a === void 0 ? void 0 : _a.refresh(purchase);\n this.orderId = purchase.orderId;\n }\n }\n GooglePlay.Receipt = Receipt;\n class Adapter {\n constructor(context, autoRefreshIntervalMillis = 1000 * 3600 * 24) {\n /** Adapter identifier */\n this.id = CdvPurchase.Platform.GOOGLE_PLAY;\n /** Adapter name */\n this.name = 'GooglePlay';\n /** Has the adapter been successfully initialized */\n this.ready = false;\n this.supportsParallelLoading = false;\n this._receipts = [];\n /** The GooglePlay bridge */\n this.bridge = new GooglePlay.Bridge.Bridge();\n /** Prevent double initialization */\n this.initialized = false;\n /** Used to retry failed commands */\n this.retry = new CdvPurchase.Internal.Retry();\n this.autoRefreshIntervalMillis = 0;\n if (Adapter._instance)\n throw new Error('GooglePlay adapter already initialized');\n this._products = new GooglePlay.Products(context.apiDecorators);\n this.autoRefreshIntervalMillis = autoRefreshIntervalMillis;\n this.context = context;\n this.log = context.log.child('GooglePlay');\n Adapter._instance = this;\n }\n /** List of products managed by the GooglePlay adapter */\n get products() { return this._products.products; }\n get receipts() { return this._receipts; }\n /** Returns true on Android, the only platform supported by this adapter */\n get isSupported() {\n return CdvPurchase.Utils.platformId() === 'android';\n }\n initialize() {\n return __awaiter(this, void 0, void 0, function* () {\n this.log.info(\"Initialize\");\n if (this.initializationPromise)\n return this.initializationPromise;\n return this.initializationPromise = new Promise((resolve) => {\n const bridgeLogger = this.log.child('Bridge');\n const iabOptions = {\n onSetPurchases: this.onSetPurchases.bind(this),\n onPurchasesUpdated: this.onPurchasesUpdated.bind(this),\n onPurchaseConsumed: this.onPurchaseConsumed.bind(this),\n showLog: this.context.verbosity >= CdvPurchase.LogLevel.DEBUG ? true : false,\n log: (msg) => bridgeLogger.info(msg),\n };\n const iabReady = () => {\n this.log.debug(\"Ready\");\n // Auto-refresh every 24 hours (or autoRefreshIntervalMillis)\n if (this.autoRefreshIntervalMillis > 0) {\n window.setInterval(() => this.getPurchases(), this.autoRefreshIntervalMillis);\n }\n resolve(undefined);\n };\n const iabError = (err) => {\n this.initialized = false;\n this.context.error(playStoreError(CdvPurchase.ErrorCode.SETUP, \"Init failed - \" + err, null));\n this.retry.retry(() => this.initialize());\n };\n this.bridge.init(iabReady, iabError, iabOptions);\n });\n });\n }\n /** Prepare the list of SKUs sorted by type */\n getSkusOf(products) {\n const inAppSkus = [];\n const subsSkus = [];\n for (const product of products) {\n if (product.type === CdvPurchase.ProductType.PAID_SUBSCRIPTION)\n subsSkus.push(product.id);\n else\n inAppSkus.push(product.id);\n }\n return { inAppSkus, subsSkus };\n }\n /** @inheritdoc */\n loadReceipts() {\n return new Promise((resolve) => {\n // let's also refresh purchases\n this.getPurchases()\n .then(err => {\n resolve(this._receipts);\n });\n });\n }\n /** @inheritDoc */\n loadProducts(products) {\n return new Promise((resolve) => {\n this.log.debug(\"Load: \" + JSON.stringify(products));\n /** Called when a list of product definitions have been loaded */\n const iabLoaded = (validProducts) => {\n this.log.debug(\"Loaded: \" + JSON.stringify(validProducts));\n // Add type check to handle invalid responses\n if (!Array.isArray(validProducts)) {\n const message = `Invalid product list received: ${JSON.stringify(validProducts)}, retrying later...`;\n this.log.warn(message);\n this.retry.retry(go);\n this.context.error(playStoreError(CdvPurchase.ErrorCode.LOAD, message, null));\n return;\n }\n const ret = products.map(registeredProduct => {\n const validProduct = validProducts.find(vp => vp.productId === registeredProduct.id);\n if (validProduct && validProduct.productId) {\n return this._products.addProduct(registeredProduct, validProduct);\n }\n else {\n return playStoreError(CdvPurchase.ErrorCode.INVALID_PRODUCT_ID, `Product with id ${registeredProduct.id} not found.`, registeredProduct.id);\n }\n });\n resolve(ret);\n };\n /** Start loading products */\n const go = () => {\n const { inAppSkus, subsSkus } = this.getSkusOf(products);\n this.log.debug(\"getAvailableProducts: \" + JSON.stringify(inAppSkus) + \" | \" + JSON.stringify(subsSkus));\n this.bridge.getAvailableProducts(inAppSkus, subsSkus, iabLoaded, (err) => {\n // failed to load products, retry later.\n this.retry.retry(go);\n this.context.error(playStoreError(CdvPurchase.ErrorCode.LOAD, 'Loading product info failed - ' + err + ' - retrying later...', null));\n });\n };\n go();\n });\n }\n /** @inheritDoc */\n finish(transaction) {\n return new Promise(resolve => {\n const onSuccess = () => {\n if (transaction.state !== CdvPurchase.TransactionState.FINISHED) {\n transaction.state = CdvPurchase.TransactionState.FINISHED;\n this.context.listener.receiptsUpdated(CdvPurchase.Platform.GOOGLE_PLAY, [transaction.parentReceipt]);\n }\n resolve(undefined);\n };\n const firstProduct = transaction.products[0];\n if (!firstProduct)\n return resolve(playStoreError(CdvPurchase.ErrorCode.FINISH, 'Cannot finish a transaction with no product', null));\n const product = this._products.getProduct(firstProduct.id);\n if (!product)\n return resolve(playStoreError(CdvPurchase.ErrorCode.FINISH, 'Cannot finish transaction, unknown product ' + firstProduct.id, firstProduct.id));\n const receipt = this._receipts.find(r => r.hasTransaction(transaction));\n if (!receipt)\n return resolve(playStoreError(CdvPurchase.ErrorCode.FINISH, 'Cannot finish transaction, linked receipt not found.', product.id));\n if (!receipt.purchaseToken)\n return resolve(playStoreError(CdvPurchase.ErrorCode.FINISH, 'Cannot finish transaction, linked receipt contains no purchaseToken.', product.id));\n const onFailure = (message, code) => resolve(playStoreError(code || CdvPurchase.ErrorCode.UNKNOWN, message, product.id));\n if (product.type === CdvPurchase.ProductType.NON_RENEWING_SUBSCRIPTION || product.type === CdvPurchase.ProductType.CONSUMABLE) {\n if (!transaction.isConsumed)\n return this.bridge.consumePurchase(onSuccess, onFailure, receipt.purchaseToken);\n }\n else { // subscription and non-consumable\n if (!transaction.isAcknowledged)\n return this.bridge.acknowledgePurchase(onSuccess, onFailure, receipt.purchaseToken);\n }\n // nothing to do\n resolve(undefined);\n });\n }\n /** Called by the bridge when a purchase has been consumed */\n onPurchaseConsumed(purchase) {\n this.log.debug(\"onPurchaseConsumed: \" + purchase.orderId);\n purchase.acknowledged = true; // consumed is the equivalent of acknowledged for consumables\n purchase.consumed = true;\n this.onPurchasesUpdated([purchase]);\n }\n /** Called when the platform reports update for some purchases */\n onPurchasesUpdated(purchases) {\n this.log.debug(\"onPurchaseUpdated: \" + purchases.map(p => p.orderId).join(', '));\n // GooglePlay generates one receipt for each purchase\n purchases.forEach(purchase => {\n const existingReceipt = this.receipts.find(r => r.purchaseToken === purchase.purchaseToken);\n if (existingReceipt) {\n existingReceipt.refreshPurchase(purchase);\n this.context.listener.receiptsUpdated(CdvPurchase.Platform.GOOGLE_PLAY, [existingReceipt]);\n }\n else {\n const newReceipt = new Receipt(purchase, this.context.apiDecorators);\n this.receipts.push(newReceipt);\n this.context.listener.receiptsUpdated(CdvPurchase.Platform.GOOGLE_PLAY, [newReceipt]);\n if (newReceipt.transactions[0].state === CdvPurchase.TransactionState.INITIATED && !newReceipt.transactions[0].isPending) {\n // For compatibility, we set the state of \"new\" purchases to initiated from the constructor,\n // they'll got to \"approved\" when refreshed.\n // this way, users receive the \"initiated\" event, then \"approved\"\n newReceipt.refreshPurchase(purchase);\n this.context.listener.receiptsUpdated(CdvPurchase.Platform.GOOGLE_PLAY, [newReceipt]);\n }\n }\n });\n }\n /** Called when the platform reports some purchases */\n onSetPurchases(purchases) {\n this.log.debug(\"onSetPurchases: \" + JSON.stringify(purchases));\n this.onPurchasesUpdated(purchases);\n this.context.listener.receiptsReady(CdvPurchase.Platform.GOOGLE_PLAY);\n }\n onPriceChangeConfirmationResult(result) {\n }\n /** Refresh purchases from GooglePlay */\n getPurchases() {\n return new Promise(resolve => {\n this.log.debug('getPurchases');\n const success = () => {\n this.log.debug('getPurchases success');\n setTimeout(() => resolve(undefined), 0);\n };\n const failure = (message, code) => {\n this.log.warn('getPurchases failed: ' + message + ' (' + code + ')');\n setTimeout(() => resolve(playStoreError(code || CdvPurchase.ErrorCode.UNKNOWN, message, null)), 0);\n };\n this.bridge.getPurchases(success, failure);\n });\n }\n /** @inheritDoc */\n order(offer, additionalData) {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise(resolve => {\n this.log.info(\"Order - \" + JSON.stringify(offer));\n const buySuccess = () => resolve(undefined);\n const buyFailed = (message, code) => {\n this.log.warn('Order failed: ' + JSON.stringify({ message, code }));\n resolve(playStoreError(code !== null && code !== void 0 ? code : CdvPurchase.ErrorCode.UNKNOWN, message, offer.productId));\n };\n if (offer.productType === CdvPurchase.ProductType.PAID_SUBSCRIPTION) {\n const idAndToken = 'token' in offer ? offer.productId + '@' + offer.token : offer.productId;\n // find if the user already owns a product in the same group\n const oldPurchaseToken = this.findOldPurchaseToken(offer.productId, offer.productGroup);\n if (oldPurchaseToken) {\n if (!additionalData.googlePlay)\n additionalData.googlePlay = { oldPurchaseToken };\n else if (!additionalData.googlePlay.oldPurchaseToken) {\n additionalData.googlePlay.oldPurchaseToken = oldPurchaseToken;\n }\n }\n this.bridge.subscribe(buySuccess, buyFailed, idAndToken, additionalData);\n }\n else {\n this.bridge.buy(buySuccess, buyFailed, offer.productId, additionalData);\n }\n });\n });\n }\n /**\n * Find a purchaseToken for an owned product in the same group as the requested one.\n *\n * @param productId - The product identifier to request matching purchaseToken for.\n * @param productGroup - The group of the product to request matching purchaseToken for.\n *\n * @return A purchaseToken, undefined if none have been found.\n */\n findOldPurchaseToken(productId, productGroup) {\n if (!productGroup)\n return undefined;\n const oldReceipt = this._receipts.find(r => {\n return !!r.transactions.find(t => {\n return !!t.products.find(p => {\n const product = this._products.getProduct(p.id);\n if (!product)\n return false;\n if (!CdvPurchase.Internal.LocalReceipts.isOwned([r], product))\n return false;\n return (p.id === productId) || (productGroup && product.group === productGroup);\n });\n });\n });\n return oldReceipt === null || oldReceipt === void 0 ? void 0 : oldReceipt.purchaseToken;\n }\n /**\n * Prepare for receipt validation\n */\n receiptValidationBody(receipt) {\n var _a;\n return __awaiter(this, void 0, void 0, function* () {\n const transaction = receipt.transactions[0];\n if (!transaction)\n return;\n const productId = (_a = transaction.products[0]) === null || _a === void 0 ? void 0 : _a.id;\n if (!productId)\n return;\n const product = this._products.getProduct(productId);\n if (!product)\n return;\n const purchase = transaction.nativePurchase;\n return {\n id: productId,\n type: product.type,\n offers: product.offers,\n products: this._products.products,\n transaction: {\n type: CdvPurchase.Platform.GOOGLE_PLAY,\n id: receipt.transactions[0].transactionId,\n purchaseToken: purchase.purchaseToken,\n signature: purchase.signature,\n receipt: purchase.receipt,\n }\n };\n });\n }\n handleReceiptValidationResponse(receipt, response) {\n var _a;\n return __awaiter(this, void 0, void 0, function* () {\n if (response === null || response === void 0 ? void 0 : response.ok) {\n const transaction = (_a = response === null || response === void 0 ? void 0 : response.data) === null || _a === void 0 ? void 0 : _a.transaction;\n if ((transaction === null || transaction === void 0 ? void 0 : transaction.type) !== CdvPurchase.Platform.GOOGLE_PLAY)\n return;\n switch (transaction.kind) {\n case 'androidpublisher#productPurchase':\n break;\n case 'androidpublisher#subscriptionPurchase':\n break;\n case 'androidpublisher#subscriptionPurchaseV2':\n transaction;\n break;\n case 'fovea#subscriptionGone':\n // the transaction doesn't exist anymore\n break;\n }\n }\n return; // Nothing specific to do on GooglePlay\n });\n }\n requestPayment(payment, additionalData) {\n return __awaiter(this, void 0, void 0, function* () {\n return playStoreError(CdvPurchase.ErrorCode.UNKNOWN, 'requestPayment not supported', null);\n });\n }\n manageSubscriptions() {\n return __awaiter(this, void 0, void 0, function* () {\n this.bridge.manageSubscriptions();\n return;\n });\n }\n manageBilling() {\n return __awaiter(this, void 0, void 0, function* () {\n this.bridge.manageBilling();\n return;\n });\n }\n checkSupport(functionality) {\n const supported = [\n 'order', 'manageBilling', 'manageSubscriptions'\n ];\n return supported.indexOf(functionality) >= 0;\n }\n restorePurchases() {\n return new Promise(resolve => {\n this.bridge.getPurchases(() => resolve(undefined), (message, code) => {\n this.log.warn('getPurchases() failed: ' + (code !== null && code !== void 0 ? code : 'ERROR') + ': ' + message);\n resolve(playStoreError(code !== null && code !== void 0 ? code : CdvPurchase.ErrorCode.UNKNOWN, message, null));\n });\n });\n }\n }\n Adapter.trimProductTitles = true;\n GooglePlay.Adapter = Adapter;\n function playStoreError(code, message, productId) {\n return CdvPurchase.storeError(code, message, CdvPurchase.Platform.GOOGLE_PLAY, productId);\n }\n })(GooglePlay = CdvPurchase.GooglePlay || (CdvPurchase.GooglePlay = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n let GooglePlay;\n (function (GooglePlay) {\n let Bridge;\n (function (Bridge) {\n /* export namespace V11 {\n export interface Subscription {\n product_format: \"v11.0\";\n productId: string;\n title: string;\n name: string;\n billing_period: string;\n billing_period_unit: string;\n description: string;\n price: string;\n price_amount_micros: string;\n price_currency_code: string;\n trial_period: string;\n trial_period_unit: string;\n formatted_price: string;\n freeTrialPeriod: string;\n introductoryPrice: string;\n introductoryPriceAmountMicros: string;\n introductoryPriceCycles: string;\n introductoryPricePeriod: string;\n subscriptionPeriod: string;\n }\n } */\n let RecurrenceMode;\n (function (RecurrenceMode) {\n RecurrenceMode[\"FINITE_RECURRING\"] = \"FINITE_RECURRING\";\n RecurrenceMode[\"INFINITE_RECURRING\"] = \"INFINITE_RECURRING\";\n RecurrenceMode[\"NON_RECURRING\"] = \"NON_RECURRING\";\n })(RecurrenceMode = Bridge.RecurrenceMode || (Bridge.RecurrenceMode = {}));\n })(Bridge = GooglePlay.Bridge || (GooglePlay.Bridge = {}));\n })(GooglePlay = CdvPurchase.GooglePlay || (CdvPurchase.GooglePlay = {}));\n})(CdvPurchase || (CdvPurchase = {}));\n/*\n * Copyright (C) 2012-2013 by Guillaume Charhon\n * Modifications 10/16/2013 by Brian Thurlow\n */\n/*global cordova */\nvar CdvPurchase;\n(function (CdvPurchase) {\n let GooglePlay;\n (function (GooglePlay) {\n /**\n * Replace SKU ProrationMode.\n *\n * See https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.ProrationMode\n *\n * @deprecated Use {@link ReplacementMode}\n */\n let ProrationMode;\n (function (ProrationMode) {\n /** Replacement takes effect immediately, and the remaining time will be prorated and credited to the user. */\n ProrationMode[\"IMMEDIATE_WITH_TIME_PRORATION\"] = \"IMMEDIATE_WITH_TIME_PRORATION\";\n /** Replacement takes effect immediately, and the billing cycle remains the same. */\n ProrationMode[\"IMMEDIATE_AND_CHARGE_PRORATED_PRICE\"] = \"IMMEDIATE_AND_CHARGE_PRORATED_PRICE\";\n /** Replacement takes effect immediately, and the new price will be charged on next recurrence time. */\n ProrationMode[\"IMMEDIATE_WITHOUT_PRORATION\"] = \"IMMEDIATE_WITHOUT_PRORATION\";\n /** Replacement takes effect when the old plan expires, and the new price will be charged at the same time. */\n ProrationMode[\"DEFERRED\"] = \"DEFERRED\";\n /** Replacement takes effect immediately, and the user is charged full price of new plan and is given a full billing cycle of subscription, plus remaining prorated time from the old plan. */\n ProrationMode[\"IMMEDIATE_AND_CHARGE_FULL_PRICE\"] = \"IMMEDIATE_AND_CHARGE_FULL_PRICE\";\n })(ProrationMode = GooglePlay.ProrationMode || (GooglePlay.ProrationMode = {}));\n /**\n * Supported replacement modes to replace an existing subscription with a new one.\n *\n * @see {@link https://developer.android.com/google/play/billing/subscriptions#replacement-modes}\n */\n let ReplacementMode;\n (function (ReplacementMode) {\n /** Replacement takes effect immediately, and the remaining time will be prorated and credited to the user. */\n ReplacementMode[\"WITH_TIME_PRORATION\"] = \"IMMEDIATE_WITH_TIME_PRORATION\";\n /** Replacement takes effect immediately, and the billing cycle remains the same. */\n ReplacementMode[\"CHARGE_PRORATED_PRICE\"] = \"IMMEDIATE_AND_CHARGE_PRORATED_PRICE\";\n /** Replacement takes effect immediately, and the new price will be charged on next recurrence time. */\n ReplacementMode[\"WITHOUT_PRORATION\"] = \"IMMEDIATE_WITHOUT_PRORATION\";\n /** Replacement takes effect when the old plan expires, and the new price will be charged at the same time. */\n ReplacementMode[\"DEFERRED\"] = \"DEFERRED\";\n /** Replacement takes effect immediately, and the user is charged full price of new plan and is given a full billing cycle of subscription, plus remaining prorated time from the old plan. */\n ReplacementMode[\"CHARGE_FULL_PRICE\"] = \"IMMEDIATE_AND_CHARGE_FULL_PRICE\";\n })(ReplacementMode = GooglePlay.ReplacementMode || (GooglePlay.ReplacementMode = {}));\n let Bridge;\n (function (Bridge_2) {\n let log = function log(msg) {\n console.log(\"InAppBilling[js]: \" + msg);\n };\n let PurchaseState;\n (function (PurchaseState) {\n PurchaseState[PurchaseState[\"UNSPECIFIED_STATE\"] = 0] = \"UNSPECIFIED_STATE\";\n PurchaseState[PurchaseState[\"PURCHASED\"] = 1] = \"PURCHASED\";\n PurchaseState[PurchaseState[\"PENDING\"] = 2] = \"PENDING\";\n })(PurchaseState = Bridge_2.PurchaseState || (Bridge_2.PurchaseState = {}));\n class Bridge {\n constructor() {\n this.options = {};\n }\n init(success, fail, options) {\n if (!options)\n options = {};\n if (options.log)\n log = options.log;\n this.options = {\n showLog: options.showLog !== false,\n onPurchaseConsumed: options.onPurchaseConsumed,\n onPurchasesUpdated: options.onPurchasesUpdated,\n onSetPurchases: options.onSetPurchases,\n };\n if (this.options.showLog) {\n log('setup ok');\n }\n // Set a listener (see \"listener()\" function above)\n const listener = this.listener.bind(this);\n window.cordova.exec(listener, function (err) { }, \"InAppBillingPlugin\", \"setListener\", []);\n window.cordova.exec(success, errorCb(fail), \"InAppBillingPlugin\", \"init\", []);\n }\n load(success, fail, skus, inAppSkus, subsSkus) {\n var hasSKUs = false;\n // Optional Load SKUs to Inventory.\n if (typeof skus !== \"undefined\") {\n if (typeof skus === \"string\") {\n skus = [skus];\n }\n if (skus.length > 0) {\n if (typeof skus[0] !== 'string') {\n var msg = 'invalid productIds: ' + JSON.stringify(skus);\n if (this.options.showLog) {\n log(msg);\n }\n fail(msg, CdvPurchase.ErrorCode.INVALID_PRODUCT_ID);\n return;\n }\n if (this.options.showLog) {\n log('load ' + JSON.stringify(skus));\n }\n hasSKUs = true;\n }\n }\n window.cordova.exec(success, errorCb(fail), \"InAppBillingPlugin\", \"load\", [skus, inAppSkus, subsSkus]);\n }\n listener(msg) {\n // Handle changes to purchase that are being notified\n // through the PurchasesUpdatedListener on the native side (android)\n if (this.options.showLog) {\n log('listener: ' + JSON.stringify(msg));\n }\n if (!msg || !msg.type) {\n return;\n }\n if (msg.type === \"setPurchases\" && this.options.onSetPurchases) {\n this.options.onSetPurchases(msg.data.purchases);\n }\n if (msg.type === \"purchasesUpdated\" && this.options.onPurchasesUpdated) {\n this.options.onPurchasesUpdated(msg.data.purchases);\n }\n if (msg.type === \"purchaseConsumed\" && this.options.onPurchaseConsumed) {\n this.options.onPurchaseConsumed(msg.data.purchase);\n }\n if (msg.type === \"onPriceChangeConfirmationResultOK\" && this.options.onPriceChangeConfirmationResult) {\n this.options.onPriceChangeConfirmationResult(\"OK\");\n }\n if (msg.type === \"onPriceChangeConfirmationResultUserCanceled\" && this.options.onPriceChangeConfirmationResult) {\n this.options.onPriceChangeConfirmationResult(\"UserCanceled\");\n }\n if (msg.type === \"onPriceChangeConfirmationResultUnknownSku\" && this.options.onPriceChangeConfirmationResult) {\n this.options.onPriceChangeConfirmationResult(\"UnknownProduct\");\n }\n }\n getPurchases(success, fail) {\n if (this.options.showLog) {\n log('getPurchases()');\n }\n return window.cordova.exec(success, errorCb(fail), \"InAppBillingPlugin\", \"getPurchases\", [\"null\"]);\n }\n buy(success, fail, productId, additionalData) {\n if (this.options.showLog) {\n log('buy()');\n }\n return window.cordova.exec(success, errorCb(fail), \"InAppBillingPlugin\", \"buy\", [\n productId, extendAdditionalData(additionalData)\n ]);\n }\n subscribe(success, fail, productId, additionalData) {\n var _a;\n if (this.options.showLog) {\n log('subscribe()');\n }\n if (((_a = additionalData.googlePlay) === null || _a === void 0 ? void 0 : _a.oldPurchaseToken) && this.options.showLog) {\n log('subscribe() -> upgrading from an old purchase');\n }\n return window.cordova.exec(success, errorCb(fail), \"InAppBillingPlugin\", \"subscribe\", [\n productId, extendAdditionalData(additionalData)\n ]);\n }\n consumePurchase(success, fail, purchaseToken) {\n if (this.options.showLog) {\n log('consumePurchase()');\n }\n return window.cordova.exec(success, errorCb(fail), \"InAppBillingPlugin\", \"consumePurchase\", [purchaseToken]);\n }\n acknowledgePurchase(success, fail, purchaseToken) {\n if (this.options.showLog) {\n log('acknowledgePurchase()');\n }\n return window.cordova.exec(success, errorCb(fail), \"InAppBillingPlugin\", \"acknowledgePurchase\", [purchaseToken]);\n }\n getAvailableProducts(inAppSkus, subsSkus, success, fail) {\n if (this.options.showLog) {\n log('getAvailableProducts()');\n }\n return window.cordova.exec(success, errorCb(fail), \"InAppBillingPlugin\", \"getAvailableProducts\", [inAppSkus, subsSkus]);\n }\n manageSubscriptions() {\n return window.cordova.exec(function () { }, function () { }, \"InAppBillingPlugin\", \"manageSubscriptions\", []);\n }\n manageBilling() {\n return window.cordova.exec(function () { }, function () { }, \"InAppBillingPlugin\", \"manageBilling\", []);\n }\n launchPriceChangeConfirmationFlow(productId) {\n return window.cordova.exec(function () { }, function () { }, \"InAppBillingPlugin\", \"launchPriceChangeConfirmationFlow\", [productId]);\n }\n }\n Bridge_2.Bridge = Bridge;\n // Generates a `fail` function that accepts an optional error code\n // in the first part of the error string.\n //\n // format: `code|message`\n //\n // `fail` function will be called with `message` as a first argument\n // and `code` as a second argument (or undefined). This ensures\n // backward compatibility with legacy code\n function errorCb(fail) {\n return function (error) {\n if (!fail)\n return;\n const tokens = typeof error === 'string' ? error.split('|') : [];\n if (tokens.length > 1 && /^[-+]?(\\d+)$/.test(tokens[0])) {\n var code = tokens[0];\n var message = tokens[1];\n fail(message, +code);\n }\n else {\n fail(error);\n }\n };\n }\n function ensureObject(obj) {\n return !!obj && obj.constructor === Object ? obj : {};\n }\n function extendAdditionalData(ad) {\n const additionalData = ensureObject(ad === null || ad === void 0 ? void 0 : ad.googlePlay);\n if (!additionalData.accountId && (ad === null || ad === void 0 ? void 0 : ad.applicationUsername)) {\n additionalData.accountId = CdvPurchase.Utils.md5(ad.applicationUsername);\n }\n return additionalData;\n }\n })(Bridge = GooglePlay.Bridge || (GooglePlay.Bridge = {}));\n })(GooglePlay = CdvPurchase.GooglePlay || (CdvPurchase.GooglePlay = {}));\n})(CdvPurchase || (CdvPurchase = {}));\n/// <reference path=\"../../offer.ts\" />\nvar CdvPurchase;\n(function (CdvPurchase) {\n let GooglePlay;\n (function (GooglePlay) {\n class GProduct extends CdvPurchase.Product {\n }\n GooglePlay.GProduct = GProduct;\n class InAppOffer extends CdvPurchase.Offer {\n constructor() {\n super(...arguments);\n this.type = 'inapp';\n }\n }\n GooglePlay.InAppOffer = InAppOffer;\n class SubscriptionOffer extends CdvPurchase.Offer {\n constructor(options, decorator) {\n super(options, decorator);\n this.type = 'subs';\n this.tags = options.tags;\n this.token = options.token;\n }\n }\n GooglePlay.SubscriptionOffer = SubscriptionOffer;\n class Products {\n constructor(decorator) {\n /** List of products managed by the GooglePlay adapter */\n this.products = [];\n /** List of offers managed by the GooglePlay adapter */\n this.offers = [];\n this.decorator = decorator;\n }\n getProduct(id) {\n return this.products.find(p => p.id === id);\n }\n getOffer(id) {\n return this.offers.find(p => p.id === id);\n }\n /** */\n addProduct(registeredProduct, vp) {\n const existingProduct = this.getProduct(registeredProduct.id);\n const p = existingProduct !== null && existingProduct !== void 0 ? existingProduct : new GProduct(registeredProduct, this.decorator);\n p.title = vp.title || vp.name || p.title;\n if (GooglePlay.Adapter.trimProductTitles)\n p.title = p.title.replace(/ \\(.*\\)$/, '');\n p.description = vp.description || p.description;\n // Process the product depending on the format\n if ('product_format' in vp && vp.product_format === \"v12.0\") {\n if (vp.product_type === \"subs\")\n this.onSubsV12Loaded(p, vp);\n else\n this.onInAppLoaded(p, vp);\n }\n // else if ('billing_period_unit' in vp) {\n // return this.iabSubsV11Loaded(p, vp);\n // }\n else {\n this.onInAppLoaded(p, vp);\n }\n if (!existingProduct) {\n this.products.push(p);\n }\n return p;\n }\n onSubsV12Loaded(product, vp) {\n // console.log('iabSubsV12Loaded: ' + JSON.stringify(vp));\n vp.offers.forEach((productOffer) => {\n // Add the base plan's pricing phase to offers that do not end-up as infinite recurring.\n const lastPhase = productOffer.pricing_phases.slice(-1)[0];\n if ((lastPhase === null || lastPhase === void 0 ? void 0 : lastPhase.recurrence_mode) === CdvPurchase.RecurrenceMode.FINITE_RECURRING) {\n const baseOffer = findBasePlan(productOffer.base_plan_id);\n if (baseOffer && (baseOffer !== productOffer)) {\n productOffer.pricing_phases.push(...baseOffer.pricing_phases);\n }\n }\n // Convert the offer to the generic representation\n const offer = this.iabSubsOfferV12Loaded(product, vp, productOffer);\n product.addOffer(offer);\n });\n function findBasePlan(basePlanId) {\n if (!basePlanId)\n return null;\n for (const offer of vp.offers) {\n if (offer.base_plan_id === basePlanId && !offer.offer_id) {\n return offer;\n }\n }\n return null;\n }\n /*\n var firstOffer = vp.offers[0];\n if (firstOffer && firstOffer.pricing_phases.length > 0) {\n const attributes = {\n state: store.VALID,\n title: vp.name,\n description: vp.description,\n offers: vp.offers.map(function (offer) {\n return vp.productId + '@' + offer.token;\n }),\n };\n this.iabSubsAddV12Attributes(attributes, firstOffer);\n const p = this.getProduct(vp.productId);\n p.set(attributes);\n p.trigger(\"loaded\");\n }\n */\n return product;\n }\n makeOfferId(productId, productOffer) {\n let id = productId;\n if (productOffer.base_plan_id) {\n if (productOffer.offer_id) {\n return productId + '@' + productOffer.base_plan_id + '@' + productOffer.offer_id;\n }\n return productId + '@' + productOffer.base_plan_id;\n }\n return productId + '@' + productOffer.token;\n }\n iabSubsOfferV12Loaded(product, vp, productOffer) {\n const offerId = this.makeOfferId(vp.productId, productOffer);\n const existingOffer = this.getOffer(offerId);\n const pricingPhases = productOffer.pricing_phases.map(p => this.toPricingPhase(p));\n if (existingOffer) {\n existingOffer.pricingPhases = pricingPhases;\n return existingOffer;\n }\n else {\n const offer = new SubscriptionOffer({ id: offerId, product, pricingPhases, token: productOffer.token, tags: productOffer.tags }, this.decorator);\n this.offers.push(offer);\n return offer;\n }\n /*\n // Backward compatibility (might be incomplete if user have complex pricing models, but might as well be complete...)\n if (productOffer.pricing_phases.length > 0) {\n iabSubsAddV12Attributes(offerAttributes, productOffer);\n }\n var offerP = store.get(offerAttributes.id);\n if (!offerP) {\n store.register(offerAttributes);\n offerP = store.get(offerAttributes.id);\n }\n offerP.set(offerAttributes);\n offerP.trigger(\"loaded\");\n */\n }\n /*\n private iabSubsV11Loaded(p: Product, vp: SubscriptionV11): Product {\n // console.log('iabSubsV11Loaded: ' + JSON.stringify(vp));\n var p = store.products.byId[vp.productId];\n var attributes = {\n state: store.VALID,\n title: vp.name || trimTitle(vp.title),\n description: vp.description,\n };\n var currency = vp.price_currency_code || \"\";\n var price = vp.formatted_price || vp.price;\n var priceMicros = vp.price_amount_micros;\n var subscriptionPeriod = vp.subscriptionPeriod ? vp.subscriptionPeriod : \"\";\n var introPriceSubscriptionPeriod = vp.introductoryPricePeriod ? vp.introductoryPricePeriod : \"\";\n var introPriceNumberOfPeriods = vp.introductoryPriceCycles ? vp.introductoryPriceCycles : 0;\n var introPricePeriodUnit = normalizeISOPeriodUnit(introPriceSubscriptionPeriod);\n var introPricePeriodCount = normalizeISOPeriodCount(introPriceSubscriptionPeriod);\n var introPricePeriod = (introPriceNumberOfPeriods || 1) * (introPricePeriodCount || 1);\n var introPriceMicros = vp.introductoryPriceAmountMicros ? vp.introductoryPriceAmountMicros : \"\";\n var introPrice = vp.introductoryPrice ? vp.introductoryPrice : \"\";\n var introPricePaymentMode;\n\n if (vp.freeTrialPeriod) {\n introPricePaymentMode = 'FreeTrial';\n try {\n introPricePeriodUnit = normalizeISOPeriodUnit(vp.freeTrialPeriod);\n introPricePeriodCount = normalizeISOPeriodCount(vp.freeTrialPeriod);\n introPricePeriod = introPricePeriodCount;\n }\n catch (e) {\n store.log.warn('Failed to parse free trial period: ' + vp.freeTrialPeriod);\n }\n }\n else if (vp.introductoryPrice) {\n if (vp.introductoryPrice < vp.price && subscriptionPeriod === introPriceSubscriptionPeriod) {\n introPricePaymentMode = 'PayAsYouGo';\n }\n else if (introPriceNumberOfPeriods === 1) {\n introPricePaymentMode = 'UpFront';\n }\n }\n\n if (!introPricePaymentMode) {\n introPricePeriod = null;\n introPricePeriodUnit = null;\n }\n\n var parsedSubscriptionPeriod = {};\n if (subscriptionPeriod) {\n parsedSubscriptionPeriod.unit = normalizeISOPeriodUnit(subscriptionPeriod);\n parsedSubscriptionPeriod.count = normalizeISOPeriodCount(subscriptionPeriod);\n }\n\n var trialPeriod = vp.trial_period || null;\n var trialPeriodUnit = vp.trial_period_unit || null;\n var billingPeriod = parsedSubscriptionPeriod.count || vp.billing_period || null;\n var billingPeriodUnit = parsedSubscriptionPeriod.unit || vp.billing_period_unit || null;\n\n var pricingPhases = [];\n if (trialPeriod) {\n pricingPhases.push({\n paymentMode: 'FreeTrial',\n recurrenceMode: store.FINITE_RECURRING,\n period: vp.freeTrialPeriod || toISO8601Duration(trialPeriodUnit, trialPeriod),\n cycles: 1,\n price: null,\n priceMicros: 0,\n currency: currency,\n });\n }\n else if (introPricePeriod) {\n pricingPhases.push({\n paymentMode: 'PayAsYouGo',\n recurrenceMode: store.FINITE_RECURRING,\n period: vp.introPriceSubscriptionPeriod || toISO8601Duration(introPricePeriodUnit, introPricePeriodCount),\n cycles: vp.introductoryPriceCycles || 1,\n price: null, // formatted price not available\n priceMicros: introPriceMicros,\n currency: currency,\n });\n }\n\n pricingPhases.push({\n paymentMode: 'PayAsYouGo',\n recurrenceMode: store.INFINITE_RECURRING,\n period: vp.subscriptionPeriod || toISO8601Duration(billingPeriodUnit, billingPeriod), // ISO8601 duration\n cycles: 0,\n price: price,\n priceMicros: priceMicros,\n currency: currency,\n });\n attributes.pricingPhases = pricingPhases;\n\n if (store.compatibility > 0 && store.compatibility < 11.999) {\n Object.assign(attributes, {\n price: price,\n priceMicros: priceMicros,\n currency: currency,\n trialPeriod: trialPeriod,\n trialPeriodUnit: trialPeriodUnit,\n billingPeriod: billingPeriod,\n billingPeriodUnit: billingPeriodUnit,\n introPrice: introPrice,\n introPriceMicros: introPriceMicros,\n introPricePeriod: introPricePeriod,\n introPricePeriodUnit: introPricePeriodUnit,\n introPricePaymentMode: introPricePaymentMode,\n });\n }\n\n if (store.compatibility > 0 && store.compatibility < 9.999) {\n Object.assign(attributes, {\n introPriceNumberOfPeriods: introPricePeriod,\n introPriceSubscriptionPeriod: introPricePeriodUnit,\n });\n }\n\n p.set(attributes);\n p.trigger(\"loaded\");\n }\n */\n onInAppLoaded(p, vp) {\n var _a, _b, _c, _d;\n // console.log('iabInAppLoaded: ' + JSON.stringify(vp));\n const existingOffer = this.getOffer(vp.productId);\n const pricingPhases = [{\n price: (_b = (_a = vp.formatted_price) !== null && _a !== void 0 ? _a : vp.price) !== null && _b !== void 0 ? _b : `${((_c = vp.price_amount_micros) !== null && _c !== void 0 ? _c : 0) / 1000000} ${vp.price_currency_code}`,\n priceMicros: (_d = vp.price_amount_micros) !== null && _d !== void 0 ? _d : 0,\n currency: vp.price_currency_code,\n recurrenceMode: CdvPurchase.RecurrenceMode.NON_RECURRING,\n }];\n if (existingOffer) {\n // state: store.VALID,\n // title: vp.name || trimTitle(vp.title),\n // description: vp.description,\n // currency: vp.price_currency_code || \"\",\n // price: vp.formatted_price || vp.price,\n // priceMicros: vp.price_amount_micros,\n existingOffer.pricingPhases = pricingPhases;\n p.offers = [existingOffer];\n }\n else {\n const newOffer = new InAppOffer({ id: vp.productId, product: p, pricingPhases }, this.decorator);\n this.offers.push(newOffer);\n p.offers = [newOffer];\n }\n // p.set({\n // state: store.VALID,\n // title: vp.name || trimTitle(vp.title),\n // description: vp.description,\n // currency: vp.price_currency_code || \"\",\n // price: vp.formatted_price || vp.price,\n // priceMicros: vp.price_amount_micros,\n // });\n // p.trigger(\"loaded\");\n return p;\n }\n toPaymentMode(phase) {\n return phase.price_amount_micros === 0\n ? CdvPurchase.PaymentMode.FREE_TRIAL\n : phase.recurrence_mode === GooglePlay.Bridge.RecurrenceMode.NON_RECURRING\n ? CdvPurchase.PaymentMode.UP_FRONT\n : CdvPurchase.PaymentMode.PAY_AS_YOU_GO;\n }\n toRecurrenceMode(mode) {\n switch (mode) {\n case GooglePlay.Bridge.RecurrenceMode.FINITE_RECURRING: return CdvPurchase.RecurrenceMode.FINITE_RECURRING;\n case GooglePlay.Bridge.RecurrenceMode.INFINITE_RECURRING: return CdvPurchase.RecurrenceMode.INFINITE_RECURRING;\n case GooglePlay.Bridge.RecurrenceMode.NON_RECURRING: return CdvPurchase.RecurrenceMode.NON_RECURRING;\n }\n }\n toPricingPhase(phase) {\n return {\n price: phase.formatted_price,\n priceMicros: phase.price_amount_micros,\n currency: phase.price_currency_code,\n billingPeriod: phase.billing_period,\n billingCycles: phase.billing_cycle_count,\n recurrenceMode: this.toRecurrenceMode(phase.recurrence_mode),\n paymentMode: this.toPaymentMode(phase),\n };\n }\n }\n GooglePlay.Products = Products;\n })(GooglePlay = CdvPurchase.GooglePlay || (CdvPurchase.GooglePlay = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n let GooglePlay;\n (function (GooglePlay) {\n let PublisherAPI;\n (function (PublisherAPI) {\n let GoogleErrorReason;\n (function (GoogleErrorReason) {\n /** The subscription purchase is no longer available for query because it has been expired for too long. */\n GoogleErrorReason[\"SUBSCRIPTION_NO_LONGER_AVAILABLE\"] = \"subscriptionPurchaseNoLongerAvailable\";\n /** The purchase token is no longer valid. */\n GoogleErrorReason[\"PURCHASE_TOKEN_NO_LONGER_VALID\"] = \"purchaseTokenNoLongerValid\";\n })(GoogleErrorReason = PublisherAPI.GoogleErrorReason || (PublisherAPI.GoogleErrorReason = {}));\n /**\n * Those are actually HTTP status codes.\n *\n * Duplicated here for documentation purposes.\n */\n let ErrorCode;\n (function (ErrorCode) {\n /** The subscription purchase is no longer available for query because it has been expired for too long. */\n ErrorCode[ErrorCode[\"GONE\"] = 410] = \"GONE\";\n })(ErrorCode = PublisherAPI.ErrorCode || (PublisherAPI.ErrorCode = {}));\n })(PublisherAPI = GooglePlay.PublisherAPI || (GooglePlay.PublisherAPI = {}));\n })(GooglePlay = CdvPurchase.GooglePlay || (CdvPurchase.GooglePlay = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n /**\n * Test Adapter and related classes.\n */\n let Test;\n (function (Test) {\n const platform = CdvPurchase.Platform.TEST;\n let verifiedPurchases = [];\n function updateVerifiedPurchases(tr) {\n tr.products.forEach(p => {\n var _a, _b, _c, _d;\n const existing = verifiedPurchases.find(v => p.id === v.id);\n const attributes = {\n id: p.id,\n purchaseDate: (_a = tr.purchaseDate) === null || _a === void 0 ? void 0 : _a.getTime(),\n expiryDate: (_b = tr.expirationDate) === null || _b === void 0 ? void 0 : _b.getTime(),\n lastRenewalDate: (_c = tr.lastRenewalDate) === null || _c === void 0 ? void 0 : _c.getTime(),\n renewalIntent: tr.renewalIntent,\n renewalIntentChangeDate: (_d = tr.renewalIntentChangeDate) === null || _d === void 0 ? void 0 : _d.getTime(),\n };\n if (existing) {\n Object.assign(existing, attributes);\n }\n else {\n verifiedPurchases.push(attributes);\n }\n });\n }\n /**\n * Test Adapter used for local testing with mock products.\n *\n * This adapter simulates a payment platform that supports both In-App Products and Payment Requests.\n *\n * The list of supported In-App Products\n *\n * @see {@link Test.TEST_PRODUCTS}\n */\n class Adapter {\n constructor(context) {\n this.id = CdvPurchase.Platform.TEST;\n this.name = 'Test';\n this.ready = false;\n this.products = [];\n this.receipts = [];\n this.supportsParallelLoading = true;\n this.context = context;\n this.log = context.log.child(\"Test\");\n }\n get isSupported() {\n return true;\n }\n initialize() {\n return __awaiter(this, void 0, void 0, function* () { return; });\n }\n loadReceipts() {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve) => {\n setTimeout(() => {\n this.context.listener.receiptsReady(CdvPurchase.Platform.TEST);\n resolve(this.receipts);\n }, 600);\n });\n });\n }\n loadProducts(products) {\n return __awaiter(this, void 0, void 0, function* () {\n return products.map(registerProduct => {\n if (!Test.testProductsArray.find(p => p.id === registerProduct.id && p.type === registerProduct.type)) {\n return testStoreError(CdvPurchase.ErrorCode.PRODUCT_NOT_AVAILABLE, 'This product is not available', registerProduct.id);\n }\n // Ensure it's not been loaded already.\n const existingProduct = this.products.find(p => p.id === registerProduct.id);\n if (existingProduct)\n return existingProduct;\n // Enable the active subscription if loaded by the user.\n if (registerProduct.id === Test.testProducts.PAID_SUBSCRIPTION_ACTIVE.id) {\n setTimeout(() => {\n this.reportActiveSubscription();\n }, 500); // it'll get reported in 500ms\n }\n const product = Test.initTestProduct(registerProduct.id, this.context.apiDecorators);\n if (!product)\n return testStoreError(CdvPurchase.ErrorCode.PRODUCT_NOT_AVAILABLE, 'Could not load this product', registerProduct.id);\n this.products.push(product);\n this.context.listener.productsUpdated(CdvPurchase.Platform.TEST, [product]);\n return product;\n });\n });\n }\n order(offer) {\n return __awaiter(this, void 0, void 0, function* () {\n // Purchasing products with \"-fail-\" in the id will fail.\n if (offer.id.indexOf(\"-fail-\") > 0) {\n return testStoreError(CdvPurchase.ErrorCode.PURCHASE, 'Purchase failed.', offer.productId);\n }\n const product = this.products.find(p => p.id === offer.productId);\n if (!CdvPurchase.Internal.LocalReceipts.canPurchase(this.receipts, product)) {\n return testStoreError(CdvPurchase.ErrorCode.PURCHASE, 'Product already owned', offer.productId);\n }\n // a receipt containing a transaction with the given product.\n const response = prompt(`Do you want to purchase ${offer.productId} for ${offer.pricingPhases[0].price}?\\nEnter \"Y\" to confirm.\\nEnter \"E\" to fail with an error.\\Anything else to cancel.`);\n if ((response === null || response === void 0 ? void 0 : response.toUpperCase()) === 'E')\n return testStoreError(CdvPurchase.ErrorCode.PURCHASE, 'Purchase failed', offer.productId);\n if ((response === null || response === void 0 ? void 0 : response.toUpperCase()) !== 'Y')\n return testStoreError(CdvPurchase.ErrorCode.PAYMENT_CANCELLED, 'Purchase flow has been cancelled by the user', offer.productId);\n // purchase succeeded, let's generate a mock receipt.\n const receipt = new CdvPurchase.Receipt(platform, this.context.apiDecorators);\n const tr = new CdvPurchase.Transaction(platform, receipt, this.context.apiDecorators);\n receipt.transactions = [tr];\n tr.products = [{\n id: offer.productId,\n offerId: offer.id,\n }];\n tr.state = CdvPurchase.TransactionState.APPROVED;\n tr.purchaseDate = new Date();\n tr.transactionId = offer.productId + '-' + (new Date().getTime());\n tr.isAcknowledged = false;\n if (offer.productType === CdvPurchase.ProductType.PAID_SUBSCRIPTION) {\n tr.expirationDate = new Date(+new Date() + 604800000);\n tr.renewalIntent = CdvPurchase.RenewalIntent.RENEW;\n }\n updateVerifiedPurchases(tr);\n this.receipts.push(receipt);\n this.context.listener.receiptsUpdated(CdvPurchase.Platform.TEST, [receipt]);\n });\n }\n finish(transaction) {\n return new Promise(resolve => {\n setTimeout(() => {\n transaction.state = CdvPurchase.TransactionState.FINISHED;\n transaction.isAcknowledged = true;\n updateVerifiedPurchases(transaction);\n const product = this.products.find(p => transaction.products[0].id === p.id);\n if ((product === null || product === void 0 ? void 0 : product.type) === CdvPurchase.ProductType.CONSUMABLE)\n transaction.isConsumed = true;\n const receipts = this.receipts.filter(r => r.hasTransaction(transaction));\n this.context.listener.receiptsUpdated(platform, receipts);\n resolve(undefined);\n }, 500);\n });\n }\n receiptValidationBody(receipt) {\n return __awaiter(this, void 0, void 0, function* () {\n return;\n });\n }\n handleReceiptValidationResponse(receipt, response) {\n return __awaiter(this, void 0, void 0, function* () {\n return;\n });\n }\n /**\n * This function simulates a payment process by prompting the user to confirm the payment.\n *\n * It creates a `Receipt` and `Transaction` object and returns the `Transaction` object if the user enters \"Y\" in the prompt.\n *\n * @param paymentRequest - An object containing information about the payment, such as the amount and currency.\n * @param additionalData - Additional data to be included in the receipt.\n *\n * @returns A promise that resolves to either an error object (if the user enters \"E\" in the prompt),\n * a `Transaction` object (if the user confirms the payment), or `undefined` (if the user does not confirm the payment).\n *\n * @example\n *\n * const paymentRequest = {\n * amountMicros: 1000000,\n * currency: \"USD\",\n * items: [{ id: \"product-1\" }, { id: \"product-2\" }]\n * };\n * const result = await requestPayment(paymentRequest);\n * if (result?.isError) {\n * console.error(`Error: ${result.message}`);\n * } else if (result) {\n * console.log(`Transaction approved: ${result.transactionId}`);\n * } else {\n * console.log(\"Payment cancelled by user\");\n * }\n */\n requestPayment(paymentRequest, additionalData) {\n var _a;\n return __awaiter(this, void 0, void 0, function* () {\n yield CdvPurchase.Utils.asyncDelay(100); // maybe app has some UI to update... and \"prompt\" prevents that\n const response = prompt(`Mock payment of ${((_a = paymentRequest.amountMicros) !== null && _a !== void 0 ? _a : 0) / 1000000} ${paymentRequest.currency}. Enter \"Y\" to confirm. Enter \"E\" to trigger an error.`);\n if ((response === null || response === void 0 ? void 0 : response.toUpperCase()) === 'E')\n return testStoreError(CdvPurchase.ErrorCode.PAYMENT_NOT_ALLOWED, 'Payment not allowed', null);\n if ((response === null || response === void 0 ? void 0 : response.toUpperCase()) !== 'Y')\n return;\n const receipt = new CdvPurchase.Receipt(platform, this.context.apiDecorators);\n const transaction = new CdvPurchase.Transaction(CdvPurchase.Platform.TEST, receipt, this.context.apiDecorators);\n transaction.purchaseDate = new Date();\n transaction.products = paymentRequest.items.filter(p => p).map(product => ({ id: (product === null || product === void 0 ? void 0 : product.id) || '' })),\n transaction.state = CdvPurchase.TransactionState.APPROVED;\n transaction.transactionId = 'payment-' + new Date().getTime();\n transaction.amountMicros = paymentRequest.amountMicros;\n transaction.currency = paymentRequest.currency;\n receipt.transactions = [transaction];\n this.receipts.push(receipt);\n setTimeout(() => {\n this.context.listener.receiptsUpdated(platform, [receipt]);\n }, 400);\n return transaction;\n });\n }\n manageSubscriptions() {\n return __awaiter(this, void 0, void 0, function* () {\n alert('Pseudo subscription management interface. Close it when you are done.');\n return;\n });\n }\n manageBilling() {\n return __awaiter(this, void 0, void 0, function* () {\n alert('Pseudo billing management interface. Close it when you are done.');\n return;\n });\n }\n reportActiveSubscription() {\n if (this.receipts.find(r => r.transactions[0].transactionId === transactionId(1))) {\n // already reported\n return;\n }\n const RENEWS_EVERY_MS = 2 * 60000; // 2 minutes\n const receipt = new CdvPurchase.Receipt(platform, this.context.apiDecorators);\n const makeTransaction = (n) => {\n var _a, _b;\n const tr = new CdvPurchase.Transaction(platform, receipt, this.context.apiDecorators);\n tr.products = [{\n id: Test.testProducts.PAID_SUBSCRIPTION_ACTIVE.id,\n offerId: Test.testProducts.PAID_SUBSCRIPTION_ACTIVE.extra.offerId,\n }];\n tr.state = CdvPurchase.TransactionState.APPROVED;\n tr.transactionId = transactionId(n);\n tr.isAcknowledged = n == 1;\n tr.renewalIntent = CdvPurchase.RenewalIntent.RENEW;\n const firstPurchase = +(((_b = (_a = receipt === null || receipt === void 0 ? void 0 : receipt.transactions) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.purchaseDate) || new Date());\n tr.purchaseDate = new Date(firstPurchase);\n tr.lastRenewalDate = new Date(firstPurchase + RENEWS_EVERY_MS * (n - 1));\n tr.expirationDate = new Date(firstPurchase + RENEWS_EVERY_MS * n);\n updateVerifiedPurchases(tr);\n return tr;\n };\n receipt.transactions.push(makeTransaction(1));\n this.receipts.push(receipt);\n this.context.listener.receiptsUpdated(CdvPurchase.Platform.TEST, [receipt]);\n function transactionId(n) {\n return 'test-active-subscription-transaction-' + n;\n }\n let transactionNumber = 1;\n setInterval(() => {\n this.log.info('auto-renewing the mock subscription');\n transactionNumber += 1;\n receipt.transactions.push(makeTransaction(transactionNumber));\n this.context.listener.receiptsUpdated(CdvPurchase.Platform.TEST, [receipt]);\n }, RENEWS_EVERY_MS);\n }\n static verify(receipt, callback) {\n setTimeout(() => {\n var _a, _b;\n callback({\n receipt,\n payload: {\n ok: true,\n data: {\n id: (_b = (_a = receipt.transactions[0]) === null || _a === void 0 ? void 0 : _a.products[0]) === null || _b === void 0 ? void 0 : _b.id,\n latest_receipt: true,\n transaction: { type: 'test' },\n collection: verifiedPurchases,\n }\n }\n });\n }, 500);\n }\n checkSupport(functionality) {\n return true;\n }\n restorePurchases() {\n return __awaiter(this, void 0, void 0, function* () {\n return undefined;\n });\n }\n }\n Test.Adapter = Adapter;\n function testStoreError(code, message, productId) {\n return CdvPurchase.storeError(code, message, CdvPurchase.Platform.TEST, productId);\n }\n })(Test = CdvPurchase.Test || (CdvPurchase.Test = {}));\n})(CdvPurchase || (CdvPurchase = {}));\n/// <reference path=\"../../utils/compatibility.ts\" />\nvar CdvPurchase;\n(function (CdvPurchase) {\n let Test;\n (function (Test) {\n const platform = CdvPurchase.Platform.TEST;\n /**\n * Definition of the test products.\n */\n Test.testProducts = {\n /**\n * A valid consumable product.\n *\n * - id: \"test-consumable\"\n * - type: ProductType.CONSUMABLE\n */\n CONSUMABLE: {\n platform,\n id: 'test-consumable',\n type: CdvPurchase.ProductType.CONSUMABLE,\n },\n /**\n * A consumable product for which the purchase will always fail.\n *\n * - id: \"test-consumable-fail\"\n * - type: ProductType.CONSUMABLE\n */\n CONSUMABLE_FAILING: {\n platform,\n id: 'test-consumable-fail',\n type: CdvPurchase.ProductType.CONSUMABLE,\n },\n /**\n * A valid non-consumable product.\n *\n * - id: \"test-non-consumable\"\n * - type: ProductType.NON_CONSUMABLE\n */\n NON_CONSUMABLE: {\n platform,\n id: 'test-non-consumable',\n type: CdvPurchase.ProductType.NON_CONSUMABLE,\n },\n /**\n * A paid-subscription that auto-renews for the duration of the session.\n *\n * This subscription has a free trial period, that renews every week, 3 times.\n * It then costs $4.99 per month.\n *\n * - id: \"test-subscription\"\n * - type: ProductType.PAID_SUBSCRIPTION\n */\n PAID_SUBSCRIPTION: {\n platform,\n id: 'test-subscription',\n type: CdvPurchase.ProductType.PAID_SUBSCRIPTION,\n },\n /**\n * A paid-subscription that is already active when the app starts.\n *\n * It behaves as if the user subscribed on a different device. It will renew forever.\n *\n * - id: \"test-subscription-active\"\n * - type: ProductType.PAID_SUBSCRIPTION\n */\n PAID_SUBSCRIPTION_ACTIVE: {\n platform,\n id: 'test-subscription-active',\n type: CdvPurchase.ProductType.PAID_SUBSCRIPTION,\n /** @internal */\n extra: {\n offerId: 'test-paid-subscription-active-offer1',\n }\n },\n };\n /**\n * List of test products definitions as an array.\n */\n Test.testProductsArray = CdvPurchase.Utils.objectValues(Test.testProducts);\n /**\n * Initialize a test product.\n *\n * @internal\n */\n function initTestProduct(productId, decorator) {\n const key = Object.keys(Test.testProducts).find(key => Test.testProducts[key] && Test.testProducts[key].id === productId);\n if (!key)\n return;\n const product = new CdvPurchase.Product(Test.testProducts[key], decorator);\n switch (key) {\n case 'CONSUMABLE':\n product.title = 'Test Consumable';\n product.description = 'A consumable product that you can purchase';\n product.addOffer(new CdvPurchase.Offer({\n id: 'test-consumable-offer1',\n pricingPhases: [{\n price: '$4.99',\n currency: 'USD',\n priceMicros: 4990000,\n paymentMode: CdvPurchase.PaymentMode.UP_FRONT,\n recurrenceMode: CdvPurchase.RecurrenceMode.NON_RECURRING,\n }],\n product,\n }, decorator));\n break;\n case 'CONSUMABLE_FAILING':\n product.title = 'Failing Consumable';\n product.description = 'A consumable product that cannot be purchased';\n product.addOffer(new CdvPurchase.Offer({\n id: 'test-consumable-fail-offer1',\n pricingPhases: [{\n price: '$1.99',\n currency: 'USD',\n priceMicros: 1990000,\n paymentMode: CdvPurchase.PaymentMode.UP_FRONT,\n recurrenceMode: CdvPurchase.RecurrenceMode.NON_RECURRING,\n }],\n product,\n }, decorator));\n break;\n case 'NON_CONSUMABLE':\n product.title = 'Non Consumable';\n product.description = 'A non consumable product';\n product.addOffer(new CdvPurchase.Offer({\n id: 'test-non-consumable-offer1',\n pricingPhases: [{\n price: '$9.99',\n currency: 'USD',\n priceMicros: 9990000,\n paymentMode: CdvPurchase.PaymentMode.UP_FRONT,\n recurrenceMode: CdvPurchase.RecurrenceMode.NON_RECURRING,\n }],\n product,\n }, decorator));\n break;\n case 'PAID_SUBSCRIPTION':\n product.title = 'A subscription product';\n product.description = 'An auto-renewing paid subscription with a trial period';\n product.addOffer(new CdvPurchase.Offer({\n id: 'test-paid-subscription-offer1',\n product,\n pricingPhases: [{\n price: '$0.00',\n currency: 'USD',\n priceMicros: 0,\n paymentMode: CdvPurchase.PaymentMode.FREE_TRIAL,\n recurrenceMode: CdvPurchase.RecurrenceMode.FINITE_RECURRING,\n billingCycles: 3,\n billingPeriod: 'P1W',\n }, {\n price: '$4.99',\n currency: 'USD',\n priceMicros: 4990000,\n paymentMode: CdvPurchase.PaymentMode.PAY_AS_YOU_GO,\n recurrenceMode: CdvPurchase.RecurrenceMode.INFINITE_RECURRING,\n billingPeriod: 'P1M',\n }],\n }, decorator));\n break;\n case 'PAID_SUBSCRIPTION_ACTIVE':\n product.title = 'An owned subscription product';\n product.description = 'An active paid subscription';\n product.addOffer(new CdvPurchase.Offer({\n id: Test.testProducts.PAID_SUBSCRIPTION_ACTIVE.extra.offerId,\n product,\n pricingPhases: [{\n price: '$19.99',\n currency: 'USD',\n priceMicros: 19990000,\n paymentMode: CdvPurchase.PaymentMode.PAY_AS_YOU_GO,\n recurrenceMode: CdvPurchase.RecurrenceMode.INFINITE_RECURRING,\n billingPeriod: 'P1Y',\n }],\n }, decorator));\n break;\n default:\n const unhandledSwitchCase = key;\n throw new Error(`Unhandled enum case: ${unhandledSwitchCase}`);\n }\n return product;\n }\n Test.initTestProduct = initTestProduct;\n })(Test = CdvPurchase.Test || (CdvPurchase.Test = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n let WindowsStore;\n (function (WindowsStore) {\n class Adapter {\n constructor() {\n this.id = CdvPurchase.Platform.WINDOWS_STORE;\n this.name = 'WindowsStore';\n this.ready = false;\n this.supportsParallelLoading = false;\n this.products = [];\n this.receipts = [];\n }\n initialize() {\n return __awaiter(this, void 0, void 0, function* () { return; });\n }\n get isSupported() {\n return false;\n }\n loadProducts(products) {\n return __awaiter(this, void 0, void 0, function* () {\n return products.map(p => windowsStoreError(CdvPurchase.ErrorCode.PRODUCT_NOT_AVAILABLE, 'TODO', p.id));\n });\n }\n loadReceipts() {\n return __awaiter(this, void 0, void 0, function* () {\n return [];\n });\n }\n order(offer) {\n return __awaiter(this, void 0, void 0, function* () {\n return windowsStoreError(CdvPurchase.ErrorCode.UNKNOWN, 'TODO: Not implemented', offer.productId);\n });\n }\n finish(transaction) {\n return __awaiter(this, void 0, void 0, function* () {\n return windowsStoreError(CdvPurchase.ErrorCode.UNKNOWN, 'TODO: Not implemented', null);\n });\n }\n handleReceiptValidationResponse(receipt, response) {\n return __awaiter(this, void 0, void 0, function* () {\n return;\n });\n }\n receiptValidationBody(receipt) {\n return __awaiter(this, void 0, void 0, function* () {\n return;\n });\n }\n requestPayment(payment, additionalData) {\n return __awaiter(this, void 0, void 0, function* () {\n return windowsStoreError(CdvPurchase.ErrorCode.UNKNOWN, 'requestPayment not supported', null);\n });\n }\n manageSubscriptions() {\n return __awaiter(this, void 0, void 0, function* () {\n return windowsStoreError(CdvPurchase.ErrorCode.UNKNOWN, 'manageSubscriptions not supported', null);\n });\n }\n manageBilling() {\n return __awaiter(this, void 0, void 0, function* () {\n return windowsStoreError(CdvPurchase.ErrorCode.UNKNOWN, 'manageBilling not supported', null);\n });\n }\n checkSupport(functionality) {\n return false;\n }\n restorePurchases() {\n return __awaiter(this, void 0, void 0, function* () {\n return undefined;\n });\n }\n }\n WindowsStore.Adapter = Adapter;\n function windowsStoreError(code, message, productId) {\n return CdvPurchase.storeError(code, message, CdvPurchase.Platform.WINDOWS_STORE, productId);\n }\n })(WindowsStore = CdvPurchase.WindowsStore || (CdvPurchase.WindowsStore = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n let Utils;\n (function (Utils) {\n let Ajax;\n (function (Ajax) {\n /** HTTP status returned when a request times out */\n Ajax.HTTP_REQUEST_TIMEOUT = 408;\n })(Ajax = Utils.Ajax || (Utils.Ajax = {}));\n /**\n * Simplified version of jQuery's ajax method based on XMLHttpRequest.\n *\n * Uses cordova's http plugin when installed.\n *\n * Only supports JSON requests.\n */\n function ajax(log, options) {\n if (typeof window !== 'undefined' && window.cordova && window.cordova.plugin && window.cordova.plugin.http) {\n return ajaxWithHttpPlugin(log, options);\n }\n var doneCb = function () { };\n var xhr = new XMLHttpRequest();\n if (options.timeout) {\n xhr.timeout = options.timeout;\n xhr.ontimeout = function ( /*event*/) {\n log.warn(\"ajax -> request to \" + options.url + \" timeout\");\n Utils.callExternal(log, 'ajax.error', options.error, Ajax.HTTP_REQUEST_TIMEOUT, \"Timeout\");\n };\n }\n xhr.open(options.method || 'POST', options.url, true);\n xhr.onreadystatechange = function ( /*event*/) {\n try {\n if (xhr.readyState === 4) {\n if (xhr.status === 200) {\n Utils.callExternal(log, 'ajax.success', options.success, JSON.parse(xhr.responseText));\n }\n else {\n log.warn(\"ajax -> request to \" + options.url + \" failed with status \" + xhr.status + \" (\" + xhr.statusText + \")\");\n Utils.callExternal(log, 'ajax.error', options.error, xhr.status, xhr.statusText);\n }\n }\n }\n catch (e) {\n log.warn(\"ajax -> request to \" + options.url + \" failed with an exception: \" + e.message);\n if (options.error)\n options.error(417, e.message, null);\n }\n if (xhr.readyState === 4)\n Utils.callExternal(log, 'ajax.done', doneCb);\n };\n const customHeaders = options.customHeaders;\n if (customHeaders) {\n Object.keys(customHeaders).forEach(function (header) {\n log.debug('ajax -> adding custom header: ' + header);\n xhr.setRequestHeader(header, customHeaders[header]);\n });\n }\n xhr.setRequestHeader(\"Accept\", \"application/json\");\n log.debug('ajax -> send request to ' + options.url);\n if (options.data) {\n xhr.setRequestHeader(\"Content-Type\", \"application/json;charset=UTF-8\");\n xhr.send(JSON.stringify(options.data));\n }\n else {\n xhr.send();\n }\n return {\n done: function (cb) { doneCb = cb; return this; }\n };\n }\n Utils.ajax = ajax;\n /**\n * Simplified version of jQuery's ajax method based on XMLHttpRequest.\n *\n * Uses the http plugin.\n */\n function ajaxWithHttpPlugin(log, options) {\n let doneCb = function () { };\n const ajaxOptions = {\n method: (options.method || 'get').toLowerCase(),\n data: options.data,\n serializer: 'json',\n // responseType: 'json',\n };\n if (options.customHeaders) {\n log.debug('ajax[http] -> adding custom headers: ' + JSON.stringify(options.customHeaders));\n ajaxOptions.headers = options.customHeaders;\n }\n log.debug('ajax[http] -> send request to ' + options.url);\n const ajaxDone = (response) => {\n try {\n if (response.status == 200) {\n Utils.callExternal(log, 'ajax.success', options.success, JSON.parse(response.data));\n }\n else {\n log.warn(\"ajax[http] -> request to \" + options.url + \" failed with status \" + response.status + \" (\" + response.error + \")\");\n Utils.callExternal(log, 'ajax.error', options.error, response.status, response.error);\n }\n }\n catch (e) {\n log.warn(\"ajax[http] -> request to \" + options.url + \" failed with an exception: \" + e.message);\n if (options.error)\n Utils.callExternal(log, 'ajax.error', options.error, 417, e.message);\n }\n Utils.callExternal(log, 'ajax.done', doneCb);\n };\n window.cordova.plugin.http.sendRequest(options.url, ajaxOptions, ajaxDone, ajaxDone);\n return {\n done: function (cb) { doneCb = cb; return this; }\n };\n }\n })(Utils = CdvPurchase.Utils || (CdvPurchase.Utils = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n let Utils;\n (function (Utils) {\n /**\n * Calls an user-registered callback.\n *\n * Won't throw exceptions, only logs errors.\n *\n * @param name a short string describing the callback\n * @param callback the callback to call (won't fail if undefined)\n *\n * @example\n * ```js\n * Utils.callExternal(store.log, \"ajax.error\", options.error, 404, \"Not found\");\n * ```\n *\n * @internal\n */\n function callExternal(log, name, callback, ...args) {\n try {\n const args = Array.prototype.slice.call(arguments, 3);\n // store.log.debug(\"calling \" + name + \"(\" + JSON.stringify(args2) + \")\");\n if (callback)\n callback.apply(CdvPurchase.store, args);\n }\n catch (e) {\n log.logCallbackException(name, e);\n }\n }\n Utils.callExternal = callExternal;\n })(Utils = CdvPurchase.Utils || (CdvPurchase.Utils = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n let Utils;\n (function (Utils) {\n /** @internal */\n function delay(fn, milliseconds) {\n return setTimeout(fn, milliseconds);\n }\n Utils.delay = delay;\n /** @internal */\n function debounce(fn, milliseconds) {\n return createDebouncer(fn, milliseconds).call;\n }\n Utils.debounce = debounce;\n /** @internal */\n function createDebouncer(fn, milliseconds) {\n let timeout = null;\n let waiting = [];\n const later = function (context, args) {\n const toCall = waiting;\n waiting = [];\n timeout = null;\n fn();\n toCall.forEach(fn => fn());\n };\n const debounced = function () {\n if (timeout)\n window.clearTimeout(timeout);\n timeout = setTimeout(later, milliseconds);\n };\n return {\n call: debounced,\n wait: () => new Promise(resolve => {\n if (timeout)\n waiting.push(resolve);\n else\n resolve();\n })\n };\n }\n Utils.createDebouncer = createDebouncer;\n /** @internal */\n function asyncDelay(milliseconds) {\n return new Promise(resolve => setTimeout(resolve, milliseconds));\n }\n Utils.asyncDelay = asyncDelay;\n })(Utils = CdvPurchase.Utils || (CdvPurchase.Utils = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n let Utils;\n (function (Utils) {\n /**\n * Generate a plain english version of the billing cycle in a pricing phase.\n *\n * Example outputs:\n *\n * - \"3x 1 month\": for `FINITE_RECURRING`, 3 cycles, period \"P1M\"\n * - \"for 1 year\": for `NON_RECURRING`, period \"P1Y\"\n * - \"every week\": for `INFINITE_RECURRING, period \"P1W\"\n *\n * @example\n * Utils.formatBillingCycleEN(offer.pricingPhases[0])\n */\n function formatBillingCycleEN(pricingPhase) {\n switch (fixedRecurrenceMode(pricingPhase)) {\n case CdvPurchase.RecurrenceMode.FINITE_RECURRING:\n return `${pricingPhase.billingCycles}x ${Utils.formatDurationEN(pricingPhase.billingPeriod)}`;\n case CdvPurchase.RecurrenceMode.NON_RECURRING:\n return 'for ' + Utils.formatDurationEN(pricingPhase.billingPeriod);\n default: // INFINITE_RECURRING\n return 'every ' + Utils.formatDurationEN(pricingPhase.billingPeriod, { omitOne: true });\n }\n }\n Utils.formatBillingCycleEN = formatBillingCycleEN;\n /**\n * FINITE_RECURRING with billingCycles=1 is like NON_RECURRING\n * FINITE_RECURRING with billingCycles=0 is like INFINITE_RECURRING\n */\n function fixedRecurrenceMode(pricingPhase) {\n var _a;\n const cycles = (_a = pricingPhase.billingCycles) !== null && _a !== void 0 ? _a : 0;\n if (pricingPhase.recurrenceMode === CdvPurchase.RecurrenceMode.FINITE_RECURRING) {\n if (cycles == 1)\n return CdvPurchase.RecurrenceMode.NON_RECURRING;\n if (cycles <= 0)\n return CdvPurchase.RecurrenceMode.INFINITE_RECURRING;\n }\n return pricingPhase.recurrenceMode;\n }\n })(Utils = CdvPurchase.Utils || (CdvPurchase.Utils = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n let Utils;\n (function (Utils) {\n /**\n * Format a simple ISO 8601 duration to plain English.\n *\n * This works for non-composite durations, i.e. that have a single unit with associated amount. For example: \"P1Y\" or \"P3W\".\n *\n * See https://en.wikipedia.org/wiki/ISO_8601#Durations\n *\n * This method is provided as a utility for getting simple things done quickly. In your application, you'll probably\n * need some other method that supports multiple locales.\n *\n * @param iso - Duration formatted in IS0 8601\n * @return The duration in plain english. Example: \"1 year\" or \"3 weeks\".\n */\n function formatDurationEN(iso, options) {\n if (!iso)\n return '';\n const l = iso.length;\n const n = iso.slice(1, l - 1);\n if (n === '1') {\n if (options === null || options === void 0 ? void 0 : options.omitOne) {\n return ({ 'D': 'day', 'W': 'week', 'M': 'month', 'Y': 'year', }[iso[l - 1]]) || iso[l - 1];\n }\n else {\n return ({ 'D': '1 day', 'W': '1 week', 'M': '1 month', 'Y': '1 year', }[iso[l - 1]]) || iso[l - 1];\n }\n }\n else {\n const u = ({ 'D': 'days', 'W': 'weeks', 'M': 'months', 'Y': 'years', }[iso[l - 1]]) || iso[l - 1];\n return `${n} ${u}`;\n }\n }\n Utils.formatDurationEN = formatDurationEN;\n })(Utils = CdvPurchase.Utils || (CdvPurchase.Utils = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n let Utils;\n (function (Utils) {\n const HEX2STR = \"0123456789abcdef\".split(\"\");\n function toHexString(r) {\n for (var n = \"\", e = 0; e < 4; e++)\n n += HEX2STR[r >> 8 * e + 4 & 15] + HEX2STR[r >> 8 * e & 15];\n return n;\n }\n function hexStringFromArray(array) {\n const out = [];\n for (var arrayLength = array.length, i = 0; i < arrayLength; i++)\n out.push(toHexString(array[i]));\n return out.join(\"\");\n }\n function add32(r, n) {\n return r + n & 4294967295;\n }\n function complexShift(r, n, e, t, o, u, shiftFunction) {\n function shiftAdd32(op0, op1, v1) {\n return add32(op0 << op1 | op0 >>> 32 - op1, v1);\n }\n function add32x4(i0, i1, j0, j1) {\n return add32(add32(i1, i0), add32(j0, j1));\n }\n return shiftAdd32(add32x4(r, n, t, u), o, e);\n }\n var step1Function = function (shiftFunction, n, e, t, o, u, f, a) { return complexShift(e & t | ~e & o, n, e, u, f, a, shiftFunction); };\n var step2Function = function (shiftFunction, n, e, t, o, u, f, a) { return complexShift(e & o | t & ~o, n, e, u, f, a, shiftFunction); };\n var step3Function = function (shiftFunction, n, e, t, o, u, f, a) { return complexShift(e ^ t ^ o, n, e, u, f, a, shiftFunction); };\n var step4Function = function (shiftFunction, n, e, t, o, u, f, a) { return complexShift(t ^ (e | ~o), n, e, u, f, a, shiftFunction); };\n function hashStep(inOutVec4, strAsInts, shiftFunction) {\n if (!shiftFunction)\n shiftFunction = add32;\n let v0 = inOutVec4[0];\n let v1 = inOutVec4[1];\n let v2 = inOutVec4[2];\n let v3 = inOutVec4[3];\n var step1 = step1Function.bind(null, shiftFunction);\n v0 = step1(v0, v1, v2, v3, strAsInts[0], 7, -680876936);\n v3 = step1(v3, v0, v1, v2, strAsInts[1], 12, -389564586);\n v2 = step1(v2, v3, v0, v1, strAsInts[2], 17, 606105819);\n v1 = step1(v1, v2, v3, v0, strAsInts[3], 22, -1044525330);\n v0 = step1(v0, v1, v2, v3, strAsInts[4], 7, -176418897);\n v3 = step1(v3, v0, v1, v2, strAsInts[5], 12, 1200080426);\n v2 = step1(v2, v3, v0, v1, strAsInts[6], 17, -1473231341);\n v1 = step1(v1, v2, v3, v0, strAsInts[7], 22, -45705983);\n v0 = step1(v0, v1, v2, v3, strAsInts[8], 7, 1770035416);\n v3 = step1(v3, v0, v1, v2, strAsInts[9], 12, -1958414417);\n v2 = step1(v2, v3, v0, v1, strAsInts[10], 17, -42063);\n v1 = step1(v1, v2, v3, v0, strAsInts[11], 22, -1990404162);\n v0 = step1(v0, v1, v2, v3, strAsInts[12], 7, 1804603682);\n v3 = step1(v3, v0, v1, v2, strAsInts[13], 12, -40341101);\n v2 = step1(v2, v3, v0, v1, strAsInts[14], 17, -1502002290);\n v1 = step1(v1, v2, v3, v0, strAsInts[15], 22, 1236535329);\n var step2 = step2Function.bind(null, shiftFunction);\n v0 = step2(v0, v1, v2, v3, strAsInts[1], 5, -165796510);\n v3 = step2(v3, v0, v1, v2, strAsInts[6], 9, -1069501632);\n v2 = step2(v2, v3, v0, v1, strAsInts[11], 14, 643717713);\n v1 = step2(v1, v2, v3, v0, strAsInts[0], 20, -373897302);\n v0 = step2(v0, v1, v2, v3, strAsInts[5], 5, -701558691);\n v3 = step2(v3, v0, v1, v2, strAsInts[10], 9, 38016083);\n v2 = step2(v2, v3, v0, v1, strAsInts[15], 14, -660478335);\n v1 = step2(v1, v2, v3, v0, strAsInts[4], 20, -405537848);\n v0 = step2(v0, v1, v2, v3, strAsInts[9], 5, 568446438);\n v3 = step2(v3, v0, v1, v2, strAsInts[14], 9, -1019803690);\n v2 = step2(v2, v3, v0, v1, strAsInts[3], 14, -187363961);\n v1 = step2(v1, v2, v3, v0, strAsInts[8], 20, 1163531501);\n v0 = step2(v0, v1, v2, v3, strAsInts[13], 5, -1444681467);\n v3 = step2(v3, v0, v1, v2, strAsInts[2], 9, -51403784);\n v2 = step2(v2, v3, v0, v1, strAsInts[7], 14, 1735328473);\n v1 = step2(v1, v2, v3, v0, strAsInts[12], 20, -1926607734);\n var step3 = step3Function.bind(null, shiftFunction);\n v0 = step3(v0, v1, v2, v3, strAsInts[5], 4, -378558);\n v3 = step3(v3, v0, v1, v2, strAsInts[8], 11, -2022574463);\n v2 = step3(v2, v3, v0, v1, strAsInts[11], 16, 1839030562);\n v1 = step3(v1, v2, v3, v0, strAsInts[14], 23, -35309556);\n v0 = step3(v0, v1, v2, v3, strAsInts[1], 4, -1530992060);\n v3 = step3(v3, v0, v1, v2, strAsInts[4], 11, 1272893353);\n v2 = step3(v2, v3, v0, v1, strAsInts[7], 16, -155497632);\n v1 = step3(v1, v2, v3, v0, strAsInts[10], 23, -1094730640);\n v0 = step3(v0, v1, v2, v3, strAsInts[13], 4, 681279174);\n v3 = step3(v3, v0, v1, v2, strAsInts[0], 11, -358537222);\n v2 = step3(v2, v3, v0, v1, strAsInts[3], 16, -722521979);\n v1 = step3(v1, v2, v3, v0, strAsInts[6], 23, 76029189);\n v0 = step3(v0, v1, v2, v3, strAsInts[9], 4, -640364487);\n v3 = step3(v3, v0, v1, v2, strAsInts[12], 11, -421815835);\n v2 = step3(v2, v3, v0, v1, strAsInts[15], 16, 530742520);\n v1 = step3(v1, v2, v3, v0, strAsInts[2], 23, -995338651);\n var step4 = step4Function.bind(null, shiftFunction);\n v0 = step4(v0, v1, v2, v3, strAsInts[0], 6, -198630844);\n v3 = step4(v3, v0, v1, v2, strAsInts[7], 10, 1126891415);\n v2 = step4(v2, v3, v0, v1, strAsInts[14], 15, -1416354905);\n v1 = step4(v1, v2, v3, v0, strAsInts[5], 21, -57434055);\n v0 = step4(v0, v1, v2, v3, strAsInts[12], 6, 1700485571);\n v3 = step4(v3, v0, v1, v2, strAsInts[3], 10, -1894986606);\n v2 = step4(v2, v3, v0, v1, strAsInts[10], 15, -1051523);\n v1 = step4(v1, v2, v3, v0, strAsInts[1], 21, -2054922799);\n v0 = step4(v0, v1, v2, v3, strAsInts[8], 6, 1873313359);\n v3 = step4(v3, v0, v1, v2, strAsInts[15], 10, -30611744);\n v2 = step4(v2, v3, v0, v1, strAsInts[6], 15, -1560198380);\n v1 = step4(v1, v2, v3, v0, strAsInts[13], 21, 1309151649);\n v0 = step4(v0, v1, v2, v3, strAsInts[4], 6, -145523070);\n v3 = step4(v3, v0, v1, v2, strAsInts[11], 10, -1120210379);\n v2 = step4(v2, v3, v0, v1, strAsInts[2], 15, 718787259);\n v1 = step4(v1, v2, v3, v0, strAsInts[9], 21, -343485551);\n inOutVec4[0] = shiftFunction(v0, inOutVec4[0]);\n inOutVec4[1] = shiftFunction(v1, inOutVec4[1]);\n inOutVec4[2] = shiftFunction(v2, inOutVec4[2]);\n inOutVec4[3] = shiftFunction(v3, inOutVec4[3]);\n }\n ;\n function stringToIntArray(r) {\n for (var ret = [], e = 0; e < 64; e += 4)\n ret[e >> 2] = r.charCodeAt(e) + (r.charCodeAt(e + 1) << 8) + (r.charCodeAt(e + 2) << 16) + (r.charCodeAt(e + 3) << 24);\n return ret;\n }\n function computeMD5(str, shiftFunction) {\n let lastCharIndex;\n const strLength = str.length;\n const vec4 = [1732584193, -271733879, -1732584194, 271733878];\n for (lastCharIndex = 64; lastCharIndex <= strLength; lastCharIndex += 64)\n hashStep(vec4, stringToIntArray(str.substring(lastCharIndex - 64, lastCharIndex)), shiftFunction);\n const vec16 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];\n const reminderLength = (str = str.substring(lastCharIndex - 64)).length;\n // process by batch of 64\n let vec16Index;\n for (vec16Index = 0; vec16Index < reminderLength; vec16Index++)\n vec16[vec16Index >> 2] |= str.charCodeAt(vec16Index) << (vec16Index % 4 << 3);\n vec16[vec16Index >> 2] |= 128 << (vec16Index % 4 << 3);\n if (vec16Index > 55) {\n hashStep(vec4, vec16, shiftFunction);\n for (vec16Index = 16; vec16Index--;)\n vec16[vec16Index] = 0;\n }\n vec16[14] = 8 * strLength;\n hashStep(vec4, vec16, shiftFunction);\n return vec4;\n }\n ;\n /**\n * Returns the MD5 hash-value of the passed string.\n *\n * Based on the work of Jeff Mott, who did a pure JS implementation of the MD5 algorithm that was published by Ronald L. Rivest in 1991.\n * Code was imported from https://github.com/pvorb/node-md5\n *\n * I cleaned up the all-including minified version of it.\n */\n function md5(str) {\n if (!str)\n return '';\n let shiftFunction;\n if (\"5d41402abc4b2a76b9719d911017c592\" !== hexStringFromArray(computeMD5(\"hello\")))\n shiftFunction = function (r, n) {\n const e = (65535 & r) + (65535 & n);\n return (r >> 16) + (n >> 16) + (e >> 16) << 16 | 65535 & e;\n };\n return hexStringFromArray(computeMD5(str, shiftFunction));\n }\n Utils.md5 = md5;\n })(Utils = CdvPurchase.Utils || (CdvPurchase.Utils = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n let Utils;\n (function (Utils) {\n /** Returns an UUID v4. Uses `window.crypto` internally to generate random values. */\n function platformId() {\n var _a, _b, _c;\n if ((_a = window.cordova) === null || _a === void 0 ? void 0 : _a.platformId)\n return (_b = window.cordova) === null || _b === void 0 ? void 0 : _b.platformId;\n if ((_c = window.Capacitor) === null || _c === void 0 ? void 0 : _c.getPlatform)\n return window.Capacitor.getPlatform();\n return 'web';\n }\n Utils.platformId = platformId;\n })(Utils = CdvPurchase.Utils || (CdvPurchase.Utils = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n let Utils;\n (function (Utils) {\n /**\n * Return a safer version of a callback that runs inside a try/catch block.\n *\n * @param logger - Used to log errors.\n * @param className - Type of callback, helps debugging when a function failed.\n * @param callback - The callback function is turn into a safer version.\n */\n function safeCallback(logger, className, callback, callbackName, reason) {\n return function (value) {\n safeCall(logger, className, callback, value, callbackName, reason);\n };\n }\n Utils.safeCallback = safeCallback;\n /**\n * Run a callback inside a try/catch block.\n *\n * @param logger - Used to log errors.\n * @param className - Type of callback, helps debugging when a function failed.\n * @param callback - The callback function is turn into a safer version.\n * @param value - Value passed to the callback.\n */\n function safeCall(logger, className, callback, value, callbackName, reason) {\n if (!callback) {\n return; // cannot call an undefined callback.\n }\n if (!callbackName) {\n callbackName = callback.name || ('#' + Utils.md5(callback.toString()));\n }\n setTimeout(() => {\n try {\n logger.debug(`Calling callback: type=${className} name=${callbackName} reason=${reason}`);\n callback(value);\n }\n catch (error) {\n logger.error(`Error in callback: type=${className} name=${callbackName} reason=${reason}`);\n logger.debug(callback.toString());\n const errorAsError = error;\n if ('message' in errorAsError)\n logger.error(errorAsError.message);\n if ('fileName' in error)\n logger.error('in ' + error.fileName + ':' + error.lineNumber);\n if ('stack' in errorAsError)\n logger.error(errorAsError.stack);\n }\n }, 0);\n }\n Utils.safeCall = safeCall;\n })(Utils = CdvPurchase.Utils || (CdvPurchase.Utils = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n let Utils;\n (function (Utils) {\n function getCryptoExtension() {\n return (window.crypto || window.msCrypto);\n }\n /** Returns an UUID v4. Uses `window.crypto` internally to generate random values. */\n function uuidv4() {\n // @ts-ignore\n return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, function (c) {\n return (c ^ getCryptoExtension().getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16);\n });\n }\n Utils.uuidv4 = uuidv4;\n })(Utils = CdvPurchase.Utils || (CdvPurchase.Utils = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n let Validator;\n (function (Validator) {\n /**\n * @internal\n */\n let Internal;\n (function (Internal) {\n function isArray(arg) {\n return Object.prototype.toString.call(arg) === '[object Array]';\n }\n function isObject(arg) {\n return Object.prototype.toString.call(arg) === '[object Object]';\n }\n // List of functions allowed by store.validator_privacy_policy\n function getPrivacyPolicy(store) {\n if (typeof store.validator_privacy_policy === 'string')\n return store.validator_privacy_policy.split(',');\n else if (isArray(store.validator_privacy_policy))\n return store.validator_privacy_policy;\n else // default: no tracking\n return ['analytics', 'support', 'fraud'];\n }\n function getDeviceInfo(store) {\n const privacyPolicy = getPrivacyPolicy(store); // string[]\n function allowed(policy) {\n return privacyPolicy.indexOf(policy) >= 0;\n }\n // Different versions of the plugin use different response fields.\n // Sending this information allows the validator to reply with only expected information.\n const ret = {\n plugin: 'cordova-plugin-purchase/' + CdvPurchase.PLUGIN_VERSION,\n };\n const wdw = window;\n // the cordova-plugin-device global object\n const device = isObject(wdw.device) ? wdw.device : {};\n // Send the receipt validator information about the device.\n // This will allow to make vendor or device specific fixes and detect class\n // of devices with issues.\n // Knowing running version of OS and libraries also required for handling\n // support requests.\n if (allowed('analytics') || allowed('support')) {\n // Version of ionic (if applicable)\n const ionic = wdw.Ionic || wdw.ionic;\n if (ionic && ionic.version)\n ret.ionic = ionic.version;\n // Information from the cordova-plugin-device (if installed)\n if (device.cordova)\n ret.cordova = device.cordova; // Version of cordova\n if (device.model)\n ret.model = device.model; // Device model\n if (device.platform)\n ret.platform = device.platform; // OS\n if (device.version)\n ret.version = device.version; // OS version\n if (device.manufacturer)\n ret.manufacturer = device.manufacturer; // Device manufacturer\n }\n // Device identifiers are used for tracking users across services\n // It is sometimes required for support requests too, but I choose to\n // keep this out.\n if (allowed('tracking')) {\n if (device.serial)\n ret.serial = device.serial; // Hardware serial number\n if (device.uuid)\n ret.uuid = device.uuid; // Device UUID\n }\n // Running from a simulator is an error condition for in-app purchases.\n // Since only developers run in a simulator, let's always report that.\n if (device.isVirtual)\n ret.isVirtual = device.isVirtual; // Simulator\n // Probably nobody wants to disable fraud discovery.\n // A fingerprint of the device identifiers is used for fraud discovery.\n // An alert should be triggered by the validator when a lot of devices\n // share a single receipt.\n if (allowed('fraud')) {\n // For fraud discovery, we only need a fingerprint of the device.\n var fingerprint = '';\n if (device.serial)\n fingerprint = 'serial:' + device.serial; // Hardware serial number\n else if (device.uuid)\n fingerprint = 'uuid:' + device.uuid; // Device UUID\n else {\n // Using only model and manufacturer, we might end-up with many\n // users sharing the same fingerprint, which is fine for fraud discovery.\n if (device.model)\n fingerprint += '/' + device.model;\n if (device.manufacturer)\n fingerprint = '/' + device.manufacturer;\n }\n // Fingerprint is hashed to keep required level of privacy.\n if (fingerprint)\n ret.fingerprint = CdvPurchase.Utils.md5(fingerprint);\n }\n return ret;\n }\n Internal.getDeviceInfo = getDeviceInfo;\n })(Internal = Validator.Internal || (Validator.Internal = {}));\n })(Validator = CdvPurchase.Validator || (CdvPurchase.Validator = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n let Validator;\n (function (Validator) {\n let Request;\n (function (Request) {\n ;\n })(Request = Validator.Request || (Validator.Request = {}));\n })(Validator = CdvPurchase.Validator || (CdvPurchase.Validator = {}));\n})(CdvPurchase || (CdvPurchase = {}));\nvar CdvPurchase;\n(function (CdvPurchase) {\n /** Receipt data as validated by the receipt validation server */\n class VerifiedReceipt {\n /**\n * @internal\n */\n constructor(receipt, response, decorator) {\n var _a;\n /** @internal */\n this.className = 'VerifiedReceipt';\n this.id = response.id;\n this.sourceReceipt = receipt;\n this.collection = (_a = response.collection) !== null && _a !== void 0 ? _a : [];\n this.latestReceipt = response.latest_receipt;\n this.nativeTransactions = [response.transaction];\n this.warning = response.warning;\n this.validationDate = response.date ? new Date(response.date) : new Date();\n Object.defineProperty(this, 'raw', { 'enumerable': false, get() { return response; } });\n Object.defineProperty(this, 'finish', { 'enumerable': false, get() { return () => decorator.finish(this); } });\n }\n /** Platform this receipt originated from */\n get platform() { return this.sourceReceipt.platform; }\n /** Get raw response data from the receipt validation request */\n get raw() { return {}; } // actual implementation as \"defineProperty\" in constructor.\n /**\n * Update the receipt content\n *\n * @internal\n */\n set(receipt, response) {\n var _a;\n this.id = response.id;\n this.sourceReceipt = receipt;\n this.collection = (_a = response.collection) !== null && _a !== void 0 ? _a : [];\n this.latestReceipt = response.latest_receipt;\n this.nativeTransactions = [response.transaction];\n this.warning = response.warning;\n }\n /** Finish all transactions in the receipt */\n finish() {\n return __awaiter(this, void 0, void 0, function* () { });\n }\n }\n CdvPurchase.VerifiedReceipt = VerifiedReceipt;\n})(CdvPurchase || (CdvPurchase = {}));\n"],"x_google_ignoreList":[12]}