@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
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,2BAA2B,EAC3B,iBAAiB,EACjB,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,aAAa,CAAC;AAKrB,OAAO,EACL,gBAAgB,GACjB,MAAM,WAAW,CAAC;AAOnB,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EACzB,2BAA2B,EAC3B,iCAAiC,EACjC,6BAA6B,EAC7B,wBAAwB,EACxB,0BAA0B,EAC1B,mBAAmB,EACnB,gCAAgC,EAChC,iCAAiC,GAClC,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,kBAAkB,EAClB,wBAAwB,GACzB,MAAM,eAAe,CAAC;AAOvB,OAAO,EACL,sBAAsB,GACvB,MAAM,aAAa,CAAC;AAwErB,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,6BAA6B,EAC7B,kBAAkB,EAClB,cAAc,EACd,yBAAyB,EACzB,gBAAgB,EAChB,0BAA0B,EAC1B,wBAAwB,EACxB,2BAA2B,EAC3B,2BAA2B,EAC3B,qBAAqB,EACrB,8BAA8B,EAC9B,gCAAgC,EAChC,wBAAwB,EACxB,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,kBAAkB,EAClB,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,EACtB,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC","sourcesContent":["export {\n COINSENTRY_ERROR_CODES,\n CoinSentryApiError,\n coinSentryErrorFromResponse,\n isCoinSentryError,\n isCoinSentryErrorCode,\n normalizeCoinSentryError,\n} from './errors.js';\nexport type {\n CoinSentryError,\n CoinSentryErrorCode,\n} from './errors.js';\nexport {\n FetchHttpAdapter,\n} from './http.js';\nexport type {\n CoinSentryHttpAdapter,\n CoinSentryHttpMethod,\n CoinSentryHttpRequest,\n FetchHttpAdapterOptions,\n} from './http.js';\nexport {\n hasCoinSentryActiveEntity,\n isCoinSentryEntityMinimal,\n isCoinSentryLoginIncomplete,\n isCoinSentryLoginMultipleEntities,\n isCoinSentryLoginSingleEntity,\n isCoinSentryLoginSuccess,\n isCoinSentryLoginTwoFactor,\n isCoinSentrySession,\n normalizeCoinSentryLoginResponse,\n requiresCoinSentryEntitySelection,\n} from './guards.js';\nexport {\n CoinSentryRealtime,\n createCoinSentryRealtime,\n} from './realtime.js';\nexport type {\n CoinSentryRealtimeAdapter,\n CoinSentryRealtimeHandler,\n CoinSentryRealtimeStatus,\n CoinSentryRealtimeSubscription,\n} from './realtime.js';\nexport {\n createCoinSentryClient,\n} from './client.js';\nexport type {\n CoinSentryClient,\n CoinSentryClientOptions,\n CoinSentryCsrfInitOptions,\n CoinSentryEntitySelectPayload,\n CoinSentryKycSubmitPayload,\n CoinSentryKycUploadPayload,\n CoinSentryLoginPayload,\n CoinSentryTwoFactorPayload,\n} from './client.js';\nexport type {\n CoinSentryEnvelope,\n CoinSentryOtcAvailableCoin,\n CoinSentryOtcCoin,\n CoinSentryOtcConvertExecuteRequest,\n CoinSentryOtcConvertQuote,\n CoinSentryOtcConvertQuoteRequest,\n CoinSentryOtcConvertResult,\n CoinSentryOtcRecurringExecution,\n CoinSentryOtcRecurringPlan,\n CoinSentryOtcRecurringPlanRequest,\n CoinSentryOtcTradingPair,\n CoinSentryOtcTradingPairsResponse,\n CoinSentryPaginationMeta,\n CoinSentryPaginationParams,\n CoinSentryPasswordResetPayload,\n CoinSentryQuery,\n CoinSentryRequestOptions,\n CoinSentryResetPasswordPayload,\n CoinSentryTwoFactorStatus,\n} from './products.js';\nexport type {\n CoinSentryBalance,\n CoinSentryBalanceAmount,\n CoinSentryBalanceInput,\n CoinSentryBalanceUpdate,\n CoinSentryBalances,\n CoinSentryBrandConfig,\n CoinSentryEntity,\n CoinSentryEntityMinimal,\n CoinSentryEntityRole,\n CoinSentryEntitySummary,\n CoinSentryEntityType,\n CoinSentryFieldErrors,\n CoinSentryKycLevel,\n CoinSentryKycStatus,\n CoinSentryLocale,\n CoinSentryLoginIncomplete,\n CoinSentryLoginMultipleEntities,\n CoinSentryPartialSession,\n CoinSentryLoginResponse,\n CoinSentryLoginSingleEntity,\n CoinSentryLoginSuccess,\n CoinSentryLoginTwoFactor,\n CoinSentryRegisterPayload,\n CoinSentrySelectEntityResponse,\n CoinSentrySession,\n CoinSentryUser,\n} from './types.js';\nexport type {\n ClientFlowStep,\n KycCustomerType,\n KycFlowEntityType,\n KycFlowScreen,\n KycFlowSnapshot,\n KycFlowStateSummary,\n KycOverviewData,\n KycRequiredAction,\n KycRequirements,\n KycVerificationData,\n} from './kyc/index.js';\nexport {\n canOpenUniversalStep,\n ensureReviewStep,\n findStepByMissing,\n flowEntityTypeForCustomerType,\n getComplianceSteps,\n getKycProgress,\n getRequirementsClientFlow,\n hasKycClientFlow,\n hasResolvedKycRequirements,\n isUniversalStepCompleted,\n isKycFlowSnapshotConfigured,\n isKycOverviewFlowConfigured,\n normalizeCustomerType,\n mergeKycRequirementsWithAnchor,\n preserveSsrKycRequirementsAnchor,\n requirementsFromOverview,\n resolveActiveKycStep,\n resolveKycFlowSnapshot,\n statusFromOverview,\n} from './kyc/index.js';\nexport {\n buildBrandCss,\n buildBrandIconsMetadata,\n buildBrandManifest,\n fontSansToCssFamily,\n getBrandCssVariables,\n getBrandFaviconUrl,\n getLogoImageUrl,\n getLogoTextColors,\n getLogoTextFontFamily,\n inferImageMimeType,\n isImageLogoType,\n normalizeBrandConfig,\n normalizeFontSans,\n normalizeLogoDimension,\n normalizeLogoLayout,\n normalizeLogoType,\n resolveBrandThemeMode,\n} from './brand/index.js';\nexport type {\n BackendBrandLogoType,\n BrandConfig,\n BrandIconDescriptor,\n BrandLogoType,\n BrandManifestIcon,\n BrandMode,\n BrandWebManifest,\n ColorSet,\n DeepPartial,\n NormalizedLogoLayout,\n SecurityTxtConfig,\n} from './brand/index.js';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,2BAA2B,EAC3B,sBAAsB,EACtB,iBAAiB,EACjB,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,aAAa,CAAC;AAKrB,OAAO,EACL,gBAAgB,GACjB,MAAM,WAAW,CAAC;AAOnB,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EACzB,2BAA2B,EAC3B,iCAAiC,EACjC,6BAA6B,EAC7B,wBAAwB,EACxB,0BAA0B,EAC1B,mBAAmB,EACnB,gCAAgC,EAChC,iCAAiC,GAClC,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,kBAAkB,EAClB,wBAAwB,GACzB,MAAM,eAAe,CAAC;AAOvB,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,sBAAsB,EACtB,qBAAqB,EACrB,0BAA0B,EAC1B,oBAAoB,GACrB,MAAM,aAAa,CAAC;AAgBrB,OAAO,EACL,sBAAsB,GACvB,MAAM,aAAa,CAAC;AA4ErB,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,6BAA6B,EAC7B,kBAAkB,EAClB,cAAc,EACd,yBAAyB,EACzB,gBAAgB,EAChB,0BAA0B,EAC1B,wBAAwB,EACxB,2BAA2B,EAC3B,2BAA2B,EAC3B,qBAAqB,EACrB,8BAA8B,EAC9B,gCAAgC,EAChC,wBAAwB,EACxB,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,kBAAkB,EAClB,eAAe,EACf,oBAAoB,EACpB,wBAAwB,EACxB,qBAAqB,EACrB,iBAAiB,EACjB,sBAAsB,EACtB,mBAAmB,EACnB,iBAAiB,EACjB,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC","sourcesContent":["export {\n COINSENTRY_ERROR_CODES,\n CoinSentryApiError,\n coinSentryErrorFromResponse,\n isCoinSentryAbortError,\n isCoinSentryError,\n isCoinSentryErrorCode,\n normalizeCoinSentryError,\n} from './errors.js';\nexport type {\n CoinSentryError,\n CoinSentryErrorCode,\n} from './errors.js';\nexport {\n FetchHttpAdapter,\n} from './http.js';\nexport type {\n CoinSentryHttpAdapter,\n CoinSentryHttpMethod,\n CoinSentryHttpRequest,\n FetchHttpAdapterOptions,\n} from './http.js';\nexport {\n hasCoinSentryActiveEntity,\n isCoinSentryEntityMinimal,\n isCoinSentryLoginIncomplete,\n isCoinSentryLoginMultipleEntities,\n isCoinSentryLoginSingleEntity,\n isCoinSentryLoginSuccess,\n isCoinSentryLoginTwoFactor,\n isCoinSentrySession,\n normalizeCoinSentryLoginResponse,\n requiresCoinSentryEntitySelection,\n} from './guards.js';\nexport {\n CoinSentryRealtime,\n createCoinSentryRealtime,\n} from './realtime.js';\nexport type {\n CoinSentryRealtimeAdapter,\n CoinSentryRealtimeHandler,\n CoinSentryRealtimeStatus,\n CoinSentryRealtimeSubscription,\n} from './realtime.js';\nexport {\n buildCreateOrderPayload,\n getOrderbookChannel,\n normalizeMarketCandles,\n normalizeMarketSymbol,\n normalizeOrderbookSnapshot,\n normalizePublicTrade,\n} from './market.js';\nexport type {\n CoinSentryCandleInterval,\n CoinSentryCreateOrderInput,\n CoinSentryCreateOrderPayload,\n CoinSentryMarketBalance,\n CoinSentryMarketCandle,\n CoinSentryMarketDetails,\n CoinSentryMarketListItem,\n CoinSentryMarketSymbol,\n CoinSentryMarketTicker,\n CoinSentryMarketTradingPair,\n CoinSentryOrderbookLevel,\n CoinSentryOrderbookSnapshot,\n CoinSentryPublicTrade,\n} from './market.js';\nexport {\n createCoinSentryClient,\n} from './client.js';\nexport type {\n CoinSentryClient,\n CoinSentryClientOptions,\n CoinSentryCsrfInitOptions,\n CoinSentryEntitySelectPayload,\n CoinSentryKycSubmitPayload,\n CoinSentryKycUploadPayload,\n CoinSentryLoginPayload,\n CoinSentryTwoFactorPayload,\n} from './client.js';\nexport type {\n CoinSentryEnvelope,\n CoinSentryMarketCandlesOptions,\n CoinSentryMarketTradesOptions,\n CoinSentryOtcAvailableCoin,\n CoinSentryOtcCoin,\n CoinSentryOtcConvertExecuteRequest,\n CoinSentryOtcConvertQuote,\n CoinSentryOtcConvertQuoteRequest,\n CoinSentryOtcConvertResult,\n CoinSentryOtcRecurringExecution,\n CoinSentryOtcRecurringPlan,\n CoinSentryOtcRecurringPlanRequest,\n CoinSentryOtcTradingPair,\n CoinSentryOtcTradingPairsResponse,\n CoinSentryPaginationMeta,\n CoinSentryPaginationParams,\n CoinSentryPasswordResetPayload,\n CoinSentryQuery,\n CoinSentryRequestOptions,\n CoinSentryResetPasswordPayload,\n CoinSentryTwoFactorStatus,\n} from './products.js';\nexport type {\n CoinSentryBalance,\n CoinSentryBalanceAmount,\n CoinSentryBalanceInput,\n CoinSentryBalanceUpdate,\n CoinSentryBalances,\n CoinSentryBrandConfig,\n CoinSentryBrandConfigOptions,\n CoinSentryBrandConfigResponse,\n CoinSentryEntity,\n CoinSentryEntityMinimal,\n CoinSentryEntityRole,\n CoinSentryEntitySummary,\n CoinSentryEntityType,\n CoinSentryFieldErrors,\n CoinSentryKycLevel,\n CoinSentryKycStatus,\n CoinSentryLocale,\n CoinSentryLoginIncomplete,\n CoinSentryLoginMultipleEntities,\n CoinSentryPartialSession,\n CoinSentryLoginResponse,\n CoinSentryLoginSingleEntity,\n CoinSentryLoginSuccess,\n CoinSentryLoginTwoFactor,\n CoinSentryRegisterPayload,\n CoinSentrySelectEntityResponse,\n CoinSentrySession,\n CoinSentryUser,\n} from './types.js';\nexport type {\n ClientFlowStep,\n KycCustomerType,\n KycFlowEntityType,\n KycFlowScreen,\n KycFlowSnapshot,\n KycFlowStateSummary,\n KycOverviewData,\n KycRequiredAction,\n KycRequirements,\n KycVerificationData,\n} from './kyc/index.js';\nexport {\n canOpenUniversalStep,\n ensureReviewStep,\n findStepByMissing,\n flowEntityTypeForCustomerType,\n getComplianceSteps,\n getKycProgress,\n getRequirementsClientFlow,\n hasKycClientFlow,\n hasResolvedKycRequirements,\n isUniversalStepCompleted,\n isKycFlowSnapshotConfigured,\n isKycOverviewFlowConfigured,\n normalizeCustomerType,\n mergeKycRequirementsWithAnchor,\n preserveSsrKycRequirementsAnchor,\n requirementsFromOverview,\n resolveActiveKycStep,\n resolveKycFlowSnapshot,\n statusFromOverview,\n} from './kyc/index.js';\nexport {\n buildBrandCss,\n buildBrandIconsMetadata,\n buildBrandManifest,\n fontSansToCssFamily,\n getBrandCssVariables,\n getBrandFaviconUrl,\n getLogoImageUrl,\n getLogoTextColors,\n getLogoTextFontFamily,\n inferImageMimeType,\n isImageLogoType,\n normalizeBrandConfig,\n normalizeBrandTypography,\n normalizeFontBaseSize,\n normalizeFontSans,\n normalizeLogoDimension,\n normalizeLogoLayout,\n normalizeLogoType,\n normalizeTypographyValue,\n resolveBrandThemeMode,\n} from './brand/index.js';\nexport type {\n BackendBrandLogoType,\n BrandConfig,\n BrandIconDescriptor,\n BrandLogoType,\n BrandManifestIcon,\n BrandMode,\n BrandThemeMode,\n BrandTypography,\n BrandTypographyToken,\n BrandWebManifest,\n ColorSet,\n DeepPartial,\n NormalizedLogoLayout,\n SecurityTxtConfig,\n} from './brand/index.js';\n"]}
@@ -0,0 +1,97 @@
1
+ export type CoinSentryMarketSymbol = string;
2
+ export type CoinSentryOrderbookLevel = {
3
+ price: string;
4
+ quantity: string;
5
+ total: string;
6
+ count?: number;
7
+ };
8
+ export type CoinSentryOrderbookSnapshot = {
9
+ symbol: CoinSentryMarketSymbol;
10
+ bids: CoinSentryOrderbookLevel[];
11
+ asks: CoinSentryOrderbookLevel[];
12
+ timestamp: number;
13
+ };
14
+ export type CoinSentryPublicTrade = {
15
+ id: number;
16
+ trading_pair: CoinSentryMarketSymbol;
17
+ side: 'BUY' | 'SELL';
18
+ price: string;
19
+ quantity: string;
20
+ total_value: string;
21
+ executed_at: string;
22
+ };
23
+ export type CoinSentryCandleInterval = '1m' | '5m' | '15m' | '1h' | '4h' | '1d' | '1w';
24
+ export type CoinSentryMarketCandle = {
25
+ time: number;
26
+ open: string;
27
+ high: string;
28
+ low: string;
29
+ close: string;
30
+ volume: string;
31
+ };
32
+ export type CoinSentryMarketTicker = {
33
+ symbol: CoinSentryMarketSymbol;
34
+ base_currency: string;
35
+ quote_currency: string;
36
+ last_price: string | number;
37
+ high_24h?: string | number | null;
38
+ low_24h?: string | number | null;
39
+ volume_24h?: string | number | null;
40
+ base_volume_24h?: string | number | null;
41
+ maker_fee?: string | number | null;
42
+ taker_fee?: string | number | null;
43
+ bid_price?: string | number | null;
44
+ ask_price?: string | number | null;
45
+ price_source?: string | null;
46
+ price_provider_slug?: string | null;
47
+ price_provider_market_id?: string | null;
48
+ updated_at?: string | null;
49
+ [key: string]: unknown;
50
+ };
51
+ export type CoinSentryMarketListItem = CoinSentryMarketTicker;
52
+ export type CoinSentryMarketBalance = {
53
+ available: string;
54
+ locked: string;
55
+ total?: string;
56
+ [key: string]: unknown;
57
+ };
58
+ export type CoinSentryMarketTradingPair = {
59
+ id?: number;
60
+ symbol: CoinSentryMarketSymbol;
61
+ base_currency: string;
62
+ quote_currency: string;
63
+ is_active?: boolean;
64
+ [key: string]: unknown;
65
+ };
66
+ export type CoinSentryMarketDetails = {
67
+ success?: boolean;
68
+ market?: CoinSentryMarketTicker;
69
+ balances?: Record<string, CoinSentryMarketBalance>;
70
+ base_currency?: unknown;
71
+ quote_currency?: unknown;
72
+ trading_pairs?: CoinSentryMarketTradingPair[];
73
+ user_orders?: unknown[];
74
+ available_coins?: unknown[];
75
+ [key: string]: unknown;
76
+ };
77
+ export type CoinSentryCreateOrderPayload = {
78
+ symbol: CoinSentryMarketSymbol;
79
+ side: 'BUY' | 'SELL';
80
+ type: 'LIMIT' | 'MARKET';
81
+ quantity: string;
82
+ price?: string;
83
+ };
84
+ export type CoinSentryCreateOrderInput = {
85
+ symbol: string;
86
+ side: 'BUY' | 'SELL' | 'buy' | 'sell';
87
+ type: 'LIMIT' | 'MARKET' | 'limit' | 'market';
88
+ quantity: string | number;
89
+ price?: string | number | null;
90
+ };
91
+ export declare function normalizeMarketSymbol(symbol: string): CoinSentryMarketSymbol;
92
+ export declare function getOrderbookChannel(symbol: string): string;
93
+ export declare function normalizeOrderbookSnapshot(payload: unknown, fallbackSymbol?: string): CoinSentryOrderbookSnapshot | null;
94
+ export declare function normalizeMarketCandles(payload: unknown): CoinSentryMarketCandle[];
95
+ export declare function normalizePublicTrade(payload: unknown, fallbackSymbol?: string): CoinSentryPublicTrade | null;
96
+ export declare function buildCreateOrderPayload(input: CoinSentryCreateOrderInput): CoinSentryCreateOrderPayload;
97
+ //# sourceMappingURL=market.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"market.d.ts","sourceRoot":"","sources":["../src/market.ts"],"names":[],"mappings":"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"}
package/dist/market.js ADDED
@@ -0,0 +1,264 @@
1
+ const MARKET_SYMBOL_PATTERN = /^[A-Z0-9]{2,20}_[A-Z0-9]{2,20}$/;
2
+ const DECIMAL_PATTERN = /^(?:0|[1-9]\d*)(?:\.\d+)?$/;
3
+ function dataOrPayload(payload) {
4
+ if (payload
5
+ && typeof payload === 'object'
6
+ && 'data' in payload
7
+ && payload.data !== undefined) {
8
+ return payload.data;
9
+ }
10
+ return payload;
11
+ }
12
+ function asRecord(value) {
13
+ return value && typeof value === 'object' && !Array.isArray(value)
14
+ ? value
15
+ : null;
16
+ }
17
+ function optionalString(value) {
18
+ if (value === null || value === undefined)
19
+ return undefined;
20
+ const trimmed = String(value).trim();
21
+ return trimmed.length > 0 ? trimmed : undefined;
22
+ }
23
+ function decimalString(value) {
24
+ const raw = optionalString(value);
25
+ if (!raw)
26
+ return null;
27
+ if (DECIMAL_PATTERN.test(raw))
28
+ return raw;
29
+ const numeric = typeof value === 'number' ? value : Number(raw);
30
+ if (!Number.isFinite(numeric) || numeric < 0)
31
+ return null;
32
+ const normalized = String(numeric);
33
+ return DECIMAL_PATTERN.test(normalized) ? normalized : null;
34
+ }
35
+ function positiveDecimalString(value) {
36
+ const normalized = decimalString(value);
37
+ if (!normalized)
38
+ return null;
39
+ return Number(normalized) > 0 ? normalized : null;
40
+ }
41
+ function timestampFrom(value) {
42
+ if (typeof value === 'number' && Number.isFinite(value) && value > 0) {
43
+ return value < 1_000_000_000_000 ? value * 1000 : value;
44
+ }
45
+ if (typeof value === 'string') {
46
+ const numeric = Number(value);
47
+ if (Number.isFinite(numeric) && numeric > 0) {
48
+ return numeric < 1_000_000_000_000 ? numeric * 1000 : numeric;
49
+ }
50
+ const parsed = Date.parse(value);
51
+ if (Number.isFinite(parsed))
52
+ return parsed;
53
+ }
54
+ return Date.now();
55
+ }
56
+ function timestampSecondsFrom(value) {
57
+ const timestamp = timestampFrom(value);
58
+ return Math.floor(timestamp / 1000);
59
+ }
60
+ function normalizeOrderbookLevel(value) {
61
+ if (!value || (typeof value !== 'object' && !Array.isArray(value)))
62
+ return null;
63
+ if (Array.isArray(value)) {
64
+ const price = decimalString(value[0]);
65
+ const quantity = decimalString(value[1]);
66
+ if (!price || !quantity)
67
+ return null;
68
+ const total = decimalString(value[2]) ?? quantity;
69
+ const count = Number(value[3]);
70
+ return {
71
+ price,
72
+ quantity,
73
+ total,
74
+ ...(Number.isInteger(count) && count >= 0 ? { count } : {}),
75
+ };
76
+ }
77
+ const source = value;
78
+ const price = decimalString(source.price);
79
+ const quantity = decimalString(source.quantity ?? source.qty ?? source.amount ?? source.size);
80
+ if (!price || !quantity)
81
+ return null;
82
+ const count = Number(source.count ?? source.orders);
83
+ const total = decimalString(source.total ?? source.cumulative_total ?? source.cumulativeTotal) ?? quantity;
84
+ return {
85
+ price,
86
+ quantity,
87
+ total,
88
+ ...(Number.isInteger(count) && count >= 0 ? { count } : {}),
89
+ };
90
+ }
91
+ function normalizeOrderbookLevels(value) {
92
+ if (Array.isArray(value)) {
93
+ return value
94
+ .map(normalizeOrderbookLevel)
95
+ .filter((level) => Boolean(level));
96
+ }
97
+ const record = asRecord(value);
98
+ if (!record)
99
+ return [];
100
+ return Object.entries(record)
101
+ .map(([price, quantityOrLevel]) => {
102
+ const levelRecord = asRecord(quantityOrLevel);
103
+ return levelRecord
104
+ ? normalizeOrderbookLevel({ ...levelRecord, price: levelRecord.price ?? price })
105
+ : normalizeOrderbookLevel([price, quantityOrLevel]);
106
+ })
107
+ .filter((level) => Boolean(level));
108
+ }
109
+ function orderbookSnapshotSource(payload) {
110
+ const source = asRecord(dataOrPayload(payload));
111
+ if (!source)
112
+ return null;
113
+ if ('bids' in source || 'asks' in source)
114
+ return source;
115
+ const nestedOrderbook = asRecord(dataOrPayload(source.orderbook));
116
+ if (nestedOrderbook && ('bids' in nestedOrderbook || 'asks' in nestedOrderbook)) {
117
+ return nestedOrderbook;
118
+ }
119
+ const nestedBook = asRecord(dataOrPayload(source.book));
120
+ if (nestedBook && ('bids' in nestedBook || 'asks' in nestedBook)) {
121
+ return nestedBook;
122
+ }
123
+ return source;
124
+ }
125
+ function normalizeMarketCandle(value) {
126
+ if (!value || typeof value !== 'object')
127
+ return null;
128
+ const source = value;
129
+ const time = timestampSecondsFrom(source.time ?? source.timestamp ?? source.open_time ?? source.openTime);
130
+ const open = decimalString(source.open);
131
+ const high = decimalString(source.high);
132
+ const low = decimalString(source.low);
133
+ const close = decimalString(source.close);
134
+ const volume = decimalString(source.volume);
135
+ if (!Number.isInteger(time) || time <= 0 || !open || !high || !low || !close || !volume) {
136
+ return null;
137
+ }
138
+ const openValue = Number(open);
139
+ const highValue = Number(high);
140
+ const lowValue = Number(low);
141
+ const closeValue = Number(close);
142
+ if (!Number.isFinite(openValue)
143
+ || !Number.isFinite(highValue)
144
+ || !Number.isFinite(lowValue)
145
+ || !Number.isFinite(closeValue)
146
+ || highValue < lowValue
147
+ || openValue > highValue
148
+ || openValue < lowValue
149
+ || closeValue > highValue
150
+ || closeValue < lowValue) {
151
+ return null;
152
+ }
153
+ return {
154
+ time,
155
+ open,
156
+ high,
157
+ low,
158
+ close,
159
+ volume,
160
+ };
161
+ }
162
+ export function normalizeMarketSymbol(symbol) {
163
+ const normalized = symbol.trim().replace('-', '_').toUpperCase();
164
+ if (!MARKET_SYMBOL_PATTERN.test(normalized)) {
165
+ throw new Error(`Invalid market symbol: ${normalized}`);
166
+ }
167
+ return normalized;
168
+ }
169
+ export function getOrderbookChannel(symbol) {
170
+ return `orderbook.${normalizeMarketSymbol(symbol).toLowerCase().replace('_', '-')}`;
171
+ }
172
+ export function normalizeOrderbookSnapshot(payload, fallbackSymbol) {
173
+ const record = orderbookSnapshotSource(payload);
174
+ if (!record)
175
+ return null;
176
+ const rawSymbol = optionalString(record.symbol) ?? fallbackSymbol;
177
+ if (!rawSymbol)
178
+ return null;
179
+ let symbol;
180
+ try {
181
+ symbol = normalizeMarketSymbol(rawSymbol);
182
+ }
183
+ catch {
184
+ return null;
185
+ }
186
+ if (!('bids' in record) && !('asks' in record))
187
+ return null;
188
+ return {
189
+ symbol,
190
+ bids: normalizeOrderbookLevels(record.bids),
191
+ asks: normalizeOrderbookLevels(record.asks),
192
+ timestamp: timestampFrom(record.timestamp),
193
+ };
194
+ }
195
+ export function normalizeMarketCandles(payload) {
196
+ const source = dataOrPayload(payload);
197
+ const rawCandles = Array.isArray(source) ? source : [];
198
+ const byTime = new Map();
199
+ rawCandles
200
+ .map(normalizeMarketCandle)
201
+ .filter((candle) => Boolean(candle))
202
+ .forEach((candle) => {
203
+ byTime.set(candle.time, candle);
204
+ });
205
+ return Array.from(byTime.values()).sort((left, right) => left.time - right.time);
206
+ }
207
+ export function normalizePublicTrade(payload, fallbackSymbol) {
208
+ const source = dataOrPayload(payload);
209
+ if (!source || typeof source !== 'object')
210
+ return null;
211
+ const record = source;
212
+ const id = Number(record.id);
213
+ const side = optionalString(record.side)?.toUpperCase();
214
+ const rawSymbol = optionalString(record.trading_pair ?? record.symbol) ?? fallbackSymbol;
215
+ const price = decimalString(record.price);
216
+ const quantity = decimalString(record.quantity);
217
+ const totalValue = decimalString(record.total_value);
218
+ const executedAt = optionalString(record.executed_at);
219
+ if (!Number.isInteger(id) || id <= 0 || !rawSymbol || !price || !quantity || !totalValue || !executedAt) {
220
+ return null;
221
+ }
222
+ if (side !== 'BUY' && side !== 'SELL')
223
+ return null;
224
+ let tradingPair;
225
+ try {
226
+ tradingPair = normalizeMarketSymbol(rawSymbol);
227
+ }
228
+ catch {
229
+ return null;
230
+ }
231
+ return {
232
+ id,
233
+ trading_pair: tradingPair,
234
+ side,
235
+ price,
236
+ quantity,
237
+ total_value: totalValue,
238
+ executed_at: executedAt,
239
+ };
240
+ }
241
+ export function buildCreateOrderPayload(input) {
242
+ const symbol = normalizeMarketSymbol(input.symbol);
243
+ const side = input.side.toUpperCase();
244
+ const type = input.type.toUpperCase();
245
+ const quantity = positiveDecimalString(input.quantity);
246
+ if (side !== 'BUY' && side !== 'SELL') {
247
+ throw new Error(`Invalid order side: ${input.side}`);
248
+ }
249
+ if (type !== 'LIMIT' && type !== 'MARKET') {
250
+ throw new Error(`Invalid order type: ${input.type}`);
251
+ }
252
+ if (!quantity) {
253
+ throw new Error('Order quantity must be a positive decimal string');
254
+ }
255
+ if (type === 'MARKET') {
256
+ return { symbol, side, type, quantity };
257
+ }
258
+ const price = positiveDecimalString(input.price);
259
+ if (!price) {
260
+ throw new Error('Limit order price must be a positive decimal string');
261
+ }
262
+ return { symbol, side, type, quantity, price };
263
+ }
264
+ //# sourceMappingURL=market.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"market.js","sourceRoot":"","sources":["../src/market.ts"],"names":[],"mappings":"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","sourcesContent":["export type CoinSentryMarketSymbol = string;\n\nexport type CoinSentryOrderbookLevel = {\n price: string;\n quantity: string;\n total: string;\n count?: number;\n};\n\nexport type CoinSentryOrderbookSnapshot = {\n symbol: CoinSentryMarketSymbol;\n bids: CoinSentryOrderbookLevel[];\n asks: CoinSentryOrderbookLevel[];\n timestamp: number;\n};\n\nexport type CoinSentryPublicTrade = {\n id: number;\n trading_pair: CoinSentryMarketSymbol;\n side: 'BUY' | 'SELL';\n price: string;\n quantity: string;\n total_value: string;\n executed_at: string;\n};\n\nexport type CoinSentryCandleInterval = '1m' | '5m' | '15m' | '1h' | '4h' | '1d' | '1w';\n\nexport type CoinSentryMarketCandle = {\n time: number;\n open: string;\n high: string;\n low: string;\n close: string;\n volume: string;\n};\n\nexport type CoinSentryMarketTicker = {\n symbol: CoinSentryMarketSymbol;\n base_currency: string;\n quote_currency: string;\n last_price: string | number;\n high_24h?: string | number | null;\n low_24h?: string | number | null;\n volume_24h?: string | number | null;\n base_volume_24h?: string | number | null;\n maker_fee?: string | number | null;\n taker_fee?: string | number | null;\n bid_price?: string | number | null;\n ask_price?: string | number | null;\n price_source?: string | null;\n price_provider_slug?: string | null;\n price_provider_market_id?: string | null;\n updated_at?: string | null;\n [key: string]: unknown;\n};\n\nexport type CoinSentryMarketListItem = CoinSentryMarketTicker;\n\nexport type CoinSentryMarketBalance = {\n available: string;\n locked: string;\n total?: string;\n [key: string]: unknown;\n};\n\nexport type CoinSentryMarketTradingPair = {\n id?: number;\n symbol: CoinSentryMarketSymbol;\n base_currency: string;\n quote_currency: string;\n is_active?: boolean;\n [key: string]: unknown;\n};\n\nexport type CoinSentryMarketDetails = {\n success?: boolean;\n market?: CoinSentryMarketTicker;\n balances?: Record<string, CoinSentryMarketBalance>;\n base_currency?: unknown;\n quote_currency?: unknown;\n trading_pairs?: CoinSentryMarketTradingPair[];\n user_orders?: unknown[];\n available_coins?: unknown[];\n [key: string]: unknown;\n};\n\nexport type CoinSentryCreateOrderPayload = {\n symbol: CoinSentryMarketSymbol;\n side: 'BUY' | 'SELL';\n type: 'LIMIT' | 'MARKET';\n quantity: string;\n price?: string;\n};\n\nexport type CoinSentryCreateOrderInput = {\n symbol: string;\n side: 'BUY' | 'SELL' | 'buy' | 'sell';\n type: 'LIMIT' | 'MARKET' | 'limit' | 'market';\n quantity: string | number;\n price?: string | number | null;\n};\n\nconst MARKET_SYMBOL_PATTERN = /^[A-Z0-9]{2,20}_[A-Z0-9]{2,20}$/;\nconst DECIMAL_PATTERN = /^(?:0|[1-9]\\d*)(?:\\.\\d+)?$/;\n\nfunction dataOrPayload(payload: unknown): unknown {\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: unknown }).data;\n }\n\n return payload;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n return value && typeof value === 'object' && !Array.isArray(value)\n ? value as Record<string, unknown>\n : null;\n}\n\nfunction optionalString(value: unknown): string | undefined {\n if (value === null || value === undefined) return undefined;\n const trimmed = String(value).trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction decimalString(value: unknown): string | null {\n const raw = optionalString(value);\n if (!raw) return null;\n\n if (DECIMAL_PATTERN.test(raw)) return raw;\n\n const numeric = typeof value === 'number' ? value : Number(raw);\n if (!Number.isFinite(numeric) || numeric < 0) return null;\n\n const normalized = String(numeric);\n return DECIMAL_PATTERN.test(normalized) ? normalized : null;\n}\n\nfunction positiveDecimalString(value: unknown): string | null {\n const normalized = decimalString(value);\n if (!normalized) return null;\n return Number(normalized) > 0 ? normalized : null;\n}\n\nfunction timestampFrom(value: unknown): number {\n if (typeof value === 'number' && Number.isFinite(value) && value > 0) {\n return value < 1_000_000_000_000 ? value * 1000 : value;\n }\n\n if (typeof value === 'string') {\n const numeric = Number(value);\n if (Number.isFinite(numeric) && numeric > 0) {\n return numeric < 1_000_000_000_000 ? numeric * 1000 : numeric;\n }\n\n const parsed = Date.parse(value);\n if (Number.isFinite(parsed)) return parsed;\n }\n\n return Date.now();\n}\n\nfunction timestampSecondsFrom(value: unknown): number {\n const timestamp = timestampFrom(value);\n return Math.floor(timestamp / 1000);\n}\n\nfunction normalizeOrderbookLevel(value: unknown): CoinSentryOrderbookLevel | null {\n if (!value || (typeof value !== 'object' && !Array.isArray(value))) return null;\n\n if (Array.isArray(value)) {\n const price = decimalString(value[0]);\n const quantity = decimalString(value[1]);\n\n if (!price || !quantity) return null;\n\n const total = decimalString(value[2]) ?? quantity;\n const count = Number(value[3]);\n\n return {\n price,\n quantity,\n total,\n ...(Number.isInteger(count) && count >= 0 ? { count } : {}),\n };\n }\n\n const source = value as Record<string, unknown>;\n const price = decimalString(source.price);\n const quantity = decimalString(source.quantity ?? source.qty ?? source.amount ?? source.size);\n\n if (!price || !quantity) return null;\n\n const count = Number(source.count ?? source.orders);\n const total = decimalString(source.total ?? source.cumulative_total ?? source.cumulativeTotal) ?? quantity;\n\n return {\n price,\n quantity,\n total,\n ...(Number.isInteger(count) && count >= 0 ? { count } : {}),\n };\n}\n\nfunction normalizeOrderbookLevels(value: unknown): CoinSentryOrderbookLevel[] {\n if (Array.isArray(value)) {\n return value\n .map(normalizeOrderbookLevel)\n .filter((level): level is CoinSentryOrderbookLevel => Boolean(level));\n }\n\n const record = asRecord(value);\n if (!record) return [];\n\n return Object.entries(record)\n .map(([price, quantityOrLevel]) => {\n const levelRecord = asRecord(quantityOrLevel);\n\n return levelRecord\n ? normalizeOrderbookLevel({ ...levelRecord, price: levelRecord.price ?? price })\n : normalizeOrderbookLevel([price, quantityOrLevel]);\n })\n .filter((level): level is CoinSentryOrderbookLevel => Boolean(level));\n}\n\nfunction orderbookSnapshotSource(payload: unknown): Record<string, unknown> | null {\n const source = asRecord(dataOrPayload(payload));\n if (!source) return null;\n\n if ('bids' in source || 'asks' in source) return source;\n\n const nestedOrderbook = asRecord(dataOrPayload(source.orderbook));\n if (nestedOrderbook && ('bids' in nestedOrderbook || 'asks' in nestedOrderbook)) {\n return nestedOrderbook;\n }\n\n const nestedBook = asRecord(dataOrPayload(source.book));\n if (nestedBook && ('bids' in nestedBook || 'asks' in nestedBook)) {\n return nestedBook;\n }\n\n return source;\n}\n\nfunction normalizeMarketCandle(value: unknown): CoinSentryMarketCandle | null {\n if (!value || typeof value !== 'object') return null;\n\n const source = value as Record<string, unknown>;\n const time = timestampSecondsFrom(source.time ?? source.timestamp ?? source.open_time ?? source.openTime);\n const open = decimalString(source.open);\n const high = decimalString(source.high);\n const low = decimalString(source.low);\n const close = decimalString(source.close);\n const volume = decimalString(source.volume);\n\n if (!Number.isInteger(time) || time <= 0 || !open || !high || !low || !close || !volume) {\n return null;\n }\n\n const openValue = Number(open);\n const highValue = Number(high);\n const lowValue = Number(low);\n const closeValue = Number(close);\n\n if (\n !Number.isFinite(openValue)\n || !Number.isFinite(highValue)\n || !Number.isFinite(lowValue)\n || !Number.isFinite(closeValue)\n || highValue < lowValue\n || openValue > highValue\n || openValue < lowValue\n || closeValue > highValue\n || closeValue < lowValue\n ) {\n return null;\n }\n\n return {\n time,\n open,\n high,\n low,\n close,\n volume,\n };\n}\n\nexport function normalizeMarketSymbol(symbol: string): CoinSentryMarketSymbol {\n const normalized = symbol.trim().replace('-', '_').toUpperCase();\n\n if (!MARKET_SYMBOL_PATTERN.test(normalized)) {\n throw new Error(`Invalid market symbol: ${normalized}`);\n }\n\n return normalized;\n}\n\nexport function getOrderbookChannel(symbol: string): string {\n return `orderbook.${normalizeMarketSymbol(symbol).toLowerCase().replace('_', '-')}`;\n}\n\nexport function normalizeOrderbookSnapshot(\n payload: unknown,\n fallbackSymbol?: string,\n): CoinSentryOrderbookSnapshot | null {\n const record = orderbookSnapshotSource(payload);\n if (!record) return null;\n\n const rawSymbol = optionalString(record.symbol) ?? fallbackSymbol;\n if (!rawSymbol) return null;\n\n let symbol: CoinSentryMarketSymbol;\n try {\n symbol = normalizeMarketSymbol(rawSymbol);\n } catch {\n return null;\n }\n\n if (!('bids' in record) && !('asks' in record)) return null;\n\n return {\n symbol,\n bids: normalizeOrderbookLevels(record.bids),\n asks: normalizeOrderbookLevels(record.asks),\n timestamp: timestampFrom(record.timestamp),\n };\n}\n\nexport function normalizeMarketCandles(payload: unknown): CoinSentryMarketCandle[] {\n const source = dataOrPayload(payload);\n const rawCandles = Array.isArray(source) ? source : [];\n const byTime = new Map<number, CoinSentryMarketCandle>();\n\n rawCandles\n .map(normalizeMarketCandle)\n .filter((candle): candle is CoinSentryMarketCandle => Boolean(candle))\n .forEach((candle) => {\n byTime.set(candle.time, candle);\n });\n\n return Array.from(byTime.values()).sort((left, right) => left.time - right.time);\n}\n\nexport function normalizePublicTrade(\n payload: unknown,\n fallbackSymbol?: string,\n): CoinSentryPublicTrade | null {\n const source = dataOrPayload(payload);\n if (!source || typeof source !== 'object') return null;\n\n const record = source as Record<string, unknown>;\n const id = Number(record.id);\n const side = optionalString(record.side)?.toUpperCase();\n const rawSymbol = optionalString(record.trading_pair ?? record.symbol) ?? fallbackSymbol;\n const price = decimalString(record.price);\n const quantity = decimalString(record.quantity);\n const totalValue = decimalString(record.total_value);\n const executedAt = optionalString(record.executed_at);\n\n if (!Number.isInteger(id) || id <= 0 || !rawSymbol || !price || !quantity || !totalValue || !executedAt) {\n return null;\n }\n\n if (side !== 'BUY' && side !== 'SELL') return null;\n\n let tradingPair: CoinSentryMarketSymbol;\n try {\n tradingPair = normalizeMarketSymbol(rawSymbol);\n } catch {\n return null;\n }\n\n return {\n id,\n trading_pair: tradingPair,\n side,\n price,\n quantity,\n total_value: totalValue,\n executed_at: executedAt,\n };\n}\n\nexport function buildCreateOrderPayload(input: CoinSentryCreateOrderInput): CoinSentryCreateOrderPayload {\n const symbol = normalizeMarketSymbol(input.symbol);\n const side = input.side.toUpperCase();\n const type = input.type.toUpperCase();\n const quantity = positiveDecimalString(input.quantity);\n\n if (side !== 'BUY' && side !== 'SELL') {\n throw new Error(`Invalid order side: ${input.side}`);\n }\n\n if (type !== 'LIMIT' && type !== 'MARKET') {\n throw new Error(`Invalid order type: ${input.type}`);\n }\n\n if (!quantity) {\n throw new Error('Order quantity must be a positive decimal string');\n }\n\n if (type === 'MARKET') {\n return { symbol, side, type, quantity };\n }\n\n const price = positiveDecimalString(input.price);\n if (!price) {\n throw new Error('Limit order price must be a positive decimal string');\n }\n\n return { symbol, side, type, quantity, price };\n}\n"]}
@@ -1,4 +1,5 @@
1
1
  import type { CoinSentryHttpRequest } from './http.js';
2
+ import { type CoinSentryCandleInterval, type CoinSentryCreateOrderPayload, type CoinSentryMarketCandle, type CoinSentryMarketDetails, type CoinSentryMarketListItem, type CoinSentryMarketTicker, type CoinSentryOrderbookSnapshot, type CoinSentryPublicTrade } from './market.js';
2
3
  export type CoinSentryRequestOptions = {
3
4
  signal?: AbortSignal;
4
5
  };
@@ -8,6 +9,13 @@ export type CoinSentryPaginationParams = {
8
9
  page?: number;
9
10
  per_page?: number;
10
11
  };
12
+ export type CoinSentryMarketTradesOptions = CoinSentryRequestOptions & {
13
+ limit?: number;
14
+ };
15
+ export type CoinSentryMarketCandlesOptions = CoinSentryRequestOptions & {
16
+ interval: CoinSentryCandleInterval;
17
+ limit?: number;
18
+ };
11
19
  export type CoinSentryPaginationMeta = {
12
20
  current_page: number;
13
21
  per_page: number;
@@ -245,9 +253,15 @@ export declare function createCoinSentryProductServices(request: CoinSentryReque
245
253
  getRankingsByActiveReferrals: <T = unknown>(options?: CoinSentryRequestOptions) => Promise<T>;
246
254
  };
247
255
  market: {
256
+ listMarkets: (options?: CoinSentryRequestOptions) => Promise<CoinSentryMarketListItem[]>;
257
+ getTicker: (symbol: string, options?: CoinSentryRequestOptions) => Promise<CoinSentryMarketTicker>;
248
258
  getOrderbook: <T = unknown>(symbol: string, depth?: number, options?: CoinSentryRequestOptions) => Promise<T>;
249
- getMarket: <T = unknown>(symbol: string, options?: CoinSentryRequestOptions) => Promise<T>;
250
- createOrder: <T = unknown>(payload: unknown) => Promise<T>;
259
+ getOrderbookSnapshot: (symbol: string, depth?: number, options?: CoinSentryRequestOptions) => Promise<CoinSentryOrderbookSnapshot>;
260
+ getMarketDetails: <T = CoinSentryMarketDetails>(symbol: string, options?: CoinSentryRequestOptions) => Promise<T>;
261
+ getMarket: <T = CoinSentryMarketDetails>(symbol: string, options?: CoinSentryRequestOptions) => Promise<T>;
262
+ getTrades: (symbol: string, options?: CoinSentryMarketTradesOptions) => Promise<CoinSentryPublicTrade[]>;
263
+ getCandles: (symbol: string, options: CoinSentryMarketCandlesOptions) => Promise<CoinSentryMarketCandle[]>;
264
+ createOrder: <T = unknown>(payload: CoinSentryCreateOrderPayload) => Promise<T>;
251
265
  cancelOrder: (orderId: number) => Promise<unknown>;
252
266
  cancelAllOrders: (symbol: string) => Promise<unknown>;
253
267
  };
@@ -1 +1 @@
1
- {"version":3,"file":"products.d.ts","sourceRoot":"","sources":["../src/products.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"products.d.ts","sourceRoot":"","sources":["../src/products.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAKL,KAAK,wBAAwB,EAC7B,KAAK,4BAA4B,EACjC,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,EAC3B,KAAK,2BAA2B,EAChC,KAAK,qBAAqB,EAC3B,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,wBAAwB,GAAG;IACrC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;AAChF,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;AAEnE,MAAM,MAAM,0BAA0B,GAAG;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG,wBAAwB,GAAG;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG,wBAAwB,GAAG;IACtE,QAAQ,EAAE,wBAAwB,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,kBAAkB,CAAC,CAAC,IAAI;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,IAAI,CAAC,EAAE,wBAAwB,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,oBAAoB,EAAE,OAAO,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAAC;IACnC,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,eAAe,EAAE,OAAO,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAAC;IACnC,YAAY,EAAE;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;KACrB,GAAG,IAAI,CAAC;IACT,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,eAAe,EAAE,OAAO,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACrC,UAAU,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,iCAAiC,GAAG;IAC9C,aAAa,EAAE,wBAAwB,EAAE,CAAC;IAC1C,aAAa,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACxC,cAAc,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACzC,eAAe,EAAE,0BAA0B,EAAE,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,gCAAgC,GAAG;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,SAAS,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,kCAAkC,GAAG;IAC/C,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,WAAW,GAAG,QAAQ,CAAC;IAC/B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,iCAAiC,GAAG;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC1C,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,WAAW,CAAC;IACxD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG;IAC5C,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;IACzC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,KAAK,iBAAiB,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,qBAAqB,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;AA+BzE,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,iBAAiB;;;;;qBAWX,MAAM;;4BAI7C,MAAM;;;;;;;;;mBAyBf,CAAC,sBAAsB,wBAAwB;qBAK7C,CAAC,qBAAqB,OAAO;yBAKzB,MAAM;;;mBAMZ,CAAC,sBAAsB,wBAAwB;;;2BAOvC,CAAC,qBAAqB,MAAM,YAAY,wBAAwB;qBAKtE,CAAC,qBAAqB,OAAO;qBAK7B,CAAC,qBAAqB,OAAO;;;;cAQlC,CAAC,sBAAsB,MAAM,YAAY,wBAAwB;uBAKxD,CAAC,qBAAqB,OAAO;;;cAOtC,CAAC,sBAAsB,MAAM,YAAY,wBAAwB;eAKhE,CAAC,qBAAqB,OAAO;iBAK3B,CAAC,qBAAqB,OAAO;qBAKzB,CAAC,mBAAmB,eAAe,YAAY,wBAAwB;;;wBAQpE,CAAC,sBAAsB,wBAAwB;qBAKlD,CAAC,oBAAoB,0BAA0B,YAAY,wBAAwB;8BAM1E,CAAC,qBAAqB,OAAO;2BAKhC,CAAC,gBAAgB,MAAM,YAAY,wBAAwB;iBAKrE,CAAC,qBAAqB,OAAO;cAKhC,CAAC,qBAAqB,OAAO;;;kBAOzB,CAAC,sBAAsB,wBAAwB;oBAK7C,CAAC,sBAAsB,wBAAwB;uBAK5C,CAAC,oBAAoB,0BAA0B,YAAY,wBAAwB;qBAMrF,CAAC,oBACJ,0BAA0B,GAAG;YAAE,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,YAC5C,wBAAwB;qCAOP,CAAC,sBAAsB,wBAAwB;uCAK7C,CAAC,sBAAsB,wBAAwB;;;gCAOhD,wBAAwB,KAAG,OAAO,CAAC,wBAAwB,EAAE,CAAC;4BAWlF,MAAM,YACJ,wBAAwB,KACjC,OAAO,CAAC,sBAAsB,CAAC;uBAUnB,CAAC,oBAAoB,MAAM,UAAU,MAAM,YAAY,wBAAwB;uCAOpF,MAAM,UACN,MAAM,YACJ,wBAAwB,KACjC,OAAO,CAAC,2BAA2B,CAAC;2BA1NjB,CAAC,oCAAoC,MAAM,YAAY,wBAAwB;oBAA/E,CAAC,oCAAoC,MAAM,YAAY,wBAAwB;4BA6O3F,MAAM,YACL,6BAA6B,KACrC,OAAO,CAAC,qBAAqB,EAAE,CAAC;6BAiBzB,MAAM,WACL,8BAA8B,KACtC,OAAO,CAAC,sBAAsB,EAAE,CAAC;sBAetB,CAAC,qBAAqB,4BAA4B;+BAKzC,MAAM;kCAIH,MAAM;;;+BAOH,gCAAgC;kCAM7B,kCAAkC;oCAMhC,0BAA0B;;kBA9Ta,wBAAwB;;iCAoUxE,MAAM;mCAIJ,MAAM;oCAIC;YAAE,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE;uCAMhB,iCAAiC;+BAMzC,MAAM;kCAKH,MAAM,WAAW,OAAO,CAAC,iCAAiC,CAAC;kCAMjE,MAAM;iCAID,MAAM;oCAKH,MAAM;qCAKL,MAAM,UAAU,0BAA0B;;kBAjXJ,wBAAwB;;8CAuXnD,OAAO,CAAC,iCAAiC,CAAC;;EAqB7F"}
package/dist/products.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { normalizeMarketSymbol, normalizeMarketCandles, normalizeOrderbookSnapshot, normalizePublicTrade, } from './market.js';
1
2
  function dataOrPayload(payload) {
2
3
  if (payload
3
4
  && typeof payload === 'object'
@@ -22,6 +23,11 @@ function requestOptions(options) {
22
23
  return options?.signal ? { signal: options.signal } : {};
23
24
  }
24
25
  export function createCoinSentryProductServices(request) {
26
+ const getMarketDetails = (symbol, options) => request({
27
+ method: 'GET',
28
+ path: `/api/v1/market/${normalizeMarketSymbol(symbol)}`,
29
+ ...requestOptions(options),
30
+ });
25
31
  return {
26
32
  account: {
27
33
  twoFactor: {
@@ -198,17 +204,75 @@ export function createCoinSentryProductServices(request) {
198
204
  }),
199
205
  },
200
206
  market: {
207
+ listMarkets: async (options) => {
208
+ const payload = await request({
209
+ method: 'GET',
210
+ path: '/api/v1/market',
211
+ ...requestOptions(options),
212
+ });
213
+ const data = dataOrPayload(payload);
214
+ return Array.isArray(data) ? data : [];
215
+ },
216
+ getTicker: async (symbol, options) => {
217
+ const normalizedSymbol = normalizeMarketSymbol(symbol);
218
+ const payload = await request({
219
+ method: 'GET',
220
+ path: `/api/v1/ticker/${normalizedSymbol}`,
221
+ ...requestOptions(options),
222
+ });
223
+ return dataOrPayload(payload);
224
+ },
201
225
  getOrderbook: (symbol, depth, options) => request({
202
226
  method: 'GET',
203
- path: `/api/v1/orderbook/${symbol}`,
227
+ path: `/api/v1/orderbook/${normalizeMarketSymbol(symbol)}`,
204
228
  query: depth ? { depth } : undefined,
205
229
  ...requestOptions(options),
206
230
  }),
207
- getMarket: (symbol, options) => request({
208
- method: 'GET',
209
- path: `/api/v1/market/${symbol}`,
210
- ...requestOptions(options),
211
- }),
231
+ getOrderbookSnapshot: async (symbol, depth, options) => {
232
+ const normalizedSymbol = normalizeMarketSymbol(symbol);
233
+ const payload = await request({
234
+ method: 'GET',
235
+ path: `/api/v1/orderbook/${normalizedSymbol}`,
236
+ query: depth ? { depth } : undefined,
237
+ ...requestOptions(options),
238
+ });
239
+ const snapshot = normalizeOrderbookSnapshot(payload, normalizedSymbol);
240
+ if (!snapshot) {
241
+ throw new Error(`Invalid orderbook snapshot payload for ${normalizedSymbol}`);
242
+ }
243
+ return snapshot;
244
+ },
245
+ getMarketDetails,
246
+ getMarket: getMarketDetails,
247
+ getTrades: async (symbol, options = {}) => {
248
+ const normalizedSymbol = normalizeMarketSymbol(symbol);
249
+ const { limit, signal } = options;
250
+ const payload = await request({
251
+ method: 'GET',
252
+ path: `/api/v1/trades/${normalizedSymbol}`,
253
+ query: limit ? { limit } : undefined,
254
+ ...(signal ? { signal } : {}),
255
+ });
256
+ const data = dataOrPayload(payload);
257
+ const trades = Array.isArray(data) ? data : [];
258
+ return trades
259
+ .map((trade) => normalizePublicTrade(trade, normalizedSymbol))
260
+ .filter((trade) => Boolean(trade));
261
+ },
262
+ getCandles: async (symbol, options) => {
263
+ const normalizedSymbol = normalizeMarketSymbol(symbol);
264
+ const { interval, limit, signal } = options;
265
+ const payload = await request({
266
+ method: 'GET',
267
+ path: `/api/v1/candles/${normalizedSymbol}`,
268
+ query: {
269
+ interval,
270
+ ...(limit ? { limit } : {}),
271
+ },
272
+ ...(signal ? { signal } : {}),
273
+ });
274
+ return normalizeMarketCandles(payload);
275
+ },
212
276
  createOrder: (payload) => request({
213
277
  method: 'POST',
214
278
  path: '/api/v1/createOrder',