hiero-sdk-utils 0.1.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/cjs/client/HieroClient.d.ts +70 -0
- package/dist/cjs/client/HieroClient.d.ts.map +1 -0
- package/dist/cjs/client/HieroClient.js +165 -0
- package/dist/cjs/client/HieroClient.js.map +1 -0
- package/dist/cjs/client/rateLimiter.d.ts +33 -0
- package/dist/cjs/client/rateLimiter.d.ts.map +1 -0
- package/dist/cjs/client/rateLimiter.js +68 -0
- package/dist/cjs/client/rateLimiter.js.map +1 -0
- package/dist/cjs/client/types.d.ts +26 -0
- package/dist/cjs/client/types.d.ts.map +1 -0
- package/dist/cjs/client/types.js +11 -0
- package/dist/cjs/client/types.js.map +1 -0
- package/dist/cjs/errors/index.d.ts +95 -0
- package/dist/cjs/errors/index.d.ts.map +1 -0
- package/dist/cjs/errors/index.js +115 -0
- package/dist/cjs/errors/index.js.map +1 -0
- package/dist/cjs/index.d.ts +36 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +55 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/pagination/paginator.d.ts +21 -0
- package/dist/cjs/pagination/paginator.d.ts.map +1 -0
- package/dist/cjs/pagination/paginator.js +89 -0
- package/dist/cjs/pagination/paginator.js.map +1 -0
- package/dist/cjs/resources/accounts.d.ts +43 -0
- package/dist/cjs/resources/accounts.d.ts.map +1 -0
- package/dist/cjs/resources/accounts.js +60 -0
- package/dist/cjs/resources/accounts.js.map +1 -0
- package/dist/cjs/resources/balances.d.ts +25 -0
- package/dist/cjs/resources/balances.d.ts.map +1 -0
- package/dist/cjs/resources/balances.js +33 -0
- package/dist/cjs/resources/balances.js.map +1 -0
- package/dist/cjs/resources/blocks.d.ts +36 -0
- package/dist/cjs/resources/blocks.d.ts.map +1 -0
- package/dist/cjs/resources/blocks.js +58 -0
- package/dist/cjs/resources/blocks.js.map +1 -0
- package/dist/cjs/resources/contracts.d.ts +36 -0
- package/dist/cjs/resources/contracts.d.ts.map +1 -0
- package/dist/cjs/resources/contracts.js +53 -0
- package/dist/cjs/resources/contracts.js.map +1 -0
- package/dist/cjs/resources/nfts.d.ts +39 -0
- package/dist/cjs/resources/nfts.d.ts.map +1 -0
- package/dist/cjs/resources/nfts.js +62 -0
- package/dist/cjs/resources/nfts.js.map +1 -0
- package/dist/cjs/resources/schedules.d.ts +36 -0
- package/dist/cjs/resources/schedules.d.ts.map +1 -0
- package/dist/cjs/resources/schedules.js +53 -0
- package/dist/cjs/resources/schedules.js.map +1 -0
- package/dist/cjs/resources/tokens.d.ts +36 -0
- package/dist/cjs/resources/tokens.d.ts.map +1 -0
- package/dist/cjs/resources/tokens.js +53 -0
- package/dist/cjs/resources/tokens.js.map +1 -0
- package/dist/cjs/resources/topics.d.ts +38 -0
- package/dist/cjs/resources/topics.d.ts.map +1 -0
- package/dist/cjs/resources/topics.js +56 -0
- package/dist/cjs/resources/topics.js.map +1 -0
- package/dist/cjs/resources/transactions.d.ts +35 -0
- package/dist/cjs/resources/transactions.d.ts.map +1 -0
- package/dist/cjs/resources/transactions.js +57 -0
- package/dist/cjs/resources/transactions.js.map +1 -0
- package/dist/cjs/types/api.d.ts +302 -0
- package/dist/cjs/types/api.d.ts.map +1 -0
- package/dist/cjs/types/api.js +4 -0
- package/dist/cjs/types/api.js.map +1 -0
- package/dist/cjs/types/common.d.ts +52 -0
- package/dist/cjs/types/common.d.ts.map +1 -0
- package/dist/cjs/types/common.js +16 -0
- package/dist/cjs/types/common.js.map +1 -0
- package/dist/esm/client/HieroClient.d.ts +70 -0
- package/dist/esm/client/HieroClient.d.ts.map +1 -0
- package/dist/esm/client/HieroClient.js +161 -0
- package/dist/esm/client/HieroClient.js.map +1 -0
- package/dist/esm/client/rateLimiter.d.ts +33 -0
- package/dist/esm/client/rateLimiter.d.ts.map +1 -0
- package/dist/esm/client/rateLimiter.js +64 -0
- package/dist/esm/client/rateLimiter.js.map +1 -0
- package/dist/esm/client/types.d.ts +26 -0
- package/dist/esm/client/types.d.ts.map +1 -0
- package/dist/esm/client/types.js +8 -0
- package/dist/esm/client/types.js.map +1 -0
- package/dist/esm/errors/index.d.ts +95 -0
- package/dist/esm/errors/index.d.ts.map +1 -0
- package/dist/esm/errors/index.js +108 -0
- package/dist/esm/errors/index.js.map +1 -0
- package/dist/esm/index.d.ts +36 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +37 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/pagination/paginator.d.ts +21 -0
- package/dist/esm/pagination/paginator.d.ts.map +1 -0
- package/dist/esm/pagination/paginator.js +86 -0
- package/dist/esm/pagination/paginator.js.map +1 -0
- package/dist/esm/resources/accounts.d.ts +43 -0
- package/dist/esm/resources/accounts.d.ts.map +1 -0
- package/dist/esm/resources/accounts.js +56 -0
- package/dist/esm/resources/accounts.js.map +1 -0
- package/dist/esm/resources/balances.d.ts +25 -0
- package/dist/esm/resources/balances.d.ts.map +1 -0
- package/dist/esm/resources/balances.js +29 -0
- package/dist/esm/resources/balances.js.map +1 -0
- package/dist/esm/resources/blocks.d.ts +36 -0
- package/dist/esm/resources/blocks.d.ts.map +1 -0
- package/dist/esm/resources/blocks.js +54 -0
- package/dist/esm/resources/blocks.js.map +1 -0
- package/dist/esm/resources/contracts.d.ts +36 -0
- package/dist/esm/resources/contracts.d.ts.map +1 -0
- package/dist/esm/resources/contracts.js +49 -0
- package/dist/esm/resources/contracts.js.map +1 -0
- package/dist/esm/resources/nfts.d.ts +39 -0
- package/dist/esm/resources/nfts.d.ts.map +1 -0
- package/dist/esm/resources/nfts.js +58 -0
- package/dist/esm/resources/nfts.js.map +1 -0
- package/dist/esm/resources/schedules.d.ts +36 -0
- package/dist/esm/resources/schedules.d.ts.map +1 -0
- package/dist/esm/resources/schedules.js +49 -0
- package/dist/esm/resources/schedules.js.map +1 -0
- package/dist/esm/resources/tokens.d.ts +36 -0
- package/dist/esm/resources/tokens.d.ts.map +1 -0
- package/dist/esm/resources/tokens.js +49 -0
- package/dist/esm/resources/tokens.js.map +1 -0
- package/dist/esm/resources/topics.d.ts +38 -0
- package/dist/esm/resources/topics.d.ts.map +1 -0
- package/dist/esm/resources/topics.js +52 -0
- package/dist/esm/resources/topics.js.map +1 -0
- package/dist/esm/resources/transactions.d.ts +35 -0
- package/dist/esm/resources/transactions.d.ts.map +1 -0
- package/dist/esm/resources/transactions.js +53 -0
- package/dist/esm/resources/transactions.js.map +1 -0
- package/dist/esm/types/api.d.ts +302 -0
- package/dist/esm/types/api.d.ts.map +1 -0
- package/dist/esm/types/api.js +3 -0
- package/dist/esm/types/api.js.map +1 -0
- package/dist/esm/types/common.d.ts +52 -0
- package/dist/esm/types/common.d.ts.map +1 -0
- package/dist/esm/types/common.js +13 -0
- package/dist/esm/types/common.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { HieroClientConfig } from './types.js';
|
|
2
|
+
import { AccountsResource } from '../resources/accounts.js';
|
|
3
|
+
import { TransactionsResource } from '../resources/transactions.js';
|
|
4
|
+
import { TokensResource } from '../resources/tokens.js';
|
|
5
|
+
import { TopicsResource } from '../resources/topics.js';
|
|
6
|
+
import { ContractsResource } from '../resources/contracts.js';
|
|
7
|
+
import { NftsResource } from '../resources/nfts.js';
|
|
8
|
+
import { BalancesResource } from '../resources/balances.js';
|
|
9
|
+
import { BlocksResource } from '../resources/blocks.js';
|
|
10
|
+
import { SchedulesResource } from '../resources/schedules.js';
|
|
11
|
+
/**
|
|
12
|
+
* Core HTTP client for the Hedera Mirror Node REST API.
|
|
13
|
+
* Provides typed access to all Mirror Node resources with automatic
|
|
14
|
+
* rate limiting, retries, and error handling.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* import { HieroClient, Networks } from 'hiero-sdk-utils';
|
|
19
|
+
*
|
|
20
|
+
* const client = new HieroClient({ baseUrl: Networks.testnet });
|
|
21
|
+
* const account = await client.accounts.getById('0.0.1234');
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export declare class HieroClient {
|
|
25
|
+
/** Base URL for the Mirror Node (no trailing slash) */
|
|
26
|
+
readonly baseUrl: string;
|
|
27
|
+
private readonly fetchFn;
|
|
28
|
+
private readonly rateLimiter;
|
|
29
|
+
private readonly defaultHeaders;
|
|
30
|
+
private readonly timeoutMs;
|
|
31
|
+
private readonly maxRetries;
|
|
32
|
+
/** Account-related Mirror Node queries */
|
|
33
|
+
readonly accounts: AccountsResource;
|
|
34
|
+
/** Transaction-related Mirror Node queries */
|
|
35
|
+
readonly transactions: TransactionsResource;
|
|
36
|
+
/** Token-related Mirror Node queries */
|
|
37
|
+
readonly tokens: TokensResource;
|
|
38
|
+
/** Topic-related Mirror Node queries */
|
|
39
|
+
readonly topics: TopicsResource;
|
|
40
|
+
/** Contract-related Mirror Node queries */
|
|
41
|
+
readonly contracts: ContractsResource;
|
|
42
|
+
/** NFT-related Mirror Node queries */
|
|
43
|
+
readonly nfts: NftsResource;
|
|
44
|
+
/** Balance-related Mirror Node queries */
|
|
45
|
+
readonly balances: BalancesResource;
|
|
46
|
+
/** Block-related Mirror Node queries */
|
|
47
|
+
readonly blocks: BlocksResource;
|
|
48
|
+
/** Schedule-related Mirror Node queries */
|
|
49
|
+
readonly schedules: SchedulesResource;
|
|
50
|
+
/**
|
|
51
|
+
* Creates a new HieroClient.
|
|
52
|
+
*
|
|
53
|
+
* @param config - Client configuration including base URL and optional overrides
|
|
54
|
+
* @throws {Error} If baseUrl is empty
|
|
55
|
+
*/
|
|
56
|
+
constructor(config: HieroClientConfig);
|
|
57
|
+
/**
|
|
58
|
+
* Makes a GET request to the Mirror Node and returns typed JSON.
|
|
59
|
+
* Handles rate limiting, retries on 429/503, and timeout.
|
|
60
|
+
*
|
|
61
|
+
* @param path - The API path (e.g., '/api/v1/accounts/0.0.2') or full next-page URL
|
|
62
|
+
* @returns Parsed JSON response typed as T
|
|
63
|
+
* @throws {MirrorNodeError} If the API returns a non-2xx response after retries
|
|
64
|
+
*/
|
|
65
|
+
get<T>(path: string): Promise<T>;
|
|
66
|
+
private statusToCode;
|
|
67
|
+
private safeReadBody;
|
|
68
|
+
private sleep;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=HieroClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HieroClient.d.ts","sourceRoot":"","sources":["../../../src/client/HieroClient.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAGpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAY9D;;;;;;;;;;;;GAYG;AACH,qBAAa,WAAW;IACtB,uDAAuD;IACvD,SAAgB,OAAO,EAAE,MAAM,CAAC;IAEhC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;IAClD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAyB;IACxD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IAEpC,0CAA0C;IAC1C,SAAgB,QAAQ,EAAE,gBAAgB,CAAC;IAC3C,8CAA8C;IAC9C,SAAgB,YAAY,EAAE,oBAAoB,CAAC;IACnD,wCAAwC;IACxC,SAAgB,MAAM,EAAE,cAAc,CAAC;IACvC,wCAAwC;IACxC,SAAgB,MAAM,EAAE,cAAc,CAAC;IACvC,2CAA2C;IAC3C,SAAgB,SAAS,EAAE,iBAAiB,CAAC;IAC7C,sCAAsC;IACtC,SAAgB,IAAI,EAAE,YAAY,CAAC;IACnC,0CAA0C;IAC1C,SAAgB,QAAQ,EAAE,gBAAgB,CAAC;IAC3C,wCAAwC;IACxC,SAAgB,MAAM,EAAE,cAAc,CAAC;IACvC,2CAA2C;IAC3C,SAAgB,SAAS,EAAE,iBAAiB,CAAC;IAE7C;;;;;OAKG;gBACS,MAAM,EAAE,iBAAiB;IA4BrC;;;;;;;OAOG;IACG,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAiEtC,OAAO,CAAC,YAAY;YAUN,YAAY;IAS1B,OAAO,CAAC,KAAK;CAKd"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.HieroClient = void 0;
|
|
5
|
+
const rateLimiter_js_1 = require("./rateLimiter.js");
|
|
6
|
+
const index_js_1 = require("../errors/index.js");
|
|
7
|
+
const accounts_js_1 = require("../resources/accounts.js");
|
|
8
|
+
const transactions_js_1 = require("../resources/transactions.js");
|
|
9
|
+
const tokens_js_1 = require("../resources/tokens.js");
|
|
10
|
+
const topics_js_1 = require("../resources/topics.js");
|
|
11
|
+
const contracts_js_1 = require("../resources/contracts.js");
|
|
12
|
+
const nfts_js_1 = require("../resources/nfts.js");
|
|
13
|
+
const balances_js_1 = require("../resources/balances.js");
|
|
14
|
+
const blocks_js_1 = require("../resources/blocks.js");
|
|
15
|
+
const schedules_js_1 = require("../resources/schedules.js");
|
|
16
|
+
/** Retriable HTTP status codes */
|
|
17
|
+
const RETRIABLE_STATUSES = new Set([429, 503]);
|
|
18
|
+
/** Default configuration values */
|
|
19
|
+
const DEFAULTS = {
|
|
20
|
+
maxRequestsPerSecond: 20,
|
|
21
|
+
timeoutMs: 30_000,
|
|
22
|
+
maxRetries: 3,
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Core HTTP client for the Hedera Mirror Node REST API.
|
|
26
|
+
* Provides typed access to all Mirror Node resources with automatic
|
|
27
|
+
* rate limiting, retries, and error handling.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```ts
|
|
31
|
+
* import { HieroClient, Networks } from 'hiero-sdk-utils';
|
|
32
|
+
*
|
|
33
|
+
* const client = new HieroClient({ baseUrl: Networks.testnet });
|
|
34
|
+
* const account = await client.accounts.getById('0.0.1234');
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
class HieroClient {
|
|
38
|
+
/** Base URL for the Mirror Node (no trailing slash) */
|
|
39
|
+
baseUrl;
|
|
40
|
+
fetchFn;
|
|
41
|
+
rateLimiter;
|
|
42
|
+
defaultHeaders;
|
|
43
|
+
timeoutMs;
|
|
44
|
+
maxRetries;
|
|
45
|
+
/** Account-related Mirror Node queries */
|
|
46
|
+
accounts;
|
|
47
|
+
/** Transaction-related Mirror Node queries */
|
|
48
|
+
transactions;
|
|
49
|
+
/** Token-related Mirror Node queries */
|
|
50
|
+
tokens;
|
|
51
|
+
/** Topic-related Mirror Node queries */
|
|
52
|
+
topics;
|
|
53
|
+
/** Contract-related Mirror Node queries */
|
|
54
|
+
contracts;
|
|
55
|
+
/** NFT-related Mirror Node queries */
|
|
56
|
+
nfts;
|
|
57
|
+
/** Balance-related Mirror Node queries */
|
|
58
|
+
balances;
|
|
59
|
+
/** Block-related Mirror Node queries */
|
|
60
|
+
blocks;
|
|
61
|
+
/** Schedule-related Mirror Node queries */
|
|
62
|
+
schedules;
|
|
63
|
+
/**
|
|
64
|
+
* Creates a new HieroClient.
|
|
65
|
+
*
|
|
66
|
+
* @param config - Client configuration including base URL and optional overrides
|
|
67
|
+
* @throws {Error} If baseUrl is empty
|
|
68
|
+
*/
|
|
69
|
+
constructor(config) {
|
|
70
|
+
if (!config.baseUrl) {
|
|
71
|
+
throw new Error('baseUrl is required and must not be empty');
|
|
72
|
+
}
|
|
73
|
+
this.baseUrl = config.baseUrl.replace(/\/+$/, '');
|
|
74
|
+
this.fetchFn = config.fetch ?? globalThis.fetch.bind(globalThis);
|
|
75
|
+
this.rateLimiter = new rateLimiter_js_1.RateLimiter(config.maxRequestsPerSecond ?? DEFAULTS.maxRequestsPerSecond);
|
|
76
|
+
this.defaultHeaders = {
|
|
77
|
+
Accept: 'application/json',
|
|
78
|
+
...config.headers,
|
|
79
|
+
};
|
|
80
|
+
this.timeoutMs = config.timeoutMs ?? DEFAULTS.timeoutMs;
|
|
81
|
+
this.maxRetries = config.maxRetries ?? DEFAULTS.maxRetries;
|
|
82
|
+
this.accounts = new accounts_js_1.AccountsResource(this);
|
|
83
|
+
this.transactions = new transactions_js_1.TransactionsResource(this);
|
|
84
|
+
this.tokens = new tokens_js_1.TokensResource(this);
|
|
85
|
+
this.topics = new topics_js_1.TopicsResource(this);
|
|
86
|
+
this.contracts = new contracts_js_1.ContractsResource(this);
|
|
87
|
+
this.nfts = new nfts_js_1.NftsResource(this);
|
|
88
|
+
this.balances = new balances_js_1.BalancesResource(this);
|
|
89
|
+
this.blocks = new blocks_js_1.BlocksResource(this);
|
|
90
|
+
this.schedules = new schedules_js_1.SchedulesResource(this);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Makes a GET request to the Mirror Node and returns typed JSON.
|
|
94
|
+
* Handles rate limiting, retries on 429/503, and timeout.
|
|
95
|
+
*
|
|
96
|
+
* @param path - The API path (e.g., '/api/v1/accounts/0.0.2') or full next-page URL
|
|
97
|
+
* @returns Parsed JSON response typed as T
|
|
98
|
+
* @throws {MirrorNodeError} If the API returns a non-2xx response after retries
|
|
99
|
+
*/
|
|
100
|
+
async get(path) {
|
|
101
|
+
const url = path.startsWith('http') ? path : `${this.baseUrl}${path}`;
|
|
102
|
+
for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
|
|
103
|
+
await this.rateLimiter.acquire();
|
|
104
|
+
const controller = new AbortController();
|
|
105
|
+
const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);
|
|
106
|
+
try {
|
|
107
|
+
const response = await this.fetchFn(url, {
|
|
108
|
+
method: 'GET',
|
|
109
|
+
headers: this.defaultHeaders,
|
|
110
|
+
signal: controller.signal,
|
|
111
|
+
});
|
|
112
|
+
clearTimeout(timeoutId);
|
|
113
|
+
if (response.ok) {
|
|
114
|
+
const json = await response.json();
|
|
115
|
+
return json;
|
|
116
|
+
}
|
|
117
|
+
if (RETRIABLE_STATUSES.has(response.status) && attempt < this.maxRetries) {
|
|
118
|
+
const retryAfter = response.headers.get('Retry-After');
|
|
119
|
+
const waitMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : 1000 * (attempt + 1);
|
|
120
|
+
await this.sleep(waitMs);
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
const errorBody = await this.safeReadBody(response);
|
|
124
|
+
throw new index_js_1.MirrorNodeError(`Mirror Node returned ${response.status} for ${url}: ${errorBody}`, this.statusToCode(response.status), response.status);
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
clearTimeout(timeoutId);
|
|
128
|
+
if (error instanceof index_js_1.MirrorNodeError) {
|
|
129
|
+
throw error;
|
|
130
|
+
}
|
|
131
|
+
if (error instanceof DOMException && error.name === 'AbortError') {
|
|
132
|
+
throw new index_js_1.MirrorNodeError(`Request timed out after ${this.timeoutMs}ms for ${url}`, 'REQUEST_TIMEOUT', 0, { cause: error });
|
|
133
|
+
}
|
|
134
|
+
throw new index_js_1.MirrorNodeError(`Network error for ${url}: ${error instanceof Error ? error.message : String(error)}`, 'NETWORK_ERROR', 0, { cause: error instanceof Error ? error : new Error(String(error)) });
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/* v8 ignore next -- unreachable: loop always exits via return or throw */
|
|
138
|
+
throw new index_js_1.MirrorNodeError(`Request failed for ${url}`, 'MAX_RETRIES_EXCEEDED', 0);
|
|
139
|
+
}
|
|
140
|
+
statusToCode(status) {
|
|
141
|
+
switch (status) {
|
|
142
|
+
case 400: return 'BAD_REQUEST';
|
|
143
|
+
case 404: return 'NOT_FOUND';
|
|
144
|
+
case 429: return 'RATE_LIMITED';
|
|
145
|
+
case 503: return 'SERVICE_UNAVAILABLE';
|
|
146
|
+
default: return 'MIRROR_NODE_ERROR';
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
async safeReadBody(response) {
|
|
150
|
+
try {
|
|
151
|
+
const text = await response.text();
|
|
152
|
+
return text.substring(0, 500);
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
return '(unable to read response body)';
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
sleep(ms) {
|
|
159
|
+
return new Promise((resolve) => {
|
|
160
|
+
setTimeout(resolve, ms);
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
exports.HieroClient = HieroClient;
|
|
165
|
+
//# sourceMappingURL=HieroClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HieroClient.js","sourceRoot":"","sources":["../../../src/client/HieroClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A simple token-bucket rate limiter that throttles requests
|
|
3
|
+
* to stay within a specified requests-per-second limit.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```ts
|
|
7
|
+
* const limiter = new RateLimiter(10); // 10 req/s
|
|
8
|
+
* await limiter.acquire(); // waits if needed
|
|
9
|
+
* ```
|
|
10
|
+
*/
|
|
11
|
+
export declare class RateLimiter {
|
|
12
|
+
private tokens;
|
|
13
|
+
private lastRefill;
|
|
14
|
+
private readonly maxTokens;
|
|
15
|
+
private readonly refillRateMs;
|
|
16
|
+
/**
|
|
17
|
+
* Creates a new rate limiter.
|
|
18
|
+
*
|
|
19
|
+
* @param maxRequestsPerSecond - Maximum number of requests allowed per second
|
|
20
|
+
* @throws {Error} If maxRequestsPerSecond is not a positive number
|
|
21
|
+
*/
|
|
22
|
+
constructor(maxRequestsPerSecond: number);
|
|
23
|
+
/**
|
|
24
|
+
* Acquires a token, waiting if necessary until one becomes available.
|
|
25
|
+
* Call this before each HTTP request.
|
|
26
|
+
*
|
|
27
|
+
* @returns A promise that resolves when a token is acquired
|
|
28
|
+
*/
|
|
29
|
+
acquire(): Promise<void>;
|
|
30
|
+
private refill;
|
|
31
|
+
private sleep;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=rateLimiter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rateLimiter.d.ts","sourceRoot":"","sources":["../../../src/client/rateLimiter.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IAEtC;;;;;OAKG;gBACS,oBAAoB,EAAE,MAAM;IAYxC;;;;;OAKG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB9B,OAAO,CAAC,MAAM;IAQd,OAAO,CAAC,KAAK;CAKd"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.RateLimiter = void 0;
|
|
5
|
+
/**
|
|
6
|
+
* A simple token-bucket rate limiter that throttles requests
|
|
7
|
+
* to stay within a specified requests-per-second limit.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* const limiter = new RateLimiter(10); // 10 req/s
|
|
12
|
+
* await limiter.acquire(); // waits if needed
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
class RateLimiter {
|
|
16
|
+
tokens;
|
|
17
|
+
lastRefill;
|
|
18
|
+
maxTokens;
|
|
19
|
+
refillRateMs;
|
|
20
|
+
/**
|
|
21
|
+
* Creates a new rate limiter.
|
|
22
|
+
*
|
|
23
|
+
* @param maxRequestsPerSecond - Maximum number of requests allowed per second
|
|
24
|
+
* @throws {Error} If maxRequestsPerSecond is not a positive number
|
|
25
|
+
*/
|
|
26
|
+
constructor(maxRequestsPerSecond) {
|
|
27
|
+
if (maxRequestsPerSecond <= 0) {
|
|
28
|
+
throw new Error(`maxRequestsPerSecond must be positive, got ${maxRequestsPerSecond}`);
|
|
29
|
+
}
|
|
30
|
+
this.maxTokens = maxRequestsPerSecond;
|
|
31
|
+
this.tokens = maxRequestsPerSecond;
|
|
32
|
+
this.lastRefill = Date.now();
|
|
33
|
+
this.refillRateMs = 1000 / maxRequestsPerSecond;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Acquires a token, waiting if necessary until one becomes available.
|
|
37
|
+
* Call this before each HTTP request.
|
|
38
|
+
*
|
|
39
|
+
* @returns A promise that resolves when a token is acquired
|
|
40
|
+
*/
|
|
41
|
+
async acquire() {
|
|
42
|
+
this.refill();
|
|
43
|
+
if (this.tokens >= 1) {
|
|
44
|
+
this.tokens -= 1;
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const waitMs = this.refillRateMs - (Date.now() - this.lastRefill);
|
|
48
|
+
if (waitMs > 0) {
|
|
49
|
+
await this.sleep(waitMs);
|
|
50
|
+
}
|
|
51
|
+
this.refill();
|
|
52
|
+
this.tokens = Math.max(0, this.tokens - 1);
|
|
53
|
+
}
|
|
54
|
+
refill() {
|
|
55
|
+
const now = Date.now();
|
|
56
|
+
const elapsed = now - this.lastRefill;
|
|
57
|
+
const tokensToAdd = elapsed / this.refillRateMs;
|
|
58
|
+
this.tokens = Math.min(this.maxTokens, this.tokens + tokensToAdd);
|
|
59
|
+
this.lastRefill = now;
|
|
60
|
+
}
|
|
61
|
+
sleep(ms) {
|
|
62
|
+
return new Promise((resolve) => {
|
|
63
|
+
setTimeout(resolve, ms);
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
exports.RateLimiter = RateLimiter;
|
|
68
|
+
//# sourceMappingURL=rateLimiter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rateLimiter.js","sourceRoot":"","sources":["../../../src/client/rateLimiter.ts"],"names":[],"mappings":";AAAA,sCAAsC;;;AAEtC;;;;;;;;;GASG;AACH,MAAa,WAAW;IACd,MAAM,CAAS;IACf,UAAU,CAAS;IACV,SAAS,CAAS;IAClB,YAAY,CAAS;IAEtC;;;;;OAKG;IACH,YAAY,oBAA4B;QACtC,IAAI,oBAAoB,IAAI,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CACb,8CAA8C,oBAAoB,EAAE,CACrE,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,oBAAoB,CAAC;QACtC,IAAI,CAAC,MAAM,GAAG,oBAAoB,CAAC;QACnC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,oBAAoB,CAAC;IAClD,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,MAAM,EAAE,CAAC;QAEd,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;YACjB,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;QAClE,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3B,CAAC;QAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACd,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC7C,CAAC;IAEO,MAAM;QACZ,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC;QACtC,MAAM,WAAW,GAAG,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC;QAChD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC;QAClE,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC;IACxB,CAAC;IAEO,KAAK,CAAC,EAAU;QACtB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AA5DD,kCA4DC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration for the HieroClient.
|
|
3
|
+
*/
|
|
4
|
+
export interface HieroClientConfig {
|
|
5
|
+
/** The Mirror Node base URL (no trailing slash) */
|
|
6
|
+
baseUrl: string;
|
|
7
|
+
/** Maximum requests per second for rate limiting (default: 20) */
|
|
8
|
+
maxRequestsPerSecond?: number;
|
|
9
|
+
/** Custom fetch implementation — useful for testing */
|
|
10
|
+
fetch?: typeof globalThis.fetch;
|
|
11
|
+
/** Default headers to include in all requests */
|
|
12
|
+
headers?: Record<string, string>;
|
|
13
|
+
/** Request timeout in milliseconds (default: 30000) */
|
|
14
|
+
timeoutMs?: number;
|
|
15
|
+
/** Maximum number of retries for retriable errors (default: 3) */
|
|
16
|
+
maxRetries?: number;
|
|
17
|
+
}
|
|
18
|
+
/** Pre-configured network endpoints for the Hedera Mirror Node */
|
|
19
|
+
export declare const Networks: {
|
|
20
|
+
readonly mainnet: "https://mainnet.mirrornode.hedera.com";
|
|
21
|
+
readonly testnet: "https://testnet.mirrornode.hedera.com";
|
|
22
|
+
readonly previewnet: "https://previewnet.mirrornode.hedera.com";
|
|
23
|
+
};
|
|
24
|
+
/** Network name keys */
|
|
25
|
+
export type NetworkName = keyof typeof Networks;
|
|
26
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/client/types.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,uDAAuD;IACvD,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAChC,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,kEAAkE;AAClE,eAAO,MAAM,QAAQ;;;;CAIsB,CAAC;AAE5C,wBAAwB;AACxB,MAAM,MAAM,WAAW,GAAG,MAAM,OAAO,QAAQ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.Networks = void 0;
|
|
5
|
+
/** Pre-configured network endpoints for the Hedera Mirror Node */
|
|
6
|
+
exports.Networks = {
|
|
7
|
+
mainnet: 'https://mainnet.mirrornode.hedera.com',
|
|
8
|
+
testnet: 'https://testnet.mirrornode.hedera.com',
|
|
9
|
+
previewnet: 'https://previewnet.mirrornode.hedera.com',
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/client/types.ts"],"names":[],"mappings":";AAAA,sCAAsC;;;AAoBtC,kEAAkE;AACrD,QAAA,QAAQ,GAAG;IACtB,OAAO,EAAE,uCAAuC;IAChD,OAAO,EAAE,uCAAuC;IAChD,UAAU,EAAE,0CAA0C;CACb,CAAC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base error class for all hiero-sdk-utils errors.
|
|
3
|
+
* All errors thrown by this library extend this class.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```ts
|
|
7
|
+
* try {
|
|
8
|
+
* await client.accounts.getById('invalid');
|
|
9
|
+
* } catch (error) {
|
|
10
|
+
* if (error instanceof HieroError) {
|
|
11
|
+
* console.log(error.code); // e.g., 'INVALID_ACCOUNT_ID'
|
|
12
|
+
* }
|
|
13
|
+
* }
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export declare class HieroError extends Error {
|
|
17
|
+
readonly code: string;
|
|
18
|
+
/**
|
|
19
|
+
* @param message - Human-readable error description
|
|
20
|
+
* @param code - Machine-readable error code (e.g., 'ACCOUNT_NOT_FOUND')
|
|
21
|
+
* @param options - Standard ErrorOptions including cause chain
|
|
22
|
+
*/
|
|
23
|
+
constructor(message: string, code: string, options?: ErrorOptions);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Error thrown when the Mirror Node API returns an error response.
|
|
27
|
+
* Includes the HTTP status code for programmatic handling.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```ts
|
|
31
|
+
* try {
|
|
32
|
+
* await client.accounts.getById('0.0.99999999999');
|
|
33
|
+
* } catch (error) {
|
|
34
|
+
* if (error instanceof MirrorNodeError) {
|
|
35
|
+
* console.log(error.status); // 404
|
|
36
|
+
* console.log(error.code); // 'MIRROR_NODE_ERROR'
|
|
37
|
+
* }
|
|
38
|
+
* }
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export declare class MirrorNodeError extends HieroError {
|
|
42
|
+
readonly status: number;
|
|
43
|
+
/**
|
|
44
|
+
* @param message - Human-readable error description
|
|
45
|
+
* @param code - Machine-readable error code
|
|
46
|
+
* @param status - HTTP status code from the Mirror Node response
|
|
47
|
+
* @param options - Standard ErrorOptions including cause chain
|
|
48
|
+
*/
|
|
49
|
+
constructor(message: string, code: string, status: number, options?: ErrorOptions);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Error thrown when input validation fails before making a network request.
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```ts
|
|
56
|
+
* try {
|
|
57
|
+
* await client.accounts.getById('not-an-id');
|
|
58
|
+
* } catch (error) {
|
|
59
|
+
* if (error instanceof ValidationError) {
|
|
60
|
+
* console.log(error.code); // 'INVALID_ACCOUNT_ID'
|
|
61
|
+
* }
|
|
62
|
+
* }
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
export declare class ValidationError extends HieroError {
|
|
66
|
+
/**
|
|
67
|
+
* @param message - Human-readable description of what was invalid
|
|
68
|
+
* @param code - Machine-readable error code
|
|
69
|
+
* @param options - Standard ErrorOptions including cause chain
|
|
70
|
+
*/
|
|
71
|
+
constructor(message: string, code: string, options?: ErrorOptions);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Error thrown when pagination encounters an unexpected state.
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* ```ts
|
|
78
|
+
* try {
|
|
79
|
+
* for await (const item of client.accounts.list()) { ... }
|
|
80
|
+
* } catch (error) {
|
|
81
|
+
* if (error instanceof PaginationError) {
|
|
82
|
+
* console.log(error.code); // 'INVALID_RESPONSE_SHAPE'
|
|
83
|
+
* }
|
|
84
|
+
* }
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
export declare class PaginationError extends HieroError {
|
|
88
|
+
/**
|
|
89
|
+
* @param message - Human-readable description of the pagination failure
|
|
90
|
+
* @param code - Machine-readable error code
|
|
91
|
+
* @param options - Standard ErrorOptions including cause chain
|
|
92
|
+
*/
|
|
93
|
+
constructor(message: string, code: string, options?: ErrorOptions);
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/errors/index.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AACH,qBAAa,UAAW,SAAQ,KAAK;aAQjB,IAAI,EAAE,MAAM;IAP9B;;;;OAIG;gBAED,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM,EAC5B,OAAO,CAAC,EAAE,YAAY;CAMzB;AAED;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,eAAgB,SAAQ,UAAU;aAU3B,MAAM,EAAE,MAAM;IAThC;;;;;OAKG;gBAED,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACI,MAAM,EAAE,MAAM,EAC9B,OAAO,CAAC,EAAE,YAAY;CAIzB;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,eAAgB,SAAQ,UAAU;IAC7C;;;;OAIG;gBACS,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAGlE;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,eAAgB,SAAQ,UAAU;IAC7C;;;;OAIG;gBACS,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAGlE"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.PaginationError = exports.ValidationError = exports.MirrorNodeError = exports.HieroError = void 0;
|
|
5
|
+
/**
|
|
6
|
+
* Base error class for all hiero-sdk-utils errors.
|
|
7
|
+
* All errors thrown by this library extend this class.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* try {
|
|
12
|
+
* await client.accounts.getById('invalid');
|
|
13
|
+
* } catch (error) {
|
|
14
|
+
* if (error instanceof HieroError) {
|
|
15
|
+
* console.log(error.code); // e.g., 'INVALID_ACCOUNT_ID'
|
|
16
|
+
* }
|
|
17
|
+
* }
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
class HieroError extends Error {
|
|
21
|
+
code;
|
|
22
|
+
/**
|
|
23
|
+
* @param message - Human-readable error description
|
|
24
|
+
* @param code - Machine-readable error code (e.g., 'ACCOUNT_NOT_FOUND')
|
|
25
|
+
* @param options - Standard ErrorOptions including cause chain
|
|
26
|
+
*/
|
|
27
|
+
constructor(message, code, options) {
|
|
28
|
+
super(message, options);
|
|
29
|
+
this.code = code;
|
|
30
|
+
this.name = this.constructor.name;
|
|
31
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
exports.HieroError = HieroError;
|
|
35
|
+
/**
|
|
36
|
+
* Error thrown when the Mirror Node API returns an error response.
|
|
37
|
+
* Includes the HTTP status code for programmatic handling.
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```ts
|
|
41
|
+
* try {
|
|
42
|
+
* await client.accounts.getById('0.0.99999999999');
|
|
43
|
+
* } catch (error) {
|
|
44
|
+
* if (error instanceof MirrorNodeError) {
|
|
45
|
+
* console.log(error.status); // 404
|
|
46
|
+
* console.log(error.code); // 'MIRROR_NODE_ERROR'
|
|
47
|
+
* }
|
|
48
|
+
* }
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
class MirrorNodeError extends HieroError {
|
|
52
|
+
status;
|
|
53
|
+
/**
|
|
54
|
+
* @param message - Human-readable error description
|
|
55
|
+
* @param code - Machine-readable error code
|
|
56
|
+
* @param status - HTTP status code from the Mirror Node response
|
|
57
|
+
* @param options - Standard ErrorOptions including cause chain
|
|
58
|
+
*/
|
|
59
|
+
constructor(message, code, status, options) {
|
|
60
|
+
super(message, code, options);
|
|
61
|
+
this.status = status;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports.MirrorNodeError = MirrorNodeError;
|
|
65
|
+
/**
|
|
66
|
+
* Error thrown when input validation fails before making a network request.
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```ts
|
|
70
|
+
* try {
|
|
71
|
+
* await client.accounts.getById('not-an-id');
|
|
72
|
+
* } catch (error) {
|
|
73
|
+
* if (error instanceof ValidationError) {
|
|
74
|
+
* console.log(error.code); // 'INVALID_ACCOUNT_ID'
|
|
75
|
+
* }
|
|
76
|
+
* }
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
class ValidationError extends HieroError {
|
|
80
|
+
/**
|
|
81
|
+
* @param message - Human-readable description of what was invalid
|
|
82
|
+
* @param code - Machine-readable error code
|
|
83
|
+
* @param options - Standard ErrorOptions including cause chain
|
|
84
|
+
*/
|
|
85
|
+
constructor(message, code, options) {
|
|
86
|
+
super(message, code, options);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
exports.ValidationError = ValidationError;
|
|
90
|
+
/**
|
|
91
|
+
* Error thrown when pagination encounters an unexpected state.
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* ```ts
|
|
95
|
+
* try {
|
|
96
|
+
* for await (const item of client.accounts.list()) { ... }
|
|
97
|
+
* } catch (error) {
|
|
98
|
+
* if (error instanceof PaginationError) {
|
|
99
|
+
* console.log(error.code); // 'INVALID_RESPONSE_SHAPE'
|
|
100
|
+
* }
|
|
101
|
+
* }
|
|
102
|
+
* ```
|
|
103
|
+
*/
|
|
104
|
+
class PaginationError extends HieroError {
|
|
105
|
+
/**
|
|
106
|
+
* @param message - Human-readable description of the pagination failure
|
|
107
|
+
* @param code - Machine-readable error code
|
|
108
|
+
* @param options - Standard ErrorOptions including cause chain
|
|
109
|
+
*/
|
|
110
|
+
constructor(message, code, options) {
|
|
111
|
+
super(message, code, options);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
exports.PaginationError = PaginationError;
|
|
115
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/errors/index.ts"],"names":[],"mappings":";AAAA,sCAAsC;;;AAEtC;;;;;;;;;;;;;;GAcG;AACH,MAAa,UAAW,SAAQ,KAAK;IAQjB;IAPlB;;;;OAIG;IACH,YACE,OAAe,EACC,IAAY,EAC5B,OAAsB;QAEtB,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAHR,SAAI,GAAJ,IAAI,CAAQ;QAI5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QAClC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAfD,gCAeC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAa,eAAgB,SAAQ,UAAU;IAU3B;IATlB;;;;;OAKG;IACH,YACE,OAAe,EACf,IAAY,EACI,MAAc,EAC9B,OAAsB;QAEtB,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAHd,WAAM,GAAN,MAAM,CAAQ;IAIhC,CAAC;CACF;AAfD,0CAeC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAa,eAAgB,SAAQ,UAAU;IAC7C;;;;OAIG;IACH,YAAY,OAAe,EAAE,IAAY,EAAE,OAAsB;QAC/D,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAChC,CAAC;CACF;AATD,0CASC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAa,eAAgB,SAAQ,UAAU;IAC7C;;;;OAIG;IACH,YAAY,OAAe,EAAE,IAAY,EAAE,OAAsB;QAC/D,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAChC,CAAC;CACF;AATD,0CASC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* hiero-sdk-utils — TypeScript utilities for the Hedera/Hiero Mirror Node.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```ts
|
|
6
|
+
* import { HieroClient, Networks } from 'hiero-sdk-utils';
|
|
7
|
+
*
|
|
8
|
+
* const client = new HieroClient({ baseUrl: Networks.testnet });
|
|
9
|
+
*
|
|
10
|
+
* // Fetch a single account
|
|
11
|
+
* const account = await client.accounts.getById('0.0.1234');
|
|
12
|
+
*
|
|
13
|
+
* // Iterate through accounts with auto-pagination
|
|
14
|
+
* for await (const a of client.accounts.list({ limit: 10 })) {
|
|
15
|
+
* console.log(a.account, a.balance.balance);
|
|
16
|
+
* }
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* @packageDocumentation
|
|
20
|
+
*/
|
|
21
|
+
export { HieroClient } from './client/HieroClient.js';
|
|
22
|
+
export { Networks } from './client/types.js';
|
|
23
|
+
export type { HieroClientConfig, NetworkName } from './client/types.js';
|
|
24
|
+
export { HieroError, MirrorNodeError, ValidationError, PaginationError, } from './errors/index.js';
|
|
25
|
+
export { AccountsResource } from './resources/accounts.js';
|
|
26
|
+
export { TransactionsResource } from './resources/transactions.js';
|
|
27
|
+
export { TokensResource } from './resources/tokens.js';
|
|
28
|
+
export { TopicsResource } from './resources/topics.js';
|
|
29
|
+
export { ContractsResource } from './resources/contracts.js';
|
|
30
|
+
export { NftsResource } from './resources/nfts.js';
|
|
31
|
+
export { BalancesResource } from './resources/balances.js';
|
|
32
|
+
export { BlocksResource } from './resources/blocks.js';
|
|
33
|
+
export { SchedulesResource } from './resources/schedules.js';
|
|
34
|
+
export type { AccountInfo, AccountBalance, AccountsQueryParams, TransactionInfo, TransactionsQueryParams, Transfer, TokenTransfer, NftTransfer, TokenInfo, TokensQueryParams, TokenBalance, TopicInfo, TopicMessage, TopicMessagesQueryParams, ContractInfo, ContractsQueryParams, CustomFee, FixedFee, FractionalFee, FractionalAmount, RoyaltyFee, NftInfo, NftsQueryParams, BalanceEntry, BalancesQueryParams, BlockInfo, BlocksQueryParams, ScheduleInfo, SchedulesQueryParams, Key, } from './types/api.js';
|
|
35
|
+
export type { BaseQueryParams, TimestampFilter, PaginationLinks, } from './types/common.js';
|
|
36
|
+
//# sourceMappingURL=index.d.ts.map
|