@codedartdev/coinsentry-sdk 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.
Files changed (44) hide show
  1. package/README.md +98 -1
  2. package/dist/brand/config.d.ts +35 -1
  3. package/dist/brand/config.d.ts.map +1 -1
  4. package/dist/brand/config.js +119 -15
  5. package/dist/brand/config.js.map +1 -1
  6. package/dist/brand/index.d.ts +2 -2
  7. package/dist/brand/index.d.ts.map +1 -1
  8. package/dist/brand/index.js +1 -1
  9. package/dist/brand/index.js.map +1 -1
  10. package/dist/brand/types.d.ts +31 -1
  11. package/dist/brand/types.d.ts.map +1 -1
  12. package/dist/brand/types.js.map +1 -1
  13. package/dist/client.d.ts +10 -4
  14. package/dist/client.d.ts.map +1 -1
  15. package/dist/client.js +49 -6
  16. package/dist/client.js.map +1 -1
  17. package/dist/errors.d.ts +1 -0
  18. package/dist/errors.d.ts.map +1 -1
  19. package/dist/errors.js +7 -0
  20. package/dist/errors.js.map +1 -1
  21. package/dist/http.d.ts +1 -1
  22. package/dist/http.d.ts.map +1 -1
  23. package/dist/http.js +38 -5
  24. package/dist/http.js.map +1 -1
  25. package/dist/index.d.ts +7 -5
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +3 -2
  28. package/dist/index.js.map +1 -1
  29. package/dist/market.d.ts +97 -0
  30. package/dist/market.d.ts.map +1 -0
  31. package/dist/market.js +264 -0
  32. package/dist/market.js.map +1 -0
  33. package/dist/products.d.ts +16 -2
  34. package/dist/products.d.ts.map +1 -1
  35. package/dist/products.js +70 -6
  36. package/dist/products.js.map +1 -1
  37. package/dist/realtime.d.ts +2 -0
  38. package/dist/realtime.d.ts.map +1 -1
  39. package/dist/realtime.js +3 -0
  40. package/dist/realtime.js.map +1 -1
  41. package/dist/types.d.ts +12 -9
  42. package/dist/types.d.ts.map +1 -1
  43. package/dist/types.js.map +1 -1
  44. package/package.json +6 -1
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/brand/types.ts"],"names":[],"mappings":"","sourcesContent":["export interface SecurityTxtConfig {\n contact?: string | string[];\n contacts?: string[];\n canonical?: string;\n expires?: string;\n policy?: string;\n preferredLanguages?: string | string[];\n}\n\nexport type BrandLogoType = 'text' | 'image';\nexport type BackendBrandLogoType = BrandLogoType | 'url' | 'upload';\n\n/** Shape of the canonical payload returned by GET /api/brand/theme. */\nexport interface BrandConfig {\n brand: {\n name: string;\n logo: {\n /** Backend may still send url/upload; the frontend normalizes those to image. */\n type: BackendBrandLogoType;\n text: {\n base: string;\n accent: string;\n fontFamily?: string | null;\n colors?: {\n light?: {\n base?: string | null;\n accent?: string | null;\n };\n dark?: {\n base?: string | null;\n accent?: string | null;\n };\n };\n };\n imageUrl: string | null;\n darkImageUrl?: string | null;\n layout?: {\n width?: string | number | null;\n height?: string | number | null;\n } | null;\n };\n tagline: string;\n description: string;\n };\r\n /** Browser title and meta-description per locale.\r\n * Keys are BCP-47 locale strings matching the locales array in i18n/config.ts */\r\n seo: {\r\n title: Record<string, string>;\r\n description: Record<string, string>;\r\n };\r\n favicon: {\n default: string | null;\n dark?: string | null;\n };\n /** Default application locale (BCP-47). Must be one of the values in i18n/config.ts */\n defaultLocale: string;\n availableLocales?: string[];\n theme: {\r\n defaultMode: 'light' | 'dark' | 'system';\r\n font: {\r\n sans: string;\r\n };\r\n radius: string;\r\n colors: {\r\n light: ColorSet;\r\n dark: ColorSet;\r\n };\r\n };\r\n /** Left branding panel used in login / register split-screen layout */\r\n authPanel: {\r\n /** Main panel background colour (hex). A darker gradient is derived from it. */\r\n background: string;\r\n /** Radial glow accent colour (hex). Applied at low opacity as a centre highlight. */\r\n accentGlow: string;\r\n };\r\n /** Feature flags — all optional; defaults to disabled when absent */\r\n features?: {\n /** Show CPF field in the registration form (Brasil-specific). Default: false */\n registerCpf?: boolean;\n };\n registration_document?: {\n collect_tax_id?: boolean;\n field?: string;\n required?: boolean;\n read_only_after_registration?: boolean;\n };\n client_flow?: Array<{\n screen?: string;\n collect_tax_id?: boolean;\n [key: string]: unknown;\n }>;\n compliance_config?: {\n client_flow?: Array<{\n screen?: string;\n collect_tax_id?: boolean;\n [key: string]: unknown;\n }>;\n [key: string]: unknown;\n };\n flow_config?: {\n compliance_config?: {\n client_flow?: Array<{\n screen?: string;\n collect_tax_id?: boolean;\n [key: string]: unknown;\n }>;\n [key: string]: unknown;\n };\n [key: string]: unknown;\n };\n securityTxt?: SecurityTxtConfig;\n security_txt?: SecurityTxtConfig;\n}\n\r\nexport interface ColorSet {\r\n primary: string;\r\n primaryForeground: string;\r\n background: string;\r\n foreground: string;\r\n}\r\n\r\n/** Utility: deep-partial for update patches */\r\nexport type DeepPartial<T> = {\r\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\r\n};\r\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/brand/types.ts"],"names":[],"mappings":"","sourcesContent":["export interface SecurityTxtConfig {\n contact?: string | string[];\n contacts?: string[];\n canonical?: string;\n expires?: string;\n policy?: string;\n preferredLanguages?: string | string[];\n}\n\nexport type BrandLogoType = 'text' | 'image';\nexport type BackendBrandLogoType = BrandLogoType | 'url' | 'upload';\nexport type BrandThemeMode = 'light' | 'dark' | 'system';\nexport type BrandTypographyToken =\n | 'display'\n | 'title'\n | 'subtitle'\n | 'body'\n | 'label'\n | 'caption'\n | 'button'\n | 'code'\n | 'overline';\n\nexport type BrandTypography = Partial<Record<BrandTypographyToken, string>>;\n\n/** Shape of the canonical payload returned by GET /api/brand/theme. */\nexport interface BrandConfig {\n brand: {\n name: string;\n logo: {\n /** Backend may still send url/upload; the frontend normalizes those to image. */\n type: BackendBrandLogoType;\n text: {\n base: string;\n accent: string;\n fontFamily?: string | null;\n colors?: {\n light?: {\n base?: string | null;\n accent?: string | null;\n };\n dark?: {\n base?: string | null;\n accent?: string | null;\n };\n };\n };\n imageUrl: string | null;\n darkImageUrl?: string | null;\n layout?: {\n width?: string | number | null;\n height?: string | number | null;\n } | null;\n };\n tagline: string;\n description: string;\n };\r\n /** Browser title and meta-description per locale.\r\n * Keys are BCP-47 locale strings matching the locales array in i18n/config.ts */\r\n seo: {\r\n title: Record<string, string>;\r\n description: Record<string, string>;\r\n };\r\n favicon: {\n default: string | null;\n dark?: string | null;\n };\n /** Default application locale (BCP-47). Must be one of the values in i18n/config.ts */\n defaultLocale: string;\n availableLocales?: string[];\n theme: {\n defaultMode: BrandThemeMode;\n font: {\n sans: string;\n baseSize?: string | null;\n };\n typography?: BrandTypography | null;\n radius: string;\n colors: {\n light: ColorSet;\n dark: ColorSet;\r\n };\r\n };\r\n /** Left branding panel used in login / register split-screen layout */\r\n authPanel: {\r\n /** Main panel background colour (hex). A darker gradient is derived from it. */\r\n background: string;\r\n /** Radial glow accent colour (hex). Applied at low opacity as a centre highlight. */\r\n accentGlow: string;\r\n };\r\n /** Feature flags — all optional; defaults to disabled when absent */\r\n features?: {\n /** Show CPF field in the registration form (Brasil-specific). Default: false */\n registerCpf?: boolean;\n };\n registration_document?: {\n collect_tax_id?: boolean;\n field?: string;\n required?: boolean;\n read_only_after_registration?: boolean;\n };\n client_flow?: Array<{\n screen?: string;\n collect_tax_id?: boolean;\n [key: string]: unknown;\n }>;\n compliance_config?: {\n client_flow?: Array<{\n screen?: string;\n collect_tax_id?: boolean;\n [key: string]: unknown;\n }>;\n [key: string]: unknown;\n };\n flow_config?: {\n compliance_config?: {\n client_flow?: Array<{\n screen?: string;\n collect_tax_id?: boolean;\n [key: string]: unknown;\n }>;\n [key: string]: unknown;\n };\n [key: string]: unknown;\n };\n securityTxt?: SecurityTxtConfig;\n security_txt?: SecurityTxtConfig;\n}\n\r\nexport interface ColorSet {\n primary: string;\n primaryForeground: string;\n background: string;\n foreground: string;\n secondary?: string;\n secondaryForeground?: string;\n warning?: string;\n warningForeground?: string;\n danger?: string;\n dangerForeground?: string;\n success?: string;\n successForeground?: string;\n rising?: string;\n risingForeground?: string;\n downing?: string;\n downingForeground?: string;\n card?: string;\n cardForeground?: string;\n muted?: string;\n mutedForeground?: string;\n border?: string;\n input?: string;\n ring?: string;\n textTitle?: string;\n textSubtitle?: string;\n textPrimary?: string;\n textSecondary?: string;\n textLink?: string;\n textButton?: string;\n}\n\r\n/** Utility: deep-partial for update patches */\r\nexport type DeepPartial<T> = {\r\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\r\n};\r\n"]}
package/dist/client.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { type CoinSentryError } from './errors.js';
2
2
  import { type CoinSentryHttpAdapter, type CoinSentryHttpRequest } from './http.js';
3
3
  import { type CoinSentryPasswordResetPayload, type CoinSentryResetPasswordPayload } from './products.js';
4
- import type { CoinSentryBrandConfig, CoinSentryEntity, CoinSentryLoginResponse, CoinSentryRegisterPayload, CoinSentrySelectEntityResponse, CoinSentrySession } from './types.js';
4
+ import type { CoinSentryBrandConfigOptions, CoinSentryBrandConfigResponse, CoinSentryEntity, CoinSentryLoginResponse, CoinSentryRegisterPayload, CoinSentrySelectEntityResponse, CoinSentrySession } from './types.js';
5
5
  import type { ClientFlowStep, KycFlowScreen, KycOverviewData, KycVerificationData } from './kyc/index.js';
6
6
  export type CoinSentryClientOptions = {
7
7
  baseUrl?: string;
@@ -102,9 +102,15 @@ export declare function createCoinSentryClient(options?: CoinSentryClientOptions
102
102
  getRankingsByActiveReferrals: <T = unknown>(options?: import("./products.js").CoinSentryRequestOptions) => Promise<T>;
103
103
  };
104
104
  market: {
105
+ listMarkets: (options?: import("./products.js").CoinSentryRequestOptions) => Promise<import("./market.js").CoinSentryMarketListItem[]>;
106
+ getTicker: (symbol: string, options?: import("./products.js").CoinSentryRequestOptions) => Promise<import("./market.js").CoinSentryMarketTicker>;
105
107
  getOrderbook: <T = unknown>(symbol: string, depth?: number, options?: import("./products.js").CoinSentryRequestOptions) => Promise<T>;
106
- getMarket: <T = unknown>(symbol: string, options?: import("./products.js").CoinSentryRequestOptions) => Promise<T>;
107
- createOrder: <T = unknown>(payload: unknown) => Promise<T>;
108
+ getOrderbookSnapshot: (symbol: string, depth?: number, options?: import("./products.js").CoinSentryRequestOptions) => Promise<import("./market.js").CoinSentryOrderbookSnapshot>;
109
+ getMarketDetails: <T = import("./market.js").CoinSentryMarketDetails>(symbol: string, options?: import("./products.js").CoinSentryRequestOptions) => Promise<T>;
110
+ getMarket: <T = import("./market.js").CoinSentryMarketDetails>(symbol: string, options?: import("./products.js").CoinSentryRequestOptions) => Promise<T>;
111
+ getTrades: (symbol: string, options?: import("./products.js").CoinSentryMarketTradesOptions) => Promise<import("./market.js").CoinSentryPublicTrade[]>;
112
+ getCandles: (symbol: string, options: import("./products.js").CoinSentryMarketCandlesOptions) => Promise<import("./market.js").CoinSentryMarketCandle[]>;
113
+ createOrder: <T = unknown>(payload: import("./market.js").CoinSentryCreateOrderPayload) => Promise<T>;
108
114
  cancelOrder: (orderId: number) => Promise<unknown>;
109
115
  cancelAllOrders: (symbol: string) => Promise<unknown>;
110
116
  };
@@ -163,7 +169,7 @@ export declare function createCoinSentryClient(options?: CoinSentryClientOptions
163
169
  upload(input: CoinSentryKycUploadPayload): Promise<unknown>;
164
170
  };
165
171
  brand: {
166
- getConfig(): Promise<CoinSentryBrandConfig>;
172
+ getConfig(input?: CoinSentryBrandConfigOptions): Promise<CoinSentryBrandConfigResponse>;
167
173
  };
168
174
  };
169
175
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/client.js CHANGED
@@ -1,4 +1,5 @@
1
- import { CoinSentryApiError, normalizeCoinSentryError } from './errors.js';
1
+ import { CoinSentryApiError, coinSentryErrorFromResponse, isCoinSentryAbortError, normalizeCoinSentryError, } from './errors.js';
2
+ import { normalizeBrandConfig } from './brand/index.js';
2
3
  import { normalizeCoinSentryLoginResponse } from './guards.js';
3
4
  import { FetchHttpAdapter } from './http.js';
4
5
  import { createCoinSentryProductServices, } from './products.js';
@@ -47,6 +48,18 @@ function unwrapEnvelopeData(payload) {
47
48
  }
48
49
  return payload;
49
50
  }
51
+ function unwrapBrandConfig(payload) {
52
+ if (payload && typeof payload === 'object' && 'data' in payload) {
53
+ const data = payload.data;
54
+ return {
55
+ config: data?.payload ? normalizeBrandConfig(data.payload) : undefined,
56
+ brandKey: data?.brand_key,
57
+ };
58
+ }
59
+ return payload
60
+ ? { config: normalizeBrandConfig(payload) }
61
+ : {};
62
+ }
50
63
  export function createCoinSentryClient(options = {}) {
51
64
  const http = options.http ?? new FetchHttpAdapter({
52
65
  baseUrl: options.baseUrl ?? '/',
@@ -60,6 +73,8 @@ export function createCoinSentryClient(options = {}) {
60
73
  return await http.request(input);
61
74
  }
62
75
  catch (error) {
76
+ if (isCoinSentryAbortError(error))
77
+ throw error;
63
78
  const normalized = normalizeCoinSentryError(error);
64
79
  options.onError?.(normalized.toJSON());
65
80
  throw normalized;
@@ -221,16 +236,44 @@ export function createCoinSentryClient(options = {}) {
221
236
  },
222
237
  },
223
238
  brand: {
224
- async getConfig() {
239
+ async getConfig(input = {}) {
240
+ const headers = {};
241
+ if (input.etag)
242
+ headers['If-None-Match'] = input.etag;
225
243
  const response = await request({
226
244
  method: 'GET',
227
245
  path: '/api/brand/theme',
246
+ query: input.brandKey ? { brand_key: input.brandKey } : undefined,
247
+ headers,
248
+ signal: input.signal,
249
+ responseType: 'response',
228
250
  });
229
- if (response && typeof response === 'object' && 'data' in response) {
230
- const data = response.data;
231
- return data?.payload ?? {};
251
+ const etag = response.headers.get('etag') ?? undefined;
252
+ if (response.status === 304) {
253
+ return {
254
+ brandKey: input.brandKey,
255
+ etag: etag ?? input.etag,
256
+ notModified: true,
257
+ };
258
+ }
259
+ const body = await response.json().catch(() => null);
260
+ if (!response.ok) {
261
+ const error = coinSentryErrorFromResponse({
262
+ status: response.status,
263
+ statusText: response.statusText,
264
+ body,
265
+ requestId: response.headers.get('x-request-id'),
266
+ });
267
+ options.onError?.(error.toJSON());
268
+ throw error;
232
269
  }
233
- return response;
270
+ const { config, brandKey } = unwrapBrandConfig(body);
271
+ return {
272
+ config,
273
+ brandKey: brandKey ?? input.brandKey,
274
+ etag,
275
+ notModified: false,
276
+ };
234
277
  },
235
278
  },
236
279
  ...productServices,
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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","sourcesContent":["import { CoinSentryApiError, normalizeCoinSentryError, type CoinSentryError } from './errors.js';\nimport { normalizeCoinSentryLoginResponse } from './guards.js';\nimport { FetchHttpAdapter, type CoinSentryHttpAdapter, type CoinSentryHttpRequest } from './http.js';\nimport {\n createCoinSentryProductServices,\n type CoinSentryPasswordResetPayload,\n type CoinSentryResetPasswordPayload,\n} from './products.js';\nimport type {\n CoinSentryBrandConfig,\n CoinSentryEntity,\n CoinSentryLoginResponse,\n CoinSentryRegisterPayload,\n CoinSentrySelectEntityResponse,\n CoinSentrySession,\n} from './types.js';\nimport type { ClientFlowStep, KycFlowScreen, KycOverviewData, KycVerificationData } from './kyc/index.js';\n\nexport type CoinSentryClientOptions = {\n baseUrl?: string;\n locale?: string;\n timeoutMs?: number;\n http?: CoinSentryHttpAdapter;\n onError?: (error: CoinSentryError) => void;\n};\n\nexport type CoinSentryCsrfInitOptions = {\n force?: boolean;\n staleMs?: number;\n};\n\nexport type CoinSentryLoginPayload = {\n email: string;\n password: string;\n slideCaptchaToken: string;\n};\n\nexport type CoinSentryTwoFactorPayload = {\n code: string;\n recovery?: boolean;\n};\n\nexport type {\n CoinSentryPasswordResetPayload,\n CoinSentryResetPasswordPayload,\n} from './products.js';\n\nexport type CoinSentryEntitySelectPayload =\n | { entityUuid: string; entityId?: never }\n | { entityId: number; entityUuid?: never };\n\nexport type CoinSentryKycSubmitPayload = {\n step?: ClientFlowStep | null;\n stepKey?: string;\n screen?: KycFlowScreen;\n payload?: unknown;\n};\n\nexport type CoinSentryKycUploadPayload = {\n step?: ClientFlowStep | null;\n stepKey?: string;\n screen?: KycFlowScreen;\n formData: FormData;\n};\n\nexport type CoinSentryClient = ReturnType<typeof createCoinSentryClient>;\n\nconst DEFAULT_CSRF_STALE_MS = 120_000;\n\nconst KYC_STEP_ENDPOINTS: Partial<Record<KycFlowScreen, string>> = {\n account: '/api/v1/kyc/email',\n email: '/api/v1/kyc/email',\n phone: '/api/v1/kyc/phone',\n personal_data: '/api/v1/kyc/profile',\n tax_profile: '/api/v1/kyc/profile',\n company_data: '/api/v1/kyc/company-data',\n beneficial_owners: '/api/v1/kyc/beneficial-owners',\n transaction_profile: '/api/v1/kyc/transaction-profile',\n address: '/api/v1/kyc/address',\n document_upload: '/api/v1/kyc/document-photo',\n selfie: '/api/v1/kyc/selfie',\n review: '/api/v1/kyc/submit',\n};\n\nfunction createContractError(message: string): CoinSentryApiError {\n return new CoinSentryApiError({\n code: 'validation_failed',\n status: 0,\n message,\n });\n}\n\nfunction assertKycEndpoint(endpoint: string): string {\n if (!endpoint.startsWith('/api/v1/kyc/')) {\n throw createContractError('KYC endpoint must stay inside /api/v1/kyc');\n }\n\n return endpoint;\n}\n\nfunction resolveKycEndpoint(input: {\n step?: ClientFlowStep | null;\n screen?: KycFlowScreen;\n}): string {\n const screen = input.screen ?? input.step?.screen;\n const endpoint = input.step?.endpoint ?? (screen ? KYC_STEP_ENDPOINTS[screen] : undefined);\n\n if (!endpoint) {\n throw createContractError(`Unsupported KYC screen: ${screen ?? 'unknown'}`);\n }\n\n return assertKycEndpoint(endpoint);\n}\n\nfunction unwrapEnvelopeData<T>(payload: T | { data?: T; success?: boolean }): T {\n if (\n payload\n && typeof payload === 'object'\n && 'data' in payload\n && (payload as { data?: unknown }).data !== undefined\n ) {\n return (payload as { data: T }).data;\n }\n\n return payload as T;\n}\n\nexport function createCoinSentryClient(options: CoinSentryClientOptions = {}) {\n const http = options.http ?? new FetchHttpAdapter({\n baseUrl: options.baseUrl ?? '/',\n locale: options.locale,\n timeoutMs: options.timeoutMs,\n });\n let csrfInitPromise: Promise<void> | null = null;\n let csrfInitializedAt = 0;\n\n async function request<T>(input: CoinSentryHttpRequest): Promise<T> {\n try {\n return await http.request<T>(input);\n } catch (error) {\n const normalized = normalizeCoinSentryError(error);\n options.onError?.(normalized.toJSON());\n throw normalized;\n }\n }\n\n async function initCsrf(initOptions: CoinSentryCsrfInitOptions = {}): Promise<void> {\n const staleMs = initOptions.staleMs ?? DEFAULT_CSRF_STALE_MS;\n const now = Date.now();\n\n if (csrfInitPromise) return csrfInitPromise;\n if (!initOptions.force && csrfInitializedAt > 0 && now - csrfInitializedAt < staleMs) {\n return;\n }\n\n csrfInitPromise = request<void>({\n method: 'GET',\n path: '/sanctum/csrf-cookie',\n retryOnCsrf: false,\n }).then(() => {\n csrfInitializedAt = Date.now();\n }).finally(() => {\n csrfInitPromise = null;\n });\n\n return csrfInitPromise;\n }\n\n function setLocale(locale: string | null | undefined): void {\n http.setLocale?.(locale);\n }\n\n function setKycLocale(locale: string | null | undefined): void {\n http.setKycLocale?.(locale);\n }\n\n function clearKycLocale(): void {\n http.clearKycLocale?.();\n }\n\n const productServices = createCoinSentryProductServices(request);\n\n return {\n request,\n locale: {\n set: setLocale,\n setKyc: setKycLocale,\n clearKyc: clearKycLocale,\n },\n csrf: {\n init: initCsrf,\n },\n auth: {\n async login(payload: CoinSentryLoginPayload): Promise<CoinSentryLoginResponse> {\n await initCsrf({ force: true });\n const response = await request<CoinSentryLoginResponse>({\n method: 'POST',\n path: '/auth/login',\n retryOnCsrf: false,\n body: {\n email: payload.email,\n password: payload.password,\n slide_captcha_token: payload.slideCaptchaToken,\n slide_captcha_verified: '1',\n },\n });\n return normalizeCoinSentryLoginResponse(response);\n },\n async register(payload: CoinSentryRegisterPayload): Promise<unknown> {\n await initCsrf({ force: true });\n return request<unknown>({\n method: 'POST',\n path: '/auth/register',\n retryOnCsrf: false,\n body: payload,\n });\n },\n async requestPasswordReset(payload: CoinSentryPasswordResetPayload): Promise<unknown> {\n await initCsrf({ force: true });\n return request<unknown>({\n method: 'POST',\n path: '/auth/forgot-password',\n retryOnCsrf: false,\n body: {\n email: payload.email,\n slide_captcha_token: payload.slideCaptchaToken,\n slide_captcha_verified: '1',\n },\n });\n },\n async resetPassword(payload: CoinSentryResetPasswordPayload): Promise<unknown> {\n await initCsrf({ force: true });\n return request<unknown>({\n method: 'POST',\n path: '/auth/reset-password',\n retryOnCsrf: false,\n body: payload,\n });\n },\n async logout(): Promise<unknown> {\n return request<unknown>({ method: 'POST', path: '/auth/logout' });\n },\n async twoFactorChallenge(payload: CoinSentryTwoFactorPayload): Promise<CoinSentryLoginResponse> {\n await initCsrf({ force: true });\n const response = await request<CoinSentryLoginResponse>({\n method: 'POST',\n path: '/auth/two-factor-challenge',\n retryOnCsrf: false,\n body: payload.recovery\n ? { recovery_code: payload.code }\n : { code: payload.code },\n });\n return normalizeCoinSentryLoginResponse(response);\n },\n },\n session: {\n async refresh(): Promise<CoinSentrySession> {\n return request<CoinSentrySession>({ method: 'GET', path: '/api/user' });\n },\n },\n entity: {\n async list(): Promise<CoinSentryEntity[]> {\n const response = await request<CoinSentryEntity[] | { data?: CoinSentryEntity[] }>({\n method: 'GET',\n path: '/api/v1/entities',\n });\n return unwrapEnvelopeData<CoinSentryEntity[]>(response) ?? [];\n },\n async select(payload: CoinSentryEntitySelectPayload): Promise<CoinSentrySelectEntityResponse> {\n return request<CoinSentrySelectEntityResponse>({\n method: 'POST',\n path: '/api/v1/select-entity',\n body: 'entityUuid' in payload\n ? { entity_uuid: payload.entityUuid }\n : { entity_id: payload.entityId },\n });\n },\n },\n kyc: {\n async getOverview(): Promise<KycOverviewData> {\n const response = await request<KycOverviewData | { data?: KycOverviewData }>({\n method: 'GET',\n path: '/api/v1/kyc',\n });\n return unwrapEnvelopeData<KycOverviewData>(response);\n },\n async getStatus(): Promise<KycVerificationData> {\n const response = await request<KycVerificationData | { data?: KycVerificationData }>({\n method: 'GET',\n path: '/api/v1/kyc/status',\n });\n return unwrapEnvelopeData<KycVerificationData>(response);\n },\n async submitStep(input: CoinSentryKycSubmitPayload): Promise<unknown> {\n return request<unknown>({\n method: 'POST',\n path: resolveKycEndpoint(input),\n body: input.payload ?? {},\n });\n },\n async upload(input: CoinSentryKycUploadPayload): Promise<unknown> {\n return request<unknown>({\n method: 'POST',\n path: resolveKycEndpoint(input),\n body: input.formData,\n });\n },\n },\n brand: {\n async getConfig(): Promise<CoinSentryBrandConfig> {\n const response = await request<CoinSentryBrandConfig | { data?: { payload?: CoinSentryBrandConfig } }>({\n method: 'GET',\n path: '/api/brand/theme',\n });\n\n if (response && typeof response === 'object' && 'data' in response) {\n const data = (response as { data?: { payload?: CoinSentryBrandConfig } }).data;\n return data?.payload ?? {};\n }\n\n return response as CoinSentryBrandConfig;\n },\n },\n ...productServices,\n };\n}\n"]}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n CoinSentryApiError,\n coinSentryErrorFromResponse,\n isCoinSentryAbortError,\n normalizeCoinSentryError,\n type CoinSentryError,\n} from './errors.js';\nimport { normalizeBrandConfig, type BrandConfig } from './brand/index.js';\nimport { normalizeCoinSentryLoginResponse } from './guards.js';\nimport { FetchHttpAdapter, type CoinSentryHttpAdapter, type CoinSentryHttpRequest } from './http.js';\nimport {\n createCoinSentryProductServices,\n type CoinSentryPasswordResetPayload,\n type CoinSentryResetPasswordPayload,\n} from './products.js';\nimport type {\n CoinSentryBrandConfig,\n CoinSentryBrandConfigOptions,\n CoinSentryBrandConfigResponse,\n CoinSentryEntity,\n CoinSentryLoginResponse,\n CoinSentryRegisterPayload,\n CoinSentrySelectEntityResponse,\n CoinSentrySession,\n} from './types.js';\nimport type { ClientFlowStep, KycFlowScreen, KycOverviewData, KycVerificationData } from './kyc/index.js';\n\nexport type CoinSentryClientOptions = {\n baseUrl?: string;\n locale?: string;\n timeoutMs?: number;\n http?: CoinSentryHttpAdapter;\n onError?: (error: CoinSentryError) => void;\n};\n\nexport type CoinSentryCsrfInitOptions = {\n force?: boolean;\n staleMs?: number;\n};\n\nexport type CoinSentryLoginPayload = {\n email: string;\n password: string;\n slideCaptchaToken: string;\n};\n\nexport type CoinSentryTwoFactorPayload = {\n code: string;\n recovery?: boolean;\n};\n\nexport type {\n CoinSentryPasswordResetPayload,\n CoinSentryResetPasswordPayload,\n} from './products.js';\n\nexport type CoinSentryEntitySelectPayload =\n | { entityUuid: string; entityId?: never }\n | { entityId: number; entityUuid?: never };\n\nexport type CoinSentryKycSubmitPayload = {\n step?: ClientFlowStep | null;\n stepKey?: string;\n screen?: KycFlowScreen;\n payload?: unknown;\n};\n\nexport type CoinSentryKycUploadPayload = {\n step?: ClientFlowStep | null;\n stepKey?: string;\n screen?: KycFlowScreen;\n formData: FormData;\n};\n\nexport type CoinSentryClient = ReturnType<typeof createCoinSentryClient>;\n\nconst DEFAULT_CSRF_STALE_MS = 120_000;\n\nconst KYC_STEP_ENDPOINTS: Partial<Record<KycFlowScreen, string>> = {\n account: '/api/v1/kyc/email',\n email: '/api/v1/kyc/email',\n phone: '/api/v1/kyc/phone',\n personal_data: '/api/v1/kyc/profile',\n tax_profile: '/api/v1/kyc/profile',\n company_data: '/api/v1/kyc/company-data',\n beneficial_owners: '/api/v1/kyc/beneficial-owners',\n transaction_profile: '/api/v1/kyc/transaction-profile',\n address: '/api/v1/kyc/address',\n document_upload: '/api/v1/kyc/document-photo',\n selfie: '/api/v1/kyc/selfie',\n review: '/api/v1/kyc/submit',\n};\n\nfunction createContractError(message: string): CoinSentryApiError {\n return new CoinSentryApiError({\n code: 'validation_failed',\n status: 0,\n message,\n });\n}\n\nfunction assertKycEndpoint(endpoint: string): string {\n if (!endpoint.startsWith('/api/v1/kyc/')) {\n throw createContractError('KYC endpoint must stay inside /api/v1/kyc');\n }\n\n return endpoint;\n}\n\nfunction resolveKycEndpoint(input: {\n step?: ClientFlowStep | null;\n screen?: KycFlowScreen;\n}): string {\n const screen = input.screen ?? input.step?.screen;\n const endpoint = input.step?.endpoint ?? (screen ? KYC_STEP_ENDPOINTS[screen] : undefined);\n\n if (!endpoint) {\n throw createContractError(`Unsupported KYC screen: ${screen ?? 'unknown'}`);\n }\n\n return assertKycEndpoint(endpoint);\n}\n\nfunction unwrapEnvelopeData<T>(payload: T | { data?: T; success?: boolean }): T {\n if (\n payload\n && typeof payload === 'object'\n && 'data' in payload\n && (payload as { data?: unknown }).data !== undefined\n ) {\n return (payload as { data: T }).data;\n }\n\n return payload as T;\n}\n\ntype BrandingThemeEnvelope = {\n success?: boolean;\n data?: {\n brand_key?: string;\n payload?: BrandConfig;\n };\n};\n\nfunction unwrapBrandConfig(payload: unknown): { config?: CoinSentryBrandConfig; brandKey?: string } {\n if (payload && typeof payload === 'object' && 'data' in payload) {\n const data = (payload as BrandingThemeEnvelope).data;\n return {\n config: data?.payload ? normalizeBrandConfig(data.payload) : undefined,\n brandKey: data?.brand_key,\n };\n }\n\n return payload\n ? { config: normalizeBrandConfig(payload as BrandConfig) }\n : {};\n}\n\nexport function createCoinSentryClient(options: CoinSentryClientOptions = {}) {\n const http = options.http ?? new FetchHttpAdapter({\n baseUrl: options.baseUrl ?? '/',\n locale: options.locale,\n timeoutMs: options.timeoutMs,\n });\n let csrfInitPromise: Promise<void> | null = null;\n let csrfInitializedAt = 0;\n\n async function request<T>(input: CoinSentryHttpRequest): Promise<T> {\n try {\n return await http.request<T>(input);\n } catch (error) {\n if (isCoinSentryAbortError(error)) throw error;\n\n const normalized = normalizeCoinSentryError(error);\n options.onError?.(normalized.toJSON());\n throw normalized;\n }\n }\n\n async function initCsrf(initOptions: CoinSentryCsrfInitOptions = {}): Promise<void> {\n const staleMs = initOptions.staleMs ?? DEFAULT_CSRF_STALE_MS;\n const now = Date.now();\n\n if (csrfInitPromise) return csrfInitPromise;\n if (!initOptions.force && csrfInitializedAt > 0 && now - csrfInitializedAt < staleMs) {\n return;\n }\n\n csrfInitPromise = request<void>({\n method: 'GET',\n path: '/sanctum/csrf-cookie',\n retryOnCsrf: false,\n }).then(() => {\n csrfInitializedAt = Date.now();\n }).finally(() => {\n csrfInitPromise = null;\n });\n\n return csrfInitPromise;\n }\n\n function setLocale(locale: string | null | undefined): void {\n http.setLocale?.(locale);\n }\n\n function setKycLocale(locale: string | null | undefined): void {\n http.setKycLocale?.(locale);\n }\n\n function clearKycLocale(): void {\n http.clearKycLocale?.();\n }\n\n const productServices = createCoinSentryProductServices(request);\n\n return {\n request,\n locale: {\n set: setLocale,\n setKyc: setKycLocale,\n clearKyc: clearKycLocale,\n },\n csrf: {\n init: initCsrf,\n },\n auth: {\n async login(payload: CoinSentryLoginPayload): Promise<CoinSentryLoginResponse> {\n await initCsrf({ force: true });\n const response = await request<CoinSentryLoginResponse>({\n method: 'POST',\n path: '/auth/login',\n retryOnCsrf: false,\n body: {\n email: payload.email,\n password: payload.password,\n slide_captcha_token: payload.slideCaptchaToken,\n slide_captcha_verified: '1',\n },\n });\n return normalizeCoinSentryLoginResponse(response);\n },\n async register(payload: CoinSentryRegisterPayload): Promise<unknown> {\n await initCsrf({ force: true });\n return request<unknown>({\n method: 'POST',\n path: '/auth/register',\n retryOnCsrf: false,\n body: payload,\n });\n },\n async requestPasswordReset(payload: CoinSentryPasswordResetPayload): Promise<unknown> {\n await initCsrf({ force: true });\n return request<unknown>({\n method: 'POST',\n path: '/auth/forgot-password',\n retryOnCsrf: false,\n body: {\n email: payload.email,\n slide_captcha_token: payload.slideCaptchaToken,\n slide_captcha_verified: '1',\n },\n });\n },\n async resetPassword(payload: CoinSentryResetPasswordPayload): Promise<unknown> {\n await initCsrf({ force: true });\n return request<unknown>({\n method: 'POST',\n path: '/auth/reset-password',\n retryOnCsrf: false,\n body: payload,\n });\n },\n async logout(): Promise<unknown> {\n return request<unknown>({ method: 'POST', path: '/auth/logout' });\n },\n async twoFactorChallenge(payload: CoinSentryTwoFactorPayload): Promise<CoinSentryLoginResponse> {\n await initCsrf({ force: true });\n const response = await request<CoinSentryLoginResponse>({\n method: 'POST',\n path: '/auth/two-factor-challenge',\n retryOnCsrf: false,\n body: payload.recovery\n ? { recovery_code: payload.code }\n : { code: payload.code },\n });\n return normalizeCoinSentryLoginResponse(response);\n },\n },\n session: {\n async refresh(): Promise<CoinSentrySession> {\n return request<CoinSentrySession>({ method: 'GET', path: '/api/user' });\n },\n },\n entity: {\n async list(): Promise<CoinSentryEntity[]> {\n const response = await request<CoinSentryEntity[] | { data?: CoinSentryEntity[] }>({\n method: 'GET',\n path: '/api/v1/entities',\n });\n return unwrapEnvelopeData<CoinSentryEntity[]>(response) ?? [];\n },\n async select(payload: CoinSentryEntitySelectPayload): Promise<CoinSentrySelectEntityResponse> {\n return request<CoinSentrySelectEntityResponse>({\n method: 'POST',\n path: '/api/v1/select-entity',\n body: 'entityUuid' in payload\n ? { entity_uuid: payload.entityUuid }\n : { entity_id: payload.entityId },\n });\n },\n },\n kyc: {\n async getOverview(): Promise<KycOverviewData> {\n const response = await request<KycOverviewData | { data?: KycOverviewData }>({\n method: 'GET',\n path: '/api/v1/kyc',\n });\n return unwrapEnvelopeData<KycOverviewData>(response);\n },\n async getStatus(): Promise<KycVerificationData> {\n const response = await request<KycVerificationData | { data?: KycVerificationData }>({\n method: 'GET',\n path: '/api/v1/kyc/status',\n });\n return unwrapEnvelopeData<KycVerificationData>(response);\n },\n async submitStep(input: CoinSentryKycSubmitPayload): Promise<unknown> {\n return request<unknown>({\n method: 'POST',\n path: resolveKycEndpoint(input),\n body: input.payload ?? {},\n });\n },\n async upload(input: CoinSentryKycUploadPayload): Promise<unknown> {\n return request<unknown>({\n method: 'POST',\n path: resolveKycEndpoint(input),\n body: input.formData,\n });\n },\n },\n brand: {\n async getConfig(input: CoinSentryBrandConfigOptions = {}): Promise<CoinSentryBrandConfigResponse> {\n const headers: Record<string, string> = {};\n if (input.etag) headers['If-None-Match'] = input.etag;\n\n const response = await request<Response>({\n method: 'GET',\n path: '/api/brand/theme',\n query: input.brandKey ? { brand_key: input.brandKey } : undefined,\n headers,\n signal: input.signal,\n responseType: 'response',\n });\n const etag = response.headers.get('etag') ?? undefined;\n if (response.status === 304) {\n return {\n brandKey: input.brandKey,\n etag: etag ?? input.etag,\n notModified: true,\n };\n }\n\n const body = await response.json().catch(() => null);\n if (!response.ok) {\n const error = coinSentryErrorFromResponse({\n status: response.status,\n statusText: response.statusText,\n body,\n requestId: response.headers.get('x-request-id'),\n });\n options.onError?.(error.toJSON());\n throw error;\n }\n\n const { config, brandKey } = unwrapBrandConfig(body);\n return {\n config,\n brandKey: brandKey ?? input.brandKey,\n etag,\n notModified: false,\n };\n },\n },\n ...productServices,\n };\n}\n"]}
package/dist/errors.d.ts CHANGED
@@ -21,6 +21,7 @@ export declare class CoinSentryApiError extends Error implements CoinSentryError
21
21
  toJSON(): CoinSentryError;
22
22
  }
23
23
  export declare function isCoinSentryError(error: unknown): error is CoinSentryApiError;
24
+ export declare function isCoinSentryAbortError(error: unknown): boolean;
24
25
  export declare function isCoinSentryErrorCode(value: unknown): value is CoinSentryErrorCode;
25
26
  export declare function normalizeCoinSentryError(error: unknown): CoinSentryApiError;
26
27
  export declare function coinSentryErrorFromResponse(input: {
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAExD,eAAO,MAAM,sBAAsB,6PAczB,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAAG,OAAO,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAExE,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,qBAAqB,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,qBAAa,kBAAmB,SAAQ,KAAM,YAAW,eAAe;IACtE,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,qBAAqB,CAAC;IAC7C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;gBAEf,KAAK,EAAE,eAAe;IAWlC,MAAM,IAAI,eAAe;CAW1B;AAkDD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CAG7E;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,mBAAmB,CAGlF;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,CA6B3E;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,GAAG,kBAAkB,CAoBrB"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAExD,eAAO,MAAM,sBAAsB,6PAczB,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAAG,OAAO,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAExE,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,qBAAqB,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,qBAAa,kBAAmB,SAAQ,KAAM,YAAW,eAAe;IACtE,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,qBAAqB,CAAC;IAC7C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;gBAEf,KAAK,EAAE,eAAe;IAWlC,MAAM,IAAI,eAAe;CAW1B;AAkDD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CAG7E;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAM9D;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,mBAAmB,CAGlF;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,CA6B3E;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,GAAG,kBAAkB,CAoBrB"}
package/dist/errors.js CHANGED
@@ -97,6 +97,13 @@ export function isCoinSentryError(error) {
97
97
  return error instanceof CoinSentryApiError
98
98
  || Boolean(error && typeof error === 'object' && 'code' in error && 'status' in error);
99
99
  }
100
+ export function isCoinSentryAbortError(error) {
101
+ if (!error || typeof error !== 'object')
102
+ return false;
103
+ const record = error;
104
+ return record.name === 'AbortError'
105
+ || record.code === 'ABORT_ERR';
106
+ }
100
107
  export function isCoinSentryErrorCode(value) {
101
108
  return typeof value === 'string'
102
109
  && COINSENTRY_ERROR_CODES.includes(value);
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,iBAAiB;IACjB,cAAc;IACd,cAAc;IACd,iBAAiB;IACjB,mBAAmB;IACnB,oBAAoB;IACpB,2BAA2B;IAC3B,mBAAmB;IACnB,cAAc;IACd,WAAW;IACX,eAAe;IACf,cAAc;IACd,eAAe;CACP,CAAC;AAcX,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAClC,IAAI,CAAsB;IAC1B,MAAM,CAAS;IACf,MAAM,CAAU;IAChB,WAAW,CAAyB;IACpC,SAAS,CAAU;IACnB,OAAO,CAAW;IAE3B,YAAY,KAAsB;QAChC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QACrC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QACjC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC/B,CAAC;IAED,MAAM;QACJ,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC;IACJ,CAAC;CACF;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAgC,CAAC,CAAC,CAAC,EAAE,CAAC;AACpF,CAAC;AAED,SAAS,UAAU,CAAC,GAAG,MAAiB;IACtC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE;YAAE,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;IACrE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC1D,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,MAAM,UAAU,GAA0B,EAAE,CAAC;IAE7C,KAAK,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACzD,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,UAAU;iBACxB,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;iBAC9C,MAAM,CAAC,OAAO,CAAC,CAAC;YACnB,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;gBAAE,UAAU,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC;QACxD,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;AACrE,CAAC;AAED,SAAS,cAAc,CAAC,MAAc,EAAE,IAA6B,EAAE,MAAe;IACpF,IAAI,MAAM,KAAK,mBAAmB,IAAI,MAAM,KAAK,oBAAoB,IAAI,MAAM,KAAK,2BAA2B,EAAE,CAAC;QAChH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,KAAK,KAAK,cAAc;QAAE,OAAO,cAAc,CAAC;IACpD,IAAI,KAAK,KAAK,iBAAiB,IAAI,KAAK,KAAK,qBAAqB;QAAE,OAAO,iBAAiB,CAAC;IAE7F,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,iBAAiB,CAAC;IAC7C,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,cAAc,CAAC;IAC1C,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,mBAAmB,CAAC;IAC/C,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,cAAc,CAAC;IAC1C,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,cAAc,CAAC;IAC1C,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,WAAW,CAAC;IACvC,IAAI,MAAM,IAAI,GAAG;QAAE,OAAO,cAAc,CAAC;IAEzC,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,OAAO,KAAK,YAAY,kBAAkB;WACrC,OAAO,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,CAAC,CAAC;AAC3F,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,OAAO,OAAO,KAAK,KAAK,QAAQ;WAC1B,sBAA4C,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAc;IACrD,IAAI,KAAK,YAAY,kBAAkB;QAAE,OAAO,KAAK,CAAC;IAEtD,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,OAAO,QAAQ,CAAC,MAAM,KAAK,QAAQ;QAChD,CAAC,CAAC,QAAQ,CAAC,MAAM;QACjB,CAAC,CAAC,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ;YACjC,CAAC,CAAC,MAAM,CAAC,MAAM;YACf,CAAC,CAAC,CAAC,CAAC;IACR,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAChF,MAAM,OAAO,GAAG,UAAU,CACxB,MAAM,CAAC,OAAO,EACd,IAAI,CAAC,OAAO,EACZ,MAAM,EACN,MAAM,CAAC,OAAO,CACf,IAAI,2BAA2B,CAAC;IAEjC,OAAO,IAAI,kBAAkB,CAAC;QAC5B,IAAI,EAAE,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC;QAC3E,MAAM;QACN,OAAO;QACP,MAAM;QACN,WAAW,EAAE,eAAe,CAAC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC;QAC1D,SAAS,EAAE,UAAU,CAAC,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC;QACtG,OAAO,EAAE,IAAI;KACd,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,KAK3C;IACC,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAChF,MAAM,OAAO,GAAG,UAAU,CACxB,MAAM,CAAC,OAAO,EACd,IAAI,CAAC,OAAO,EACZ,MAAM,EACN,KAAK,CAAC,UAAU,CACjB,IAAI,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC;IAE5B,OAAO,IAAI,kBAAkB,CAAC;QAC5B,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC;QAChD,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,OAAO;QACP,MAAM;QACN,WAAW,EAAE,eAAe,CAAC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC;QAC1D,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC;QACzD,OAAO,EAAE,KAAK,CAAC,IAAI;KACpB,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { CoinSentryFieldErrors } from './types.js';\n\nexport const COINSENTRY_ERROR_CODES = [\n 'unauthenticated',\n 'csrf_expired',\n 'kyc_required',\n 'entity_required',\n 'invalid_signature',\n 'origin_not_allowed',\n 'missing_signature_headers',\n 'validation_failed',\n 'rate_limited',\n 'forbidden',\n 'network_error',\n 'server_error',\n 'unknown_error',\n] as const;\n\nexport type CoinSentryErrorCode = typeof COINSENTRY_ERROR_CODES[number];\n\nexport type CoinSentryError = {\n code: CoinSentryErrorCode;\n status: number;\n message: string;\n reason?: string;\n fieldErrors?: CoinSentryFieldErrors;\n requestId?: string;\n details?: unknown;\n};\n\nexport class CoinSentryApiError extends Error implements CoinSentryError {\n readonly code: CoinSentryErrorCode;\n readonly status: number;\n readonly reason?: string;\n readonly fieldErrors?: CoinSentryFieldErrors;\n readonly requestId?: string;\n readonly details?: unknown;\n\n constructor(error: CoinSentryError) {\n super(error.message);\n this.name = 'CoinSentryApiError';\n this.code = error.code;\n this.status = error.status;\n this.reason = error.reason;\n this.fieldErrors = error.fieldErrors;\n this.requestId = error.requestId;\n this.details = error.details;\n }\n\n toJSON(): CoinSentryError {\n return {\n code: this.code,\n status: this.status,\n message: this.message,\n reason: this.reason,\n fieldErrors: this.fieldErrors,\n requestId: this.requestId,\n details: this.details,\n };\n }\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' ? value as Record<string, unknown> : {};\n}\n\nfunction readString(...values: unknown[]): string | undefined {\n for (const value of values) {\n if (typeof value === 'string' && value.trim()) return value.trim();\n }\n return undefined;\n}\n\nfunction readFieldErrors(value: unknown): CoinSentryFieldErrors | undefined {\n if (!value || typeof value !== 'object') return undefined;\n const errors = value as Record<string, unknown>;\n const normalized: CoinSentryFieldErrors = {};\n\n for (const [field, fieldValue] of Object.entries(errors)) {\n if (Array.isArray(fieldValue)) {\n const messages = fieldValue\n .map((message) => String(message ?? '').trim())\n .filter(Boolean);\n if (messages.length > 0) normalized[field] = messages;\n }\n }\n\n return Object.keys(normalized).length > 0 ? normalized : undefined;\n}\n\nfunction codeFromStatus(status: number, body: Record<string, unknown>, reason?: string): CoinSentryErrorCode {\n if (reason === 'invalid_signature' || reason === 'origin_not_allowed' || reason === 'missing_signature_headers') {\n return reason;\n }\n\n const error = readString(body.error);\n if (error === 'kyc_required') return 'kyc_required';\n if (error === 'entity_required' || error === 'entity_not_selected') return 'entity_required';\n\n if (status === 401) return 'unauthenticated';\n if (status === 419) return 'csrf_expired';\n if (status === 422) return 'validation_failed';\n if (status === 428) return 'kyc_required';\n if (status === 429) return 'rate_limited';\n if (status === 403) return 'forbidden';\n if (status >= 500) return 'server_error';\n\n return 'unknown_error';\n}\n\nexport function isCoinSentryError(error: unknown): error is CoinSentryApiError {\n return error instanceof CoinSentryApiError\n || Boolean(error && typeof error === 'object' && 'code' in error && 'status' in error);\n}\n\nexport function isCoinSentryErrorCode(value: unknown): value is CoinSentryErrorCode {\n return typeof value === 'string'\n && (COINSENTRY_ERROR_CODES as readonly string[]).includes(value);\n}\n\nexport function normalizeCoinSentryError(error: unknown): CoinSentryApiError {\n if (error instanceof CoinSentryApiError) return error;\n\n const record = asRecord(error);\n const response = asRecord(record.response);\n const body = asRecord(response.data ?? record.data);\n const nested = asRecord(body.data);\n const status = typeof response.status === 'number'\n ? response.status\n : typeof record.status === 'number'\n ? record.status\n : 0;\n const reason = readString(nested.reason, body.reason, nested.error, body.error);\n const message = readString(\n nested.message,\n body.message,\n reason,\n record.message,\n ) ?? 'CoinSentry request failed';\n\n return new CoinSentryApiError({\n code: status === 0 ? 'network_error' : codeFromStatus(status, body, reason),\n status,\n message,\n reason,\n fieldErrors: readFieldErrors(body.errors ?? nested.errors),\n requestId: readString(response.headers && asRecord(response.headers)['x-request-id'], body.request_id),\n details: body,\n });\n}\n\nexport function coinSentryErrorFromResponse(input: {\n status: number;\n statusText?: string;\n body?: unknown;\n requestId?: string | null;\n}): CoinSentryApiError {\n const body = asRecord(input.body);\n const nested = asRecord(body.data);\n const reason = readString(nested.reason, body.reason, nested.error, body.error);\n const message = readString(\n nested.message,\n body.message,\n reason,\n input.statusText,\n ) ?? `HTTP ${input.status}`;\n\n return new CoinSentryApiError({\n code: codeFromStatus(input.status, body, reason),\n status: input.status,\n message,\n reason,\n fieldErrors: readFieldErrors(body.errors ?? nested.errors),\n requestId: input.requestId ?? readString(body.request_id),\n details: input.body,\n });\n}\n"]}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CoinSentryFieldErrors } from './types.js';\n\nexport const COINSENTRY_ERROR_CODES = [\n 'unauthenticated',\n 'csrf_expired',\n 'kyc_required',\n 'entity_required',\n 'invalid_signature',\n 'origin_not_allowed',\n 'missing_signature_headers',\n 'validation_failed',\n 'rate_limited',\n 'forbidden',\n 'network_error',\n 'server_error',\n 'unknown_error',\n] as const;\n\nexport type CoinSentryErrorCode = typeof COINSENTRY_ERROR_CODES[number];\n\nexport type CoinSentryError = {\n code: CoinSentryErrorCode;\n status: number;\n message: string;\n reason?: string;\n fieldErrors?: CoinSentryFieldErrors;\n requestId?: string;\n details?: unknown;\n};\n\nexport class CoinSentryApiError extends Error implements CoinSentryError {\n readonly code: CoinSentryErrorCode;\n readonly status: number;\n readonly reason?: string;\n readonly fieldErrors?: CoinSentryFieldErrors;\n readonly requestId?: string;\n readonly details?: unknown;\n\n constructor(error: CoinSentryError) {\n super(error.message);\n this.name = 'CoinSentryApiError';\n this.code = error.code;\n this.status = error.status;\n this.reason = error.reason;\n this.fieldErrors = error.fieldErrors;\n this.requestId = error.requestId;\n this.details = error.details;\n }\n\n toJSON(): CoinSentryError {\n return {\n code: this.code,\n status: this.status,\n message: this.message,\n reason: this.reason,\n fieldErrors: this.fieldErrors,\n requestId: this.requestId,\n details: this.details,\n };\n }\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' ? value as Record<string, unknown> : {};\n}\n\nfunction readString(...values: unknown[]): string | undefined {\n for (const value of values) {\n if (typeof value === 'string' && value.trim()) return value.trim();\n }\n return undefined;\n}\n\nfunction readFieldErrors(value: unknown): CoinSentryFieldErrors | undefined {\n if (!value || typeof value !== 'object') return undefined;\n const errors = value as Record<string, unknown>;\n const normalized: CoinSentryFieldErrors = {};\n\n for (const [field, fieldValue] of Object.entries(errors)) {\n if (Array.isArray(fieldValue)) {\n const messages = fieldValue\n .map((message) => String(message ?? '').trim())\n .filter(Boolean);\n if (messages.length > 0) normalized[field] = messages;\n }\n }\n\n return Object.keys(normalized).length > 0 ? normalized : undefined;\n}\n\nfunction codeFromStatus(status: number, body: Record<string, unknown>, reason?: string): CoinSentryErrorCode {\n if (reason === 'invalid_signature' || reason === 'origin_not_allowed' || reason === 'missing_signature_headers') {\n return reason;\n }\n\n const error = readString(body.error);\n if (error === 'kyc_required') return 'kyc_required';\n if (error === 'entity_required' || error === 'entity_not_selected') return 'entity_required';\n\n if (status === 401) return 'unauthenticated';\n if (status === 419) return 'csrf_expired';\n if (status === 422) return 'validation_failed';\n if (status === 428) return 'kyc_required';\n if (status === 429) return 'rate_limited';\n if (status === 403) return 'forbidden';\n if (status >= 500) return 'server_error';\n\n return 'unknown_error';\n}\n\nexport function isCoinSentryError(error: unknown): error is CoinSentryApiError {\n return error instanceof CoinSentryApiError\n || Boolean(error && typeof error === 'object' && 'code' in error && 'status' in error);\n}\n\nexport function isCoinSentryAbortError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n\n const record = error as Record<string, unknown>;\n return record.name === 'AbortError'\n || record.code === 'ABORT_ERR';\n}\n\nexport function isCoinSentryErrorCode(value: unknown): value is CoinSentryErrorCode {\n return typeof value === 'string'\n && (COINSENTRY_ERROR_CODES as readonly string[]).includes(value);\n}\n\nexport function normalizeCoinSentryError(error: unknown): CoinSentryApiError {\n if (error instanceof CoinSentryApiError) return error;\n\n const record = asRecord(error);\n const response = asRecord(record.response);\n const body = asRecord(response.data ?? record.data);\n const nested = asRecord(body.data);\n const status = typeof response.status === 'number'\n ? response.status\n : typeof record.status === 'number'\n ? record.status\n : 0;\n const reason = readString(nested.reason, body.reason, nested.error, body.error);\n const message = readString(\n nested.message,\n body.message,\n reason,\n record.message,\n ) ?? 'CoinSentry request failed';\n\n return new CoinSentryApiError({\n code: status === 0 ? 'network_error' : codeFromStatus(status, body, reason),\n status,\n message,\n reason,\n fieldErrors: readFieldErrors(body.errors ?? nested.errors),\n requestId: readString(response.headers && asRecord(response.headers)['x-request-id'], body.request_id),\n details: body,\n });\n}\n\nexport function coinSentryErrorFromResponse(input: {\n status: number;\n statusText?: string;\n body?: unknown;\n requestId?: string | null;\n}): CoinSentryApiError {\n const body = asRecord(input.body);\n const nested = asRecord(body.data);\n const reason = readString(nested.reason, body.reason, nested.error, body.error);\n const message = readString(\n nested.message,\n body.message,\n reason,\n input.statusText,\n ) ?? `HTTP ${input.status}`;\n\n return new CoinSentryApiError({\n code: codeFromStatus(input.status, body, reason),\n status: input.status,\n message,\n reason,\n fieldErrors: readFieldErrors(body.errors ?? nested.errors),\n requestId: input.requestId ?? readString(body.request_id),\n details: input.body,\n });\n}\n"]}
package/dist/http.d.ts CHANGED
@@ -6,7 +6,7 @@ export type CoinSentryHttpRequest = {
6
6
  body?: unknown;
7
7
  headers?: Record<string, string>;
8
8
  signal?: AbortSignal;
9
- responseType?: 'json' | 'text' | 'blob';
9
+ responseType?: 'json' | 'text' | 'blob' | 'response';
10
10
  retryOnCsrf?: boolean;
11
11
  };
12
12
  export interface CoinSentryHttpAdapter {
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,oBAAoB,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE/E,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IACrE,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACxC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACvD,SAAS,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,CAAC;IACpD,YAAY,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,CAAC;IACvD,cAAc,CAAC,IAAI,IAAI,CAAC;CACzB;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AA8EF,qBAAa,gBAAiB,YAAW,qBAAqB;IAC5D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,OAAO,GAAE,uBAA4B;IAOjD,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI;IAIlD,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI;IAIrD,cAAc,IAAI,IAAI;IAIhB,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,CAAC,CAAC;YAI9C,gBAAgB;YA0BhB,KAAK;CAqDpB"}
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,oBAAoB,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE/E,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IACrE,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;IACrD,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACvD,SAAS,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,CAAC;IACpD,YAAY,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,CAAC;IACvD,cAAc,CAAC,IAAI,IAAI,CAAC;CACzB;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AA0HF,qBAAa,gBAAiB,YAAW,qBAAqB;IAC5D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,OAAO,GAAE,uBAA4B;IAOjD,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI;IAIlD,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI;IAIrD,cAAc,IAAI,IAAI;IAIhB,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,CAAC,CAAC;YAI9C,gBAAgB;YA8BhB,KAAK;CAmDpB"}
package/dist/http.js CHANGED
@@ -55,6 +55,38 @@ function shouldAttachXsrfToken(method, url, headers) {
55
55
  return false;
56
56
  return url.origin === window.location.origin;
57
57
  }
58
+ function createAbortReason(name, message) {
59
+ if (typeof DOMException !== 'undefined') {
60
+ return new DOMException(message, name);
61
+ }
62
+ const error = new Error(message);
63
+ error.name = name;
64
+ return error;
65
+ }
66
+ function createRequestSignal(externalSignal, timeoutMs) {
67
+ const controller = new AbortController();
68
+ const cleanupCallbacks = [];
69
+ const abortFromExternal = () => {
70
+ controller.abort(externalSignal?.reason ?? createAbortReason('AbortError', 'CoinSentry request aborted'));
71
+ };
72
+ if (externalSignal) {
73
+ if (externalSignal.aborted) {
74
+ abortFromExternal();
75
+ }
76
+ else {
77
+ externalSignal.addEventListener('abort', abortFromExternal, { once: true });
78
+ cleanupCallbacks.push(() => externalSignal.removeEventListener('abort', abortFromExternal));
79
+ }
80
+ }
81
+ const timeout = setTimeout(() => {
82
+ controller.abort(createAbortReason('TimeoutError', 'CoinSentry request timed out'));
83
+ }, timeoutMs);
84
+ cleanupCallbacks.push(() => clearTimeout(timeout));
85
+ return {
86
+ signal: controller.signal,
87
+ cleanup: () => cleanupCallbacks.forEach((cleanup) => cleanup()),
88
+ };
89
+ }
58
90
  async function parseResponse(response, responseType) {
59
91
  if (response.status === 204)
60
92
  return undefined;
@@ -105,6 +137,9 @@ export class FetchHttpAdapter {
105
137
  await this.fetch({ method: 'GET', path: this.csrfPath });
106
138
  return this.requestWithRetry(request, true);
107
139
  }
140
+ if (request.responseType === 'response') {
141
+ return response;
142
+ }
108
143
  const payload = await parseResponse(response, request.responseType);
109
144
  if (!response.ok) {
110
145
  throw coinSentryErrorFromResponse({
@@ -117,9 +152,7 @@ export class FetchHttpAdapter {
117
152
  return payload;
118
153
  }
119
154
  async fetch(request) {
120
- const controller = new AbortController();
121
- const timeout = setTimeout(() => controller.abort(), this.timeoutMs);
122
- const signal = request.signal ?? controller.signal;
155
+ const requestSignal = createRequestSignal(request.signal, this.timeoutMs);
123
156
  const method = request.method ?? 'GET';
124
157
  const url = resolveUrl(this.baseUrl, request.path, request.query);
125
158
  const headers = new Headers({
@@ -164,11 +197,11 @@ export class FetchHttpAdapter {
164
197
  headers,
165
198
  body,
166
199
  credentials: 'include',
167
- signal,
200
+ signal: requestSignal.signal,
168
201
  });
169
202
  }
170
203
  finally {
171
- clearTimeout(timeout);
204
+ requestSignal.cleanup();
172
205
  }
173
206
  }
174
207
  }
package/dist/http.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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","sourcesContent":["import { coinSentryErrorFromResponse } from './errors.js';\n\nexport type CoinSentryHttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n\nexport type CoinSentryHttpRequest = {\n method?: CoinSentryHttpMethod;\n path: string;\n query?: Record<string, string | number | boolean | null | undefined>;\n body?: unknown;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n responseType?: 'json' | 'text' | 'blob';\n retryOnCsrf?: boolean;\n};\n\nexport interface CoinSentryHttpAdapter {\n request<T>(request: CoinSentryHttpRequest): Promise<T>;\n setLocale?(locale: string | null | undefined): void;\n setKycLocale?(locale: string | null | undefined): void;\n clearKycLocale?(): void;\n}\n\nexport type FetchHttpAdapterOptions = {\n baseUrl?: string;\n locale?: string;\n timeoutMs?: number;\n csrfPath?: string;\n};\n\nfunction isFormDataBody(value: unknown): value is FormData {\n return typeof FormData !== 'undefined' && value instanceof FormData;\n}\n\nfunction isUrlSearchParamsBody(value: unknown): value is URLSearchParams {\n return typeof URLSearchParams !== 'undefined' && value instanceof URLSearchParams;\n}\n\nfunction appendQuery(url: URL, query: CoinSentryHttpRequest['query']): void {\n if (!query) return;\n\n for (const [key, value] of Object.entries(query)) {\n if (value === null || value === undefined) continue;\n url.searchParams.set(key, String(value));\n }\n}\n\nfunction resolveUrl(baseUrl: string, path: string, query?: CoinSentryHttpRequest['query']): URL {\n const base = typeof window !== 'undefined'\n ? new URL(baseUrl || '/', window.location.origin)\n : new URL(baseUrl || '/', 'http://localhost');\n const url = new URL(path, base);\n appendQuery(url, query);\n return url;\n}\n\nfunction isKycRequestPath(path: string): boolean {\n return path.includes('/api/v1/kyc');\n}\n\nfunction canReadBrowserCookies(): boolean {\n return typeof document !== 'undefined' && typeof document.cookie === 'string';\n}\n\nfunction readCookie(name: string): string | undefined {\n if (!canReadBrowserCookies()) return undefined;\n\n const prefix = `${name}=`;\n let value: string | undefined;\n for (const item of document.cookie.split(';')) {\n const cookie = item.trim();\n if (cookie.startsWith(prefix)) {\n value = cookie.slice(prefix.length);\n }\n }\n\n if (!value) return undefined;\n\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n}\n\nfunction shouldAttachXsrfToken(method: string, url: URL, headers: Headers): boolean {\n if (method === 'GET' || headers.has('X-XSRF-TOKEN')) return false;\n if (typeof window === 'undefined') return false;\n return url.origin === window.location.origin;\n}\n\nasync function parseResponse<T>(response: Response, responseType: CoinSentryHttpRequest['responseType']): Promise<T> {\n if (response.status === 204) return undefined as T;\n if (responseType === 'text') return await response.text() as T;\n if (responseType === 'blob') return await response.blob() as T;\n\n const text = await response.text();\n if (!text) return null as T;\n\n try {\n return JSON.parse(text) as T;\n } catch {\n return text as T;\n }\n}\n\nexport class FetchHttpAdapter implements CoinSentryHttpAdapter {\n private readonly baseUrl: string;\n private locale?: string;\n private kycLocale: string | null = null;\n private readonly timeoutMs: number;\n private readonly csrfPath: string;\n\n constructor(options: FetchHttpAdapterOptions = {}) {\n this.baseUrl = options.baseUrl ?? '/';\n this.locale = options.locale;\n this.timeoutMs = options.timeoutMs ?? 30_000;\n this.csrfPath = options.csrfPath ?? '/sanctum/csrf-cookie';\n }\n\n setLocale(locale: string | null | undefined): void {\n this.locale = locale || undefined;\n }\n\n setKycLocale(locale: string | null | undefined): void {\n this.kycLocale = locale || null;\n }\n\n clearKycLocale(): void {\n this.kycLocale = null;\n }\n\n async request<T>(request: CoinSentryHttpRequest): Promise<T> {\n return this.requestWithRetry<T>(request, false);\n }\n\n private async requestWithRetry<T>(request: CoinSentryHttpRequest, retried: boolean): Promise<T> {\n const response = await this.fetch(request);\n\n if (\n response.status === 419\n && request.retryOnCsrf !== false\n && !retried\n && request.path !== this.csrfPath\n ) {\n await this.fetch({ method: 'GET', path: this.csrfPath });\n return this.requestWithRetry<T>(request, true);\n }\n\n const payload = await parseResponse<T>(response, request.responseType);\n if (!response.ok) {\n throw coinSentryErrorFromResponse({\n status: response.status,\n statusText: response.statusText,\n body: payload,\n requestId: response.headers.get('x-request-id'),\n });\n }\n\n return payload;\n }\n\n private async fetch(request: CoinSentryHttpRequest): Promise<Response> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), this.timeoutMs);\n const signal = request.signal ?? controller.signal;\n const method = request.method ?? 'GET';\n const url = resolveUrl(this.baseUrl, request.path, request.query);\n const headers = new Headers({\n Accept: 'application/json',\n 'X-Requested-With': 'XMLHttpRequest',\n ...request.headers,\n });\n\n if (this.locale && !headers.has('Accept-Language')) {\n headers.set('Accept-Language', isKycRequestPath(request.path) && this.kycLocale\n ? this.kycLocale\n : this.locale);\n } else if (!this.locale && this.kycLocale && isKycRequestPath(request.path) && !headers.has('Accept-Language')) {\n headers.set('Accept-Language', this.kycLocale);\n }\n\n if (shouldAttachXsrfToken(method, url, headers)) {\n const token = readCookie('XSRF-TOKEN');\n if (token) headers.set('X-XSRF-TOKEN', token);\n }\n\n let body: BodyInit | undefined;\n if (request.body !== undefined && method !== 'GET') {\n if (isFormDataBody(request.body)) {\n body = request.body;\n headers.delete('Content-Type');\n } else if (isUrlSearchParamsBody(request.body)) {\n body = request.body;\n if (!headers.has('Content-Type')) {\n headers.set('Content-Type', 'application/x-www-form-urlencoded;charset=UTF-8');\n }\n } else {\n body = JSON.stringify(request.body);\n if (!headers.has('Content-Type')) headers.set('Content-Type', 'application/json');\n }\n }\n\n try {\n return await fetch(url, {\n method,\n headers,\n body,\n credentials: 'include',\n signal,\n });\n } finally {\n clearTimeout(timeout);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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","sourcesContent":["import { coinSentryErrorFromResponse } from './errors.js';\n\nexport type CoinSentryHttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n\nexport type CoinSentryHttpRequest = {\n method?: CoinSentryHttpMethod;\n path: string;\n query?: Record<string, string | number | boolean | null | undefined>;\n body?: unknown;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n responseType?: 'json' | 'text' | 'blob' | 'response';\n retryOnCsrf?: boolean;\n};\n\nexport interface CoinSentryHttpAdapter {\n request<T>(request: CoinSentryHttpRequest): Promise<T>;\n setLocale?(locale: string | null | undefined): void;\n setKycLocale?(locale: string | null | undefined): void;\n clearKycLocale?(): void;\n}\n\nexport type FetchHttpAdapterOptions = {\n baseUrl?: string;\n locale?: string;\n timeoutMs?: number;\n csrfPath?: string;\n};\n\nfunction isFormDataBody(value: unknown): value is FormData {\n return typeof FormData !== 'undefined' && value instanceof FormData;\n}\n\nfunction isUrlSearchParamsBody(value: unknown): value is URLSearchParams {\n return typeof URLSearchParams !== 'undefined' && value instanceof URLSearchParams;\n}\n\nfunction appendQuery(url: URL, query: CoinSentryHttpRequest['query']): void {\n if (!query) return;\n\n for (const [key, value] of Object.entries(query)) {\n if (value === null || value === undefined) continue;\n url.searchParams.set(key, String(value));\n }\n}\n\nfunction resolveUrl(baseUrl: string, path: string, query?: CoinSentryHttpRequest['query']): URL {\n const base = typeof window !== 'undefined'\n ? new URL(baseUrl || '/', window.location.origin)\n : new URL(baseUrl || '/', 'http://localhost');\n const url = new URL(path, base);\n appendQuery(url, query);\n return url;\n}\n\nfunction isKycRequestPath(path: string): boolean {\n return path.includes('/api/v1/kyc');\n}\n\nfunction canReadBrowserCookies(): boolean {\n return typeof document !== 'undefined' && typeof document.cookie === 'string';\n}\n\nfunction readCookie(name: string): string | undefined {\n if (!canReadBrowserCookies()) return undefined;\n\n const prefix = `${name}=`;\n let value: string | undefined;\n for (const item of document.cookie.split(';')) {\n const cookie = item.trim();\n if (cookie.startsWith(prefix)) {\n value = cookie.slice(prefix.length);\n }\n }\n\n if (!value) return undefined;\n\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n}\n\nfunction shouldAttachXsrfToken(method: string, url: URL, headers: Headers): boolean {\n if (method === 'GET' || headers.has('X-XSRF-TOKEN')) return false;\n if (typeof window === 'undefined') return false;\n return url.origin === window.location.origin;\n}\n\nfunction createAbortReason(name: 'AbortError' | 'TimeoutError', message: string): Error {\n if (typeof DOMException !== 'undefined') {\n return new DOMException(message, name);\n }\n\n const error = new Error(message);\n error.name = name;\n return error;\n}\n\nfunction createRequestSignal(externalSignal: AbortSignal | undefined, timeoutMs: number): {\n signal: AbortSignal;\n cleanup: () => void;\n} {\n const controller = new AbortController();\n const cleanupCallbacks: Array<() => void> = [];\n\n const abortFromExternal = () => {\n controller.abort(\n externalSignal?.reason ?? createAbortReason('AbortError', 'CoinSentry request aborted'),\n );\n };\n\n if (externalSignal) {\n if (externalSignal.aborted) {\n abortFromExternal();\n } else {\n externalSignal.addEventListener('abort', abortFromExternal, { once: true });\n cleanupCallbacks.push(() => externalSignal.removeEventListener('abort', abortFromExternal));\n }\n }\n\n const timeout = setTimeout(() => {\n controller.abort(createAbortReason('TimeoutError', 'CoinSentry request timed out'));\n }, timeoutMs);\n\n cleanupCallbacks.push(() => clearTimeout(timeout));\n\n return {\n signal: controller.signal,\n cleanup: () => cleanupCallbacks.forEach((cleanup) => cleanup()),\n };\n}\n\nasync function parseResponse<T>(response: Response, responseType: CoinSentryHttpRequest['responseType']): Promise<T> {\n if (response.status === 204) return undefined as T;\n if (responseType === 'text') return await response.text() as T;\n if (responseType === 'blob') return await response.blob() as T;\n\n const text = await response.text();\n if (!text) return null as T;\n\n try {\n return JSON.parse(text) as T;\n } catch {\n return text as T;\n }\n}\n\nexport class FetchHttpAdapter implements CoinSentryHttpAdapter {\n private readonly baseUrl: string;\n private locale?: string;\n private kycLocale: string | null = null;\n private readonly timeoutMs: number;\n private readonly csrfPath: string;\n\n constructor(options: FetchHttpAdapterOptions = {}) {\n this.baseUrl = options.baseUrl ?? '/';\n this.locale = options.locale;\n this.timeoutMs = options.timeoutMs ?? 30_000;\n this.csrfPath = options.csrfPath ?? '/sanctum/csrf-cookie';\n }\n\n setLocale(locale: string | null | undefined): void {\n this.locale = locale || undefined;\n }\n\n setKycLocale(locale: string | null | undefined): void {\n this.kycLocale = locale || null;\n }\n\n clearKycLocale(): void {\n this.kycLocale = null;\n }\n\n async request<T>(request: CoinSentryHttpRequest): Promise<T> {\n return this.requestWithRetry<T>(request, false);\n }\n\n private async requestWithRetry<T>(request: CoinSentryHttpRequest, retried: boolean): Promise<T> {\n const response = await this.fetch(request);\n\n if (\n response.status === 419\n && request.retryOnCsrf !== false\n && !retried\n && request.path !== this.csrfPath\n ) {\n await this.fetch({ method: 'GET', path: this.csrfPath });\n return this.requestWithRetry<T>(request, true);\n }\n\n if (request.responseType === 'response') {\n return response as T;\n }\n\n const payload = await parseResponse<T>(response, request.responseType);\n if (!response.ok) {\n throw coinSentryErrorFromResponse({\n status: response.status,\n statusText: response.statusText,\n body: payload,\n requestId: response.headers.get('x-request-id'),\n });\n }\n\n return payload;\n }\n\n private async fetch(request: CoinSentryHttpRequest): Promise<Response> {\n const requestSignal = createRequestSignal(request.signal, this.timeoutMs);\n const method = request.method ?? 'GET';\n const url = resolveUrl(this.baseUrl, request.path, request.query);\n const headers = new Headers({\n Accept: 'application/json',\n 'X-Requested-With': 'XMLHttpRequest',\n ...request.headers,\n });\n\n if (this.locale && !headers.has('Accept-Language')) {\n headers.set('Accept-Language', isKycRequestPath(request.path) && this.kycLocale\n ? this.kycLocale\n : this.locale);\n } else if (!this.locale && this.kycLocale && isKycRequestPath(request.path) && !headers.has('Accept-Language')) {\n headers.set('Accept-Language', this.kycLocale);\n }\n\n if (shouldAttachXsrfToken(method, url, headers)) {\n const token = readCookie('XSRF-TOKEN');\n if (token) headers.set('X-XSRF-TOKEN', token);\n }\n\n let body: BodyInit | undefined;\n if (request.body !== undefined && method !== 'GET') {\n if (isFormDataBody(request.body)) {\n body = request.body;\n headers.delete('Content-Type');\n } else if (isUrlSearchParamsBody(request.body)) {\n body = request.body;\n if (!headers.has('Content-Type')) {\n headers.set('Content-Type', 'application/x-www-form-urlencoded;charset=UTF-8');\n }\n } else {\n body = JSON.stringify(request.body);\n if (!headers.has('Content-Type')) headers.set('Content-Type', 'application/json');\n }\n }\n\n try {\n return await fetch(url, {\n method,\n headers,\n body,\n credentials: 'include',\n signal: requestSignal.signal,\n });\n } finally {\n requestSignal.cleanup();\n }\n }\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -1,16 +1,18 @@
1
- export { COINSENTRY_ERROR_CODES, CoinSentryApiError, coinSentryErrorFromResponse, isCoinSentryError, isCoinSentryErrorCode, normalizeCoinSentryError, } from './errors.js';
1
+ export { COINSENTRY_ERROR_CODES, CoinSentryApiError, coinSentryErrorFromResponse, isCoinSentryAbortError, isCoinSentryError, isCoinSentryErrorCode, normalizeCoinSentryError, } from './errors.js';
2
2
  export type { CoinSentryError, CoinSentryErrorCode, } from './errors.js';
3
3
  export { FetchHttpAdapter, } from './http.js';
4
4
  export type { CoinSentryHttpAdapter, CoinSentryHttpMethod, CoinSentryHttpRequest, FetchHttpAdapterOptions, } from './http.js';
5
5
  export { hasCoinSentryActiveEntity, isCoinSentryEntityMinimal, isCoinSentryLoginIncomplete, isCoinSentryLoginMultipleEntities, isCoinSentryLoginSingleEntity, isCoinSentryLoginSuccess, isCoinSentryLoginTwoFactor, isCoinSentrySession, normalizeCoinSentryLoginResponse, requiresCoinSentryEntitySelection, } from './guards.js';
6
6
  export { CoinSentryRealtime, createCoinSentryRealtime, } from './realtime.js';
7
7
  export type { CoinSentryRealtimeAdapter, CoinSentryRealtimeHandler, CoinSentryRealtimeStatus, CoinSentryRealtimeSubscription, } from './realtime.js';
8
+ export { buildCreateOrderPayload, getOrderbookChannel, normalizeMarketCandles, normalizeMarketSymbol, normalizeOrderbookSnapshot, normalizePublicTrade, } from './market.js';
9
+ export type { CoinSentryCandleInterval, CoinSentryCreateOrderInput, CoinSentryCreateOrderPayload, CoinSentryMarketBalance, CoinSentryMarketCandle, CoinSentryMarketDetails, CoinSentryMarketListItem, CoinSentryMarketSymbol, CoinSentryMarketTicker, CoinSentryMarketTradingPair, CoinSentryOrderbookLevel, CoinSentryOrderbookSnapshot, CoinSentryPublicTrade, } from './market.js';
8
10
  export { createCoinSentryClient, } from './client.js';
9
11
  export type { CoinSentryClient, CoinSentryClientOptions, CoinSentryCsrfInitOptions, CoinSentryEntitySelectPayload, CoinSentryKycSubmitPayload, CoinSentryKycUploadPayload, CoinSentryLoginPayload, CoinSentryTwoFactorPayload, } from './client.js';
10
- export type { CoinSentryEnvelope, CoinSentryOtcAvailableCoin, CoinSentryOtcCoin, CoinSentryOtcConvertExecuteRequest, CoinSentryOtcConvertQuote, CoinSentryOtcConvertQuoteRequest, CoinSentryOtcConvertResult, CoinSentryOtcRecurringExecution, CoinSentryOtcRecurringPlan, CoinSentryOtcRecurringPlanRequest, CoinSentryOtcTradingPair, CoinSentryOtcTradingPairsResponse, CoinSentryPaginationMeta, CoinSentryPaginationParams, CoinSentryPasswordResetPayload, CoinSentryQuery, CoinSentryRequestOptions, CoinSentryResetPasswordPayload, CoinSentryTwoFactorStatus, } from './products.js';
11
- export type { CoinSentryBalance, CoinSentryBalanceAmount, CoinSentryBalanceInput, CoinSentryBalanceUpdate, CoinSentryBalances, CoinSentryBrandConfig, CoinSentryEntity, CoinSentryEntityMinimal, CoinSentryEntityRole, CoinSentryEntitySummary, CoinSentryEntityType, CoinSentryFieldErrors, CoinSentryKycLevel, CoinSentryKycStatus, CoinSentryLocale, CoinSentryLoginIncomplete, CoinSentryLoginMultipleEntities, CoinSentryPartialSession, CoinSentryLoginResponse, CoinSentryLoginSingleEntity, CoinSentryLoginSuccess, CoinSentryLoginTwoFactor, CoinSentryRegisterPayload, CoinSentrySelectEntityResponse, CoinSentrySession, CoinSentryUser, } from './types.js';
12
+ export type { CoinSentryEnvelope, CoinSentryMarketCandlesOptions, CoinSentryMarketTradesOptions, CoinSentryOtcAvailableCoin, CoinSentryOtcCoin, CoinSentryOtcConvertExecuteRequest, CoinSentryOtcConvertQuote, CoinSentryOtcConvertQuoteRequest, CoinSentryOtcConvertResult, CoinSentryOtcRecurringExecution, CoinSentryOtcRecurringPlan, CoinSentryOtcRecurringPlanRequest, CoinSentryOtcTradingPair, CoinSentryOtcTradingPairsResponse, CoinSentryPaginationMeta, CoinSentryPaginationParams, CoinSentryPasswordResetPayload, CoinSentryQuery, CoinSentryRequestOptions, CoinSentryResetPasswordPayload, CoinSentryTwoFactorStatus, } from './products.js';
13
+ export type { CoinSentryBalance, CoinSentryBalanceAmount, CoinSentryBalanceInput, CoinSentryBalanceUpdate, CoinSentryBalances, CoinSentryBrandConfig, CoinSentryBrandConfigOptions, CoinSentryBrandConfigResponse, CoinSentryEntity, CoinSentryEntityMinimal, CoinSentryEntityRole, CoinSentryEntitySummary, CoinSentryEntityType, CoinSentryFieldErrors, CoinSentryKycLevel, CoinSentryKycStatus, CoinSentryLocale, CoinSentryLoginIncomplete, CoinSentryLoginMultipleEntities, CoinSentryPartialSession, CoinSentryLoginResponse, CoinSentryLoginSingleEntity, CoinSentryLoginSuccess, CoinSentryLoginTwoFactor, CoinSentryRegisterPayload, CoinSentrySelectEntityResponse, CoinSentrySession, CoinSentryUser, } from './types.js';
12
14
  export type { ClientFlowStep, KycCustomerType, KycFlowEntityType, KycFlowScreen, KycFlowSnapshot, KycFlowStateSummary, KycOverviewData, KycRequiredAction, KycRequirements, KycVerificationData, } from './kyc/index.js';
13
15
  export { canOpenUniversalStep, ensureReviewStep, findStepByMissing, flowEntityTypeForCustomerType, getComplianceSteps, getKycProgress, getRequirementsClientFlow, hasKycClientFlow, hasResolvedKycRequirements, isUniversalStepCompleted, isKycFlowSnapshotConfigured, isKycOverviewFlowConfigured, normalizeCustomerType, mergeKycRequirementsWithAnchor, preserveSsrKycRequirementsAnchor, requirementsFromOverview, resolveActiveKycStep, resolveKycFlowSnapshot, statusFromOverview, } from './kyc/index.js';
14
- export { buildBrandCss, buildBrandIconsMetadata, buildBrandManifest, fontSansToCssFamily, getBrandCssVariables, getBrandFaviconUrl, getLogoImageUrl, getLogoTextColors, getLogoTextFontFamily, inferImageMimeType, isImageLogoType, normalizeBrandConfig, normalizeFontSans, normalizeLogoDimension, normalizeLogoLayout, normalizeLogoType, resolveBrandThemeMode, } from './brand/index.js';
15
- export type { BackendBrandLogoType, BrandConfig, BrandIconDescriptor, BrandLogoType, BrandManifestIcon, BrandMode, BrandWebManifest, ColorSet, DeepPartial, NormalizedLogoLayout, SecurityTxtConfig, } from './brand/index.js';
16
+ export { buildBrandCss, buildBrandIconsMetadata, buildBrandManifest, fontSansToCssFamily, getBrandCssVariables, getBrandFaviconUrl, getLogoImageUrl, getLogoTextColors, getLogoTextFontFamily, inferImageMimeType, isImageLogoType, normalizeBrandConfig, normalizeBrandTypography, normalizeFontBaseSize, normalizeFontSans, normalizeLogoDimension, normalizeLogoLayout, normalizeLogoType, normalizeTypographyValue, resolveBrandThemeMode, } from './brand/index.js';
17
+ export type { BackendBrandLogoType, BrandConfig, BrandIconDescriptor, BrandLogoType, BrandManifestIcon, BrandMode, BrandThemeMode, BrandTypography, BrandTypographyToken, BrandWebManifest, ColorSet, DeepPartial, NormalizedLogoLayout, SecurityTxtConfig, } from './brand/index.js';
16
18
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,8 +1,9 @@
1
- export { COINSENTRY_ERROR_CODES, CoinSentryApiError, coinSentryErrorFromResponse, isCoinSentryError, isCoinSentryErrorCode, normalizeCoinSentryError, } from './errors.js';
1
+ export { COINSENTRY_ERROR_CODES, CoinSentryApiError, coinSentryErrorFromResponse, isCoinSentryAbortError, isCoinSentryError, isCoinSentryErrorCode, normalizeCoinSentryError, } from './errors.js';
2
2
  export { FetchHttpAdapter, } from './http.js';
3
3
  export { hasCoinSentryActiveEntity, isCoinSentryEntityMinimal, isCoinSentryLoginIncomplete, isCoinSentryLoginMultipleEntities, isCoinSentryLoginSingleEntity, isCoinSentryLoginSuccess, isCoinSentryLoginTwoFactor, isCoinSentrySession, normalizeCoinSentryLoginResponse, requiresCoinSentryEntitySelection, } from './guards.js';
4
4
  export { CoinSentryRealtime, createCoinSentryRealtime, } from './realtime.js';
5
+ export { buildCreateOrderPayload, getOrderbookChannel, normalizeMarketCandles, normalizeMarketSymbol, normalizeOrderbookSnapshot, normalizePublicTrade, } from './market.js';
5
6
  export { createCoinSentryClient, } from './client.js';
6
7
  export { canOpenUniversalStep, ensureReviewStep, findStepByMissing, flowEntityTypeForCustomerType, getComplianceSteps, getKycProgress, getRequirementsClientFlow, hasKycClientFlow, hasResolvedKycRequirements, isUniversalStepCompleted, isKycFlowSnapshotConfigured, isKycOverviewFlowConfigured, normalizeCustomerType, mergeKycRequirementsWithAnchor, preserveSsrKycRequirementsAnchor, requirementsFromOverview, resolveActiveKycStep, resolveKycFlowSnapshot, statusFromOverview, } from './kyc/index.js';
7
- export { buildBrandCss, buildBrandIconsMetadata, buildBrandManifest, fontSansToCssFamily, getBrandCssVariables, getBrandFaviconUrl, getLogoImageUrl, getLogoTextColors, getLogoTextFontFamily, inferImageMimeType, isImageLogoType, normalizeBrandConfig, normalizeFontSans, normalizeLogoDimension, normalizeLogoLayout, normalizeLogoType, resolveBrandThemeMode, } from './brand/index.js';
8
+ export { buildBrandCss, buildBrandIconsMetadata, buildBrandManifest, fontSansToCssFamily, getBrandCssVariables, getBrandFaviconUrl, getLogoImageUrl, getLogoTextColors, getLogoTextFontFamily, inferImageMimeType, isImageLogoType, normalizeBrandConfig, normalizeBrandTypography, normalizeFontBaseSize, normalizeFontSans, normalizeLogoDimension, normalizeLogoLayout, normalizeLogoType, normalizeTypographyValue, resolveBrandThemeMode, } from './brand/index.js';
8
9
  //# sourceMappingURL=index.js.map