@wdft/micropayments-sdk 0.0.9 → 0.0.10

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,7 @@
1
1
  ## WDFT - We Do Fintech - Micropayments SDK
2
2
 
3
3
  Read more about our service GetViaMsg at https://wdft.ovh
4
+
5
+ ### Changelog
6
+
7
+ [CHANGELOG.md](/changelog.md)
package/dist/client.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { type IServiceOptions, type ICommitmentMetadata, Service } from "./service.js";
2
+ import type { StorageDriver } from "./storage.js";
2
3
  interface ICommitmentPayload {
3
4
  commitment_id: string;
4
5
  amount: number;
@@ -42,7 +43,9 @@ declare class Commitment {
42
43
  check(): Promise<CommitmentStatus>;
43
44
  }
44
45
  interface IClientOptions {
46
+ tenant_id: string;
45
47
  currency: string;
48
+ storage?: StorageDriver;
46
49
  retry_ms?: number;
47
50
  }
48
51
  interface INewClientOptions extends IClientOptions, IServiceOptions {
@@ -50,7 +53,9 @@ interface INewClientOptions extends IClientOptions, IServiceOptions {
50
53
  interface ICommitmentOptions {
51
54
  currency?: string;
52
55
  retry_ms?: number;
56
+ storage?: StorageDriver;
53
57
  metadata?: ICommitmentMetadata;
58
+ commitmentKey?: string;
54
59
  onCreated?: (commitment: Commitment) => void;
55
60
  onResolved?: (commitment: Commitment) => void;
56
61
  onError?: (error: Error, commitment: Commitment) => void;
@@ -65,6 +70,10 @@ export declare class Client {
65
70
  private readonly options;
66
71
  static new(opts: INewClientOptions): Client;
67
72
  constructor(svc: Service, options: IClientOptions);
73
+ private getStorageKey;
74
+ checkDirect(commitment_id: string): Promise<import("./service.js").ICommitmentStatus>;
75
+ private storeIntoStorageByKey;
76
+ private canRecreateFromStorageKey;
68
77
  createDirect(reference_id: string, amount: number, options?: ICommitmentOptions): Promise<Commitment>;
69
78
  create(reference_id: string, amount: number, on: ICallback): void;
70
79
  commitmentBuilder(): CommitmentObservabileBuilder;
@@ -81,6 +90,8 @@ type OnStatusErrorCallback = (error: Error, payload: null) => void;
81
90
  export type ICallback = OnStatusCallback & OnStatusErrorCallback;
82
91
  declare class CommitmentObservabileBuilder {
83
92
  private readonly client;
93
+ private _storage;
94
+ private _commitmentKey;
84
95
  private _reference_id;
85
96
  private _amount;
86
97
  private _retry_ms;
@@ -95,6 +106,8 @@ declare class CommitmentObservabileBuilder {
95
106
  private _onCheckFn;
96
107
  private _onWaitingFn;
97
108
  constructor(client: Client);
109
+ setStorage(storage: StorageDriver): this;
110
+ setStorageCommitmentKey(key: string): this;
98
111
  setMetadataTitle(title?: string): this;
99
112
  setMetadataUrl(url?: string): this;
100
113
  setRetryTime(retry: number): this;
package/dist/client.js CHANGED
@@ -1 +1 @@
1
- var C="2025-09-30";async function u(s){return s.headers.get("Content-Type")?.includes("application/json")?await s.json():await s.text()}function y(s,t){return Math.floor(Math.random()*(t-s+1))+s}function d(s){let t=0;if(!s)return t;let r=typeof s=="number"?s:parseInt(s,10);return!isNaN(r)&&isFinite(r)?t=r*1e3:t=0,t}async function l(s,t,r){try{let i=await r(new Request(s,t));if(i.ok){let e=i.headers.get("Retry-After");return{status:i.status,error:!1,retry_after:d(i.headers.get("Retry-After")),data:await u(i)}}let n=await u(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,retry_after:d(i.headers.get("Retry-After")),data:null}}catch(i){return{status:500,error:!0,message:i instanceof Error?i.message:`${i}`,retry_after:y(1e4,3e4),data:null}}}function h(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,n){let e=await l(h(this.options.endpoint,"/commitment"),{method:"POST",headers:{"Content-Type":"application/json","X-Compatibility-Date":C},body:JSON.stringify({tenant_id:this.options.tenant_id,reference_id:t,currency:i,metadata:n??{title:"",url:""},amount:r})},this.fetcher);if(e.error)throw new Error(e.message);if(!e.data)throw new Error("Bad response");return e.data}async checkCommitment(t){let r=await l(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{commitment_id:r.data.commitment_id,message:r.data.message,status:r.data.status,retry_after:r.retry_after}}};var c=5e3,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"}getMessage(){return this.payload.message||""}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{let t=await this.service.checkCommitment(this.getCommitmentId());switch(t.retry_after&&(this.options.retry_ms=Math.max(this.options.retry_ms||c,t.retry_after)),t.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()}},p=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,i.metadata);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??c},i)}create(t,r,i){let n=this.commitmentBuilder().setAmount(r).setCurrency(this.options.currency).setMetadataUrl(globalThis?.location?.href??"").setMetadataTitle(globalThis?.document?.title??"").setReference(t);this.options.retry_ms&&n.setRetryTime(this.options.retry_ms),n.onCreated(e=>(e.startChecking(),i(null,{status:e.getStatus(),message:e.getMessage(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()}))).onWaiting(e=>i(null,{status:e.getStatus(),message:e.getMessage(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()})).onDuplicated(e=>i(null,{status:e.getStatus(),message:e.getMessage(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()})).onExpired(e=>i(null,{status:e.getStatus(),message:e.getMessage(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()})).onRejected(e=>i(null,{status:e.getStatus(),message:e.getMessage(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()})).onResolved(e=>i(null,{status:e.getStatus(),message:e.getMessage(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()})).onError((e,g)=>{g?.stopChecking(),i(e,null)}).exec()}commitmentBuilder(){return new m(this)}},m=class{constructor(t){this.client=t;this._retry_ms=c;this._metadata={title:"",url:""};this._onCreatedFn=()=>{};this._onResolvedFn=()=>{};this._onErrorFn=()=>{};this._onExpiredFn=()=>{};this._onRejectedFn=()=>{};this._onDuplicatedFn=()=>{};this._onCheckFn=()=>{};this._onWaitingFn=()=>{}}setMetadataTitle(t=""){return this._metadata.title=t,this}setMetadataUrl(t=""){return this._metadata.url=t,this}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,metadata:this._metadata,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{p as Client};
1
+ var C="2025-09-30";async function d(s){return s.headers.get("Content-Type")?.includes("application/json")?await s.json():await s.text()}function _(s,t){return Math.floor(Math.random()*(t-s+1))+s}function h(s){let t=0;if(!s)return t;let i=typeof s=="number"?s:parseInt(s,10);return!isNaN(i)&&isFinite(i)?t=i*1e3:t=0,t}async function l(s,t,i){try{let r=await i(new Request(s,t));if(r.ok){let o=r.headers.get("Retry-After");return{status:r.status,error:!1,retry_after:h(r.headers.get("Retry-After")),data:await d(r)}}let n=await d(r);return{status:r.status,error:n&&typeof n=="object"&&"error"in n?n.error:!0,message:n&&typeof n=="object"&&"message"in n?n.message:r.statusText,retry_after:h(r.headers.get("Retry-After")),data:null}}catch(r){return{status:500,error:!0,message:r instanceof Error?r.message:`${r}`,retry_after:_(1e4,3e4),data:null}}}function p(s,t){let i=s.endsWith("/")?s.substring(0,s.length-1):s,r=t.startsWith("/")?t:"/".concat(t);return i+r}var a=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,i,r,n){let o=await l(p(this.options.endpoint,"/commitment"),{method:"POST",headers:{"Content-Type":"application/json","X-Compatibility-Date":C},body:JSON.stringify({tenant_id:this.options.tenant_id,reference_id:t,currency:r,metadata:n??{title:"",url:""},amount:i})},this.fetcher);if(o.error)throw new Error(o.message);if(!o.data)throw new Error("Bad response");return o.data}async checkCommitment(t){let i=await l(p(this.options.endpoint,`/commitment/${t}`),{method:"GET"},this.fetcher);switch(i.status){case 402:return{commitment_id:t,message:i.message||"Payment required - you are over limit",status:"rejected"};case 410:return{commitment_id:t,message:i.message||"Expired",status:"expired"}}if(i.error)throw new Error(i.message);if(!i.data)throw new Error("Bad response");return{commitment_id:i.data.commitment_id,message:i.data.message,status:i.data.status,retry_after:i.retry_after}}};var m=5e3,c=class{constructor(t,i,r){this.service=t;this.options=r;this.retries=0;this.currentTimer=null;this.currentCheck=null;this.payload={message:"Creating...",status:"initializing",...i},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"}getMessage(){return this.payload.message||""}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 i=this.getNextCallTime();return t==="waiting"&&(this.currentTimer=setTimeout(()=>this.startChecking(),i)),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{let t=await this.service.checkCommitment(this.getCommitmentId());switch(t.retry_after&&(this.options.retry_ms=Math.max(this.options.retry_ms||m,t.retry_after)),t.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()}},g=class s{constructor(t,i){this.svc=t;this.options=i}static new(t){return new s(new a(t),t)}getStorageKey(t){return`getviamsg:${this.options.tenant_id}:${t}`}async checkDirect(t){return this.svc.checkCommitment(t)}async storeIntoStorageByKey(t,i){this.options.storage&&t&&await this.options.storage.set(t,JSON.stringify(i))}async canRecreateFromStorageKey(t){if(!this.options.storage||!t)return null;let i=await this.options.storage.get(t);if(!i)return null;let r=JSON.parse(i),n=await this.checkDirect(r.commitment_id).catch(o=>({commitment_id:r.commitment_id,status:"expired",message:"Commitment expired"}));return n.status==="expired"||n.status==="rejected"?(await this.options.storage.del(t),null):r}async createDirect(t,i,r={}){let n=r.currency??this.options.currency,o=await this.canRecreateFromStorageKey(r.commitmentKey);if(o)return new c(this.svc,{commitment_id:o.commitment_id,amount:i,currency:n,reference_id:t,expires_at:o.expires_at,click_url:o.click_url,retry_ms:this.options.retry_ms??m},r);let e=await this.svc.createCommitment(t,i,n,r.metadata);return await this.storeIntoStorageByKey(r.commitmentKey,e),new c(this.svc,{commitment_id:e.commitment_id,amount:i,currency:n,reference_id:t,expires_at:e.expires_at,click_url:e.click_url,retry_ms:this.options.retry_ms??m},r)}create(t,i,r){let n=this.commitmentBuilder().setAmount(i).setCurrency(this.options.currency).setMetadataUrl(globalThis?.location?.href??"").setMetadataTitle(globalThis?.document?.title??"").setReference(t);if(this.options.retry_ms&&n.setRetryTime(this.options.retry_ms),!!this.options.storage){let e=this.getStorageKey(t);n.setStorage(this.options.storage),n.setStorageCommitmentKey(e)}n.onCreated(e=>(e.startChecking(),r(null,{status:e.getStatus(),message:e.getMessage(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()}))).onWaiting(e=>r(null,{status:e.getStatus(),message:e.getMessage(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()})).onDuplicated(e=>r(null,{status:e.getStatus(),message:e.getMessage(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()})).onExpired(e=>r(null,{status:e.getStatus(),message:e.getMessage(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()})).onRejected(e=>r(null,{status:e.getStatus(),message:e.getMessage(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()})).onResolved(e=>r(null,{status:e.getStatus(),message:e.getMessage(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()})).onError((e,y)=>{y?.stopChecking(),r(e,null)}).exec()}commitmentBuilder(){return new u(this)}},u=class{constructor(t){this.client=t;this._retry_ms=m;this._metadata={title:"",url:""};this._onCreatedFn=()=>{};this._onResolvedFn=()=>{};this._onErrorFn=()=>{};this._onExpiredFn=()=>{};this._onRejectedFn=()=>{};this._onDuplicatedFn=()=>{};this._onCheckFn=()=>{};this._onWaitingFn=()=>{}}setStorage(t){return this._storage=t,this}setStorageCommitmentKey(t){return this._commitmentKey=t,this}setMetadataTitle(t=""){return this._metadata.title=t,this}setMetadataUrl(t=""){return this._metadata.url=t,this}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,metadata:this._metadata,storage:this._storage,commitmentKey:this._commitmentKey,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{g as Client};
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
File without changes
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components.js","sourceRoot":"","sources":["../src/components.ts"],"names":[],"mappings":""}
package/dist/index.d.ts CHANGED
@@ -1,11 +1,13 @@
1
1
  import type { ICallback } from "./client.js";
2
2
  import type { Fetcher } from "./service.js";
3
+ import type { StorageDriver } from "./storage.js";
3
4
  export interface IGetViaMsgInit {
4
5
  reference_id: string;
5
6
  amount: number;
6
7
  currency: "PLN" | "EUR" | "GBP" | "USD" | "CHF" | string;
7
8
  tenant_id: string;
8
9
  endpoint?: string;
10
+ storage?: StorageDriver;
9
11
  fetcher?: Fetcher;
10
12
  retry_ms?: number;
11
13
  }
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- var C="2025-09-30";async function d(r){return r.headers.get("Content-Type")?.includes("application/json")?await r.json():await r.text()}function y(r,t){return Math.floor(Math.random()*(t-r+1))+r}function l(r){let t=0;if(!r)return t;let i=typeof r=="number"?r:parseInt(r,10);return!isNaN(i)&&isFinite(i)?t=i*1e3:t=0,t}async function h(r,t,i){try{let s=await i(new Request(r,t));if(s.ok){let e=s.headers.get("Retry-After");return{status:s.status,error:!1,retry_after:l(s.headers.get("Retry-After")),data:await d(s)}}let n=await d(s);return{status:s.status,error:n&&typeof n=="object"&&"error"in n?n.error:!0,message:n&&typeof n=="object"&&"message"in n?n.message:s.statusText,retry_after:l(s.headers.get("Retry-After")),data:null}}catch(s){return{status:500,error:!0,message:s instanceof Error?s.message:`${s}`,retry_after:y(1e4,3e4),data:null}}}function p(r,t){let i=r.endsWith("/")?r.substring(0,r.length-1):r,s=t.startsWith("/")?t:"/".concat(t);return i+s}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,i,s,n){let e=await h(p(this.options.endpoint,"/commitment"),{method:"POST",headers:{"Content-Type":"application/json","X-Compatibility-Date":C},body:JSON.stringify({tenant_id:this.options.tenant_id,reference_id:t,currency:s,metadata:n??{title:"",url:""},amount:i})},this.fetcher);if(e.error)throw new Error(e.message);if(!e.data)throw new Error("Bad response");return e.data}async checkCommitment(t){let i=await h(p(this.options.endpoint,`/commitment/${t}`),{method:"GET"},this.fetcher);switch(i.status){case 402:return{commitment_id:t,message:i.message||"Payment required - you are over limit",status:"rejected"};case 410:return{commitment_id:t,message:i.message||"Expired",status:"expired"}}if(i.error)throw new Error(i.message);if(!i.data)throw new Error("Bad response");return{commitment_id:i.data.commitment_id,message:i.data.message,status:i.data.status,retry_after:i.retry_after}}};var u=5e3,m=class{constructor(t,i,s){this.service=t;this.options=s;this.retries=0;this.currentTimer=null;this.currentCheck=null;this.payload={message:"Creating...",status:"initializing",...i},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"}getMessage(){return this.payload.message||""}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 i=this.getNextCallTime();return t==="waiting"&&(this.currentTimer=setTimeout(()=>this.startChecking(),i)),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{let t=await this.service.checkCommitment(this.getCommitmentId());switch(t.retry_after&&(this.options.retry_ms=Math.max(this.options.retry_ms||u,t.retry_after)),t.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 r{constructor(t,i){this.svc=t;this.options=i}static new(t){return new r(new o(t),t)}async createDirect(t,i,s={}){let n=s.currency??this.options.currency,e=await this.svc.createCommitment(t,i,n,s.metadata);return new m(this.svc,{commitment_id:e.commitment_id,amount:i,currency:n,reference_id:t,expires_at:e.expires_at,click_url:e.click_url,retry_ms:this.options.retry_ms??u},s)}create(t,i,s){let n=this.commitmentBuilder().setAmount(i).setCurrency(this.options.currency).setMetadataUrl(globalThis?.location?.href??"").setMetadataTitle(globalThis?.document?.title??"").setReference(t);this.options.retry_ms&&n.setRetryTime(this.options.retry_ms),n.onCreated(e=>(e.startChecking(),s(null,{status:e.getStatus(),message:e.getMessage(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()}))).onWaiting(e=>s(null,{status:e.getStatus(),message:e.getMessage(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()})).onDuplicated(e=>s(null,{status:e.getStatus(),message:e.getMessage(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()})).onExpired(e=>s(null,{status:e.getStatus(),message:e.getMessage(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()})).onRejected(e=>s(null,{status:e.getStatus(),message:e.getMessage(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()})).onResolved(e=>s(null,{status:e.getStatus(),message:e.getMessage(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()})).onError((e,g)=>{g?.stopChecking(),s(e,null)}).exec()}commitmentBuilder(){return new c(this)}},c=class{constructor(t){this.client=t;this._retry_ms=u;this._metadata={title:"",url:""};this._onCreatedFn=()=>{};this._onResolvedFn=()=>{};this._onErrorFn=()=>{};this._onExpiredFn=()=>{};this._onRejectedFn=()=>{};this._onDuplicatedFn=()=>{};this._onCheckFn=()=>{};this._onWaitingFn=()=>{}}setMetadataTitle(t=""){return this._metadata.title=t,this}setMetadataUrl(t=""){return this._metadata.url=t,this}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,metadata:this._metadata,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 R(r,t){a.new({currency:r.currency,endpoint:r.endpoint??"https://api.micropayments.wdft.ovh/",tenant_id:r.tenant_id,fetcher:r.fetcher??fetch,retry_ms:r.retry_ms??1e3}).create(r.reference_id,r.amount,t)}export{R as getViaMsg};
1
+ var C="2025-09-30";async function h(s){return s.headers.get("Content-Type")?.includes("application/json")?await s.json():await s.text()}function _(s,t){return Math.floor(Math.random()*(t-s+1))+s}function l(s){let t=0;if(!s)return t;let r=typeof s=="number"?s:parseInt(s,10);return!isNaN(r)&&isFinite(r)?t=r*1e3:t=0,t}async function p(s,t,r){try{let i=await r(new Request(s,t));if(i.ok){let o=i.headers.get("Retry-After");return{status:i.status,error:!1,retry_after:l(i.headers.get("Retry-After")),data:await h(i)}}let n=await h(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,retry_after:l(i.headers.get("Retry-After")),data:null}}catch(i){return{status:500,error:!0,message:i instanceof Error?i.message:`${i}`,retry_after:_(1e4,3e4),data:null}}}function g(s,t){let r=s.endsWith("/")?s.substring(0,s.length-1):s,i=t.startsWith("/")?t:"/".concat(t);return r+i}var a=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,n){let o=await p(g(this.options.endpoint,"/commitment"),{method:"POST",headers:{"Content-Type":"application/json","X-Compatibility-Date":C},body:JSON.stringify({tenant_id:this.options.tenant_id,reference_id:t,currency:i,metadata:n??{title:"",url:""},amount:r})},this.fetcher);if(o.error)throw new Error(o.message);if(!o.data)throw new Error("Bad response");return o.data}async checkCommitment(t){let r=await p(g(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{commitment_id:r.data.commitment_id,message:r.data.message,status:r.data.status,retry_after:r.retry_after}}};var m=5e3,c=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"}getMessage(){return this.payload.message||""}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{let t=await this.service.checkCommitment(this.getCommitmentId());switch(t.retry_after&&(this.options.retry_ms=Math.max(this.options.retry_ms||m,t.retry_after)),t.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()}},u=class s{constructor(t,r){this.svc=t;this.options=r}static new(t){return new s(new a(t),t)}getStorageKey(t){return`getviamsg:${this.options.tenant_id}:${t}`}async checkDirect(t){return this.svc.checkCommitment(t)}async storeIntoStorageByKey(t,r){this.options.storage&&t&&await this.options.storage.set(t,JSON.stringify(r))}async canRecreateFromStorageKey(t){if(!this.options.storage||!t)return null;let r=await this.options.storage.get(t);if(!r)return null;let i=JSON.parse(r),n=await this.checkDirect(i.commitment_id).catch(o=>({commitment_id:i.commitment_id,status:"expired",message:"Commitment expired"}));return n.status==="expired"||n.status==="rejected"?(await this.options.storage.del(t),null):i}async createDirect(t,r,i={}){let n=i.currency??this.options.currency,o=await this.canRecreateFromStorageKey(i.commitmentKey);if(o)return new c(this.svc,{commitment_id:o.commitment_id,amount:r,currency:n,reference_id:t,expires_at:o.expires_at,click_url:o.click_url,retry_ms:this.options.retry_ms??m},i);let e=await this.svc.createCommitment(t,r,n,i.metadata);return await this.storeIntoStorageByKey(i.commitmentKey,e),new c(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??m},i)}create(t,r,i){let n=this.commitmentBuilder().setAmount(r).setCurrency(this.options.currency).setMetadataUrl(globalThis?.location?.href??"").setMetadataTitle(globalThis?.document?.title??"").setReference(t);if(this.options.retry_ms&&n.setRetryTime(this.options.retry_ms),!!this.options.storage){let e=this.getStorageKey(t);n.setStorage(this.options.storage),n.setStorageCommitmentKey(e)}n.onCreated(e=>(e.startChecking(),i(null,{status:e.getStatus(),message:e.getMessage(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()}))).onWaiting(e=>i(null,{status:e.getStatus(),message:e.getMessage(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()})).onDuplicated(e=>i(null,{status:e.getStatus(),message:e.getMessage(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()})).onExpired(e=>i(null,{status:e.getStatus(),message:e.getMessage(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()})).onRejected(e=>i(null,{status:e.getStatus(),message:e.getMessage(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()})).onResolved(e=>i(null,{status:e.getStatus(),message:e.getMessage(),reference_id:t,commitment_id:e.getCommitmentId(),click_url:e.getClickUrl()})).onError((e,y)=>{y?.stopChecking(),i(e,null)}).exec()}commitmentBuilder(){return new d(this)}},d=class{constructor(t){this.client=t;this._retry_ms=m;this._metadata={title:"",url:""};this._onCreatedFn=()=>{};this._onResolvedFn=()=>{};this._onErrorFn=()=>{};this._onExpiredFn=()=>{};this._onRejectedFn=()=>{};this._onDuplicatedFn=()=>{};this._onCheckFn=()=>{};this._onWaitingFn=()=>{}}setStorage(t){return this._storage=t,this}setStorageCommitmentKey(t){return this._commitmentKey=t,this}setMetadataTitle(t=""){return this._metadata.title=t,this}setMetadataUrl(t=""){return this._metadata.url=t,this}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,metadata:this._metadata,storage:this._storage,commitmentKey:this._commitmentKey,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 S(s,t){u.new({currency:s.currency,endpoint:s.endpoint??"https://svc.getviamsg.wdft.ovh/",tenant_id:s.tenant_id,storage:s.storage,fetcher:s.fetcher??fetch,retry_ms:s.retry_ms??1e3}).create(s.reference_id,s.amount,t)}export{S as getViaMsg};
package/dist/index.js.map CHANGED
@@ -1 +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;IACjE,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC;QACxB,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;KAChC,CAAC,CAAC;IAEH,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC1D,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAarC,MAAM,UAAU,SAAS,CAAC,IAAoB,EAAE,QAAmB;IACjE,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC;QACxB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,iCAAiC;QAC5D,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,KAAK;QAC9B,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI;KAChC,CAAC,CAAC;IAEH,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC1D,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import { it } from "vitest";
2
2
  import { getViaMsg } from "./index.js";
3
3
  import { mockFetch } from "./test_utils/mock_fetcher.js";
4
+ import { memory } from "./storage.js";
4
5
  it("getViaMsg", async () => {
5
6
  const mock = mockFetch();
6
7
  await new Promise((resolve, reject) => {
@@ -1 +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;IACzB,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;IAEzB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACpC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACb,SAAS,EAAE,gBAAgB;YAC3B,uBAAuB,EAAE,UAAU;YACnC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAM;YAC/B,aAAa,EAAE,sBAAsB;SACtC,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACb,OAAO,EAAE,iBAAiB;YAC1B,MAAM,EAAE,SAAS;YACjB,aAAa,EAAE,sBAAsB;SACtC,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACb,OAAO,EAAE,iBAAiB;YAC1B,MAAM,EAAE,SAAS;YACjB,aAAa,EAAE,sBAAsB;SACtC,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACb,OAAO,EAAE,iBAAiB;YAC1B,MAAM,EAAE,UAAU;YAClB,aAAa,EAAE,sBAAsB;SACtC,CAAC,CAAC;QAEH,SAAS,CACP;YACE,MAAM,EAAE,EAAE;YACV,YAAY,EAAE,KAAK;YACnB,QAAQ,EAAE,KAAK;YACf,SAAS,EAAE,oBAAoB;YAC/B,QAAQ,EAAE,uBAAuB;YACjC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YAChC,QAAQ,EAAE,GAAG;SACd,EACD,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;YACjB,IAAI,CAAC,OAAO,IAAI,KAAK,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACnB,MAAM,CAAC,KAAK,CAAC,CAAC;gBACd,OAAO;YACT,CAAC;YAED,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;YAE3B,QAAQ,MAAM,EAAE,CAAC;gBACf,KAAK,SAAS,CAAC;gBACf,KAAK,SAAS,CAAC;gBACf,KAAK,YAAY,CAAC;gBAClB,KAAK,SAAS;oBACZ,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;oBACrB,MAAM;gBACR,KAAK,UAAU;oBACb,OAAO,CAAC,MAAM,CAAC,CAAC;YACpB,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
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;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,EAAE,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;IACzB,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;IAEzB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACpC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACb,SAAS,EAAE,gBAAgB;YAC3B,uBAAuB,EAAE,UAAU;YACnC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAM;YAC/B,aAAa,EAAE,sBAAsB;SACtC,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACb,OAAO,EAAE,iBAAiB;YAC1B,MAAM,EAAE,SAAS;YACjB,aAAa,EAAE,sBAAsB;SACtC,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACb,OAAO,EAAE,iBAAiB;YAC1B,MAAM,EAAE,SAAS;YACjB,aAAa,EAAE,sBAAsB;SACtC,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACb,OAAO,EAAE,iBAAiB;YAC1B,MAAM,EAAE,UAAU;YAClB,aAAa,EAAE,sBAAsB;SACtC,CAAC,CAAC;QAEH,SAAS,CACP;YACE,MAAM,EAAE,EAAE;YACV,YAAY,EAAE,KAAK;YACnB,QAAQ,EAAE,KAAK;YACf,SAAS,EAAE,oBAAoB;YAC/B,QAAQ,EAAE,uBAAuB;YACjC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YAChC,QAAQ,EAAE,GAAG;SACd,EACD,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;YACjB,IAAI,CAAC,OAAO,IAAI,KAAK,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACnB,MAAM,CAAC,KAAK,CAAC,CAAC;gBACd,OAAO;YACT,CAAC;YAED,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;YAE3B,QAAQ,MAAM,EAAE,CAAC;gBACf,KAAK,SAAS,CAAC;gBACf,KAAK,SAAS,CAAC;gBACf,KAAK,YAAY,CAAC;gBAClB,KAAK,SAAS;oBACZ,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;oBACrB,MAAM;gBACR,KAAK,UAAU;oBACb,OAAO,CAAC,MAAM,CAAC,CAAC;YACpB,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/dist/service.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- interface ICommitment {
1
+ export interface ICommitment {
2
2
  click_url: string;
3
3
  incoming_message_device: string;
4
4
  expires_at: number;
@@ -27,4 +27,3 @@ export declare class Service {
27
27
  createCommitment(reference_id: string, amount: number, currency: string, metadata?: ICommitmentMetadata): Promise<ICommitment>;
28
28
  checkCommitment(commitment: string): Promise<ICommitmentStatus>;
29
29
  }
30
- export {};
@@ -0,0 +1,10 @@
1
+ export interface StorageDriver {
2
+ get(key: string): Promise<string | undefined>;
3
+ set(key: string, value: string): Promise<void>;
4
+ del(key: string): Promise<void>;
5
+ }
6
+ export declare const memory: StorageDriver & {
7
+ __db: Record<string, string>;
8
+ };
9
+ export declare const session: StorageDriver;
10
+ export declare const local: StorageDriver;
@@ -0,0 +1 @@
1
+ var s={__db:{},async get(e){return Promise.resolve(this.__db[e]||void 0)},async set(e,r){return this.__db[e]=r,Promise.resolve()},async del(e){return delete this.__db[e],Promise.resolve()}},t={async get(e){return Promise.resolve(sessionStorage.getItem(e)??void 0)},async set(e,r){return sessionStorage.setItem(e,r),Promise.resolve()},async del(e){return sessionStorage.removeItem(e),Promise.resolve()}},n={async get(e){return Promise.resolve(localStorage.getItem(e)??void 0)},async set(e,r){return localStorage.setItem(e,r),Promise.resolve()},async del(e){return localStorage.removeItem(e),Promise.resolve()}};export{n as local,s as memory,t as session};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,MAAM,GAAmD;IACpE,IAAI,EAAE,EAA4B;IAClC,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,CAAC;IACtD,CAAC;IACD,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAa;QAClC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACvB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IACD,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;CACF,CAAA;AAED,MAAM,CAAC,MAAM,OAAO,GAAkB;IACpC,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,OAAO,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,CAAC;IACnE,CAAC;IACD,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAa;QAClC,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACnC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IACD,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;CACF,CAAA;AAED,MAAM,CAAC,MAAM,KAAK,GAAkB;IAClC,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,OAAO,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,CAAC;IACjE,CAAC;IACD,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAa;QAClC,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACjC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IACD,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAC7B,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;CACF,CAAA"}
@@ -0,0 +1 @@
1
+ export declare function slugifyUrl(url: URL): string;
package/dist/utils.js ADDED
@@ -0,0 +1 @@
1
+ function t(e){return decodeURIComponent(e.pathname).split("/").map(o=>o.normalize("NFKD").replace(/[\u0300-\u036f]/g,"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")).filter(Boolean).join("/")}export{t as slugifyUrl};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,UAAU,CAAC,GAAQ;IACjC,8CAA8C;IAC9C,MAAM,WAAW,GAAG,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACrD,OAAO,WAAW;SACf,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,OAAO,CAAC,EAAE,CACb,OAAO;SACJ,SAAS,CAAC,MAAM,CAAC,CAAe,4BAA4B;SAC5D,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,iBAAiB;SACjD,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAK,6BAA6B;SAC7D,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAS,eAAe;KACnD;SACA,MAAM,CAAC,OAAO,CAAC,CAAqB,wBAAwB;SAC5D,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,7 @@
1
+ import { expect, it } from "vitest";
2
+ import { slugifyUrl } from "./utils";
3
+ it("slugify url", async () => {
4
+ const url = new URL("https://example.com/Café & Croissant/Morning Menu");
5
+ expect(slugifyUrl(url), 'cafe-croissant/morning-menu');
6
+ });
7
+ //# sourceMappingURL=utils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.test.js","sourceRoot":"","sources":["../src/utils.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,EAAE,CAAC,aAAa,EAAE,KAAK,IAAI,EAAE;IAC3B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,mDAAmD,CAAC,CAAC;IACzE,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,6BAA6B,CAAC,CAAC;AACzD,CAAC,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.9",
4
+ "version": "0.0.10",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
@@ -31,6 +31,6 @@
31
31
  "build": "pnpm run build:types && pnpm run build:js",
32
32
  "fmt": "biome check --write ./src",
33
33
  "test": "vitest run",
34
- "release": "bash -ic 'read -r -p \"Are you sure you want to release? (y/n) \" answer; case $answer in [Yy]*) pnpm run build && changeset publish ;; *) echo \"Release cancelled.\" ;; esac'"
34
+ "release": "bash -ic 'read -r -p \"Are you sure you want to release (changelog/version)? (y/n) \" answer; case $answer in [Yy]*) pnpm run build && changeset publish ;; *) echo \"Release cancelled.\" ;; esac'"
35
35
  }
36
36
  }
package/src/browser.ts CHANGED
@@ -2,4 +2,4 @@ import QRCode from "qrcode";
2
2
 
3
3
  export async function generateQRCode(text: string) {
4
4
  return await QRCode.toDataURL(text, { errorCorrectionLevel: "L" });
5
- }
5
+ }
package/src/client.ts CHANGED
@@ -1,4 +1,5 @@
1
- import { type IServiceOptions, type ICommitmentMetadata, Service } from "./service.js";
1
+ import { type IServiceOptions, type ICommitmentMetadata, Service, type ICommitment } from "./service.js";
2
+ import type { StorageDriver } from "./storage.js";
2
3
 
3
4
  interface ICommitmentPayload {
4
5
  commitment_id: string;
@@ -274,7 +275,9 @@ class Commitment {
274
275
  }
275
276
 
276
277
  interface IClientOptions {
278
+ tenant_id: string;
277
279
  currency: string;
280
+ storage?: StorageDriver;
278
281
  retry_ms?: number;
279
282
  }
280
283
 
@@ -283,7 +286,9 @@ interface INewClientOptions extends IClientOptions, IServiceOptions {}
283
286
  interface ICommitmentOptions {
284
287
  currency?: string;
285
288
  retry_ms?: number;
289
+ storage?: StorageDriver;
286
290
  metadata?: ICommitmentMetadata;
291
+ commitmentKey?: string;
287
292
  onCreated?: (commitment: Commitment) => void;
288
293
  onResolved?: (commitment: Commitment) => void;
289
294
  onError?: (error: Error, commitment: Commitment) => void;
@@ -304,25 +309,93 @@ export class Client {
304
309
  private readonly options: IClientOptions,
305
310
  ) {}
306
311
 
312
+ private getStorageKey(reference_id: string) {
313
+ return `getviamsg:${this.options.tenant_id}:${reference_id}`;
314
+ }
315
+
316
+ async checkDirect(commitment_id: string) {
317
+ return this.svc.checkCommitment(commitment_id);
318
+ }
319
+
320
+ private async storeIntoStorageByKey(commitment_key: string | undefined, commitment: ICommitment) {
321
+ if (!this.options.storage) {
322
+ return;
323
+ }
324
+
325
+ if (!commitment_key) {
326
+ return;
327
+ }
328
+
329
+ await this.options.storage.set(commitment_key, JSON.stringify(commitment));
330
+ }
331
+
332
+ private async canRecreateFromStorageKey(commitment_key?: string): Promise<ICommitment | null> {
333
+ if (!this.options.storage) {
334
+ return null;
335
+ }
336
+
337
+ if (!commitment_key) {
338
+ return null;
339
+ }
340
+
341
+ const commitmentIdToRestoreSerialized = await this.options.storage.get(commitment_key);
342
+
343
+ if (!commitmentIdToRestoreSerialized) {
344
+ return null;
345
+ }
346
+
347
+ const commitmentToRestore = JSON.parse(commitmentIdToRestoreSerialized);
348
+ const status = await this.checkDirect(commitmentToRestore.commitment_id).catch(error => {
349
+ return { commitment_id: commitmentToRestore.commitment_id, status: 'expired', message: 'Commitment expired' };
350
+ });
351
+
352
+ if (status.status === "expired" || status.status === "rejected") {
353
+ await this.options.storage.del(commitment_key);
354
+ return null;
355
+ }
356
+
357
+ return commitmentToRestore;
358
+ }
359
+
307
360
  async createDirect(
308
361
  reference_id: string,
309
362
  amount: number,
310
363
  options: ICommitmentOptions = {},
311
364
  ): Promise<Commitment> {
312
- const curr = options.currency ?? this.options.currency;
365
+ const currency = options.currency ?? this.options.currency;
366
+ const commitment = await this.canRecreateFromStorageKey(options.commitmentKey);
367
+
368
+ if (commitment) {
369
+ return new Commitment(
370
+ this.svc,
371
+ {
372
+ commitment_id: commitment.commitment_id,
373
+ amount: amount,
374
+ currency: currency,
375
+ reference_id: reference_id,
376
+ expires_at: commitment.expires_at,
377
+ click_url: commitment.click_url,
378
+ retry_ms: this.options.retry_ms ?? DEFAULT_RETRY_TIME_MS,
379
+ },
380
+ options,
381
+ );
382
+ }
383
+
313
384
  const response = await this.svc.createCommitment(
314
385
  reference_id,
315
386
  amount,
316
- curr,
387
+ currency,
317
388
  options.metadata,
318
389
  );
319
390
 
391
+ await this.storeIntoStorageByKey(options.commitmentKey, response);
392
+
320
393
  return new Commitment(
321
394
  this.svc,
322
395
  {
323
396
  commitment_id: response.commitment_id,
324
397
  amount: amount,
325
- currency: curr,
398
+ currency: currency,
326
399
  reference_id: reference_id,
327
400
  expires_at: response.expires_at,
328
401
  click_url: response.click_url,
@@ -344,6 +417,14 @@ export class Client {
344
417
  builder.setRetryTime(this.options.retry_ms);
345
418
  }
346
419
 
420
+ const hasStorageConfigured = !!this.options.storage;
421
+
422
+ if (hasStorageConfigured) {
423
+ const commitmentKey = this.getStorageKey(reference_id);
424
+ builder.setStorage(this.options.storage!);
425
+ builder.setStorageCommitmentKey(commitmentKey);
426
+ }
427
+
347
428
  builder
348
429
  .onCreated((commitment) => {
349
430
  commitment.startChecking();
@@ -373,24 +454,24 @@ export class Client {
373
454
  click_url: commitment.getClickUrl(),
374
455
  })
375
456
  )
376
- .onExpired((commitment) =>
377
- on(null, {
457
+ .onExpired((commitment) => {
458
+ return on(null, {
378
459
  status: commitment.getStatus(),
379
460
  message: commitment.getMessage(),
380
461
  reference_id,
381
462
  commitment_id: commitment.getCommitmentId(),
382
463
  click_url: commitment.getClickUrl(),
383
464
  })
384
- )
385
- .onRejected((commitment) =>
386
- on(null, {
465
+ })
466
+ .onRejected((commitment) => {
467
+ return on(null, {
387
468
  status: commitment.getStatus(),
388
469
  message: commitment.getMessage(),
389
470
  reference_id,
390
471
  commitment_id: commitment.getCommitmentId(),
391
472
  click_url: commitment.getClickUrl(),
392
473
  })
393
- )
474
+ })
394
475
  .onResolved((commitment) =>
395
476
  on(null, {
396
477
  status: commitment.getStatus(),
@@ -425,6 +506,8 @@ type OnStatusErrorCallback = (error: Error, payload: null) => void;
425
506
  export type ICallback = OnStatusCallback & OnStatusErrorCallback;
426
507
 
427
508
  class CommitmentObservabileBuilder {
509
+ private _storage: StorageDriver | undefined;
510
+ private _commitmentKey: string | undefined;
428
511
  private _reference_id: string | undefined;
429
512
  private _amount: number | undefined;
430
513
  private _retry_ms = DEFAULT_RETRY_TIME_MS;
@@ -442,6 +525,16 @@ class CommitmentObservabileBuilder {
442
525
 
443
526
  constructor(private readonly client: Client) {}
444
527
 
528
+ setStorage(storage: StorageDriver) {
529
+ this._storage = storage;
530
+ return this;
531
+ }
532
+
533
+ setStorageCommitmentKey(key: string) {
534
+ this._commitmentKey = key;
535
+ return this;
536
+ }
537
+
445
538
  setMetadataTitle(title: string = "") {
446
539
  this._metadata.title = title;
447
540
  return this;
@@ -530,6 +623,8 @@ class CommitmentObservabileBuilder {
530
623
  retry_ms: this._retry_ms,
531
624
  currency: this._currency,
532
625
  metadata: this._metadata,
626
+ storage: this._storage,
627
+ commitmentKey: this._commitmentKey,
533
628
  onCheck: this._onCheckFn,
534
629
  onCreated: this._onCreatedFn,
535
630
  onDuplicated: this._onDuplicatedFn,
File without changes
package/src/index.test.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { it } from "vitest";
2
2
  import { getViaMsg } from "./index.js";
3
3
  import { mockFetch } from "./test_utils/mock_fetcher.js";
4
+ import { memory } from "./storage.js";
4
5
 
5
6
  it("getViaMsg", async () => {
6
7
  const mock = mockFetch();
@@ -63,4 +64,4 @@ it("getViaMsg", async () => {
63
64
  },
64
65
  );
65
66
  });
66
- });
67
+ });
package/src/index.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import type { ICallback } from "./client.js";
2
2
  import type { Fetcher } from "./service.js";
3
-
3
+ import type { StorageDriver } from "./storage.js";
4
4
  import { Client } from "./client.js";
5
5
 
6
6
  export interface IGetViaMsgInit {
@@ -9,6 +9,7 @@ export interface IGetViaMsgInit {
9
9
  currency: "PLN" | "EUR" | "GBP" | "USD" | "CHF" | string;
10
10
  tenant_id: string;
11
11
  endpoint?: string;
12
+ storage?: StorageDriver;
12
13
  fetcher?: Fetcher;
13
14
  retry_ms?: number;
14
15
  }
@@ -16,11 +17,12 @@ export interface IGetViaMsgInit {
16
17
  export function getViaMsg(init: IGetViaMsgInit, callback: ICallback) {
17
18
  const client = Client.new({
18
19
  currency: init.currency,
19
- endpoint: init.endpoint ?? "https://api.micropayments.wdft.ovh/",
20
+ endpoint: init.endpoint ?? "https://svc.getviamsg.wdft.ovh/",
20
21
  tenant_id: init.tenant_id,
22
+ storage: init.storage,
21
23
  fetcher: init.fetcher ?? fetch,
22
24
  retry_ms: init.retry_ms ?? 1000,
23
25
  });
24
26
 
25
27
  client.create(init.reference_id, init.amount, callback);
26
- }
28
+ }
package/src/service.ts CHANGED
@@ -18,7 +18,7 @@ interface ErrorResponse extends CustomResponse {
18
18
  data: null;
19
19
  }
20
20
 
21
- interface ICommitment {
21
+ export interface ICommitment {
22
22
  click_url: string;
23
23
  incoming_message_device: string;
24
24
  expires_at: number;
package/src/storage.ts ADDED
@@ -0,0 +1,48 @@
1
+ export interface StorageDriver {
2
+ get(key: string): Promise<string | undefined>;
3
+ set(key: string, value: string): Promise<void>;
4
+ del(key: string): Promise<void>;
5
+ }
6
+
7
+ export const memory: StorageDriver & {__db: Record<string, string>} = {
8
+ __db: {} as Record<string, string>,
9
+ async get(key: string) {
10
+ return Promise.resolve(this.__db[key] || undefined);
11
+ },
12
+ async set(key: string, value: string) {
13
+ this.__db[key] = value;
14
+ return Promise.resolve();
15
+ },
16
+ async del(key: string) {
17
+ delete this.__db[key];
18
+ return Promise.resolve();
19
+ },
20
+ }
21
+
22
+ export const session: StorageDriver = {
23
+ async get(key: string) {
24
+ return Promise.resolve(sessionStorage.getItem(key) ?? undefined);
25
+ },
26
+ async set(key: string, value: string) {
27
+ sessionStorage.setItem(key, value);
28
+ return Promise.resolve();
29
+ },
30
+ async del(key: string) {
31
+ sessionStorage.removeItem(key);
32
+ return Promise.resolve();
33
+ },
34
+ }
35
+
36
+ export const local: StorageDriver = {
37
+ async get(key: string) {
38
+ return Promise.resolve(localStorage.getItem(key) ?? undefined);
39
+ },
40
+ async set(key: string, value: string) {
41
+ localStorage.setItem(key, value);
42
+ return Promise.resolve();
43
+ },
44
+ async del(key: string) {
45
+ localStorage.removeItem(key);
46
+ return Promise.resolve();
47
+ },
48
+ }
@@ -0,0 +1,7 @@
1
+ import { expect, it } from "vitest";
2
+ import { slugifyUrl } from "./utils";
3
+
4
+ it("slugify url", async () => {
5
+ const url = new URL("https://example.com/Café & Croissant/Morning Menu");
6
+ expect(slugifyUrl(url), 'cafe-croissant/morning-menu');
7
+ });
package/src/utils.ts ADDED
@@ -0,0 +1,16 @@
1
+ export function slugifyUrl(url: URL): string {
2
+ // Decode any percent-encoded characters first
3
+ const decodedPath = decodeURIComponent(url.pathname);
4
+ return decodedPath
5
+ .split('/')
6
+ .map(segment =>
7
+ segment
8
+ .normalize('NFKD') // Normalize Unicode (é → e)
9
+ .replace(/[\u0300-\u036f]/g, '') // Remove accents
10
+ .toLowerCase()
11
+ .replace(/[^a-z0-9]+/g, '-') // Non-alphanumerics → hyphen
12
+ .replace(/^-+|-+$/g, '') // Trim hyphens
13
+ )
14
+ .filter(Boolean) // Remove empty segments
15
+ .join('/');
16
+ }