@xrplrequest/sdk 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -0
- package/dist/index.mjs.map +1 -1
- package/package.json +9 -11
package/dist/index.js
CHANGED
|
@@ -20,6 +20,7 @@ var PayloadsClient = class {
|
|
|
20
20
|
}
|
|
21
21
|
get headers() {
|
|
22
22
|
return {
|
|
23
|
+
"X-Api-Key": this.apiKey,
|
|
23
24
|
Authorization: `Bearer ${this.apiKey}`,
|
|
24
25
|
"Content-Type": "application/json"
|
|
25
26
|
};
|
|
@@ -113,6 +114,7 @@ var WebhooksClient = class {
|
|
|
113
114
|
}
|
|
114
115
|
get headers() {
|
|
115
116
|
return {
|
|
117
|
+
"X-Api-Key": this.apiKey,
|
|
116
118
|
Authorization: `Bearer ${this.apiKey}`,
|
|
117
119
|
"Content-Type": "application/json"
|
|
118
120
|
};
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api-error.ts","../src/payloads.ts","../src/utils.ts","../src/webhooks.ts","../src/index.ts"],"names":["createHmac"],"mappings":"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","file":"index.js","sourcesContent":["export function apiErrorMessage(body: unknown, fallback: string): string {\n if (\n typeof body === \"object\" &&\n body !== null &&\n \"error\" in body &&\n typeof (body as { error: unknown }).error === \"string\"\n ) {\n return (body as { error: string }).error;\n }\n return fallback;\n}\n","import { apiErrorMessage } from \"./api-error\";\nimport type { CreatePayloadOptions, Payload, PollOptions } from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://xrplre.quest\";\nconst DEFAULT_POLL_INTERVAL = 2000;\nconst DEFAULT_POLL_TIMEOUT = 300_000;\n\nexport class PayloadsClient {\n constructor(\n private readonly apiKey: string,\n private readonly baseUrl: string\n ) {}\n\n private get headers() {\n return {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n };\n }\n\n async create(options: CreatePayloadOptions): Promise<Payload> {\n const res = await fetch(`${this.baseUrl}/api/v1/payloads`, {\n method: \"POST\",\n headers: this.headers,\n body: JSON.stringify(options),\n });\n\n if (!res.ok) {\n const body = await res.json().catch(() => null);\n throw new XRPLRequestError(apiErrorMessage(body, \"Failed to create payload\"), res.status);\n }\n\n const data = await res.json();\n return data as Payload;\n }\n\n async get(uuid: string): Promise<Payload> {\n const res = await fetch(`${this.baseUrl}/api/v1/payloads/${uuid}`, {\n headers: this.headers,\n });\n\n if (!res.ok) {\n const body = await res.json().catch(() => null);\n throw new XRPLRequestError(apiErrorMessage(body, \"Failed to get payload\"), res.status);\n }\n\n return res.json() as Promise<Payload>;\n }\n\n async cancel(uuid: string): Promise<Payload> {\n const res = await fetch(`${this.baseUrl}/api/v1/payloads/${uuid}`, {\n method: \"DELETE\",\n headers: this.headers,\n });\n\n if (!res.ok) {\n const body = await res.json().catch(() => null);\n throw new XRPLRequestError(apiErrorMessage(body, \"Failed to cancel payload\"), res.status);\n }\n\n return res.json() as Promise<Payload>;\n }\n\n async list(options?: { limit?: number; offset?: number }): Promise<{ payloads: Payload[] }> {\n const url = new URL(`${this.baseUrl}/api/v1/payloads`);\n if (options?.limit) url.searchParams.set(\"limit\", String(options.limit));\n if (options?.offset) url.searchParams.set(\"offset\", String(options.offset));\n\n const res = await fetch(url.toString(), { headers: this.headers });\n if (!res.ok) {\n const body = await res.json().catch(() => null);\n throw new XRPLRequestError(apiErrorMessage(body, \"Failed to list payloads\"), res.status);\n }\n\n return res.json() as Promise<{ payloads: Payload[] }>;\n }\n\n async poll(uuid: string, options?: PollOptions): Promise<Payload> {\n const timeout = options?.timeout ?? DEFAULT_POLL_TIMEOUT;\n const interval = options?.interval ?? DEFAULT_POLL_INTERVAL;\n const deadline = Date.now() + timeout;\n\n while (Date.now() < deadline) {\n const payload = await this.get(uuid);\n\n if (options?.onUpdate) options.onUpdate(payload);\n\n if (payload.status !== \"pending\") return payload;\n\n const remaining = deadline - Date.now();\n if (remaining <= 0) break;\n\n await sleep(Math.min(interval, remaining));\n }\n\n // Final check\n return this.get(uuid);\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport class XRPLRequestError extends Error {\n constructor(message: string, public readonly statusCode: number) {\n super(message);\n this.name = \"XRPLRequestError\";\n }\n}\n","import { createHmac } from \"crypto\";\n\n/**\n * Verify an incoming webhook signature from XRPL Request.\n * Use this in your webhook endpoint to confirm the request is authentic.\n *\n * @param secret - The webhook secret shown when the webhook was created\n * @param rawBody - The raw request body string (before JSON.parse)\n * @param signature - The value of the X-XRPL-Request-Signature header\n */\nexport function verifyWebhookSignature(\n secret: string,\n rawBody: string,\n signature: string,\n): boolean {\n if (typeof signature !== \"string\" || !signature.startsWith(\"sha256=\")) return false;\n const expected = `sha256=${createHmac(\"sha256\", secret).update(rawBody).digest(\"hex\")}`;\n if (expected.length !== signature.length) return false;\n // Constant-time comparison\n let diff = 0;\n for (let i = 0; i < expected.length; i++) {\n diff |= expected.charCodeAt(i) ^ signature.charCodeAt(i);\n }\n return diff === 0;\n}\n","import { apiErrorMessage } from \"./api-error\";\nimport type { CreateWebhookOptions, Webhook } from \"./types\";\nimport { XRPLRequestError } from \"./payloads\";\nimport { verifyWebhookSignature } from \"./utils\";\n\nexport class WebhooksClient {\n constructor(\n private readonly apiKey: string,\n private readonly baseUrl: string,\n ) {}\n\n private get headers() {\n return {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n };\n }\n\n async create(options: CreateWebhookOptions): Promise<Webhook & { secret: string }> {\n const res = await fetch(`${this.baseUrl}/api/v1/webhooks`, {\n method: \"POST\",\n headers: this.headers,\n body: JSON.stringify(options),\n });\n if (!res.ok) {\n const body = await res.json().catch(() => null);\n throw new XRPLRequestError(apiErrorMessage(body, \"Failed to create webhook\"), res.status);\n }\n return res.json() as Promise<Webhook & { secret: string }>;\n }\n\n async list(): Promise<{ webhooks: Webhook[] }> {\n const res = await fetch(`${this.baseUrl}/api/v1/webhooks`, { headers: this.headers });\n if (!res.ok) {\n const body = await res.json().catch(() => null);\n throw new XRPLRequestError(apiErrorMessage(body, \"Failed to list webhooks\"), res.status);\n }\n return res.json() as Promise<{ webhooks: Webhook[] }>;\n }\n\n async delete(id: string): Promise<{ id: string; deleted: boolean }> {\n const res = await fetch(`${this.baseUrl}/api/v1/webhooks/${id}`, {\n method: \"DELETE\",\n headers: this.headers,\n });\n if (!res.ok) {\n const body = await res.json().catch(() => null);\n throw new XRPLRequestError(apiErrorMessage(body, \"Failed to delete webhook\"), res.status);\n }\n return res.json() as Promise<{ id: string; deleted: boolean }>;\n }\n\n /** Verify an incoming webhook signature. Convenience alias for `verifyWebhookSignature`. */\n static verify = verifyWebhookSignature;\n}\n","import { PayloadsClient, XRPLRequestError } from \"./payloads\";\nimport { WebhooksClient } from \"./webhooks\";\nimport type { XRPLRequestConfig } from \"./types\";\n\nexport * from \"./types\";\nexport { XRPLRequestError } from \"./payloads\";\nexport { WebhooksClient } from \"./webhooks\";\nexport { verifyWebhookSignature } from \"./utils\";\n\nconst DEFAULT_BASE_URL = \"https://xrplre.quest\";\n\nexport class XRPLRequest {\n public readonly payloads: PayloadsClient;\n public readonly webhooks: WebhooksClient;\n\n constructor(config: XRPLRequestConfig) {\n if (!config.apiKey) throw new Error(\"apiKey is required\");\n const baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\");\n this.payloads = new PayloadsClient(config.apiKey, baseUrl);\n this.webhooks = new WebhooksClient(config.apiKey, baseUrl);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/api-error.ts","../src/payloads.ts","../src/utils.ts","../src/webhooks.ts","../src/index.ts"],"names":["createHmac"],"mappings":"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","file":"index.js","sourcesContent":["export function apiErrorMessage(body: unknown, fallback: string): string {\n if (\n typeof body === \"object\" &&\n body !== null &&\n \"error\" in body &&\n typeof (body as { error: unknown }).error === \"string\"\n ) {\n return (body as { error: string }).error;\n }\n return fallback;\n}\n","import { apiErrorMessage } from \"./api-error\";\nimport type { CreatePayloadOptions, Payload, PollOptions } from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://xrplre.quest\";\nconst DEFAULT_POLL_INTERVAL = 2000;\nconst DEFAULT_POLL_TIMEOUT = 300_000;\n\nexport class PayloadsClient {\n constructor(\n private readonly apiKey: string,\n private readonly baseUrl: string\n ) {}\n\n private get headers() {\n return {\n \"X-Api-Key\": this.apiKey,\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n };\n }\n\n async create(options: CreatePayloadOptions): Promise<Payload> {\n const res = await fetch(`${this.baseUrl}/api/v1/payloads`, {\n method: \"POST\",\n headers: this.headers,\n body: JSON.stringify(options),\n });\n\n if (!res.ok) {\n const body = await res.json().catch(() => null);\n throw new XRPLRequestError(apiErrorMessage(body, \"Failed to create payload\"), res.status);\n }\n\n const data = await res.json();\n return data as Payload;\n }\n\n async get(uuid: string): Promise<Payload> {\n const res = await fetch(`${this.baseUrl}/api/v1/payloads/${uuid}`, {\n headers: this.headers,\n });\n\n if (!res.ok) {\n const body = await res.json().catch(() => null);\n throw new XRPLRequestError(apiErrorMessage(body, \"Failed to get payload\"), res.status);\n }\n\n return res.json() as Promise<Payload>;\n }\n\n async cancel(uuid: string): Promise<Payload> {\n const res = await fetch(`${this.baseUrl}/api/v1/payloads/${uuid}`, {\n method: \"DELETE\",\n headers: this.headers,\n });\n\n if (!res.ok) {\n const body = await res.json().catch(() => null);\n throw new XRPLRequestError(apiErrorMessage(body, \"Failed to cancel payload\"), res.status);\n }\n\n return res.json() as Promise<Payload>;\n }\n\n async list(options?: { limit?: number; offset?: number }): Promise<{ payloads: Payload[] }> {\n const url = new URL(`${this.baseUrl}/api/v1/payloads`);\n if (options?.limit) url.searchParams.set(\"limit\", String(options.limit));\n if (options?.offset) url.searchParams.set(\"offset\", String(options.offset));\n\n const res = await fetch(url.toString(), { headers: this.headers });\n if (!res.ok) {\n const body = await res.json().catch(() => null);\n throw new XRPLRequestError(apiErrorMessage(body, \"Failed to list payloads\"), res.status);\n }\n\n return res.json() as Promise<{ payloads: Payload[] }>;\n }\n\n async poll(uuid: string, options?: PollOptions): Promise<Payload> {\n const timeout = options?.timeout ?? DEFAULT_POLL_TIMEOUT;\n const interval = options?.interval ?? DEFAULT_POLL_INTERVAL;\n const deadline = Date.now() + timeout;\n\n while (Date.now() < deadline) {\n const payload = await this.get(uuid);\n\n if (options?.onUpdate) options.onUpdate(payload);\n\n if (payload.status !== \"pending\") return payload;\n\n const remaining = deadline - Date.now();\n if (remaining <= 0) break;\n\n await sleep(Math.min(interval, remaining));\n }\n\n // Final check\n return this.get(uuid);\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport class XRPLRequestError extends Error {\n constructor(message: string, public readonly statusCode: number) {\n super(message);\n this.name = \"XRPLRequestError\";\n }\n}\n","import { createHmac } from \"crypto\";\n\n/**\n * Verify an incoming webhook signature from XRPL Request.\n * Use this in your webhook endpoint to confirm the request is authentic.\n *\n * @param secret - The webhook secret shown when the webhook was created\n * @param rawBody - The raw request body string (before JSON.parse)\n * @param signature - The value of the X-XRPL-Request-Signature header\n */\nexport function verifyWebhookSignature(\n secret: string,\n rawBody: string,\n signature: string,\n): boolean {\n if (typeof signature !== \"string\" || !signature.startsWith(\"sha256=\")) return false;\n const expected = `sha256=${createHmac(\"sha256\", secret).update(rawBody).digest(\"hex\")}`;\n if (expected.length !== signature.length) return false;\n // Constant-time comparison\n let diff = 0;\n for (let i = 0; i < expected.length; i++) {\n diff |= expected.charCodeAt(i) ^ signature.charCodeAt(i);\n }\n return diff === 0;\n}\n","import { apiErrorMessage } from \"./api-error\";\nimport type { CreateWebhookOptions, Webhook } from \"./types\";\nimport { XRPLRequestError } from \"./payloads\";\nimport { verifyWebhookSignature } from \"./utils\";\n\nexport class WebhooksClient {\n constructor(\n private readonly apiKey: string,\n private readonly baseUrl: string,\n ) {}\n\n private get headers() {\n return {\n \"X-Api-Key\": this.apiKey,\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n };\n }\n\n async create(options: CreateWebhookOptions): Promise<Webhook & { secret: string }> {\n const res = await fetch(`${this.baseUrl}/api/v1/webhooks`, {\n method: \"POST\",\n headers: this.headers,\n body: JSON.stringify(options),\n });\n if (!res.ok) {\n const body = await res.json().catch(() => null);\n throw new XRPLRequestError(apiErrorMessage(body, \"Failed to create webhook\"), res.status);\n }\n return res.json() as Promise<Webhook & { secret: string }>;\n }\n\n async list(): Promise<{ webhooks: Webhook[] }> {\n const res = await fetch(`${this.baseUrl}/api/v1/webhooks`, { headers: this.headers });\n if (!res.ok) {\n const body = await res.json().catch(() => null);\n throw new XRPLRequestError(apiErrorMessage(body, \"Failed to list webhooks\"), res.status);\n }\n return res.json() as Promise<{ webhooks: Webhook[] }>;\n }\n\n async delete(id: string): Promise<{ id: string; deleted: boolean }> {\n const res = await fetch(`${this.baseUrl}/api/v1/webhooks/${id}`, {\n method: \"DELETE\",\n headers: this.headers,\n });\n if (!res.ok) {\n const body = await res.json().catch(() => null);\n throw new XRPLRequestError(apiErrorMessage(body, \"Failed to delete webhook\"), res.status);\n }\n return res.json() as Promise<{ id: string; deleted: boolean }>;\n }\n\n /** Verify an incoming webhook signature. Convenience alias for `verifyWebhookSignature`. */\n static verify = verifyWebhookSignature;\n}\n","import { PayloadsClient, XRPLRequestError } from \"./payloads\";\nimport { WebhooksClient } from \"./webhooks\";\nimport type { XRPLRequestConfig } from \"./types\";\n\nexport * from \"./types\";\nexport { XRPLRequestError } from \"./payloads\";\nexport { WebhooksClient } from \"./webhooks\";\nexport { verifyWebhookSignature } from \"./utils\";\n\nconst DEFAULT_BASE_URL = \"https://xrplre.quest\";\n\nexport class XRPLRequest {\n public readonly payloads: PayloadsClient;\n public readonly webhooks: WebhooksClient;\n\n constructor(config: XRPLRequestConfig) {\n if (!config.apiKey) throw new Error(\"apiKey is required\");\n const baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\");\n this.payloads = new PayloadsClient(config.apiKey, baseUrl);\n this.webhooks = new WebhooksClient(config.apiKey, baseUrl);\n }\n}\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -18,6 +18,7 @@ var PayloadsClient = class {
|
|
|
18
18
|
}
|
|
19
19
|
get headers() {
|
|
20
20
|
return {
|
|
21
|
+
"X-Api-Key": this.apiKey,
|
|
21
22
|
Authorization: `Bearer ${this.apiKey}`,
|
|
22
23
|
"Content-Type": "application/json"
|
|
23
24
|
};
|
|
@@ -111,6 +112,7 @@ var WebhooksClient = class {
|
|
|
111
112
|
}
|
|
112
113
|
get headers() {
|
|
113
114
|
return {
|
|
115
|
+
"X-Api-Key": this.apiKey,
|
|
114
116
|
Authorization: `Bearer ${this.apiKey}`,
|
|
115
117
|
"Content-Type": "application/json"
|
|
116
118
|
};
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api-error.ts","../src/payloads.ts","../src/utils.ts","../src/webhooks.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["export function apiErrorMessage(body: unknown, fallback: string): string {\n if (\n typeof body === \"object\" &&\n body !== null &&\n \"error\" in body &&\n typeof (body as { error: unknown }).error === \"string\"\n ) {\n return (body as { error: string }).error;\n }\n return fallback;\n}\n","import { apiErrorMessage } from \"./api-error\";\nimport type { CreatePayloadOptions, Payload, PollOptions } from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://xrplre.quest\";\nconst DEFAULT_POLL_INTERVAL = 2000;\nconst DEFAULT_POLL_TIMEOUT = 300_000;\n\nexport class PayloadsClient {\n constructor(\n private readonly apiKey: string,\n private readonly baseUrl: string\n ) {}\n\n private get headers() {\n return {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n };\n }\n\n async create(options: CreatePayloadOptions): Promise<Payload> {\n const res = await fetch(`${this.baseUrl}/api/v1/payloads`, {\n method: \"POST\",\n headers: this.headers,\n body: JSON.stringify(options),\n });\n\n if (!res.ok) {\n const body = await res.json().catch(() => null);\n throw new XRPLRequestError(apiErrorMessage(body, \"Failed to create payload\"), res.status);\n }\n\n const data = await res.json();\n return data as Payload;\n }\n\n async get(uuid: string): Promise<Payload> {\n const res = await fetch(`${this.baseUrl}/api/v1/payloads/${uuid}`, {\n headers: this.headers,\n });\n\n if (!res.ok) {\n const body = await res.json().catch(() => null);\n throw new XRPLRequestError(apiErrorMessage(body, \"Failed to get payload\"), res.status);\n }\n\n return res.json() as Promise<Payload>;\n }\n\n async cancel(uuid: string): Promise<Payload> {\n const res = await fetch(`${this.baseUrl}/api/v1/payloads/${uuid}`, {\n method: \"DELETE\",\n headers: this.headers,\n });\n\n if (!res.ok) {\n const body = await res.json().catch(() => null);\n throw new XRPLRequestError(apiErrorMessage(body, \"Failed to cancel payload\"), res.status);\n }\n\n return res.json() as Promise<Payload>;\n }\n\n async list(options?: { limit?: number; offset?: number }): Promise<{ payloads: Payload[] }> {\n const url = new URL(`${this.baseUrl}/api/v1/payloads`);\n if (options?.limit) url.searchParams.set(\"limit\", String(options.limit));\n if (options?.offset) url.searchParams.set(\"offset\", String(options.offset));\n\n const res = await fetch(url.toString(), { headers: this.headers });\n if (!res.ok) {\n const body = await res.json().catch(() => null);\n throw new XRPLRequestError(apiErrorMessage(body, \"Failed to list payloads\"), res.status);\n }\n\n return res.json() as Promise<{ payloads: Payload[] }>;\n }\n\n async poll(uuid: string, options?: PollOptions): Promise<Payload> {\n const timeout = options?.timeout ?? DEFAULT_POLL_TIMEOUT;\n const interval = options?.interval ?? DEFAULT_POLL_INTERVAL;\n const deadline = Date.now() + timeout;\n\n while (Date.now() < deadline) {\n const payload = await this.get(uuid);\n\n if (options?.onUpdate) options.onUpdate(payload);\n\n if (payload.status !== \"pending\") return payload;\n\n const remaining = deadline - Date.now();\n if (remaining <= 0) break;\n\n await sleep(Math.min(interval, remaining));\n }\n\n // Final check\n return this.get(uuid);\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport class XRPLRequestError extends Error {\n constructor(message: string, public readonly statusCode: number) {\n super(message);\n this.name = \"XRPLRequestError\";\n }\n}\n","import { createHmac } from \"crypto\";\n\n/**\n * Verify an incoming webhook signature from XRPL Request.\n * Use this in your webhook endpoint to confirm the request is authentic.\n *\n * @param secret - The webhook secret shown when the webhook was created\n * @param rawBody - The raw request body string (before JSON.parse)\n * @param signature - The value of the X-XRPL-Request-Signature header\n */\nexport function verifyWebhookSignature(\n secret: string,\n rawBody: string,\n signature: string,\n): boolean {\n if (typeof signature !== \"string\" || !signature.startsWith(\"sha256=\")) return false;\n const expected = `sha256=${createHmac(\"sha256\", secret).update(rawBody).digest(\"hex\")}`;\n if (expected.length !== signature.length) return false;\n // Constant-time comparison\n let diff = 0;\n for (let i = 0; i < expected.length; i++) {\n diff |= expected.charCodeAt(i) ^ signature.charCodeAt(i);\n }\n return diff === 0;\n}\n","import { apiErrorMessage } from \"./api-error\";\nimport type { CreateWebhookOptions, Webhook } from \"./types\";\nimport { XRPLRequestError } from \"./payloads\";\nimport { verifyWebhookSignature } from \"./utils\";\n\nexport class WebhooksClient {\n constructor(\n private readonly apiKey: string,\n private readonly baseUrl: string,\n ) {}\n\n private get headers() {\n return {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n };\n }\n\n async create(options: CreateWebhookOptions): Promise<Webhook & { secret: string }> {\n const res = await fetch(`${this.baseUrl}/api/v1/webhooks`, {\n method: \"POST\",\n headers: this.headers,\n body: JSON.stringify(options),\n });\n if (!res.ok) {\n const body = await res.json().catch(() => null);\n throw new XRPLRequestError(apiErrorMessage(body, \"Failed to create webhook\"), res.status);\n }\n return res.json() as Promise<Webhook & { secret: string }>;\n }\n\n async list(): Promise<{ webhooks: Webhook[] }> {\n const res = await fetch(`${this.baseUrl}/api/v1/webhooks`, { headers: this.headers });\n if (!res.ok) {\n const body = await res.json().catch(() => null);\n throw new XRPLRequestError(apiErrorMessage(body, \"Failed to list webhooks\"), res.status);\n }\n return res.json() as Promise<{ webhooks: Webhook[] }>;\n }\n\n async delete(id: string): Promise<{ id: string; deleted: boolean }> {\n const res = await fetch(`${this.baseUrl}/api/v1/webhooks/${id}`, {\n method: \"DELETE\",\n headers: this.headers,\n });\n if (!res.ok) {\n const body = await res.json().catch(() => null);\n throw new XRPLRequestError(apiErrorMessage(body, \"Failed to delete webhook\"), res.status);\n }\n return res.json() as Promise<{ id: string; deleted: boolean }>;\n }\n\n /** Verify an incoming webhook signature. Convenience alias for `verifyWebhookSignature`. */\n static verify = verifyWebhookSignature;\n}\n","import { PayloadsClient, XRPLRequestError } from \"./payloads\";\nimport { WebhooksClient } from \"./webhooks\";\nimport type { XRPLRequestConfig } from \"./types\";\n\nexport * from \"./types\";\nexport { XRPLRequestError } from \"./payloads\";\nexport { WebhooksClient } from \"./webhooks\";\nexport { verifyWebhookSignature } from \"./utils\";\n\nconst DEFAULT_BASE_URL = \"https://xrplre.quest\";\n\nexport class XRPLRequest {\n public readonly payloads: PayloadsClient;\n public readonly webhooks: WebhooksClient;\n\n constructor(config: XRPLRequestConfig) {\n if (!config.apiKey) throw new Error(\"apiKey is required\");\n const baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\");\n this.payloads = new PayloadsClient(config.apiKey, baseUrl);\n this.webhooks = new WebhooksClient(config.apiKey, baseUrl);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/api-error.ts","../src/payloads.ts","../src/utils.ts","../src/webhooks.ts","../src/index.ts"],"names":[],"mappings":";;;AAAO,SAAS,eAAA,CAAgB,MAAe,QAAA,EAA0B;AACvE,EAAA,IACE,OAAO,IAAA,KAAS,QAAA,IAChB,IAAA,KAAS,IAAA,IACT,WAAW,IAAA,IACX,OAAQ,IAAA,CAA4B,KAAA,KAAU,QAAA,EAC9C;AACA,IAAA,OAAQ,IAAA,CAA2B,KAAA;AAAA,EACrC;AACA,EAAA,OAAO,QAAA;AACT;;;ACNA,IAAM,qBAAA,GAAwB,GAAA;AAC9B,IAAM,oBAAA,GAAuB,GAAA;AAEtB,IAAM,iBAAN,MAAqB;AAAA,EAC1B,WAAA,CACmB,QACA,OAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAChB;AAAA,EAEH,IAAY,OAAA,GAAU;AACpB,IAAA,OAAO;AAAA,MACL,aAAa,IAAA,CAAK,MAAA;AAAA,MAClB,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,CAAA,CAAA;AAAA,MACpC,cAAA,EAAgB;AAAA,KAClB;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,OAAA,EAAiD;AAC5D,IAAA,MAAM,MAAM,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,gBAAA,CAAA,EAAoB;AAAA,MACzD,MAAA,EAAQ,MAAA;AAAA,MACR,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA,KAC7B,CAAA;AAED,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,OAAO,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAC9C,MAAA,MAAM,IAAI,gBAAA,CAAiB,eAAA,CAAgB,MAAM,0BAA0B,CAAA,EAAG,IAAI,MAAM,CAAA;AAAA,IAC1F;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,IAAI,IAAA,EAAgC;AACxC,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,EAAG,KAAK,OAAO,CAAA,iBAAA,EAAoB,IAAI,CAAA,CAAA,EAAI;AAAA,MACjE,SAAS,IAAA,CAAK;AAAA,KACf,CAAA;AAED,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,OAAO,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAC9C,MAAA,MAAM,IAAI,gBAAA,CAAiB,eAAA,CAAgB,MAAM,uBAAuB,CAAA,EAAG,IAAI,MAAM,CAAA;AAAA,IACvF;AAEA,IAAA,OAAO,IAAI,IAAA,EAAK;AAAA,EAClB;AAAA,EAEA,MAAM,OAAO,IAAA,EAAgC;AAC3C,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,EAAG,KAAK,OAAO,CAAA,iBAAA,EAAoB,IAAI,CAAA,CAAA,EAAI;AAAA,MACjE,MAAA,EAAQ,QAAA;AAAA,MACR,SAAS,IAAA,CAAK;AAAA,KACf,CAAA;AAED,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,OAAO,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAC9C,MAAA,MAAM,IAAI,gBAAA,CAAiB,eAAA,CAAgB,MAAM,0BAA0B,CAAA,EAAG,IAAI,MAAM,CAAA;AAAA,IAC1F;AAEA,IAAA,OAAO,IAAI,IAAA,EAAK;AAAA,EAClB;AAAA,EAEA,MAAM,KAAK,OAAA,EAAiF;AAC1F,IAAA,MAAM,MAAM,IAAI,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,gBAAA,CAAkB,CAAA;AACrD,IAAA,IAAI,OAAA,EAAS,OAAO,GAAA,CAAI,YAAA,CAAa,IAAI,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAC,CAAA;AACvE,IAAA,IAAI,OAAA,EAAS,QAAQ,GAAA,CAAI,YAAA,CAAa,IAAI,QAAA,EAAU,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAC,CAAA;AAE1E,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,CAAI,QAAA,IAAY,EAAE,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,CAAA;AACjE,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,OAAO,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAC9C,MAAA,MAAM,IAAI,gBAAA,CAAiB,eAAA,CAAgB,MAAM,yBAAyB,CAAA,EAAG,IAAI,MAAM,CAAA;AAAA,IACzF;AAEA,IAAA,OAAO,IAAI,IAAA,EAAK;AAAA,EAClB;AAAA,EAEA,MAAM,IAAA,CAAK,IAAA,EAAc,OAAA,EAAyC;AAChE,IAAA,MAAM,OAAA,GAAU,SAAS,OAAA,IAAW,oBAAA;AACpC,IAAA,MAAM,QAAA,GAAW,SAAS,QAAA,IAAY,qBAAA;AACtC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,OAAA;AAE9B,IAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,QAAA,EAAU;AAC5B,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA;AAEnC,MAAA,IAAI,OAAA,EAAS,QAAA,EAAU,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA;AAE/C,MAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,SAAA,EAAW,OAAO,OAAA;AAEzC,MAAA,MAAM,SAAA,GAAY,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI;AACtC,MAAA,IAAI,aAAa,CAAA,EAAG;AAEpB,MAAA,MAAM,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,SAAS,CAAC,CAAA;AAAA,IAC3C;AAGA,IAAA,OAAO,IAAA,CAAK,IAAI,IAAI,CAAA;AAAA,EACtB;AACF,CAAA;AAEA,SAAS,MAAM,EAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACzD;AAEO,IAAM,gBAAA,GAAN,cAA+B,KAAA,CAAM;AAAA,EAC1C,WAAA,CAAY,SAAiC,UAAA,EAAoB;AAC/D,IAAA,KAAA,CAAM,OAAO,CAAA;AAD8B,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAE3C,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AAAA,EACd;AACF;ACpGO,SAAS,sBAAA,CACd,MAAA,EACA,OAAA,EACA,SAAA,EACS;AACT,EAAA,IAAI,OAAO,cAAc,QAAA,IAAY,CAAC,UAAU,UAAA,CAAW,SAAS,GAAG,OAAO,KAAA;AAC9E,EAAA,MAAM,QAAA,GAAW,CAAA,OAAA,EAAU,UAAA,CAAW,QAAA,EAAU,MAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AACrF,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,SAAA,CAAU,MAAA,EAAQ,OAAO,KAAA;AAEjD,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,IAAA,IAAA,IAAQ,SAAS,UAAA,CAAW,CAAC,CAAA,GAAI,SAAA,CAAU,WAAW,CAAC,CAAA;AAAA,EACzD;AACA,EAAA,OAAO,IAAA,KAAS,CAAA;AAClB;;;ACnBO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,WAAA,CACmB,QACA,OAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAChB;AAAA,EAEH,IAAY,OAAA,GAAU;AACpB,IAAA,OAAO;AAAA,MACL,aAAa,IAAA,CAAK,MAAA;AAAA,MAClB,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,CAAA,CAAA;AAAA,MACpC,cAAA,EAAgB;AAAA,KAClB;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,OAAA,EAAsE;AACjF,IAAA,MAAM,MAAM,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,gBAAA,CAAA,EAAoB;AAAA,MACzD,MAAA,EAAQ,MAAA;AAAA,MACR,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA,KAC7B,CAAA;AACD,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,OAAO,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAC9C,MAAA,MAAM,IAAI,gBAAA,CAAiB,eAAA,CAAgB,MAAM,0BAA0B,CAAA,EAAG,IAAI,MAAM,CAAA;AAAA,IAC1F;AACA,IAAA,OAAO,IAAI,IAAA,EAAK;AAAA,EAClB;AAAA,EAEA,MAAM,IAAA,GAAyC;AAC7C,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,gBAAA,CAAA,EAAoB,EAAE,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,CAAA;AACpF,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,OAAO,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAC9C,MAAA,MAAM,IAAI,gBAAA,CAAiB,eAAA,CAAgB,MAAM,yBAAyB,CAAA,EAAG,IAAI,MAAM,CAAA;AAAA,IACzF;AACA,IAAA,OAAO,IAAI,IAAA,EAAK;AAAA,EAClB;AAAA,EAEA,MAAM,OAAO,EAAA,EAAuD;AAClE,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,EAAG,KAAK,OAAO,CAAA,iBAAA,EAAoB,EAAE,CAAA,CAAA,EAAI;AAAA,MAC/D,MAAA,EAAQ,QAAA;AAAA,MACR,SAAS,IAAA,CAAK;AAAA,KACf,CAAA;AACD,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,OAAO,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAC9C,MAAA,MAAM,IAAI,gBAAA,CAAiB,eAAA,CAAgB,MAAM,0BAA0B,CAAA,EAAG,IAAI,MAAM,CAAA;AAAA,IAC1F;AACA,IAAA,OAAO,IAAI,IAAA,EAAK;AAAA,EAClB;AAIF;AAAA;AAlDa,cAAA,CAiDJ,MAAA,GAAS,sBAAA;;;AC7ClB,IAAM,gBAAA,GAAmB,sBAAA;AAElB,IAAM,cAAN,MAAkB;AAAA,EAIvB,YAAY,MAAA,EAA2B;AACrC,IAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAQ,MAAM,IAAI,MAAM,oBAAoB,CAAA;AACxD,IAAA,MAAM,WAAW,MAAA,CAAO,OAAA,IAAW,gBAAA,EAAkB,OAAA,CAAQ,OAAO,EAAE,CAAA;AACtE,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,cAAA,CAAe,MAAA,CAAO,QAAQ,OAAO,CAAA;AACzD,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,cAAA,CAAe,MAAA,CAAO,QAAQ,OAAO,CAAA;AAAA,EAC3D;AACF","file":"index.mjs","sourcesContent":["export function apiErrorMessage(body: unknown, fallback: string): string {\n if (\n typeof body === \"object\" &&\n body !== null &&\n \"error\" in body &&\n typeof (body as { error: unknown }).error === \"string\"\n ) {\n return (body as { error: string }).error;\n }\n return fallback;\n}\n","import { apiErrorMessage } from \"./api-error\";\nimport type { CreatePayloadOptions, Payload, PollOptions } from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://xrplre.quest\";\nconst DEFAULT_POLL_INTERVAL = 2000;\nconst DEFAULT_POLL_TIMEOUT = 300_000;\n\nexport class PayloadsClient {\n constructor(\n private readonly apiKey: string,\n private readonly baseUrl: string\n ) {}\n\n private get headers() {\n return {\n \"X-Api-Key\": this.apiKey,\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n };\n }\n\n async create(options: CreatePayloadOptions): Promise<Payload> {\n const res = await fetch(`${this.baseUrl}/api/v1/payloads`, {\n method: \"POST\",\n headers: this.headers,\n body: JSON.stringify(options),\n });\n\n if (!res.ok) {\n const body = await res.json().catch(() => null);\n throw new XRPLRequestError(apiErrorMessage(body, \"Failed to create payload\"), res.status);\n }\n\n const data = await res.json();\n return data as Payload;\n }\n\n async get(uuid: string): Promise<Payload> {\n const res = await fetch(`${this.baseUrl}/api/v1/payloads/${uuid}`, {\n headers: this.headers,\n });\n\n if (!res.ok) {\n const body = await res.json().catch(() => null);\n throw new XRPLRequestError(apiErrorMessage(body, \"Failed to get payload\"), res.status);\n }\n\n return res.json() as Promise<Payload>;\n }\n\n async cancel(uuid: string): Promise<Payload> {\n const res = await fetch(`${this.baseUrl}/api/v1/payloads/${uuid}`, {\n method: \"DELETE\",\n headers: this.headers,\n });\n\n if (!res.ok) {\n const body = await res.json().catch(() => null);\n throw new XRPLRequestError(apiErrorMessage(body, \"Failed to cancel payload\"), res.status);\n }\n\n return res.json() as Promise<Payload>;\n }\n\n async list(options?: { limit?: number; offset?: number }): Promise<{ payloads: Payload[] }> {\n const url = new URL(`${this.baseUrl}/api/v1/payloads`);\n if (options?.limit) url.searchParams.set(\"limit\", String(options.limit));\n if (options?.offset) url.searchParams.set(\"offset\", String(options.offset));\n\n const res = await fetch(url.toString(), { headers: this.headers });\n if (!res.ok) {\n const body = await res.json().catch(() => null);\n throw new XRPLRequestError(apiErrorMessage(body, \"Failed to list payloads\"), res.status);\n }\n\n return res.json() as Promise<{ payloads: Payload[] }>;\n }\n\n async poll(uuid: string, options?: PollOptions): Promise<Payload> {\n const timeout = options?.timeout ?? DEFAULT_POLL_TIMEOUT;\n const interval = options?.interval ?? DEFAULT_POLL_INTERVAL;\n const deadline = Date.now() + timeout;\n\n while (Date.now() < deadline) {\n const payload = await this.get(uuid);\n\n if (options?.onUpdate) options.onUpdate(payload);\n\n if (payload.status !== \"pending\") return payload;\n\n const remaining = deadline - Date.now();\n if (remaining <= 0) break;\n\n await sleep(Math.min(interval, remaining));\n }\n\n // Final check\n return this.get(uuid);\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport class XRPLRequestError extends Error {\n constructor(message: string, public readonly statusCode: number) {\n super(message);\n this.name = \"XRPLRequestError\";\n }\n}\n","import { createHmac } from \"crypto\";\n\n/**\n * Verify an incoming webhook signature from XRPL Request.\n * Use this in your webhook endpoint to confirm the request is authentic.\n *\n * @param secret - The webhook secret shown when the webhook was created\n * @param rawBody - The raw request body string (before JSON.parse)\n * @param signature - The value of the X-XRPL-Request-Signature header\n */\nexport function verifyWebhookSignature(\n secret: string,\n rawBody: string,\n signature: string,\n): boolean {\n if (typeof signature !== \"string\" || !signature.startsWith(\"sha256=\")) return false;\n const expected = `sha256=${createHmac(\"sha256\", secret).update(rawBody).digest(\"hex\")}`;\n if (expected.length !== signature.length) return false;\n // Constant-time comparison\n let diff = 0;\n for (let i = 0; i < expected.length; i++) {\n diff |= expected.charCodeAt(i) ^ signature.charCodeAt(i);\n }\n return diff === 0;\n}\n","import { apiErrorMessage } from \"./api-error\";\nimport type { CreateWebhookOptions, Webhook } from \"./types\";\nimport { XRPLRequestError } from \"./payloads\";\nimport { verifyWebhookSignature } from \"./utils\";\n\nexport class WebhooksClient {\n constructor(\n private readonly apiKey: string,\n private readonly baseUrl: string,\n ) {}\n\n private get headers() {\n return {\n \"X-Api-Key\": this.apiKey,\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n };\n }\n\n async create(options: CreateWebhookOptions): Promise<Webhook & { secret: string }> {\n const res = await fetch(`${this.baseUrl}/api/v1/webhooks`, {\n method: \"POST\",\n headers: this.headers,\n body: JSON.stringify(options),\n });\n if (!res.ok) {\n const body = await res.json().catch(() => null);\n throw new XRPLRequestError(apiErrorMessage(body, \"Failed to create webhook\"), res.status);\n }\n return res.json() as Promise<Webhook & { secret: string }>;\n }\n\n async list(): Promise<{ webhooks: Webhook[] }> {\n const res = await fetch(`${this.baseUrl}/api/v1/webhooks`, { headers: this.headers });\n if (!res.ok) {\n const body = await res.json().catch(() => null);\n throw new XRPLRequestError(apiErrorMessage(body, \"Failed to list webhooks\"), res.status);\n }\n return res.json() as Promise<{ webhooks: Webhook[] }>;\n }\n\n async delete(id: string): Promise<{ id: string; deleted: boolean }> {\n const res = await fetch(`${this.baseUrl}/api/v1/webhooks/${id}`, {\n method: \"DELETE\",\n headers: this.headers,\n });\n if (!res.ok) {\n const body = await res.json().catch(() => null);\n throw new XRPLRequestError(apiErrorMessage(body, \"Failed to delete webhook\"), res.status);\n }\n return res.json() as Promise<{ id: string; deleted: boolean }>;\n }\n\n /** Verify an incoming webhook signature. Convenience alias for `verifyWebhookSignature`. */\n static verify = verifyWebhookSignature;\n}\n","import { PayloadsClient, XRPLRequestError } from \"./payloads\";\nimport { WebhooksClient } from \"./webhooks\";\nimport type { XRPLRequestConfig } from \"./types\";\n\nexport * from \"./types\";\nexport { XRPLRequestError } from \"./payloads\";\nexport { WebhooksClient } from \"./webhooks\";\nexport { verifyWebhookSignature } from \"./utils\";\n\nconst DEFAULT_BASE_URL = \"https://xrplre.quest\";\n\nexport class XRPLRequest {\n public readonly payloads: PayloadsClient;\n public readonly webhooks: WebhooksClient;\n\n constructor(config: XRPLRequestConfig) {\n if (!config.apiKey) throw new Error(\"apiKey is required\");\n const baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\");\n this.payloads = new PayloadsClient(config.apiKey, baseUrl);\n this.webhooks = new WebhooksClient(config.apiKey, baseUrl);\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xrplrequest/sdk",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "TypeScript SDK for XRPL Request — wallet-agnostic XRPL transaction signing",
|
|
5
5
|
"author": "LedgerCraft <hello@xrplre.quest>",
|
|
6
6
|
"license": "MIT",
|
|
@@ -23,11 +23,14 @@
|
|
|
23
23
|
"require": "./dist/index.js"
|
|
24
24
|
}
|
|
25
25
|
},
|
|
26
|
-
"files": [
|
|
27
|
-
"dist",
|
|
28
|
-
"README.md"
|
|
29
|
-
],
|
|
26
|
+
"files": ["dist", "README.md"],
|
|
30
27
|
"sideEffects": false,
|
|
28
|
+
"scripts": {
|
|
29
|
+
"build": "tsup src/index.ts --format cjs,esm --dts --clean",
|
|
30
|
+
"dev": "tsup src/index.ts --format cjs,esm --dts --watch",
|
|
31
|
+
"type-check": "tsc --noEmit",
|
|
32
|
+
"prepublishOnly": "pnpm build"
|
|
33
|
+
},
|
|
31
34
|
"keywords": [
|
|
32
35
|
"xrpl",
|
|
33
36
|
"xrp",
|
|
@@ -53,10 +56,5 @@
|
|
|
53
56
|
"@types/node": "^22.15.0",
|
|
54
57
|
"tsup": "^8.4.0",
|
|
55
58
|
"typescript": "^5.8.3"
|
|
56
|
-
},
|
|
57
|
-
"scripts": {
|
|
58
|
-
"build": "tsup src/index.ts --format cjs,esm --dts --clean",
|
|
59
|
-
"dev": "tsup src/index.ts --format cjs,esm --dts --watch",
|
|
60
|
-
"type-check": "tsc --noEmit"
|
|
61
59
|
}
|
|
62
|
-
}
|
|
60
|
+
}
|