@munchi_oy/payments 1.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +28 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1 -0
- package/dist/index.mjs +1 -0
- package/dist/src/MunchiPaymentSDK.d.ts +42 -0
- package/dist/src/MunchiPaymentSDK.d.ts.map +1 -0
- package/dist/src/error.d.ts +18 -0
- package/dist/src/error.d.ts.map +1 -0
- package/dist/src/strategies/IPaymentStrategy.d.ts +12 -0
- package/dist/src/strategies/IPaymentStrategy.d.ts.map +1 -0
- package/dist/src/strategies/MockStrategy.d.ts +13 -0
- package/dist/src/strategies/MockStrategy.d.ts.map +1 -0
- package/dist/src/strategies/NetsStrategy.d.ts +24 -0
- package/dist/src/strategies/NetsStrategy.d.ts.map +1 -0
- package/dist/src/strategies/VivaStrategy.d.ts +24 -0
- package/dist/src/strategies/VivaStrategy.d.ts.map +1 -0
- package/dist/src/test-link.d.ts +2 -0
- package/dist/src/test-link.d.ts.map +1 -0
- package/dist/src/types/device.d.ts +15 -0
- package/dist/src/types/device.d.ts.map +1 -0
- package/dist/src/types/index.d.ts +4 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types/payment.d.ts +109 -0
- package/dist/src/types/payment.d.ts.map +1 -0
- package/dist/src/types/sdk.d.ts +48 -0
- package/dist/src/types/sdk.d.ts.map +1 -0
- package/dist/src/version.d.ts +2 -0
- package/dist/src/version.d.ts.map +1 -0
- package/index.ts +3 -0
- package/package.json +51 -0
- package/src/MunchiPaymentSDK.ts +532 -0
- package/src/error.ts +26 -0
- package/src/strategies/IPaymentStrategy.ts +22 -0
- package/src/strategies/MockStrategy.ts +55 -0
- package/src/strategies/NetsStrategy.ts +336 -0
- package/src/strategies/VivaStrategy.ts +319 -0
- package/src/test-link.ts +0 -0
- package/src/types/device.ts +15 -0
- package/src/types/index.ts +3 -0
- package/src/types/payment.ts +123 -0
- package/src/types/sdk.ts +42 -0
- package/src/version.ts +3 -0
package/README.md
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# @munchi_oy/payments
|
|
2
|
+
|
|
3
|
+
Payment processing utilities for the Munchi SDK.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @munchi_oy/payments
|
|
9
|
+
# or
|
|
10
|
+
pnpm add @munchi_oy/payments
|
|
11
|
+
# or
|
|
12
|
+
yarn add @munchi_oy/payments
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Peer Dependencies
|
|
16
|
+
|
|
17
|
+
This package requires:
|
|
18
|
+
- `axios >= 1.0.0`
|
|
19
|
+
|
|
20
|
+
## Usage
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
import { /* your exports */ } from '@munchi_oy/payments';
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## License
|
|
27
|
+
|
|
28
|
+
UNLICENSED - Private package
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,YAAY,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,cAAc,aAAa,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var N=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var w=Object.getOwnPropertyNames;var O=Object.prototype.hasOwnProperty;var D=(u,e)=>{for(var r in e)N(u,r,{get:e[r],enumerable:!0})},_=(u,e,r,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of w(e))!O.call(u,n)&&n!==r&&N(u,n,{get:()=>e[n],enumerable:!(t=A(e,n))||t.enumerable});return u};var L=u=>_(N({},"__esModule",{value:!0}),u);var x={};D(x,{AppReaderStatus:()=>b,MunchiPaymentSDK:()=>P,PaymentInteractionState:()=>S,SdkPaymentStatus:()=>E});module.exports=L(x);var d=require("@munchi_oy/core");var C="1.2.5";var c=class u extends Error{code;rawError;constructor(e,r,t){super(r),this.name="PaymentSDKError",this.code=e,this.rawError=t,Object.setPrototypeOf(this,u.prototype)}};var y=require("@munchi_oy/core");var E=(i=>(i.PENDING="PENDING",i.SUCCESS="SUCCESS",i.APPROVED="APPROVED",i.FAILED="FAILED",i.CANCELLED="CANCELLED",i.ERROR="ERROR",i))(E||{}),S=(a=>(a.IDLE="IDLE",a.CONNECTING="CONNECTING",a.REQUIRES_INPUT="REQUIRES_INPUT",a.PROCESSING="PROCESSING",a.SUCCESS="SUCCESS",a.FAILED="FAILED",a.INTERNAL_ERROR="INTERNAL_ERROR",a.VERIFYING="VERIFYING",a))(S||{});var g=class{constructor(e,r,t){this.messaging=r;this.config=t;this.api=new y.PaymentApi(void 0,"",e)}api;abortController=null;currentRequestId=null;paymentProvider=y.PaymentProviderEnum.Nets;async processPayment(e,r){this.abortController=new AbortController,r("CONNECTING");let t={amount:e.amountCents,businessId:Number(this.config.storeId),referenceId:e.orderRef,currency:e.currency,displayId:e.displayId,options:{allowPinBypass:!0,transactionType:y.TransactionType.Purchase}};try{let{data:n}=await this.api.initiateNetsTerminalTransaction(t),s=n.connectCloudRequestId;if(!s)throw new Error("connectCloudRequestId is missing from response.");if(this.currentRequestId=s,this.abortController.signal.aborted)throw new Error("Aborted");r("REQUIRES_INPUT",{sessionId:s});let i=await this.waitForPaymentCompletion(s,e.orderRef,this.abortController.signal);return this.currentRequestId=null,i}catch(n){throw this.currentRequestId=null,n instanceof c?n:new c("TERMINAL_BUSY","Failed to create Nets Intent",n)}}async waitForPaymentCompletion(e,r,t){let n=`nets.requests.${e}`,s=y.PaymentEventType.StatusChanged;return new Promise((i,l)=>{let a=!1,o=()=>{a=!0,typeof f=="function"&&f(),clearTimeout(I)},m=()=>{o(),l(new c("CANCELLED","Transaction cancelled"))};t.addEventListener("abort",m);let f=this.messaging.subscribe(n,s,h=>{a||(o(),t.removeEventListener("abort",m),i(this.handleSuccess(h)))}),I=setTimeout(async()=>{if(!(a||t.aborted))try{let h=await this.pollOrderStatus(e,r,this.config.storeId,t);i(this.handleSuccess(h))}catch(h){l(new c("TIMEOUT","Payment timed out and polling failed",h))}finally{t.removeEventListener("abort",m),o()}},1e4)})}async pollOrderStatus(e,r,t,n){let a=Date.now()+12e4;for(;Date.now()<a;){if(n.aborted)throw new Error("Aborted");try{let{data:o}=await this.api.getPaymentStatus({businessId:Number(t),orderId:r,provider:this.paymentProvider,referenceId:e});if(o.status!==y.SimplePaymentStatus.Pending)return o}catch(o){throw new Error(`Payment verification failed: ${o instanceof Error?o.message:String(o)}`)}await new Promise(o=>setTimeout(o,2e3))}throw new Error("Payment verification timed out.")}async cancelTransaction(e){if(!this.currentRequestId)return!1;let r={requestId:this.currentRequestId,businessId:Number(this.config.storeId)};try{return await this.api.cancelNetsTerminalTransaction(r),this.abortController?.abort(),this.currentRequestId=null,!0}catch{return!1}}async refundTransaction(e,r){try{this.abortController=new AbortController;let t={amount:e.amountCents,businessId:Number(this.config.storeId),currency:e.currency,displayId:this.config.kioskId,referenceId:e.orderRef,options:{allowPinBypass:!0,transactionType:y.TransactionType.ReturnOfGoods}},{data:n}=await this.api.initiateNetsTerminalTransaction(t),s=n.connectCloudRequestId;if(!s)throw new Error("connectCloudRequestId is missing from response.");if(this.currentRequestId=s,this.abortController.signal.aborted)throw new Error("Aborted");r("REQUIRES_INPUT",{sessionId:s});let i=await this.waitForPaymentCompletion(s,e.orderRef,this.abortController.signal);return this.currentRequestId=null,i}catch(t){throw this.currentRequestId=null,t instanceof c||t instanceof c?t:new c("NETWORK_ERROR","Failed to refund Nets transaction",t)}}async verifyFinalStatus(e,r){try{let{data:t}=await this.api.getPaymentStatus({businessId:Number(this.config.storeId),orderId:e.orderRef,provider:this.paymentProvider,referenceId:r});return this.handleSuccess(t)}catch(t){throw new c("NETWORK_ERROR","Failed to verify final Nets status",t)}}handleSuccess(e){let r=e.status===y.SimplePaymentStatus.Success,t={success:r,status:r?"SUCCESS":"FAILED",orderId:e.orderId,transaction:e.transaction};return e.transactionId&&(t.transactionId=e.transactionId),e.error?.code&&(t.errorCode=e.error.code),e.error?.message&&(t.errorMessage=e.error.message),t}};var p=require("@munchi_oy/core");var T=class{constructor(e,r,t){this.messaging=r;this.config=t;this.api=new p.PaymentApi(void 0,"",e)}api;abortController=null;currentSessionId=null;paymentProvider=p.PaymentProviderEnum.Viva;async processPayment(e,r){this.abortController=new AbortController,r("CONNECTING");let t={amount:e.amountCents,referenceId:e.orderRef,businessId:parseInt(this.config.storeId),currency:e.currency,displayId:e.displayId,showReceipt:!0,showTransactionResult:!0};try{let{data:n}=await this.api.initiateTerminalTransaction(t);if(this.currentSessionId=n.sessionId,this.abortController.signal.aborted)throw new Error("Aborted");r("REQUIRES_INPUT",{sessionId:n.sessionId});let s=await this.waitForPaymentCompletion(n.sessionId,e.orderRef,this.abortController.signal);return this.currentSessionId=null,s}catch(n){throw this.currentSessionId=null,n instanceof c?n:new c("NETWORK_ERROR","Failed to create Viva Intent",n)}}async waitForPaymentCompletion(e,r,t){let s=`viva.${this.config.channel.toLowerCase()}.requests.${e}`,i="payment:status-changed";return new Promise((l,a)=>{let o=!1,m=()=>{o=!0,typeof I=="function"&&I(),clearTimeout(h)},f=()=>{m(),a(new Error("Aborted"))};t.addEventListener("abort",f);let I=this.messaging.subscribe(s,i,R=>{o||(m(),t.removeEventListener("abort",f),l(this.handleSuccess(R)))}),h=setTimeout(async()=>{if(!(o||t.aborted))try{let R=await this.pollOrderStatus(e,r,this.config.storeId,t);l(this.handleSuccess(R))}catch(R){a(new c("TIMEOUT","Payment timed out and polling failed",R))}finally{t.removeEventListener("abort",f),m()}},1e4)})}async pollOrderStatus(e,r,t,n){let a=Date.now()+12e4;for(;Date.now()<a;){if(n.aborted)throw new Error("Aborted");try{let{data:o}=await this.api.getPaymentStatus({businessId:Number(t),orderId:r,provider:this.paymentProvider,referenceId:e});if(o.status!==p.SimplePaymentStatus.Pending)return o}catch(o){throw new Error(`Payment verification failed: ${o instanceof Error?o.message:String(o)}`)}await new Promise(o=>setTimeout(o,2e3))}throw new Error("Payment verification timed out.")}handleSuccess(e){let r=e.status===p.SimplePaymentStatus.Success,t={success:r,status:r?"SUCCESS":"FAILED",orderId:e.orderId,errorCode:e.error?.code??"",errorMessage:e.error?.message??""};return e.transactionId&&(t.transactionId=e.transactionId),e.error?.referenceError&&(t.errorReference=e.error.referenceError),e.transaction&&(t.transaction=e.transaction),t}async cancelTransaction(e){if(!this.currentSessionId)return!1;try{let r=this.currentSessionId;return this.currentSessionId=null,await this.api.cancelVivaTransactionV2({cashRegisterId:this.config.storeId,sessionId:r}),this.abortController?.abort(),!0}catch(r){throw this.currentSessionId=null,new c("NETWORK_ERROR","Failed to cancel Viva transaction",r)}}async verifyFinalStatus(e,r){try{let{data:t}=await this.api.getPaymentStatus({businessId:Number(this.config.storeId),orderId:e.orderRef,provider:this.paymentProvider,referenceId:r}),n=t.status===p.SimplePaymentStatus.Success,s={success:n,status:n?"SUCCESS":"FAILED",orderId:t.orderId,errorCode:t.error?.code??"",errorMessage:t.error?.message??""};return t.transactionId&&(s.transactionId=t.transactionId),t.error?.referenceError&&(s.errorReference=t.error.referenceError),t.transaction&&(s.transaction=t.transaction),s}catch(t){throw new c("NETWORK_ERROR","Failed to verify final transaction status",t)}}async refundTransaction(e,r){try{let t={amount:e.amountCents,businessId:Number(this.config.storeId),displayId:this.config.kioskId,currency:e.currency,orderReferenceId:e.orderRef,referenceId:e.originalTransactionId},{data:n}=await this.api.refundSingleVivaTransaction(t),s=n.success;return{success:s,status:s?"SUCCESS":"FAILED",orderId:e.orderRef,transactionId:n.sessionId}}catch(t){throw new c("NETWORK_ERROR","Failed to refund Viva transaction",t)}}};var P=class u{strategy;axios;messaging;timeoutMs;logger;_currentState="IDLE";_listeners=[];_cancellationIntent=!1;_currentSessionId;_autoResetTimer;autoResetOptions;static TERMINAL_STATES=["SUCCESS","FAILED","INTERNAL_ERROR"];static RESTING_STATES=["IDLE",...u.TERMINAL_STATES];constructor(e,r,t,n={},s){this.axios=e,this.messaging=r,this.logger=n.logger,this.timeoutMs=n.timeoutMs||6e4,this.autoResetOptions=n.autoResetOnPaymentComplete,this.strategy=s??this.resolveStrategy(t)}get version(){return C}get currentState(){return this._currentState}generateErrorResult(e,r,t){return{success:!1,status:"ERROR",errorCode:this.normalizeErrorCode(r),errorMessage:t,orderId:e}}normalizeErrorCode(e){return e?e.includes(".")?e:{CANCELLED:d.PaymentFailureCode.PaymentCancelledByUser,DECLINED:d.PaymentFailureCode.PaymentDeclined,TERMINAL_BUSY:d.PaymentFailureCode.TerminalBusy,TERMINAL_OFFLINE:d.PaymentFailureCode.TerminalOffline,TIMEOUT:d.PaymentFailureCode.TerminalTimeout,NETWORK_ERROR:d.PaymentFailureCode.SystemProviderError,STRATEGY_ERROR:d.PaymentFailureCode.SystemProviderError,MISSING_CONFIG:d.PaymentFailureCode.SystemUnknown,INVALID_AMOUNT:d.PaymentFailureCode.SystemUnknown,UNKNOWN:d.PaymentFailureCode.SystemUnknown}[e]??d.PaymentFailureCode.SystemUnknown:d.PaymentFailureCode.SystemUnknown}subscribe=e=>(this._listeners.push(e),e(this._currentState),()=>{this._listeners=this._listeners.filter(r=>r!==e)});transitionTo(e){if(this._currentState===e)return;if(e==="IDLE"){this.cancelAutoReset(),this._currentState=e,this._listeners.forEach(t=>t(e));return}if(u.TERMINAL_STATES.includes(this._currentState)){let t=`Invalid State Transition: Attempted to move from terminal state ${this._currentState} to ${e}`;throw this.logger?.error(t),this._currentState!=="INTERNAL_ERROR"&&(this._currentState="INTERNAL_ERROR",this._listeners.forEach(n=>n(this._currentState))),new c("UNKNOWN",t)}this._currentState=e,u.TERMINAL_STATES.includes(e)&&this.scheduleAutoReset(e),this._listeners.forEach(t=>t(e))}_resetScheduledAt;get nextAutoResetAt(){return this._resetScheduledAt}cancelAutoReset(){this._autoResetTimer&&(clearTimeout(this._autoResetTimer),this._autoResetTimer=void 0),this._resetScheduledAt=void 0}scheduleAutoReset(e){if(!this.autoResetOptions)return;let t=e==="SUCCESS"?this.autoResetOptions.successDelayMs??5e3:this.autoResetOptions.failureDelayMs??5e3;this.logger?.info(`Scheduling auto-reset to IDLE in ${t}ms`),this._resetScheduledAt=Date.now()+t,this._autoResetTimer=setTimeout(()=>{this.logger?.info("Auto-reset triggered"),this.reset()},t)}resolveStrategy(e){return e.provider===d.PaymentProvider.Nets?new g(this.axios,this.messaging,e):new T(this.axios,this.messaging,e)}initiateTransaction=async(e,r)=>{let t=r??{},n=e.orderRef;if(!u.RESTING_STATES.includes(this._currentState))return this.generateErrorResult(e.orderRef,"UNKNOWN","A transaction is already in progress");let i=Date.now();if(this._cancellationIntent=!1,this._currentSessionId=void 0,this.transitionTo("IDLE"),e.amountCents<=0)return this.generateErrorResult(e.orderRef,"INVALID_AMOUNT","Amount must be greater than 0");try{let l=(f,I)=>{I?.sessionId&&(this._currentSessionId=I.sessionId),f!=="FAILED"&&(this.transitionTo(f),this.fireStateCallback(f,t,n))},a=this.strategy.processPayment(e,l),o=new Promise((f,I)=>{setTimeout(()=>{I(new c("TIMEOUT","Transaction timed out"))},this.timeoutMs)}),m=await Promise.race([a,o]);if(m.success)this.transitionTo("SUCCESS"),this.safeFireCallback(()=>t.onSuccess?.(m));else{if(this._cancellationIntent)return await this.handleTransactionError(e,new Error("Aborted after resolution"),t);this.transitionTo("FAILED"),this.safeFireCallback(()=>t.onError?.(m))}return this.logger?.info("Transaction completed successfully",{orderId:e.orderRef,durationMs:Date.now()-i}),m}catch(l){return this.logger?.warn("Transaction interrupted. Handling final status...",{error:l}),await this.handleTransactionError(e,l,t)}};async handleTransactionError(e,r,t={}){if(this._cancellationIntent||(this.transitionTo("VERIFYING"),this.safeFireCallback(()=>t.onVerifying?.({orderRef:e.orderRef,refPaymentId:this._currentSessionId}))),this._cancellationIntent){try{if(this._currentSessionId){let s=await this.strategy.verifyFinalStatus(e,this._currentSessionId);if(s.success)return this.transitionTo("SUCCESS"),this.safeFireCallback(()=>t.onSuccess?.(s)),s}}catch(s){this.logger?.warn("Final status verification failed during cancellation",{err:s})}return this.transitionTo("FAILED"),this.safeFireCallback(()=>t.onCancelled?.({orderRef:e.orderRef,refPaymentId:this._currentSessionId})),{success:!1,status:"CANCELLED",errorCode:this.normalizeErrorCode("CANCELLED"),orderId:e.orderRef,...this._currentSessionId?{transactionId:this._currentSessionId}:{}}}this.transitionTo("FAILED");let n;if(this._currentSessionId)try{n=await this.strategy.verifyFinalStatus(e,this._currentSessionId)}catch(s){this.logger?.warn("Failed to get detailed error from verifyFinalStatus",{verifyErr:s}),n=this.buildErrorResultFromException(e.orderRef,r)}else n=this.buildErrorResultFromException(e.orderRef,r);return this.safeFireCallback(()=>t.onError?.(n)),n}buildErrorResultFromException(e,r){return r instanceof c?this.generateErrorResult(e,r.code,r.message):this.generateErrorResult(e,"UNKNOWN",r instanceof Error?r.message:"Unknown fatal error")}fireStateCallback(e,r,t){let n={orderRef:t,refPaymentId:this._currentSessionId};switch(e){case"CONNECTING":this.safeFireCallback(()=>r.onConnecting?.(n));break;case"REQUIRES_INPUT":this.safeFireCallback(()=>r.onRequiresInput?.(n));break;case"PROCESSING":this.safeFireCallback(()=>r.onProcessing?.(n));break}}safeFireCallback(e){try{e()}catch(r){this.logger?.warn("Callback execution failed",{error:r})}}cancel=async()=>{if(this.logger?.info("Attempting cancellation"),u.TERMINAL_STATES.includes(this._currentState))return this.logger?.warn("Cannot cancel: Transaction already in terminal state",{state:this._currentState}),!1;this._cancellationIntent=!0,this.transitionTo("VERIFYING");try{let e=await this.strategy.cancelTransaction(r=>this.transitionTo(r));return!e&&this._currentState==="VERIFYING"&&this.transitionTo("IDLE"),e}catch(e){return this.logger?.error("Cancellation command failed",e),!1}};reset=()=>{u.TERMINAL_STATES.includes(this._currentState)&&this.transitionTo("IDLE")};refund=async(e,r)=>{let t=r??{};if(this.logger?.info("Initiating refund",{orderRef:e.orderRef}),this._currentSessionId=void 0,!u.RESTING_STATES.includes(this._currentState))return this.generateErrorResult(e.orderRef,"UNKNOWN","A transaction is already in progress");this.transitionTo("IDLE");try{let s=(l,a)=>{a?.sessionId&&(this._currentSessionId=a.sessionId),l!=="FAILED"&&(this.transitionTo(l),this.fireStateCallback(l,t,e.orderRef))},i=await this.strategy.refundTransaction(e,s);return i.success?(this.transitionTo("SUCCESS"),this.safeFireCallback(()=>t.onSuccess?.(i))):(this.transitionTo("FAILED"),this.safeFireCallback(()=>t.onError?.(i))),this.logger?.info("Refund completed",{success:i.success,orderRef:e.orderRef}),i}catch(s){this.logger?.error("Refund failed",s),this.transitionTo("FAILED");let i=this.generateErrorResult(e.orderRef,"UNKNOWN",s instanceof Error?s.message:"Refund failed");return this.safeFireCallback(()=>t.onError?.(i)),i}}};var b=(n=>(n.CONNECTING="CONNECTING",n.CONNECTED="CONNECTED",n.OFFLINE="OFFLINE",n.DISCONNECTED="DISCONNECTED",n))(b||{});0&&(module.exports={AppReaderStatus,MunchiPaymentSDK,PaymentInteractionState,SdkPaymentStatus});
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{PaymentFailureCode as d,PaymentProvider as L}from"@munchi_oy/core";var P="1.2.5";var c=class m extends Error{code;rawError;constructor(e,r,t){super(r),this.name="PaymentSDKError",this.code=e,this.rawError=t,Object.setPrototypeOf(this,m.prototype)}};import{PaymentApi as A,PaymentEventType as w,PaymentProviderEnum as O,SimplePaymentStatus as N,TransactionType as C}from"@munchi_oy/core";var h=(i=>(i.PENDING="PENDING",i.SUCCESS="SUCCESS",i.APPROVED="APPROVED",i.FAILED="FAILED",i.CANCELLED="CANCELLED",i.ERROR="ERROR",i))(h||{}),R=(a=>(a.IDLE="IDLE",a.CONNECTING="CONNECTING",a.REQUIRES_INPUT="REQUIRES_INPUT",a.PROCESSING="PROCESSING",a.SUCCESS="SUCCESS",a.FAILED="FAILED",a.INTERNAL_ERROR="INTERNAL_ERROR",a.VERIFYING="VERIFYING",a))(R||{});var E=class{constructor(e,r,t){this.messaging=r;this.config=t;this.api=new A(void 0,"",e)}api;abortController=null;currentRequestId=null;paymentProvider=O.Nets;async processPayment(e,r){this.abortController=new AbortController,r("CONNECTING");let t={amount:e.amountCents,businessId:Number(this.config.storeId),referenceId:e.orderRef,currency:e.currency,displayId:e.displayId,options:{allowPinBypass:!0,transactionType:C.Purchase}};try{let{data:n}=await this.api.initiateNetsTerminalTransaction(t),s=n.connectCloudRequestId;if(!s)throw new Error("connectCloudRequestId is missing from response.");if(this.currentRequestId=s,this.abortController.signal.aborted)throw new Error("Aborted");r("REQUIRES_INPUT",{sessionId:s});let i=await this.waitForPaymentCompletion(s,e.orderRef,this.abortController.signal);return this.currentRequestId=null,i}catch(n){throw this.currentRequestId=null,n instanceof c?n:new c("TERMINAL_BUSY","Failed to create Nets Intent",n)}}async waitForPaymentCompletion(e,r,t){let n=`nets.requests.${e}`,s=w.StatusChanged;return new Promise((i,u)=>{let a=!1,o=()=>{a=!0,typeof y=="function"&&y(),clearTimeout(f)},l=()=>{o(),u(new c("CANCELLED","Transaction cancelled"))};t.addEventListener("abort",l);let y=this.messaging.subscribe(n,s,I=>{a||(o(),t.removeEventListener("abort",l),i(this.handleSuccess(I)))}),f=setTimeout(async()=>{if(!(a||t.aborted))try{let I=await this.pollOrderStatus(e,r,this.config.storeId,t);i(this.handleSuccess(I))}catch(I){u(new c("TIMEOUT","Payment timed out and polling failed",I))}finally{t.removeEventListener("abort",l),o()}},1e4)})}async pollOrderStatus(e,r,t,n){let a=Date.now()+12e4;for(;Date.now()<a;){if(n.aborted)throw new Error("Aborted");try{let{data:o}=await this.api.getPaymentStatus({businessId:Number(t),orderId:r,provider:this.paymentProvider,referenceId:e});if(o.status!==N.Pending)return o}catch(o){throw new Error(`Payment verification failed: ${o instanceof Error?o.message:String(o)}`)}await new Promise(o=>setTimeout(o,2e3))}throw new Error("Payment verification timed out.")}async cancelTransaction(e){if(!this.currentRequestId)return!1;let r={requestId:this.currentRequestId,businessId:Number(this.config.storeId)};try{return await this.api.cancelNetsTerminalTransaction(r),this.abortController?.abort(),this.currentRequestId=null,!0}catch{return!1}}async refundTransaction(e,r){try{this.abortController=new AbortController;let t={amount:e.amountCents,businessId:Number(this.config.storeId),currency:e.currency,displayId:this.config.kioskId,referenceId:e.orderRef,options:{allowPinBypass:!0,transactionType:C.ReturnOfGoods}},{data:n}=await this.api.initiateNetsTerminalTransaction(t),s=n.connectCloudRequestId;if(!s)throw new Error("connectCloudRequestId is missing from response.");if(this.currentRequestId=s,this.abortController.signal.aborted)throw new Error("Aborted");r("REQUIRES_INPUT",{sessionId:s});let i=await this.waitForPaymentCompletion(s,e.orderRef,this.abortController.signal);return this.currentRequestId=null,i}catch(t){throw this.currentRequestId=null,t instanceof c||t instanceof c?t:new c("NETWORK_ERROR","Failed to refund Nets transaction",t)}}async verifyFinalStatus(e,r){try{let{data:t}=await this.api.getPaymentStatus({businessId:Number(this.config.storeId),orderId:e.orderRef,provider:this.paymentProvider,referenceId:r});return this.handleSuccess(t)}catch(t){throw new c("NETWORK_ERROR","Failed to verify final Nets status",t)}}handleSuccess(e){let r=e.status===N.Success,t={success:r,status:r?"SUCCESS":"FAILED",orderId:e.orderId,transaction:e.transaction};return e.transactionId&&(t.transactionId=e.transactionId),e.error?.code&&(t.errorCode=e.error.code),e.error?.message&&(t.errorMessage=e.error.message),t}};import{PaymentApi as D,PaymentProviderEnum as _,SimplePaymentStatus as g}from"@munchi_oy/core";var S=class{constructor(e,r,t){this.messaging=r;this.config=t;this.api=new D(void 0,"",e)}api;abortController=null;currentSessionId=null;paymentProvider=_.Viva;async processPayment(e,r){this.abortController=new AbortController,r("CONNECTING");let t={amount:e.amountCents,referenceId:e.orderRef,businessId:parseInt(this.config.storeId),currency:e.currency,displayId:e.displayId,showReceipt:!0,showTransactionResult:!0};try{let{data:n}=await this.api.initiateTerminalTransaction(t);if(this.currentSessionId=n.sessionId,this.abortController.signal.aborted)throw new Error("Aborted");r("REQUIRES_INPUT",{sessionId:n.sessionId});let s=await this.waitForPaymentCompletion(n.sessionId,e.orderRef,this.abortController.signal);return this.currentSessionId=null,s}catch(n){throw this.currentSessionId=null,n instanceof c?n:new c("NETWORK_ERROR","Failed to create Viva Intent",n)}}async waitForPaymentCompletion(e,r,t){let s=`viva.${this.config.channel.toLowerCase()}.requests.${e}`,i="payment:status-changed";return new Promise((u,a)=>{let o=!1,l=()=>{o=!0,typeof f=="function"&&f(),clearTimeout(I)},y=()=>{l(),a(new Error("Aborted"))};t.addEventListener("abort",y);let f=this.messaging.subscribe(s,i,p=>{o||(l(),t.removeEventListener("abort",y),u(this.handleSuccess(p)))}),I=setTimeout(async()=>{if(!(o||t.aborted))try{let p=await this.pollOrderStatus(e,r,this.config.storeId,t);u(this.handleSuccess(p))}catch(p){a(new c("TIMEOUT","Payment timed out and polling failed",p))}finally{t.removeEventListener("abort",y),l()}},1e4)})}async pollOrderStatus(e,r,t,n){let a=Date.now()+12e4;for(;Date.now()<a;){if(n.aborted)throw new Error("Aborted");try{let{data:o}=await this.api.getPaymentStatus({businessId:Number(t),orderId:r,provider:this.paymentProvider,referenceId:e});if(o.status!==g.Pending)return o}catch(o){throw new Error(`Payment verification failed: ${o instanceof Error?o.message:String(o)}`)}await new Promise(o=>setTimeout(o,2e3))}throw new Error("Payment verification timed out.")}handleSuccess(e){let r=e.status===g.Success,t={success:r,status:r?"SUCCESS":"FAILED",orderId:e.orderId,errorCode:e.error?.code??"",errorMessage:e.error?.message??""};return e.transactionId&&(t.transactionId=e.transactionId),e.error?.referenceError&&(t.errorReference=e.error.referenceError),e.transaction&&(t.transaction=e.transaction),t}async cancelTransaction(e){if(!this.currentSessionId)return!1;try{let r=this.currentSessionId;return this.currentSessionId=null,await this.api.cancelVivaTransactionV2({cashRegisterId:this.config.storeId,sessionId:r}),this.abortController?.abort(),!0}catch(r){throw this.currentSessionId=null,new c("NETWORK_ERROR","Failed to cancel Viva transaction",r)}}async verifyFinalStatus(e,r){try{let{data:t}=await this.api.getPaymentStatus({businessId:Number(this.config.storeId),orderId:e.orderRef,provider:this.paymentProvider,referenceId:r}),n=t.status===g.Success,s={success:n,status:n?"SUCCESS":"FAILED",orderId:t.orderId,errorCode:t.error?.code??"",errorMessage:t.error?.message??""};return t.transactionId&&(s.transactionId=t.transactionId),t.error?.referenceError&&(s.errorReference=t.error.referenceError),t.transaction&&(s.transaction=t.transaction),s}catch(t){throw new c("NETWORK_ERROR","Failed to verify final transaction status",t)}}async refundTransaction(e,r){try{let t={amount:e.amountCents,businessId:Number(this.config.storeId),displayId:this.config.kioskId,currency:e.currency,orderReferenceId:e.orderRef,referenceId:e.originalTransactionId},{data:n}=await this.api.refundSingleVivaTransaction(t),s=n.success;return{success:s,status:s?"SUCCESS":"FAILED",orderId:e.orderRef,transactionId:n.sessionId}}catch(t){throw new c("NETWORK_ERROR","Failed to refund Viva transaction",t)}}};var T=class m{strategy;axios;messaging;timeoutMs;logger;_currentState="IDLE";_listeners=[];_cancellationIntent=!1;_currentSessionId;_autoResetTimer;autoResetOptions;static TERMINAL_STATES=["SUCCESS","FAILED","INTERNAL_ERROR"];static RESTING_STATES=["IDLE",...m.TERMINAL_STATES];constructor(e,r,t,n={},s){this.axios=e,this.messaging=r,this.logger=n.logger,this.timeoutMs=n.timeoutMs||6e4,this.autoResetOptions=n.autoResetOnPaymentComplete,this.strategy=s??this.resolveStrategy(t)}get version(){return P}get currentState(){return this._currentState}generateErrorResult(e,r,t){return{success:!1,status:"ERROR",errorCode:this.normalizeErrorCode(r),errorMessage:t,orderId:e}}normalizeErrorCode(e){return e?e.includes(".")?e:{CANCELLED:d.PaymentCancelledByUser,DECLINED:d.PaymentDeclined,TERMINAL_BUSY:d.TerminalBusy,TERMINAL_OFFLINE:d.TerminalOffline,TIMEOUT:d.TerminalTimeout,NETWORK_ERROR:d.SystemProviderError,STRATEGY_ERROR:d.SystemProviderError,MISSING_CONFIG:d.SystemUnknown,INVALID_AMOUNT:d.SystemUnknown,UNKNOWN:d.SystemUnknown}[e]??d.SystemUnknown:d.SystemUnknown}subscribe=e=>(this._listeners.push(e),e(this._currentState),()=>{this._listeners=this._listeners.filter(r=>r!==e)});transitionTo(e){if(this._currentState===e)return;if(e==="IDLE"){this.cancelAutoReset(),this._currentState=e,this._listeners.forEach(t=>t(e));return}if(m.TERMINAL_STATES.includes(this._currentState)){let t=`Invalid State Transition: Attempted to move from terminal state ${this._currentState} to ${e}`;throw this.logger?.error(t),this._currentState!=="INTERNAL_ERROR"&&(this._currentState="INTERNAL_ERROR",this._listeners.forEach(n=>n(this._currentState))),new c("UNKNOWN",t)}this._currentState=e,m.TERMINAL_STATES.includes(e)&&this.scheduleAutoReset(e),this._listeners.forEach(t=>t(e))}_resetScheduledAt;get nextAutoResetAt(){return this._resetScheduledAt}cancelAutoReset(){this._autoResetTimer&&(clearTimeout(this._autoResetTimer),this._autoResetTimer=void 0),this._resetScheduledAt=void 0}scheduleAutoReset(e){if(!this.autoResetOptions)return;let t=e==="SUCCESS"?this.autoResetOptions.successDelayMs??5e3:this.autoResetOptions.failureDelayMs??5e3;this.logger?.info(`Scheduling auto-reset to IDLE in ${t}ms`),this._resetScheduledAt=Date.now()+t,this._autoResetTimer=setTimeout(()=>{this.logger?.info("Auto-reset triggered"),this.reset()},t)}resolveStrategy(e){return e.provider===L.Nets?new E(this.axios,this.messaging,e):new S(this.axios,this.messaging,e)}initiateTransaction=async(e,r)=>{let t=r??{},n=e.orderRef;if(!m.RESTING_STATES.includes(this._currentState))return this.generateErrorResult(e.orderRef,"UNKNOWN","A transaction is already in progress");let i=Date.now();if(this._cancellationIntent=!1,this._currentSessionId=void 0,this.transitionTo("IDLE"),e.amountCents<=0)return this.generateErrorResult(e.orderRef,"INVALID_AMOUNT","Amount must be greater than 0");try{let u=(y,f)=>{f?.sessionId&&(this._currentSessionId=f.sessionId),y!=="FAILED"&&(this.transitionTo(y),this.fireStateCallback(y,t,n))},a=this.strategy.processPayment(e,u),o=new Promise((y,f)=>{setTimeout(()=>{f(new c("TIMEOUT","Transaction timed out"))},this.timeoutMs)}),l=await Promise.race([a,o]);if(l.success)this.transitionTo("SUCCESS"),this.safeFireCallback(()=>t.onSuccess?.(l));else{if(this._cancellationIntent)return await this.handleTransactionError(e,new Error("Aborted after resolution"),t);this.transitionTo("FAILED"),this.safeFireCallback(()=>t.onError?.(l))}return this.logger?.info("Transaction completed successfully",{orderId:e.orderRef,durationMs:Date.now()-i}),l}catch(u){return this.logger?.warn("Transaction interrupted. Handling final status...",{error:u}),await this.handleTransactionError(e,u,t)}};async handleTransactionError(e,r,t={}){if(this._cancellationIntent||(this.transitionTo("VERIFYING"),this.safeFireCallback(()=>t.onVerifying?.({orderRef:e.orderRef,refPaymentId:this._currentSessionId}))),this._cancellationIntent){try{if(this._currentSessionId){let s=await this.strategy.verifyFinalStatus(e,this._currentSessionId);if(s.success)return this.transitionTo("SUCCESS"),this.safeFireCallback(()=>t.onSuccess?.(s)),s}}catch(s){this.logger?.warn("Final status verification failed during cancellation",{err:s})}return this.transitionTo("FAILED"),this.safeFireCallback(()=>t.onCancelled?.({orderRef:e.orderRef,refPaymentId:this._currentSessionId})),{success:!1,status:"CANCELLED",errorCode:this.normalizeErrorCode("CANCELLED"),orderId:e.orderRef,...this._currentSessionId?{transactionId:this._currentSessionId}:{}}}this.transitionTo("FAILED");let n;if(this._currentSessionId)try{n=await this.strategy.verifyFinalStatus(e,this._currentSessionId)}catch(s){this.logger?.warn("Failed to get detailed error from verifyFinalStatus",{verifyErr:s}),n=this.buildErrorResultFromException(e.orderRef,r)}else n=this.buildErrorResultFromException(e.orderRef,r);return this.safeFireCallback(()=>t.onError?.(n)),n}buildErrorResultFromException(e,r){return r instanceof c?this.generateErrorResult(e,r.code,r.message):this.generateErrorResult(e,"UNKNOWN",r instanceof Error?r.message:"Unknown fatal error")}fireStateCallback(e,r,t){let n={orderRef:t,refPaymentId:this._currentSessionId};switch(e){case"CONNECTING":this.safeFireCallback(()=>r.onConnecting?.(n));break;case"REQUIRES_INPUT":this.safeFireCallback(()=>r.onRequiresInput?.(n));break;case"PROCESSING":this.safeFireCallback(()=>r.onProcessing?.(n));break}}safeFireCallback(e){try{e()}catch(r){this.logger?.warn("Callback execution failed",{error:r})}}cancel=async()=>{if(this.logger?.info("Attempting cancellation"),m.TERMINAL_STATES.includes(this._currentState))return this.logger?.warn("Cannot cancel: Transaction already in terminal state",{state:this._currentState}),!1;this._cancellationIntent=!0,this.transitionTo("VERIFYING");try{let e=await this.strategy.cancelTransaction(r=>this.transitionTo(r));return!e&&this._currentState==="VERIFYING"&&this.transitionTo("IDLE"),e}catch(e){return this.logger?.error("Cancellation command failed",e),!1}};reset=()=>{m.TERMINAL_STATES.includes(this._currentState)&&this.transitionTo("IDLE")};refund=async(e,r)=>{let t=r??{};if(this.logger?.info("Initiating refund",{orderRef:e.orderRef}),this._currentSessionId=void 0,!m.RESTING_STATES.includes(this._currentState))return this.generateErrorResult(e.orderRef,"UNKNOWN","A transaction is already in progress");this.transitionTo("IDLE");try{let s=(u,a)=>{a?.sessionId&&(this._currentSessionId=a.sessionId),u!=="FAILED"&&(this.transitionTo(u),this.fireStateCallback(u,t,e.orderRef))},i=await this.strategy.refundTransaction(e,s);return i.success?(this.transitionTo("SUCCESS"),this.safeFireCallback(()=>t.onSuccess?.(i))):(this.transitionTo("FAILED"),this.safeFireCallback(()=>t.onError?.(i))),this.logger?.info("Refund completed",{success:i.success,orderRef:e.orderRef}),i}catch(s){this.logger?.error("Refund failed",s),this.transitionTo("FAILED");let i=this.generateErrorResult(e.orderRef,"UNKNOWN",s instanceof Error?s.message:"Refund failed");return this.safeFireCallback(()=>t.onError?.(i)),i}}};var F=(n=>(n.CONNECTING="CONNECTING",n.CONNECTED="CONNECTED",n.OFFLINE="OFFLINE",n.DISCONNECTED="DISCONNECTED",n))(F||{});export{F as AppReaderStatus,T as MunchiPaymentSDK,R as PaymentInteractionState,h as SdkPaymentStatus};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { AxiosInstance } from "axios";
|
|
2
|
+
import type { IPaymentStrategy } from "./strategies/IPaymentStrategy";
|
|
3
|
+
import { type IMessagingAdapter, type IMunchiPaymentSDK, PaymentInteractionState, type PaymentResult, type PaymentTerminalConfig, type RefundRequest, type PaymentRequest as SdkPaymentRequest, type TransactionOptions } from "./types/payment";
|
|
4
|
+
import type { SDKOptions } from "./types/sdk";
|
|
5
|
+
type StateListener = (state: PaymentInteractionState) => void;
|
|
6
|
+
export declare class MunchiPaymentSDK implements IMunchiPaymentSDK {
|
|
7
|
+
private strategy;
|
|
8
|
+
private axios;
|
|
9
|
+
private messaging;
|
|
10
|
+
private timeoutMs;
|
|
11
|
+
private logger;
|
|
12
|
+
private _currentState;
|
|
13
|
+
private _listeners;
|
|
14
|
+
private _cancellationIntent;
|
|
15
|
+
private _currentSessionId;
|
|
16
|
+
private _autoResetTimer;
|
|
17
|
+
private autoResetOptions;
|
|
18
|
+
private static readonly TERMINAL_STATES;
|
|
19
|
+
private static readonly RESTING_STATES;
|
|
20
|
+
constructor(axios: AxiosInstance, messaging: IMessagingAdapter, config: PaymentTerminalConfig, options?: SDKOptions, strategy?: IPaymentStrategy);
|
|
21
|
+
get version(): string;
|
|
22
|
+
get currentState(): PaymentInteractionState;
|
|
23
|
+
private generateErrorResult;
|
|
24
|
+
private normalizeErrorCode;
|
|
25
|
+
subscribe: (listener: StateListener) => (() => void);
|
|
26
|
+
private transitionTo;
|
|
27
|
+
private _resetScheduledAt;
|
|
28
|
+
get nextAutoResetAt(): number | undefined;
|
|
29
|
+
private cancelAutoReset;
|
|
30
|
+
private scheduleAutoReset;
|
|
31
|
+
private resolveStrategy;
|
|
32
|
+
initiateTransaction: (params: SdkPaymentRequest, options?: TransactionOptions) => Promise<PaymentResult>;
|
|
33
|
+
private handleTransactionError;
|
|
34
|
+
private buildErrorResultFromException;
|
|
35
|
+
private fireStateCallback;
|
|
36
|
+
private safeFireCallback;
|
|
37
|
+
cancel: () => Promise<boolean>;
|
|
38
|
+
reset: () => void;
|
|
39
|
+
refund: (params: RefundRequest, options?: TransactionOptions) => Promise<PaymentResult>;
|
|
40
|
+
}
|
|
41
|
+
export {};
|
|
42
|
+
//# sourceMappingURL=MunchiPaymentSDK.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MunchiPaymentSDK.d.ts","sourceRoot":"","sources":["../../src/MunchiPaymentSDK.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAG3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGtE,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,uBAAuB,EACvB,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,KAAK,cAAc,IAAI,iBAAiB,EAExC,KAAK,kBAAkB,EACxB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAW,UAAU,EAAE,MAAM,aAAa,CAAC;AAEvD,KAAK,aAAa,GAAG,CAAC,KAAK,EAAE,uBAAuB,KAAK,IAAI,CAAC;AAE9D,qBAAa,gBAAiB,YAAW,iBAAiB;IACxD,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,aAAa,CAAyD;IAC9E,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,OAAO,CAAC,eAAe,CAA4C;IACnE,OAAO,CAAC,gBAAgB,CAA2C;IAEnE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAIrC;IAEF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAGpC;gBAGA,KAAK,EAAE,aAAa,EACpB,SAAS,EAAE,iBAAiB,EAC5B,MAAM,EAAE,qBAAqB,EAC7B,OAAO,GAAE,UAAe,EACxB,QAAQ,CAAC,EAAE,gBAAgB;IAU7B,IAAW,OAAO,WAEjB;IAED,IAAW,YAAY,4BAEtB;IAED,OAAO,CAAC,mBAAmB;IAc3B,OAAO,CAAC,kBAAkB;IAoBnB,SAAS,GAAI,UAAU,aAAa,KAAG,CAAC,MAAM,IAAI,CAAC,CAOxD;IAEF,OAAO,CAAC,YAAY;IAmCpB,OAAO,CAAC,iBAAiB,CAAqB;IAE9C,IAAW,eAAe,IAAI,MAAM,GAAG,SAAS,CAE/C;IAED,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,iBAAiB;IAqBzB,OAAO,CAAC,eAAe;IAUhB,mBAAmB,GACxB,QAAQ,iBAAiB,EACzB,UAAU,kBAAkB,KAC3B,OAAO,CAAC,aAAa,CAAC,CA0FvB;YAEY,sBAAsB;IAuFpC,OAAO,CAAC,6BAA6B;IAarC,OAAO,CAAC,iBAAiB;IAsBzB,OAAO,CAAC,gBAAgB;IAQjB,MAAM,QAAa,OAAO,CAAC,OAAO,CAAC,CAoCxC;IAEK,KAAK,QAAO,IAAI,CAIrB;IAEK,MAAM,GACX,QAAQ,aAAa,EACrB,UAAU,kBAAkB,KAC3B,OAAO,CAAC,aAAa,CAAC,CAkEvB;CACH"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare enum PaymentErrorCode {
|
|
2
|
+
MISSING_CONFIG = "MISSING_CONFIG",
|
|
3
|
+
INVALID_AMOUNT = "INVALID_AMOUNT",
|
|
4
|
+
NETWORK_ERROR = "NETWORK_ERROR",
|
|
5
|
+
TERMINAL_OFFLINE = "TERMINAL_OFFLINE",
|
|
6
|
+
TERMINAL_BUSY = "TERMINAL_BUSY",
|
|
7
|
+
TIMEOUT = "TIMEOUT",
|
|
8
|
+
DECLINED = "DECLINED",
|
|
9
|
+
CANCELLED = "CANCELLED",
|
|
10
|
+
STRATEGY_ERROR = "STRATEGY_ERROR",
|
|
11
|
+
UNKNOWN = "UNKNOWN"
|
|
12
|
+
}
|
|
13
|
+
export declare class PaymentSDKError extends Error {
|
|
14
|
+
readonly code: PaymentErrorCode;
|
|
15
|
+
readonly rawError?: unknown;
|
|
16
|
+
constructor(code: PaymentErrorCode, message: string, rawError?: unknown);
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../src/error.ts"],"names":[],"mappings":"AAAA,oBAAY,gBAAgB;IAC1B,cAAc,mBAAmB;IACjC,cAAc,mBAAmB;IACjC,aAAa,kBAAkB;IAC/B,gBAAgB,qBAAqB;IACrC,aAAa,kBAAkB;IAC/B,OAAO,YAAY;IACnB,QAAQ,aAAa;IACrB,SAAS,cAAc;IACvB,cAAc,mBAAmB;IACjC,OAAO,YAAY;CACpB;AAED,qBAAa,eAAgB,SAAQ,KAAK;IACxC,SAAgB,IAAI,EAAE,gBAAgB,CAAC;IACvC,SAAgB,QAAQ,CAAC,EAAE,OAAO,CAAC;gBAEvB,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO;CAQxE"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { PaymentInteractionState, PaymentRequest, PaymentResult, RefundRequest } from "../types/payment";
|
|
2
|
+
export interface IPaymentStrategy {
|
|
3
|
+
processPayment(request: PaymentRequest, onStateChange: (state: PaymentInteractionState, detail?: {
|
|
4
|
+
sessionId?: string;
|
|
5
|
+
}) => void): Promise<PaymentResult>;
|
|
6
|
+
cancelTransaction(onStateChange: (state: PaymentInteractionState) => void): Promise<boolean>;
|
|
7
|
+
refundTransaction(request: RefundRequest, onStateChange: (state: PaymentInteractionState, detail?: {
|
|
8
|
+
sessionId?: string;
|
|
9
|
+
}) => void): Promise<PaymentResult>;
|
|
10
|
+
verifyFinalStatus(request: PaymentRequest, sessionId: string): Promise<PaymentResult>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=IPaymentStrategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IPaymentStrategy.d.ts","sourceRoot":"","sources":["../../../src/strategies/IPaymentStrategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,uBAAuB,EACvB,cAAc,EACd,aAAa,EACb,aAAa,EACd,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,gBAAgB;IAE/B,cAAc,CACZ,OAAO,EAAE,cAAc,EACvB,aAAa,EAAE,CAAC,KAAK,EAAE,uBAAuB,EAAE,MAAM,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GACvF,OAAO,CAAC,aAAa,CAAC,CAAC;IAC1B,iBAAiB,CACf,aAAa,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,IAAI,GACtD,OAAO,CAAC,OAAO,CAAC,CAAC;IACpB,iBAAiB,CACf,OAAO,EAAE,aAAa,EACtB,aAAa,EAAE,CAAC,KAAK,EAAE,uBAAuB,EAAE,MAAM,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GACvF,OAAO,CAAC,aAAa,CAAC,CAAC;IAC1B,iBAAiB,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CACvF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type PaymentInteractionState, type PaymentRequest, type PaymentResult, type RefundRequest } from "../types/payment";
|
|
2
|
+
import type { IPaymentStrategy } from "./IPaymentStrategy";
|
|
3
|
+
export declare class MockStrategy implements IPaymentStrategy {
|
|
4
|
+
processPayment(request: PaymentRequest, _onStateChange: (state: PaymentInteractionState, detail?: {
|
|
5
|
+
sessionId?: string;
|
|
6
|
+
}) => void): Promise<PaymentResult>;
|
|
7
|
+
cancelTransaction(_onStateChange: (state: PaymentInteractionState) => void): Promise<boolean>;
|
|
8
|
+
verifyFinalStatus(request: PaymentRequest, sessionId: string): Promise<PaymentResult>;
|
|
9
|
+
refundTransaction(request: RefundRequest, _onStateChange: (state: PaymentInteractionState, detail?: {
|
|
10
|
+
sessionId?: string;
|
|
11
|
+
}) => void): Promise<PaymentResult>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=MockStrategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MockStrategy.d.ts","sourceRoot":"","sources":["../../../src/strategies/MockStrategy.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,aAAa,EAEnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,qBAAa,YAAa,YAAW,gBAAgB;IAG7C,cAAc,CAClB,OAAO,EAAE,cAAc,EACvB,cAAc,EAAE,CAAC,KAAK,EAAE,uBAAuB,EAAE,MAAM,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GACxF,OAAO,CAAC,aAAa,CAAC;IAYnB,iBAAiB,CACrB,cAAc,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,IAAI,GACvD,OAAO,CAAC,OAAO,CAAC;IAKb,iBAAiB,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAQrF,iBAAiB,CACrB,OAAO,EAAE,aAAa,EACtB,cAAc,EAAE,CAAC,KAAK,EAAE,uBAAuB,EAAE,MAAM,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GACxF,OAAO,CAAC,aAAa,CAAC;CAS1B"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { AxiosInstance } from "axios";
|
|
2
|
+
import { type IMessagingAdapter, PaymentInteractionState, type PaymentRequest, type PaymentResult, type PaymentTerminalConfig, type RefundRequest } from "../types/payment";
|
|
3
|
+
import type { IPaymentStrategy } from "./IPaymentStrategy";
|
|
4
|
+
export declare class NetsStrategy implements IPaymentStrategy {
|
|
5
|
+
private messaging;
|
|
6
|
+
private config;
|
|
7
|
+
private api;
|
|
8
|
+
private abortController;
|
|
9
|
+
private currentRequestId;
|
|
10
|
+
private paymentProvider;
|
|
11
|
+
constructor(axios: AxiosInstance, messaging: IMessagingAdapter, config: PaymentTerminalConfig);
|
|
12
|
+
processPayment(request: PaymentRequest, onStateChange: (state: PaymentInteractionState, detail?: {
|
|
13
|
+
sessionId?: string;
|
|
14
|
+
}) => void): Promise<PaymentResult>;
|
|
15
|
+
private waitForPaymentCompletion;
|
|
16
|
+
private pollOrderStatus;
|
|
17
|
+
cancelTransaction(_onStateChange: (state: PaymentInteractionState) => void): Promise<boolean>;
|
|
18
|
+
refundTransaction(request: RefundRequest, onStateChange: (state: PaymentInteractionState, detail?: {
|
|
19
|
+
sessionId?: string;
|
|
20
|
+
}) => void): Promise<PaymentResult>;
|
|
21
|
+
verifyFinalStatus(request: PaymentRequest, sessionId: string): Promise<PaymentResult>;
|
|
22
|
+
private handleSuccess;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=NetsStrategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NetsStrategy.d.ts","sourceRoot":"","sources":["../../../src/strategies/NetsStrategy.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAG3C,OAAO,EACL,KAAK,iBAAiB,EACtB,uBAAuB,EACvB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAEnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,qBAAa,YAAa,YAAW,gBAAgB;IAQjD,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,MAAM;IARhB,OAAO,CAAC,GAAG,CAAa;IACxB,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,eAAe,CAA4B;gBAGjD,KAAK,EAAE,aAAa,EACZ,SAAS,EAAE,iBAAiB,EAC5B,MAAM,EAAE,qBAAqB;IAKjC,cAAc,CAClB,OAAO,EAAE,cAAc,EACvB,aAAa,EAAE,CACb,KAAK,EAAE,uBAAuB,EAC9B,MAAM,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,KAC5B,IAAI,GACR,OAAO,CAAC,aAAa,CAAC;YAwDX,wBAAwB;YAsExB,eAAe;IAmCvB,iBAAiB,CACrB,cAAc,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,IAAI,GACvD,OAAO,CAAC,OAAO,CAAC;IAkBb,iBAAiB,CACrB,OAAO,EAAE,aAAa,EACtB,aAAa,EAAE,CACb,KAAK,EAAE,uBAAuB,EAC9B,MAAM,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,KAC5B,IAAI,GACR,OAAO,CAAC,aAAa,CAAC;IAyDnB,iBAAiB,CACrB,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,aAAa,CAAC;IAkBzB,OAAO,CAAC,aAAa;CAwBtB"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { AxiosInstance } from "axios";
|
|
2
|
+
import { type IMessagingAdapter, PaymentInteractionState, type PaymentRequest, type PaymentResult, type PaymentTerminalConfig, type RefundRequest } from "../types/payment";
|
|
3
|
+
import type { IPaymentStrategy } from "./IPaymentStrategy";
|
|
4
|
+
export declare class VivaStrategy implements IPaymentStrategy {
|
|
5
|
+
private messaging;
|
|
6
|
+
private config;
|
|
7
|
+
private api;
|
|
8
|
+
private abortController;
|
|
9
|
+
private currentSessionId;
|
|
10
|
+
private paymentProvider;
|
|
11
|
+
constructor(axios: AxiosInstance, messaging: IMessagingAdapter, config: PaymentTerminalConfig);
|
|
12
|
+
processPayment(request: PaymentRequest, onStateChange: (state: PaymentInteractionState, detail?: {
|
|
13
|
+
sessionId?: string;
|
|
14
|
+
}) => void): Promise<PaymentResult>;
|
|
15
|
+
private waitForPaymentCompletion;
|
|
16
|
+
private pollOrderStatus;
|
|
17
|
+
private handleSuccess;
|
|
18
|
+
cancelTransaction(_onStateChange: (state: PaymentInteractionState) => void): Promise<boolean>;
|
|
19
|
+
verifyFinalStatus(request: PaymentRequest, sessionId: string): Promise<PaymentResult>;
|
|
20
|
+
refundTransaction(request: RefundRequest, _onStateChange: (state: PaymentInteractionState, detail?: {
|
|
21
|
+
sessionId?: string;
|
|
22
|
+
}) => void): Promise<PaymentResult>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=VivaStrategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VivaStrategy.d.ts","sourceRoot":"","sources":["../../../src/strategies/VivaStrategy.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAG3C,OAAO,EACL,KAAK,iBAAiB,EACtB,uBAAuB,EACvB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAEnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,qBAAa,YAAa,YAAW,gBAAgB;IAOjD,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,MAAM;IAPhB,OAAO,CAAC,GAAG,CAAa;IACxB,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,eAAe,CAA4B;gBAEjD,KAAK,EAAE,aAAa,EACZ,SAAS,EAAE,iBAAiB,EAC5B,MAAM,EAAE,qBAAqB;IAOjC,cAAc,CAClB,OAAO,EAAE,cAAc,EACvB,aAAa,EAAE,CAAC,KAAK,EAAE,uBAAuB,EAAE,MAAM,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GACvF,OAAO,CAAC,aAAa,CAAC;YA2CX,wBAAwB;YAmExB,eAAe;IAkC7B,OAAO,CAAC,aAAa;IA4Bf,iBAAiB,CACrB,cAAc,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,IAAI,GACvD,OAAO,CAAC,OAAO,CAAC;IA0Bb,iBAAiB,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IA2CrF,iBAAiB,CACrB,OAAO,EAAE,aAAa,EACtB,cAAc,EAAE,CAAC,KAAK,EAAE,uBAAuB,EAAE,MAAM,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GACxF,OAAO,CAAC,aAAa,CAAC;CA+B1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-link.d.ts","sourceRoot":"","sources":["../../src/test-link.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare enum AppReaderStatus {
|
|
2
|
+
CONNECTING = "CONNECTING",
|
|
3
|
+
CONNECTED = "CONNECTED",
|
|
4
|
+
OFFLINE = "OFFLINE",
|
|
5
|
+
DISCONNECTED = "DISCONNECTED"
|
|
6
|
+
}
|
|
7
|
+
export interface AppReader {
|
|
8
|
+
id: string;
|
|
9
|
+
serialNumber: string | null;
|
|
10
|
+
label: string;
|
|
11
|
+
status: AppReaderStatus;
|
|
12
|
+
batteryLevel?: number | null;
|
|
13
|
+
providerRawData?: unknown;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=device.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device.d.ts","sourceRoot":"","sources":["../../../src/types/device.ts"],"names":[],"mappings":"AAAA,oBAAY,eAAe;IACzB,UAAU,eAAe;IACzB,SAAS,cAAc;IACvB,OAAO,YAAY;IACnB,YAAY,iBAAiB;CAC9B;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,eAAe,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,OAAO,CAAC"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import type { CurrencyCode, PaymentProvider, ProviderEnum, TransactionDto } from "@munchi_oy/core";
|
|
2
|
+
export type TransactionDetails = Omit<TransactionDto, "id" | "createdAt" | "provider">;
|
|
3
|
+
export declare enum SdkPaymentStatus {
|
|
4
|
+
PENDING = "PENDING",
|
|
5
|
+
SUCCESS = "SUCCESS",
|
|
6
|
+
APPROVED = "APPROVED",
|
|
7
|
+
FAILED = "FAILED",
|
|
8
|
+
CANCELLED = "CANCELLED",
|
|
9
|
+
ERROR = "ERROR"
|
|
10
|
+
}
|
|
11
|
+
export declare enum PaymentInteractionState {
|
|
12
|
+
IDLE = "IDLE",
|
|
13
|
+
CONNECTING = "CONNECTING",
|
|
14
|
+
REQUIRES_INPUT = "REQUIRES_INPUT",
|
|
15
|
+
PROCESSING = "PROCESSING",
|
|
16
|
+
SUCCESS = "SUCCESS",
|
|
17
|
+
FAILED = "FAILED",
|
|
18
|
+
INTERNAL_ERROR = "INTERNAL_ERROR",
|
|
19
|
+
VERIFYING = "VERIFYING"
|
|
20
|
+
}
|
|
21
|
+
export interface VivaOptions {
|
|
22
|
+
installments?: number;
|
|
23
|
+
tipAmount?: number;
|
|
24
|
+
sourceCode?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface NetsOptions {
|
|
27
|
+
vatAmount?: number;
|
|
28
|
+
operatorId?: string;
|
|
29
|
+
}
|
|
30
|
+
export interface VivaRefundOptions extends VivaOptions {
|
|
31
|
+
}
|
|
32
|
+
export interface NetsRefundOptions extends NetsOptions {
|
|
33
|
+
allowPinBypass?: boolean;
|
|
34
|
+
}
|
|
35
|
+
export interface PaymentRequest {
|
|
36
|
+
orderRef: string;
|
|
37
|
+
amountCents: number;
|
|
38
|
+
currency: CurrencyCode;
|
|
39
|
+
displayId: string;
|
|
40
|
+
options?: VivaOptions | NetsOptions;
|
|
41
|
+
}
|
|
42
|
+
export interface RefundRequest {
|
|
43
|
+
amountCents: number;
|
|
44
|
+
orderRef: string;
|
|
45
|
+
currency: CurrencyCode;
|
|
46
|
+
displayId: string;
|
|
47
|
+
/**
|
|
48
|
+
* The ID of the original payment transaction.
|
|
49
|
+
* Maps to:
|
|
50
|
+
* - Viva: parentSessionId
|
|
51
|
+
* - Nets: preAuthorizationInfo (or reference)
|
|
52
|
+
*/
|
|
53
|
+
originalTransactionId: string;
|
|
54
|
+
options?: VivaRefundOptions | NetsRefundOptions;
|
|
55
|
+
}
|
|
56
|
+
export interface PaymentTerminalConfig {
|
|
57
|
+
channel: ProviderEnum;
|
|
58
|
+
provider?: PaymentProvider | null;
|
|
59
|
+
kioskId: string;
|
|
60
|
+
storeId: string;
|
|
61
|
+
}
|
|
62
|
+
export interface PaymentResult {
|
|
63
|
+
success: boolean;
|
|
64
|
+
status: SdkPaymentStatus;
|
|
65
|
+
orderId: string;
|
|
66
|
+
transactionId?: string;
|
|
67
|
+
errorReference?: string;
|
|
68
|
+
errorCode?: string;
|
|
69
|
+
errorMessage?: string;
|
|
70
|
+
transaction?: TransactionDto;
|
|
71
|
+
}
|
|
72
|
+
export interface TransactionOptions {
|
|
73
|
+
onConnecting?: (ctx: {
|
|
74
|
+
orderRef: string;
|
|
75
|
+
refPaymentId?: string | undefined;
|
|
76
|
+
}) => void;
|
|
77
|
+
onRequiresInput?: (ctx: {
|
|
78
|
+
orderRef: string;
|
|
79
|
+
refPaymentId?: string | undefined;
|
|
80
|
+
}) => void;
|
|
81
|
+
onProcessing?: (ctx: {
|
|
82
|
+
orderRef: string;
|
|
83
|
+
refPaymentId?: string | undefined;
|
|
84
|
+
}) => void;
|
|
85
|
+
onVerifying?: (ctx: {
|
|
86
|
+
orderRef: string;
|
|
87
|
+
refPaymentId?: string | undefined;
|
|
88
|
+
}) => void;
|
|
89
|
+
onSuccess?: (result: PaymentResult) => void;
|
|
90
|
+
onError?: (result: PaymentResult) => void;
|
|
91
|
+
onCancelled?: (ctx: {
|
|
92
|
+
orderRef: string;
|
|
93
|
+
refPaymentId?: string | undefined;
|
|
94
|
+
}) => void;
|
|
95
|
+
}
|
|
96
|
+
export interface IMessagingAdapter {
|
|
97
|
+
subscribe<T>(channel: string, event: string, onMessage: (data: T) => void): () => void;
|
|
98
|
+
}
|
|
99
|
+
export interface IMunchiPaymentSDK {
|
|
100
|
+
readonly version: string;
|
|
101
|
+
readonly currentState: PaymentInteractionState;
|
|
102
|
+
readonly nextAutoResetAt: number | undefined;
|
|
103
|
+
subscribe(listener: (state: PaymentInteractionState) => void): () => void;
|
|
104
|
+
initiateTransaction(params: PaymentRequest, options?: TransactionOptions): Promise<PaymentResult>;
|
|
105
|
+
cancel(): Promise<boolean>;
|
|
106
|
+
refund(params: RefundRequest, options?: TransactionOptions): Promise<PaymentResult>;
|
|
107
|
+
reset(): void;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=payment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payment.d.ts","sourceRoot":"","sources":["../../../src/types/payment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { PaymentResult } from "./payment";
|
|
2
|
+
export interface ILogger {
|
|
3
|
+
debug(message: string, meta?: Record<string, unknown>): void;
|
|
4
|
+
info(message: string, meta?: Record<string, unknown>): void;
|
|
5
|
+
error(message: string, error?: unknown, meta?: Record<string, unknown>): void;
|
|
6
|
+
warn(message: string, meta?: Record<string, unknown>): void;
|
|
7
|
+
}
|
|
8
|
+
export interface PaymentCallbacks {
|
|
9
|
+
onConnecting?: (ctx: {
|
|
10
|
+
orderRef: string;
|
|
11
|
+
}) => void;
|
|
12
|
+
onRequiresInput?: (ctx: {
|
|
13
|
+
orderRef: string;
|
|
14
|
+
}) => void;
|
|
15
|
+
onProcessing?: (ctx: {
|
|
16
|
+
orderRef: string;
|
|
17
|
+
}) => void;
|
|
18
|
+
onVerifying?: (ctx: {
|
|
19
|
+
orderRef: string;
|
|
20
|
+
}) => void;
|
|
21
|
+
onSuccess?: (result: PaymentResult) => void;
|
|
22
|
+
onError?: (result: PaymentResult) => void;
|
|
23
|
+
onCancelled?: (ctx: {
|
|
24
|
+
orderRef: string;
|
|
25
|
+
}) => void;
|
|
26
|
+
}
|
|
27
|
+
export interface AutoResetOptions {
|
|
28
|
+
/**
|
|
29
|
+
* Delay in milliseconds before resetting to IDLE after a successful transaction.
|
|
30
|
+
* Defaults to 5000ms if not specified.
|
|
31
|
+
*/
|
|
32
|
+
successDelayMs?: number;
|
|
33
|
+
/**
|
|
34
|
+
* Delay in milliseconds before resetting to IDLE after a failed transaction.
|
|
35
|
+
* Defaults to 5000ms if not specified.
|
|
36
|
+
*/
|
|
37
|
+
failureDelayMs?: number;
|
|
38
|
+
}
|
|
39
|
+
export interface SDKOptions {
|
|
40
|
+
timeoutMs?: number;
|
|
41
|
+
logger?: ILogger;
|
|
42
|
+
/**
|
|
43
|
+
* Configuration for automatically resetting the SDK state to IDLE.
|
|
44
|
+
* If provided (even as an empty object), auto-reset is enabled.
|
|
45
|
+
*/
|
|
46
|
+
autoResetOnPaymentComplete?: AutoResetOptions;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=sdk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../../src/types/sdk.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE/C,MAAM,WAAW,OAAO;IACtB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC7D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC9E,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC7D;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACnD,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACtD,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACnD,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAClD,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;IAC5C,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;IAC1C,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CACnD;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,0BAA0B,CAAC,EAAE,gBAAgB,CAAC;CAC/C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,OAAO,UAAU,CAAC"}
|
package/index.ts
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@munchi_oy/payments",
|
|
3
|
+
"version": "1.2.5",
|
|
4
|
+
"description": "Munchi Payments SDK - Payment processing utilities",
|
|
5
|
+
"license": "UNLICENSED",
|
|
6
|
+
"publishConfig": {
|
|
7
|
+
"access": "restricted"
|
|
8
|
+
},
|
|
9
|
+
"main": "./dist/index.js",
|
|
10
|
+
"module": "./dist/index.mjs",
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"react-native": "index.ts",
|
|
13
|
+
"files": [
|
|
14
|
+
"dist",
|
|
15
|
+
"src",
|
|
16
|
+
"index.ts",
|
|
17
|
+
"README.md"
|
|
18
|
+
],
|
|
19
|
+
"exports": {
|
|
20
|
+
".": {
|
|
21
|
+
"types": "./dist/index.d.ts",
|
|
22
|
+
"import": "./dist/index.mjs",
|
|
23
|
+
"require": "./dist/index.js",
|
|
24
|
+
"react-native": "./index.ts"
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"scripts": {
|
|
28
|
+
"test": "jest",
|
|
29
|
+
"test:watch": "jest --watch",
|
|
30
|
+
"test:coverage": "jest --coverage",
|
|
31
|
+
"version:sync": "node scripts/sync-version.mjs",
|
|
32
|
+
"prebuild": "pnpm version:sync",
|
|
33
|
+
"build:runtime": "tsup",
|
|
34
|
+
"build:types": "tsc -p tsconfig.build.json",
|
|
35
|
+
"build": "pnpm run build:runtime && pnpm run build:types",
|
|
36
|
+
"yalc:publish": "pnpm build && yalc publish --push",
|
|
37
|
+
"dev": "tsup --watch",
|
|
38
|
+
"prepare": "npm run build",
|
|
39
|
+
"prepublishOnly": "pnpm build"
|
|
40
|
+
},
|
|
41
|
+
"peerDependencies": {
|
|
42
|
+
"@munchi_oy/core": ">=1.0.0",
|
|
43
|
+
"axios": ">=1.0.0"
|
|
44
|
+
},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"@munchi_oy/core": "workspace:*",
|
|
47
|
+
"@types/jest": "^30.0.0",
|
|
48
|
+
"tsup": "^8.0.0",
|
|
49
|
+
"typescript": "^5.0.0"
|
|
50
|
+
}
|
|
51
|
+
}
|