@wdft/micropayments-sdk 0.0.2 → 0.0.4

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 CHANGED
@@ -1,3 +1,3 @@
1
1
  ## WDFT - We Do Fintech - Micropayments SDK
2
2
 
3
- Read more about our service GetViaMsg at https://wdft.ovh
3
+ Read more about our service GetViaMsg at https://wdft.ovh
@@ -0,0 +1 @@
1
+ export declare function generateQRCode(text: string): Promise<string>;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAChD,OAAO,MAAM,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,oBAAoB,EAAE,GAAG,EAAE,CAAC,CAAC;AACpE,CAAC"}
@@ -0,0 +1,108 @@
1
+ import { type IServiceOptions, Service } from "./service.js";
2
+ interface ICommitmentPayload {
3
+ commitment_id: string;
4
+ amount: number;
5
+ currency: string;
6
+ reference_id: string;
7
+ expires_at: number;
8
+ click_url: string;
9
+ retry_ms: number;
10
+ message: string;
11
+ status: CommitmentStatus;
12
+ }
13
+ export type CommitmentStatus = "initializing" | "created" | "waiting" | "expired" | "resolved" | "rejected" | "duplicated";
14
+ export type ICommitmentPayloadSimple = Omit<ICommitmentPayload, "status" | "message">;
15
+ declare class Commitment {
16
+ private readonly service;
17
+ private readonly options;
18
+ private readonly payload;
19
+ constructor(service: Service, payload: ICommitmentPayloadSimple, options: ICommitmentOptions);
20
+ isExpired(): boolean;
21
+ isRejected(): boolean;
22
+ isResolved(): boolean;
23
+ getStatus(): CommitmentStatus;
24
+ getClickUrl(): string;
25
+ getAmount(): number;
26
+ getCurrency(): string;
27
+ getReferenceId(): string;
28
+ getCommitmentId(): string;
29
+ markAsCreated(): void;
30
+ markAsDuplicated(): void;
31
+ markAsWaiting(): void;
32
+ markAsExpired(): void;
33
+ markAsRejected(): void;
34
+ markAsResolved(): void;
35
+ private retries;
36
+ private currentTimer;
37
+ getNextCallTime(): number;
38
+ startChecking(): void;
39
+ stopChecking(withTimer?: boolean): void;
40
+ private currentCheck;
41
+ check(): Promise<CommitmentStatus>;
42
+ }
43
+ interface IClientOptions {
44
+ currency: string;
45
+ retry_ms?: number;
46
+ }
47
+ interface INewClientOptions extends IClientOptions, IServiceOptions {
48
+ }
49
+ interface ICommitmentOptions {
50
+ currency?: string;
51
+ retry_ms?: number;
52
+ onCreated?: (commitment: Commitment) => void;
53
+ onResolved?: (commitment: Commitment) => void;
54
+ onError?: (error: Error, commitment: Commitment) => void;
55
+ onExpired?: (commitment: Commitment) => void;
56
+ onRejected?: (commitment: Commitment) => void;
57
+ onDuplicated?: (commitment: Commitment) => void;
58
+ onCheck?: (commitment: Commitment) => void;
59
+ onWaiting?: (commitment: Commitment) => void;
60
+ }
61
+ export declare class Client {
62
+ private readonly svc;
63
+ private readonly options;
64
+ static new(opts: INewClientOptions): Client;
65
+ constructor(svc: Service, options: IClientOptions);
66
+ createDirect(reference_id: string, amount: number, options?: ICommitmentOptions): Promise<Commitment>;
67
+ create(reference_id: string, amount: number, on: ICallback): void;
68
+ commitmentBuilder(): CommitmentObservabileBuilder;
69
+ }
70
+ export interface CallbackPayload {
71
+ status: CommitmentStatus;
72
+ reference_id: string;
73
+ commitment_id: string;
74
+ click_url: string;
75
+ }
76
+ type OnStatusCallback = (error: null, payload: CallbackPayload) => void;
77
+ type OnStatusErrorCallback = (error: Error, payload: null) => void;
78
+ export type ICallback = OnStatusCallback & OnStatusErrorCallback;
79
+ declare class CommitmentObservabileBuilder {
80
+ private readonly client;
81
+ private _reference_id;
82
+ private _amount;
83
+ private _retry_ms;
84
+ private _currency;
85
+ private _onCreatedFn;
86
+ private _onResolvedFn;
87
+ private _onErrorFn;
88
+ private _onExpiredFn;
89
+ private _onRejectedFn;
90
+ private _onDuplicatedFn;
91
+ private _onCheckFn;
92
+ private _onWaitingFn;
93
+ constructor(client: Client);
94
+ setRetryTime(retry: number): this;
95
+ setAmount(amount: number): this;
96
+ setReference(reference: string): this;
97
+ setCurrency(currency: string): this;
98
+ onCreated(cb: (commitment: Commitment) => void): this;
99
+ onResolved(cb: (commitment: Commitment) => void): this;
100
+ onExpired(cb: (commitment: Commitment) => void): this;
101
+ onRejected(cb: (commitment: Commitment) => void): this;
102
+ onError(cb: (error: Error, commitment?: Commitment) => void): this;
103
+ onDuplicated(cb: (commitment: Commitment) => void): this;
104
+ onCheck(cb: (commitment: Commitment) => void): this;
105
+ onWaiting(cb: (commitment: Commitment) => void): this;
106
+ exec(): void;
107
+ }
108
+ export type { Commitment };
package/dist/client.js CHANGED
@@ -1 +1 @@
1
- async function c(s){return s.headers.get("Content-Type")?.includes("application/json")?await s.json():await s.text()}async function u(s,t,r){try{let i=await r(new Request(s,t));if(i.ok)return{status:i.status,error:!1,data:await c(i)};let n=await c(i);return{status:i.status,error:n&&typeof n=="object"&&"error"in n?n.error:!0,message:n&&typeof n=="object"&&"message"in n?n.message:i.statusText,data:null}}catch(i){return{status:500,error:!0,message:i instanceof Error?i.message:`${i}`,data:null}}}function l(s,t){let r=s.endsWith("/")?s.substring(0,s.length-1):s,i=t.startsWith("/")?t:"/".concat(t);return r+i}var o=class{constructor(t){this.options=t;if(!t.fetcher&&!globalThis.fetch)throw new Error('fetch is not available in environment, pass "fetcher" option with satisfies fetch interface');this.fetcher=this.options.fetcher??globalThis.fetch}async createCommitment(t,r,i){let n=await u(l(this.options.endpoint,"/commitment"),{method:"POST",body:JSON.stringify({tenant_id:this.options.tenant_id,reference_id:t,currency:i,amount:r})},this.fetcher);if(n.error)throw new Error(n.message);if(!n.data)throw new Error("Bad response");return n.data}async checkCommitment(t){let r=await u(l(this.options.endpoint,`/commitment/${t}`),{method:"GET"},this.fetcher);switch(r.status){case 410:return{commitment_id:t,message:r.message||"Expired",status:"expired"}}if(r.error)throw new Error(r.message);if(!r.data)throw new Error("Bad response");return r.data}};var a=class{constructor(t,r,i){this.service=t;this.options=i;this.retries=0;this.currentTimer=null;this.currentCheck=null;this.payload={message:"Creating...",status:"initializing",...r},this.options.onCreated&&this.options.onCreated(this)}isExpired(){return Date.now()>this.payload.expires_at}isResolved(){return this.getStatus()==="resolved"}getStatus(){return this.payload.status}getClickUrl(){return this.payload.click_url}getAmount(){return this.payload.amount}getCurrency(){return this.payload.currency}getReferenceId(){return this.payload.reference_id}getCommitmentId(){return this.payload.commitment_id}markAsCreated(){this.payload.status!=="created"&&(this.payload.status="created",this.options.onCreated&&this.options.onCreated(this))}markAsDuplicated(){if(this.payload.status==="duplicated"){this.stopChecking();return}this.payload.status="duplicated",this.stopChecking(),this.options.onDuplicated&&this.options.onDuplicated(this)}markAsWaiting(){this.payload.status!=="waiting"&&(this.payload.status="waiting",this.options.onWaiting&&this.options.onWaiting(this))}markAsExpired(){if(this.payload.status==="expired"){this.stopChecking();return}this.payload.status="expired",this.options.onExpired&&this.options.onExpired(this),this.stopChecking()}markAsResolved(){if(this.payload.status==="resolved"){this.stopChecking();return}this.payload.status="resolved",this.stopChecking(),this.options.onResolved&&this.options.onResolved(this)}getNextCallTime(){return this.retries++,Math.min(5e3,this.payload.retry_ms+this.payload.retry_ms*(this.retries/10))}startChecking(){this.currentCheck||(this.currentCheck=this.check().then(t=>{let r=this.getNextCallTime();return t==="waiting"&&(this.currentTimer=setTimeout(()=>this.startChecking(),r)),t}).finally(()=>{this.stopChecking(!1)}))}stopChecking(t=!0){this.currentCheck=null,this.currentTimer&&t&&clearTimeout(this.currentTimer)}async check(){if(this.isExpired())return this.markAsExpired(),this.getStatus();if(this.isResolved())return this.markAsResolved(),this.getStatus();try{switch((await this.service.checkCommitment(this.getCommitmentId())).status){case"duplicated":{this.markAsDuplicated();break}case"expired":{this.markAsExpired();break}case"resolved":{this.markAsResolved();break}case"waiting":{this.markAsWaiting();break}}this.options.onCheck&&this.options.onCheck(this)}catch(t){if(this.options.onError)this.options.onError(t,this),this.stopChecking();else throw t}return this.getStatus()}},d=class s{constructor(t,r){this.svc=t;this.options=r}static new(t){return new s(new o(t),t)}async createDirect(t,r,i={}){let n=i.currency??this.options.currency,e=await this.svc.createCommitment(t,r,n);return new a(this.svc,{commitment_id:e.commitment_id,amount:r,currency:n,reference_id:t,expires_at:e.expires_at,click_url:e.click_url,retry_ms:this.options.retry_ms??1e3},i)}create(t,r,i){let n=this.commitmentBuilder().setAmount(r).setCurrency(this.options.currency).setReference(t);this.options.retry_ms&&n.setRetryTime(this.options.retry_ms),n.onCreated(e=>(e.startChecking(),i(null,{status:e.getStatus(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()}))).onWaiting(e=>i(null,{status:e.getStatus(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()})).onDuplicated(e=>i(null,{status:e.getStatus(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()})).onExpired(e=>i(null,{status:e.getStatus(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()})).onResolved(e=>i(null,{status:e.getStatus(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()})).onError((e,h)=>{h?.stopChecking(),i(e,null)}).exec()}commitmentBuilder(){return new m(this)}},m=class{constructor(t){this.client=t;this._retry_ms=1e3;this._onCreatedFn=()=>{};this._onResolvedFn=()=>{};this._onErrorFn=()=>{};this._onExpiredFn=()=>{};this._onDuplicatedFn=()=>{};this._onCheckFn=()=>{};this._onWaitingFn=()=>{}}setRetryTime(t){return this._retry_ms=t,this}setAmount(t){return this._amount=t,this}setReference(t){return this._reference_id=t,this}setCurrency(t){return this._currency=t,this}onCreated(t){return this._onCreatedFn=t,this}onResolved(t){return this._onResolvedFn=t,this}onExpired(t){return this._onExpiredFn=t,this}onError(t){return this._onErrorFn=t,this}onDuplicated(t){return this._onDuplicatedFn=t,this}onCheck(t){return this._onCheckFn=t,this}onWaiting(t){return this._onWaitingFn=t,this}exec(){if(!this._reference_id)throw new Error("reference_id must be defined");if(!this._amount)throw new Error("amount must be defined");if(!this._currency)throw new Error("currency must be defined");this.client.createDirect(this._reference_id,this._amount,{retry_ms:this._retry_ms,currency:this._currency,onCheck:this._onCheckFn,onCreated:this._onCreatedFn,onDuplicated:this._onDuplicatedFn,onError:this._onErrorFn,onExpired:this._onExpiredFn,onWaiting:this._onWaitingFn,onResolved:this._onResolvedFn}).catch(t=>{if(this._onErrorFn)this._onErrorFn(t);else throw t})}};export{d as Client};
1
+ async function c(n){return n.headers.get("Content-Type")?.includes("application/json")?await n.json():await n.text()}async function u(n,t,r){try{let i=await r(new Request(n,t));if(i.ok)return{status:i.status,error:!1,data:await c(i)};let s=await c(i);return{status:i.status,error:s&&typeof s=="object"&&"error"in s?s.error:!0,message:s&&typeof s=="object"&&"message"in s?s.message:i.statusText,data:null}}catch(i){return{status:500,error:!0,message:i instanceof Error?i.message:`${i}`,data:null}}}function d(n,t){let r=n.endsWith("/")?n.substring(0,n.length-1):n,i=t.startsWith("/")?t:"/".concat(t);return r+i}var o=class{constructor(t){this.options=t;if(!t.fetcher&&!globalThis.fetch)throw new Error('fetch is not available in environment, pass "fetcher" option with satisfies fetch interface');this.fetcher=this.options.fetcher??globalThis.fetch}async createCommitment(t,r,i){let s=await u(d(this.options.endpoint,"/commitment"),{method:"POST",body:JSON.stringify({tenant_id:this.options.tenant_id,reference_id:t,currency:i,amount:r})},this.fetcher);if(s.error)throw new Error(s.message);if(!s.data)throw new Error("Bad response");return s.data}async checkCommitment(t){let r=await u(d(this.options.endpoint,`/commitment/${t}`),{method:"GET"},this.fetcher);switch(r.status){case 402:return{commitment_id:t,message:r.message||"Payment required - you are over limit",status:"rejected"};case 410:return{commitment_id:t,message:r.message||"Expired",status:"expired"}}if(r.error)throw new Error(r.message);if(!r.data)throw new Error("Bad response");return r.data}};var a=class{constructor(t,r,i){this.service=t;this.options=i;this.retries=0;this.currentTimer=null;this.currentCheck=null;this.payload={message:"Creating...",status:"initializing",...r},this.options.onCreated&&this.options.onCreated(this)}isExpired(){return Date.now()>this.payload.expires_at}isRejected(){return this.getStatus()==="rejected"}isResolved(){return this.getStatus()==="resolved"}getStatus(){return this.payload.status}getClickUrl(){return this.payload.click_url}getAmount(){return this.payload.amount}getCurrency(){return this.payload.currency}getReferenceId(){return this.payload.reference_id}getCommitmentId(){return this.payload.commitment_id}markAsCreated(){this.payload.status!=="created"&&(this.payload.status="created",this.options.onCreated&&this.options.onCreated(this))}markAsDuplicated(){if(this.payload.status==="duplicated"){this.stopChecking();return}this.payload.status="duplicated",this.stopChecking(),this.options.onDuplicated&&this.options.onDuplicated(this)}markAsWaiting(){this.payload.status!=="waiting"&&(this.payload.status="waiting",this.options.onWaiting&&this.options.onWaiting(this))}markAsExpired(){if(this.payload.status==="expired"){this.stopChecking();return}this.payload.status="expired",this.options.onExpired&&this.options.onExpired(this),this.stopChecking()}markAsRejected(){if(this.payload.status==="rejected"){this.stopChecking();return}this.payload.status="rejected",this.options.onRejected&&this.options.onRejected(this),this.stopChecking()}markAsResolved(){if(this.payload.status==="resolved"){this.stopChecking();return}this.payload.status="resolved",this.stopChecking(),this.options.onResolved&&this.options.onResolved(this)}getNextCallTime(){return this.retries++,Math.min(5e3,this.payload.retry_ms+this.payload.retry_ms*(this.retries/10))}startChecking(){this.currentCheck||(this.currentCheck=this.check().then(t=>{let r=this.getNextCallTime();return t==="waiting"&&(this.currentTimer=setTimeout(()=>this.startChecking(),r)),t}).finally(()=>{this.stopChecking(!1)}))}stopChecking(t=!0){this.currentCheck=null,this.currentTimer&&t&&clearTimeout(this.currentTimer)}async check(){if(this.isExpired())return this.markAsExpired(),this.getStatus();if(this.isRejected())return this.markAsRejected(),this.getStatus();if(this.isResolved())return this.markAsResolved(),this.getStatus();try{switch((await this.service.checkCommitment(this.getCommitmentId())).status){case"duplicated":{this.markAsDuplicated();break}case"expired":{this.markAsExpired();break}case"resolved":{this.markAsResolved();break}case"waiting":{this.markAsWaiting();break}case"rejected":{this.markAsRejected();break}}this.options.onCheck&&this.options.onCheck(this)}catch(t){if(this.options.onError)this.options.onError(t,this),this.stopChecking();else throw t}return this.getStatus()}},h=class n{constructor(t,r){this.svc=t;this.options=r}static new(t){return new n(new o(t),t)}async createDirect(t,r,i={}){let s=i.currency??this.options.currency,e=await this.svc.createCommitment(t,r,s);return new a(this.svc,{commitment_id:e.commitment_id,amount:r,currency:s,reference_id:t,expires_at:e.expires_at,click_url:e.click_url,retry_ms:this.options.retry_ms??1e3},i)}create(t,r,i){let s=this.commitmentBuilder().setAmount(r).setCurrency(this.options.currency).setReference(t);this.options.retry_ms&&s.setRetryTime(this.options.retry_ms),s.onCreated(e=>(e.startChecking(),i(null,{status:e.getStatus(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()}))).onWaiting(e=>i(null,{status:e.getStatus(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()})).onDuplicated(e=>i(null,{status:e.getStatus(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()})).onExpired(e=>i(null,{status:e.getStatus(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()})).onRejected(e=>i(null,{status:e.getStatus(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()})).onResolved(e=>i(null,{status:e.getStatus(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()})).onError((e,l)=>{l?.stopChecking(),i(e,null)}).exec()}commitmentBuilder(){return new m(this)}},m=class{constructor(t){this.client=t;this._retry_ms=1e3;this._onCreatedFn=()=>{};this._onResolvedFn=()=>{};this._onErrorFn=()=>{};this._onExpiredFn=()=>{};this._onRejectedFn=()=>{};this._onDuplicatedFn=()=>{};this._onCheckFn=()=>{};this._onWaitingFn=()=>{}}setRetryTime(t){return this._retry_ms=t,this}setAmount(t){return this._amount=t,this}setReference(t){return this._reference_id=t,this}setCurrency(t){return this._currency=t,this}onCreated(t){return this._onCreatedFn=t,this}onResolved(t){return this._onResolvedFn=t,this}onExpired(t){return this._onExpiredFn=t,this}onRejected(t){return this._onRejectedFn=t,this}onError(t){return this._onErrorFn=t,this}onDuplicated(t){return this._onDuplicatedFn=t,this}onCheck(t){return this._onCheckFn=t,this}onWaiting(t){return this._onWaitingFn=t,this}exec(){if(!this._reference_id)throw new Error("reference_id must be defined");if(!this._amount)throw new Error("amount must be defined");if(!this._currency)throw new Error("currency must be defined");this.client.createDirect(this._reference_id,this._amount,{retry_ms:this._retry_ms,currency:this._currency,onCheck:this._onCheckFn,onCreated:this._onCreatedFn,onDuplicated:this._onDuplicatedFn,onError:this._onErrorFn,onExpired:this._onExpiredFn,onWaiting:this._onWaitingFn,onRejected:this._onRejectedFn,onResolved:this._onResolvedFn}).catch(t=>{if(this._onErrorFn)this._onErrorFn(t);else throw t})}};export{h as Client};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,205 @@
1
+ import { describe, it } from "vitest";
2
+ import { expect } from "vitest";
3
+ import { Client } from "./client.js";
4
+ import { mockFetch } from "./test_utils/mock_fetcher.js";
5
+ describe("client e2e", () => {
6
+ const mock = mockFetch();
7
+ const client = Client.new({
8
+ currency: "PLN",
9
+ tenant_id: "my-tenant",
10
+ endpoint: "http://localhost:8787",
11
+ fetcher: mock.fetcher.bind(mock),
12
+ retry_ms: 100,
13
+ });
14
+ it("initialized -> waiting x2 -> resolved", async () => {
15
+ await new Promise((resolve, reject) => {
16
+ mock.next(200, {
17
+ click_url: "mock_click_url",
18
+ incoming_message_device: "mock_num",
19
+ expires_at: Date.now() + 30000,
20
+ commitment_id: "sample_commitment_id",
21
+ });
22
+ mock.next(200, {
23
+ message: "waiting for sms",
24
+ status: "waiting",
25
+ commitment_id: "sample_commitment_id",
26
+ });
27
+ mock.next(200, {
28
+ message: "waiting for sms",
29
+ status: "waiting",
30
+ commitment_id: "sample_commitment_id",
31
+ });
32
+ mock.next(200, {
33
+ message: "waiting for sms",
34
+ status: "resolved",
35
+ commitment_id: "sample_commitment_id",
36
+ });
37
+ // Sync with Events
38
+ client.create("my-ref", 10, (error, payload) => {
39
+ if (!payload || error) {
40
+ console.log(error);
41
+ reject(error);
42
+ return;
43
+ }
44
+ const { status } = payload;
45
+ switch (status) {
46
+ case "waiting":
47
+ case "created":
48
+ case "duplicated":
49
+ case "rejected":
50
+ case "expired":
51
+ console.log(payload);
52
+ break;
53
+ case "resolved":
54
+ resolve(status);
55
+ }
56
+ });
57
+ });
58
+ });
59
+ it("initialized -> expired", async () => {
60
+ await expect(new Promise((resolve, reject) => {
61
+ mock.next(200, {
62
+ click_url: "mock_click_url",
63
+ incoming_message_device: "mock_num",
64
+ expires_at: Date.now() + 30000,
65
+ commitment_id: "sample_commitment_id",
66
+ });
67
+ mock.next(200, {
68
+ message: "waiting for sms",
69
+ status: "waiting",
70
+ commitment_id: "sample_commitment_id",
71
+ });
72
+ mock.next(200, {
73
+ message: "waiting for sms",
74
+ status: "waiting",
75
+ commitment_id: "sample_commitment_id",
76
+ });
77
+ mock.next(410, {
78
+ message: "commitment expired",
79
+ status: "expired",
80
+ commitment_id: "sample_commitment_id",
81
+ });
82
+ // Sync with Events
83
+ client.create("my-ref", 10, (error, payload) => {
84
+ if (!payload || error) {
85
+ reject(error);
86
+ return;
87
+ }
88
+ const { status } = payload;
89
+ switch (status) {
90
+ case "waiting":
91
+ case "created":
92
+ case "duplicated":
93
+ break;
94
+ case "expired":
95
+ reject(status);
96
+ break;
97
+ case "resolved":
98
+ resolve(status);
99
+ break;
100
+ }
101
+ });
102
+ })).rejects.toBe("expired");
103
+ });
104
+ it("initialized -> duplicated", async () => {
105
+ await expect(new Promise((resolve, reject) => {
106
+ mock.next(200, {
107
+ click_url: "mock_click_url",
108
+ incoming_message_device: "mock_num",
109
+ expires_at: Date.now() + 30000,
110
+ commitment_id: "sample_commitment_id",
111
+ });
112
+ mock.next(200, {
113
+ message: "waiting for sms",
114
+ status: "duplicated",
115
+ commitment_id: "sample_commitment_id",
116
+ });
117
+ // Sync with Events
118
+ client.create("my-ref", 10, (error, payload) => {
119
+ if (!payload || error) {
120
+ reject(error);
121
+ return;
122
+ }
123
+ const { status } = payload;
124
+ switch (status) {
125
+ case "waiting":
126
+ case "created":
127
+ case "duplicated":
128
+ resolve(status);
129
+ break;
130
+ case "expired":
131
+ reject(status);
132
+ break;
133
+ case "resolved":
134
+ resolve(status);
135
+ break;
136
+ }
137
+ });
138
+ })).resolves.toBe("duplicated");
139
+ });
140
+ it("initialized -> rejected", async () => {
141
+ const promise = new Promise((resolve, reject) => {
142
+ mock.next(200, {
143
+ click_url: "mock_click_url",
144
+ incoming_message_device: "mock_num",
145
+ expires_at: Date.now() + 30000,
146
+ commitment_id: "sample_commitment_id",
147
+ });
148
+ mock.next(200, {
149
+ message: "payment required",
150
+ status: "rejected",
151
+ commitment_id: "sample_commitment_id",
152
+ });
153
+ // Sync with Events
154
+ client.create("my-ref-23", 10, (error, payload) => {
155
+ if (!payload || error) {
156
+ reject(error);
157
+ return;
158
+ }
159
+ const { status } = payload;
160
+ switch (status) {
161
+ case "resolved":
162
+ resolve(status);
163
+ break;
164
+ case "rejected":
165
+ reject(status);
166
+ break;
167
+ }
168
+ });
169
+ });
170
+ await expect(promise).rejects.toBe("rejected");
171
+ });
172
+ it("initialized -> rejected (402)", async () => {
173
+ const promise = new Promise((resolve, reject) => {
174
+ mock.next(200, {
175
+ click_url: "mock_click_url",
176
+ incoming_message_device: "mock_num",
177
+ expires_at: Date.now() + 30000,
178
+ commitment_id: "sample_commitment_id",
179
+ });
180
+ mock.next(402, {
181
+ message: "payment required",
182
+ status: "rejected",
183
+ commitment_id: "sample_commitment_id",
184
+ });
185
+ // Sync with Events
186
+ client.create("my-ref-23", 10, (error, payload) => {
187
+ if (!payload || error) {
188
+ reject(error);
189
+ return;
190
+ }
191
+ const { status } = payload;
192
+ switch (status) {
193
+ case "resolved":
194
+ resolve(status);
195
+ break;
196
+ case "rejected":
197
+ reject(status);
198
+ break;
199
+ }
200
+ });
201
+ });
202
+ await expect(promise).rejects.toBe("rejected");
203
+ });
204
+ });
205
+ //# sourceMappingURL=client.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.test.js","sourceRoot":"","sources":["../src/client.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { ICallback } from "./client.js";
2
+ import type { Fetcher } from "./service.js";
3
+ export interface IGetViaMsgInit {
4
+ reference_id: string;
5
+ amount: number;
6
+ currency: "PLN" | "EUR" | "GBP" | "USD" | "CHF" | string;
7
+ tenant_id: string;
8
+ endpoint?: string;
9
+ fetcher?: Fetcher;
10
+ retry_ms?: number;
11
+ }
12
+ export declare function getViaMsg(init: IGetViaMsgInit, callback: ICallback): void;
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- async function u(i){return i.headers.get("Content-Type")?.includes("application/json")?await i.json():await i.text()}async function d(i,t,n){try{let r=await n(new Request(i,t));if(r.ok)return{status:r.status,error:!1,data:await u(r)};let s=await u(r);return{status:r.status,error:s&&typeof s=="object"&&"error"in s?s.error:!0,message:s&&typeof s=="object"&&"message"in s?s.message:r.statusText,data:null}}catch(r){return{status:500,error:!0,message:r instanceof Error?r.message:`${r}`,data:null}}}function l(i,t){let n=i.endsWith("/")?i.substring(0,i.length-1):i,r=t.startsWith("/")?t:"/".concat(t);return n+r}var o=class{constructor(t){this.options=t;if(!t.fetcher&&!globalThis.fetch)throw new Error('fetch is not available in environment, pass "fetcher" option with satisfies fetch interface');this.fetcher=this.options.fetcher??globalThis.fetch}async createCommitment(t,n,r){let s=await d(l(this.options.endpoint,"/commitment"),{method:"POST",body:JSON.stringify({tenant_id:this.options.tenant_id,reference_id:t,currency:r,amount:n})},this.fetcher);if(s.error)throw new Error(s.message);if(!s.data)throw new Error("Bad response");return s.data}async checkCommitment(t){let n=await d(l(this.options.endpoint,`/commitment/${t}`),{method:"GET"},this.fetcher);switch(n.status){case 410:return{commitment_id:t,message:n.message||"Expired",status:"expired"}}if(n.error)throw new Error(n.message);if(!n.data)throw new Error("Bad response");return n.data}};var m=class{constructor(t,n,r){this.service=t;this.options=r;this.retries=0;this.currentTimer=null;this.currentCheck=null;this.payload={message:"Creating...",status:"initializing",...n},this.options.onCreated&&this.options.onCreated(this)}isExpired(){return Date.now()>this.payload.expires_at}isResolved(){return this.getStatus()==="resolved"}getStatus(){return this.payload.status}getClickUrl(){return this.payload.click_url}getAmount(){return this.payload.amount}getCurrency(){return this.payload.currency}getReferenceId(){return this.payload.reference_id}getCommitmentId(){return this.payload.commitment_id}markAsCreated(){this.payload.status!=="created"&&(this.payload.status="created",this.options.onCreated&&this.options.onCreated(this))}markAsDuplicated(){if(this.payload.status==="duplicated"){this.stopChecking();return}this.payload.status="duplicated",this.stopChecking(),this.options.onDuplicated&&this.options.onDuplicated(this)}markAsWaiting(){this.payload.status!=="waiting"&&(this.payload.status="waiting",this.options.onWaiting&&this.options.onWaiting(this))}markAsExpired(){if(this.payload.status==="expired"){this.stopChecking();return}this.payload.status="expired",this.options.onExpired&&this.options.onExpired(this),this.stopChecking()}markAsResolved(){if(this.payload.status==="resolved"){this.stopChecking();return}this.payload.status="resolved",this.stopChecking(),this.options.onResolved&&this.options.onResolved(this)}getNextCallTime(){return this.retries++,Math.min(5e3,this.payload.retry_ms+this.payload.retry_ms*(this.retries/10))}startChecking(){this.currentCheck||(this.currentCheck=this.check().then(t=>{let n=this.getNextCallTime();return t==="waiting"&&(this.currentTimer=setTimeout(()=>this.startChecking(),n)),t}).finally(()=>{this.stopChecking(!1)}))}stopChecking(t=!0){this.currentCheck=null,this.currentTimer&&t&&clearTimeout(this.currentTimer)}async check(){if(this.isExpired())return this.markAsExpired(),this.getStatus();if(this.isResolved())return this.markAsResolved(),this.getStatus();try{switch((await this.service.checkCommitment(this.getCommitmentId())).status){case"duplicated":{this.markAsDuplicated();break}case"expired":{this.markAsExpired();break}case"resolved":{this.markAsResolved();break}case"waiting":{this.markAsWaiting();break}}this.options.onCheck&&this.options.onCheck(this)}catch(t){if(this.options.onError)this.options.onError(t,this),this.stopChecking();else throw t}return this.getStatus()}},a=class i{constructor(t,n){this.svc=t;this.options=n}static new(t){return new i(new o(t),t)}async createDirect(t,n,r={}){let s=r.currency??this.options.currency,e=await this.svc.createCommitment(t,n,s);return new m(this.svc,{commitment_id:e.commitment_id,amount:n,currency:s,reference_id:t,expires_at:e.expires_at,click_url:e.click_url,retry_ms:this.options.retry_ms??1e3},r)}create(t,n,r){let s=this.commitmentBuilder().setAmount(n).setCurrency(this.options.currency).setReference(t);this.options.retry_ms&&s.setRetryTime(this.options.retry_ms),s.onCreated(e=>(e.startChecking(),r(null,{status:e.getStatus(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()}))).onWaiting(e=>r(null,{status:e.getStatus(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()})).onDuplicated(e=>r(null,{status:e.getStatus(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()})).onExpired(e=>r(null,{status:e.getStatus(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()})).onResolved(e=>r(null,{status:e.getStatus(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()})).onError((e,h)=>{h?.stopChecking(),r(e,null)}).exec()}commitmentBuilder(){return new c(this)}},c=class{constructor(t){this.client=t;this._retry_ms=1e3;this._onCreatedFn=()=>{};this._onResolvedFn=()=>{};this._onErrorFn=()=>{};this._onExpiredFn=()=>{};this._onDuplicatedFn=()=>{};this._onCheckFn=()=>{};this._onWaitingFn=()=>{}}setRetryTime(t){return this._retry_ms=t,this}setAmount(t){return this._amount=t,this}setReference(t){return this._reference_id=t,this}setCurrency(t){return this._currency=t,this}onCreated(t){return this._onCreatedFn=t,this}onResolved(t){return this._onResolvedFn=t,this}onExpired(t){return this._onExpiredFn=t,this}onError(t){return this._onErrorFn=t,this}onDuplicated(t){return this._onDuplicatedFn=t,this}onCheck(t){return this._onCheckFn=t,this}onWaiting(t){return this._onWaitingFn=t,this}exec(){if(!this._reference_id)throw new Error("reference_id must be defined");if(!this._amount)throw new Error("amount must be defined");if(!this._currency)throw new Error("currency must be defined");this.client.createDirect(this._reference_id,this._amount,{retry_ms:this._retry_ms,currency:this._currency,onCheck:this._onCheckFn,onCreated:this._onCreatedFn,onDuplicated:this._onDuplicatedFn,onError:this._onErrorFn,onExpired:this._onExpiredFn,onWaiting:this._onWaitingFn,onResolved:this._onResolvedFn}).catch(t=>{if(this._onErrorFn)this._onErrorFn(t);else throw t})}};function _(i,t){a.new({currency:i.currency,endpoint:i.endpoint??"https://api.micropayments.wdft.ovh/",tenant_id:i.tenant_id,fetcher:i.fetcher??fetch,retry_ms:i.retry_ms??1e3}).create(i.reference_id,i.amount,t)}export{_ as getViaMsg};
1
+ async function u(n){return n.headers.get("Content-Type")?.includes("application/json")?await n.json():await n.text()}async function d(n,t,r){try{let i=await r(new Request(n,t));if(i.ok)return{status:i.status,error:!1,data:await u(i)};let s=await u(i);return{status:i.status,error:s&&typeof s=="object"&&"error"in s?s.error:!0,message:s&&typeof s=="object"&&"message"in s?s.message:i.statusText,data:null}}catch(i){return{status:500,error:!0,message:i instanceof Error?i.message:`${i}`,data:null}}}function h(n,t){let r=n.endsWith("/")?n.substring(0,n.length-1):n,i=t.startsWith("/")?t:"/".concat(t);return r+i}var o=class{constructor(t){this.options=t;if(!t.fetcher&&!globalThis.fetch)throw new Error('fetch is not available in environment, pass "fetcher" option with satisfies fetch interface');this.fetcher=this.options.fetcher??globalThis.fetch}async createCommitment(t,r,i){let s=await d(h(this.options.endpoint,"/commitment"),{method:"POST",body:JSON.stringify({tenant_id:this.options.tenant_id,reference_id:t,currency:i,amount:r})},this.fetcher);if(s.error)throw new Error(s.message);if(!s.data)throw new Error("Bad response");return s.data}async checkCommitment(t){let r=await d(h(this.options.endpoint,`/commitment/${t}`),{method:"GET"},this.fetcher);switch(r.status){case 402:return{commitment_id:t,message:r.message||"Payment required - you are over limit",status:"rejected"};case 410:return{commitment_id:t,message:r.message||"Expired",status:"expired"}}if(r.error)throw new Error(r.message);if(!r.data)throw new Error("Bad response");return r.data}};var m=class{constructor(t,r,i){this.service=t;this.options=i;this.retries=0;this.currentTimer=null;this.currentCheck=null;this.payload={message:"Creating...",status:"initializing",...r},this.options.onCreated&&this.options.onCreated(this)}isExpired(){return Date.now()>this.payload.expires_at}isRejected(){return this.getStatus()==="rejected"}isResolved(){return this.getStatus()==="resolved"}getStatus(){return this.payload.status}getClickUrl(){return this.payload.click_url}getAmount(){return this.payload.amount}getCurrency(){return this.payload.currency}getReferenceId(){return this.payload.reference_id}getCommitmentId(){return this.payload.commitment_id}markAsCreated(){this.payload.status!=="created"&&(this.payload.status="created",this.options.onCreated&&this.options.onCreated(this))}markAsDuplicated(){if(this.payload.status==="duplicated"){this.stopChecking();return}this.payload.status="duplicated",this.stopChecking(),this.options.onDuplicated&&this.options.onDuplicated(this)}markAsWaiting(){this.payload.status!=="waiting"&&(this.payload.status="waiting",this.options.onWaiting&&this.options.onWaiting(this))}markAsExpired(){if(this.payload.status==="expired"){this.stopChecking();return}this.payload.status="expired",this.options.onExpired&&this.options.onExpired(this),this.stopChecking()}markAsRejected(){if(this.payload.status==="rejected"){this.stopChecking();return}this.payload.status="rejected",this.options.onRejected&&this.options.onRejected(this),this.stopChecking()}markAsResolved(){if(this.payload.status==="resolved"){this.stopChecking();return}this.payload.status="resolved",this.stopChecking(),this.options.onResolved&&this.options.onResolved(this)}getNextCallTime(){return this.retries++,Math.min(5e3,this.payload.retry_ms+this.payload.retry_ms*(this.retries/10))}startChecking(){this.currentCheck||(this.currentCheck=this.check().then(t=>{let r=this.getNextCallTime();return t==="waiting"&&(this.currentTimer=setTimeout(()=>this.startChecking(),r)),t}).finally(()=>{this.stopChecking(!1)}))}stopChecking(t=!0){this.currentCheck=null,this.currentTimer&&t&&clearTimeout(this.currentTimer)}async check(){if(this.isExpired())return this.markAsExpired(),this.getStatus();if(this.isRejected())return this.markAsRejected(),this.getStatus();if(this.isResolved())return this.markAsResolved(),this.getStatus();try{switch((await this.service.checkCommitment(this.getCommitmentId())).status){case"duplicated":{this.markAsDuplicated();break}case"expired":{this.markAsExpired();break}case"resolved":{this.markAsResolved();break}case"waiting":{this.markAsWaiting();break}case"rejected":{this.markAsRejected();break}}this.options.onCheck&&this.options.onCheck(this)}catch(t){if(this.options.onError)this.options.onError(t,this),this.stopChecking();else throw t}return this.getStatus()}},a=class n{constructor(t,r){this.svc=t;this.options=r}static new(t){return new n(new o(t),t)}async createDirect(t,r,i={}){let s=i.currency??this.options.currency,e=await this.svc.createCommitment(t,r,s);return new m(this.svc,{commitment_id:e.commitment_id,amount:r,currency:s,reference_id:t,expires_at:e.expires_at,click_url:e.click_url,retry_ms:this.options.retry_ms??1e3},i)}create(t,r,i){let s=this.commitmentBuilder().setAmount(r).setCurrency(this.options.currency).setReference(t);this.options.retry_ms&&s.setRetryTime(this.options.retry_ms),s.onCreated(e=>(e.startChecking(),i(null,{status:e.getStatus(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()}))).onWaiting(e=>i(null,{status:e.getStatus(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()})).onDuplicated(e=>i(null,{status:e.getStatus(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()})).onExpired(e=>i(null,{status:e.getStatus(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()})).onRejected(e=>i(null,{status:e.getStatus(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()})).onResolved(e=>i(null,{status:e.getStatus(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()})).onError((e,l)=>{l?.stopChecking(),i(e,null)}).exec()}commitmentBuilder(){return new c(this)}},c=class{constructor(t){this.client=t;this._retry_ms=1e3;this._onCreatedFn=()=>{};this._onResolvedFn=()=>{};this._onErrorFn=()=>{};this._onExpiredFn=()=>{};this._onRejectedFn=()=>{};this._onDuplicatedFn=()=>{};this._onCheckFn=()=>{};this._onWaitingFn=()=>{}}setRetryTime(t){return this._retry_ms=t,this}setAmount(t){return this._amount=t,this}setReference(t){return this._reference_id=t,this}setCurrency(t){return this._currency=t,this}onCreated(t){return this._onCreatedFn=t,this}onResolved(t){return this._onResolvedFn=t,this}onExpired(t){return this._onExpiredFn=t,this}onRejected(t){return this._onRejectedFn=t,this}onError(t){return this._onErrorFn=t,this}onDuplicated(t){return this._onDuplicatedFn=t,this}onCheck(t){return this._onCheckFn=t,this}onWaiting(t){return this._onWaitingFn=t,this}exec(){if(!this._reference_id)throw new Error("reference_id must be defined");if(!this._amount)throw new Error("amount must be defined");if(!this._currency)throw new Error("currency must be defined");this.client.createDirect(this._reference_id,this._amount,{retry_ms:this._retry_ms,currency:this._currency,onCheck:this._onCheckFn,onCreated:this._onCreatedFn,onDuplicated:this._onDuplicatedFn,onError:this._onErrorFn,onExpired:this._onExpiredFn,onWaiting:this._onWaitingFn,onRejected:this._onRejectedFn,onResolved:this._onResolvedFn}).catch(t=>{if(this._onErrorFn)this._onErrorFn(t);else throw t})}};function _(n,t){a.new({currency:n.currency,endpoint:n.endpoint??"https://api.micropayments.wdft.ovh/",tenant_id:n.tenant_id,fetcher:n.fetcher??fetch,retry_ms:n.retry_ms??1e3}).create(n.reference_id,n.amount,t)}export{_ as getViaMsg};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAYrC,MAAM,UAAU,SAAS,CAAC,IAAoB,EAAE,QAAmB;IAClE,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC;QACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,qCAAqC;QAChE,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,KAAK;QAC9B,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI;KAC/B,CAAC,CAAC;IAEH,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AACzD,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,56 @@
1
+ import { it } from "vitest";
2
+ import { getViaMsg } from "./index.js";
3
+ import { mockFetch } from "./test_utils/mock_fetcher.js";
4
+ it("getViaMsg", async () => {
5
+ const mock = mockFetch();
6
+ await new Promise((resolve, reject) => {
7
+ mock.next(200, {
8
+ click_url: "mock_click_url",
9
+ incoming_message_device: "mock_num",
10
+ expires_at: Date.now() + 30000,
11
+ commitment_id: "sample_commitment_id",
12
+ });
13
+ mock.next(200, {
14
+ message: "waiting for sms",
15
+ status: "waiting",
16
+ commitment_id: "sample_commitment_id",
17
+ });
18
+ mock.next(200, {
19
+ message: "waiting for sms",
20
+ status: "waiting",
21
+ commitment_id: "sample_commitment_id",
22
+ });
23
+ mock.next(200, {
24
+ message: "waiting for sms",
25
+ status: "resolved",
26
+ commitment_id: "sample_commitment_id",
27
+ });
28
+ getViaMsg({
29
+ amount: 10,
30
+ reference_id: "ref",
31
+ currency: "PLN",
32
+ tenant_id: "my-tenant",
33
+ endpoint: "http://localhost:8787",
34
+ fetcher: mock.fetcher.bind(mock),
35
+ retry_ms: 100,
36
+ }, (error, payload) => {
37
+ if (!payload || error) {
38
+ console.log(error);
39
+ reject(error);
40
+ return;
41
+ }
42
+ const { status } = payload;
43
+ switch (status) {
44
+ case "waiting":
45
+ case "created":
46
+ case "duplicated":
47
+ case "expired":
48
+ console.log(payload);
49
+ break;
50
+ case "resolved":
51
+ resolve(status);
52
+ }
53
+ });
54
+ });
55
+ });
56
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAEzD,EAAE,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;IAC1B,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;IAEzB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACd,SAAS,EAAE,gBAAgB;YAC3B,uBAAuB,EAAE,UAAU;YACnC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAM;YAC/B,aAAa,EAAE,sBAAsB;SACrC,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACd,OAAO,EAAE,iBAAiB;YAC1B,MAAM,EAAE,SAAS;YACjB,aAAa,EAAE,sBAAsB;SACrC,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACd,OAAO,EAAE,iBAAiB;YAC1B,MAAM,EAAE,SAAS;YACjB,aAAa,EAAE,sBAAsB;SACrC,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACd,OAAO,EAAE,iBAAiB;YAC1B,MAAM,EAAE,UAAU;YAClB,aAAa,EAAE,sBAAsB;SACrC,CAAC,CAAC;QAEH,SAAS,CACR;YACC,MAAM,EAAE,EAAE;YACV,YAAY,EAAE,KAAK;YACnB,QAAQ,EAAE,KAAK;YACf,SAAS,EAAE,WAAW;YACtB,QAAQ,EAAE,uBAAuB;YACjC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YAChC,QAAQ,EAAE,GAAG;SACb,EACD,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;YAClB,IAAI,CAAC,OAAO,IAAI,KAAK,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACnB,MAAM,CAAC,KAAK,CAAC,CAAC;gBACd,OAAO;YACR,CAAC;YAED,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;YAE3B,QAAQ,MAAM,EAAE,CAAC;gBAChB,KAAK,SAAS,CAAC;gBACf,KAAK,SAAS,CAAC;gBACf,KAAK,YAAY,CAAC;gBAClB,KAAK,SAAS;oBACb,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;oBACrB,MAAM;gBACP,KAAK,UAAU;oBACd,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC;QACF,CAAC,CACD,CAAC;IACH,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,15 @@
1
+ import { it } from "vitest";
2
+ import { expect } from "vitest";
3
+ import { mockFetch } from "./test_utils/mock_fetcher.js";
4
+ it("mocking works", async () => {
5
+ const mock = mockFetch();
6
+ mock.next(200, {
7
+ test: 123,
8
+ });
9
+ const response = await mock.fetcher();
10
+ expect(response.status).toBe(200);
11
+ expect(await response.json()).toMatchObject({
12
+ test: 123,
13
+ });
14
+ });
15
+ //# sourceMappingURL=mock_fetcher.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock_fetcher.test.js","sourceRoot":"","sources":["../src/mock_fetcher.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAEzD,EAAE,CAAC,eAAe,EAAE,KAAK,IAAI,EAAE;IAC9B,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;IAEzB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;QACd,IAAI,EAAE,GAAG;KACT,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;IAEtC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC;QAC3C,IAAI,EAAE,GAAG;KACT,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,25 @@
1
+ interface ICommitment {
2
+ click_url: string;
3
+ incoming_message_device: string;
4
+ expires_at: number;
5
+ commitment_id: string;
6
+ }
7
+ export type Fetcher = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;
8
+ export interface IServiceOptions {
9
+ tenant_id: string;
10
+ endpoint: string;
11
+ fetcher?: Fetcher;
12
+ }
13
+ export interface ICommitmentStatus {
14
+ commitment_id: string;
15
+ status: string;
16
+ message: string;
17
+ }
18
+ export declare class Service {
19
+ private readonly options;
20
+ private readonly fetcher;
21
+ constructor(options: IServiceOptions);
22
+ createCommitment(reference_id: string, amount: number, currency: string): Promise<ICommitment>;
23
+ checkCommitment(commitment: string): Promise<ICommitmentStatus>;
24
+ }
25
+ export {};
package/dist/service.js CHANGED
@@ -1 +1 @@
1
- async function o(n){return n.headers.get("Content-Type")?.includes("application/json")?await n.json():await n.text()}async function i(n,s,r){try{let e=await r(new Request(n,s));if(e.ok)return{status:e.status,error:!1,data:await o(e)};let t=await o(e);return{status:e.status,error:t&&typeof t=="object"&&"error"in t?t.error:!0,message:t&&typeof t=="object"&&"message"in t?t.message:e.statusText,data:null}}catch(e){return{status:500,error:!0,message:e instanceof Error?e.message:`${e}`,data:null}}}function a(n,s){let r=n.endsWith("/")?n.substring(0,n.length-1):n,e=s.startsWith("/")?s:"/".concat(s);return r+e}var c=class{constructor(s){this.options=s;if(!s.fetcher&&!globalThis.fetch)throw new Error('fetch is not available in environment, pass "fetcher" option with satisfies fetch interface');this.fetcher=this.options.fetcher??globalThis.fetch}async createCommitment(s,r,e){let t=await i(a(this.options.endpoint,"/commitment"),{method:"POST",body:JSON.stringify({tenant_id:this.options.tenant_id,reference_id:s,currency:e,amount:r})},this.fetcher);if(t.error)throw new Error(t.message);if(!t.data)throw new Error("Bad response");return t.data}async checkCommitment(s){let r=await i(a(this.options.endpoint,`/commitment/${s}`),{method:"GET"},this.fetcher);switch(r.status){case 410:return{commitment_id:s,message:r.message||"Expired",status:"expired"}}if(r.error)throw new Error(r.message);if(!r.data)throw new Error("Bad response");return r.data}};export{c as Service};
1
+ async function o(n){return n.headers.get("Content-Type")?.includes("application/json")?await n.json():await n.text()}async function i(n,t,s){try{let e=await s(new Request(n,t));if(e.ok)return{status:e.status,error:!1,data:await o(e)};let r=await o(e);return{status:e.status,error:r&&typeof r=="object"&&"error"in r?r.error:!0,message:r&&typeof r=="object"&&"message"in r?r.message:e.statusText,data:null}}catch(e){return{status:500,error:!0,message:e instanceof Error?e.message:`${e}`,data:null}}}function a(n,t){let s=n.endsWith("/")?n.substring(0,n.length-1):n,e=t.startsWith("/")?t:"/".concat(t);return s+e}var c=class{constructor(t){this.options=t;if(!t.fetcher&&!globalThis.fetch)throw new Error('fetch is not available in environment, pass "fetcher" option with satisfies fetch interface');this.fetcher=this.options.fetcher??globalThis.fetch}async createCommitment(t,s,e){let r=await i(a(this.options.endpoint,"/commitment"),{method:"POST",body:JSON.stringify({tenant_id:this.options.tenant_id,reference_id:t,currency:e,amount:s})},this.fetcher);if(r.error)throw new Error(r.message);if(!r.data)throw new Error("Bad response");return r.data}async checkCommitment(t){let s=await i(a(this.options.endpoint,`/commitment/${t}`),{method:"GET"},this.fetcher);switch(s.status){case 402:return{commitment_id:t,message:s.message||"Payment required - you are over limit",status:"rejected"};case 410:return{commitment_id:t,message:s.message||"Expired",status:"expired"}}if(s.error)throw new Error(s.message);if(!s.data)throw new Error("Bad response");return s.data}};export{c as Service};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,44 @@
1
+ import { it } from "vitest";
2
+ import { expect } from "vitest";
3
+ import { Service } from "./service.js";
4
+ import { mockFetch } from "./test_utils/mock_fetcher.js";
5
+ it("service.createCommitment - 200 - resolved good data", async () => {
6
+ const mock = mockFetch();
7
+ const my = new Service({
8
+ endpoint: "http://localhost:8787",
9
+ tenant_id: "testing-dev-tenant",
10
+ fetcher: () => mock.fetcher(),
11
+ });
12
+ mock.next(200, {
13
+ click_url: "mock_click_url",
14
+ incoming_message_device: "mock_num",
15
+ expires_at: Date.now() + 30000,
16
+ commitment_id: "sample_commitment_id",
17
+ });
18
+ const commitment = await my.createCommitment("sample-content-id", 10, "PLN");
19
+ expect(commitment).toMatchObject({
20
+ click_url: "mock_click_url",
21
+ incoming_message_device: "mock_num",
22
+ commitment_id: "sample_commitment_id",
23
+ });
24
+ });
25
+ it("service.checkCommitment - 200 - resolved good data", async () => {
26
+ const mock = mockFetch();
27
+ const my = new Service({
28
+ endpoint: "http://localhost:8787",
29
+ tenant_id: "testing-dev-tenant",
30
+ fetcher: () => mock.fetcher(),
31
+ });
32
+ mock.next(200, {
33
+ message: "waiting for sms",
34
+ status: "waiting",
35
+ commitment_id: "sample_commitment_id",
36
+ });
37
+ const status = await my.checkCommitment("sample_commitment_id");
38
+ expect(status).toMatchObject({
39
+ message: "waiting for sms",
40
+ status: "waiting",
41
+ commitment_id: "sample_commitment_id",
42
+ });
43
+ });
44
+ //# sourceMappingURL=service.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.test.js","sourceRoot":"","sources":["../src/service.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAEzD,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;IACpE,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;IAEzB,MAAM,EAAE,GAAG,IAAI,OAAO,CAAC;QACtB,QAAQ,EAAE,uBAAuB;QACjC,SAAS,EAAE,oBAAoB;QAC/B,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE;KAC7B,CAAC,CAAC;IAEH,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;QACd,SAAS,EAAE,gBAAgB;QAC3B,uBAAuB,EAAE,UAAU;QACnC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAM;QAC/B,aAAa,EAAE,sBAAsB;KACrC,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,gBAAgB,CAAC,mBAAmB,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;IAE7E,MAAM,CAAC,UAAU,CAAC,CAAC,aAAa,CAAC;QAChC,SAAS,EAAE,gBAAgB;QAC3B,uBAAuB,EAAE,UAAU;QACnC,aAAa,EAAE,sBAAsB;KACrC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;IACnE,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;IAEzB,MAAM,EAAE,GAAG,IAAI,OAAO,CAAC;QACtB,QAAQ,EAAE,uBAAuB;QACjC,SAAS,EAAE,oBAAoB;QAC/B,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE;KAC7B,CAAC,CAAC;IAEH,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;QACd,OAAO,EAAE,iBAAiB;QAC1B,MAAM,EAAE,SAAS;QACjB,aAAa,EAAE,sBAAsB;KACrC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,eAAe,CAAC,sBAAsB,CAAC,CAAC;IAEhE,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC;QAC5B,OAAO,EAAE,iBAAiB;QAC1B,MAAM,EAAE,SAAS;QACjB,aAAa,EAAE,sBAAsB;KACrC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const mockFetch: () => {
2
+ __responses: Response[];
3
+ next(status: number, body: null | string | object, headers?: object): void;
4
+ fetcher(): Promise<Response>;
5
+ };
@@ -0,0 +1,20 @@
1
+ export const mockFetch = () => ({
2
+ __responses: [],
3
+ next(status, body, headers = {}) {
4
+ this.__responses.push(new Response(typeof body === "object" ? JSON.stringify(body) : body, {
5
+ status,
6
+ headers: {
7
+ "Content-Type": typeof body === "object" ? "application/json" : "plain/text",
8
+ ...headers,
9
+ },
10
+ }));
11
+ },
12
+ async fetcher() {
13
+ const next = this.__responses.shift();
14
+ if (!next) {
15
+ throw new Error("not found mock item");
16
+ }
17
+ return next;
18
+ },
19
+ });
20
+ //# sourceMappingURL=mock_fetcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock_fetcher.js","sourceRoot":"","sources":["../../src/test_utils/mock_fetcher.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,CAAC;IAC/B,WAAW,EAAE,EAAgB;IAC7B,IAAI,CAAC,MAAc,EAAE,IAA4B,EAAE,UAAkB,EAAE;QACtE,IAAI,CAAC,WAAW,CAAC,IAAI,CACpB,IAAI,QAAQ,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;YACpE,MAAM;YACN,OAAO,EAAE;gBACR,cAAc,EACb,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,YAAY;gBAC7D,GAAG,OAAO;aACV;SACD,CAAC,CACF,CAAC;IACH,CAAC;IACD,KAAK,CAAC,OAAO;QACZ,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QAEtC,IAAI,CAAC,IAAI,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACxC,CAAC;QAED,OAAO,IAAI,CAAC;IACb,CAAC;CACD,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@wdft/micropayments-sdk",
3
3
  "description": "wdft - we do fintech - micropayments sdk",
4
- "version": "0.0.2",
4
+ "version": "0.0.4",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
@@ -26,7 +26,9 @@
26
26
  "vitest": "^3.2.4"
27
27
  },
28
28
  "scripts": {
29
- "build": "pnpm exec esbuild $(find src -path 'src/test_utils' -prune -o -name '*.ts' ! -name '*.test.ts' -print) --bundle --outdir=dist --minify --format=esm",
29
+ "build:types": "tsc -p tsconfig.json",
30
+ "build:js": "pnpm exec esbuild $(find src -path 'src/test_utils' -prune -o -name '*.ts' ! -name '*.test.ts' -print) --bundle --outdir=dist --minify --format=esm",
31
+ "build": "pnpm run build:types && pnpm run build:js",
30
32
  "fmt": "biome check --write ./src",
31
33
  "test": "vitest run",
32
34
  "release": "pnpm run build && changeset publish"
@@ -55,6 +55,7 @@ describe("client e2e", () => {
55
55
  case "waiting":
56
56
  case "created":
57
57
  case "duplicated":
58
+ case "rejected":
58
59
  case "expired":
59
60
  console.log(payload);
60
61
  break;
@@ -161,4 +162,78 @@ describe("client e2e", () => {
161
162
  }),
162
163
  ).resolves.toBe("duplicated");
163
164
  });
165
+
166
+ it("initialized -> rejected", async () => {
167
+ const promise = new Promise((resolve, reject) => {
168
+ mock.next(200, {
169
+ click_url: "mock_click_url",
170
+ incoming_message_device: "mock_num",
171
+ expires_at: Date.now() + 30_000,
172
+ commitment_id: "sample_commitment_id",
173
+ });
174
+
175
+ mock.next(200, {
176
+ message: "payment required",
177
+ status: "rejected",
178
+ commitment_id: "sample_commitment_id",
179
+ });
180
+
181
+ // Sync with Events
182
+ client.create("my-ref-23", 10, (error, payload) => {
183
+ if (!payload || error) {
184
+ reject(error);
185
+ return;
186
+ }
187
+
188
+ const { status } = payload;
189
+ switch (status) {
190
+ case "resolved":
191
+ resolve(status);
192
+ break;
193
+ case "rejected":
194
+ reject(status);
195
+ break;
196
+ }
197
+ });
198
+ });
199
+
200
+ await expect(promise).rejects.toBe("rejected");
201
+ });
202
+
203
+ it("initialized -> rejected (402)", async () => {
204
+ const promise = new Promise((resolve, reject) => {
205
+ mock.next(200, {
206
+ click_url: "mock_click_url",
207
+ incoming_message_device: "mock_num",
208
+ expires_at: Date.now() + 30_000,
209
+ commitment_id: "sample_commitment_id",
210
+ });
211
+
212
+ mock.next(402, {
213
+ message: "payment required",
214
+ status: "rejected",
215
+ commitment_id: "sample_commitment_id",
216
+ });
217
+
218
+ // Sync with Events
219
+ client.create("my-ref-23", 10, (error, payload) => {
220
+ if (!payload || error) {
221
+ reject(error);
222
+ return;
223
+ }
224
+
225
+ const { status } = payload;
226
+ switch (status) {
227
+ case "resolved":
228
+ resolve(status);
229
+ break;
230
+ case "rejected":
231
+ reject(status);
232
+ break;
233
+ }
234
+ });
235
+ });
236
+
237
+ await expect(promise).rejects.toBe("rejected");
238
+ });
164
239
  });
package/src/client.ts CHANGED
@@ -18,6 +18,7 @@ export type CommitmentStatus =
18
18
  | "waiting"
19
19
  | "expired"
20
20
  | "resolved"
21
+ | "rejected"
21
22
  | "duplicated";
22
23
 
23
24
  export type ICommitmentPayloadSimple = Omit<
@@ -48,6 +49,10 @@ class Commitment {
48
49
  return Date.now() > this.payload.expires_at;
49
50
  }
50
51
 
52
+ isRejected() {
53
+ return this.getStatus() === "rejected";
54
+ }
55
+
51
56
  isResolved() {
52
57
  return this.getStatus() === "resolved";
53
58
  }
@@ -129,6 +134,21 @@ class Commitment {
129
134
  this.stopChecking();
130
135
  }
131
136
 
137
+ markAsRejected() {
138
+ if (this.payload.status === "rejected") {
139
+ this.stopChecking();
140
+ return;
141
+ }
142
+
143
+ this.payload.status = "rejected";
144
+
145
+ if (this.options.onRejected) {
146
+ this.options.onRejected(this);
147
+ }
148
+
149
+ this.stopChecking();
150
+ }
151
+
132
152
  markAsResolved() {
133
153
  if (this.payload.status === "resolved") {
134
154
  this.stopChecking();
@@ -191,6 +211,11 @@ class Commitment {
191
211
  return this.getStatus();
192
212
  }
193
213
 
214
+ if (this.isRejected()) {
215
+ this.markAsRejected();
216
+ return this.getStatus();
217
+ }
218
+
194
219
  if (this.isResolved()) {
195
220
  this.markAsResolved();
196
221
  return this.getStatus();
@@ -216,6 +241,10 @@ class Commitment {
216
241
  this.markAsWaiting();
217
242
  break;
218
243
  }
244
+ case "rejected": {
245
+ this.markAsRejected();
246
+ break;
247
+ }
219
248
  }
220
249
 
221
250
  if (this.options.onCheck) {
@@ -248,6 +277,7 @@ interface ICommitmentOptions {
248
277
  onResolved?: (commitment: Commitment) => void;
249
278
  onError?: (error: Error, commitment: Commitment) => void;
250
279
  onExpired?: (commitment: Commitment) => void;
280
+ onRejected?: (commitment: Commitment) => void;
251
281
  onDuplicated?: (commitment: Commitment) => void;
252
282
  onCheck?: (commitment: Commitment) => void;
253
283
  onWaiting?: (commitment: Commitment) => void;
@@ -334,6 +364,14 @@ export class Client {
334
364
  click_url: commitment.getClickUrl(),
335
365
  }),
336
366
  )
367
+ .onRejected((commitment) =>
368
+ on(null, {
369
+ status: commitment.getStatus(),
370
+ reference_id,
371
+ commitment_id: commitment.getCommitmentId(),
372
+ click_url: commitment.getClickUrl(),
373
+ }),
374
+ )
337
375
  .onResolved((commitment) =>
338
376
  on(null, {
339
377
  status: commitment.getStatus(),
@@ -376,6 +414,7 @@ class CommitmentObservabileBuilder {
376
414
  private _onErrorFn: (error: Error, commitment?: Commitment) => void =
377
415
  () => {};
378
416
  private _onExpiredFn: (commitment: Commitment) => void = () => {};
417
+ private _onRejectedFn: (commitment: Commitment) => void = () => {};
379
418
  private _onDuplicatedFn: (commitment: Commitment) => void = () => {};
380
419
  private _onCheckFn: (commitment: Commitment) => void = () => {};
381
420
  private _onWaitingFn: (commitment: Commitment) => void = () => {};
@@ -417,6 +456,11 @@ class CommitmentObservabileBuilder {
417
456
  return this;
418
457
  }
419
458
 
459
+ onRejected(cb: (commitment: Commitment) => void) {
460
+ this._onRejectedFn = cb;
461
+ return this;
462
+ }
463
+
420
464
  onError(cb: (error: Error, commitment?: Commitment) => void) {
421
465
  this._onErrorFn = cb;
422
466
  return this;
@@ -460,6 +504,7 @@ class CommitmentObservabileBuilder {
460
504
  onError: this._onErrorFn,
461
505
  onExpired: this._onExpiredFn,
462
506
  onWaiting: this._onWaitingFn,
507
+ onRejected: this._onRejectedFn,
463
508
  onResolved: this._onResolvedFn,
464
509
  })
465
510
  .catch((error) => {
package/src/service.ts CHANGED
@@ -150,6 +150,12 @@ export class Service {
150
150
  );
151
151
 
152
152
  switch (response.status) {
153
+ case 402:
154
+ return {
155
+ commitment_id: commitment,
156
+ message: response.message || "Payment required - you are over limit",
157
+ status: "rejected",
158
+ };
153
159
  case 410:
154
160
  return {
155
161
  commitment_id: commitment,