@lavapayments/nodejs 0.1.0

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 ADDED
@@ -0,0 +1,117 @@
1
+ # @lavapayments/nodejs
2
+
3
+ Backend SDK for Lava Payments API - enabling usage-based billing for AI services.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @lavapayments/nodejs
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ### Initialize the client
14
+
15
+ ```typescript
16
+ import Lava from '@lavapayments/nodejs';
17
+
18
+ const lava = new Lava('your_secret_key', {
19
+ apiVersion: '2025-03-10.v1',
20
+ });
21
+ ```
22
+
23
+ ### Create a checkout session
24
+
25
+ ```typescript
26
+ const checkoutSession = await lava.checkout.create({
27
+ checkout_mode: 'onboarding', // or 'topup' for existing connections
28
+ origin_url: 'https://your-app.com/', // Must match window.location.origin where checkout will be opened
29
+ reference_id: 'user_123', // Optional: your user ID for tracking this connection
30
+ });
31
+
32
+ // Use checkout_session_token with @lavapayments/checkout on frontend
33
+ console.log(checkoutSession.checkout_session_token);
34
+ ```
35
+
36
+ ### Make a request to an AI provider
37
+
38
+ ```typescript
39
+ // Generate a forward token
40
+ const forwardToken = lava.generateForwardToken({
41
+ connection_secret: 'connection_secret',
42
+ product_secret: 'product_secret',
43
+ });
44
+
45
+ // Use the token to make an API request through Lava's proxy
46
+ const response = await fetch(lava.openaiUrl, {
47
+ method: 'POST',
48
+ headers: {
49
+ 'Content-Type': 'application/json',
50
+ 'Authorization': `Bearer ${forwardToken}`
51
+ },
52
+ body: JSON.stringify({
53
+ model: 'gpt-4',
54
+ messages: [
55
+ { role: 'user', content: 'Hello, world!' }
56
+ ]
57
+ })
58
+ });
59
+
60
+ // Get the Lava request ID from the response header
61
+ const requestId = response.headers.get('x-lava-request-id');
62
+ console.log('Lava request ID:', requestId);
63
+
64
+ const data = await response.json();
65
+ console.log(data);
66
+ ```
67
+
68
+ ### Check a connection's balance
69
+
70
+ ```typescript
71
+ const connection = await lava.connections.retrieve('connection_id');
72
+ console.log('Current balance:', connection.wallet.balance);
73
+ ```
74
+
75
+ ### Get connection requests
76
+
77
+ ```typescript
78
+ const requests = await lava.requests.list({
79
+ connection_id: 'connection_id',
80
+ limit: 10,
81
+ });
82
+
83
+ console.log(requests.data);
84
+ ```
85
+
86
+ ### Get usage statistics
87
+
88
+ ```typescript
89
+ const usage = await lava.usage.retrieve({
90
+ connection_id: 'connection_id',
91
+ start: '2024-01-01T00:00:00Z',
92
+ end: '2024-01-31T23:59:59Z',
93
+ });
94
+
95
+ console.log(usage);
96
+ ```
97
+
98
+ ## Supported AI Providers
99
+
100
+ Convenience URLs are provided for the following AI providers:
101
+
102
+ - OpenAI: `lava.openaiUrl`
103
+ - Anthropic: `lava.anthropicUrl`
104
+ - Mistral: `lava.mistralUrl`
105
+ - DeepSeek: `lava.deepseekUrl`
106
+ - xAI: `lava.xaiUrl`
107
+ - Google: `lava.googleUrl`
108
+
109
+ For other providers, you can use the forward endpoint directly:
110
+
111
+ ```typescript
112
+ const url = `${lava.baseUrl}forward?u=https://api.yourprovider.com/endpoint`;
113
+ ```
114
+
115
+ ## Documentation
116
+
117
+ For more information, see the [Lava API documentation](https://docs.lavapayments.com).
@@ -0,0 +1,270 @@
1
+ type CheckoutMode = "onboarding" | "topup";
2
+ interface CreateCheckoutSessionParams {
3
+ checkout_mode: CheckoutMode;
4
+ origin_url: string;
5
+ reference_id?: string;
6
+ connection_id?: string;
7
+ }
8
+ interface CheckoutSession {
9
+ checkout_session_id: string;
10
+ checkout_session_token: string;
11
+ checkout_mode: CheckoutMode;
12
+ origin_url: string;
13
+ connection_id?: string;
14
+ reference_id?: string;
15
+ created_at: string;
16
+ completed_at?: string;
17
+ }
18
+ interface Wallet {
19
+ balance: string;
20
+ phone: string;
21
+ email: string;
22
+ first_name: string;
23
+ last_name: string;
24
+ }
25
+ interface Connection {
26
+ connection_id: string;
27
+ reference_id?: string;
28
+ wallet: Wallet;
29
+ created_at: string;
30
+ }
31
+ interface ConnectionsListParams {
32
+ cursor?: string;
33
+ limit?: number;
34
+ reference_id?: string;
35
+ }
36
+ interface ConnectionsListResponse {
37
+ data: Connection[];
38
+ has_more: boolean;
39
+ next_cursor?: string;
40
+ }
41
+ interface ModelUsage {
42
+ input_tokens: number;
43
+ output_tokens: number;
44
+ total_tokens: number;
45
+ input_cost: string;
46
+ output_cost: string;
47
+ total_cost: string;
48
+ }
49
+ interface FeeTierBreakdown {
50
+ tier: {
51
+ start: number;
52
+ rate: string;
53
+ };
54
+ tokens: number;
55
+ cost: string;
56
+ }
57
+ interface Fee {
58
+ amount: string;
59
+ rate_type: "fixed" | "percentage";
60
+ token_basis: "input+output" | "output";
61
+ breakdown: FeeTierBreakdown[];
62
+ }
63
+ interface ServiceCharge {
64
+ amount: string;
65
+ }
66
+ interface Request {
67
+ request_id: string;
68
+ connection_id: string;
69
+ product_id: string;
70
+ model: string;
71
+ endpoint: string;
72
+ response_id: string;
73
+ model_usage: ModelUsage;
74
+ fee: Fee;
75
+ service_charge: ServiceCharge;
76
+ total_request_cost: string;
77
+ timestamp: string;
78
+ created_at: string;
79
+ }
80
+ interface RequestsListParams {
81
+ cursor?: string;
82
+ limit?: number;
83
+ connection_id?: string;
84
+ product_id?: string;
85
+ }
86
+ interface RequestsListResponse {
87
+ data: Request[];
88
+ has_more: boolean;
89
+ next_cursor?: string;
90
+ }
91
+ interface UsageData {
92
+ date: string;
93
+ total_usage_tokens: number;
94
+ total_usage_cost: string;
95
+ total_service_charge_amount: string;
96
+ total_request_cost: string;
97
+ }
98
+ interface UsageParams {
99
+ start: string;
100
+ end?: string;
101
+ connection_id?: string;
102
+ product_id?: string;
103
+ }
104
+ type Usage = UsageData[];
105
+
106
+ declare namespace Resources {
107
+ abstract class BaseResource {
108
+ protected lava: Lava;
109
+ constructor(lava: Lava);
110
+ }
111
+ /**
112
+ * Checkout session related endpoints
113
+ */
114
+ export class CheckoutResource extends BaseResource {
115
+ /**
116
+ * Create a checkout session
117
+ * @param params Checkout session parameters
118
+ * @returns Created checkout session
119
+ */
120
+ create(params: CreateCheckoutSessionParams): Promise<CheckoutSession>;
121
+ /**
122
+ * Retrieve a checkout session
123
+ * @param checkoutSessionId Checkout session ID
124
+ * @returns Checkout session details
125
+ */
126
+ retrieve(checkoutSessionId: string): Promise<CheckoutSession>;
127
+ }
128
+ /**
129
+ * Connection related endpoints
130
+ */
131
+ export class ConnectionsResource extends BaseResource {
132
+ /**
133
+ * List connections
134
+ * @param params List parameters
135
+ * @returns Paginated list of connections
136
+ */
137
+ list(params?: ConnectionsListParams): Promise<ConnectionsListResponse>;
138
+ /**
139
+ * Retrieve a connection
140
+ * @param connectionId Connection ID
141
+ * @returns Connection details
142
+ */
143
+ retrieve(connectionId: string): Promise<Connection>;
144
+ /**
145
+ * Delete a connection
146
+ * @param connectionId Connection ID
147
+ * @returns Success status
148
+ */
149
+ delete(connectionId: string): Promise<{
150
+ success: boolean;
151
+ }>;
152
+ }
153
+ /**
154
+ * Request related endpoints
155
+ */
156
+ export class RequestsResource extends BaseResource {
157
+ /**
158
+ * List requests
159
+ * @param params List parameters
160
+ * @returns Paginated list of requests
161
+ */
162
+ list(params?: RequestsListParams): Promise<RequestsListResponse>;
163
+ /**
164
+ * Retrieve a request
165
+ * @param requestId Request ID
166
+ * @returns Request details
167
+ */
168
+ retrieve(requestId: string): Promise<Request>;
169
+ }
170
+ /**
171
+ * Usage related endpoints
172
+ */
173
+ export class UsageResource extends BaseResource {
174
+ /**
175
+ * Retrieve usage statistics
176
+ * @param params Usage parameters
177
+ * @returns Usage data
178
+ */
179
+ retrieve(params: UsageParams): Promise<Usage>;
180
+ }
181
+ export { };
182
+ }
183
+
184
+ type ApiVersion = "2025-03-10.v1";
185
+ interface Config {
186
+ apiVersion: ApiVersion;
187
+ /**
188
+ * Base URL for the API.
189
+ * If not provided, it will be inferred from the secret key (production or sandbox).
190
+ */
191
+ baseUrl?: string;
192
+ }
193
+ type ForwardTokenOptions = {
194
+ connection_secret: string;
195
+ product_secret: string;
196
+ };
197
+ declare class Lava {
198
+ private readonly secretKey;
199
+ private readonly baseUrl;
200
+ private readonly apiVersion;
201
+ /**
202
+ * The checkout resource
203
+ */
204
+ readonly checkout: Resources.CheckoutResource;
205
+ /**
206
+ * The connections resource
207
+ */
208
+ readonly connections: Resources.ConnectionsResource;
209
+ /**
210
+ * The requests resource
211
+ */
212
+ readonly requests: Resources.RequestsResource;
213
+ /**
214
+ * The usage resource
215
+ */
216
+ readonly usage: Resources.UsageResource;
217
+ /**
218
+ * OpenAI base URL for convenience
219
+ */
220
+ readonly openaiUrl: string;
221
+ /**
222
+ * Anthropic base URL for convenience
223
+ */
224
+ readonly anthropicUrl: string;
225
+ /**
226
+ * Mistral base URL for convenience
227
+ */
228
+ readonly mistralUrl: string;
229
+ /**
230
+ * DeepSeek base URL for convenience
231
+ */
232
+ readonly deepseekUrl: string;
233
+ /**
234
+ * xAI base URL for convenience
235
+ */
236
+ readonly xaiUrl: string;
237
+ /**
238
+ * Google base URL for convenience
239
+ */
240
+ readonly googleUrl: string;
241
+ /**
242
+ * Google OpenAI-compatible base URL for convenience
243
+ */
244
+ readonly googleOpenaiCompatibleUrl: string;
245
+ /**
246
+ * Create a new Lava client
247
+ * @param secretKey Your Lava secret key
248
+ * @param config Configuration options
249
+ */
250
+ constructor(secretKey: string, config: Config);
251
+ /**
252
+ * Make a request to the Lava API
253
+ * @param method HTTP method
254
+ * @param path API path
255
+ * @param options Request options
256
+ * @returns Response data
257
+ */
258
+ request<T>(method: string, path: string, { data, query }?: {
259
+ data?: any;
260
+ query?: Record<string, string>;
261
+ }): Promise<T>;
262
+ /**
263
+ * Generate a token for the forward endpoint
264
+ * @param options Token options
265
+ * @returns Base64 encoded token
266
+ */
267
+ generateForwardToken(options: ForwardTokenOptions): string;
268
+ }
269
+
270
+ export { type ApiVersion, type CheckoutMode, type CheckoutSession, type Config, type Connection, type ConnectionsListParams, type ConnectionsListResponse, type CreateCheckoutSessionParams, type Fee, type FeeTierBreakdown, type ForwardTokenOptions, type ModelUsage, type Request, type RequestsListParams, type RequestsListResponse, Resources, type ServiceCharge, type Usage, type UsageData, type UsageParams, type Wallet, Lava as default };
@@ -0,0 +1,270 @@
1
+ type CheckoutMode = "onboarding" | "topup";
2
+ interface CreateCheckoutSessionParams {
3
+ checkout_mode: CheckoutMode;
4
+ origin_url: string;
5
+ reference_id?: string;
6
+ connection_id?: string;
7
+ }
8
+ interface CheckoutSession {
9
+ checkout_session_id: string;
10
+ checkout_session_token: string;
11
+ checkout_mode: CheckoutMode;
12
+ origin_url: string;
13
+ connection_id?: string;
14
+ reference_id?: string;
15
+ created_at: string;
16
+ completed_at?: string;
17
+ }
18
+ interface Wallet {
19
+ balance: string;
20
+ phone: string;
21
+ email: string;
22
+ first_name: string;
23
+ last_name: string;
24
+ }
25
+ interface Connection {
26
+ connection_id: string;
27
+ reference_id?: string;
28
+ wallet: Wallet;
29
+ created_at: string;
30
+ }
31
+ interface ConnectionsListParams {
32
+ cursor?: string;
33
+ limit?: number;
34
+ reference_id?: string;
35
+ }
36
+ interface ConnectionsListResponse {
37
+ data: Connection[];
38
+ has_more: boolean;
39
+ next_cursor?: string;
40
+ }
41
+ interface ModelUsage {
42
+ input_tokens: number;
43
+ output_tokens: number;
44
+ total_tokens: number;
45
+ input_cost: string;
46
+ output_cost: string;
47
+ total_cost: string;
48
+ }
49
+ interface FeeTierBreakdown {
50
+ tier: {
51
+ start: number;
52
+ rate: string;
53
+ };
54
+ tokens: number;
55
+ cost: string;
56
+ }
57
+ interface Fee {
58
+ amount: string;
59
+ rate_type: "fixed" | "percentage";
60
+ token_basis: "input+output" | "output";
61
+ breakdown: FeeTierBreakdown[];
62
+ }
63
+ interface ServiceCharge {
64
+ amount: string;
65
+ }
66
+ interface Request {
67
+ request_id: string;
68
+ connection_id: string;
69
+ product_id: string;
70
+ model: string;
71
+ endpoint: string;
72
+ response_id: string;
73
+ model_usage: ModelUsage;
74
+ fee: Fee;
75
+ service_charge: ServiceCharge;
76
+ total_request_cost: string;
77
+ timestamp: string;
78
+ created_at: string;
79
+ }
80
+ interface RequestsListParams {
81
+ cursor?: string;
82
+ limit?: number;
83
+ connection_id?: string;
84
+ product_id?: string;
85
+ }
86
+ interface RequestsListResponse {
87
+ data: Request[];
88
+ has_more: boolean;
89
+ next_cursor?: string;
90
+ }
91
+ interface UsageData {
92
+ date: string;
93
+ total_usage_tokens: number;
94
+ total_usage_cost: string;
95
+ total_service_charge_amount: string;
96
+ total_request_cost: string;
97
+ }
98
+ interface UsageParams {
99
+ start: string;
100
+ end?: string;
101
+ connection_id?: string;
102
+ product_id?: string;
103
+ }
104
+ type Usage = UsageData[];
105
+
106
+ declare namespace Resources {
107
+ abstract class BaseResource {
108
+ protected lava: Lava;
109
+ constructor(lava: Lava);
110
+ }
111
+ /**
112
+ * Checkout session related endpoints
113
+ */
114
+ export class CheckoutResource extends BaseResource {
115
+ /**
116
+ * Create a checkout session
117
+ * @param params Checkout session parameters
118
+ * @returns Created checkout session
119
+ */
120
+ create(params: CreateCheckoutSessionParams): Promise<CheckoutSession>;
121
+ /**
122
+ * Retrieve a checkout session
123
+ * @param checkoutSessionId Checkout session ID
124
+ * @returns Checkout session details
125
+ */
126
+ retrieve(checkoutSessionId: string): Promise<CheckoutSession>;
127
+ }
128
+ /**
129
+ * Connection related endpoints
130
+ */
131
+ export class ConnectionsResource extends BaseResource {
132
+ /**
133
+ * List connections
134
+ * @param params List parameters
135
+ * @returns Paginated list of connections
136
+ */
137
+ list(params?: ConnectionsListParams): Promise<ConnectionsListResponse>;
138
+ /**
139
+ * Retrieve a connection
140
+ * @param connectionId Connection ID
141
+ * @returns Connection details
142
+ */
143
+ retrieve(connectionId: string): Promise<Connection>;
144
+ /**
145
+ * Delete a connection
146
+ * @param connectionId Connection ID
147
+ * @returns Success status
148
+ */
149
+ delete(connectionId: string): Promise<{
150
+ success: boolean;
151
+ }>;
152
+ }
153
+ /**
154
+ * Request related endpoints
155
+ */
156
+ export class RequestsResource extends BaseResource {
157
+ /**
158
+ * List requests
159
+ * @param params List parameters
160
+ * @returns Paginated list of requests
161
+ */
162
+ list(params?: RequestsListParams): Promise<RequestsListResponse>;
163
+ /**
164
+ * Retrieve a request
165
+ * @param requestId Request ID
166
+ * @returns Request details
167
+ */
168
+ retrieve(requestId: string): Promise<Request>;
169
+ }
170
+ /**
171
+ * Usage related endpoints
172
+ */
173
+ export class UsageResource extends BaseResource {
174
+ /**
175
+ * Retrieve usage statistics
176
+ * @param params Usage parameters
177
+ * @returns Usage data
178
+ */
179
+ retrieve(params: UsageParams): Promise<Usage>;
180
+ }
181
+ export { };
182
+ }
183
+
184
+ type ApiVersion = "2025-03-10.v1";
185
+ interface Config {
186
+ apiVersion: ApiVersion;
187
+ /**
188
+ * Base URL for the API.
189
+ * If not provided, it will be inferred from the secret key (production or sandbox).
190
+ */
191
+ baseUrl?: string;
192
+ }
193
+ type ForwardTokenOptions = {
194
+ connection_secret: string;
195
+ product_secret: string;
196
+ };
197
+ declare class Lava {
198
+ private readonly secretKey;
199
+ private readonly baseUrl;
200
+ private readonly apiVersion;
201
+ /**
202
+ * The checkout resource
203
+ */
204
+ readonly checkout: Resources.CheckoutResource;
205
+ /**
206
+ * The connections resource
207
+ */
208
+ readonly connections: Resources.ConnectionsResource;
209
+ /**
210
+ * The requests resource
211
+ */
212
+ readonly requests: Resources.RequestsResource;
213
+ /**
214
+ * The usage resource
215
+ */
216
+ readonly usage: Resources.UsageResource;
217
+ /**
218
+ * OpenAI base URL for convenience
219
+ */
220
+ readonly openaiUrl: string;
221
+ /**
222
+ * Anthropic base URL for convenience
223
+ */
224
+ readonly anthropicUrl: string;
225
+ /**
226
+ * Mistral base URL for convenience
227
+ */
228
+ readonly mistralUrl: string;
229
+ /**
230
+ * DeepSeek base URL for convenience
231
+ */
232
+ readonly deepseekUrl: string;
233
+ /**
234
+ * xAI base URL for convenience
235
+ */
236
+ readonly xaiUrl: string;
237
+ /**
238
+ * Google base URL for convenience
239
+ */
240
+ readonly googleUrl: string;
241
+ /**
242
+ * Google OpenAI-compatible base URL for convenience
243
+ */
244
+ readonly googleOpenaiCompatibleUrl: string;
245
+ /**
246
+ * Create a new Lava client
247
+ * @param secretKey Your Lava secret key
248
+ * @param config Configuration options
249
+ */
250
+ constructor(secretKey: string, config: Config);
251
+ /**
252
+ * Make a request to the Lava API
253
+ * @param method HTTP method
254
+ * @param path API path
255
+ * @param options Request options
256
+ * @returns Response data
257
+ */
258
+ request<T>(method: string, path: string, { data, query }?: {
259
+ data?: any;
260
+ query?: Record<string, string>;
261
+ }): Promise<T>;
262
+ /**
263
+ * Generate a token for the forward endpoint
264
+ * @param options Token options
265
+ * @returns Base64 encoded token
266
+ */
267
+ generateForwardToken(options: ForwardTokenOptions): string;
268
+ }
269
+
270
+ export { type ApiVersion, type CheckoutMode, type CheckoutSession, type Config, type Connection, type ConnectionsListParams, type ConnectionsListResponse, type CreateCheckoutSessionParams, type Fee, type FeeTierBreakdown, type ForwardTokenOptions, type ModelUsage, type Request, type RequestsListParams, type RequestsListResponse, Resources, type ServiceCharge, type Usage, type UsageData, type UsageParams, type Wallet, Lava as default };
package/dist/index.js ADDED
@@ -0,0 +1,228 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ Resources: () => Resources,
24
+ default: () => Lava
25
+ });
26
+ module.exports = __toCommonJS(index_exports);
27
+
28
+ // src/resources.ts
29
+ var Resources;
30
+ ((Resources2) => {
31
+ class BaseResource {
32
+ constructor(lava) {
33
+ this.lava = lava;
34
+ }
35
+ }
36
+ class CheckoutResource extends BaseResource {
37
+ /**
38
+ * Create a checkout session
39
+ * @param params Checkout session parameters
40
+ * @returns Created checkout session
41
+ */
42
+ async create(params) {
43
+ return this.lava.request("POST", "checkout_sessions", {
44
+ data: params
45
+ });
46
+ }
47
+ /**
48
+ * Retrieve a checkout session
49
+ * @param checkoutSessionId Checkout session ID
50
+ * @returns Checkout session details
51
+ */
52
+ async retrieve(checkoutSessionId) {
53
+ return this.lava.request(
54
+ "GET",
55
+ `checkout_sessions/${checkoutSessionId}`
56
+ );
57
+ }
58
+ }
59
+ Resources2.CheckoutResource = CheckoutResource;
60
+ class ConnectionsResource extends BaseResource {
61
+ /**
62
+ * List connections
63
+ * @param params List parameters
64
+ * @returns Paginated list of connections
65
+ */
66
+ async list(params) {
67
+ const queryParams = {};
68
+ if (params) {
69
+ if (params.cursor) queryParams.cursor = params.cursor;
70
+ if (params.limit) queryParams.limit = params.limit.toString();
71
+ if (params.reference_id) queryParams.reference_id = params.reference_id;
72
+ }
73
+ return this.lava.request("GET", "connections", {
74
+ query: queryParams
75
+ });
76
+ }
77
+ /**
78
+ * Retrieve a connection
79
+ * @param connectionId Connection ID
80
+ * @returns Connection details
81
+ */
82
+ async retrieve(connectionId) {
83
+ return this.lava.request(
84
+ "GET",
85
+ `connections/${connectionId}`
86
+ );
87
+ }
88
+ /**
89
+ * Delete a connection
90
+ * @param connectionId Connection ID
91
+ * @returns Success status
92
+ */
93
+ async delete(connectionId) {
94
+ return this.lava.request(
95
+ "DELETE",
96
+ `connections/${connectionId}`
97
+ );
98
+ }
99
+ }
100
+ Resources2.ConnectionsResource = ConnectionsResource;
101
+ class RequestsResource extends BaseResource {
102
+ /**
103
+ * List requests
104
+ * @param params List parameters
105
+ * @returns Paginated list of requests
106
+ */
107
+ async list(params) {
108
+ const queryParams = {};
109
+ if (params) {
110
+ if (params.cursor) queryParams.cursor = params.cursor;
111
+ if (params.limit) queryParams.limit = params.limit.toString();
112
+ if (params.connection_id)
113
+ queryParams.connection_id = params.connection_id;
114
+ if (params.product_id) queryParams.product_id = params.product_id;
115
+ }
116
+ return this.lava.request("GET", "requests", {
117
+ query: queryParams
118
+ });
119
+ }
120
+ /**
121
+ * Retrieve a request
122
+ * @param requestId Request ID
123
+ * @returns Request details
124
+ */
125
+ async retrieve(requestId) {
126
+ return this.lava.request("GET", `requests/${requestId}`);
127
+ }
128
+ }
129
+ Resources2.RequestsResource = RequestsResource;
130
+ class UsageResource extends BaseResource {
131
+ /**
132
+ * Retrieve usage statistics
133
+ * @param params Usage parameters
134
+ * @returns Usage data
135
+ */
136
+ async retrieve(params) {
137
+ const queryParams = {
138
+ start: params.start
139
+ };
140
+ if (params.end) queryParams.end = params.end;
141
+ if (params.connection_id)
142
+ queryParams.connection_id = params.connection_id;
143
+ if (params.product_id) queryParams.product_id = params.product_id;
144
+ return this.lava.request("GET", "usage", {
145
+ query: queryParams
146
+ });
147
+ }
148
+ }
149
+ Resources2.UsageResource = UsageResource;
150
+ })(Resources || (Resources = {}));
151
+
152
+ // src/index.ts
153
+ var Lava = class {
154
+ /**
155
+ * Create a new Lava client
156
+ * @param secretKey Your Lava secret key
157
+ * @param config Configuration options
158
+ */
159
+ constructor(secretKey, config) {
160
+ this.secretKey = secretKey;
161
+ this.apiVersion = config.apiVersion;
162
+ const isTestMode = secretKey.startsWith("test_");
163
+ this.baseUrl = config.baseUrl || (isTestMode ? "https://sandbox-api.lavapayments.com/v1/" : "https://api.lavapayments.com/v1/");
164
+ this.checkout = new Resources.CheckoutResource(this);
165
+ this.connections = new Resources.ConnectionsResource(this);
166
+ this.requests = new Resources.RequestsResource(this);
167
+ this.usage = new Resources.UsageResource(this);
168
+ this.openaiUrl = `${this.baseUrl}forward?u=https://api.openai.com/v1`;
169
+ this.anthropicUrl = `${this.baseUrl}forward?u=https://api.anthropic.com/v1`;
170
+ this.mistralUrl = `${this.baseUrl}forward?u=https://api.mistral.ai/v1`;
171
+ this.deepseekUrl = `${this.baseUrl}forward?u=https://api.deepseek.com/v1`;
172
+ this.xaiUrl = `${this.baseUrl}forward?u=https://api.x.ai/v1`;
173
+ this.googleUrl = `${this.baseUrl}forward?u=https://generativelanguage.googleapis.com/v1beta`;
174
+ this.googleOpenaiCompatibleUrl = `${this.baseUrl}forward?u=https://generativelanguage.googleapis.com/v1beta/openai`;
175
+ }
176
+ /**
177
+ * Make a request to the Lava API
178
+ * @param method HTTP method
179
+ * @param path API path
180
+ * @param options Request options
181
+ * @returns Response data
182
+ */
183
+ async request(method, path, { data, query } = {}) {
184
+ const url = new URL(path, this.baseUrl);
185
+ if (query) {
186
+ Object.entries(query).forEach(([key, value]) => {
187
+ if (value !== void 0) {
188
+ url.searchParams.append(key, value.toString());
189
+ }
190
+ });
191
+ }
192
+ const headers = {
193
+ Authorization: `Bearer ${this.secretKey}`,
194
+ "Content-Type": "application/json",
195
+ "X-Lava-API-Version": this.apiVersion
196
+ };
197
+ const requestOptions = {
198
+ method,
199
+ headers,
200
+ body: data ? JSON.stringify(data) : void 0
201
+ };
202
+ const response = await fetch(url.toString(), requestOptions);
203
+ if (!response.ok) {
204
+ const errorJson = await response.json().catch(() => ({}));
205
+ throw new Error(
206
+ `Lava API Error: ${response.status} ${response.statusText} - ${errorJson.error || "Unknown error"}`
207
+ );
208
+ }
209
+ return response.json();
210
+ }
211
+ /**
212
+ * Generate a token for the forward endpoint
213
+ * @param options Token options
214
+ * @returns Base64 encoded token
215
+ */
216
+ generateForwardToken(options) {
217
+ const tokenData = {
218
+ secret_key: this.secretKey,
219
+ connection_secret: options.connection_secret,
220
+ product_secret: options.product_secret
221
+ };
222
+ return Buffer.from(JSON.stringify(tokenData)).toString("base64");
223
+ }
224
+ };
225
+ // Annotate the CommonJS export names for ESM import in node:
226
+ 0 && (module.exports = {
227
+ Resources
228
+ });
package/dist/index.mjs ADDED
@@ -0,0 +1,201 @@
1
+ // src/resources.ts
2
+ var Resources;
3
+ ((Resources2) => {
4
+ class BaseResource {
5
+ constructor(lava) {
6
+ this.lava = lava;
7
+ }
8
+ }
9
+ class CheckoutResource extends BaseResource {
10
+ /**
11
+ * Create a checkout session
12
+ * @param params Checkout session parameters
13
+ * @returns Created checkout session
14
+ */
15
+ async create(params) {
16
+ return this.lava.request("POST", "checkout_sessions", {
17
+ data: params
18
+ });
19
+ }
20
+ /**
21
+ * Retrieve a checkout session
22
+ * @param checkoutSessionId Checkout session ID
23
+ * @returns Checkout session details
24
+ */
25
+ async retrieve(checkoutSessionId) {
26
+ return this.lava.request(
27
+ "GET",
28
+ `checkout_sessions/${checkoutSessionId}`
29
+ );
30
+ }
31
+ }
32
+ Resources2.CheckoutResource = CheckoutResource;
33
+ class ConnectionsResource extends BaseResource {
34
+ /**
35
+ * List connections
36
+ * @param params List parameters
37
+ * @returns Paginated list of connections
38
+ */
39
+ async list(params) {
40
+ const queryParams = {};
41
+ if (params) {
42
+ if (params.cursor) queryParams.cursor = params.cursor;
43
+ if (params.limit) queryParams.limit = params.limit.toString();
44
+ if (params.reference_id) queryParams.reference_id = params.reference_id;
45
+ }
46
+ return this.lava.request("GET", "connections", {
47
+ query: queryParams
48
+ });
49
+ }
50
+ /**
51
+ * Retrieve a connection
52
+ * @param connectionId Connection ID
53
+ * @returns Connection details
54
+ */
55
+ async retrieve(connectionId) {
56
+ return this.lava.request(
57
+ "GET",
58
+ `connections/${connectionId}`
59
+ );
60
+ }
61
+ /**
62
+ * Delete a connection
63
+ * @param connectionId Connection ID
64
+ * @returns Success status
65
+ */
66
+ async delete(connectionId) {
67
+ return this.lava.request(
68
+ "DELETE",
69
+ `connections/${connectionId}`
70
+ );
71
+ }
72
+ }
73
+ Resources2.ConnectionsResource = ConnectionsResource;
74
+ class RequestsResource extends BaseResource {
75
+ /**
76
+ * List requests
77
+ * @param params List parameters
78
+ * @returns Paginated list of requests
79
+ */
80
+ async list(params) {
81
+ const queryParams = {};
82
+ if (params) {
83
+ if (params.cursor) queryParams.cursor = params.cursor;
84
+ if (params.limit) queryParams.limit = params.limit.toString();
85
+ if (params.connection_id)
86
+ queryParams.connection_id = params.connection_id;
87
+ if (params.product_id) queryParams.product_id = params.product_id;
88
+ }
89
+ return this.lava.request("GET", "requests", {
90
+ query: queryParams
91
+ });
92
+ }
93
+ /**
94
+ * Retrieve a request
95
+ * @param requestId Request ID
96
+ * @returns Request details
97
+ */
98
+ async retrieve(requestId) {
99
+ return this.lava.request("GET", `requests/${requestId}`);
100
+ }
101
+ }
102
+ Resources2.RequestsResource = RequestsResource;
103
+ class UsageResource extends BaseResource {
104
+ /**
105
+ * Retrieve usage statistics
106
+ * @param params Usage parameters
107
+ * @returns Usage data
108
+ */
109
+ async retrieve(params) {
110
+ const queryParams = {
111
+ start: params.start
112
+ };
113
+ if (params.end) queryParams.end = params.end;
114
+ if (params.connection_id)
115
+ queryParams.connection_id = params.connection_id;
116
+ if (params.product_id) queryParams.product_id = params.product_id;
117
+ return this.lava.request("GET", "usage", {
118
+ query: queryParams
119
+ });
120
+ }
121
+ }
122
+ Resources2.UsageResource = UsageResource;
123
+ })(Resources || (Resources = {}));
124
+
125
+ // src/index.ts
126
+ var Lava = class {
127
+ /**
128
+ * Create a new Lava client
129
+ * @param secretKey Your Lava secret key
130
+ * @param config Configuration options
131
+ */
132
+ constructor(secretKey, config) {
133
+ this.secretKey = secretKey;
134
+ this.apiVersion = config.apiVersion;
135
+ const isTestMode = secretKey.startsWith("test_");
136
+ this.baseUrl = config.baseUrl || (isTestMode ? "https://sandbox-api.lavapayments.com/v1/" : "https://api.lavapayments.com/v1/");
137
+ this.checkout = new Resources.CheckoutResource(this);
138
+ this.connections = new Resources.ConnectionsResource(this);
139
+ this.requests = new Resources.RequestsResource(this);
140
+ this.usage = new Resources.UsageResource(this);
141
+ this.openaiUrl = `${this.baseUrl}forward?u=https://api.openai.com/v1`;
142
+ this.anthropicUrl = `${this.baseUrl}forward?u=https://api.anthropic.com/v1`;
143
+ this.mistralUrl = `${this.baseUrl}forward?u=https://api.mistral.ai/v1`;
144
+ this.deepseekUrl = `${this.baseUrl}forward?u=https://api.deepseek.com/v1`;
145
+ this.xaiUrl = `${this.baseUrl}forward?u=https://api.x.ai/v1`;
146
+ this.googleUrl = `${this.baseUrl}forward?u=https://generativelanguage.googleapis.com/v1beta`;
147
+ this.googleOpenaiCompatibleUrl = `${this.baseUrl}forward?u=https://generativelanguage.googleapis.com/v1beta/openai`;
148
+ }
149
+ /**
150
+ * Make a request to the Lava API
151
+ * @param method HTTP method
152
+ * @param path API path
153
+ * @param options Request options
154
+ * @returns Response data
155
+ */
156
+ async request(method, path, { data, query } = {}) {
157
+ const url = new URL(path, this.baseUrl);
158
+ if (query) {
159
+ Object.entries(query).forEach(([key, value]) => {
160
+ if (value !== void 0) {
161
+ url.searchParams.append(key, value.toString());
162
+ }
163
+ });
164
+ }
165
+ const headers = {
166
+ Authorization: `Bearer ${this.secretKey}`,
167
+ "Content-Type": "application/json",
168
+ "X-Lava-API-Version": this.apiVersion
169
+ };
170
+ const requestOptions = {
171
+ method,
172
+ headers,
173
+ body: data ? JSON.stringify(data) : void 0
174
+ };
175
+ const response = await fetch(url.toString(), requestOptions);
176
+ if (!response.ok) {
177
+ const errorJson = await response.json().catch(() => ({}));
178
+ throw new Error(
179
+ `Lava API Error: ${response.status} ${response.statusText} - ${errorJson.error || "Unknown error"}`
180
+ );
181
+ }
182
+ return response.json();
183
+ }
184
+ /**
185
+ * Generate a token for the forward endpoint
186
+ * @param options Token options
187
+ * @returns Base64 encoded token
188
+ */
189
+ generateForwardToken(options) {
190
+ const tokenData = {
191
+ secret_key: this.secretKey,
192
+ connection_secret: options.connection_secret,
193
+ product_secret: options.product_secret
194
+ };
195
+ return Buffer.from(JSON.stringify(tokenData)).toString("base64");
196
+ }
197
+ };
198
+ export {
199
+ Resources,
200
+ Lava as default
201
+ };
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "@lavapayments/nodejs",
3
+ "version": "0.1.0",
4
+ "description": "Backend SDK for Lava Payments API - enabling usage-based billing for AI services",
5
+ "main": "dist/index.js",
6
+ "module": "dist/index.mjs",
7
+ "types": "dist/index.d.ts",
8
+ "files": [
9
+ "dist"
10
+ ],
11
+ "scripts": {
12
+ "build": "tsup --dts --format cjs,esm src/index.ts",
13
+ "typecheck": "tsc --noEmit",
14
+ "lint": "eslint src/",
15
+ "format": "prettier --write \"src/**/*.ts\"",
16
+ "prepublishOnly": "npm run build",
17
+ "clean": "rm -rf dist"
18
+ },
19
+ "keywords": [
20
+ "lava",
21
+ "payments",
22
+ "billing",
23
+ "ai",
24
+ "openai",
25
+ "anthropic",
26
+ "usage-based",
27
+ "proxy"
28
+ ],
29
+ "author": "Lava",
30
+ "license": "MIT",
31
+ "devDependencies": {
32
+ "@types/node": "^20.0.0",
33
+ "@types/eslint": "^8.0.0",
34
+ "@typescript-eslint/eslint-plugin": "^6.0.0",
35
+ "@typescript-eslint/parser": "^6.0.0",
36
+ "eslint": "^8.0.0",
37
+ "prettier": "^3.0.0",
38
+ "tsup": "^8.0.0",
39
+ "typescript": "^5.0.0"
40
+ },
41
+ "engines": {
42
+ "node": ">=18.0.0"
43
+ }
44
+ }