@gatewayfm/ups-sdk 0.1.14 → 0.1.16

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.
Files changed (41) hide show
  1. package/dist/account/index.d.mts +1 -1
  2. package/dist/account/index.d.ts +1 -1
  3. package/dist/account/index.js +2 -2
  4. package/dist/account/index.mjs +1 -1
  5. package/dist/{chunk-2S2KS5ZI.js → chunk-6S7HWY3Z.js} +17 -11
  6. package/dist/chunk-6S7HWY3Z.js.map +1 -0
  7. package/dist/{chunk-PMX24TXY.js → chunk-7M4ZN7F3.js} +50 -4
  8. package/dist/chunk-7M4ZN7F3.js.map +1 -0
  9. package/dist/{chunk-BUSFZFJS.mjs → chunk-EONLKSST.mjs} +11 -10
  10. package/dist/chunk-EONLKSST.mjs.map +1 -0
  11. package/dist/{chunk-VORGSH76.mjs → chunk-ULP4VMHK.mjs} +50 -5
  12. package/dist/chunk-ULP4VMHK.mjs.map +1 -0
  13. package/dist/{chunk-XKQI2VMJ.js → chunk-XFJ6SPQN.js} +11 -10
  14. package/dist/chunk-XFJ6SPQN.js.map +1 -0
  15. package/dist/{chunk-S65V52WZ.mjs → chunk-ZVB256ZP.mjs} +17 -11
  16. package/dist/chunk-ZVB256ZP.mjs.map +1 -0
  17. package/dist/{index-D_ytPgEV.d.ts → index-0emNrQ4Y.d.ts} +1 -1
  18. package/dist/{index-Csrh5-dl.d.mts → index-BEjQJc66.d.mts} +35 -4
  19. package/dist/{index-Csrh5-dl.d.ts → index-BEjQJc66.d.ts} +35 -4
  20. package/dist/{index-1p5DSytk.d.mts → index-bErQcXnC.d.mts} +1 -1
  21. package/dist/index.d.mts +35 -4
  22. package/dist/index.d.ts +35 -4
  23. package/dist/index.js +77 -33
  24. package/dist/index.js.map +1 -1
  25. package/dist/index.mjs +70 -30
  26. package/dist/index.mjs.map +1 -1
  27. package/dist/payment/index.d.mts +14 -2
  28. package/dist/payment/index.d.ts +14 -2
  29. package/dist/payment/index.js +2 -2
  30. package/dist/payment/index.mjs +1 -1
  31. package/dist/wallet/index.d.mts +2 -2
  32. package/dist/wallet/index.d.ts +2 -2
  33. package/dist/wallet/index.js +2 -2
  34. package/dist/wallet/index.mjs +1 -1
  35. package/package.json +1 -1
  36. package/dist/chunk-2S2KS5ZI.js.map +0 -1
  37. package/dist/chunk-BUSFZFJS.mjs.map +0 -1
  38. package/dist/chunk-PMX24TXY.js.map +0 -1
  39. package/dist/chunk-S65V52WZ.mjs.map +0 -1
  40. package/dist/chunk-VORGSH76.mjs.map +0 -1
  41. package/dist/chunk-XKQI2VMJ.js.map +0 -1
@@ -33,8 +33,8 @@ type EIP1193Provider = {
33
33
  method: string;
34
34
  params?: unknown[];
35
35
  }) => Promise<unknown>;
36
- on?: (event: string, handler: (...args: any[]) => void) => void;
37
- removeListener?: (event: string, handler: (...args: any[]) => void) => void;
36
+ on?: (event: string, handler: (...args: unknown[]) => void) => void;
37
+ removeListener?: (event: string, handler: (...args: unknown[]) => void) => void;
38
38
  };
39
39
  interface WalletState {
40
40
  isConnected: boolean;
@@ -81,7 +81,8 @@ interface PaymentRequirements {
81
81
  declare enum PaymentType {
82
82
  UNSPECIFIED = "UNSPECIFIED",
83
83
  DIRECT = "DIRECT",
84
- ESCROW = "ESCROW"
84
+ ESCROW = "ESCROW",
85
+ INVOICE = "INVOICE"
85
86
  }
86
87
  interface PaymentExtra {
87
88
  name?: string;
@@ -90,6 +91,8 @@ interface PaymentExtra {
90
91
  arbiter?: string;
91
92
  release_time?: number;
92
93
  payee?: string;
94
+ invoice_id?: string;
95
+ invoice_payment_type?: 'DIRECT' | 'ESCROW';
93
96
  }
94
97
  interface PaymentAuthorization {
95
98
  from: string;
@@ -156,5 +159,33 @@ interface EscrowActionResponse {
156
159
  transaction?: string;
157
160
  network?: string;
158
161
  }
162
+ type InvoiceStatus = 'UNSPECIFIED' | 'PENDING' | 'PARTIALLY_PAID' | 'PAID' | 'CANCELLED' | 'EXPIRED';
163
+ interface Invoice {
164
+ invoice_id: string;
165
+ merchant: string;
166
+ payer: string;
167
+ amount: string;
168
+ paid_amount: string;
169
+ due_date: number;
170
+ created_at: number;
171
+ payment_type: 'DIRECT' | 'ESCROW';
172
+ status: InvoiceStatus;
173
+ metadata_uri: string;
174
+ }
175
+ interface CreateInvoiceRequest {
176
+ merchant?: string;
177
+ amount: string;
178
+ payer?: string;
179
+ due_date: number;
180
+ payment_type: 'DIRECT' | 'ESCROW';
181
+ metadata_uri: string;
182
+ }
183
+ interface InvoiceResponse {
184
+ invoice: Invoice;
185
+ }
186
+ interface InvoiceListResponse {
187
+ invoices: Invoice[];
188
+ next_page_token: string;
189
+ }
159
190
 
160
- export { type AuthState as A, type ConnectResult as C, type Escrow as E, type PaymentAuthorization as P, type SettleResponse as S, type User as U, type VerifyResponse as V, type WalletState as W, type AuthResult as a, type EscrowActionResponse as b, type UPSConfig as c, type EIP1193Provider as d, type ConnectedWallet as e, type Account as f, type AccountStatus as g, type CreateAccountParams as h, type CreateAccountResponse as i, type EIP712Domain as j, type EIP712Type as k, type EIP712TypedData as l, type EscrowStatus as m, type PaymentExtra as n, type PaymentRequirements as o, PaymentType as p, type SignedAuthorization as q, type SupportedScheme as r, type SupportedSchemesResponse as s };
191
+ export { type AuthState as A, type ConnectResult as C, type Escrow as E, type InvoiceResponse as I, type PaymentAuthorization as P, type SettleResponse as S, type User as U, type VerifyResponse as V, type WalletState as W, type AuthResult as a, type EscrowActionResponse as b, type CreateInvoiceRequest as c, type InvoiceListResponse as d, type UPSConfig as e, type EIP1193Provider as f, type ConnectedWallet as g, type Account as h, type AccountStatus as i, type CreateAccountParams as j, type CreateAccountResponse as k, type EIP712Domain as l, type EIP712Type as m, type EIP712TypedData as n, type EscrowStatus as o, type Invoice as p, type InvoiceStatus as q, type PaymentExtra as r, type PaymentRequirements as s, PaymentType as t, type SignedAuthorization as u, type SupportedScheme as v, type SupportedSchemesResponse as w };
@@ -33,8 +33,8 @@ type EIP1193Provider = {
33
33
  method: string;
34
34
  params?: unknown[];
35
35
  }) => Promise<unknown>;
36
- on?: (event: string, handler: (...args: any[]) => void) => void;
37
- removeListener?: (event: string, handler: (...args: any[]) => void) => void;
36
+ on?: (event: string, handler: (...args: unknown[]) => void) => void;
37
+ removeListener?: (event: string, handler: (...args: unknown[]) => void) => void;
38
38
  };
39
39
  interface WalletState {
40
40
  isConnected: boolean;
@@ -81,7 +81,8 @@ interface PaymentRequirements {
81
81
  declare enum PaymentType {
82
82
  UNSPECIFIED = "UNSPECIFIED",
83
83
  DIRECT = "DIRECT",
84
- ESCROW = "ESCROW"
84
+ ESCROW = "ESCROW",
85
+ INVOICE = "INVOICE"
85
86
  }
86
87
  interface PaymentExtra {
87
88
  name?: string;
@@ -90,6 +91,8 @@ interface PaymentExtra {
90
91
  arbiter?: string;
91
92
  release_time?: number;
92
93
  payee?: string;
94
+ invoice_id?: string;
95
+ invoice_payment_type?: 'DIRECT' | 'ESCROW';
93
96
  }
94
97
  interface PaymentAuthorization {
95
98
  from: string;
@@ -156,5 +159,33 @@ interface EscrowActionResponse {
156
159
  transaction?: string;
157
160
  network?: string;
158
161
  }
162
+ type InvoiceStatus = 'UNSPECIFIED' | 'PENDING' | 'PARTIALLY_PAID' | 'PAID' | 'CANCELLED' | 'EXPIRED';
163
+ interface Invoice {
164
+ invoice_id: string;
165
+ merchant: string;
166
+ payer: string;
167
+ amount: string;
168
+ paid_amount: string;
169
+ due_date: number;
170
+ created_at: number;
171
+ payment_type: 'DIRECT' | 'ESCROW';
172
+ status: InvoiceStatus;
173
+ metadata_uri: string;
174
+ }
175
+ interface CreateInvoiceRequest {
176
+ merchant?: string;
177
+ amount: string;
178
+ payer?: string;
179
+ due_date: number;
180
+ payment_type: 'DIRECT' | 'ESCROW';
181
+ metadata_uri: string;
182
+ }
183
+ interface InvoiceResponse {
184
+ invoice: Invoice;
185
+ }
186
+ interface InvoiceListResponse {
187
+ invoices: Invoice[];
188
+ next_page_token: string;
189
+ }
159
190
 
160
- export { type AuthState as A, type ConnectResult as C, type Escrow as E, type PaymentAuthorization as P, type SettleResponse as S, type User as U, type VerifyResponse as V, type WalletState as W, type AuthResult as a, type EscrowActionResponse as b, type UPSConfig as c, type EIP1193Provider as d, type ConnectedWallet as e, type Account as f, type AccountStatus as g, type CreateAccountParams as h, type CreateAccountResponse as i, type EIP712Domain as j, type EIP712Type as k, type EIP712TypedData as l, type EscrowStatus as m, type PaymentExtra as n, type PaymentRequirements as o, PaymentType as p, type SignedAuthorization as q, type SupportedScheme as r, type SupportedSchemesResponse as s };
191
+ export { type AuthState as A, type ConnectResult as C, type Escrow as E, type InvoiceResponse as I, type PaymentAuthorization as P, type SettleResponse as S, type User as U, type VerifyResponse as V, type WalletState as W, type AuthResult as a, type EscrowActionResponse as b, type CreateInvoiceRequest as c, type InvoiceListResponse as d, type UPSConfig as e, type EIP1193Provider as f, type ConnectedWallet as g, type Account as h, type AccountStatus as i, type CreateAccountParams as j, type CreateAccountResponse as k, type EIP712Domain as l, type EIP712Type as m, type EIP712TypedData as n, type EscrowStatus as o, type Invoice as p, type InvoiceStatus as q, type PaymentExtra as r, type PaymentRequirements as s, PaymentType as t, type SignedAuthorization as u, type SupportedScheme as v, type SupportedSchemesResponse as w };
@@ -1,4 +1,4 @@
1
- import { W as WalletState, d as EIP1193Provider, e as ConnectedWallet, l as EIP712TypedData } from './index-Csrh5-dl.mjs';
1
+ import { W as WalletState, f as EIP1193Provider, g as ConnectedWallet, n as EIP712TypedData } from './index-BEjQJc66.mjs';
2
2
 
3
3
  type Callback<T = any> = (payload: T) => void;
4
4
  type Unsubscribe = () => void;
package/dist/index.d.mts CHANGED
@@ -1,7 +1,7 @@
1
- import { A as AuthState, C as ConnectResult, a as AuthResult, E as Escrow, b as EscrowActionResponse, U as User, c as UPSConfig, d as EIP1193Provider, e as ConnectedWallet } from './index-Csrh5-dl.mjs';
2
- export { f as Account, g as AccountStatus, h as CreateAccountParams, i as CreateAccountResponse, j as EIP712Domain, k as EIP712Type, l as EIP712TypedData, m as EscrowStatus, P as PaymentAuthorization, n as PaymentExtra, o as PaymentRequirements, p as PaymentType, S as SettleResponse, q as SignedAuthorization, r as SupportedScheme, s as SupportedSchemesResponse, V as VerifyResponse, W as WalletState } from './index-Csrh5-dl.mjs';
1
+ import { A as AuthState, C as ConnectResult, a as AuthResult, E as Escrow, b as EscrowActionResponse, c as CreateInvoiceRequest, I as InvoiceResponse, d as InvoiceListResponse, U as User, e as UPSConfig, f as EIP1193Provider, g as ConnectedWallet } from './index-BEjQJc66.mjs';
2
+ export { h as Account, i as AccountStatus, j as CreateAccountParams, k as CreateAccountResponse, l as EIP712Domain, m as EIP712Type, n as EIP712TypedData, o as EscrowStatus, p as Invoice, q as InvoiceStatus, P as PaymentAuthorization, r as PaymentExtra, s as PaymentRequirements, t as PaymentType, S as SettleResponse, u as SignedAuthorization, v as SupportedScheme, w as SupportedSchemesResponse, V as VerifyResponse, W as WalletState } from './index-BEjQJc66.mjs';
3
3
  import { H as HttpClient } from './http-client-D9JtkvUx.mjs';
4
- import { E as EventBus, W as WalletModule } from './index-1p5DSytk.mjs';
4
+ import { E as EventBus, W as WalletModule } from './index-bErQcXnC.mjs';
5
5
  import { AccountModule } from './account/index.mjs';
6
6
  import { PaymentModule } from './payment/index.mjs';
7
7
 
@@ -79,6 +79,36 @@ declare class EscrowModule {
79
79
  refund(escrowId: string, network: string): Promise<EscrowActionResponse>;
80
80
  }
81
81
 
82
+ declare class InvoiceModule {
83
+ private http;
84
+ constructor(http: HttpClient);
85
+ /**
86
+ * Create a new invoice
87
+ * @param request Invoice creation details
88
+ */
89
+ create(request: CreateInvoiceRequest): Promise<InvoiceResponse>;
90
+ /**
91
+ * Get invoice by ID
92
+ * @param id Invoice ID
93
+ */
94
+ get(id: string): Promise<InvoiceResponse>;
95
+ /**
96
+ * List invoices
97
+ * @param params Filter parameters
98
+ */
99
+ list(params?: {
100
+ merchant?: string;
101
+ payer?: string;
102
+ page_size?: number;
103
+ page_token?: string;
104
+ }): Promise<InvoiceListResponse>;
105
+ /**
106
+ * Cancel invoice
107
+ * @param id Invoice ID
108
+ */
109
+ cancel(id: string): Promise<InvoiceResponse>;
110
+ }
111
+
82
112
  /**
83
113
  * UserModule provides access to user profile operations.
84
114
  *
@@ -106,6 +136,7 @@ declare class UPSClient {
106
136
  readonly account: AccountModule;
107
137
  readonly payment: PaymentModule;
108
138
  readonly escrow: EscrowModule;
139
+ readonly invoice: InvoiceModule;
109
140
  readonly user: UserModule;
110
141
  private http;
111
142
  private eventBus;
@@ -127,4 +158,4 @@ declare class UPSClient {
127
158
  destroy(): void;
128
159
  }
129
160
 
130
- export { AccountModule, AuthError, AuthManager, AuthResult, AuthState, ConnectResult, ConnectedWallet, EIP1193Provider, Escrow, EscrowActionResponse, EscrowModule, EventBus, HttpClient, NetworkError, PaymentError, PaymentModule, RateLimitError, UPSClient, UPSConfig, UPSError, User, UserModule, WalletError, WalletModule };
161
+ export { AccountModule, AuthError, AuthManager, AuthResult, AuthState, ConnectResult, ConnectedWallet, CreateInvoiceRequest, EIP1193Provider, Escrow, EscrowActionResponse, EscrowModule, EventBus, HttpClient, InvoiceListResponse, InvoiceModule, InvoiceResponse, NetworkError, PaymentError, PaymentModule, RateLimitError, UPSClient, UPSConfig, UPSError, User, UserModule, WalletError, WalletModule };
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- import { A as AuthState, C as ConnectResult, a as AuthResult, E as Escrow, b as EscrowActionResponse, U as User, c as UPSConfig, d as EIP1193Provider, e as ConnectedWallet } from './index-Csrh5-dl.js';
2
- export { f as Account, g as AccountStatus, h as CreateAccountParams, i as CreateAccountResponse, j as EIP712Domain, k as EIP712Type, l as EIP712TypedData, m as EscrowStatus, P as PaymentAuthorization, n as PaymentExtra, o as PaymentRequirements, p as PaymentType, S as SettleResponse, q as SignedAuthorization, r as SupportedScheme, s as SupportedSchemesResponse, V as VerifyResponse, W as WalletState } from './index-Csrh5-dl.js';
1
+ import { A as AuthState, C as ConnectResult, a as AuthResult, E as Escrow, b as EscrowActionResponse, c as CreateInvoiceRequest, I as InvoiceResponse, d as InvoiceListResponse, U as User, e as UPSConfig, f as EIP1193Provider, g as ConnectedWallet } from './index-BEjQJc66.js';
2
+ export { h as Account, i as AccountStatus, j as CreateAccountParams, k as CreateAccountResponse, l as EIP712Domain, m as EIP712Type, n as EIP712TypedData, o as EscrowStatus, p as Invoice, q as InvoiceStatus, P as PaymentAuthorization, r as PaymentExtra, s as PaymentRequirements, t as PaymentType, S as SettleResponse, u as SignedAuthorization, v as SupportedScheme, w as SupportedSchemesResponse, V as VerifyResponse, W as WalletState } from './index-BEjQJc66.js';
3
3
  import { H as HttpClient } from './http-client-D9JtkvUx.js';
4
- import { E as EventBus, W as WalletModule } from './index-D_ytPgEV.js';
4
+ import { E as EventBus, W as WalletModule } from './index-0emNrQ4Y.js';
5
5
  import { AccountModule } from './account/index.js';
6
6
  import { PaymentModule } from './payment/index.js';
7
7
 
@@ -79,6 +79,36 @@ declare class EscrowModule {
79
79
  refund(escrowId: string, network: string): Promise<EscrowActionResponse>;
80
80
  }
81
81
 
82
+ declare class InvoiceModule {
83
+ private http;
84
+ constructor(http: HttpClient);
85
+ /**
86
+ * Create a new invoice
87
+ * @param request Invoice creation details
88
+ */
89
+ create(request: CreateInvoiceRequest): Promise<InvoiceResponse>;
90
+ /**
91
+ * Get invoice by ID
92
+ * @param id Invoice ID
93
+ */
94
+ get(id: string): Promise<InvoiceResponse>;
95
+ /**
96
+ * List invoices
97
+ * @param params Filter parameters
98
+ */
99
+ list(params?: {
100
+ merchant?: string;
101
+ payer?: string;
102
+ page_size?: number;
103
+ page_token?: string;
104
+ }): Promise<InvoiceListResponse>;
105
+ /**
106
+ * Cancel invoice
107
+ * @param id Invoice ID
108
+ */
109
+ cancel(id: string): Promise<InvoiceResponse>;
110
+ }
111
+
82
112
  /**
83
113
  * UserModule provides access to user profile operations.
84
114
  *
@@ -106,6 +136,7 @@ declare class UPSClient {
106
136
  readonly account: AccountModule;
107
137
  readonly payment: PaymentModule;
108
138
  readonly escrow: EscrowModule;
139
+ readonly invoice: InvoiceModule;
109
140
  readonly user: UserModule;
110
141
  private http;
111
142
  private eventBus;
@@ -127,4 +158,4 @@ declare class UPSClient {
127
158
  destroy(): void;
128
159
  }
129
160
 
130
- export { AccountModule, AuthError, AuthManager, AuthResult, AuthState, ConnectResult, ConnectedWallet, EIP1193Provider, Escrow, EscrowActionResponse, EscrowModule, EventBus, HttpClient, NetworkError, PaymentError, PaymentModule, RateLimitError, UPSClient, UPSConfig, UPSError, User, UserModule, WalletError, WalletModule };
161
+ export { AccountModule, AuthError, AuthManager, AuthResult, AuthState, ConnectResult, ConnectedWallet, CreateInvoiceRequest, EIP1193Provider, Escrow, EscrowActionResponse, EscrowModule, EventBus, HttpClient, InvoiceListResponse, InvoiceModule, InvoiceResponse, NetworkError, PaymentError, PaymentModule, RateLimitError, UPSClient, UPSConfig, UPSError, User, UserModule, WalletError, WalletModule };
package/dist/index.js CHANGED
@@ -1,18 +1,10 @@
1
1
  'use strict';
2
2
 
3
- var chunkXKQI2VMJ_js = require('./chunk-XKQI2VMJ.js');
4
- var chunkPMX24TXY_js = require('./chunk-PMX24TXY.js');
5
- var chunk2S2KS5ZI_js = require('./chunk-2S2KS5ZI.js');
3
+ var chunkXFJ6SPQN_js = require('./chunk-XFJ6SPQN.js');
4
+ var chunk7M4ZN7F3_js = require('./chunk-7M4ZN7F3.js');
5
+ var chunk6S7HWY3Z_js = require('./chunk-6S7HWY3Z.js');
6
6
  var chunkG525R6AV_js = require('./chunk-G525R6AV.js');
7
7
 
8
- // src/types/index.ts
9
- var PaymentType = /* @__PURE__ */ ((PaymentType2) => {
10
- PaymentType2["UNSPECIFIED"] = "UNSPECIFIED";
11
- PaymentType2["DIRECT"] = "DIRECT";
12
- PaymentType2["ESCROW"] = "ESCROW";
13
- return PaymentType2;
14
- })(PaymentType || {});
15
-
16
8
  // src/core/http-client.ts
17
9
  var HttpClient = class {
18
10
  baseUrl;
@@ -22,7 +14,7 @@ var HttpClient = class {
22
14
  constructor(config) {
23
15
  this.baseUrl = config.baseUrl.replace(/\/$/, "");
24
16
  this.timeout = config.timeout || 3e4;
25
- this.retryAttempts = config.retryAttempts || 3;
17
+ this.retryAttempts = config.retryAttempts ?? 3;
26
18
  this.getToken = config.getToken;
27
19
  }
28
20
  async request(path, options = {}) {
@@ -83,10 +75,11 @@ var HttpClient = class {
83
75
  if (error instanceof chunkG525R6AV_js.AuthError) {
84
76
  throw error;
85
77
  }
86
- if (error.name === "AbortError") {
87
- lastError = new chunkG525R6AV_js.NetworkError("Request timed out", error);
88
- } else if (!(error instanceof chunkG525R6AV_js.NetworkError) && !(error instanceof chunkG525R6AV_js.UPSError)) {
89
- lastError = new chunkG525R6AV_js.NetworkError(error.message || "Unknown error", error);
78
+ const e = error;
79
+ if (e.name === "AbortError") {
80
+ lastError = new chunkG525R6AV_js.NetworkError("Request timed out", e);
81
+ } else if (!(e instanceof chunkG525R6AV_js.NetworkError) && !(e instanceof chunkG525R6AV_js.UPSError)) {
82
+ lastError = new chunkG525R6AV_js.NetworkError(e.message || "Unknown error", e);
90
83
  }
91
84
  if (attempt < this.retryAttempts) {
92
85
  const waitTime = Math.pow(2, attempt) * 1e3;
@@ -203,7 +196,7 @@ var AuthManager = class {
203
196
  }, { skipAuth: true });
204
197
  const authResult = {
205
198
  token: result.token,
206
- expiresAt: result.expires_at || result.expiresAt
199
+ expiresAt: result.expires_at || result.expiresAt || new Date(Date.now() + 24 * 60 * 60 * 1e3).toISOString()
207
200
  };
208
201
  this.handleAuthSuccess(authResult, walletAddress);
209
202
  return authResult;
@@ -249,11 +242,12 @@ var AuthManager = class {
249
242
  }
250
243
  }
251
244
  mapUser(data) {
245
+ const d = data;
252
246
  return {
253
- id: data.id,
254
- walletAddress: data.wallet_address,
255
- status: data.status,
256
- createdAt: data.created_at
247
+ id: d.id,
248
+ walletAddress: d.wallet_address,
249
+ status: d.status,
250
+ createdAt: d.created_at
257
251
  };
258
252
  }
259
253
  logout() {
@@ -331,6 +325,48 @@ var EscrowModule = class {
331
325
  }
332
326
  };
333
327
 
328
+ // src/invoice/index.ts
329
+ var InvoiceModule = class {
330
+ constructor(http) {
331
+ this.http = http;
332
+ }
333
+ /**
334
+ * Create a new invoice
335
+ * @param request Invoice creation details
336
+ */
337
+ async create(request) {
338
+ return this.http.post("/invoices", request);
339
+ }
340
+ /**
341
+ * Get invoice by ID
342
+ * @param id Invoice ID
343
+ */
344
+ async get(id) {
345
+ return this.http.get(`/invoices/${id}`);
346
+ }
347
+ /**
348
+ * List invoices
349
+ * @param params Filter parameters
350
+ */
351
+ async list(params) {
352
+ const query = new URLSearchParams();
353
+ if (params?.merchant) query.append("merchant", params.merchant);
354
+ if (params?.payer) query.append("payer", params.payer);
355
+ if (params?.page_size) query.append("page_size", params.page_size.toString());
356
+ if (params?.page_token) query.append("page_token", params.page_token);
357
+ const queryString = query.toString();
358
+ const path = queryString ? `/invoices?${queryString}` : "/invoices";
359
+ return this.http.get(path);
360
+ }
361
+ /**
362
+ * Cancel invoice
363
+ * @param id Invoice ID
364
+ */
365
+ async cancel(id) {
366
+ return this.http.post(`/invoices/${id}/cancel`, {});
367
+ }
368
+ };
369
+
334
370
  // src/user/index.ts
335
371
  var UserModule = class {
336
372
  constructor(http) {
@@ -345,11 +381,12 @@ var UserModule = class {
345
381
  return this.mapUser(response.user);
346
382
  }
347
383
  mapUser(data) {
384
+ const d = data;
348
385
  return {
349
- id: data.id,
350
- walletAddress: data.wallet_address,
351
- status: data.status,
352
- createdAt: data.created_at
386
+ id: d.id,
387
+ walletAddress: d.wallet_address,
388
+ status: d.status,
389
+ createdAt: d.created_at
353
390
  };
354
391
  }
355
392
  };
@@ -362,6 +399,7 @@ var UPSClient = class {
362
399
  account;
363
400
  payment;
364
401
  escrow;
402
+ invoice;
365
403
  user;
366
404
  http;
367
405
  eventBus;
@@ -378,10 +416,11 @@ var UPSClient = class {
378
416
  getToken: () => this.auth.getToken()
379
417
  });
380
418
  this.auth = new AuthManager(this.http, this.eventBus, config.refreshInterval);
381
- this.wallet = new chunk2S2KS5ZI_js.WalletModule(this.eventBus);
382
- this.account = new chunkXKQI2VMJ_js.AccountModule(this.http);
383
- this.payment = new chunkPMX24TXY_js.PaymentModule(this.http, this.wallet);
419
+ this.wallet = new chunk6S7HWY3Z_js.WalletModule(this.eventBus);
420
+ this.account = new chunkXFJ6SPQN_js.AccountModule(this.http);
421
+ this.payment = new chunk7M4ZN7F3_js.PaymentModule(this.http, this.wallet);
384
422
  this.escrow = new EscrowModule(this.http);
423
+ this.invoice = new InvoiceModule(this.http);
385
424
  this.user = new UserModule(this.http);
386
425
  }
387
426
  async connect(provider) {
@@ -418,7 +457,8 @@ var UPSClient = class {
418
457
  const signature = await this.wallet.signMessage(loginMessage);
419
458
  await this.auth.login(address, loginMessage, signature);
420
459
  } catch (error) {
421
- const isAuthError = error.status === 404 || error.status === 401 || error.status === 400 || error.message?.includes("not found") || error.details?.message?.includes("not found");
460
+ const e = error;
461
+ const isAuthError = e.status === 404 || e.status === 401 || e.status === 400 || e.message?.includes?.("not found") || e.details?.message?.includes?.("not found");
422
462
  if (isAuthError) {
423
463
  const registerMessage = `Register for UPSx402`;
424
464
  const signature = await this.wallet.signMessage(registerMessage);
@@ -440,15 +480,19 @@ var UPSClient = class {
440
480
 
441
481
  Object.defineProperty(exports, "AccountModule", {
442
482
  enumerable: true,
443
- get: function () { return chunkXKQI2VMJ_js.AccountModule; }
483
+ get: function () { return chunkXFJ6SPQN_js.AccountModule; }
444
484
  });
445
485
  Object.defineProperty(exports, "PaymentModule", {
446
486
  enumerable: true,
447
- get: function () { return chunkPMX24TXY_js.PaymentModule; }
487
+ get: function () { return chunk7M4ZN7F3_js.PaymentModule; }
488
+ });
489
+ Object.defineProperty(exports, "PaymentType", {
490
+ enumerable: true,
491
+ get: function () { return chunk7M4ZN7F3_js.PaymentType; }
448
492
  });
449
493
  Object.defineProperty(exports, "WalletModule", {
450
494
  enumerable: true,
451
- get: function () { return chunk2S2KS5ZI_js.WalletModule; }
495
+ get: function () { return chunk6S7HWY3Z_js.WalletModule; }
452
496
  });
453
497
  Object.defineProperty(exports, "AuthError", {
454
498
  enumerable: true,
@@ -478,7 +522,7 @@ exports.AuthManager = AuthManager;
478
522
  exports.EscrowModule = EscrowModule;
479
523
  exports.EventBus = EventBus;
480
524
  exports.HttpClient = HttpClient;
481
- exports.PaymentType = PaymentType;
525
+ exports.InvoiceModule = InvoiceModule;
482
526
  exports.UPSClient = UPSClient;
483
527
  exports.UserModule = UserModule;
484
528
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types/index.ts","../src/core/http-client.ts","../src/core/event-bus.ts","../src/core/auth-manager.ts","../src/escrow/index.ts","../src/user/index.ts","../src/client.ts"],"names":["PaymentType","AuthError","NetworkError","UPSError","WalletModule","AccountModule","PaymentModule","WalletError"],"mappings":"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","file":"index.js","sourcesContent":["export interface UPSConfig {\n baseUrl: string; // API base URL\n network: string; // CAIP-2 format: \"eip155:737998412\"\n chainId?: number; // Optional, parsed from network if not provided\n timeout?: number; // Request timeout (default: 30000)\n retryAttempts?: number; // Retry count (default: 3)\n refreshInterval?: number; // Token refresh interval in ms (default: 60000 = 1 min)\n}\n\n// Authentication\nexport interface AuthState {\n isAuthenticated: boolean;\n token: string | null;\n expiresAt: Date | null;\n address: string | null;\n}\n\nexport interface AuthResult {\n token: string;\n expiresAt: string;\n}\n\n// User (from /auth/connect and /users/me)\nexport interface User {\n id: string;\n walletAddress: string;\n status: string;\n createdAt: string;\n}\n\n// Connect auth result (unified auth flow)\nexport interface ConnectResult {\n user: User;\n token: string;\n expiresAt: string;\n isNewUser: boolean;\n}\n\n// Wallet\nexport type EIP1193Provider = {\n request: (args: { method: string; params?: unknown[] }) => Promise<unknown>;\n on?: (event: string, handler: (...args: any[]) => void) => void;\n removeListener?: (event: string, handler: (...args: any[]) => void) => void;\n};\n\nexport interface WalletState {\n isConnected: boolean;\n address: string | null;\n chainId: number | null;\n provider: EIP1193Provider | null;\n}\n\nexport interface ConnectedWallet {\n address: string;\n chainId: number;\n provider: EIP1193Provider;\n}\n\n// Account\nexport type AccountStatus = 'pending' | 'kyc_in_progress' | 'active' | 'frozen' | 'closed';\n\nexport interface Account {\n id: string;\n ownerAddress: string;\n walletAddress: string;\n status: AccountStatus;\n kycLevel: number;\n userId?: string;\n createdAt: string;\n updatedAt?: string;\n}\n\nexport interface CreateAccountParams {\n ownerAddress: string;\n salt: string; // 0x-prefixed 32-byte hex\n}\n\nexport interface CreateAccountResponse {\n account: Account;\n txHash: string;\n}\n\n// Payment (x402)\nexport interface PaymentRequirements {\n scheme: string;\n network: string;\n maxAmountRequired: string;\n asset: string;\n payTo: string;\n maxTimeoutSeconds: number;\n resource?: string;\n description?: string;\n\n extra?: PaymentExtra;\n from?: string;\n}\n\nexport enum PaymentType {\n UNSPECIFIED = 'UNSPECIFIED',\n DIRECT = 'DIRECT',\n ESCROW = 'ESCROW'\n}\n\nexport interface PaymentExtra {\n name?: string;\n version?: string;\n payment_type?: PaymentType; // snake_case from API\n arbiter?: string;\n release_time?: number; // snake_case from API\n payee?: string; // intended recipient for escrow\n}\n\nexport interface PaymentAuthorization {\n from: string;\n to: string;\n value: string;\n validAfter: number;\n validBefore: number;\n nonce: string; // bytes32 hex\n}\n\nexport interface SignedAuthorization extends PaymentAuthorization {\n signature: string;\n}\n\nexport interface VerifyResponse {\n isValid: boolean;\n invalidReason?: string;\n payer?: string;\n}\n\nexport interface SettleResponse {\n success: boolean;\n errorReason?: string;\n transaction?: string;\n network?: string;\n payer?: string;\n}\n\n// x402 Supported Schemes\nexport interface SupportedScheme {\n x402Version: number;\n scheme: string;\n network: string;\n}\n\nexport interface SupportedSchemesResponse {\n kinds: SupportedScheme[];\n extensions?: string[];\n signers?: Record<string, string[]>;\n}\n\n// EIP-712 Typed Data\nexport interface EIP712Domain {\n name: string;\n version: string;\n chainId: number;\n verifyingContract: string;\n}\n\nexport interface EIP712Type {\n name: string;\n type: string;\n}\n\nexport interface EIP712TypedData {\n domain: EIP712Domain;\n types: Record<string, EIP712Type[]>;\n primaryType: string;\n message: Record<string, unknown>;\n}\n\n// Escrow\nexport interface Escrow {\n escrowId: string;\n payer: string;\n payee: string;\n amount: string;\n arbiter: string;\n releaseTime: number;\n status: EscrowStatus;\n}\n\nexport type EscrowStatus = 'ACTIVE' | 'RELEASED' | 'REFUNDED';\n\nexport interface EscrowActionResponse {\n success: boolean;\n errorReason?: string;\n transaction?: string;\n network?: string;\n}\n\n\n","import { NetworkError, AuthError, UPSError } from './errors';\n\ninterface HttpClientConfig {\n baseUrl: string;\n timeout?: number;\n retryAttempts?: number;\n getToken?: () => string | null;\n}\n\ninterface RequestOptions extends RequestInit {\n skipAuth?: boolean;\n}\n\nexport class HttpClient {\n private baseUrl: string;\n private timeout: number;\n private retryAttempts: number;\n private getToken?: () => string | null;\n\n constructor(config: HttpClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, '');\n this.timeout = config.timeout || 30000;\n this.retryAttempts = config.retryAttempts || 3;\n this.getToken = config.getToken;\n }\n\n async request<T>(path: string, options: RequestOptions = {}): Promise<T> {\n const url = `${this.baseUrl}${path.startsWith('/') ? path : '/' + path}`;\n const headers = new Headers(options.headers);\n\n if (!headers.has('Content-Type')) {\n headers.set('Content-Type', 'application/json');\n }\n\n if (!options.skipAuth && this.getToken) {\n const token = this.getToken();\n if (token) {\n headers.set('Authorization', `Bearer ${token}`);\n }\n }\n\n const config: RequestInit = {\n ...options,\n headers,\n };\n\n let lastError: Error | null = null;\n for (let attempt = 0; attempt <= this.retryAttempts; attempt++) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n ...config,\n signal: controller.signal,\n });\n\n if (response.status === 429) {\n const retryAfter = response.headers.get('Retry-After');\n const waitTime = retryAfter ? parseInt(retryAfter, 10) * 1000 : Math.pow(2, attempt) * 1000;\n await this.delay(waitTime);\n continue;\n }\n\n if (response.status === 401) {\n throw new AuthError('Authentication failed');\n }\n\n if (!response.ok) {\n let errorDetails;\n const text = await response.text();\n try {\n errorDetails = JSON.parse(text);\n } catch {\n errorDetails = text;\n }\n const detailsStr = typeof errorDetails === 'string' ? errorDetails : JSON.stringify(errorDetails);\n throw new NetworkError(`Request failed with status ${response.status}: ${detailsStr}`, errorDetails, response.status);\n }\n\n // Handle 204 No Content\n if (response.status === 204) {\n return undefined as unknown as T;\n }\n\n return await response.json();\n } finally {\n clearTimeout(timeoutId);\n }\n } catch (error: any) {\n lastError = error;\n\n if (error instanceof AuthError) {\n throw error;\n }\n\n if (error.name === 'AbortError') {\n lastError = new NetworkError('Request timed out', error);\n } else if (!(error instanceof NetworkError) && !(error instanceof UPSError)) {\n // Wrap unknown errors\n lastError = new NetworkError(error.message || 'Unknown error', error);\n }\n\n if (attempt < this.retryAttempts) {\n const waitTime = Math.pow(2, attempt) * 1000;\n await this.delay(waitTime);\n continue;\n }\n }\n }\n\n throw lastError || new NetworkError('Request failed after retries');\n }\n\n async get<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>(path, { ...options, method: 'GET' });\n }\n\n async post<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>(path, {\n ...options,\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","type Callback<T = any> = (payload: T) => void;\ntype Unsubscribe = () => void;\n\nexport class EventBus {\n private listeners: Map<string, Set<Callback>> = new Map();\n\n emit<T>(event: string, payload: T): void {\n const callbacks = this.listeners.get(event);\n if (callbacks) {\n callbacks.forEach((callback) => {\n try {\n callback(payload);\n } catch (error) {\n console.error(`Error in event handler for ${event}:`, error);\n }\n });\n }\n }\n\n on<T>(event: string, callback: Callback<T>): Unsubscribe {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(callback);\n\n return () => this.off(event, callback);\n }\n\n once<T>(event: string, callback: Callback<T>): Unsubscribe {\n const unsubscribe = this.on<T>(event, (payload) => {\n unsubscribe();\n callback(payload);\n });\n return unsubscribe;\n }\n\n off(event: string, callback: Callback): void {\n const callbacks = this.listeners.get(event);\n if (callbacks) {\n callbacks.delete(callback);\n if (callbacks.size === 0) {\n this.listeners.delete(event);\n }\n }\n }\n\n clear(): void {\n this.listeners.clear();\n }\n}\n","import { HttpClient } from './http-client';\nimport { EventBus } from './event-bus';\nimport { AuthState, AuthResult, ConnectResult, User } from '../types';\n\nexport class AuthManager {\n private _state: AuthState = {\n isAuthenticated: false,\n token: null,\n expiresAt: null,\n address: null,\n };\n private refreshTimer: NodeJS.Timeout | null = null;\n private refreshInterval: number;\n\n constructor(\n private http: HttpClient,\n private eventBus: EventBus,\n refreshInterval: number = 60000 // Default 1 minute\n ) {\n this.refreshInterval = refreshInterval;\n }\n\n get state(): AuthState {\n return { ...this._state };\n }\n\n /**\n * Unified connect method - creates user if new, authenticates if existing\n * This is the preferred authentication method.\n */\n async connect(walletAddress: string, message: string, signature: string): Promise<ConnectResult> {\n const result = await this.http.post<any>('/auth/connect', {\n wallet_address: walletAddress,\n message,\n signature,\n }, { skipAuth: true });\n\n const connectResult: ConnectResult = {\n user: this.mapUser(result.user),\n token: result.token,\n expiresAt: result.expires_at,\n isNewUser: result.is_new_user ?? false,\n };\n\n this.handleAuthSuccess({ token: result.token, expiresAt: result.expires_at }, walletAddress);\n return connectResult;\n }\n\n /**\n * @deprecated Use connect() instead\n */\n async login(walletAddress: string, message: string, signature: string): Promise<AuthResult> {\n const result = await this.http.post<any>('/auth/login', {\n wallet_address: walletAddress,\n message,\n signature,\n }, { skipAuth: true });\n\n const authResult: AuthResult = {\n token: result.token,\n expiresAt: result.expires_at || result.expiresAt,\n };\n\n this.handleAuthSuccess(authResult, walletAddress);\n return authResult;\n }\n\n /**\n * @deprecated Use connect() instead\n */\n async register(walletAddress: string, message: string, signature: string): Promise<AuthResult> {\n const result = await this.http.post<any>('/auth/register', {\n wallet_address: walletAddress,\n message,\n signature,\n }, { skipAuth: true });\n\n const authResult: AuthResult = {\n token: result.token,\n expiresAt: result.expires_at || result.expiresAt || new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(),\n };\n\n this.handleAuthSuccess(authResult, walletAddress);\n return authResult;\n }\n\n private handleAuthSuccess(result: AuthResult, walletAddress: string) {\n this.updateState({\n isAuthenticated: true,\n token: result.token,\n expiresAt: new Date(result.expiresAt),\n address: walletAddress,\n });\n this.scheduleRefresh();\n }\n\n async refresh(): Promise<void> {\n if (!this._state.token) return;\n\n try {\n const result = await this.http.post<{ token: string; expires_at: string }>('/auth/refresh');\n\n this.updateState({\n ...this._state,\n token: result.token,\n expiresAt: new Date(result.expires_at),\n });\n\n this.scheduleRefresh();\n } catch (error) {\n console.error('Token refresh failed:', error);\n this.logout();\n }\n }\n\n private mapUser(data: any): User {\n return {\n id: data.id,\n walletAddress: data.wallet_address,\n status: data.status,\n createdAt: data.created_at,\n };\n }\n\n logout(): void {\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = null;\n }\n\n this.updateState({\n isAuthenticated: false,\n token: null,\n expiresAt: null,\n address: null,\n });\n }\n\n getToken(): string | null {\n return this._state.token;\n }\n\n isAuthenticated(): boolean {\n return this._state.isAuthenticated;\n }\n\n onStateChange(callback: (state: AuthState) => void): () => void {\n return this.eventBus.on('auth:changed', callback);\n }\n\n private updateState(newState: AuthState) {\n this._state = newState;\n this.eventBus.emit('auth:changed', this._state);\n }\n\n private scheduleRefresh() {\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n }\n\n if (!this._state.expiresAt) return;\n\n const expiresAt = this._state.expiresAt.getTime();\n const now = Date.now();\n\n // If token is already expired, don't schedule refresh\n if (expiresAt <= now) {\n return;\n }\n\n // Schedule refresh at the configured interval (e.g., 1 hour)\n // But ensure we refresh before the token expires\n const timeUntilExpiry = expiresAt - now;\n const refreshTime = Math.min(this.refreshInterval, timeUntilExpiry - 60000); // At least 1 min buffer\n\n if (refreshTime > 0) {\n this.refreshTimer = setTimeout(() => this.refresh(), refreshTime);\n }\n }\n}\n","import { HttpClient } from '../core/http-client';\nimport { Escrow, EscrowActionResponse } from '../types';\n\nexport class EscrowModule {\n constructor(private http: HttpClient) { }\n\n /**\n * Get escrow details by ID\n * @param escrowId Escrow ID\n */\n async get(escrowId: string): Promise<Escrow> {\n return this.http.get<Escrow>(`/x402/escrow/${escrowId}`, { skipAuth: false });\n }\n\n /**\n * Release escrow funds (Payer or Arbiter only)\n * @param escrowId Escrow ID\n */\n async release(escrowId: string, network: string): Promise<EscrowActionResponse> {\n return this.http.post<EscrowActionResponse>(`/x402/escrow/${escrowId}/release`, {\n network\n });\n }\n\n /**\n * Refund escrow funds (Arbiter only)\n * @param escrowId Escrow ID\n */\n async refund(escrowId: string, network: string): Promise<EscrowActionResponse> {\n return this.http.post<EscrowActionResponse>(`/x402/escrow/${escrowId}/refund`, {\n network\n });\n }\n}\n","import { HttpClient } from '../core/http-client';\nimport { User } from '../types';\n\n/**\n * UserModule provides access to user profile operations.\n * \n * @example\n * ```typescript\n * const user = await client.user.getCurrentUser();\n * console.log(user.id, user.walletAddress);\n * ```\n */\nexport class UserModule {\n constructor(private http: HttpClient) { }\n\n /**\n * Get the current authenticated user's profile.\n * Requires authentication.\n */\n async getCurrentUser(): Promise<User> {\n const response = await this.http.get<{ user: any }>('/users/me');\n return this.mapUser(response.user);\n }\n\n private mapUser(data: any): User {\n return {\n id: data.id,\n walletAddress: data.wallet_address,\n status: data.status,\n createdAt: data.created_at,\n };\n }\n}\n","import { HttpClient } from './core/http-client';\nimport { EventBus } from './core/event-bus';\nimport { AuthManager } from './core/auth-manager';\nimport { WalletModule } from './wallet';\nimport { AccountModule } from './account';\nimport { PaymentModule } from './payment';\nimport { EscrowModule } from './escrow';\nimport { UserModule } from './user';\nimport { UPSConfig, ConnectedWallet, EIP1193Provider, ConnectResult } from './types';\nimport { WalletError } from './core/errors';\n\nexport class UPSClient {\n readonly config: UPSConfig;\n readonly wallet: WalletModule;\n readonly auth: AuthManager;\n readonly account: AccountModule;\n readonly payment: PaymentModule;\n readonly escrow: EscrowModule;\n readonly user: UserModule;\n\n private http: HttpClient;\n private eventBus: EventBus;\n\n constructor(config: UPSConfig) {\n this.config = config;\n\n // Parse chainId if not provided but network is \"eip155:123\"\n if (!this.config.chainId && this.config.network.startsWith('eip155:')) {\n this.config.chainId = parseInt(this.config.network.split(':')[1], 10);\n }\n\n this.eventBus = new EventBus();\n\n this.http = new HttpClient({\n baseUrl: config.baseUrl,\n timeout: config.timeout,\n retryAttempts: config.retryAttempts,\n getToken: () => this.auth.getToken(),\n });\n\n this.auth = new AuthManager(this.http, this.eventBus, config.refreshInterval);\n this.wallet = new WalletModule(this.eventBus);\n this.account = new AccountModule(this.http);\n this.payment = new PaymentModule(this.http, this.wallet);\n this.escrow = new EscrowModule(this.http);\n this.user = new UserModule(this.http);\n }\n\n async connect(provider: EIP1193Provider): Promise<ConnectedWallet> {\n return this.wallet.connect(provider);\n }\n\n /**\n * Authenticate with the UPS backend using the unified /auth/connect endpoint.\n * This will create a new user if one doesn't exist, or authenticate an existing user.\n * \n * @returns ConnectResult containing user info and whether this is a new user\n */\n async authenticate(): Promise<ConnectResult> {\n if (!this.wallet.isConnected()) {\n throw new WalletError('Wallet must be connected to authenticate');\n }\n\n const address = this.wallet.getAddress();\n if (!address) throw new WalletError('No wallet address available');\n\n const message = `Connect to UPSx402`;\n const signature = await this.wallet.signMessage(message);\n\n return this.auth.connect(address, message, signature);\n }\n\n /**\n * @deprecated Use authenticate() instead which uses the unified /auth/connect endpoint.\n * This method uses the legacy login/register flow.\n */\n async authenticateLegacy(): Promise<void> {\n if (!this.wallet.isConnected()) {\n throw new WalletError('Wallet must be connected to authenticate');\n }\n\n const address = this.wallet.getAddress();\n if (!address) throw new WalletError('No wallet address available');\n\n // Try Login\n const loginMessage = `Login to UPSx402`;\n try {\n const signature = await this.wallet.signMessage(loginMessage);\n await this.auth.login(address, loginMessage, signature);\n } catch (error: any) {\n // If related to \"User not found\" or 404/401/400, try Register\n const isAuthError = error.status === 404 || error.status === 401 || error.status === 400 || error.message?.includes('not found') || error.details?.message?.includes('not found');\n\n if (isAuthError) {\n const registerMessage = `Register for UPSx402`;\n const signature = await this.wallet.signMessage(registerMessage);\n await this.auth.register(address, registerMessage, signature);\n } else {\n throw error;\n }\n }\n }\n\n async disconnect(): Promise<void> {\n await this.wallet.disconnect();\n this.auth.logout();\n }\n\n destroy(): void {\n this.auth.logout(); // Clears refresh timer\n this.eventBus.clear();\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/core/http-client.ts","../src/core/event-bus.ts","../src/core/auth-manager.ts","../src/escrow/index.ts","../src/invoice/index.ts","../src/user/index.ts","../src/client.ts"],"names":["AuthError","NetworkError","UPSError","WalletModule","AccountModule","PaymentModule","WalletError"],"mappings":"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","file":"index.js","sourcesContent":["import { NetworkError, AuthError, UPSError } from './errors';\n\ninterface HttpClientConfig {\n baseUrl: string;\n timeout?: number;\n retryAttempts?: number;\n getToken?: () => string | null;\n}\n\ninterface RequestOptions extends RequestInit {\n skipAuth?: boolean;\n}\n\nexport class HttpClient {\n private baseUrl: string;\n private timeout: number;\n private retryAttempts: number;\n private getToken?: () => string | null;\n\n constructor(config: HttpClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, '');\n this.timeout = config.timeout || 30000;\n this.retryAttempts = config.retryAttempts ?? 3;\n this.getToken = config.getToken;\n }\n\n async request<T>(path: string, options: RequestOptions = {}): Promise<T> {\n const url = `${this.baseUrl}${path.startsWith('/') ? path : '/' + path}`;\n const headers = new Headers(options.headers);\n\n if (!headers.has('Content-Type')) {\n headers.set('Content-Type', 'application/json');\n }\n\n if (!options.skipAuth && this.getToken) {\n const token = this.getToken();\n if (token) {\n headers.set('Authorization', `Bearer ${token}`);\n }\n }\n\n const config: RequestInit = {\n ...options,\n headers,\n };\n\n let lastError: Error | null = null;\n for (let attempt = 0; attempt <= this.retryAttempts; attempt++) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n ...config,\n signal: controller.signal,\n });\n\n if (response.status === 429) {\n const retryAfter = response.headers.get('Retry-After');\n const waitTime = retryAfter ? parseInt(retryAfter, 10) * 1000 : Math.pow(2, attempt) * 1000;\n await this.delay(waitTime);\n continue;\n }\n\n if (response.status === 401) {\n throw new AuthError('Authentication failed');\n }\n\n if (!response.ok) {\n let errorDetails;\n const text = await response.text();\n try {\n errorDetails = JSON.parse(text);\n } catch {\n errorDetails = text;\n }\n const detailsStr = typeof errorDetails === 'string' ? errorDetails : JSON.stringify(errorDetails);\n throw new NetworkError(`Request failed with status ${response.status}: ${detailsStr}`, errorDetails, response.status);\n }\n\n // Handle 204 No Content\n if (response.status === 204) {\n return undefined as unknown as T;\n }\n\n return await response.json();\n } finally {\n clearTimeout(timeoutId);\n }\n } catch (error: unknown) {\n lastError = error as Error;\n\n if (error instanceof AuthError) {\n throw error;\n }\n\n const e = error as Error;\n\n if (e.name === 'AbortError') {\n lastError = new NetworkError('Request timed out', e);\n } else if (!(e instanceof NetworkError) && !(e instanceof UPSError)) {\n // Wrap unknown errors\n lastError = new NetworkError(e.message || 'Unknown error', e);\n }\n\n if (attempt < this.retryAttempts) {\n const waitTime = Math.pow(2, attempt) * 1000;\n await this.delay(waitTime);\n continue;\n }\n }\n }\n\n throw lastError || new NetworkError('Request failed after retries');\n }\n\n async get<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>(path, { ...options, method: 'GET' });\n }\n\n async post<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>(path, {\n ...options,\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","type Callback<T = any> = (payload: T) => void;\ntype Unsubscribe = () => void;\n\nexport class EventBus {\n private listeners: Map<string, Set<Callback>> = new Map();\n\n emit<T>(event: string, payload: T): void {\n const callbacks = this.listeners.get(event);\n if (callbacks) {\n callbacks.forEach((callback) => {\n try {\n callback(payload);\n } catch (error) {\n console.error(`Error in event handler for ${event}:`, error);\n }\n });\n }\n }\n\n on<T>(event: string, callback: Callback<T>): Unsubscribe {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(callback);\n\n return () => this.off(event, callback);\n }\n\n once<T>(event: string, callback: Callback<T>): Unsubscribe {\n const unsubscribe = this.on<T>(event, (payload) => {\n unsubscribe();\n callback(payload);\n });\n return unsubscribe;\n }\n\n off(event: string, callback: Callback): void {\n const callbacks = this.listeners.get(event);\n if (callbacks) {\n callbacks.delete(callback);\n if (callbacks.size === 0) {\n this.listeners.delete(event);\n }\n }\n }\n\n clear(): void {\n this.listeners.clear();\n }\n}\n","import { HttpClient } from './http-client';\nimport { EventBus } from './event-bus';\nimport { AuthState, AuthResult, ConnectResult, User } from '../types';\n\nexport class AuthManager {\n private _state: AuthState = {\n isAuthenticated: false,\n token: null,\n expiresAt: null,\n address: null,\n };\n private refreshTimer: NodeJS.Timeout | null = null;\n private refreshInterval: number;\n\n constructor(\n private http: HttpClient,\n private eventBus: EventBus,\n refreshInterval: number = 60000 // Default 1 minute\n ) {\n this.refreshInterval = refreshInterval;\n }\n\n get state(): AuthState {\n return { ...this._state };\n }\n\n /**\n * Unified connect method - creates user if new, authenticates if existing\n * This is the preferred authentication method.\n */\n async connect(walletAddress: string, message: string, signature: string): Promise<ConnectResult> {\n const result = await this.http.post<{ user: unknown; token: string; expires_at: string; is_new_user?: boolean }>('/auth/connect', {\n wallet_address: walletAddress,\n message,\n signature,\n }, { skipAuth: true });\n\n const connectResult: ConnectResult = {\n user: this.mapUser(result.user),\n token: result.token,\n expiresAt: result.expires_at,\n isNewUser: result.is_new_user ?? false,\n };\n\n this.handleAuthSuccess({ token: result.token, expiresAt: result.expires_at }, walletAddress);\n return connectResult;\n }\n\n /**\n * @deprecated Use connect() instead\n */\n async login(walletAddress: string, message: string, signature: string): Promise<AuthResult> {\n const result = await this.http.post<{ token: string; expires_at?: string; expiresAt?: string }>('/auth/login', {\n wallet_address: walletAddress,\n message,\n signature,\n }, { skipAuth: true });\n\n const authResult: AuthResult = {\n token: result.token,\n expiresAt: result.expires_at || result.expiresAt || new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(),\n };\n\n this.handleAuthSuccess(authResult, walletAddress);\n return authResult;\n }\n\n /**\n * @deprecated Use connect() instead\n */\n async register(walletAddress: string, message: string, signature: string): Promise<AuthResult> {\n const result = await this.http.post<{ token: string; expires_at?: string; expiresAt?: string }>('/auth/register', {\n wallet_address: walletAddress,\n message,\n signature,\n }, { skipAuth: true });\n\n const authResult: AuthResult = {\n token: result.token,\n expiresAt: result.expires_at || result.expiresAt || new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(),\n };\n\n this.handleAuthSuccess(authResult, walletAddress);\n return authResult;\n }\n\n private handleAuthSuccess(result: AuthResult, walletAddress: string) {\n this.updateState({\n isAuthenticated: true,\n token: result.token,\n expiresAt: new Date(result.expiresAt),\n address: walletAddress,\n });\n this.scheduleRefresh();\n }\n\n async refresh(): Promise<void> {\n if (!this._state.token) return;\n\n try {\n const result = await this.http.post<{ token: string; expires_at: string }>('/auth/refresh');\n\n this.updateState({\n ...this._state,\n token: result.token,\n expiresAt: new Date(result.expires_at),\n });\n\n this.scheduleRefresh();\n } catch (error) {\n console.error('Token refresh failed:', error);\n this.logout();\n }\n }\n\n private mapUser(data: any): User {\n const d = data as any;\n return {\n id: d.id,\n walletAddress: d.wallet_address,\n status: d.status,\n createdAt: d.created_at,\n };\n }\n\n logout(): void {\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = null;\n }\n\n this.updateState({\n isAuthenticated: false,\n token: null,\n expiresAt: null,\n address: null,\n });\n }\n\n getToken(): string | null {\n return this._state.token;\n }\n\n isAuthenticated(): boolean {\n return this._state.isAuthenticated;\n }\n\n onStateChange(callback: (state: AuthState) => void): () => void {\n return this.eventBus.on('auth:changed', callback);\n }\n\n private updateState(newState: AuthState) {\n this._state = newState;\n this.eventBus.emit('auth:changed', this._state);\n }\n\n private scheduleRefresh() {\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n }\n\n if (!this._state.expiresAt) return;\n\n const expiresAt = this._state.expiresAt.getTime();\n const now = Date.now();\n\n // If token is already expired, don't schedule refresh\n if (expiresAt <= now) {\n return;\n }\n\n // Schedule refresh at the configured interval (e.g., 1 hour)\n // But ensure we refresh before the token expires\n const timeUntilExpiry = expiresAt - now;\n const refreshTime = Math.min(this.refreshInterval, timeUntilExpiry - 60000); // At least 1 min buffer\n\n if (refreshTime > 0) {\n this.refreshTimer = setTimeout(() => this.refresh(), refreshTime);\n }\n }\n}\n","import { HttpClient } from '../core/http-client';\nimport { Escrow, EscrowActionResponse } from '../types';\n\nexport class EscrowModule {\n constructor(private http: HttpClient) { }\n\n /**\n * Get escrow details by ID\n * @param escrowId Escrow ID\n */\n async get(escrowId: string): Promise<Escrow> {\n return this.http.get<Escrow>(`/x402/escrow/${escrowId}`, { skipAuth: false });\n }\n\n /**\n * Release escrow funds (Payer or Arbiter only)\n * @param escrowId Escrow ID\n */\n async release(escrowId: string, network: string): Promise<EscrowActionResponse> {\n return this.http.post<EscrowActionResponse>(`/x402/escrow/${escrowId}/release`, {\n network\n });\n }\n\n /**\n * Refund escrow funds (Arbiter only)\n * @param escrowId Escrow ID\n */\n async refund(escrowId: string, network: string): Promise<EscrowActionResponse> {\n return this.http.post<EscrowActionResponse>(`/x402/escrow/${escrowId}/refund`, {\n network\n });\n }\n}\n","import { HttpClient } from '../core/http-client';\nimport {\n CreateInvoiceRequest,\n InvoiceResponse,\n InvoiceListResponse\n} from '../types';\n\nexport class InvoiceModule {\n constructor(private http: HttpClient) { }\n\n /**\n * Create a new invoice\n * @param request Invoice creation details\n */\n async create(request: CreateInvoiceRequest): Promise<InvoiceResponse> {\n return this.http.post<InvoiceResponse>('/invoices', request);\n }\n\n /**\n * Get invoice by ID\n * @param id Invoice ID\n */\n async get(id: string): Promise<InvoiceResponse> {\n return this.http.get<InvoiceResponse>(`/invoices/${id}`);\n }\n\n /**\n * List invoices\n * @param params Filter parameters\n */\n async list(params?: { merchant?: string; payer?: string; page_size?: number; page_token?: string }): Promise<InvoiceListResponse> {\n const query = new URLSearchParams();\n if (params?.merchant) query.append('merchant', params.merchant);\n if (params?.payer) query.append('payer', params.payer);\n if (params?.page_size) query.append('page_size', params.page_size.toString());\n if (params?.page_token) query.append('page_token', params.page_token);\n\n const queryString = query.toString();\n const path = queryString ? `/invoices?${queryString}` : '/invoices';\n\n return this.http.get<InvoiceListResponse>(path);\n }\n\n /**\n * Cancel invoice\n * @param id Invoice ID\n */\n async cancel(id: string): Promise<InvoiceResponse> {\n return this.http.post<InvoiceResponse>(`/invoices/${id}/cancel`, {});\n }\n}\n","import { HttpClient } from '../core/http-client';\nimport { User } from '../types';\n\n/**\n * UserModule provides access to user profile operations.\n * \n * @example\n * ```typescript\n * const user = await client.user.getCurrentUser();\n * console.log(user.id, user.walletAddress);\n * ```\n */\nexport class UserModule {\n constructor(private http: HttpClient) { }\n\n /**\n * Get the current authenticated user's profile.\n * Requires authentication.\n */\n async getCurrentUser(): Promise<User> {\n const response = await this.http.get<{ user: unknown }>('/users/me');\n return this.mapUser(response.user);\n }\n\n private mapUser(data: any): User {\n const d = data as any;\n return {\n id: d.id,\n walletAddress: d.wallet_address,\n status: d.status,\n createdAt: d.created_at,\n };\n }\n}\n","import { HttpClient } from './core/http-client';\nimport { EventBus } from './core/event-bus';\nimport { AuthManager } from './core/auth-manager';\nimport { WalletModule } from './wallet';\nimport { AccountModule } from './account';\nimport { PaymentModule } from './payment';\nimport { EscrowModule } from './escrow';\nimport { InvoiceModule } from './invoice';\nimport { UserModule } from './user';\nimport { UPSConfig, ConnectedWallet, EIP1193Provider, ConnectResult } from './types';\nimport { WalletError } from './core/errors';\n\nexport class UPSClient {\n readonly config: UPSConfig;\n readonly wallet: WalletModule;\n readonly auth: AuthManager;\n readonly account: AccountModule;\n readonly payment: PaymentModule;\n readonly escrow: EscrowModule;\n readonly invoice: InvoiceModule;\n readonly user: UserModule;\n\n private http: HttpClient;\n private eventBus: EventBus;\n\n constructor(config: UPSConfig) {\n this.config = config;\n\n // Parse chainId if not provided but network is \"eip155:123\"\n if (!this.config.chainId && this.config.network.startsWith('eip155:')) {\n this.config.chainId = parseInt(this.config.network.split(':')[1], 10);\n }\n\n this.eventBus = new EventBus();\n\n this.http = new HttpClient({\n baseUrl: config.baseUrl,\n timeout: config.timeout,\n retryAttempts: config.retryAttempts,\n getToken: () => this.auth.getToken(),\n });\n\n this.auth = new AuthManager(this.http, this.eventBus, config.refreshInterval);\n this.wallet = new WalletModule(this.eventBus);\n this.account = new AccountModule(this.http);\n this.payment = new PaymentModule(this.http, this.wallet);\n this.escrow = new EscrowModule(this.http);\n this.invoice = new InvoiceModule(this.http);\n this.user = new UserModule(this.http);\n }\n\n async connect(provider: EIP1193Provider): Promise<ConnectedWallet> {\n return this.wallet.connect(provider);\n }\n\n /**\n * Authenticate with the UPS backend using the unified /auth/connect endpoint.\n * This will create a new user if one doesn't exist, or authenticate an existing user.\n * \n * @returns ConnectResult containing user info and whether this is a new user\n */\n async authenticate(): Promise<ConnectResult> {\n if (!this.wallet.isConnected()) {\n throw new WalletError('Wallet must be connected to authenticate');\n }\n\n const address = this.wallet.getAddress();\n if (!address) throw new WalletError('No wallet address available');\n\n const message = `Connect to UPSx402`;\n const signature = await this.wallet.signMessage(message);\n\n return this.auth.connect(address, message, signature);\n }\n\n /**\n * @deprecated Use authenticate() instead which uses the unified /auth/connect endpoint.\n * This method uses the legacy login/register flow.\n */\n async authenticateLegacy(): Promise<void> {\n if (!this.wallet.isConnected()) {\n throw new WalletError('Wallet must be connected to authenticate');\n }\n\n const address = this.wallet.getAddress();\n if (!address) throw new WalletError('No wallet address available');\n\n // Try Login\n const loginMessage = `Login to UPSx402`;\n try {\n const signature = await this.wallet.signMessage(loginMessage);\n await this.auth.login(address, loginMessage, signature);\n } catch (error: unknown) {\n // If related to \"User not found\" or 404/401/400, try Register\n const e = error as any; // Cast to any to check specific properties safely\n const isAuthError = e.status === 404 || e.status === 401 || e.status === 400 ||\n e.message?.includes?.('not found') ||\n e.details?.message?.includes?.('not found');\n\n if (isAuthError) {\n const registerMessage = `Register for UPSx402`;\n const signature = await this.wallet.signMessage(registerMessage);\n await this.auth.register(address, registerMessage, signature);\n } else {\n throw error;\n }\n }\n }\n\n async disconnect(): Promise<void> {\n await this.wallet.disconnect();\n this.auth.logout();\n }\n\n destroy(): void {\n this.auth.logout(); // Clears refresh timer\n this.eventBus.clear();\n }\n}\n"]}