@jazadev/node 0.1.0 → 0.1.1
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 +9 -4
- package/dist/index.cjs +17 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -1
- package/dist/index.d.ts +9 -1
- package/dist/index.js +17 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -27,18 +27,22 @@ const customer = await jaza.createCustomer({
|
|
|
27
27
|
|
|
28
28
|
// 2. Issue a top-up JWT for your frontend SDK
|
|
29
29
|
const session = await jaza.topUp({ customerId: customer.id });
|
|
30
|
-
// Pass session.token + jaza.publicKey to
|
|
30
|
+
// Pass session.token + jaza.publicKey to @jazadev/react-native (JazaProvider + JazaTopUpButton).
|
|
31
31
|
// Frontend: X-Jaza-Public-Key + Authorization: Bearer <token>
|
|
32
|
-
// →
|
|
32
|
+
// → bundles, predict, quote, deposits via @jazadev/react-native
|
|
33
33
|
|
|
34
|
-
// 3.
|
|
34
|
+
// 3. Read balance (for your app’s getBalance BFF → @jazadev/react-native)
|
|
35
|
+
const wallet = await jaza.getBalance({ customerId: customer.id });
|
|
36
|
+
console.log(wallet.balanceCredits);
|
|
37
|
+
|
|
38
|
+
// 4. Meter usage
|
|
35
39
|
await jaza.consume({
|
|
36
40
|
customerId: customer.id,
|
|
37
41
|
featureCode: 'SEND_MESSAGE',
|
|
38
42
|
idempotencyKey: `msg_${Date.now()}`,
|
|
39
43
|
});
|
|
40
44
|
|
|
41
|
-
//
|
|
45
|
+
// 5. Poll top-up session status
|
|
42
46
|
const status = await jaza.check({ topUpId: session.id });
|
|
43
47
|
console.log(status.status); // PENDING until deposits complete
|
|
44
48
|
```
|
|
@@ -49,6 +53,7 @@ console.log(status.status); // PENDING until deposits complete
|
|
|
49
53
|
|--------|-------------|
|
|
50
54
|
| `createCustomer({ name, email?, phoneNumber? })` | Returns `cus_…` |
|
|
51
55
|
| `topUp({ customerId })` | Returns session + JWT `token` |
|
|
56
|
+
| `getBalance({ customerId })` | Wallet with `balanceCredits` |
|
|
52
57
|
| `consume({ customerId, featureCode \| credits, idempotencyKey })` | Debit wallet |
|
|
53
58
|
| `check({ topUpId })` | Session status |
|
|
54
59
|
|
package/dist/index.cjs
CHANGED
|
@@ -191,6 +191,22 @@ var Jaza = class {
|
|
|
191
191
|
customerId: params.customerId
|
|
192
192
|
});
|
|
193
193
|
}
|
|
194
|
+
/**
|
|
195
|
+
* Get a customer's wallet (including `balanceCredits`).
|
|
196
|
+
* For customers from `createCustomer`, the wallet is keyed by `customerId`.
|
|
197
|
+
*/
|
|
198
|
+
getBalance(params) {
|
|
199
|
+
if (!params?.customerId?.trim()) {
|
|
200
|
+
throw new JazaError("customerId is required", {
|
|
201
|
+
statusCode: 0,
|
|
202
|
+
code: "invalid_request"
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
return this.http.request(
|
|
206
|
+
"GET",
|
|
207
|
+
`/v1/wallets/by-user/${encodeURIComponent(params.customerId)}`
|
|
208
|
+
);
|
|
209
|
+
}
|
|
194
210
|
/** Debit credits for a customer (feature code or raw credits). */
|
|
195
211
|
consume(params) {
|
|
196
212
|
assertConsume(params);
|
|
@@ -202,7 +218,7 @@ var Jaza = class {
|
|
|
202
218
|
reason: params.reason
|
|
203
219
|
});
|
|
204
220
|
}
|
|
205
|
-
/** Check whether a top-up session completed (PENDING until
|
|
221
|
+
/** Check whether a top-up session completed (PENDING until deposits land). */
|
|
206
222
|
check(params) {
|
|
207
223
|
if (!params?.topUpId?.trim()) {
|
|
208
224
|
throw new JazaError("topUpId is required", {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/version.ts","../src/client.ts","../src/jaza.ts"],"sourcesContent":["export { Jaza } from './jaza.js';\nexport { JazaError } from './errors.js';\nexport { DEFAULT_API_BASE_URL, VERSION } from './version.js';\nexport type {\n ConsumeParams,\n ConsumeResult,\n CreateCustomerParams,\n Customer,\n JazaConfig,\n JazaErrorBody,\n LedgerEntry,\n TopUpSession,\n TopUpSessionStatus,\n Wallet,\n} from './types.js';\n","import type { JazaErrorBody } from './types.js';\n\nexport class JazaError extends Error {\n readonly statusCode: number;\n readonly code: string;\n readonly raw: unknown;\n\n constructor(message: string, options: {\n statusCode: number;\n code?: string;\n raw?: unknown;\n }) {\n super(message);\n this.name = 'JazaError';\n this.statusCode = options.statusCode;\n this.code = options.code ?? 'api_error';\n this.raw = options.raw ?? null;\n }\n\n static fromResponse(statusCode: number, body: unknown): JazaError {\n const parsed = (body ?? {}) as JazaErrorBody;\n const message =\n typeof parsed.message === 'string'\n ? parsed.message\n : `Jaza API request failed with status ${statusCode}`;\n const code =\n typeof parsed.error === 'string'\n ? parsed.error\n : statusCode === 401\n ? 'unauthorized'\n : statusCode === 404\n ? 'not_found'\n : statusCode === 409\n ? 'conflict'\n : statusCode === 400\n ? 'bad_request'\n : 'api_error';\n return new JazaError(message, { statusCode, code, raw: body });\n }\n}\n","export const VERSION = '0.1.0';\n\nexport const DEFAULT_API_BASE_URL = 'https://api.jaza.dev';\n","import { JazaError } from './errors.js';\nimport { VERSION } from './version.js';\n\nexport type HttpMethod = 'GET' | 'POST' | 'PATCH' | 'DELETE';\n\nexport class HttpClient {\n constructor(\n private readonly apiBaseUrl: string,\n private readonly secretKey: string,\n ) {}\n\n async request<T>(\n method: HttpMethod,\n path: string,\n body?: unknown,\n ): Promise<T> {\n const url = `${this.apiBaseUrl.replace(/\\/$/, '')}${path}`;\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.secretKey}`,\n Accept: 'application/json',\n 'User-Agent': `@jazadev/node/${VERSION}`,\n };\n if (body !== undefined) {\n headers['Content-Type'] = 'application/json';\n }\n\n const response = await fetch(url, {\n method,\n headers,\n body: body === undefined ? undefined : JSON.stringify(body),\n });\n\n const text = await response.text();\n let parsed: unknown = null;\n if (text) {\n try {\n parsed = JSON.parse(text) as unknown;\n } catch {\n parsed = { message: text };\n }\n }\n\n if (!response.ok) {\n throw JazaError.fromResponse(response.status, parsed);\n }\n\n return parsed as T;\n }\n}\n","import { HttpClient } from './client.js';\nimport { JazaError } from './errors.js';\nimport type {\n ConsumeParams,\n ConsumeResult,\n CreateCustomerParams,\n Customer,\n JazaConfig,\n TopUpSession,\n} from './types.js';\nimport { DEFAULT_API_BASE_URL } from './version.js';\n\nfunction assertConfig(config: JazaConfig): void {\n if (!config?.secretKey || typeof config.secretKey !== 'string') {\n throw new JazaError('secretKey is required', {\n statusCode: 0,\n code: 'invalid_config',\n });\n }\n if (!config.secretKey.includes('_sk_')) {\n throw new JazaError('secretKey must be a merchant secret key (jz_*_sk_*)', {\n statusCode: 0,\n code: 'invalid_config',\n });\n }\n if (!config?.publicKey || typeof config.publicKey !== 'string') {\n throw new JazaError('publicKey is required', {\n statusCode: 0,\n code: 'invalid_config',\n });\n }\n if (!config.publicKey.includes('_pk_')) {\n throw new JazaError('publicKey must be a merchant public key (jz_*_pk_*)', {\n statusCode: 0,\n code: 'invalid_config',\n });\n }\n}\n\nfunction assertCreateCustomer(params: CreateCustomerParams): void {\n if (!params?.name?.trim()) {\n throw new JazaError('name is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n if (!params.email && !params.phoneNumber) {\n throw new JazaError('email or phoneNumber is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n}\n\nfunction assertConsume(params: ConsumeParams): void {\n if (!params?.customerId?.trim()) {\n throw new JazaError('customerId is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n if (!params.idempotencyKey?.trim()) {\n throw new JazaError('idempotencyKey is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n const hasFeature = Boolean(params.featureCode);\n const hasCredits = params.credits !== undefined;\n if (!hasFeature && !hasCredits) {\n throw new JazaError('featureCode or credits is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n if (hasFeature && hasCredits) {\n throw new JazaError('Provide featureCode or credits, not both', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n}\n\n/**\n * Official Node.js client for Jaza.\n *\n * @example\n * ```ts\n * const jaza = new Jaza({ secretKey, publicKey });\n * const customer = await jaza.createCustomer({ name: 'Amina', email: 'a@x.com' });\n * const session = await jaza.topUp({ customerId: customer.id });\n * // hand session.token + publicKey to your frontend SDK\n * await jaza.consume({ customerId: customer.id, featureCode: 'SEND_MESSAGE', idempotencyKey: '...' });\n * await jaza.check({ topUpId: session.id });\n * ```\n */\nexport class Jaza {\n readonly publicKey: string;\n private readonly http: HttpClient;\n\n constructor(config: JazaConfig) {\n assertConfig(config);\n this.publicKey = config.publicKey;\n this.http = new HttpClient(\n config.apiBaseUrl ?? DEFAULT_API_BASE_URL,\n config.secretKey,\n );\n }\n\n /** Create a Stripe-like customer (`cus_…`) and zero-balance wallet. */\n createCustomer(params: CreateCustomerParams): Promise<Customer> {\n assertCreateCustomer(params);\n return this.http.request<Customer>('POST', '/v1/customers', {\n name: params.name,\n email: params.email,\n phoneNumber: params.phoneNumber,\n });\n }\n\n /** Issue a top-up session JWT for the frontend (bundles / future deposits). */\n topUp(params: { customerId: string }): Promise<TopUpSession> {\n if (!params?.customerId?.trim()) {\n throw new JazaError('customerId is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n return this.http.request<TopUpSession>('POST', '/v1/top-ups', {\n customerId: params.customerId,\n });\n }\n\n /** Debit credits for a customer (feature code or raw credits). */\n consume(params: ConsumeParams): Promise<ConsumeResult> {\n assertConsume(params);\n return this.http.request<ConsumeResult>('POST', '/v1/credits/consume', {\n customerId: params.customerId,\n idempotencyKey: params.idempotencyKey,\n featureCode: params.featureCode,\n credits: params.credits,\n reason: params.reason,\n });\n }\n\n /** Check whether a top-up session completed (PENDING until PawaPay deposits land). */\n check(params: { topUpId: string }): Promise<TopUpSession> {\n if (!params?.topUpId?.trim()) {\n throw new JazaError('topUpId is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n return this.http.request<TopUpSession>(\n 'GET',\n `/v1/top-ups/${encodeURIComponent(params.topUpId)}`,\n );\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/version.ts","../src/client.ts","../src/jaza.ts"],"sourcesContent":["export { Jaza } from './jaza.js';\nexport { JazaError } from './errors.js';\nexport { DEFAULT_API_BASE_URL, VERSION } from './version.js';\nexport type {\n ConsumeParams,\n ConsumeResult,\n CreateCustomerParams,\n Customer,\n JazaConfig,\n JazaErrorBody,\n LedgerEntry,\n TopUpSession,\n TopUpSessionStatus,\n Wallet,\n} from './types.js';\n","import type { JazaErrorBody } from './types.js';\n\nexport class JazaError extends Error {\n readonly statusCode: number;\n readonly code: string;\n readonly raw: unknown;\n\n constructor(message: string, options: {\n statusCode: number;\n code?: string;\n raw?: unknown;\n }) {\n super(message);\n this.name = 'JazaError';\n this.statusCode = options.statusCode;\n this.code = options.code ?? 'api_error';\n this.raw = options.raw ?? null;\n }\n\n static fromResponse(statusCode: number, body: unknown): JazaError {\n const parsed = (body ?? {}) as JazaErrorBody;\n const message =\n typeof parsed.message === 'string'\n ? parsed.message\n : `Jaza API request failed with status ${statusCode}`;\n const code =\n typeof parsed.error === 'string'\n ? parsed.error\n : statusCode === 401\n ? 'unauthorized'\n : statusCode === 404\n ? 'not_found'\n : statusCode === 409\n ? 'conflict'\n : statusCode === 400\n ? 'bad_request'\n : 'api_error';\n return new JazaError(message, { statusCode, code, raw: body });\n }\n}\n","export const VERSION = '0.1.0';\n\nexport const DEFAULT_API_BASE_URL = 'https://api.jaza.dev';\n","import { JazaError } from './errors.js';\nimport { VERSION } from './version.js';\n\nexport type HttpMethod = 'GET' | 'POST' | 'PATCH' | 'DELETE';\n\nexport class HttpClient {\n constructor(\n private readonly apiBaseUrl: string,\n private readonly secretKey: string,\n ) {}\n\n async request<T>(\n method: HttpMethod,\n path: string,\n body?: unknown,\n ): Promise<T> {\n const url = `${this.apiBaseUrl.replace(/\\/$/, '')}${path}`;\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.secretKey}`,\n Accept: 'application/json',\n 'User-Agent': `@jazadev/node/${VERSION}`,\n };\n if (body !== undefined) {\n headers['Content-Type'] = 'application/json';\n }\n\n const response = await fetch(url, {\n method,\n headers,\n body: body === undefined ? undefined : JSON.stringify(body),\n });\n\n const text = await response.text();\n let parsed: unknown = null;\n if (text) {\n try {\n parsed = JSON.parse(text) as unknown;\n } catch {\n parsed = { message: text };\n }\n }\n\n if (!response.ok) {\n throw JazaError.fromResponse(response.status, parsed);\n }\n\n return parsed as T;\n }\n}\n","import { HttpClient } from './client.js';\nimport { JazaError } from './errors.js';\nimport type {\n ConsumeParams,\n ConsumeResult,\n CreateCustomerParams,\n Customer,\n JazaConfig,\n TopUpSession,\n Wallet,\n} from './types.js';\nimport { DEFAULT_API_BASE_URL } from './version.js';\n\nfunction assertConfig(config: JazaConfig): void {\n if (!config?.secretKey || typeof config.secretKey !== 'string') {\n throw new JazaError('secretKey is required', {\n statusCode: 0,\n code: 'invalid_config',\n });\n }\n if (!config.secretKey.includes('_sk_')) {\n throw new JazaError('secretKey must be a merchant secret key (jz_*_sk_*)', {\n statusCode: 0,\n code: 'invalid_config',\n });\n }\n if (!config?.publicKey || typeof config.publicKey !== 'string') {\n throw new JazaError('publicKey is required', {\n statusCode: 0,\n code: 'invalid_config',\n });\n }\n if (!config.publicKey.includes('_pk_')) {\n throw new JazaError('publicKey must be a merchant public key (jz_*_pk_*)', {\n statusCode: 0,\n code: 'invalid_config',\n });\n }\n}\n\nfunction assertCreateCustomer(params: CreateCustomerParams): void {\n if (!params?.name?.trim()) {\n throw new JazaError('name is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n if (!params.email && !params.phoneNumber) {\n throw new JazaError('email or phoneNumber is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n}\n\nfunction assertConsume(params: ConsumeParams): void {\n if (!params?.customerId?.trim()) {\n throw new JazaError('customerId is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n if (!params.idempotencyKey?.trim()) {\n throw new JazaError('idempotencyKey is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n const hasFeature = Boolean(params.featureCode);\n const hasCredits = params.credits !== undefined;\n if (!hasFeature && !hasCredits) {\n throw new JazaError('featureCode or credits is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n if (hasFeature && hasCredits) {\n throw new JazaError('Provide featureCode or credits, not both', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n}\n\n/**\n * Official Node.js client for Jaza.\n *\n * @example\n * ```ts\n * const jaza = new Jaza({ secretKey, publicKey });\n * const customer = await jaza.createCustomer({ name: 'Amina', email: 'a@x.com' });\n * const session = await jaza.topUp({ customerId: customer.id });\n * // hand session.token + publicKey to your frontend SDK\n * await jaza.consume({ customerId: customer.id, featureCode: 'SEND_MESSAGE', idempotencyKey: '...' });\n * const wallet = await jaza.getBalance({ customerId: customer.id });\n * await jaza.check({ topUpId: session.id });\n * ```\n */\nexport class Jaza {\n readonly publicKey: string;\n private readonly http: HttpClient;\n\n constructor(config: JazaConfig) {\n assertConfig(config);\n this.publicKey = config.publicKey;\n this.http = new HttpClient(\n config.apiBaseUrl ?? DEFAULT_API_BASE_URL,\n config.secretKey,\n );\n }\n\n /** Create a Stripe-like customer (`cus_…`) and zero-balance wallet. */\n createCustomer(params: CreateCustomerParams): Promise<Customer> {\n assertCreateCustomer(params);\n return this.http.request<Customer>('POST', '/v1/customers', {\n name: params.name,\n email: params.email,\n phoneNumber: params.phoneNumber,\n });\n }\n\n /** Issue a top-up session JWT for the frontend (bundles / future deposits). */\n topUp(params: { customerId: string }): Promise<TopUpSession> {\n if (!params?.customerId?.trim()) {\n throw new JazaError('customerId is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n return this.http.request<TopUpSession>('POST', '/v1/top-ups', {\n customerId: params.customerId,\n });\n }\n\n /**\n * Get a customer's wallet (including `balanceCredits`).\n * For customers from `createCustomer`, the wallet is keyed by `customerId`.\n */\n getBalance(params: { customerId: string }): Promise<Wallet> {\n if (!params?.customerId?.trim()) {\n throw new JazaError('customerId is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n return this.http.request<Wallet>(\n 'GET',\n `/v1/wallets/by-user/${encodeURIComponent(params.customerId)}`,\n );\n }\n\n /** Debit credits for a customer (feature code or raw credits). */\n consume(params: ConsumeParams): Promise<ConsumeResult> {\n assertConsume(params);\n return this.http.request<ConsumeResult>('POST', '/v1/credits/consume', {\n customerId: params.customerId,\n idempotencyKey: params.idempotencyKey,\n featureCode: params.featureCode,\n credits: params.credits,\n reason: params.reason,\n });\n }\n\n /** Check whether a top-up session completed (PENDING until deposits land). */\n check(params: { topUpId: string }): Promise<TopUpSession> {\n if (!params?.topUpId?.trim()) {\n throw new JazaError('topUpId is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n return this.http.request<TopUpSession>(\n 'GET',\n `/v1/top-ups/${encodeURIComponent(params.topUpId)}`,\n );\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.d.cts
CHANGED
|
@@ -77,6 +77,7 @@ type JazaErrorBody = {
|
|
|
77
77
|
* const session = await jaza.topUp({ customerId: customer.id });
|
|
78
78
|
* // hand session.token + publicKey to your frontend SDK
|
|
79
79
|
* await jaza.consume({ customerId: customer.id, featureCode: 'SEND_MESSAGE', idempotencyKey: '...' });
|
|
80
|
+
* const wallet = await jaza.getBalance({ customerId: customer.id });
|
|
80
81
|
* await jaza.check({ topUpId: session.id });
|
|
81
82
|
* ```
|
|
82
83
|
*/
|
|
@@ -90,9 +91,16 @@ declare class Jaza {
|
|
|
90
91
|
topUp(params: {
|
|
91
92
|
customerId: string;
|
|
92
93
|
}): Promise<TopUpSession>;
|
|
94
|
+
/**
|
|
95
|
+
* Get a customer's wallet (including `balanceCredits`).
|
|
96
|
+
* For customers from `createCustomer`, the wallet is keyed by `customerId`.
|
|
97
|
+
*/
|
|
98
|
+
getBalance(params: {
|
|
99
|
+
customerId: string;
|
|
100
|
+
}): Promise<Wallet>;
|
|
93
101
|
/** Debit credits for a customer (feature code or raw credits). */
|
|
94
102
|
consume(params: ConsumeParams): Promise<ConsumeResult>;
|
|
95
|
-
/** Check whether a top-up session completed (PENDING until
|
|
103
|
+
/** Check whether a top-up session completed (PENDING until deposits land). */
|
|
96
104
|
check(params: {
|
|
97
105
|
topUpId: string;
|
|
98
106
|
}): Promise<TopUpSession>;
|
package/dist/index.d.ts
CHANGED
|
@@ -77,6 +77,7 @@ type JazaErrorBody = {
|
|
|
77
77
|
* const session = await jaza.topUp({ customerId: customer.id });
|
|
78
78
|
* // hand session.token + publicKey to your frontend SDK
|
|
79
79
|
* await jaza.consume({ customerId: customer.id, featureCode: 'SEND_MESSAGE', idempotencyKey: '...' });
|
|
80
|
+
* const wallet = await jaza.getBalance({ customerId: customer.id });
|
|
80
81
|
* await jaza.check({ topUpId: session.id });
|
|
81
82
|
* ```
|
|
82
83
|
*/
|
|
@@ -90,9 +91,16 @@ declare class Jaza {
|
|
|
90
91
|
topUp(params: {
|
|
91
92
|
customerId: string;
|
|
92
93
|
}): Promise<TopUpSession>;
|
|
94
|
+
/**
|
|
95
|
+
* Get a customer's wallet (including `balanceCredits`).
|
|
96
|
+
* For customers from `createCustomer`, the wallet is keyed by `customerId`.
|
|
97
|
+
*/
|
|
98
|
+
getBalance(params: {
|
|
99
|
+
customerId: string;
|
|
100
|
+
}): Promise<Wallet>;
|
|
93
101
|
/** Debit credits for a customer (feature code or raw credits). */
|
|
94
102
|
consume(params: ConsumeParams): Promise<ConsumeResult>;
|
|
95
|
-
/** Check whether a top-up session completed (PENDING until
|
|
103
|
+
/** Check whether a top-up session completed (PENDING until deposits land). */
|
|
96
104
|
check(params: {
|
|
97
105
|
topUpId: string;
|
|
98
106
|
}): Promise<TopUpSession>;
|
package/dist/index.js
CHANGED
|
@@ -162,6 +162,22 @@ var Jaza = class {
|
|
|
162
162
|
customerId: params.customerId
|
|
163
163
|
});
|
|
164
164
|
}
|
|
165
|
+
/**
|
|
166
|
+
* Get a customer's wallet (including `balanceCredits`).
|
|
167
|
+
* For customers from `createCustomer`, the wallet is keyed by `customerId`.
|
|
168
|
+
*/
|
|
169
|
+
getBalance(params) {
|
|
170
|
+
if (!params?.customerId?.trim()) {
|
|
171
|
+
throw new JazaError("customerId is required", {
|
|
172
|
+
statusCode: 0,
|
|
173
|
+
code: "invalid_request"
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
return this.http.request(
|
|
177
|
+
"GET",
|
|
178
|
+
`/v1/wallets/by-user/${encodeURIComponent(params.customerId)}`
|
|
179
|
+
);
|
|
180
|
+
}
|
|
165
181
|
/** Debit credits for a customer (feature code or raw credits). */
|
|
166
182
|
consume(params) {
|
|
167
183
|
assertConsume(params);
|
|
@@ -173,7 +189,7 @@ var Jaza = class {
|
|
|
173
189
|
reason: params.reason
|
|
174
190
|
});
|
|
175
191
|
}
|
|
176
|
-
/** Check whether a top-up session completed (PENDING until
|
|
192
|
+
/** Check whether a top-up session completed (PENDING until deposits land). */
|
|
177
193
|
check(params) {
|
|
178
194
|
if (!params?.topUpId?.trim()) {
|
|
179
195
|
throw new JazaError("topUpId is required", {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/version.ts","../src/client.ts","../src/jaza.ts"],"sourcesContent":["import type { JazaErrorBody } from './types.js';\n\nexport class JazaError extends Error {\n readonly statusCode: number;\n readonly code: string;\n readonly raw: unknown;\n\n constructor(message: string, options: {\n statusCode: number;\n code?: string;\n raw?: unknown;\n }) {\n super(message);\n this.name = 'JazaError';\n this.statusCode = options.statusCode;\n this.code = options.code ?? 'api_error';\n this.raw = options.raw ?? null;\n }\n\n static fromResponse(statusCode: number, body: unknown): JazaError {\n const parsed = (body ?? {}) as JazaErrorBody;\n const message =\n typeof parsed.message === 'string'\n ? parsed.message\n : `Jaza API request failed with status ${statusCode}`;\n const code =\n typeof parsed.error === 'string'\n ? parsed.error\n : statusCode === 401\n ? 'unauthorized'\n : statusCode === 404\n ? 'not_found'\n : statusCode === 409\n ? 'conflict'\n : statusCode === 400\n ? 'bad_request'\n : 'api_error';\n return new JazaError(message, { statusCode, code, raw: body });\n }\n}\n","export const VERSION = '0.1.0';\n\nexport const DEFAULT_API_BASE_URL = 'https://api.jaza.dev';\n","import { JazaError } from './errors.js';\nimport { VERSION } from './version.js';\n\nexport type HttpMethod = 'GET' | 'POST' | 'PATCH' | 'DELETE';\n\nexport class HttpClient {\n constructor(\n private readonly apiBaseUrl: string,\n private readonly secretKey: string,\n ) {}\n\n async request<T>(\n method: HttpMethod,\n path: string,\n body?: unknown,\n ): Promise<T> {\n const url = `${this.apiBaseUrl.replace(/\\/$/, '')}${path}`;\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.secretKey}`,\n Accept: 'application/json',\n 'User-Agent': `@jazadev/node/${VERSION}`,\n };\n if (body !== undefined) {\n headers['Content-Type'] = 'application/json';\n }\n\n const response = await fetch(url, {\n method,\n headers,\n body: body === undefined ? undefined : JSON.stringify(body),\n });\n\n const text = await response.text();\n let parsed: unknown = null;\n if (text) {\n try {\n parsed = JSON.parse(text) as unknown;\n } catch {\n parsed = { message: text };\n }\n }\n\n if (!response.ok) {\n throw JazaError.fromResponse(response.status, parsed);\n }\n\n return parsed as T;\n }\n}\n","import { HttpClient } from './client.js';\nimport { JazaError } from './errors.js';\nimport type {\n ConsumeParams,\n ConsumeResult,\n CreateCustomerParams,\n Customer,\n JazaConfig,\n TopUpSession,\n} from './types.js';\nimport { DEFAULT_API_BASE_URL } from './version.js';\n\nfunction assertConfig(config: JazaConfig): void {\n if (!config?.secretKey || typeof config.secretKey !== 'string') {\n throw new JazaError('secretKey is required', {\n statusCode: 0,\n code: 'invalid_config',\n });\n }\n if (!config.secretKey.includes('_sk_')) {\n throw new JazaError('secretKey must be a merchant secret key (jz_*_sk_*)', {\n statusCode: 0,\n code: 'invalid_config',\n });\n }\n if (!config?.publicKey || typeof config.publicKey !== 'string') {\n throw new JazaError('publicKey is required', {\n statusCode: 0,\n code: 'invalid_config',\n });\n }\n if (!config.publicKey.includes('_pk_')) {\n throw new JazaError('publicKey must be a merchant public key (jz_*_pk_*)', {\n statusCode: 0,\n code: 'invalid_config',\n });\n }\n}\n\nfunction assertCreateCustomer(params: CreateCustomerParams): void {\n if (!params?.name?.trim()) {\n throw new JazaError('name is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n if (!params.email && !params.phoneNumber) {\n throw new JazaError('email or phoneNumber is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n}\n\nfunction assertConsume(params: ConsumeParams): void {\n if (!params?.customerId?.trim()) {\n throw new JazaError('customerId is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n if (!params.idempotencyKey?.trim()) {\n throw new JazaError('idempotencyKey is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n const hasFeature = Boolean(params.featureCode);\n const hasCredits = params.credits !== undefined;\n if (!hasFeature && !hasCredits) {\n throw new JazaError('featureCode or credits is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n if (hasFeature && hasCredits) {\n throw new JazaError('Provide featureCode or credits, not both', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n}\n\n/**\n * Official Node.js client for Jaza.\n *\n * @example\n * ```ts\n * const jaza = new Jaza({ secretKey, publicKey });\n * const customer = await jaza.createCustomer({ name: 'Amina', email: 'a@x.com' });\n * const session = await jaza.topUp({ customerId: customer.id });\n * // hand session.token + publicKey to your frontend SDK\n * await jaza.consume({ customerId: customer.id, featureCode: 'SEND_MESSAGE', idempotencyKey: '...' });\n * await jaza.check({ topUpId: session.id });\n * ```\n */\nexport class Jaza {\n readonly publicKey: string;\n private readonly http: HttpClient;\n\n constructor(config: JazaConfig) {\n assertConfig(config);\n this.publicKey = config.publicKey;\n this.http = new HttpClient(\n config.apiBaseUrl ?? DEFAULT_API_BASE_URL,\n config.secretKey,\n );\n }\n\n /** Create a Stripe-like customer (`cus_…`) and zero-balance wallet. */\n createCustomer(params: CreateCustomerParams): Promise<Customer> {\n assertCreateCustomer(params);\n return this.http.request<Customer>('POST', '/v1/customers', {\n name: params.name,\n email: params.email,\n phoneNumber: params.phoneNumber,\n });\n }\n\n /** Issue a top-up session JWT for the frontend (bundles / future deposits). */\n topUp(params: { customerId: string }): Promise<TopUpSession> {\n if (!params?.customerId?.trim()) {\n throw new JazaError('customerId is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n return this.http.request<TopUpSession>('POST', '/v1/top-ups', {\n customerId: params.customerId,\n });\n }\n\n /** Debit credits for a customer (feature code or raw credits). */\n consume(params: ConsumeParams): Promise<ConsumeResult> {\n assertConsume(params);\n return this.http.request<ConsumeResult>('POST', '/v1/credits/consume', {\n customerId: params.customerId,\n idempotencyKey: params.idempotencyKey,\n featureCode: params.featureCode,\n credits: params.credits,\n reason: params.reason,\n });\n }\n\n /** Check whether a top-up session completed (PENDING until PawaPay deposits land). */\n check(params: { topUpId: string }): Promise<TopUpSession> {\n if (!params?.topUpId?.trim()) {\n throw new JazaError('topUpId is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n return this.http.request<TopUpSession>(\n 'GET',\n `/v1/top-ups/${encodeURIComponent(params.topUpId)}`,\n );\n }\n}\n"],"mappings":";AAEO,IAAM,YAAN,MAAM,mBAAkB,MAAM;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,SAAiB,SAI1B;AACD,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,aAAa,QAAQ;AAC1B,SAAK,OAAO,QAAQ,QAAQ;AAC5B,SAAK,MAAM,QAAQ,OAAO;AAAA,EAC5B;AAAA,EAEA,OAAO,aAAa,YAAoB,MAA0B;AAChE,UAAM,SAAU,QAAQ,CAAC;AACzB,UAAM,UACJ,OAAO,OAAO,YAAY,WACtB,OAAO,UACP,uCAAuC,UAAU;AACvD,UAAM,OACJ,OAAO,OAAO,UAAU,WACpB,OAAO,QACP,eAAe,MACb,iBACA,eAAe,MACb,cACA,eAAe,MACb,aACA,eAAe,MACb,gBACA;AACd,WAAO,IAAI,WAAU,SAAS,EAAE,YAAY,MAAM,KAAK,KAAK,CAAC;AAAA,EAC/D;AACF;;;ACvCO,IAAM,UAAU;AAEhB,IAAM,uBAAuB;;;ACG7B,IAAM,aAAN,MAAiB;AAAA,EACtB,YACmB,YACA,WACjB;AAFiB;AACA;AAAA,EAChB;AAAA,EAFgB;AAAA,EACA;AAAA,EAGnB,MAAM,QACJ,QACA,MACA,MACY;AACZ,UAAM,MAAM,GAAG,KAAK,WAAW,QAAQ,OAAO,EAAE,CAAC,GAAG,IAAI;AACxD,UAAM,UAAkC;AAAA,MACtC,eAAe,UAAU,KAAK,SAAS;AAAA,MACvC,QAAQ;AAAA,MACR,cAAc,iBAAiB,OAAO;AAAA,IACxC;AACA,QAAI,SAAS,QAAW;AACtB,cAAQ,cAAc,IAAI;AAAA,IAC5B;AAEA,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC;AAAA,MACA;AAAA,MACA,MAAM,SAAS,SAAY,SAAY,KAAK,UAAU,IAAI;AAAA,IAC5D,CAAC;AAED,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,QAAI,SAAkB;AACtB,QAAI,MAAM;AACR,UAAI;AACF,iBAAS,KAAK,MAAM,IAAI;AAAA,MAC1B,QAAQ;AACN,iBAAS,EAAE,SAAS,KAAK;AAAA,MAC3B;AAAA,IACF;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,UAAU,aAAa,SAAS,QAAQ,MAAM;AAAA,IACtD;AAEA,WAAO;AAAA,EACT;AACF;;;ACpCA,SAAS,aAAa,QAA0B;AAC9C,MAAI,CAAC,QAAQ,aAAa,OAAO,OAAO,cAAc,UAAU;AAC9D,UAAM,IAAI,UAAU,yBAAyB;AAAA,MAC3C,YAAY;AAAA,MACZ,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACA,MAAI,CAAC,OAAO,UAAU,SAAS,MAAM,GAAG;AACtC,UAAM,IAAI,UAAU,uDAAuD;AAAA,MACzE,YAAY;AAAA,MACZ,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACA,MAAI,CAAC,QAAQ,aAAa,OAAO,OAAO,cAAc,UAAU;AAC9D,UAAM,IAAI,UAAU,yBAAyB;AAAA,MAC3C,YAAY;AAAA,MACZ,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACA,MAAI,CAAC,OAAO,UAAU,SAAS,MAAM,GAAG;AACtC,UAAM,IAAI,UAAU,uDAAuD;AAAA,MACzE,YAAY;AAAA,MACZ,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACF;AAEA,SAAS,qBAAqB,QAAoC;AAChE,MAAI,CAAC,QAAQ,MAAM,KAAK,GAAG;AACzB,UAAM,IAAI,UAAU,oBAAoB;AAAA,MACtC,YAAY;AAAA,MACZ,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACA,MAAI,CAAC,OAAO,SAAS,CAAC,OAAO,aAAa;AACxC,UAAM,IAAI,UAAU,oCAAoC;AAAA,MACtD,YAAY;AAAA,MACZ,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACF;AAEA,SAAS,cAAc,QAA6B;AAClD,MAAI,CAAC,QAAQ,YAAY,KAAK,GAAG;AAC/B,UAAM,IAAI,UAAU,0BAA0B;AAAA,MAC5C,YAAY;AAAA,MACZ,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACA,MAAI,CAAC,OAAO,gBAAgB,KAAK,GAAG;AAClC,UAAM,IAAI,UAAU,8BAA8B;AAAA,MAChD,YAAY;AAAA,MACZ,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACA,QAAM,aAAa,QAAQ,OAAO,WAAW;AAC7C,QAAM,aAAa,OAAO,YAAY;AACtC,MAAI,CAAC,cAAc,CAAC,YAAY;AAC9B,UAAM,IAAI,UAAU,sCAAsC;AAAA,MACxD,YAAY;AAAA,MACZ,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACA,MAAI,cAAc,YAAY;AAC5B,UAAM,IAAI,UAAU,4CAA4C;AAAA,MAC9D,YAAY;AAAA,MACZ,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACF;AAeO,IAAM,OAAN,MAAW;AAAA,EACP;AAAA,EACQ;AAAA,EAEjB,YAAY,QAAoB;AAC9B,iBAAa,MAAM;AACnB,SAAK,YAAY,OAAO;AACxB,SAAK,OAAO,IAAI;AAAA,MACd,OAAO,cAAc;AAAA,MACrB,OAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA,EAGA,eAAe,QAAiD;AAC9D,yBAAqB,MAAM;AAC3B,WAAO,KAAK,KAAK,QAAkB,QAAQ,iBAAiB;AAAA,MAC1D,MAAM,OAAO;AAAA,MACb,OAAO,OAAO;AAAA,MACd,aAAa,OAAO;AAAA,IACtB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,QAAuD;AAC3D,QAAI,CAAC,QAAQ,YAAY,KAAK,GAAG;AAC/B,YAAM,IAAI,UAAU,0BAA0B;AAAA,QAC5C,YAAY;AAAA,QACZ,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AACA,WAAO,KAAK,KAAK,QAAsB,QAAQ,eAAe;AAAA,MAC5D,YAAY,OAAO;AAAA,IACrB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,QAAQ,QAA+C;AACrD,kBAAc,MAAM;AACpB,WAAO,KAAK,KAAK,QAAuB,QAAQ,uBAAuB;AAAA,MACrE,YAAY,OAAO;AAAA,MACnB,gBAAgB,OAAO;AAAA,MACvB,aAAa,OAAO;AAAA,MACpB,SAAS,OAAO;AAAA,MAChB,QAAQ,OAAO;AAAA,IACjB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,QAAoD;AACxD,QAAI,CAAC,QAAQ,SAAS,KAAK,GAAG;AAC5B,YAAM,IAAI,UAAU,uBAAuB;AAAA,QACzC,YAAY;AAAA,QACZ,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AACA,WAAO,KAAK,KAAK;AAAA,MACf;AAAA,MACA,eAAe,mBAAmB,OAAO,OAAO,CAAC;AAAA,IACnD;AAAA,EACF;AACF;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/version.ts","../src/client.ts","../src/jaza.ts"],"sourcesContent":["import type { JazaErrorBody } from './types.js';\n\nexport class JazaError extends Error {\n readonly statusCode: number;\n readonly code: string;\n readonly raw: unknown;\n\n constructor(message: string, options: {\n statusCode: number;\n code?: string;\n raw?: unknown;\n }) {\n super(message);\n this.name = 'JazaError';\n this.statusCode = options.statusCode;\n this.code = options.code ?? 'api_error';\n this.raw = options.raw ?? null;\n }\n\n static fromResponse(statusCode: number, body: unknown): JazaError {\n const parsed = (body ?? {}) as JazaErrorBody;\n const message =\n typeof parsed.message === 'string'\n ? parsed.message\n : `Jaza API request failed with status ${statusCode}`;\n const code =\n typeof parsed.error === 'string'\n ? parsed.error\n : statusCode === 401\n ? 'unauthorized'\n : statusCode === 404\n ? 'not_found'\n : statusCode === 409\n ? 'conflict'\n : statusCode === 400\n ? 'bad_request'\n : 'api_error';\n return new JazaError(message, { statusCode, code, raw: body });\n }\n}\n","export const VERSION = '0.1.0';\n\nexport const DEFAULT_API_BASE_URL = 'https://api.jaza.dev';\n","import { JazaError } from './errors.js';\nimport { VERSION } from './version.js';\n\nexport type HttpMethod = 'GET' | 'POST' | 'PATCH' | 'DELETE';\n\nexport class HttpClient {\n constructor(\n private readonly apiBaseUrl: string,\n private readonly secretKey: string,\n ) {}\n\n async request<T>(\n method: HttpMethod,\n path: string,\n body?: unknown,\n ): Promise<T> {\n const url = `${this.apiBaseUrl.replace(/\\/$/, '')}${path}`;\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.secretKey}`,\n Accept: 'application/json',\n 'User-Agent': `@jazadev/node/${VERSION}`,\n };\n if (body !== undefined) {\n headers['Content-Type'] = 'application/json';\n }\n\n const response = await fetch(url, {\n method,\n headers,\n body: body === undefined ? undefined : JSON.stringify(body),\n });\n\n const text = await response.text();\n let parsed: unknown = null;\n if (text) {\n try {\n parsed = JSON.parse(text) as unknown;\n } catch {\n parsed = { message: text };\n }\n }\n\n if (!response.ok) {\n throw JazaError.fromResponse(response.status, parsed);\n }\n\n return parsed as T;\n }\n}\n","import { HttpClient } from './client.js';\nimport { JazaError } from './errors.js';\nimport type {\n ConsumeParams,\n ConsumeResult,\n CreateCustomerParams,\n Customer,\n JazaConfig,\n TopUpSession,\n Wallet,\n} from './types.js';\nimport { DEFAULT_API_BASE_URL } from './version.js';\n\nfunction assertConfig(config: JazaConfig): void {\n if (!config?.secretKey || typeof config.secretKey !== 'string') {\n throw new JazaError('secretKey is required', {\n statusCode: 0,\n code: 'invalid_config',\n });\n }\n if (!config.secretKey.includes('_sk_')) {\n throw new JazaError('secretKey must be a merchant secret key (jz_*_sk_*)', {\n statusCode: 0,\n code: 'invalid_config',\n });\n }\n if (!config?.publicKey || typeof config.publicKey !== 'string') {\n throw new JazaError('publicKey is required', {\n statusCode: 0,\n code: 'invalid_config',\n });\n }\n if (!config.publicKey.includes('_pk_')) {\n throw new JazaError('publicKey must be a merchant public key (jz_*_pk_*)', {\n statusCode: 0,\n code: 'invalid_config',\n });\n }\n}\n\nfunction assertCreateCustomer(params: CreateCustomerParams): void {\n if (!params?.name?.trim()) {\n throw new JazaError('name is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n if (!params.email && !params.phoneNumber) {\n throw new JazaError('email or phoneNumber is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n}\n\nfunction assertConsume(params: ConsumeParams): void {\n if (!params?.customerId?.trim()) {\n throw new JazaError('customerId is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n if (!params.idempotencyKey?.trim()) {\n throw new JazaError('idempotencyKey is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n const hasFeature = Boolean(params.featureCode);\n const hasCredits = params.credits !== undefined;\n if (!hasFeature && !hasCredits) {\n throw new JazaError('featureCode or credits is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n if (hasFeature && hasCredits) {\n throw new JazaError('Provide featureCode or credits, not both', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n}\n\n/**\n * Official Node.js client for Jaza.\n *\n * @example\n * ```ts\n * const jaza = new Jaza({ secretKey, publicKey });\n * const customer = await jaza.createCustomer({ name: 'Amina', email: 'a@x.com' });\n * const session = await jaza.topUp({ customerId: customer.id });\n * // hand session.token + publicKey to your frontend SDK\n * await jaza.consume({ customerId: customer.id, featureCode: 'SEND_MESSAGE', idempotencyKey: '...' });\n * const wallet = await jaza.getBalance({ customerId: customer.id });\n * await jaza.check({ topUpId: session.id });\n * ```\n */\nexport class Jaza {\n readonly publicKey: string;\n private readonly http: HttpClient;\n\n constructor(config: JazaConfig) {\n assertConfig(config);\n this.publicKey = config.publicKey;\n this.http = new HttpClient(\n config.apiBaseUrl ?? DEFAULT_API_BASE_URL,\n config.secretKey,\n );\n }\n\n /** Create a Stripe-like customer (`cus_…`) and zero-balance wallet. */\n createCustomer(params: CreateCustomerParams): Promise<Customer> {\n assertCreateCustomer(params);\n return this.http.request<Customer>('POST', '/v1/customers', {\n name: params.name,\n email: params.email,\n phoneNumber: params.phoneNumber,\n });\n }\n\n /** Issue a top-up session JWT for the frontend (bundles / future deposits). */\n topUp(params: { customerId: string }): Promise<TopUpSession> {\n if (!params?.customerId?.trim()) {\n throw new JazaError('customerId is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n return this.http.request<TopUpSession>('POST', '/v1/top-ups', {\n customerId: params.customerId,\n });\n }\n\n /**\n * Get a customer's wallet (including `balanceCredits`).\n * For customers from `createCustomer`, the wallet is keyed by `customerId`.\n */\n getBalance(params: { customerId: string }): Promise<Wallet> {\n if (!params?.customerId?.trim()) {\n throw new JazaError('customerId is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n return this.http.request<Wallet>(\n 'GET',\n `/v1/wallets/by-user/${encodeURIComponent(params.customerId)}`,\n );\n }\n\n /** Debit credits for a customer (feature code or raw credits). */\n consume(params: ConsumeParams): Promise<ConsumeResult> {\n assertConsume(params);\n return this.http.request<ConsumeResult>('POST', '/v1/credits/consume', {\n customerId: params.customerId,\n idempotencyKey: params.idempotencyKey,\n featureCode: params.featureCode,\n credits: params.credits,\n reason: params.reason,\n });\n }\n\n /** Check whether a top-up session completed (PENDING until deposits land). */\n check(params: { topUpId: string }): Promise<TopUpSession> {\n if (!params?.topUpId?.trim()) {\n throw new JazaError('topUpId is required', {\n statusCode: 0,\n code: 'invalid_request',\n });\n }\n return this.http.request<TopUpSession>(\n 'GET',\n `/v1/top-ups/${encodeURIComponent(params.topUpId)}`,\n );\n }\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jazadev/node",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Official Node.js SDK for Jaza prepaid / metered billing",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Jaza",
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
},
|
|
48
48
|
"repository": {
|
|
49
49
|
"type": "git",
|
|
50
|
-
"url": "https://github.com/josumung999/jaza-packages.git",
|
|
50
|
+
"url": "git+https://github.com/josumung999/jaza-packages.git",
|
|
51
51
|
"directory": "@jaza-node"
|
|
52
52
|
},
|
|
53
53
|
"homepage": "https://github.com/josumung999/jaza-packages/tree/main/@jaza-node",
|