@100pay-hq/100pay.js 1.4.16 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +44 -50
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +44 -50
- package/dist/index.js.map +1 -1
- package/package.json +9 -11
package/dist/index.cjs
CHANGED
|
@@ -34,7 +34,6 @@ __export(index_exports, {
|
|
|
34
34
|
PaymentVerificationError: () => PaymentVerificationError
|
|
35
35
|
});
|
|
36
36
|
module.exports = __toCommonJS(index_exports);
|
|
37
|
-
var import_axios = __toESM(require("axios"), 1);
|
|
38
37
|
var crypto = __toESM(require("crypto"), 1);
|
|
39
38
|
var import_logger = require("@untools/logger");
|
|
40
39
|
var BASE_URL = process.env.BASE_URL || "https://api.100pay.co";
|
|
@@ -62,47 +61,43 @@ var Pay100 = class {
|
|
|
62
61
|
this.verify = async (transactionId) => {
|
|
63
62
|
try {
|
|
64
63
|
const payload = { transactionId };
|
|
65
|
-
const response = await (
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
64
|
+
const response = await fetch(
|
|
65
|
+
`${this.baseUrl}/api/v1/pay/crypto/payment/${transactionId}`,
|
|
66
|
+
{
|
|
67
|
+
method: "POST",
|
|
68
|
+
headers: this.getHeaders(payload),
|
|
69
|
+
body: JSON.stringify(payload)
|
|
70
|
+
}
|
|
71
|
+
);
|
|
72
|
+
const responseData = await response.json().catch(() => null);
|
|
73
|
+
if (!responseData) {
|
|
72
74
|
return {
|
|
73
75
|
status: "error",
|
|
74
76
|
data: null,
|
|
75
77
|
message: "Something went wrong, be sure you supplied a valid payment id."
|
|
76
78
|
};
|
|
77
79
|
}
|
|
78
|
-
if (typeof
|
|
79
|
-
if (
|
|
80
|
+
if (typeof responseData === "string") {
|
|
81
|
+
if (responseData === "Access Denied, Invalid KEY supplied") {
|
|
80
82
|
return {
|
|
81
83
|
status: "error",
|
|
82
84
|
data: null,
|
|
83
85
|
message: "Access Denied, Invalid KEY supplied"
|
|
84
86
|
};
|
|
85
87
|
}
|
|
86
|
-
if (
|
|
88
|
+
if (responseData === "invalid payment id supplied") {
|
|
87
89
|
return {
|
|
88
90
|
status: "error",
|
|
89
91
|
data: null
|
|
90
92
|
};
|
|
91
93
|
}
|
|
92
94
|
}
|
|
93
|
-
const responseData = response.data;
|
|
94
95
|
const transactionData = responseData && typeof responseData === "object" ? responseData : null;
|
|
95
96
|
return {
|
|
96
97
|
status: "success",
|
|
97
98
|
data: transactionData
|
|
98
99
|
};
|
|
99
100
|
} catch (error) {
|
|
100
|
-
if (import_axios.default.isAxiosError(error)) {
|
|
101
|
-
const axiosError = error;
|
|
102
|
-
throw new PaymentVerificationError(
|
|
103
|
-
axiosError.message || "Something went wrong, be sure you supplied a valid payment id."
|
|
104
|
-
);
|
|
105
|
-
}
|
|
106
101
|
throw new PaymentVerificationError(
|
|
107
102
|
error instanceof Error ? error.message : "An unknown error occurred"
|
|
108
103
|
);
|
|
@@ -166,15 +161,12 @@ var Pay100 = class {
|
|
|
166
161
|
* @throws Error if the transfer fails due to validation, insufficient funds, or other issues
|
|
167
162
|
*/
|
|
168
163
|
executeTransfer: async (data) => {
|
|
164
|
+
const { oauthAccessToken, ...transferData } = data;
|
|
169
165
|
return this.request(
|
|
170
166
|
"POST",
|
|
171
167
|
"/api/v1/transfer/asset",
|
|
172
|
-
|
|
173
|
-
{
|
|
174
|
-
...data?.oauthAccessToken && {
|
|
175
|
-
Authorization: `Bearer ${data?.oauthAccessToken}`
|
|
176
|
-
}
|
|
177
|
-
}
|
|
168
|
+
transferData,
|
|
169
|
+
oauthAccessToken ? { Authorization: `Bearer ${oauthAccessToken}` } : {}
|
|
178
170
|
);
|
|
179
171
|
},
|
|
180
172
|
/**
|
|
@@ -309,9 +301,8 @@ var Pay100 = class {
|
|
|
309
301
|
return this.request(
|
|
310
302
|
"GET",
|
|
311
303
|
"/api/v1/oauth/userinfo",
|
|
312
|
-
{
|
|
313
|
-
|
|
314
|
-
}
|
|
304
|
+
{},
|
|
305
|
+
{ Authorization: `Bearer ${accessToken}` }
|
|
315
306
|
);
|
|
316
307
|
},
|
|
317
308
|
/**
|
|
@@ -323,9 +314,8 @@ var Pay100 = class {
|
|
|
323
314
|
return this.request(
|
|
324
315
|
"GET",
|
|
325
316
|
"/api/v1/oauth/appinfo",
|
|
326
|
-
{
|
|
327
|
-
|
|
328
|
-
}
|
|
317
|
+
{},
|
|
318
|
+
{ Authorization: `Bearer ${accessToken}` }
|
|
329
319
|
);
|
|
330
320
|
},
|
|
331
321
|
/**
|
|
@@ -377,14 +367,12 @@ var Pay100 = class {
|
|
|
377
367
|
"x-secret-key": this.secretKey,
|
|
378
368
|
"x-timestamp": timestamp,
|
|
379
369
|
"x-signature": signature,
|
|
380
|
-
"Content-Type": "application/json"
|
|
381
|
-
...payload?.headers || {}
|
|
370
|
+
"Content-Type": "application/json"
|
|
382
371
|
};
|
|
383
372
|
}
|
|
384
373
|
return {
|
|
385
374
|
"api-key": this.publicKey,
|
|
386
|
-
"Content-Type": "application/json"
|
|
387
|
-
...payload?.headers || {}
|
|
375
|
+
"Content-Type": "application/json"
|
|
388
376
|
};
|
|
389
377
|
}
|
|
390
378
|
/**
|
|
@@ -398,30 +386,36 @@ var Pay100 = class {
|
|
|
398
386
|
*/
|
|
399
387
|
async request(method, endpoint, data = {}, customHeaders = {}) {
|
|
400
388
|
try {
|
|
401
|
-
const url = `${this.baseUrl}${endpoint}
|
|
389
|
+
const url = method === "GET" && Object.keys(data).length > 0 ? `${this.baseUrl}${endpoint}?${new URLSearchParams(
|
|
390
|
+
data
|
|
391
|
+
)}` : `${this.baseUrl}${endpoint}`;
|
|
402
392
|
const headers = this.getHeaders(data);
|
|
403
|
-
const
|
|
393
|
+
const options = {
|
|
404
394
|
method,
|
|
405
|
-
url,
|
|
406
395
|
headers: { ...headers, ...customHeaders },
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
});
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
396
|
+
body: method !== "GET" ? JSON.stringify(data) : void 0
|
|
397
|
+
};
|
|
398
|
+
import_logger.logger?.debug(`Request to ${url}`, { options });
|
|
399
|
+
const response = await fetch(url, options);
|
|
400
|
+
if (!response.ok) {
|
|
401
|
+
const errorData = await response.json().catch(() => ({}));
|
|
402
|
+
import_logger.logger.error(errorData);
|
|
403
|
+
const errorMessage = this.extractErrorMessage(errorData);
|
|
404
|
+
throw new Error(`API Request Failed: ${errorMessage}`);
|
|
405
|
+
}
|
|
406
|
+
const responseData = await response.json();
|
|
407
|
+
if (responseData && typeof responseData === "object" && "success" in responseData) {
|
|
408
|
+
if (responseData.success === false) {
|
|
409
|
+
const errorMessage = this.extractErrorMessage(responseData);
|
|
413
410
|
throw new Error(`API Request Failed: ${errorMessage}`);
|
|
414
411
|
}
|
|
415
412
|
}
|
|
416
|
-
return
|
|
413
|
+
return responseData;
|
|
417
414
|
} catch (error) {
|
|
418
|
-
if (
|
|
419
|
-
|
|
420
|
-
import_logger.logger.error(axiosError?.response);
|
|
421
|
-
const errorMessage = axiosError.response?.data ? this.extractErrorMessage(axiosError.response.data) : axiosError.message;
|
|
422
|
-
throw new Error(`API Request Failed: ${errorMessage}`);
|
|
415
|
+
if (error instanceof Error) {
|
|
416
|
+
throw error;
|
|
423
417
|
}
|
|
424
|
-
throw error;
|
|
418
|
+
throw new Error(`API Request Failed: ${String(error)}`);
|
|
425
419
|
}
|
|
426
420
|
}
|
|
427
421
|
/**
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["// src/index.ts\n\nimport axios, { AxiosError, AxiosResponse } from \"axios\";\nimport * as crypto from \"crypto\";\nimport {\n CreateSubAccountData,\n CreateSubAccountResponse,\n} from \"./types/subAccount\";\nimport {\n CurrencyConversionPayload,\n CurrencyConversionResult,\n EnhancedConversionResponse,\n IBankListResponse,\n IBankTransferData,\n IBankTransferResponse,\n ISupportedWalletResponse,\n IVerifyBankData,\n IVerifyBankResponse,\n IVerifyResponse,\n} from \"./types\";\nimport {\n ITransferAssetData,\n ITransferAssetResponse,\n ITransferHistoryParams,\n ITransferHistoryResponse,\n ITransferFeeParams,\n ITransferFeeResponse,\n} from \"./types/transfer\";\nimport { IAppInfo, IOAuthApp, ITokenData, IUserInfo } from \"./types/oauth\";\nimport { logger } from \"@untools/logger\";\n\nexport interface IApiResponse<T = unknown> {\n success: boolean;\n data: T;\n message: string;\n meta?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\n/**\n * Configuration interface for initializing the Pay100 SDK\n * @property publicKey - API public key required for all API calls\n * @property secretKey - Secret key used for server-side authentication and request signing\n * @property baseUrl - Optional API base URL, defaults to production endpoint\n */\ninterface IPay100Config {\n publicKey: string;\n secretKey?: string;\n baseUrl?: string;\n}\n\n/**\n * Interface representing transaction data returned from payment verification\n * Flexible structure to accommodate various transaction types and properties\n */\nexport interface ITransactionData {\n [key: string]: unknown;\n}\n\n/**\n * Interface for raw API responses before processing\n * Provides a flexible structure while capturing common response elements\n */\ninterface IRawApiResponse {\n status?: string;\n message?: string;\n data?: unknown;\n [key: string]: unknown;\n}\n\n// /**\n// * Standardized response interface for transaction verification\n// * @property status - Result status ('success' or 'error')\n// * @property data - Transaction details when successful, empty object on failure\n// * @property message - Optional response message, typically present on errors\n// */\n// interface IVerifyResponse {\n// status: \"success\" | \"error\";\n// data: ITransactionData | Record<string, never>;\n// message?: string;\n// }\n\n// Default API endpoint if not otherwise specified\nconst BASE_URL = process.env.BASE_URL || \"https://api.100pay.co\";\n\n/**\n * Custom error class for payment verification failures\n * Provides consistent error structure for better error handling\n */\nexport class PaymentVerificationError extends Error {\n status: string;\n data: Record<string, never>;\n\n constructor(message: string) {\n super(message);\n this.name = \"PaymentVerificationError\";\n this.status = \"error\";\n this.data = {};\n }\n}\n\n/**\n * Main SDK class for interacting with the 100Pay payment platform\n * Provides methods for transaction verification, subaccount management,\n * currency conversion, and asset transfers\n */\nexport class Pay100 {\n private publicKey: string;\n private secretKey?: string;\n private baseUrl: string;\n\n /**\n * Initialize the Pay100 SDK\n * @param config - Configuration object containing API keys and optional base URL\n */\n constructor({ publicKey, secretKey, baseUrl = BASE_URL }: IPay100Config) {\n this.publicKey = publicKey;\n this.secretKey = secretKey;\n this.baseUrl = baseUrl;\n }\n\n /**\n * Creates a cryptographic signature for secure server-to-server communication\n *\n * @param payload - Request payload that needs to be signed\n * @returns Object containing current timestamp and HMAC SHA-256 signature\n * @throws Error if secret key is missing or invalid\n */\n private createSignature(payload: Record<string, unknown>): {\n timestamp: string;\n signature: string;\n } {\n const timestamp = Date.now().toString();\n\n // Extract the token part from the secret key if it's in the format\n // STATUS;TYPE;TOKEN (e.g., \"LIVE;SK;eyJhbGciOiJIUzI1...\")\n let signingSecret = this?.secretKey;\n\n if (this?.secretKey?.includes(\";\")) {\n const secretKeyParts = this.secretKey.split(\";\");\n if (secretKeyParts.length === 3) {\n // Use just the token part as the signing secret\n signingSecret = secretKeyParts[2];\n }\n }\n\n if (!signingSecret) {\n throw new Error(\"Secret key is required for signing\");\n }\n\n // Create signature using HMAC SHA-256\n const signature = crypto\n .createHmac(\"sha256\", signingSecret)\n .update(timestamp + JSON.stringify(payload))\n .digest(\"hex\");\n\n return { timestamp, signature };\n }\n\n /**\n * Constructs HTTP headers for API requests with optional authentication\n *\n * @param payload - Request payload used to generate security signature\n * @returns Object containing all necessary HTTP headers\n */\n private getHeaders(\n payload: Record<string, unknown> = {}\n ): Record<string, string> {\n // Generate authentication headers if secret key is available (server-side mode)\n if (this.secretKey) {\n const { timestamp, signature } = this.createSignature(payload);\n return {\n \"api-key\": this.publicKey,\n \"x-secret-key\": this.secretKey,\n \"x-timestamp\": timestamp,\n \"x-signature\": signature,\n \"Content-Type\": \"application/json\",\n ...(payload?.headers || {}),\n };\n }\n\n // Basic headers for public API usage (client-side mode)\n return {\n \"api-key\": this.publicKey,\n \"Content-Type\": \"application/json\",\n ...(payload?.headers || {}),\n };\n }\n\n /**\n * Verifies the status and details of a payment transaction\n *\n * @param transactionId - Unique identifier of the transaction to verify\n * @returns Promise resolving to verification result with transaction data\n * @throws PaymentVerificationError on network issues or invalid responses\n */\n verify = async (transactionId: string): Promise<IVerifyResponse> => {\n try {\n const payload = { transactionId };\n\n const response: AxiosResponse<IRawApiResponse> = await axios({\n method: \"POST\",\n url: `${this.baseUrl}/api/v1/pay/crypto/payment/${transactionId}`,\n headers: this.getHeaders(payload),\n data: payload,\n });\n\n // Handle empty response\n if (!response.data) {\n return {\n status: \"error\",\n data: null,\n message:\n \"Something went wrong, be sure you supplied a valid payment id.\",\n };\n }\n\n // Handle string responses which indicate errors\n if (typeof response.data === \"string\") {\n if (response.data === \"Access Denied, Invalid KEY supplied\") {\n return {\n status: \"error\",\n data: null,\n message: \"Access Denied, Invalid KEY supplied\",\n };\n }\n\n if (response.data === \"invalid payment id supplied\") {\n return {\n status: \"error\",\n data: null,\n };\n }\n }\n\n // Validate and transform response data to ensure type safety\n const responseData = response.data;\n\n // Ensure the response data is an object that can be safely cast to ITransactionData\n const transactionData: IVerifyResponse[\"data\"] =\n responseData && typeof responseData === \"object\"\n ? (responseData as unknown as IVerifyResponse[\"data\"])\n : null;\n\n // Return successful response with properly typed data\n return {\n status: \"success\",\n data: transactionData,\n };\n } catch (error) {\n // Handle Axios errors with detailed message\n if (axios.isAxiosError(error)) {\n const axiosError = error as AxiosError;\n throw new PaymentVerificationError(\n axiosError.message ||\n \"Something went wrong, be sure you supplied a valid payment id.\"\n );\n }\n\n // Handle other errors with appropriate message\n throw new PaymentVerificationError(\n error instanceof Error ? error.message : \"An unknown error occurred\"\n );\n }\n };\n\n /**\n * Namespace for subaccount management operations\n * Provides methods to create and manage subaccounts\n */\n subaccounts = {\n /**\n * Creates a new subaccount within the platform\n *\n * @param data - Subaccount configuration including owner details and supported currencies\n * @returns Promise resolving to the created subaccount details\n * @throws Error if the request fails or returns invalid data\n */\n create: async (\n data: CreateSubAccountData\n ): Promise<CreateSubAccountResponse> => {\n // Make sure the networks are lowercase\n data.networks = data.networks.map((network) => network.toLowerCase());\n return this.request<CreateSubAccountResponse>(\n \"POST\",\n \"/api/v1/assets/subaccount/create\",\n data\n );\n },\n };\n\n /**\n * Namespace for currency conversion operations\n * Provides methods to calculate exchange rates and fees\n */\n conversion = {\n /**\n * Calculates a preview of currency conversion with rates and fees\n *\n * @param data - Conversion details including amount, source and target currencies\n * @returns Promise resolving to detailed conversion calculation\n * @throws Error if the request fails or returns invalid data\n */\n preview: async (\n data: CurrencyConversionPayload\n ): Promise<CurrencyConversionResult | EnhancedConversionResponse> => {\n return this.request<\n CurrencyConversionResult | EnhancedConversionResponse\n >(\"POST\", \"/api/v1/user/preview-convert-asset\", {\n ...data,\n ...(data.fromSymbol && {\n from_symbol: data.fromSymbol,\n }),\n ...(data.toSymbol && {\n to_symbol: data.toSymbol,\n }),\n });\n },\n };\n\n /**\n * Namespace for asset transfer operations\n * Provides methods to transfer assets, view history, and calculate fees\n */\n transfer = {\n /**\n * Transfer assets between wallets\n *\n * @param data - Transfer details including amount, currency, destination, and authentication\n * @returns Promise resolving to transfer confirmation with receipt and transaction ID\n * @throws Error if the transfer fails due to validation, insufficient funds, or other issues\n */\n executeTransfer: async (\n data: ITransferAssetData\n ): Promise<ITransferAssetResponse> => {\n return this.request<ITransferAssetResponse>(\n \"POST\",\n \"/api/v1/transfer/asset\",\n data,\n {\n ...(data?.oauthAccessToken && {\n Authorization: `Bearer ${data?.oauthAccessToken}`,\n }),\n }\n );\n },\n\n /**\n * Get transfer history for the authenticated user\n *\n * @param params - Filtering and pagination parameters\n * @returns Promise resolving to paginated transfer history records\n * @throws Error if the request fails or authentication is invalid\n */\n getHistory: async (\n params: ITransferHistoryParams\n ): Promise<ITransferHistoryResponse> => {\n return this.request<ITransferHistoryResponse>(\n \"GET\",\n \"/api/v1/transfer/history\",\n params\n );\n },\n\n /**\n * Calculate transfer fees for a potential transaction\n *\n * @param params - Fee calculation parameters including currency and transfer type\n * @returns Promise resolving to detailed fee breakdown\n * @throws Error if the fee calculation fails or currency is not supported\n */\n calculateFee: async (\n params: ITransferFeeParams\n ): Promise<ITransferFeeResponse> => {\n return this.request<ITransferFeeResponse>(\n \"GET\",\n \"/api/v1/transfer/fee\",\n params\n );\n },\n };\n\n /**\n * Namespace for wallet operations\n * Provides methods to retrieve supported wallets\n */\n wallet = {\n /**\n * Get a list of supported wallets and their details\n *\n * @returns Promise resolving to an array of supported wallet configurations\n * @throws Error if the request fails or authentication is invalid\n */\n getSupportedWallets: async (): Promise<ISupportedWalletResponse> => {\n return this.request<ISupportedWalletResponse>(\n \"GET\",\n \"/api/v1/wallet/supported\"\n );\n },\n };\n\n /**\n * Namespace for bank transfer operations\n * Provides methods to transfer to external bank accounts\n */\n bankTransfer = {\n /**\n * Get Bank List\n * @returns Promise resolving to an array of supported banks\n * @throws Error if the request fails or authentication is invalid\n */\n getBankList: async (): Promise<IBankListResponse> => {\n return this.request<IBankListResponse>(\n \"GET\",\n \"/api/v1/bank-transfers/banks\"\n );\n },\n\n /**\n * Verify Bank\n * @param data - Bank details\n * @returns Promise resolving to bank details\n * @throws Error if the request fails or authentication is invalid\n */\n verifyBank: async (data: IVerifyBankData): Promise<IVerifyBankResponse> => {\n return this.request<IVerifyBankResponse>(\n \"POST\",\n \"/api/v1/bank-transfers/verify-account\",\n data\n );\n },\n\n /**\n * Perform a bank transfer\n * @param data - Bank transfer details\n * @returns Promise resolving to bank transfer details\n * @throws Error if the request fails or authentication is invalid\n */\n transfer: async (\n data: IBankTransferData\n ): Promise<IBankTransferResponse> => {\n return this.request<IBankTransferResponse>(\n \"POST\",\n \"/api/v1/bank-transfers\",\n data\n );\n },\n };\n\n /**\n * Namespace for OAuth 2.0 operations\n */\n oauth = {\n /**\n * Register a new OAuth application.\n * @param data - Application details.\n * @returns Promise resolving to the registered OAuth application details.\n */\n registerApp: async (data: {\n appName: string;\n appDescription: string;\n appLogo: string;\n redirectUris: string[];\n allowedScopes: string[];\n }): Promise<IOAuthApp> => {\n return this.request<IOAuthApp>(\"POST\", \"/api/v1/oauth/register\", data);\n },\n\n /**\n * Get the authorization URL to redirect the user to.\n * @param params - Authorization parameters.\n * @returns Promise resolving to the authorization URL.\n */\n getAuthorizationUrl: async (params: {\n client_id: string;\n redirect_uri: string;\n scope?: string;\n state?: string;\n }): Promise<string> => {\n const response = await this.request<{\n data: { authorizationUrl: string };\n }>(\"GET\", \"/api/v1/oauth/authorize\", params);\n return response.data.authorizationUrl;\n },\n\n /**\n * Exchange authorization code for an access token.\n * @param data - Code exchange details.\n * @returns Promise resolving to the token data.\n */\n exchangeCodeForToken: async (data: {\n grant_type: \"authorization_code\";\n code: string;\n client_id: string;\n client_secret: string;\n redirect_uri: string;\n }): Promise<IApiResponse<ITokenData>> => {\n return this.request<IApiResponse<ITokenData>>(\n \"POST\",\n \"/api/v1/oauth/token\",\n data\n );\n },\n\n /**\n * Get user information using the access token.\n * @param accessToken - The access token.\n * @returns Promise resolving to the user information.\n */\n getUserInfo: async (\n accessToken: string\n ): Promise<IApiResponse<IUserInfo>> => {\n return this.request<IApiResponse<IUserInfo>>(\n \"GET\",\n \"/api/v1/oauth/userinfo\",\n {\n headers: { Authorization: `Bearer ${accessToken}` },\n }\n );\n },\n\n /**\n * Get application information using the access token.\n * @param accessToken - The access token.\n * @returns Promise resolving to the application information.\n */\n getAppInfo: async (\n accessToken: string\n ): Promise<IApiResponse<IAppInfo>> => {\n return this.request<IApiResponse<IAppInfo>>(\n \"GET\",\n \"/api/v1/oauth/appinfo\",\n {\n headers: { Authorization: `Bearer ${accessToken}` },\n }\n );\n },\n\n /**\n * Revoke an access token.\n * @param token - The access token to revoke.\n * @returns Promise resolving when the token is revoked.\n */\n revokeToken: async (token: string): Promise<void> => {\n return this.request<void>(\"POST\", \"/api/v1/oauth/revoke\", { token });\n },\n };\n\n /**\n * Generic method to make authenticated API requests to any endpoint\n *\n * @param method - HTTP method to use (GET, POST, PUT, DELETE)\n * @param endpoint - API endpoint path (will be appended to base URL)\n * @param data - Request payload or query parameters\n * @returns Promise resolving to the typed API response\n * @throws Error with detailed message on request failure\n */\n async request<T>(\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\",\n endpoint: string,\n data: Record<string, unknown> = {},\n customHeaders: Record<string, string> = {}\n ): Promise<T> {\n try {\n const url = `${this.baseUrl}${endpoint}`;\n const headers = this.getHeaders(data);\n\n const response = await axios({\n method,\n url,\n headers: { ...headers, ...customHeaders },\n data: method !== \"GET\" ? data : undefined,\n params: method === \"GET\" ? data : undefined,\n });\n\n // Check if the response indicates an error despite a successful HTTP status\n if (\n response.data &&\n typeof response.data === \"object\" &&\n \"success\" in response.data\n ) {\n if ((response.data as { success?: boolean }).success === false) {\n // Extract error from the API's own error indication\n const errorMessage = this.extractErrorMessage(response.data);\n throw new Error(`API Request Failed: ${errorMessage}`);\n }\n }\n\n return response.data as T;\n } catch (error) {\n if (axios.isAxiosError(error)) {\n const axiosError = error as AxiosError;\n logger.error(axiosError?.response);\n\n // Extract error message from response data if available\n const errorMessage = axiosError.response?.data\n ? this.extractErrorMessage(axiosError.response.data)\n : axiosError.message;\n\n throw new Error(`API Request Failed: ${errorMessage}`);\n }\n\n // Rethrow original error if not an Axios error\n throw error;\n }\n }\n\n /**\n * Extracts error message from various response data structures\n *\n * @param data - The response data object which may contain error information\n * @returns The most specific error message available\n */\n private extractErrorMessage(data: unknown): string {\n // If data is a string, return it directly\n if (typeof data === \"string\") {\n return data;\n }\n\n // If data is not an object or is null, return a generic message\n if (typeof data !== \"object\" || data === null) {\n return \"Unknown error\";\n }\n\n // Handle different error structures\n const dataObj = data as Record<string, unknown>;\n\n // Direct error message in data.message\n if (\"message\" in dataObj && typeof dataObj.message === \"string\") {\n return dataObj.message;\n }\n\n // Error object with message property\n if (\"error\" in dataObj) {\n const error = dataObj.error;\n\n // String error\n if (typeof error === \"string\") {\n return error;\n }\n\n // Object error with message\n if (error && typeof error === \"object\") {\n const errorObj = error as Record<string, unknown>;\n\n if (\"message\" in errorObj && typeof errorObj.message === \"string\") {\n return errorObj.message;\n }\n\n // Try to get any useful information from the error object\n if (\"code\" in errorObj && typeof errorObj.code === \"string\") {\n return `Error code: ${errorObj.code}`;\n }\n }\n }\n\n // Look for error in the 'data' property\n if (\"data\" in dataObj && dataObj.data && typeof dataObj.data === \"object\") {\n const nestedData = dataObj.data as Record<string, unknown>;\n\n if (\"message\" in nestedData && typeof nestedData.message === \"string\") {\n return nestedData.message;\n }\n\n if (\n \"error\" in nestedData &&\n nestedData.error &&\n typeof nestedData.error === \"object\"\n ) {\n const nestedError = nestedData.error as Record<string, unknown>;\n if (\n \"message\" in nestedError &&\n typeof nestedError.message === \"string\"\n ) {\n return nestedError.message;\n }\n }\n }\n\n // If we have a statusText from the response, use that\n if (\"statusText\" in dataObj && typeof dataObj.statusText === \"string\") {\n return dataObj.statusText;\n }\n\n // Stringify the error if nothing else works\n try {\n return `Error details: ${JSON.stringify(dataObj)}`;\n } catch {\n return \"Unknown error occurred\";\n }\n }\n}\n\nexport * from \"./types\";\nexport * from \"./types/transfer\";\nexport * from \"./types/oauth\";\n"],"mappings":"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","names":["axios"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["// src/index.ts\n\nimport * as crypto from \"crypto\";\nimport {\n CreateSubAccountData,\n CreateSubAccountResponse,\n} from \"./types/subAccount\";\nimport {\n CurrencyConversionPayload,\n CurrencyConversionResult,\n EnhancedConversionResponse,\n IBankListResponse,\n IBankTransferData,\n IBankTransferResponse,\n ISupportedWalletResponse,\n IVerifyBankData,\n IVerifyBankResponse,\n IVerifyResponse,\n} from \"./types\";\nimport {\n ITransferAssetData,\n ITransferAssetResponse,\n ITransferHistoryParams,\n ITransferHistoryResponse,\n ITransferFeeParams,\n ITransferFeeResponse,\n} from \"./types/transfer\";\nimport { IAppInfo, IOAuthApp, ITokenData, IUserInfo } from \"./types/oauth\";\nimport { logger } from \"@untools/logger\";\n\nexport interface IApiResponse<T = unknown> {\n success: boolean;\n data: T;\n message: string;\n meta?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\n/**\n * Configuration interface for initializing the Pay100 SDK\n * @property publicKey - API public key required for all API calls\n * @property secretKey - Secret key used for server-side authentication and request signing\n * @property baseUrl - Optional API base URL, defaults to production endpoint\n */\ninterface IPay100Config {\n publicKey: string;\n secretKey?: string;\n baseUrl?: string;\n}\n\n/**\n * Interface representing transaction data returned from payment verification\n * Flexible structure to accommodate various transaction types and properties\n */\nexport interface ITransactionData {\n [key: string]: unknown;\n}\n\n// Default API endpoint if not otherwise specified\nconst BASE_URL = process.env.BASE_URL || \"https://api.100pay.co\";\n\n/**\n * Custom error class for payment verification failures\n * Provides consistent error structure for better error handling\n */\nexport class PaymentVerificationError extends Error {\n status: string;\n data: Record<string, never>;\n\n constructor(message: string) {\n super(message);\n this.name = \"PaymentVerificationError\";\n this.status = \"error\";\n this.data = {};\n }\n}\n\n/**\n * Main SDK class for interacting with the 100Pay payment platform\n * Provides methods for transaction verification, subaccount management,\n * currency conversion, and asset transfers\n */\nexport class Pay100 {\n private publicKey: string;\n private secretKey?: string;\n private baseUrl: string;\n\n /**\n * Initialize the Pay100 SDK\n * @param config - Configuration object containing API keys and optional base URL\n */\n constructor({ publicKey, secretKey, baseUrl = BASE_URL }: IPay100Config) {\n this.publicKey = publicKey;\n this.secretKey = secretKey;\n this.baseUrl = baseUrl;\n }\n\n /**\n * Creates a cryptographic signature for secure server-to-server communication\n *\n * @param payload - Request payload that needs to be signed\n * @returns Object containing current timestamp and HMAC SHA-256 signature\n * @throws Error if secret key is missing or invalid\n */\n private createSignature(payload: Record<string, unknown>): {\n timestamp: string;\n signature: string;\n } {\n const timestamp = Date.now().toString();\n\n // Extract the token part from the secret key if it's in the format\n // STATUS;TYPE;TOKEN (e.g., \"LIVE;SK;eyJhbGciOiJIUzI1...\")\n let signingSecret = this?.secretKey;\n\n if (this?.secretKey?.includes(\";\")) {\n const secretKeyParts = this.secretKey.split(\";\");\n if (secretKeyParts.length === 3) {\n // Use just the token part as the signing secret\n signingSecret = secretKeyParts[2];\n }\n }\n\n if (!signingSecret) {\n throw new Error(\"Secret key is required for signing\");\n }\n\n // Create signature using HMAC SHA-256\n const signature = crypto\n .createHmac(\"sha256\", signingSecret)\n .update(timestamp + JSON.stringify(payload))\n .digest(\"hex\");\n\n return { timestamp, signature };\n }\n\n /**\n * Constructs HTTP headers for API requests with optional authentication\n *\n * @param payload - Request payload used to generate security signature\n * @returns Object containing all necessary HTTP headers\n */\n private getHeaders(\n payload: Record<string, unknown> = {}\n ): Record<string, string> {\n // Generate authentication headers if secret key is available (server-side mode)\n if (this.secretKey) {\n const { timestamp, signature } = this.createSignature(payload);\n return {\n \"api-key\": this.publicKey,\n \"x-secret-key\": this.secretKey,\n \"x-timestamp\": timestamp,\n \"x-signature\": signature,\n \"Content-Type\": \"application/json\",\n };\n }\n\n // Basic headers for public API usage (client-side mode)\n return {\n \"api-key\": this.publicKey,\n \"Content-Type\": \"application/json\",\n };\n }\n\n /**\n * Verifies the status and details of a payment transaction\n *\n * @param transactionId - Unique identifier of the transaction to verify\n * @returns Promise resolving to verification result with transaction data\n * @throws PaymentVerificationError on network issues or invalid responses\n */\n verify = async (transactionId: string): Promise<IVerifyResponse> => {\n try {\n const payload = { transactionId };\n\n const response = await fetch(\n `${this.baseUrl}/api/v1/pay/crypto/payment/${transactionId}`,\n {\n method: \"POST\",\n headers: this.getHeaders(payload),\n body: JSON.stringify(payload),\n }\n );\n\n // Parse response data\n const responseData: unknown = await response.json().catch(() => null);\n\n // Handle empty response\n if (!responseData) {\n return {\n status: \"error\",\n data: null,\n message:\n \"Something went wrong, be sure you supplied a valid payment id.\",\n };\n }\n\n // Handle string responses which indicate errors\n if (typeof responseData === \"string\") {\n if (responseData === \"Access Denied, Invalid KEY supplied\") {\n return {\n status: \"error\",\n data: null,\n message: \"Access Denied, Invalid KEY supplied\",\n };\n }\n\n if (responseData === \"invalid payment id supplied\") {\n return {\n status: \"error\",\n data: null,\n };\n }\n }\n\n // Ensure the response data is an object that can be safely cast to ITransactionData\n const transactionData: IVerifyResponse[\"data\"] =\n responseData && typeof responseData === \"object\"\n ? (responseData as unknown as IVerifyResponse[\"data\"])\n : null;\n\n // Return successful response with properly typed data\n return {\n status: \"success\",\n data: transactionData,\n };\n } catch (error) {\n // Handle errors with appropriate message\n throw new PaymentVerificationError(\n error instanceof Error ? error.message : \"An unknown error occurred\"\n );\n }\n };\n\n /**\n * Namespace for subaccount management operations\n * Provides methods to create and manage subaccounts\n */\n subaccounts = {\n /**\n * Creates a new subaccount within the platform\n *\n * @param data - Subaccount configuration including owner details and supported currencies\n * @returns Promise resolving to the created subaccount details\n * @throws Error if the request fails or returns invalid data\n */\n create: async (\n data: CreateSubAccountData\n ): Promise<CreateSubAccountResponse> => {\n // Make sure the networks are lowercase\n data.networks = data.networks.map((network) => network.toLowerCase());\n return this.request<CreateSubAccountResponse>(\n \"POST\",\n \"/api/v1/assets/subaccount/create\",\n data\n );\n },\n };\n\n /**\n * Namespace for currency conversion operations\n * Provides methods to calculate exchange rates and fees\n */\n conversion = {\n /**\n * Calculates a preview of currency conversion with rates and fees\n *\n * @param data - Conversion details including amount, source and target currencies\n * @returns Promise resolving to detailed conversion calculation\n * @throws Error if the request fails or returns invalid data\n */\n preview: async (\n data: CurrencyConversionPayload\n ): Promise<CurrencyConversionResult | EnhancedConversionResponse> => {\n return this.request<\n CurrencyConversionResult | EnhancedConversionResponse\n >(\"POST\", \"/api/v1/user/preview-convert-asset\", {\n ...data,\n ...(data.fromSymbol && {\n from_symbol: data.fromSymbol,\n }),\n ...(data.toSymbol && {\n to_symbol: data.toSymbol,\n }),\n });\n },\n };\n\n /**\n * Namespace for asset transfer operations\n * Provides methods to transfer assets, view history, and calculate fees\n */\n transfer = {\n /**\n * Transfer assets between wallets\n *\n * @param data - Transfer details including amount, currency, destination, and authentication\n * @returns Promise resolving to transfer confirmation with receipt and transaction ID\n * @throws Error if the transfer fails due to validation, insufficient funds, or other issues\n */\n executeTransfer: async (\n data: ITransferAssetData\n ): Promise<ITransferAssetResponse> => {\n const { oauthAccessToken, ...transferData } = data;\n return this.request<ITransferAssetResponse>(\n \"POST\",\n \"/api/v1/transfer/asset\",\n transferData,\n oauthAccessToken ? { Authorization: `Bearer ${oauthAccessToken}` } : {}\n );\n },\n\n /**\n * Get transfer history for the authenticated user\n *\n * @param params - Filtering and pagination parameters\n * @returns Promise resolving to paginated transfer history records\n * @throws Error if the request fails or authentication is invalid\n */\n getHistory: async (\n params: ITransferHistoryParams\n ): Promise<ITransferHistoryResponse> => {\n return this.request<ITransferHistoryResponse>(\n \"GET\",\n \"/api/v1/transfer/history\",\n params\n );\n },\n\n /**\n * Calculate transfer fees for a potential transaction\n *\n * @param params - Fee calculation parameters including currency and transfer type\n * @returns Promise resolving to detailed fee breakdown\n * @throws Error if the fee calculation fails or currency is not supported\n */\n calculateFee: async (\n params: ITransferFeeParams\n ): Promise<ITransferFeeResponse> => {\n return this.request<ITransferFeeResponse>(\n \"GET\",\n \"/api/v1/transfer/fee\",\n params\n );\n },\n };\n\n /**\n * Namespace for wallet operations\n * Provides methods to retrieve supported wallets\n */\n wallet = {\n /**\n * Get a list of supported wallets and their details\n *\n * @returns Promise resolving to an array of supported wallet configurations\n * @throws Error if the request fails or authentication is invalid\n */\n getSupportedWallets: async (): Promise<ISupportedWalletResponse> => {\n return this.request<ISupportedWalletResponse>(\n \"GET\",\n \"/api/v1/wallet/supported\"\n );\n },\n };\n\n /**\n * Namespace for bank transfer operations\n * Provides methods to transfer to external bank accounts\n */\n bankTransfer = {\n /**\n * Get Bank List\n * @returns Promise resolving to an array of supported banks\n * @throws Error if the request fails or authentication is invalid\n */\n getBankList: async (): Promise<IBankListResponse> => {\n return this.request<IBankListResponse>(\n \"GET\",\n \"/api/v1/bank-transfers/banks\"\n );\n },\n\n /**\n * Verify Bank\n * @param data - Bank details\n * @returns Promise resolving to bank details\n * @throws Error if the request fails or authentication is invalid\n */\n verifyBank: async (data: IVerifyBankData): Promise<IVerifyBankResponse> => {\n return this.request<IVerifyBankResponse>(\n \"POST\",\n \"/api/v1/bank-transfers/verify-account\",\n data\n );\n },\n\n /**\n * Perform a bank transfer\n * @param data - Bank transfer details\n * @returns Promise resolving to bank transfer details\n * @throws Error if the request fails or authentication is invalid\n */\n transfer: async (\n data: IBankTransferData\n ): Promise<IBankTransferResponse> => {\n return this.request<IBankTransferResponse>(\n \"POST\",\n \"/api/v1/bank-transfers\",\n data\n );\n },\n };\n\n /**\n * Namespace for OAuth 2.0 operations\n */\n oauth = {\n /**\n * Register a new OAuth application.\n * @param data - Application details.\n * @returns Promise resolving to the registered OAuth application details.\n */\n registerApp: async (data: {\n appName: string;\n appDescription: string;\n appLogo: string;\n redirectUris: string[];\n allowedScopes: string[];\n }): Promise<IOAuthApp> => {\n return this.request<IOAuthApp>(\"POST\", \"/api/v1/oauth/register\", data);\n },\n\n /**\n * Get the authorization URL to redirect the user to.\n * @param params - Authorization parameters.\n * @returns Promise resolving to the authorization URL.\n */\n getAuthorizationUrl: async (params: {\n client_id: string;\n redirect_uri: string;\n scope?: string;\n state?: string;\n }): Promise<string> => {\n const response = await this.request<{\n data: { authorizationUrl: string };\n }>(\"GET\", \"/api/v1/oauth/authorize\", params);\n return response.data.authorizationUrl;\n },\n\n /**\n * Exchange authorization code for an access token.\n * @param data - Code exchange details.\n * @returns Promise resolving to the token data.\n */\n exchangeCodeForToken: async (data: {\n grant_type: \"authorization_code\";\n code: string;\n client_id: string;\n client_secret: string;\n redirect_uri: string;\n }): Promise<IApiResponse<ITokenData>> => {\n return this.request<IApiResponse<ITokenData>>(\n \"POST\",\n \"/api/v1/oauth/token\",\n data\n );\n },\n\n /**\n * Get user information using the access token.\n * @param accessToken - The access token.\n * @returns Promise resolving to the user information.\n */\n getUserInfo: async (\n accessToken: string\n ): Promise<IApiResponse<IUserInfo>> => {\n return this.request<IApiResponse<IUserInfo>>(\n \"GET\",\n \"/api/v1/oauth/userinfo\",\n {},\n { Authorization: `Bearer ${accessToken}` }\n );\n },\n\n /**\n * Get application information using the access token.\n * @param accessToken - The access token.\n * @returns Promise resolving to the application information.\n */\n getAppInfo: async (\n accessToken: string\n ): Promise<IApiResponse<IAppInfo>> => {\n return this.request<IApiResponse<IAppInfo>>(\n \"GET\",\n \"/api/v1/oauth/appinfo\",\n {},\n { Authorization: `Bearer ${accessToken}` }\n );\n },\n\n /**\n * Revoke an access token.\n * @param token - The access token to revoke.\n * @returns Promise resolving when the token is revoked.\n */\n revokeToken: async (token: string): Promise<void> => {\n return this.request<void>(\"POST\", \"/api/v1/oauth/revoke\", { token });\n },\n };\n\n /**\n * Generic method to make authenticated API requests to any endpoint\n *\n * @param method - HTTP method to use (GET, POST, PUT, DELETE)\n * @param endpoint - API endpoint path (will be appended to base URL)\n * @param data - Request payload or query parameters\n * @returns Promise resolving to the typed API response\n * @throws Error with detailed message on request failure\n */\n async request<T>(\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\",\n endpoint: string,\n data: Record<string, unknown> = {},\n customHeaders: Record<string, string> = {}\n ): Promise<T> {\n try {\n // Build URL with query parameters for GET requests\n const url =\n method === \"GET\" && Object.keys(data).length > 0\n ? `${this.baseUrl}${endpoint}?${new URLSearchParams(\n data as Record<string, string>\n )}`\n : `${this.baseUrl}${endpoint}`;\n\n const headers = this.getHeaders(data);\n const options = {\n method,\n headers: { ...headers, ...customHeaders },\n body: method !== \"GET\" ? JSON.stringify(data) : undefined,\n };\n logger?.debug(`Request to ${url}`, { options });\n const response = await fetch(url, options);\n\n // Handle response.ok check and throw errors for failed requests\n if (!response.ok) {\n const errorData: unknown = await response.json().catch(() => ({}));\n logger.error(errorData);\n const errorMessage = this.extractErrorMessage(errorData);\n throw new Error(`API Request Failed: ${errorMessage}`);\n }\n\n // Parse JSON response\n const responseData: unknown = await response.json();\n\n // Check if the response indicates an error despite a successful HTTP status\n if (\n responseData &&\n typeof responseData === \"object\" &&\n \"success\" in responseData\n ) {\n if ((responseData as { success?: boolean }).success === false) {\n // Extract error from the API's own error indication\n const errorMessage = this.extractErrorMessage(responseData);\n throw new Error(`API Request Failed: ${errorMessage}`);\n }\n }\n\n return responseData as T;\n } catch (error) {\n if (error instanceof Error) {\n throw error;\n }\n\n // Handle unexpected error types\n throw new Error(`API Request Failed: ${String(error)}`);\n }\n }\n\n /**\n * Extracts error message from various response data structures\n *\n * @param data - The response data object which may contain error information\n * @returns The most specific error message available\n */\n private extractErrorMessage(data: unknown): string {\n // If data is a string, return it directly\n if (typeof data === \"string\") {\n return data;\n }\n\n // If data is not an object or is null, return a generic message\n if (typeof data !== \"object\" || data === null) {\n return \"Unknown error\";\n }\n\n // Handle different error structures\n const dataObj = data as Record<string, unknown>;\n\n // Direct error message in data.message\n if (\"message\" in dataObj && typeof dataObj.message === \"string\") {\n return dataObj.message;\n }\n\n // Error object with message property\n if (\"error\" in dataObj) {\n const error = dataObj.error;\n\n // String error\n if (typeof error === \"string\") {\n return error;\n }\n\n // Object error with message\n if (error && typeof error === \"object\") {\n const errorObj = error as Record<string, unknown>;\n\n if (\"message\" in errorObj && typeof errorObj.message === \"string\") {\n return errorObj.message;\n }\n\n // Try to get any useful information from the error object\n if (\"code\" in errorObj && typeof errorObj.code === \"string\") {\n return `Error code: ${errorObj.code}`;\n }\n }\n }\n\n // Look for error in the 'data' property\n if (\"data\" in dataObj && dataObj.data && typeof dataObj.data === \"object\") {\n const nestedData = dataObj.data as Record<string, unknown>;\n\n if (\"message\" in nestedData && typeof nestedData.message === \"string\") {\n return nestedData.message;\n }\n\n if (\n \"error\" in nestedData &&\n nestedData.error &&\n typeof nestedData.error === \"object\"\n ) {\n const nestedError = nestedData.error as Record<string, unknown>;\n if (\n \"message\" in nestedError &&\n typeof nestedError.message === \"string\"\n ) {\n return nestedError.message;\n }\n }\n }\n\n // If we have a statusText from the response, use that\n if (\"statusText\" in dataObj && typeof dataObj.statusText === \"string\") {\n return dataObj.statusText;\n }\n\n // Stringify the error if nothing else works\n try {\n return `Error details: ${JSON.stringify(dataObj)}`;\n } catch {\n return \"Unknown error occurred\";\n }\n }\n}\n\nexport * from \"./types\";\nexport * from \"./types/transfer\";\nexport * from \"./types/oauth\";\n"],"mappings":"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","names":[]}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
// src/index.ts
|
|
2
|
-
import axios from "axios";
|
|
3
2
|
import * as crypto from "crypto";
|
|
4
3
|
import { logger } from "@untools/logger";
|
|
5
4
|
var BASE_URL = process.env.BASE_URL || "https://api.100pay.co";
|
|
@@ -27,47 +26,43 @@ var Pay100 = class {
|
|
|
27
26
|
this.verify = async (transactionId) => {
|
|
28
27
|
try {
|
|
29
28
|
const payload = { transactionId };
|
|
30
|
-
const response = await
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
29
|
+
const response = await fetch(
|
|
30
|
+
`${this.baseUrl}/api/v1/pay/crypto/payment/${transactionId}`,
|
|
31
|
+
{
|
|
32
|
+
method: "POST",
|
|
33
|
+
headers: this.getHeaders(payload),
|
|
34
|
+
body: JSON.stringify(payload)
|
|
35
|
+
}
|
|
36
|
+
);
|
|
37
|
+
const responseData = await response.json().catch(() => null);
|
|
38
|
+
if (!responseData) {
|
|
37
39
|
return {
|
|
38
40
|
status: "error",
|
|
39
41
|
data: null,
|
|
40
42
|
message: "Something went wrong, be sure you supplied a valid payment id."
|
|
41
43
|
};
|
|
42
44
|
}
|
|
43
|
-
if (typeof
|
|
44
|
-
if (
|
|
45
|
+
if (typeof responseData === "string") {
|
|
46
|
+
if (responseData === "Access Denied, Invalid KEY supplied") {
|
|
45
47
|
return {
|
|
46
48
|
status: "error",
|
|
47
49
|
data: null,
|
|
48
50
|
message: "Access Denied, Invalid KEY supplied"
|
|
49
51
|
};
|
|
50
52
|
}
|
|
51
|
-
if (
|
|
53
|
+
if (responseData === "invalid payment id supplied") {
|
|
52
54
|
return {
|
|
53
55
|
status: "error",
|
|
54
56
|
data: null
|
|
55
57
|
};
|
|
56
58
|
}
|
|
57
59
|
}
|
|
58
|
-
const responseData = response.data;
|
|
59
60
|
const transactionData = responseData && typeof responseData === "object" ? responseData : null;
|
|
60
61
|
return {
|
|
61
62
|
status: "success",
|
|
62
63
|
data: transactionData
|
|
63
64
|
};
|
|
64
65
|
} catch (error) {
|
|
65
|
-
if (axios.isAxiosError(error)) {
|
|
66
|
-
const axiosError = error;
|
|
67
|
-
throw new PaymentVerificationError(
|
|
68
|
-
axiosError.message || "Something went wrong, be sure you supplied a valid payment id."
|
|
69
|
-
);
|
|
70
|
-
}
|
|
71
66
|
throw new PaymentVerificationError(
|
|
72
67
|
error instanceof Error ? error.message : "An unknown error occurred"
|
|
73
68
|
);
|
|
@@ -131,15 +126,12 @@ var Pay100 = class {
|
|
|
131
126
|
* @throws Error if the transfer fails due to validation, insufficient funds, or other issues
|
|
132
127
|
*/
|
|
133
128
|
executeTransfer: async (data) => {
|
|
129
|
+
const { oauthAccessToken, ...transferData } = data;
|
|
134
130
|
return this.request(
|
|
135
131
|
"POST",
|
|
136
132
|
"/api/v1/transfer/asset",
|
|
137
|
-
|
|
138
|
-
{
|
|
139
|
-
...data?.oauthAccessToken && {
|
|
140
|
-
Authorization: `Bearer ${data?.oauthAccessToken}`
|
|
141
|
-
}
|
|
142
|
-
}
|
|
133
|
+
transferData,
|
|
134
|
+
oauthAccessToken ? { Authorization: `Bearer ${oauthAccessToken}` } : {}
|
|
143
135
|
);
|
|
144
136
|
},
|
|
145
137
|
/**
|
|
@@ -274,9 +266,8 @@ var Pay100 = class {
|
|
|
274
266
|
return this.request(
|
|
275
267
|
"GET",
|
|
276
268
|
"/api/v1/oauth/userinfo",
|
|
277
|
-
{
|
|
278
|
-
|
|
279
|
-
}
|
|
269
|
+
{},
|
|
270
|
+
{ Authorization: `Bearer ${accessToken}` }
|
|
280
271
|
);
|
|
281
272
|
},
|
|
282
273
|
/**
|
|
@@ -288,9 +279,8 @@ var Pay100 = class {
|
|
|
288
279
|
return this.request(
|
|
289
280
|
"GET",
|
|
290
281
|
"/api/v1/oauth/appinfo",
|
|
291
|
-
{
|
|
292
|
-
|
|
293
|
-
}
|
|
282
|
+
{},
|
|
283
|
+
{ Authorization: `Bearer ${accessToken}` }
|
|
294
284
|
);
|
|
295
285
|
},
|
|
296
286
|
/**
|
|
@@ -342,14 +332,12 @@ var Pay100 = class {
|
|
|
342
332
|
"x-secret-key": this.secretKey,
|
|
343
333
|
"x-timestamp": timestamp,
|
|
344
334
|
"x-signature": signature,
|
|
345
|
-
"Content-Type": "application/json"
|
|
346
|
-
...payload?.headers || {}
|
|
335
|
+
"Content-Type": "application/json"
|
|
347
336
|
};
|
|
348
337
|
}
|
|
349
338
|
return {
|
|
350
339
|
"api-key": this.publicKey,
|
|
351
|
-
"Content-Type": "application/json"
|
|
352
|
-
...payload?.headers || {}
|
|
340
|
+
"Content-Type": "application/json"
|
|
353
341
|
};
|
|
354
342
|
}
|
|
355
343
|
/**
|
|
@@ -363,30 +351,36 @@ var Pay100 = class {
|
|
|
363
351
|
*/
|
|
364
352
|
async request(method, endpoint, data = {}, customHeaders = {}) {
|
|
365
353
|
try {
|
|
366
|
-
const url = `${this.baseUrl}${endpoint}
|
|
354
|
+
const url = method === "GET" && Object.keys(data).length > 0 ? `${this.baseUrl}${endpoint}?${new URLSearchParams(
|
|
355
|
+
data
|
|
356
|
+
)}` : `${this.baseUrl}${endpoint}`;
|
|
367
357
|
const headers = this.getHeaders(data);
|
|
368
|
-
const
|
|
358
|
+
const options = {
|
|
369
359
|
method,
|
|
370
|
-
url,
|
|
371
360
|
headers: { ...headers, ...customHeaders },
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
});
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
361
|
+
body: method !== "GET" ? JSON.stringify(data) : void 0
|
|
362
|
+
};
|
|
363
|
+
logger?.debug(`Request to ${url}`, { options });
|
|
364
|
+
const response = await fetch(url, options);
|
|
365
|
+
if (!response.ok) {
|
|
366
|
+
const errorData = await response.json().catch(() => ({}));
|
|
367
|
+
logger.error(errorData);
|
|
368
|
+
const errorMessage = this.extractErrorMessage(errorData);
|
|
369
|
+
throw new Error(`API Request Failed: ${errorMessage}`);
|
|
370
|
+
}
|
|
371
|
+
const responseData = await response.json();
|
|
372
|
+
if (responseData && typeof responseData === "object" && "success" in responseData) {
|
|
373
|
+
if (responseData.success === false) {
|
|
374
|
+
const errorMessage = this.extractErrorMessage(responseData);
|
|
378
375
|
throw new Error(`API Request Failed: ${errorMessage}`);
|
|
379
376
|
}
|
|
380
377
|
}
|
|
381
|
-
return
|
|
378
|
+
return responseData;
|
|
382
379
|
} catch (error) {
|
|
383
|
-
if (
|
|
384
|
-
|
|
385
|
-
logger.error(axiosError?.response);
|
|
386
|
-
const errorMessage = axiosError.response?.data ? this.extractErrorMessage(axiosError.response.data) : axiosError.message;
|
|
387
|
-
throw new Error(`API Request Failed: ${errorMessage}`);
|
|
380
|
+
if (error instanceof Error) {
|
|
381
|
+
throw error;
|
|
388
382
|
}
|
|
389
|
-
throw error;
|
|
383
|
+
throw new Error(`API Request Failed: ${String(error)}`);
|
|
390
384
|
}
|
|
391
385
|
}
|
|
392
386
|
/**
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["// src/index.ts\n\nimport axios, { AxiosError, AxiosResponse } from \"axios\";\nimport * as crypto from \"crypto\";\nimport {\n CreateSubAccountData,\n CreateSubAccountResponse,\n} from \"./types/subAccount\";\nimport {\n CurrencyConversionPayload,\n CurrencyConversionResult,\n EnhancedConversionResponse,\n IBankListResponse,\n IBankTransferData,\n IBankTransferResponse,\n ISupportedWalletResponse,\n IVerifyBankData,\n IVerifyBankResponse,\n IVerifyResponse,\n} from \"./types\";\nimport {\n ITransferAssetData,\n ITransferAssetResponse,\n ITransferHistoryParams,\n ITransferHistoryResponse,\n ITransferFeeParams,\n ITransferFeeResponse,\n} from \"./types/transfer\";\nimport { IAppInfo, IOAuthApp, ITokenData, IUserInfo } from \"./types/oauth\";\nimport { logger } from \"@untools/logger\";\n\nexport interface IApiResponse<T = unknown> {\n success: boolean;\n data: T;\n message: string;\n meta?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\n/**\n * Configuration interface for initializing the Pay100 SDK\n * @property publicKey - API public key required for all API calls\n * @property secretKey - Secret key used for server-side authentication and request signing\n * @property baseUrl - Optional API base URL, defaults to production endpoint\n */\ninterface IPay100Config {\n publicKey: string;\n secretKey?: string;\n baseUrl?: string;\n}\n\n/**\n * Interface representing transaction data returned from payment verification\n * Flexible structure to accommodate various transaction types and properties\n */\nexport interface ITransactionData {\n [key: string]: unknown;\n}\n\n/**\n * Interface for raw API responses before processing\n * Provides a flexible structure while capturing common response elements\n */\ninterface IRawApiResponse {\n status?: string;\n message?: string;\n data?: unknown;\n [key: string]: unknown;\n}\n\n// /**\n// * Standardized response interface for transaction verification\n// * @property status - Result status ('success' or 'error')\n// * @property data - Transaction details when successful, empty object on failure\n// * @property message - Optional response message, typically present on errors\n// */\n// interface IVerifyResponse {\n// status: \"success\" | \"error\";\n// data: ITransactionData | Record<string, never>;\n// message?: string;\n// }\n\n// Default API endpoint if not otherwise specified\nconst BASE_URL = process.env.BASE_URL || \"https://api.100pay.co\";\n\n/**\n * Custom error class for payment verification failures\n * Provides consistent error structure for better error handling\n */\nexport class PaymentVerificationError extends Error {\n status: string;\n data: Record<string, never>;\n\n constructor(message: string) {\n super(message);\n this.name = \"PaymentVerificationError\";\n this.status = \"error\";\n this.data = {};\n }\n}\n\n/**\n * Main SDK class for interacting with the 100Pay payment platform\n * Provides methods for transaction verification, subaccount management,\n * currency conversion, and asset transfers\n */\nexport class Pay100 {\n private publicKey: string;\n private secretKey?: string;\n private baseUrl: string;\n\n /**\n * Initialize the Pay100 SDK\n * @param config - Configuration object containing API keys and optional base URL\n */\n constructor({ publicKey, secretKey, baseUrl = BASE_URL }: IPay100Config) {\n this.publicKey = publicKey;\n this.secretKey = secretKey;\n this.baseUrl = baseUrl;\n }\n\n /**\n * Creates a cryptographic signature for secure server-to-server communication\n *\n * @param payload - Request payload that needs to be signed\n * @returns Object containing current timestamp and HMAC SHA-256 signature\n * @throws Error if secret key is missing or invalid\n */\n private createSignature(payload: Record<string, unknown>): {\n timestamp: string;\n signature: string;\n } {\n const timestamp = Date.now().toString();\n\n // Extract the token part from the secret key if it's in the format\n // STATUS;TYPE;TOKEN (e.g., \"LIVE;SK;eyJhbGciOiJIUzI1...\")\n let signingSecret = this?.secretKey;\n\n if (this?.secretKey?.includes(\";\")) {\n const secretKeyParts = this.secretKey.split(\";\");\n if (secretKeyParts.length === 3) {\n // Use just the token part as the signing secret\n signingSecret = secretKeyParts[2];\n }\n }\n\n if (!signingSecret) {\n throw new Error(\"Secret key is required for signing\");\n }\n\n // Create signature using HMAC SHA-256\n const signature = crypto\n .createHmac(\"sha256\", signingSecret)\n .update(timestamp + JSON.stringify(payload))\n .digest(\"hex\");\n\n return { timestamp, signature };\n }\n\n /**\n * Constructs HTTP headers for API requests with optional authentication\n *\n * @param payload - Request payload used to generate security signature\n * @returns Object containing all necessary HTTP headers\n */\n private getHeaders(\n payload: Record<string, unknown> = {}\n ): Record<string, string> {\n // Generate authentication headers if secret key is available (server-side mode)\n if (this.secretKey) {\n const { timestamp, signature } = this.createSignature(payload);\n return {\n \"api-key\": this.publicKey,\n \"x-secret-key\": this.secretKey,\n \"x-timestamp\": timestamp,\n \"x-signature\": signature,\n \"Content-Type\": \"application/json\",\n ...(payload?.headers || {}),\n };\n }\n\n // Basic headers for public API usage (client-side mode)\n return {\n \"api-key\": this.publicKey,\n \"Content-Type\": \"application/json\",\n ...(payload?.headers || {}),\n };\n }\n\n /**\n * Verifies the status and details of a payment transaction\n *\n * @param transactionId - Unique identifier of the transaction to verify\n * @returns Promise resolving to verification result with transaction data\n * @throws PaymentVerificationError on network issues or invalid responses\n */\n verify = async (transactionId: string): Promise<IVerifyResponse> => {\n try {\n const payload = { transactionId };\n\n const response: AxiosResponse<IRawApiResponse> = await axios({\n method: \"POST\",\n url: `${this.baseUrl}/api/v1/pay/crypto/payment/${transactionId}`,\n headers: this.getHeaders(payload),\n data: payload,\n });\n\n // Handle empty response\n if (!response.data) {\n return {\n status: \"error\",\n data: null,\n message:\n \"Something went wrong, be sure you supplied a valid payment id.\",\n };\n }\n\n // Handle string responses which indicate errors\n if (typeof response.data === \"string\") {\n if (response.data === \"Access Denied, Invalid KEY supplied\") {\n return {\n status: \"error\",\n data: null,\n message: \"Access Denied, Invalid KEY supplied\",\n };\n }\n\n if (response.data === \"invalid payment id supplied\") {\n return {\n status: \"error\",\n data: null,\n };\n }\n }\n\n // Validate and transform response data to ensure type safety\n const responseData = response.data;\n\n // Ensure the response data is an object that can be safely cast to ITransactionData\n const transactionData: IVerifyResponse[\"data\"] =\n responseData && typeof responseData === \"object\"\n ? (responseData as unknown as IVerifyResponse[\"data\"])\n : null;\n\n // Return successful response with properly typed data\n return {\n status: \"success\",\n data: transactionData,\n };\n } catch (error) {\n // Handle Axios errors with detailed message\n if (axios.isAxiosError(error)) {\n const axiosError = error as AxiosError;\n throw new PaymentVerificationError(\n axiosError.message ||\n \"Something went wrong, be sure you supplied a valid payment id.\"\n );\n }\n\n // Handle other errors with appropriate message\n throw new PaymentVerificationError(\n error instanceof Error ? error.message : \"An unknown error occurred\"\n );\n }\n };\n\n /**\n * Namespace for subaccount management operations\n * Provides methods to create and manage subaccounts\n */\n subaccounts = {\n /**\n * Creates a new subaccount within the platform\n *\n * @param data - Subaccount configuration including owner details and supported currencies\n * @returns Promise resolving to the created subaccount details\n * @throws Error if the request fails or returns invalid data\n */\n create: async (\n data: CreateSubAccountData\n ): Promise<CreateSubAccountResponse> => {\n // Make sure the networks are lowercase\n data.networks = data.networks.map((network) => network.toLowerCase());\n return this.request<CreateSubAccountResponse>(\n \"POST\",\n \"/api/v1/assets/subaccount/create\",\n data\n );\n },\n };\n\n /**\n * Namespace for currency conversion operations\n * Provides methods to calculate exchange rates and fees\n */\n conversion = {\n /**\n * Calculates a preview of currency conversion with rates and fees\n *\n * @param data - Conversion details including amount, source and target currencies\n * @returns Promise resolving to detailed conversion calculation\n * @throws Error if the request fails or returns invalid data\n */\n preview: async (\n data: CurrencyConversionPayload\n ): Promise<CurrencyConversionResult | EnhancedConversionResponse> => {\n return this.request<\n CurrencyConversionResult | EnhancedConversionResponse\n >(\"POST\", \"/api/v1/user/preview-convert-asset\", {\n ...data,\n ...(data.fromSymbol && {\n from_symbol: data.fromSymbol,\n }),\n ...(data.toSymbol && {\n to_symbol: data.toSymbol,\n }),\n });\n },\n };\n\n /**\n * Namespace for asset transfer operations\n * Provides methods to transfer assets, view history, and calculate fees\n */\n transfer = {\n /**\n * Transfer assets between wallets\n *\n * @param data - Transfer details including amount, currency, destination, and authentication\n * @returns Promise resolving to transfer confirmation with receipt and transaction ID\n * @throws Error if the transfer fails due to validation, insufficient funds, or other issues\n */\n executeTransfer: async (\n data: ITransferAssetData\n ): Promise<ITransferAssetResponse> => {\n return this.request<ITransferAssetResponse>(\n \"POST\",\n \"/api/v1/transfer/asset\",\n data,\n {\n ...(data?.oauthAccessToken && {\n Authorization: `Bearer ${data?.oauthAccessToken}`,\n }),\n }\n );\n },\n\n /**\n * Get transfer history for the authenticated user\n *\n * @param params - Filtering and pagination parameters\n * @returns Promise resolving to paginated transfer history records\n * @throws Error if the request fails or authentication is invalid\n */\n getHistory: async (\n params: ITransferHistoryParams\n ): Promise<ITransferHistoryResponse> => {\n return this.request<ITransferHistoryResponse>(\n \"GET\",\n \"/api/v1/transfer/history\",\n params\n );\n },\n\n /**\n * Calculate transfer fees for a potential transaction\n *\n * @param params - Fee calculation parameters including currency and transfer type\n * @returns Promise resolving to detailed fee breakdown\n * @throws Error if the fee calculation fails or currency is not supported\n */\n calculateFee: async (\n params: ITransferFeeParams\n ): Promise<ITransferFeeResponse> => {\n return this.request<ITransferFeeResponse>(\n \"GET\",\n \"/api/v1/transfer/fee\",\n params\n );\n },\n };\n\n /**\n * Namespace for wallet operations\n * Provides methods to retrieve supported wallets\n */\n wallet = {\n /**\n * Get a list of supported wallets and their details\n *\n * @returns Promise resolving to an array of supported wallet configurations\n * @throws Error if the request fails or authentication is invalid\n */\n getSupportedWallets: async (): Promise<ISupportedWalletResponse> => {\n return this.request<ISupportedWalletResponse>(\n \"GET\",\n \"/api/v1/wallet/supported\"\n );\n },\n };\n\n /**\n * Namespace for bank transfer operations\n * Provides methods to transfer to external bank accounts\n */\n bankTransfer = {\n /**\n * Get Bank List\n * @returns Promise resolving to an array of supported banks\n * @throws Error if the request fails or authentication is invalid\n */\n getBankList: async (): Promise<IBankListResponse> => {\n return this.request<IBankListResponse>(\n \"GET\",\n \"/api/v1/bank-transfers/banks\"\n );\n },\n\n /**\n * Verify Bank\n * @param data - Bank details\n * @returns Promise resolving to bank details\n * @throws Error if the request fails or authentication is invalid\n */\n verifyBank: async (data: IVerifyBankData): Promise<IVerifyBankResponse> => {\n return this.request<IVerifyBankResponse>(\n \"POST\",\n \"/api/v1/bank-transfers/verify-account\",\n data\n );\n },\n\n /**\n * Perform a bank transfer\n * @param data - Bank transfer details\n * @returns Promise resolving to bank transfer details\n * @throws Error if the request fails or authentication is invalid\n */\n transfer: async (\n data: IBankTransferData\n ): Promise<IBankTransferResponse> => {\n return this.request<IBankTransferResponse>(\n \"POST\",\n \"/api/v1/bank-transfers\",\n data\n );\n },\n };\n\n /**\n * Namespace for OAuth 2.0 operations\n */\n oauth = {\n /**\n * Register a new OAuth application.\n * @param data - Application details.\n * @returns Promise resolving to the registered OAuth application details.\n */\n registerApp: async (data: {\n appName: string;\n appDescription: string;\n appLogo: string;\n redirectUris: string[];\n allowedScopes: string[];\n }): Promise<IOAuthApp> => {\n return this.request<IOAuthApp>(\"POST\", \"/api/v1/oauth/register\", data);\n },\n\n /**\n * Get the authorization URL to redirect the user to.\n * @param params - Authorization parameters.\n * @returns Promise resolving to the authorization URL.\n */\n getAuthorizationUrl: async (params: {\n client_id: string;\n redirect_uri: string;\n scope?: string;\n state?: string;\n }): Promise<string> => {\n const response = await this.request<{\n data: { authorizationUrl: string };\n }>(\"GET\", \"/api/v1/oauth/authorize\", params);\n return response.data.authorizationUrl;\n },\n\n /**\n * Exchange authorization code for an access token.\n * @param data - Code exchange details.\n * @returns Promise resolving to the token data.\n */\n exchangeCodeForToken: async (data: {\n grant_type: \"authorization_code\";\n code: string;\n client_id: string;\n client_secret: string;\n redirect_uri: string;\n }): Promise<IApiResponse<ITokenData>> => {\n return this.request<IApiResponse<ITokenData>>(\n \"POST\",\n \"/api/v1/oauth/token\",\n data\n );\n },\n\n /**\n * Get user information using the access token.\n * @param accessToken - The access token.\n * @returns Promise resolving to the user information.\n */\n getUserInfo: async (\n accessToken: string\n ): Promise<IApiResponse<IUserInfo>> => {\n return this.request<IApiResponse<IUserInfo>>(\n \"GET\",\n \"/api/v1/oauth/userinfo\",\n {\n headers: { Authorization: `Bearer ${accessToken}` },\n }\n );\n },\n\n /**\n * Get application information using the access token.\n * @param accessToken - The access token.\n * @returns Promise resolving to the application information.\n */\n getAppInfo: async (\n accessToken: string\n ): Promise<IApiResponse<IAppInfo>> => {\n return this.request<IApiResponse<IAppInfo>>(\n \"GET\",\n \"/api/v1/oauth/appinfo\",\n {\n headers: { Authorization: `Bearer ${accessToken}` },\n }\n );\n },\n\n /**\n * Revoke an access token.\n * @param token - The access token to revoke.\n * @returns Promise resolving when the token is revoked.\n */\n revokeToken: async (token: string): Promise<void> => {\n return this.request<void>(\"POST\", \"/api/v1/oauth/revoke\", { token });\n },\n };\n\n /**\n * Generic method to make authenticated API requests to any endpoint\n *\n * @param method - HTTP method to use (GET, POST, PUT, DELETE)\n * @param endpoint - API endpoint path (will be appended to base URL)\n * @param data - Request payload or query parameters\n * @returns Promise resolving to the typed API response\n * @throws Error with detailed message on request failure\n */\n async request<T>(\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\",\n endpoint: string,\n data: Record<string, unknown> = {},\n customHeaders: Record<string, string> = {}\n ): Promise<T> {\n try {\n const url = `${this.baseUrl}${endpoint}`;\n const headers = this.getHeaders(data);\n\n const response = await axios({\n method,\n url,\n headers: { ...headers, ...customHeaders },\n data: method !== \"GET\" ? data : undefined,\n params: method === \"GET\" ? data : undefined,\n });\n\n // Check if the response indicates an error despite a successful HTTP status\n if (\n response.data &&\n typeof response.data === \"object\" &&\n \"success\" in response.data\n ) {\n if ((response.data as { success?: boolean }).success === false) {\n // Extract error from the API's own error indication\n const errorMessage = this.extractErrorMessage(response.data);\n throw new Error(`API Request Failed: ${errorMessage}`);\n }\n }\n\n return response.data as T;\n } catch (error) {\n if (axios.isAxiosError(error)) {\n const axiosError = error as AxiosError;\n logger.error(axiosError?.response);\n\n // Extract error message from response data if available\n const errorMessage = axiosError.response?.data\n ? this.extractErrorMessage(axiosError.response.data)\n : axiosError.message;\n\n throw new Error(`API Request Failed: ${errorMessage}`);\n }\n\n // Rethrow original error if not an Axios error\n throw error;\n }\n }\n\n /**\n * Extracts error message from various response data structures\n *\n * @param data - The response data object which may contain error information\n * @returns The most specific error message available\n */\n private extractErrorMessage(data: unknown): string {\n // If data is a string, return it directly\n if (typeof data === \"string\") {\n return data;\n }\n\n // If data is not an object or is null, return a generic message\n if (typeof data !== \"object\" || data === null) {\n return \"Unknown error\";\n }\n\n // Handle different error structures\n const dataObj = data as Record<string, unknown>;\n\n // Direct error message in data.message\n if (\"message\" in dataObj && typeof dataObj.message === \"string\") {\n return dataObj.message;\n }\n\n // Error object with message property\n if (\"error\" in dataObj) {\n const error = dataObj.error;\n\n // String error\n if (typeof error === \"string\") {\n return error;\n }\n\n // Object error with message\n if (error && typeof error === \"object\") {\n const errorObj = error as Record<string, unknown>;\n\n if (\"message\" in errorObj && typeof errorObj.message === \"string\") {\n return errorObj.message;\n }\n\n // Try to get any useful information from the error object\n if (\"code\" in errorObj && typeof errorObj.code === \"string\") {\n return `Error code: ${errorObj.code}`;\n }\n }\n }\n\n // Look for error in the 'data' property\n if (\"data\" in dataObj && dataObj.data && typeof dataObj.data === \"object\") {\n const nestedData = dataObj.data as Record<string, unknown>;\n\n if (\"message\" in nestedData && typeof nestedData.message === \"string\") {\n return nestedData.message;\n }\n\n if (\n \"error\" in nestedData &&\n nestedData.error &&\n typeof nestedData.error === \"object\"\n ) {\n const nestedError = nestedData.error as Record<string, unknown>;\n if (\n \"message\" in nestedError &&\n typeof nestedError.message === \"string\"\n ) {\n return nestedError.message;\n }\n }\n }\n\n // If we have a statusText from the response, use that\n if (\"statusText\" in dataObj && typeof dataObj.statusText === \"string\") {\n return dataObj.statusText;\n }\n\n // Stringify the error if nothing else works\n try {\n return `Error details: ${JSON.stringify(dataObj)}`;\n } catch {\n return \"Unknown error occurred\";\n }\n }\n}\n\nexport * from \"./types\";\nexport * from \"./types/transfer\";\nexport * from \"./types/oauth\";\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["// src/index.ts\n\nimport * as crypto from \"crypto\";\nimport {\n CreateSubAccountData,\n CreateSubAccountResponse,\n} from \"./types/subAccount\";\nimport {\n CurrencyConversionPayload,\n CurrencyConversionResult,\n EnhancedConversionResponse,\n IBankListResponse,\n IBankTransferData,\n IBankTransferResponse,\n ISupportedWalletResponse,\n IVerifyBankData,\n IVerifyBankResponse,\n IVerifyResponse,\n} from \"./types\";\nimport {\n ITransferAssetData,\n ITransferAssetResponse,\n ITransferHistoryParams,\n ITransferHistoryResponse,\n ITransferFeeParams,\n ITransferFeeResponse,\n} from \"./types/transfer\";\nimport { IAppInfo, IOAuthApp, ITokenData, IUserInfo } from \"./types/oauth\";\nimport { logger } from \"@untools/logger\";\n\nexport interface IApiResponse<T = unknown> {\n success: boolean;\n data: T;\n message: string;\n meta?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\n/**\n * Configuration interface for initializing the Pay100 SDK\n * @property publicKey - API public key required for all API calls\n * @property secretKey - Secret key used for server-side authentication and request signing\n * @property baseUrl - Optional API base URL, defaults to production endpoint\n */\ninterface IPay100Config {\n publicKey: string;\n secretKey?: string;\n baseUrl?: string;\n}\n\n/**\n * Interface representing transaction data returned from payment verification\n * Flexible structure to accommodate various transaction types and properties\n */\nexport interface ITransactionData {\n [key: string]: unknown;\n}\n\n// Default API endpoint if not otherwise specified\nconst BASE_URL = process.env.BASE_URL || \"https://api.100pay.co\";\n\n/**\n * Custom error class for payment verification failures\n * Provides consistent error structure for better error handling\n */\nexport class PaymentVerificationError extends Error {\n status: string;\n data: Record<string, never>;\n\n constructor(message: string) {\n super(message);\n this.name = \"PaymentVerificationError\";\n this.status = \"error\";\n this.data = {};\n }\n}\n\n/**\n * Main SDK class for interacting with the 100Pay payment platform\n * Provides methods for transaction verification, subaccount management,\n * currency conversion, and asset transfers\n */\nexport class Pay100 {\n private publicKey: string;\n private secretKey?: string;\n private baseUrl: string;\n\n /**\n * Initialize the Pay100 SDK\n * @param config - Configuration object containing API keys and optional base URL\n */\n constructor({ publicKey, secretKey, baseUrl = BASE_URL }: IPay100Config) {\n this.publicKey = publicKey;\n this.secretKey = secretKey;\n this.baseUrl = baseUrl;\n }\n\n /**\n * Creates a cryptographic signature for secure server-to-server communication\n *\n * @param payload - Request payload that needs to be signed\n * @returns Object containing current timestamp and HMAC SHA-256 signature\n * @throws Error if secret key is missing or invalid\n */\n private createSignature(payload: Record<string, unknown>): {\n timestamp: string;\n signature: string;\n } {\n const timestamp = Date.now().toString();\n\n // Extract the token part from the secret key if it's in the format\n // STATUS;TYPE;TOKEN (e.g., \"LIVE;SK;eyJhbGciOiJIUzI1...\")\n let signingSecret = this?.secretKey;\n\n if (this?.secretKey?.includes(\";\")) {\n const secretKeyParts = this.secretKey.split(\";\");\n if (secretKeyParts.length === 3) {\n // Use just the token part as the signing secret\n signingSecret = secretKeyParts[2];\n }\n }\n\n if (!signingSecret) {\n throw new Error(\"Secret key is required for signing\");\n }\n\n // Create signature using HMAC SHA-256\n const signature = crypto\n .createHmac(\"sha256\", signingSecret)\n .update(timestamp + JSON.stringify(payload))\n .digest(\"hex\");\n\n return { timestamp, signature };\n }\n\n /**\n * Constructs HTTP headers for API requests with optional authentication\n *\n * @param payload - Request payload used to generate security signature\n * @returns Object containing all necessary HTTP headers\n */\n private getHeaders(\n payload: Record<string, unknown> = {}\n ): Record<string, string> {\n // Generate authentication headers if secret key is available (server-side mode)\n if (this.secretKey) {\n const { timestamp, signature } = this.createSignature(payload);\n return {\n \"api-key\": this.publicKey,\n \"x-secret-key\": this.secretKey,\n \"x-timestamp\": timestamp,\n \"x-signature\": signature,\n \"Content-Type\": \"application/json\",\n };\n }\n\n // Basic headers for public API usage (client-side mode)\n return {\n \"api-key\": this.publicKey,\n \"Content-Type\": \"application/json\",\n };\n }\n\n /**\n * Verifies the status and details of a payment transaction\n *\n * @param transactionId - Unique identifier of the transaction to verify\n * @returns Promise resolving to verification result with transaction data\n * @throws PaymentVerificationError on network issues or invalid responses\n */\n verify = async (transactionId: string): Promise<IVerifyResponse> => {\n try {\n const payload = { transactionId };\n\n const response = await fetch(\n `${this.baseUrl}/api/v1/pay/crypto/payment/${transactionId}`,\n {\n method: \"POST\",\n headers: this.getHeaders(payload),\n body: JSON.stringify(payload),\n }\n );\n\n // Parse response data\n const responseData: unknown = await response.json().catch(() => null);\n\n // Handle empty response\n if (!responseData) {\n return {\n status: \"error\",\n data: null,\n message:\n \"Something went wrong, be sure you supplied a valid payment id.\",\n };\n }\n\n // Handle string responses which indicate errors\n if (typeof responseData === \"string\") {\n if (responseData === \"Access Denied, Invalid KEY supplied\") {\n return {\n status: \"error\",\n data: null,\n message: \"Access Denied, Invalid KEY supplied\",\n };\n }\n\n if (responseData === \"invalid payment id supplied\") {\n return {\n status: \"error\",\n data: null,\n };\n }\n }\n\n // Ensure the response data is an object that can be safely cast to ITransactionData\n const transactionData: IVerifyResponse[\"data\"] =\n responseData && typeof responseData === \"object\"\n ? (responseData as unknown as IVerifyResponse[\"data\"])\n : null;\n\n // Return successful response with properly typed data\n return {\n status: \"success\",\n data: transactionData,\n };\n } catch (error) {\n // Handle errors with appropriate message\n throw new PaymentVerificationError(\n error instanceof Error ? error.message : \"An unknown error occurred\"\n );\n }\n };\n\n /**\n * Namespace for subaccount management operations\n * Provides methods to create and manage subaccounts\n */\n subaccounts = {\n /**\n * Creates a new subaccount within the platform\n *\n * @param data - Subaccount configuration including owner details and supported currencies\n * @returns Promise resolving to the created subaccount details\n * @throws Error if the request fails or returns invalid data\n */\n create: async (\n data: CreateSubAccountData\n ): Promise<CreateSubAccountResponse> => {\n // Make sure the networks are lowercase\n data.networks = data.networks.map((network) => network.toLowerCase());\n return this.request<CreateSubAccountResponse>(\n \"POST\",\n \"/api/v1/assets/subaccount/create\",\n data\n );\n },\n };\n\n /**\n * Namespace for currency conversion operations\n * Provides methods to calculate exchange rates and fees\n */\n conversion = {\n /**\n * Calculates a preview of currency conversion with rates and fees\n *\n * @param data - Conversion details including amount, source and target currencies\n * @returns Promise resolving to detailed conversion calculation\n * @throws Error if the request fails or returns invalid data\n */\n preview: async (\n data: CurrencyConversionPayload\n ): Promise<CurrencyConversionResult | EnhancedConversionResponse> => {\n return this.request<\n CurrencyConversionResult | EnhancedConversionResponse\n >(\"POST\", \"/api/v1/user/preview-convert-asset\", {\n ...data,\n ...(data.fromSymbol && {\n from_symbol: data.fromSymbol,\n }),\n ...(data.toSymbol && {\n to_symbol: data.toSymbol,\n }),\n });\n },\n };\n\n /**\n * Namespace for asset transfer operations\n * Provides methods to transfer assets, view history, and calculate fees\n */\n transfer = {\n /**\n * Transfer assets between wallets\n *\n * @param data - Transfer details including amount, currency, destination, and authentication\n * @returns Promise resolving to transfer confirmation with receipt and transaction ID\n * @throws Error if the transfer fails due to validation, insufficient funds, or other issues\n */\n executeTransfer: async (\n data: ITransferAssetData\n ): Promise<ITransferAssetResponse> => {\n const { oauthAccessToken, ...transferData } = data;\n return this.request<ITransferAssetResponse>(\n \"POST\",\n \"/api/v1/transfer/asset\",\n transferData,\n oauthAccessToken ? { Authorization: `Bearer ${oauthAccessToken}` } : {}\n );\n },\n\n /**\n * Get transfer history for the authenticated user\n *\n * @param params - Filtering and pagination parameters\n * @returns Promise resolving to paginated transfer history records\n * @throws Error if the request fails or authentication is invalid\n */\n getHistory: async (\n params: ITransferHistoryParams\n ): Promise<ITransferHistoryResponse> => {\n return this.request<ITransferHistoryResponse>(\n \"GET\",\n \"/api/v1/transfer/history\",\n params\n );\n },\n\n /**\n * Calculate transfer fees for a potential transaction\n *\n * @param params - Fee calculation parameters including currency and transfer type\n * @returns Promise resolving to detailed fee breakdown\n * @throws Error if the fee calculation fails or currency is not supported\n */\n calculateFee: async (\n params: ITransferFeeParams\n ): Promise<ITransferFeeResponse> => {\n return this.request<ITransferFeeResponse>(\n \"GET\",\n \"/api/v1/transfer/fee\",\n params\n );\n },\n };\n\n /**\n * Namespace for wallet operations\n * Provides methods to retrieve supported wallets\n */\n wallet = {\n /**\n * Get a list of supported wallets and their details\n *\n * @returns Promise resolving to an array of supported wallet configurations\n * @throws Error if the request fails or authentication is invalid\n */\n getSupportedWallets: async (): Promise<ISupportedWalletResponse> => {\n return this.request<ISupportedWalletResponse>(\n \"GET\",\n \"/api/v1/wallet/supported\"\n );\n },\n };\n\n /**\n * Namespace for bank transfer operations\n * Provides methods to transfer to external bank accounts\n */\n bankTransfer = {\n /**\n * Get Bank List\n * @returns Promise resolving to an array of supported banks\n * @throws Error if the request fails or authentication is invalid\n */\n getBankList: async (): Promise<IBankListResponse> => {\n return this.request<IBankListResponse>(\n \"GET\",\n \"/api/v1/bank-transfers/banks\"\n );\n },\n\n /**\n * Verify Bank\n * @param data - Bank details\n * @returns Promise resolving to bank details\n * @throws Error if the request fails or authentication is invalid\n */\n verifyBank: async (data: IVerifyBankData): Promise<IVerifyBankResponse> => {\n return this.request<IVerifyBankResponse>(\n \"POST\",\n \"/api/v1/bank-transfers/verify-account\",\n data\n );\n },\n\n /**\n * Perform a bank transfer\n * @param data - Bank transfer details\n * @returns Promise resolving to bank transfer details\n * @throws Error if the request fails or authentication is invalid\n */\n transfer: async (\n data: IBankTransferData\n ): Promise<IBankTransferResponse> => {\n return this.request<IBankTransferResponse>(\n \"POST\",\n \"/api/v1/bank-transfers\",\n data\n );\n },\n };\n\n /**\n * Namespace for OAuth 2.0 operations\n */\n oauth = {\n /**\n * Register a new OAuth application.\n * @param data - Application details.\n * @returns Promise resolving to the registered OAuth application details.\n */\n registerApp: async (data: {\n appName: string;\n appDescription: string;\n appLogo: string;\n redirectUris: string[];\n allowedScopes: string[];\n }): Promise<IOAuthApp> => {\n return this.request<IOAuthApp>(\"POST\", \"/api/v1/oauth/register\", data);\n },\n\n /**\n * Get the authorization URL to redirect the user to.\n * @param params - Authorization parameters.\n * @returns Promise resolving to the authorization URL.\n */\n getAuthorizationUrl: async (params: {\n client_id: string;\n redirect_uri: string;\n scope?: string;\n state?: string;\n }): Promise<string> => {\n const response = await this.request<{\n data: { authorizationUrl: string };\n }>(\"GET\", \"/api/v1/oauth/authorize\", params);\n return response.data.authorizationUrl;\n },\n\n /**\n * Exchange authorization code for an access token.\n * @param data - Code exchange details.\n * @returns Promise resolving to the token data.\n */\n exchangeCodeForToken: async (data: {\n grant_type: \"authorization_code\";\n code: string;\n client_id: string;\n client_secret: string;\n redirect_uri: string;\n }): Promise<IApiResponse<ITokenData>> => {\n return this.request<IApiResponse<ITokenData>>(\n \"POST\",\n \"/api/v1/oauth/token\",\n data\n );\n },\n\n /**\n * Get user information using the access token.\n * @param accessToken - The access token.\n * @returns Promise resolving to the user information.\n */\n getUserInfo: async (\n accessToken: string\n ): Promise<IApiResponse<IUserInfo>> => {\n return this.request<IApiResponse<IUserInfo>>(\n \"GET\",\n \"/api/v1/oauth/userinfo\",\n {},\n { Authorization: `Bearer ${accessToken}` }\n );\n },\n\n /**\n * Get application information using the access token.\n * @param accessToken - The access token.\n * @returns Promise resolving to the application information.\n */\n getAppInfo: async (\n accessToken: string\n ): Promise<IApiResponse<IAppInfo>> => {\n return this.request<IApiResponse<IAppInfo>>(\n \"GET\",\n \"/api/v1/oauth/appinfo\",\n {},\n { Authorization: `Bearer ${accessToken}` }\n );\n },\n\n /**\n * Revoke an access token.\n * @param token - The access token to revoke.\n * @returns Promise resolving when the token is revoked.\n */\n revokeToken: async (token: string): Promise<void> => {\n return this.request<void>(\"POST\", \"/api/v1/oauth/revoke\", { token });\n },\n };\n\n /**\n * Generic method to make authenticated API requests to any endpoint\n *\n * @param method - HTTP method to use (GET, POST, PUT, DELETE)\n * @param endpoint - API endpoint path (will be appended to base URL)\n * @param data - Request payload or query parameters\n * @returns Promise resolving to the typed API response\n * @throws Error with detailed message on request failure\n */\n async request<T>(\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\",\n endpoint: string,\n data: Record<string, unknown> = {},\n customHeaders: Record<string, string> = {}\n ): Promise<T> {\n try {\n // Build URL with query parameters for GET requests\n const url =\n method === \"GET\" && Object.keys(data).length > 0\n ? `${this.baseUrl}${endpoint}?${new URLSearchParams(\n data as Record<string, string>\n )}`\n : `${this.baseUrl}${endpoint}`;\n\n const headers = this.getHeaders(data);\n const options = {\n method,\n headers: { ...headers, ...customHeaders },\n body: method !== \"GET\" ? JSON.stringify(data) : undefined,\n };\n logger?.debug(`Request to ${url}`, { options });\n const response = await fetch(url, options);\n\n // Handle response.ok check and throw errors for failed requests\n if (!response.ok) {\n const errorData: unknown = await response.json().catch(() => ({}));\n logger.error(errorData);\n const errorMessage = this.extractErrorMessage(errorData);\n throw new Error(`API Request Failed: ${errorMessage}`);\n }\n\n // Parse JSON response\n const responseData: unknown = await response.json();\n\n // Check if the response indicates an error despite a successful HTTP status\n if (\n responseData &&\n typeof responseData === \"object\" &&\n \"success\" in responseData\n ) {\n if ((responseData as { success?: boolean }).success === false) {\n // Extract error from the API's own error indication\n const errorMessage = this.extractErrorMessage(responseData);\n throw new Error(`API Request Failed: ${errorMessage}`);\n }\n }\n\n return responseData as T;\n } catch (error) {\n if (error instanceof Error) {\n throw error;\n }\n\n // Handle unexpected error types\n throw new Error(`API Request Failed: ${String(error)}`);\n }\n }\n\n /**\n * Extracts error message from various response data structures\n *\n * @param data - The response data object which may contain error information\n * @returns The most specific error message available\n */\n private extractErrorMessage(data: unknown): string {\n // If data is a string, return it directly\n if (typeof data === \"string\") {\n return data;\n }\n\n // If data is not an object or is null, return a generic message\n if (typeof data !== \"object\" || data === null) {\n return \"Unknown error\";\n }\n\n // Handle different error structures\n const dataObj = data as Record<string, unknown>;\n\n // Direct error message in data.message\n if (\"message\" in dataObj && typeof dataObj.message === \"string\") {\n return dataObj.message;\n }\n\n // Error object with message property\n if (\"error\" in dataObj) {\n const error = dataObj.error;\n\n // String error\n if (typeof error === \"string\") {\n return error;\n }\n\n // Object error with message\n if (error && typeof error === \"object\") {\n const errorObj = error as Record<string, unknown>;\n\n if (\"message\" in errorObj && typeof errorObj.message === \"string\") {\n return errorObj.message;\n }\n\n // Try to get any useful information from the error object\n if (\"code\" in errorObj && typeof errorObj.code === \"string\") {\n return `Error code: ${errorObj.code}`;\n }\n }\n }\n\n // Look for error in the 'data' property\n if (\"data\" in dataObj && dataObj.data && typeof dataObj.data === \"object\") {\n const nestedData = dataObj.data as Record<string, unknown>;\n\n if (\"message\" in nestedData && typeof nestedData.message === \"string\") {\n return nestedData.message;\n }\n\n if (\n \"error\" in nestedData &&\n nestedData.error &&\n typeof nestedData.error === \"object\"\n ) {\n const nestedError = nestedData.error as Record<string, unknown>;\n if (\n \"message\" in nestedError &&\n typeof nestedError.message === \"string\"\n ) {\n return nestedError.message;\n }\n }\n }\n\n // If we have a statusText from the response, use that\n if (\"statusText\" in dataObj && typeof dataObj.statusText === \"string\") {\n return dataObj.statusText;\n }\n\n // Stringify the error if nothing else works\n try {\n return `Error details: ${JSON.stringify(dataObj)}`;\n } catch {\n return \"Unknown error occurred\";\n }\n }\n}\n\nexport * from \"./types\";\nexport * from \"./types/transfer\";\nexport * from \"./types/oauth\";\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@100pay-hq/100pay.js",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.0",
|
|
4
4
|
"description": "100Pay.js is the official Nodejs API wrapper SDK that lets you easily verify crypto payments, run bulk payout, transfer assets and many more.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -29,14 +29,15 @@
|
|
|
29
29
|
"dev": "nodemon",
|
|
30
30
|
"build": "tsup",
|
|
31
31
|
"build:clean": "rm -rf dist && tsup",
|
|
32
|
-
"test": "jest",
|
|
33
|
-
"test:watch": "jest --watch",
|
|
34
|
-
"test:coverage": "jest --coverage",
|
|
35
32
|
"type-check": "tsc --noEmit",
|
|
36
33
|
"lint": "eslint . --ext .ts",
|
|
37
34
|
"lint:fix": "eslint . --ext .ts --fix",
|
|
38
|
-
"verify": "npm run lint && npm run
|
|
39
|
-
"prepare": "npm run
|
|
35
|
+
"verify": "npm run lint && npm run build",
|
|
36
|
+
"prepare": "npm run build",
|
|
37
|
+
"release": "standard-version",
|
|
38
|
+
"release:minor": "standard-version --release-as minor",
|
|
39
|
+
"release:major": "standard-version --release-as major",
|
|
40
|
+
"release:patch": "standard-version --release-as patch"
|
|
40
41
|
},
|
|
41
42
|
"repository": {
|
|
42
43
|
"type": "git",
|
|
@@ -59,20 +60,17 @@
|
|
|
59
60
|
"homepage": "https://github.com/shop100global/100pay.js#readme",
|
|
60
61
|
"devDependencies": {
|
|
61
62
|
"@eslint/js": "^9.23.0",
|
|
62
|
-
"@types/jest": "^29.5.14",
|
|
63
63
|
"@types/node": "^22.13.14",
|
|
64
64
|
"@typescript-eslint/eslint-plugin": "^8.28.0",
|
|
65
65
|
"@typescript-eslint/parser": "^8.28.0",
|
|
66
66
|
"eslint": "^9.23.0",
|
|
67
67
|
"globals": "^16.0.0",
|
|
68
|
-
"jest": "^29.7.0",
|
|
69
68
|
"nodemon": "^3.1.10",
|
|
70
|
-
"
|
|
69
|
+
"standard-version": "^9.5.0",
|
|
71
70
|
"tsup": "^8.4.0",
|
|
72
71
|
"typescript": "^5.8.2"
|
|
73
72
|
},
|
|
74
73
|
"dependencies": {
|
|
75
|
-
"@untools/logger": "^0.0.6"
|
|
76
|
-
"axios": "^1.8.4"
|
|
74
|
+
"@untools/logger": "^0.0.6"
|
|
77
75
|
}
|
|
78
76
|
}
|