kryptoexpress-sdk 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/CHANGELOG.md +13 -0
- package/LICENSE +21 -0
- package/README.md +165 -0
- package/dist/index.cjs +702 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +248 -0
- package/dist/index.d.ts +248 -0
- package/dist/index.js +653 -0
- package/dist/index.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/config.ts","../src/domain/errors.ts","../src/core/http.ts","../src/domain/enums.ts","../src/domain/conversion.ts","../src/core/validation.ts","../src/resources/currencies.ts","../src/resources/fiat.ts","../src/resources/payments.ts","../src/resources/wallet.ts","../src/client.ts","../src/webhooks/signature.ts"],"sourcesContent":["import type { FiatConverter } from '../domain/conversion';\n\nexport interface RetryOptions {\n maxRetries?: number;\n retryStatusCodes?: number[];\n}\n\nexport interface KryptoExpressClientOptions {\n apiKey?: string | undefined;\n baseUrl?: string | undefined;\n timeoutMs?: number | undefined;\n retry?: RetryOptions | undefined;\n fetch?: typeof fetch | undefined;\n fiatConverter?: FiatConverter | undefined;\n}\n\nexport interface ResolvedClientOptions {\n apiKey: string | undefined;\n baseUrl: string;\n timeoutMs: number;\n retry: {\n maxRetries: number;\n retryStatusCodes: number[];\n };\n fetch: typeof fetch;\n fiatConverter: FiatConverter | undefined;\n}\n\nconst DEFAULT_RETRY_STATUS_CODES = [408, 409, 429, 500, 502, 503, 504];\n\nexport function resolveClientOptions(options: KryptoExpressClientOptions = {}): ResolvedClientOptions {\n const normalizedBaseUrl = (options.baseUrl ?? 'https://kryptoexpress.pro/api').replace(/\\/+$/, '');\n\n return {\n apiKey: options.apiKey,\n baseUrl: normalizedBaseUrl,\n timeoutMs: options.timeoutMs ?? 10_000,\n retry: {\n maxRetries: options.retry?.maxRetries ?? 2,\n retryStatusCodes: options.retry?.retryStatusCodes ?? DEFAULT_RETRY_STATUS_CODES,\n },\n fetch: options.fetch ?? globalThis.fetch,\n fiatConverter: options.fiatConverter,\n };\n}\n","export interface ErrorOptions {\n cause?: unknown;\n statusCode?: number;\n code?: string;\n details?: unknown;\n}\n\nexport class SDKError extends Error {\n public readonly cause: unknown;\n\n public constructor(message: string, options: ErrorOptions = {}) {\n super(message);\n this.name = new.target.name;\n this.cause = options.cause;\n }\n}\n\nexport class ValidationError extends SDKError {\n public readonly details: unknown;\n\n public constructor(message: string, options: ErrorOptions = {}) {\n super(message, options);\n this.details = options.details;\n }\n}\n\nexport class UnsupportedPaymentModeError extends ValidationError {}\n\nexport class MinimumAmountError extends ValidationError {\n public readonly minimumUsdAmount: number;\n\n public constructor(message: string, minimumUsdAmount = 1, options: ErrorOptions = {}) {\n super(message, options);\n this.minimumUsdAmount = minimumUsdAmount;\n }\n}\n\nexport class CurrencyConversionError extends ValidationError {}\n\nexport class APIError extends SDKError {\n public readonly statusCode: number;\n public readonly code: string | undefined;\n public readonly details: unknown;\n\n public constructor(message: string, statusCode: number, options: ErrorOptions = {}) {\n super(message, options);\n this.statusCode = statusCode;\n this.code = options.code;\n this.details = options.details;\n }\n}\n\nexport class AuthError extends APIError {}\nexport class RateLimitError extends APIError {}\nexport class NotFoundError extends APIError {}\n","import { APIError, AuthError, NotFoundError, RateLimitError, SDKError } from '../domain/errors';\nimport type { ResolvedClientOptions } from './config';\n\nexport interface RequestOptions {\n path: string;\n method?: 'GET' | 'POST';\n query?: Record<string, string | number | boolean | undefined>;\n body?: unknown;\n requiresAuth?: boolean;\n}\n\nexport class HttpClient {\n private readonly options: ResolvedClientOptions;\n\n public constructor(options: ResolvedClientOptions) {\n this.options = options;\n }\n\n public async request<T>(request: RequestOptions): Promise<T> {\n const url = buildUrl(this.options.baseUrl, request.path, request.query);\n\n for (let attempt = 0; ; attempt += 1) {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), this.options.timeoutMs);\n\n try {\n const requestInit: RequestInit = {\n method: request.method ?? 'GET',\n headers: this.buildHeaders(request.requiresAuth ?? false, request.body !== undefined),\n signal: controller.signal,\n };\n\n if (request.body !== undefined) {\n requestInit.body = JSON.stringify(request.body);\n }\n\n const response = await this.options.fetch(url, requestInit);\n\n clearTimeout(timeout);\n\n if (!response.ok) {\n if (\n attempt < this.options.retry.maxRetries &&\n this.options.retry.retryStatusCodes.includes(response.status)\n ) {\n continue;\n }\n\n throw await toApiError(response);\n }\n\n if (response.status === 204) {\n return undefined as T;\n }\n\n return (await response.json()) as T;\n } catch (error) {\n clearTimeout(timeout);\n\n if (\n !(error instanceof APIError) &&\n attempt < this.options.retry.maxRetries\n ) {\n continue;\n }\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new SDKError(`Request timed out after ${this.options.timeoutMs}ms.`, { cause: error });\n }\n\n if (error instanceof SDKError) {\n throw error;\n }\n\n throw new SDKError('Unexpected HTTP client error.', { cause: error });\n }\n }\n }\n\n private buildHeaders(requiresAuth: boolean, hasJsonBody: boolean): Headers {\n const headers = new Headers();\n headers.set('Accept', 'application/json');\n\n if (hasJsonBody) {\n headers.set('Content-Type', 'application/json');\n }\n\n if (requiresAuth) {\n if (!this.options.apiKey) {\n throw new AuthError('This endpoint requires an API key.', 401);\n }\n\n headers.set('X-Api-Key', this.options.apiKey);\n }\n\n return headers;\n }\n}\n\nfunction buildUrl(\n baseUrl: string,\n path: string,\n query: Record<string, string | number | boolean | undefined> = {},\n): string {\n const url = new URL(`${baseUrl}${path}`);\n\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined) {\n continue;\n }\n\n url.searchParams.set(key, String(value));\n }\n\n return url.toString();\n}\n\nasync function toApiError(response: Response): Promise<APIError> {\n const bodyText = await response.text();\n let payload: Record<string, unknown> | undefined;\n\n try {\n payload = bodyText ? (JSON.parse(bodyText) as Record<string, unknown>) : undefined;\n } catch {\n payload = undefined;\n }\n\n const message =\n (typeof payload?.message === 'string' && payload.message) ||\n (typeof payload?.error === 'string' && payload.error) ||\n `Request failed with status ${response.status}.`;\n const code = typeof payload?.code === 'string' ? payload.code : undefined;\n const options =\n code === undefined\n ? { details: payload ?? bodyText }\n : { code, details: payload ?? bodyText };\n\n if (response.status === 401 || response.status === 403) {\n return new AuthError(message, response.status, options);\n }\n\n if (response.status === 404) {\n return new NotFoundError(message, response.status, options);\n }\n\n if (response.status === 429) {\n return new RateLimitError(message, response.status, options);\n }\n\n return new APIError(message, response.status, options);\n}\n","export const FIAT_CURRENCIES = [\n 'USD',\n 'EUR',\n 'GBP',\n 'JPY',\n 'CHF',\n 'AUD',\n 'CAD',\n 'CNY',\n 'HKD',\n 'SGD',\n 'SEK',\n 'NOK',\n 'DKK',\n 'PLN',\n 'CZK',\n 'HUF',\n 'TRY',\n 'INR',\n 'KRW',\n 'THB',\n 'IDR',\n 'MYR',\n 'PHP',\n 'VND',\n 'AED',\n 'SAR',\n 'ZAR',\n 'NGN',\n 'KES',\n 'GHS',\n 'BRL',\n 'MXN',\n 'ARS',\n 'CLP',\n 'COP',\n 'PEN',\n 'RUB',\n 'UAH',\n 'ILS',\n 'PKR',\n 'BDT',\n 'LKR',\n 'TWD',\n 'BHD',\n 'KWD',\n 'RON',\n 'NZD',\n] as const;\n\nexport const NATIVE_CRYPTO_CURRENCIES = ['BTC', 'LTC', 'ETH', 'SOL', 'BNB', 'DOGE'] as const;\n\nexport const STABLE_CRYPTO_CURRENCIES = [\n 'USDC_ERC20',\n 'USDT_ERC20',\n 'USDT_BEP20',\n 'USDC_BEP20',\n 'USDT_SOL',\n 'USDC_SOL',\n] as const;\n\nexport const ALL_CRYPTO_CURRENCIES = [\n ...NATIVE_CRYPTO_CURRENCIES,\n ...STABLE_CRYPTO_CURRENCIES,\n] as const;\n\nexport const PAYMENT_TYPES = ['PAYMENT', 'DEPOSIT'] as const;\nexport const WITHDRAW_TYPES = ['ALL', 'SINGLE'] as const;\n\nexport type FiatCurrency = (typeof FIAT_CURRENCIES)[number];\nexport type NativeCryptoCurrency = (typeof NATIVE_CRYPTO_CURRENCIES)[number];\nexport type StableCryptoCurrency = (typeof STABLE_CRYPTO_CURRENCIES)[number];\nexport type CryptoCurrency = (typeof ALL_CRYPTO_CURRENCIES)[number];\nexport type PaymentType = (typeof PAYMENT_TYPES)[number];\nexport type WithdrawType = (typeof WITHDRAW_TYPES)[number];\n\nconst stableCurrencySet = new Set<string>(STABLE_CRYPTO_CURRENCIES);\n\nexport function isStableCryptoCurrency(value: string): value is StableCryptoCurrency {\n return stableCurrencySet.has(value);\n}\n","import {\n CurrencyConversionError,\n MinimumAmountError,\n UnsupportedPaymentModeError,\n} from './errors';\nimport { isStableCryptoCurrency, type CryptoCurrency, type FiatCurrency } from './enums';\n\nexport interface FiatConversionQuote {\n from: FiatCurrency;\n to: FiatCurrency;\n rate: number;\n}\n\nexport interface FiatConverter {\n convert(amount: number, from: FiatCurrency, to: FiatCurrency): Promise<number>;\n}\n\nexport class StaticRateFiatConverter implements FiatConverter {\n private readonly rates = new Map<string, number>();\n\n public constructor(quotes: FiatConversionQuote[]) {\n for (const quote of quotes) {\n this.rates.set(`${quote.from}:${quote.to}`, quote.rate);\n }\n }\n\n public convert(amount: number, from: FiatCurrency, to: FiatCurrency): Promise<number> {\n if (from === to) {\n return Promise.resolve(amount);\n }\n\n const direct = this.rates.get(`${from}:${to}`);\n if (direct !== undefined) {\n return Promise.resolve(amount * direct);\n }\n\n const inverse = this.rates.get(`${to}:${from}`);\n if (inverse !== undefined && inverse !== 0) {\n return Promise.resolve(amount / inverse);\n }\n\n throw new CurrencyConversionError(`No fiat conversion rate available for ${from} -> ${to}.`);\n }\n}\n\nexport interface MinimumAmountValidatorOptions {\n converter?: FiatConverter | undefined;\n minimumUsdAmount?: number | undefined;\n}\n\nexport class MinimumAmountPolicy {\n private readonly converter: FiatConverter | undefined;\n private readonly minimumUsdAmount: number;\n\n public constructor(options: MinimumAmountValidatorOptions = {}) {\n this.converter = options.converter;\n this.minimumUsdAmount = options.minimumUsdAmount ?? 1;\n }\n\n public async assertFiatAmountEligible(amount: number, fiatCurrency: FiatCurrency): Promise<void> {\n if (amount <= 0) {\n throw new MinimumAmountError('Payment amount must be greater than zero.', this.minimumUsdAmount);\n }\n\n if (fiatCurrency !== 'USD') {\n return;\n }\n\n const amountInUsd = amount;\n\n if (amountInUsd < this.minimumUsdAmount) {\n throw new MinimumAmountError(\n `Payment amount must be at least the fiat equivalent of ${this.minimumUsdAmount} USD.`,\n this.minimumUsdAmount,\n { details: { amount, fiatCurrency, amountInUsd } },\n );\n }\n }\n}\n\nexport function assertPaymentModeSupported(\n paymentType: 'PAYMENT' | 'DEPOSIT',\n cryptoCurrency: CryptoCurrency,\n): void {\n if (paymentType === 'DEPOSIT' && isStableCryptoCurrency(cryptoCurrency)) {\n throw new UnsupportedPaymentModeError(\n `Stablecoin ${cryptoCurrency} is not supported for DEPOSIT payments.`,\n );\n }\n}\n","import { ValidationError } from '../domain/errors';\nimport type { PaymentRecord, WithdrawalResponse, CryptoPrice, WalletBalances } from '../domain/models';\nimport { PAYMENT_TYPES, WITHDRAW_TYPES } from '../domain/enums';\n\nfunction assertObject(value: unknown, label: string): Record<string, unknown> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new ValidationError(`${label} must be an object.`, { details: value });\n }\n\n return value as Record<string, unknown>;\n}\n\nfunction assertString(value: unknown, label: string): string {\n if (typeof value !== 'string') {\n throw new ValidationError(`${label} must be a string.`, { details: value });\n }\n\n return value;\n}\n\nfunction assertNumberOrNull(value: unknown, label: string): number | null {\n if (value === null) {\n return null;\n }\n\n if (typeof value !== 'number' || Number.isNaN(value)) {\n throw new ValidationError(`${label} must be a number or null.`, { details: value });\n }\n\n return value;\n}\n\nfunction assertNumber(value: unknown, label: string): number {\n if (typeof value !== 'number' || Number.isNaN(value)) {\n throw new ValidationError(`${label} must be a number.`, { details: value });\n }\n\n return value;\n}\n\nfunction assertBoolean(value: unknown, label: string): boolean {\n if (typeof value !== 'boolean') {\n throw new ValidationError(`${label} must be a boolean.`, { details: value });\n }\n\n return value;\n}\n\nexport function parsePaymentRecord(value: unknown): PaymentRecord {\n const record = assertObject(value, 'payment');\n const paymentType = assertString(record.paymentType, 'payment.paymentType');\n\n if (!PAYMENT_TYPES.includes(paymentType as (typeof PAYMENT_TYPES)[number])) {\n throw new ValidationError('payment.paymentType is invalid.', { details: paymentType });\n }\n\n return {\n id: assertNumber(record.id, 'payment.id'),\n paymentType: paymentType as PaymentRecord['paymentType'],\n fiatCurrency: assertString(record.fiatCurrency, 'payment.fiatCurrency') as PaymentRecord['fiatCurrency'],\n fiatAmount: assertNumberOrNull(record.fiatAmount, 'payment.fiatAmount'),\n cryptoAmount: assertNumberOrNull(record.cryptoAmount, 'payment.cryptoAmount'),\n cryptoCurrency: assertString(\n record.cryptoCurrency,\n 'payment.cryptoCurrency',\n ) as PaymentRecord['cryptoCurrency'],\n expireDatetime: assertNumber(record.expireDatetime, 'payment.expireDatetime'),\n createDatetime: assertNumber(record.createDatetime, 'payment.createDatetime'),\n paidAt: assertNumberOrNull(record.paidAt, 'payment.paidAt'),\n address: assertString(record.address, 'payment.address'),\n isPaid: assertBoolean(record.isPaid, 'payment.isPaid'),\n isWithdrawn: assertBoolean(record.isWithdrawn, 'payment.isWithdrawn'),\n hash: assertString(record.hash, 'payment.hash'),\n callbackUrl:\n record.callbackUrl === null ? null : assertString(record.callbackUrl, 'payment.callbackUrl'),\n };\n}\n\nexport function parseWalletBalances(value: unknown): WalletBalances {\n const record = assertObject(value, 'wallet');\n const result: WalletBalances = {};\n\n for (const [currency, amount] of Object.entries(record)) {\n result[currency] = assertNumber(amount, `wallet.${currency}`);\n }\n\n return result;\n}\n\nexport function parseWithdrawalResponse(value: unknown): WithdrawalResponse {\n const record = assertObject(value, 'withdrawal');\n const withdrawType = assertString(record.withdrawType, 'withdrawal.withdrawType');\n\n if (!WITHDRAW_TYPES.includes(withdrawType as (typeof WITHDRAW_TYPES)[number])) {\n throw new ValidationError('withdrawal.withdrawType is invalid.', { details: withdrawType });\n }\n\n const txIdList = record.txIdList;\n if (!Array.isArray(txIdList) || txIdList.some((item) => typeof item !== 'string')) {\n throw new ValidationError('withdrawal.txIdList must be a string array.', { details: txIdList });\n }\n\n return {\n id: assertNumber(record.id, 'withdrawal.id'),\n withdrawType: withdrawType as WithdrawalResponse['withdrawType'],\n paymentId:\n record.paymentId === null ? null : assertNumber(record.paymentId, 'withdrawal.paymentId'),\n cryptoCurrency: assertString(\n record.cryptoCurrency,\n 'withdrawal.cryptoCurrency',\n ) as WithdrawalResponse['cryptoCurrency'],\n toAddress: assertString(record.toAddress, 'withdrawal.toAddress'),\n txIdList: txIdList as string[],\n receivingAmount: assertNumber(record.receivingAmount, 'withdrawal.receivingAmount'),\n blockchainFeeAmount: assertNumber(\n record.blockchainFeeAmount,\n 'withdrawal.blockchainFeeAmount',\n ),\n serviceFeeAmount: assertNumber(record.serviceFeeAmount, 'withdrawal.serviceFeeAmount'),\n onlyCalculate: assertBoolean(record.onlyCalculate, 'withdrawal.onlyCalculate'),\n totalWithdrawalAmount: assertNumber(\n record.totalWithdrawalAmount,\n 'withdrawal.totalWithdrawalAmount',\n ),\n createDatetime: assertNumber(record.createDatetime, 'withdrawal.createDatetime'),\n };\n}\n\nexport function parseStringArray(value: unknown, label: string): string[] {\n if (!Array.isArray(value) || value.some((item) => typeof item !== 'string')) {\n throw new ValidationError(`${label} must be a string array.`, { details: value });\n }\n\n return value as string[];\n}\n\nexport function parseCryptoPrices(value: unknown): CryptoPrice[] {\n if (!Array.isArray(value)) {\n throw new ValidationError('prices must be an array.', { details: value });\n }\n\n const items = value as unknown[];\n\n return items.map((item, index): CryptoPrice => {\n const record = assertObject(item, `prices[${index}]`);\n return {\n cryptoCurrency: assertString(record.cryptoCurrency, `prices[${index}].cryptoCurrency`) as CryptoPrice['cryptoCurrency'],\n fiatCurrency: assertString(record.fiatCurrency, `prices[${index}].fiatCurrency`) as CryptoPrice['fiatCurrency'],\n price: assertNumber(record.price, `prices[${index}].price`),\n };\n });\n}\n","import type { HttpClient } from '../core/http';\nimport { parseCryptoPrices, parseStringArray } from '../core/validation';\nimport { ValidationError } from '../domain/errors';\nimport type { CryptoCurrency, FiatCurrency, NativeCryptoCurrency, StableCryptoCurrency } from '../domain/enums';\nimport type { CryptoPrice } from '../domain/models';\n\nexport interface GetPricesInput {\n cryptoCurrency: CryptoCurrency[];\n fiatCurrency: FiatCurrency;\n}\n\nexport class CurrenciesResource {\n private readonly httpClient: HttpClient;\n\n public constructor(httpClient: HttpClient) {\n this.httpClient = httpClient;\n }\n\n public async listNative(): Promise<NativeCryptoCurrency[]> {\n const response = await this.httpClient.request<unknown>({\n path: '/cryptocurrency',\n });\n\n return parseStringArray(response, 'cryptocurrency') as NativeCryptoCurrency[];\n }\n\n public async listAll(): Promise<CryptoCurrency[]> {\n const response = await this.httpClient.request<unknown>({\n path: '/cryptocurrency/all',\n });\n\n return parseStringArray(response, 'cryptocurrency/all') as CryptoCurrency[];\n }\n\n public async listStable(): Promise<StableCryptoCurrency[]> {\n const response = await this.httpClient.request<unknown>({\n path: '/cryptocurrency/stable',\n });\n\n return parseStringArray(response, 'cryptocurrency/stable') as StableCryptoCurrency[];\n }\n\n public async getPrices(input: GetPricesInput): Promise<CryptoPrice[]> {\n if (input.cryptoCurrency.length === 0) {\n throw new ValidationError('At least one cryptoCurrency is required.', { details: input });\n }\n\n const response = await this.httpClient.request<unknown>({\n path: '/cryptocurrency/price',\n query: {\n cryptoCurrency: input.cryptoCurrency.join(','),\n fiatCurrency: input.fiatCurrency,\n },\n });\n\n return parseCryptoPrices(response);\n }\n}\n","import type { HttpClient } from '../core/http';\nimport { parseStringArray } from '../core/validation';\nimport type { FiatCurrency } from '../domain/enums';\n\nexport class FiatResource {\n private readonly httpClient: HttpClient;\n\n public constructor(httpClient: HttpClient) {\n this.httpClient = httpClient;\n }\n\n public async list(): Promise<FiatCurrency[]> {\n const response = await this.httpClient.request<unknown>({\n path: '/currency',\n });\n\n return parseStringArray(response, 'currency') as FiatCurrency[];\n }\n}\n","import type { HttpClient } from '../core/http';\nimport { parsePaymentRecord } from '../core/validation';\nimport { MinimumAmountPolicy, assertPaymentModeSupported } from '../domain/conversion';\nimport { UnsupportedPaymentModeError, ValidationError } from '../domain/errors';\nimport type {\n CreateDepositInput,\n CreateDepositRequest,\n CreatePaymentInput,\n CreatePaymentOrDepositRequest,\n CreatePaymentRequest,\n PaymentRecord,\n} from '../domain/models';\nimport { isStableCryptoCurrency } from '../domain/enums';\n\nexport class PaymentsResource {\n private readonly httpClient: HttpClient;\n private readonly minimumAmountPolicy: MinimumAmountPolicy;\n\n public constructor(httpClient: HttpClient, minimumAmountPolicy: MinimumAmountPolicy) {\n this.httpClient = httpClient;\n this.minimumAmountPolicy = minimumAmountPolicy;\n }\n\n public async create(input: CreatePaymentOrDepositRequest): Promise<PaymentRecord> {\n if (input.paymentType === 'PAYMENT') {\n return this.createPayment(input);\n }\n\n return this.createDeposit(input);\n }\n\n public async createPayment(input: CreatePaymentInput | CreatePaymentRequest): Promise<PaymentRecord> {\n const request: CreatePaymentRequest = {\n ...input,\n paymentType: 'PAYMENT',\n };\n\n if (request.fiatAmount <= 0) {\n throw new ValidationError('fiatAmount must be greater than zero.', { details: request });\n }\n\n assertPaymentModeSupported(request.paymentType, request.cryptoCurrency);\n await this.minimumAmountPolicy.assertFiatAmountEligible(request.fiatAmount, request.fiatCurrency);\n\n const response = await this.httpClient.request<unknown>({\n path: '/payment',\n method: 'POST',\n body: request,\n requiresAuth: true,\n });\n\n return parsePaymentRecord(response);\n }\n\n public async createDeposit(input: CreateDepositInput | CreateDepositRequest): Promise<PaymentRecord> {\n const request: CreateDepositRequest = {\n ...input,\n paymentType: 'DEPOSIT',\n };\n\n if (isStableCryptoCurrency(request.cryptoCurrency)) {\n throw new UnsupportedPaymentModeError(\n `Stablecoin ${request.cryptoCurrency} supports only PAYMENT, not DEPOSIT.`,\n { details: request },\n );\n }\n\n const response = await this.httpClient.request<unknown>({\n path: '/payment',\n method: 'POST',\n body: request,\n requiresAuth: true,\n });\n\n return parsePaymentRecord(response);\n }\n\n public async getByHash(hash: string): Promise<PaymentRecord> {\n if (!hash) {\n throw new ValidationError('hash is required.');\n }\n\n const response = await this.httpClient.request<unknown>({\n path: '/payment',\n query: { hash },\n requiresAuth: false,\n });\n\n return parsePaymentRecord(response);\n }\n}\n","import type { HttpClient } from '../core/http';\nimport { parseWalletBalances, parseWithdrawalResponse } from '../core/validation';\nimport { ValidationError } from '../domain/errors';\nimport type {\n WalletBalances,\n WithdrawalResponse,\n WithdrawAllInput,\n WithdrawSingleInput,\n} from '../domain/models';\n\nexport class WalletResource {\n private readonly httpClient: HttpClient;\n\n public constructor(httpClient: HttpClient) {\n this.httpClient = httpClient;\n }\n\n public async get(): Promise<WalletBalances> {\n const response = await this.httpClient.request<unknown>({\n path: '/wallet',\n requiresAuth: true,\n });\n\n return parseWalletBalances(response);\n }\n\n public async withdraw(input: WithdrawAllInput | WithdrawSingleInput): Promise<WithdrawalResponse> {\n this.assertWithdrawalInput(input);\n\n const response = await this.httpClient.request<unknown>({\n path: '/wallet/withdrawal',\n method: 'POST',\n body: input,\n requiresAuth: true,\n });\n\n return parseWithdrawalResponse(response);\n }\n\n public async calculate(input: WithdrawAllInput | WithdrawSingleInput): Promise<WithdrawalResponse> {\n return this.withdraw({\n ...input,\n onlyCalculate: true,\n });\n }\n\n public async withdrawAll(\n input: Omit<WithdrawAllInput, 'withdrawType' | 'onlyCalculate'>,\n ): Promise<WithdrawalResponse> {\n return this.withdraw({\n ...input,\n withdrawType: 'ALL',\n onlyCalculate: false,\n });\n }\n\n public async withdrawSingle(\n input: Omit<WithdrawSingleInput, 'withdrawType' | 'onlyCalculate'>,\n ): Promise<WithdrawalResponse> {\n return this.withdraw({\n ...input,\n withdrawType: 'SINGLE',\n onlyCalculate: false,\n });\n }\n\n public async calculateAll(\n input: Omit<WithdrawAllInput, 'withdrawType' | 'onlyCalculate'>,\n ): Promise<WithdrawalResponse> {\n return this.calculate({\n ...input,\n withdrawType: 'ALL',\n });\n }\n\n public async calculateSingle(\n input: Omit<WithdrawSingleInput, 'withdrawType' | 'onlyCalculate'>,\n ): Promise<WithdrawalResponse> {\n return this.calculate({\n ...input,\n withdrawType: 'SINGLE',\n });\n }\n\n private assertWithdrawalInput(input: WithdrawAllInput | WithdrawSingleInput): void {\n if (!input.toAddress) {\n throw new ValidationError('toAddress is required.', { details: input });\n }\n\n if (input.withdrawType === 'SINGLE' && typeof input.paymentId !== 'number') {\n throw new ValidationError('paymentId is required for SINGLE withdrawals.', {\n details: input,\n });\n }\n }\n}\n","import { resolveClientOptions, type KryptoExpressClientOptions } from './core/config';\nimport { HttpClient } from './core/http';\nimport { MinimumAmountPolicy } from './domain/conversion';\nimport { CurrenciesResource } from './resources/currencies';\nimport { FiatResource } from './resources/fiat';\nimport { PaymentsResource } from './resources/payments';\nimport { WalletResource } from './resources/wallet';\n\nexport class KryptoExpressClient {\n public readonly payments: PaymentsResource;\n public readonly wallet: WalletResource;\n public readonly currencies: CurrenciesResource;\n public readonly fiat: FiatResource;\n\n public constructor(options: KryptoExpressClientOptions = {}) {\n const resolved = resolveClientOptions(options);\n const httpClient = new HttpClient(resolved);\n const minimumAmountPolicy = resolved.fiatConverter\n ? new MinimumAmountPolicy({ converter: resolved.fiatConverter })\n : new MinimumAmountPolicy();\n\n this.payments = new PaymentsResource(httpClient, minimumAmountPolicy);\n this.wallet = new WalletResource(httpClient);\n this.currencies = new CurrenciesResource(httpClient);\n this.fiat = new FiatResource(httpClient);\n }\n}\n\nexport type { KryptoExpressClientOptions } from './core/config';\n","import { createHmac, timingSafeEqual } from 'node:crypto';\n\nexport interface VerifyCallbackSignatureInput {\n rawBody: string;\n callbackSecret: string;\n signature: string | null | undefined;\n}\n\nexport function compactJson(rawBody: string): string {\n return JSON.stringify(JSON.parse(rawBody));\n}\n\nexport function computeCallbackSignature(rawBody: string, callbackSecret: string): string {\n const compactBody = compactJson(rawBody);\n return createHmac('sha512', callbackSecret).update(compactBody).digest('hex');\n}\n\nexport function verifyCallbackSignature(input: VerifyCallbackSignatureInput): boolean {\n if (!input.signature) {\n return false;\n }\n\n const expectedSignature = computeCallbackSignature(input.rawBody, input.callbackSecret);\n const actual = Buffer.from(input.signature, 'hex');\n const expected = Buffer.from(expectedSignature, 'hex');\n\n if (actual.length !== expected.length) {\n return false;\n }\n\n return timingSafeEqual(actual, expected);\n}\n"],"mappings":"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","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "kryptoexpress-sdk",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "TypeScript-first SDK for the KryptoExpress API.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "OpenAI Codex",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/kryptoexpress/kryptoexpress-typescript.git"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/kryptoexpress/kryptoexpress-typescript#readme",
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/kryptoexpress/kryptoexpress-typescript/issues"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"kryptoexpress",
|
|
17
|
+
"crypto",
|
|
18
|
+
"payments",
|
|
19
|
+
"sdk",
|
|
20
|
+
"typescript"
|
|
21
|
+
],
|
|
22
|
+
"engines": {
|
|
23
|
+
"node": ">=18.18"
|
|
24
|
+
},
|
|
25
|
+
"sideEffects": false,
|
|
26
|
+
"type": "module",
|
|
27
|
+
"main": "./dist/index.cjs",
|
|
28
|
+
"module": "./dist/index.js",
|
|
29
|
+
"types": "./dist/index.d.ts",
|
|
30
|
+
"exports": {
|
|
31
|
+
".": {
|
|
32
|
+
"types": "./dist/index.d.ts",
|
|
33
|
+
"import": "./dist/index.js",
|
|
34
|
+
"require": "./dist/index.cjs"
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
"files": [
|
|
38
|
+
"dist",
|
|
39
|
+
"README.md",
|
|
40
|
+
"CHANGELOG.md",
|
|
41
|
+
"LICENSE"
|
|
42
|
+
],
|
|
43
|
+
"scripts": {
|
|
44
|
+
"build": "tsup",
|
|
45
|
+
"clean": "powershell -Command \"if (Test-Path dist) { Remove-Item -Recurse -Force dist }\"",
|
|
46
|
+
"lint": "eslint src test --ext .ts",
|
|
47
|
+
"format": "prettier --write .",
|
|
48
|
+
"test": "vitest run",
|
|
49
|
+
"typecheck": "tsc --noEmit"
|
|
50
|
+
},
|
|
51
|
+
"publishConfig": {
|
|
52
|
+
"access": "public"
|
|
53
|
+
},
|
|
54
|
+
"devDependencies": {
|
|
55
|
+
"@eslint/js": "^9.25.1",
|
|
56
|
+
"@types/node": "^22.15.3",
|
|
57
|
+
"@typescript-eslint/eslint-plugin": "^8.30.1",
|
|
58
|
+
"@typescript-eslint/parser": "^8.30.1",
|
|
59
|
+
"eslint": "^9.25.1",
|
|
60
|
+
"eslint-config-prettier": "^10.1.2",
|
|
61
|
+
"prettier": "^3.5.3",
|
|
62
|
+
"tsup": "^8.5.0",
|
|
63
|
+
"typescript": "^5.8.3",
|
|
64
|
+
"typescript-eslint": "^8.30.1",
|
|
65
|
+
"vitest": "^3.1.2"
|
|
66
|
+
}
|
|
67
|
+
}
|