@solana/rpc-transport-http 2.0.0-20241006045741

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.
@@ -0,0 +1,262 @@
1
+ import { SolanaError, SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR, SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN } from '@solana/errors';
2
+ import { isJsonRpcPayload } from '@solana/rpc-spec';
3
+
4
+ // src/http-transport.ts
5
+ var DISALLOWED_HEADERS = {
6
+ accept: true,
7
+ "content-length": true,
8
+ "content-type": true
9
+ };
10
+ var FORBIDDEN_HEADERS = /* @__PURE__ */ Object.assign(
11
+ {
12
+ "accept-charset": true,
13
+ "access-control-request-headers": true,
14
+ "access-control-request-method": true,
15
+ connection: true,
16
+ "content-length": true,
17
+ cookie: true,
18
+ date: true,
19
+ dnt: true,
20
+ expect: true,
21
+ host: true,
22
+ "keep-alive": true,
23
+ origin: true,
24
+ "permissions-policy": true,
25
+ // Prefix matching is implemented in code, below.
26
+ // 'proxy-': true,
27
+ // 'sec-': true,
28
+ referer: true,
29
+ te: true,
30
+ trailer: true,
31
+ "transfer-encoding": true,
32
+ upgrade: true,
33
+ via: true
34
+ },
35
+ { "accept-encoding": true }
36
+ );
37
+ function assertIsAllowedHttpRequestHeaders(headers) {
38
+ const badHeaders = Object.keys(headers).filter((headerName) => {
39
+ const lowercaseHeaderName = headerName.toLowerCase();
40
+ return DISALLOWED_HEADERS[headerName.toLowerCase()] === true || FORBIDDEN_HEADERS[headerName.toLowerCase()] === true || lowercaseHeaderName.startsWith("proxy-") || lowercaseHeaderName.startsWith("sec-");
41
+ });
42
+ if (badHeaders.length > 0) {
43
+ throw new SolanaError(SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN, {
44
+ headers: badHeaders
45
+ });
46
+ }
47
+ }
48
+ function normalizeHeaders(headers) {
49
+ const out = {};
50
+ for (const headerName in headers) {
51
+ out[headerName.toLowerCase()] = headers[headerName];
52
+ }
53
+ return out;
54
+ }
55
+
56
+ // src/http-transport.ts
57
+ var didWarnDispatcherWasSuppliedInNonNodeEnvironment = false;
58
+ function warnDispatcherWasSuppliedInNonNodeEnvironment() {
59
+ if (didWarnDispatcherWasSuppliedInNonNodeEnvironment) {
60
+ return;
61
+ }
62
+ didWarnDispatcherWasSuppliedInNonNodeEnvironment = true;
63
+ console.warn(
64
+ "You have supplied a `Dispatcher` to `createHttpTransport()`. It has been ignored because Undici dispatchers only work in Node environments. To eliminate this warning, omit the `dispatcher_NODE_ONLY` property from your config when running in a non-Node environment."
65
+ );
66
+ }
67
+ function createHttpTransport(config) {
68
+ if (process.env.NODE_ENV !== "production" && true && "dispatcher_NODE_ONLY" in config) {
69
+ warnDispatcherWasSuppliedInNonNodeEnvironment();
70
+ }
71
+ const { fromJson, headers, toJson, url } = config;
72
+ if (process.env.NODE_ENV !== "production" && headers) {
73
+ assertIsAllowedHttpRequestHeaders(headers);
74
+ }
75
+ let dispatcherConfig;
76
+ const customHeaders = headers && normalizeHeaders(headers);
77
+ return async function makeHttpRequest({
78
+ payload,
79
+ signal
80
+ }) {
81
+ const body = toJson ? toJson(payload) : JSON.stringify(payload);
82
+ const requestInfo = {
83
+ ...dispatcherConfig,
84
+ body,
85
+ headers: {
86
+ ...customHeaders,
87
+ // Keep these headers lowercase so they will override any user-supplied headers above.
88
+ accept: "application/json",
89
+ "content-length": body.length.toString(),
90
+ "content-type": "application/json; charset=utf-8"
91
+ },
92
+ method: "POST",
93
+ signal
94
+ };
95
+ const response = await fetch(url, requestInfo);
96
+ if (!response.ok) {
97
+ throw new SolanaError(SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR, {
98
+ message: response.statusText,
99
+ statusCode: response.status
100
+ });
101
+ }
102
+ if (fromJson) {
103
+ return fromJson(await response.text(), payload);
104
+ }
105
+ return await response.json();
106
+ };
107
+ }
108
+ var SOLANA_RPC_METHODS = [
109
+ "getAccountInfo",
110
+ "getBalance",
111
+ "getBlock",
112
+ "getBlockCommitment",
113
+ "getBlockHeight",
114
+ "getBlockProduction",
115
+ "getBlocks",
116
+ "getBlocksWithLimit",
117
+ "getBlockTime",
118
+ "getClusterNodes",
119
+ "getEpochInfo",
120
+ "getEpochSchedule",
121
+ "getFeeForMessage",
122
+ "getFirstAvailableBlock",
123
+ "getGenesisHash",
124
+ "getHealth",
125
+ "getHighestSnapshotSlot",
126
+ "getIdentity",
127
+ "getInflationGovernor",
128
+ "getInflationRate",
129
+ "getInflationReward",
130
+ "getLargestAccounts",
131
+ "getLatestBlockhash",
132
+ "getLeaderSchedule",
133
+ "getMaxRetransmitSlot",
134
+ "getMaxShredInsertSlot",
135
+ "getMinimumBalanceForRentExemption",
136
+ "getMultipleAccounts",
137
+ "getProgramAccounts",
138
+ "getRecentPerformanceSamples",
139
+ "getRecentPrioritizationFees",
140
+ "getSignaturesForAddress",
141
+ "getSignatureStatuses",
142
+ "getSlot",
143
+ "getSlotLeader",
144
+ "getSlotLeaders",
145
+ "getStakeActivation",
146
+ "getStakeMinimumDelegation",
147
+ "getSupply",
148
+ "getTokenAccountBalance",
149
+ "getTokenAccountsByDelegate",
150
+ "getTokenAccountsByOwner",
151
+ "getTokenLargestAccounts",
152
+ "getTokenSupply",
153
+ "getTransaction",
154
+ "getTransactionCount",
155
+ "getVersion",
156
+ "getVoteAccounts",
157
+ "index",
158
+ "isBlockhashValid",
159
+ "minimumLedgerSlot",
160
+ "requestAirdrop",
161
+ "sendTransaction",
162
+ "simulateTransaction"
163
+ ];
164
+ function isSolanaRequest(payload) {
165
+ return isJsonRpcPayload(payload) && SOLANA_RPC_METHODS.includes(payload.method);
166
+ }
167
+
168
+ // src/parse-json-with-bigints.ts
169
+ function parseJsonWithBigInts(json) {
170
+ return JSON.parse(wrapIntegersInBigIntValueObject(json), (_, value) => {
171
+ return isBigIntValueObject(value) ? unwrapBigIntValueObject(value) : value;
172
+ });
173
+ }
174
+ function wrapIntegersInBigIntValueObject(json) {
175
+ const out = [];
176
+ let inQuote = false;
177
+ for (let ii = 0; ii < json.length; ii++) {
178
+ let isEscaped = false;
179
+ if (json[ii] === "\\") {
180
+ out.push(json[ii++]);
181
+ isEscaped = !isEscaped;
182
+ }
183
+ if (json[ii] === '"') {
184
+ out.push(json[ii]);
185
+ if (!isEscaped) {
186
+ inQuote = !inQuote;
187
+ }
188
+ continue;
189
+ }
190
+ if (!inQuote) {
191
+ const consumedNumber = consumeNumber(json, ii);
192
+ if (consumedNumber?.length) {
193
+ ii += consumedNumber.length - 1;
194
+ if (consumedNumber.match(/\.|[eE]-/)) {
195
+ out.push(consumedNumber);
196
+ } else {
197
+ out.push(wrapBigIntValueObject(consumedNumber));
198
+ }
199
+ continue;
200
+ }
201
+ }
202
+ out.push(json[ii]);
203
+ }
204
+ return out.join("");
205
+ }
206
+ function consumeNumber(json, ii) {
207
+ const JSON_NUMBER_REGEX = /^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?/;
208
+ if (!json[ii]?.match(/[-\d]/)) {
209
+ return null;
210
+ }
211
+ const numberMatch = json.slice(ii).match(JSON_NUMBER_REGEX);
212
+ return numberMatch ? numberMatch[0] : null;
213
+ }
214
+ function wrapBigIntValueObject(value) {
215
+ return `{"$n":"${value}"}`;
216
+ }
217
+ function unwrapBigIntValueObject({ $n }) {
218
+ if ($n.match(/[eE]/)) {
219
+ const [units, exponent] = $n.split(/[eE]/);
220
+ return BigInt(units) * BigInt(10) ** BigInt(exponent);
221
+ }
222
+ return BigInt($n);
223
+ }
224
+ function isBigIntValueObject(value) {
225
+ return !!value && typeof value === "object" && "$n" in value && typeof value.$n === "string";
226
+ }
227
+
228
+ // src/stringify-json-with-bigints.ts
229
+ function stringifyJsonWithBigints(value, space) {
230
+ return unwrapBigIntValueObject2(
231
+ JSON.stringify(value, (_, v) => typeof v === "bigint" ? wrapBigIntValueObject2(v) : v, space)
232
+ );
233
+ }
234
+ function wrapBigIntValueObject2(value) {
235
+ return { $n: `${value}` };
236
+ }
237
+ function unwrapBigIntValueObject2(value) {
238
+ return value.replace(/\{\s*"\$n"\s*:\s*"(-?\d+)"\s*\}/g, "$1");
239
+ }
240
+
241
+ // src/http-transport-for-solana-rpc.ts
242
+ function createHttpTransportForSolanaRpc(config) {
243
+ return createHttpTransport({
244
+ ...config,
245
+ fromJson: (rawResponse, payload) => {
246
+ if (!isSolanaRequest(payload)) return JSON.parse(rawResponse);
247
+ const response = parseJsonWithBigInts(rawResponse);
248
+ if (isErrorResponse(response)) {
249
+ return { ...response, error: { ...response.error, code: Number(response.error.code) } };
250
+ }
251
+ return response;
252
+ },
253
+ toJson: (payload) => isSolanaRequest(payload) ? stringifyJsonWithBigints(payload) : JSON.stringify(payload)
254
+ });
255
+ }
256
+ function isErrorResponse(value) {
257
+ return !!value && typeof value === "object" && "error" in value && !!value.error && typeof value.error === "object" && "code" in value.error;
258
+ }
259
+
260
+ export { createHttpTransport, createHttpTransportForSolanaRpc };
261
+ //# sourceMappingURL=index.browser.mjs.map
262
+ //# sourceMappingURL=index.browser.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/http-transport-headers.ts","../src/http-transport.ts","../src/is-solana-request.ts","../src/parse-json-with-bigints.ts","../src/stringify-json-with-bigints.ts","../src/http-transport-for-solana-rpc.ts"],"names":["SolanaError","unwrapBigIntValueObject","wrapBigIntValueObject"],"mappings":"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","file":"index.browser.mjs","sourcesContent":["import { SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN, SolanaError } from '@solana/errors';\n\nexport type AllowedHttpRequestHeaders = Readonly<\n {\n // Someone can still sneak a forbidden header past Typescript if they do something like\n // fOo-BaR, but at that point they deserve the runtime failure.\n [K in DisallowedHeaders | ForbiddenHeaders as\n | Capitalize<Lowercase<K>> // `Foo-bar`\n | K // `Foo-Bar`\n | Lowercase<K> // `foo-bar`\n | Uncapitalize<K> // `foo-Bar`\n // `FOO-BAR`\n | Uppercase<K>]?: never;\n } & { [headerName: string]: string }\n>;\n// These are headers that we simply don't allow the developer to override because they're\n// fundamental to the operation of the JSON-RPC transport.\ntype DisallowedHeaders = 'Accept' | 'Content-Length' | 'Content-Type' | 'Solana-Client';\ntype ForbiddenHeaders =\n | 'Accept-Charset'\n /**\n * Though technically forbidden in non-Node environments, we don't have a way to target\n * TypeScript types depending on which platform you are authoring for. `Accept-Encoding` is\n * therefore omitted from the forbidden headers type, but is still a runtime error in dev mode\n * when supplied in a non-Node context.\n */\n // | 'Accept-Encoding'\n | 'Access-Control-Request-Headers'\n | 'Access-Control-Request-Method'\n | 'Connection'\n | 'Content-Length'\n | 'Cookie'\n | 'Date'\n | 'DNT'\n | 'Expect'\n | 'Host'\n | 'Keep-Alive'\n | 'Origin'\n | 'Permissions-Policy'\n | 'Referer'\n | 'TE'\n | 'Trailer'\n | 'Transfer-Encoding'\n | 'Upgrade'\n | 'Via'\n | `Proxy-${string}`\n | `Sec-${string}`;\n\n// These are headers which are fundamental to the JSON-RPC transport, and must not be modified.\nconst DISALLOWED_HEADERS: Record<string, boolean> = {\n accept: true,\n 'content-length': true,\n 'content-type': true,\n};\n// https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_header_name\nconst FORBIDDEN_HEADERS: Record<string, boolean> = /* @__PURE__ */ Object.assign(\n {\n 'accept-charset': true,\n 'access-control-request-headers': true,\n 'access-control-request-method': true,\n connection: true,\n 'content-length': true,\n cookie: true,\n date: true,\n dnt: true,\n expect: true,\n host: true,\n 'keep-alive': true,\n origin: true,\n 'permissions-policy': true,\n // Prefix matching is implemented in code, below.\n // 'proxy-': true,\n // 'sec-': true,\n referer: true,\n te: true,\n trailer: true,\n 'transfer-encoding': true,\n upgrade: true,\n via: true,\n },\n __NODEJS__ ? undefined : { 'accept-encoding': true },\n);\n\nexport function assertIsAllowedHttpRequestHeaders(\n headers: Record<string, string>,\n): asserts headers is AllowedHttpRequestHeaders {\n const badHeaders = Object.keys(headers).filter(headerName => {\n const lowercaseHeaderName = headerName.toLowerCase();\n return (\n DISALLOWED_HEADERS[headerName.toLowerCase()] === true ||\n FORBIDDEN_HEADERS[headerName.toLowerCase()] === true ||\n lowercaseHeaderName.startsWith('proxy-') ||\n lowercaseHeaderName.startsWith('sec-')\n );\n });\n if (badHeaders.length > 0) {\n throw new SolanaError(SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN, {\n headers: badHeaders,\n });\n }\n}\n\n/**\n * Lowercasing header names makes it easier to override user-supplied headers, such as those defined\n * in the `DisallowedHeaders` type.\n */\nexport function normalizeHeaders<T extends Record<string, string>>(\n headers: T,\n): { [K in string & keyof T as Lowercase<K>]: T[K] } {\n const out: Record<string, string> = {};\n for (const headerName in headers) {\n out[headerName.toLowerCase()] = headers[headerName];\n }\n return out as { [K in string & keyof T as Lowercase<K>]: T[K] };\n}\n","import { SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR, SolanaError } from '@solana/errors';\nimport { RpcResponse, RpcTransport } from '@solana/rpc-spec';\nimport type Dispatcher from 'undici-types/dispatcher';\n\nimport {\n AllowedHttpRequestHeaders,\n assertIsAllowedHttpRequestHeaders,\n normalizeHeaders,\n} from './http-transport-headers';\n\ntype Config = Readonly<{\n dispatcher_NODE_ONLY?: Dispatcher;\n fromJson?: (rawResponse: string, payload: unknown) => RpcResponse;\n headers?: AllowedHttpRequestHeaders;\n toJson?: (payload: unknown) => string;\n url: string;\n}>;\n\nlet didWarnDispatcherWasSuppliedInNonNodeEnvironment = false;\nfunction warnDispatcherWasSuppliedInNonNodeEnvironment() {\n if (didWarnDispatcherWasSuppliedInNonNodeEnvironment) {\n return;\n }\n didWarnDispatcherWasSuppliedInNonNodeEnvironment = true;\n console.warn(\n 'You have supplied a `Dispatcher` to `createHttpTransport()`. It has been ignored ' +\n 'because Undici dispatchers only work in Node environments. To eliminate this ' +\n 'warning, omit the `dispatcher_NODE_ONLY` property from your config when running in ' +\n 'a non-Node environment.',\n );\n}\n\nexport function createHttpTransport(config: Config): RpcTransport {\n if (process.env.NODE_ENV !== \"production\" && !__NODEJS__ && 'dispatcher_NODE_ONLY' in config) {\n warnDispatcherWasSuppliedInNonNodeEnvironment();\n }\n const { fromJson, headers, toJson, url } = config;\n if (process.env.NODE_ENV !== \"production\" && headers) {\n assertIsAllowedHttpRequestHeaders(headers);\n }\n let dispatcherConfig: { dispatcher: Dispatcher | undefined } | undefined;\n if (__NODEJS__ && 'dispatcher_NODE_ONLY' in config) {\n dispatcherConfig = { dispatcher: config.dispatcher_NODE_ONLY };\n }\n const customHeaders = headers && normalizeHeaders(headers);\n return async function makeHttpRequest<TResponse>({\n payload,\n signal,\n }: Parameters<RpcTransport>[0]): Promise<RpcResponse<TResponse>> {\n const body = toJson ? toJson(payload) : JSON.stringify(payload);\n const requestInfo = {\n ...dispatcherConfig,\n body,\n headers: {\n ...customHeaders,\n // Keep these headers lowercase so they will override any user-supplied headers above.\n accept: 'application/json',\n 'content-length': body.length.toString(),\n 'content-type': 'application/json; charset=utf-8',\n },\n method: 'POST',\n signal,\n };\n const response = await fetch(url, requestInfo);\n if (!response.ok) {\n throw new SolanaError(SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR, {\n message: response.statusText,\n statusCode: response.status,\n });\n }\n if (fromJson) {\n return fromJson(await response.text(), payload) as TResponse;\n }\n return await response.json();\n };\n}\n","import { isJsonRpcPayload } from '@solana/rpc-spec';\n\nconst SOLANA_RPC_METHODS = [\n 'getAccountInfo',\n 'getBalance',\n 'getBlock',\n 'getBlockCommitment',\n 'getBlockHeight',\n 'getBlockProduction',\n 'getBlocks',\n 'getBlocksWithLimit',\n 'getBlockTime',\n 'getClusterNodes',\n 'getEpochInfo',\n 'getEpochSchedule',\n 'getFeeForMessage',\n 'getFirstAvailableBlock',\n 'getGenesisHash',\n 'getHealth',\n 'getHighestSnapshotSlot',\n 'getIdentity',\n 'getInflationGovernor',\n 'getInflationRate',\n 'getInflationReward',\n 'getLargestAccounts',\n 'getLatestBlockhash',\n 'getLeaderSchedule',\n 'getMaxRetransmitSlot',\n 'getMaxShredInsertSlot',\n 'getMinimumBalanceForRentExemption',\n 'getMultipleAccounts',\n 'getProgramAccounts',\n 'getRecentPerformanceSamples',\n 'getRecentPrioritizationFees',\n 'getSignaturesForAddress',\n 'getSignatureStatuses',\n 'getSlot',\n 'getSlotLeader',\n 'getSlotLeaders',\n 'getStakeActivation',\n 'getStakeMinimumDelegation',\n 'getSupply',\n 'getTokenAccountBalance',\n 'getTokenAccountsByDelegate',\n 'getTokenAccountsByOwner',\n 'getTokenLargestAccounts',\n 'getTokenSupply',\n 'getTransaction',\n 'getTransactionCount',\n 'getVersion',\n 'getVoteAccounts',\n 'index',\n 'isBlockhashValid',\n 'minimumLedgerSlot',\n 'requestAirdrop',\n 'sendTransaction',\n 'simulateTransaction',\n] as const;\n\n/**\n * Helper function that checks if a given `RpcRequest` comes from the Solana RPC API.\n */\nexport function isSolanaRequest(payload: unknown): payload is Readonly<{\n jsonrpc: '2.0';\n method: (typeof SOLANA_RPC_METHODS)[number];\n params: unknown;\n}> {\n return isJsonRpcPayload(payload) && (SOLANA_RPC_METHODS as readonly string[]).includes(payload.method);\n}\n","/**\n * This function is a replacement for `JSON.parse` that can handle large\n * unsafe integers by parsing them as BigInts. It transforms every\n * numerical value into a BigInt without loss of precision.\n */\nexport function parseJsonWithBigInts(json: string): unknown {\n return JSON.parse(wrapIntegersInBigIntValueObject(json), (_, value) => {\n return isBigIntValueObject(value) ? unwrapBigIntValueObject(value) : value;\n });\n}\n\nfunction wrapIntegersInBigIntValueObject(json: string): string {\n const out = [];\n let inQuote = false;\n for (let ii = 0; ii < json.length; ii++) {\n let isEscaped = false;\n if (json[ii] === '\\\\') {\n out.push(json[ii++]);\n isEscaped = !isEscaped;\n }\n if (json[ii] === '\"') {\n out.push(json[ii]);\n if (!isEscaped) {\n inQuote = !inQuote;\n }\n continue;\n }\n if (!inQuote) {\n const consumedNumber = consumeNumber(json, ii);\n if (consumedNumber?.length) {\n ii += consumedNumber.length - 1;\n // Don't wrap numbers that contain a decimal point or a negative exponent.\n if (consumedNumber.match(/\\.|[eE]-/)) {\n out.push(consumedNumber);\n } else {\n out.push(wrapBigIntValueObject(consumedNumber));\n }\n continue;\n }\n }\n out.push(json[ii]);\n }\n\n return out.join('');\n}\n\nfunction consumeNumber(json: string, ii: number): string | null {\n /** @see https://stackoverflow.com/a/13340826/11440277 */\n const JSON_NUMBER_REGEX = /^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?/;\n\n // Stop early if the first character isn't a digit or a minus sign.\n if (!json[ii]?.match(/[-\\d]/)) {\n return null;\n }\n\n // Otherwise, check if the next characters form a valid JSON number.\n const numberMatch = json.slice(ii).match(JSON_NUMBER_REGEX);\n return numberMatch ? numberMatch[0] : null;\n}\n\ntype BigIntValueObject = {\n // `$` implies 'this is a value object'.\n // `n` implies 'interpret the value as a bigint'.\n $n: string;\n};\n\nfunction wrapBigIntValueObject(value: string): string {\n return `{\"$n\":\"${value}\"}`;\n}\n\nfunction unwrapBigIntValueObject({ $n }: BigIntValueObject): bigint {\n if ($n.match(/[eE]/)) {\n const [units, exponent] = $n.split(/[eE]/);\n return BigInt(units) * BigInt(10) ** BigInt(exponent);\n }\n return BigInt($n);\n}\n\nfunction isBigIntValueObject(value: unknown): value is BigIntValueObject {\n return !!value && typeof value === 'object' && '$n' in value && typeof value.$n === 'string';\n}\n","/**\n * Transforms a value into a JSON string, whilst rendering bigints as large unsafe integers.\n */\nexport function stringifyJsonWithBigints(value: unknown, space?: number | string): string {\n return unwrapBigIntValueObject(\n JSON.stringify(value, (_, v) => (typeof v === 'bigint' ? wrapBigIntValueObject(v) : v), space),\n );\n}\n\ntype BigIntValueObject = {\n // `$` implies 'this is a value object'.\n // `n` implies 'interpret the value as a bigint'.\n $n: string;\n};\n\nfunction wrapBigIntValueObject(value: bigint): BigIntValueObject {\n return { $n: `${value}` };\n}\n\nfunction unwrapBigIntValueObject(value: string): string {\n return value.replace(/\\{\\s*\"\\$n\"\\s*:\\s*\"(-?\\d+)\"\\s*\\}/g, '$1');\n}\n","import { RpcTransport } from '@solana/rpc-spec';\nimport type Dispatcher from 'undici-types/dispatcher';\n\nimport { createHttpTransport } from './http-transport';\nimport { AllowedHttpRequestHeaders } from './http-transport-headers';\nimport { isSolanaRequest } from './is-solana-request';\nimport { parseJsonWithBigInts } from './parse-json-with-bigints';\nimport { stringifyJsonWithBigints } from './stringify-json-with-bigints';\n\ntype Config = Readonly<{\n dispatcher_NODE_ONLY?: Dispatcher;\n headers?: AllowedHttpRequestHeaders;\n url: string;\n}>;\n\nexport function createHttpTransportForSolanaRpc(config: Config): RpcTransport {\n return createHttpTransport({\n ...config,\n fromJson: (rawResponse: string, payload: unknown) => {\n if (!isSolanaRequest(payload)) return JSON.parse(rawResponse);\n const response = parseJsonWithBigInts(rawResponse);\n // Error codes are always numbers.\n if (isErrorResponse(response)) {\n return { ...response, error: { ...response.error, code: Number(response.error.code) } };\n }\n return response;\n },\n toJson: (payload: unknown) =>\n isSolanaRequest(payload) ? stringifyJsonWithBigints(payload) : JSON.stringify(payload),\n });\n}\n\nfunction isErrorResponse(value: unknown): value is { error: { code: bigint } } {\n return (\n !!value &&\n typeof value === 'object' &&\n 'error' in value &&\n !!value.error &&\n typeof value.error === 'object' &&\n 'code' in value.error\n );\n}\n"]}
@@ -0,0 +1,262 @@
1
+ import { SolanaError, SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR, SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN } from '@solana/errors';
2
+ import { isJsonRpcPayload } from '@solana/rpc-spec';
3
+
4
+ // src/http-transport.ts
5
+ var DISALLOWED_HEADERS = {
6
+ accept: true,
7
+ "content-length": true,
8
+ "content-type": true
9
+ };
10
+ var FORBIDDEN_HEADERS = /* @__PURE__ */ Object.assign(
11
+ {
12
+ "accept-charset": true,
13
+ "access-control-request-headers": true,
14
+ "access-control-request-method": true,
15
+ connection: true,
16
+ "content-length": true,
17
+ cookie: true,
18
+ date: true,
19
+ dnt: true,
20
+ expect: true,
21
+ host: true,
22
+ "keep-alive": true,
23
+ origin: true,
24
+ "permissions-policy": true,
25
+ // Prefix matching is implemented in code, below.
26
+ // 'proxy-': true,
27
+ // 'sec-': true,
28
+ referer: true,
29
+ te: true,
30
+ trailer: true,
31
+ "transfer-encoding": true,
32
+ upgrade: true,
33
+ via: true
34
+ },
35
+ { "accept-encoding": true }
36
+ );
37
+ function assertIsAllowedHttpRequestHeaders(headers) {
38
+ const badHeaders = Object.keys(headers).filter((headerName) => {
39
+ const lowercaseHeaderName = headerName.toLowerCase();
40
+ return DISALLOWED_HEADERS[headerName.toLowerCase()] === true || FORBIDDEN_HEADERS[headerName.toLowerCase()] === true || lowercaseHeaderName.startsWith("proxy-") || lowercaseHeaderName.startsWith("sec-");
41
+ });
42
+ if (badHeaders.length > 0) {
43
+ throw new SolanaError(SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN, {
44
+ headers: badHeaders
45
+ });
46
+ }
47
+ }
48
+ function normalizeHeaders(headers) {
49
+ const out = {};
50
+ for (const headerName in headers) {
51
+ out[headerName.toLowerCase()] = headers[headerName];
52
+ }
53
+ return out;
54
+ }
55
+
56
+ // src/http-transport.ts
57
+ var didWarnDispatcherWasSuppliedInNonNodeEnvironment = false;
58
+ function warnDispatcherWasSuppliedInNonNodeEnvironment() {
59
+ if (didWarnDispatcherWasSuppliedInNonNodeEnvironment) {
60
+ return;
61
+ }
62
+ didWarnDispatcherWasSuppliedInNonNodeEnvironment = true;
63
+ console.warn(
64
+ "You have supplied a `Dispatcher` to `createHttpTransport()`. It has been ignored because Undici dispatchers only work in Node environments. To eliminate this warning, omit the `dispatcher_NODE_ONLY` property from your config when running in a non-Node environment."
65
+ );
66
+ }
67
+ function createHttpTransport(config) {
68
+ if (process.env.NODE_ENV !== "production" && true && "dispatcher_NODE_ONLY" in config) {
69
+ warnDispatcherWasSuppliedInNonNodeEnvironment();
70
+ }
71
+ const { fromJson, headers, toJson, url } = config;
72
+ if (process.env.NODE_ENV !== "production" && headers) {
73
+ assertIsAllowedHttpRequestHeaders(headers);
74
+ }
75
+ let dispatcherConfig;
76
+ const customHeaders = headers && normalizeHeaders(headers);
77
+ return async function makeHttpRequest({
78
+ payload,
79
+ signal
80
+ }) {
81
+ const body = toJson ? toJson(payload) : JSON.stringify(payload);
82
+ const requestInfo = {
83
+ ...dispatcherConfig,
84
+ body,
85
+ headers: {
86
+ ...customHeaders,
87
+ // Keep these headers lowercase so they will override any user-supplied headers above.
88
+ accept: "application/json",
89
+ "content-length": body.length.toString(),
90
+ "content-type": "application/json; charset=utf-8"
91
+ },
92
+ method: "POST",
93
+ signal
94
+ };
95
+ const response = await fetch(url, requestInfo);
96
+ if (!response.ok) {
97
+ throw new SolanaError(SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR, {
98
+ message: response.statusText,
99
+ statusCode: response.status
100
+ });
101
+ }
102
+ if (fromJson) {
103
+ return fromJson(await response.text(), payload);
104
+ }
105
+ return await response.json();
106
+ };
107
+ }
108
+ var SOLANA_RPC_METHODS = [
109
+ "getAccountInfo",
110
+ "getBalance",
111
+ "getBlock",
112
+ "getBlockCommitment",
113
+ "getBlockHeight",
114
+ "getBlockProduction",
115
+ "getBlocks",
116
+ "getBlocksWithLimit",
117
+ "getBlockTime",
118
+ "getClusterNodes",
119
+ "getEpochInfo",
120
+ "getEpochSchedule",
121
+ "getFeeForMessage",
122
+ "getFirstAvailableBlock",
123
+ "getGenesisHash",
124
+ "getHealth",
125
+ "getHighestSnapshotSlot",
126
+ "getIdentity",
127
+ "getInflationGovernor",
128
+ "getInflationRate",
129
+ "getInflationReward",
130
+ "getLargestAccounts",
131
+ "getLatestBlockhash",
132
+ "getLeaderSchedule",
133
+ "getMaxRetransmitSlot",
134
+ "getMaxShredInsertSlot",
135
+ "getMinimumBalanceForRentExemption",
136
+ "getMultipleAccounts",
137
+ "getProgramAccounts",
138
+ "getRecentPerformanceSamples",
139
+ "getRecentPrioritizationFees",
140
+ "getSignaturesForAddress",
141
+ "getSignatureStatuses",
142
+ "getSlot",
143
+ "getSlotLeader",
144
+ "getSlotLeaders",
145
+ "getStakeActivation",
146
+ "getStakeMinimumDelegation",
147
+ "getSupply",
148
+ "getTokenAccountBalance",
149
+ "getTokenAccountsByDelegate",
150
+ "getTokenAccountsByOwner",
151
+ "getTokenLargestAccounts",
152
+ "getTokenSupply",
153
+ "getTransaction",
154
+ "getTransactionCount",
155
+ "getVersion",
156
+ "getVoteAccounts",
157
+ "index",
158
+ "isBlockhashValid",
159
+ "minimumLedgerSlot",
160
+ "requestAirdrop",
161
+ "sendTransaction",
162
+ "simulateTransaction"
163
+ ];
164
+ function isSolanaRequest(payload) {
165
+ return isJsonRpcPayload(payload) && SOLANA_RPC_METHODS.includes(payload.method);
166
+ }
167
+
168
+ // src/parse-json-with-bigints.ts
169
+ function parseJsonWithBigInts(json) {
170
+ return JSON.parse(wrapIntegersInBigIntValueObject(json), (_, value) => {
171
+ return isBigIntValueObject(value) ? unwrapBigIntValueObject(value) : value;
172
+ });
173
+ }
174
+ function wrapIntegersInBigIntValueObject(json) {
175
+ const out = [];
176
+ let inQuote = false;
177
+ for (let ii = 0; ii < json.length; ii++) {
178
+ let isEscaped = false;
179
+ if (json[ii] === "\\") {
180
+ out.push(json[ii++]);
181
+ isEscaped = !isEscaped;
182
+ }
183
+ if (json[ii] === '"') {
184
+ out.push(json[ii]);
185
+ if (!isEscaped) {
186
+ inQuote = !inQuote;
187
+ }
188
+ continue;
189
+ }
190
+ if (!inQuote) {
191
+ const consumedNumber = consumeNumber(json, ii);
192
+ if (consumedNumber?.length) {
193
+ ii += consumedNumber.length - 1;
194
+ if (consumedNumber.match(/\.|[eE]-/)) {
195
+ out.push(consumedNumber);
196
+ } else {
197
+ out.push(wrapBigIntValueObject(consumedNumber));
198
+ }
199
+ continue;
200
+ }
201
+ }
202
+ out.push(json[ii]);
203
+ }
204
+ return out.join("");
205
+ }
206
+ function consumeNumber(json, ii) {
207
+ const JSON_NUMBER_REGEX = /^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?/;
208
+ if (!json[ii]?.match(/[-\d]/)) {
209
+ return null;
210
+ }
211
+ const numberMatch = json.slice(ii).match(JSON_NUMBER_REGEX);
212
+ return numberMatch ? numberMatch[0] : null;
213
+ }
214
+ function wrapBigIntValueObject(value) {
215
+ return `{"$n":"${value}"}`;
216
+ }
217
+ function unwrapBigIntValueObject({ $n }) {
218
+ if ($n.match(/[eE]/)) {
219
+ const [units, exponent] = $n.split(/[eE]/);
220
+ return BigInt(units) * BigInt(10) ** BigInt(exponent);
221
+ }
222
+ return BigInt($n);
223
+ }
224
+ function isBigIntValueObject(value) {
225
+ return !!value && typeof value === "object" && "$n" in value && typeof value.$n === "string";
226
+ }
227
+
228
+ // src/stringify-json-with-bigints.ts
229
+ function stringifyJsonWithBigints(value, space) {
230
+ return unwrapBigIntValueObject2(
231
+ JSON.stringify(value, (_, v) => typeof v === "bigint" ? wrapBigIntValueObject2(v) : v, space)
232
+ );
233
+ }
234
+ function wrapBigIntValueObject2(value) {
235
+ return { $n: `${value}` };
236
+ }
237
+ function unwrapBigIntValueObject2(value) {
238
+ return value.replace(/\{\s*"\$n"\s*:\s*"(-?\d+)"\s*\}/g, "$1");
239
+ }
240
+
241
+ // src/http-transport-for-solana-rpc.ts
242
+ function createHttpTransportForSolanaRpc(config) {
243
+ return createHttpTransport({
244
+ ...config,
245
+ fromJson: (rawResponse, payload) => {
246
+ if (!isSolanaRequest(payload)) return JSON.parse(rawResponse);
247
+ const response = parseJsonWithBigInts(rawResponse);
248
+ if (isErrorResponse(response)) {
249
+ return { ...response, error: { ...response.error, code: Number(response.error.code) } };
250
+ }
251
+ return response;
252
+ },
253
+ toJson: (payload) => isSolanaRequest(payload) ? stringifyJsonWithBigints(payload) : JSON.stringify(payload)
254
+ });
255
+ }
256
+ function isErrorResponse(value) {
257
+ return !!value && typeof value === "object" && "error" in value && !!value.error && typeof value.error === "object" && "code" in value.error;
258
+ }
259
+
260
+ export { createHttpTransport, createHttpTransportForSolanaRpc };
261
+ //# sourceMappingURL=index.native.mjs.map
262
+ //# sourceMappingURL=index.native.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/http-transport-headers.ts","../src/http-transport.ts","../src/is-solana-request.ts","../src/parse-json-with-bigints.ts","../src/stringify-json-with-bigints.ts","../src/http-transport-for-solana-rpc.ts"],"names":["SolanaError","unwrapBigIntValueObject","wrapBigIntValueObject"],"mappings":"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","file":"index.native.mjs","sourcesContent":["import { SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN, SolanaError } from '@solana/errors';\n\nexport type AllowedHttpRequestHeaders = Readonly<\n {\n // Someone can still sneak a forbidden header past Typescript if they do something like\n // fOo-BaR, but at that point they deserve the runtime failure.\n [K in DisallowedHeaders | ForbiddenHeaders as\n | Capitalize<Lowercase<K>> // `Foo-bar`\n | K // `Foo-Bar`\n | Lowercase<K> // `foo-bar`\n | Uncapitalize<K> // `foo-Bar`\n // `FOO-BAR`\n | Uppercase<K>]?: never;\n } & { [headerName: string]: string }\n>;\n// These are headers that we simply don't allow the developer to override because they're\n// fundamental to the operation of the JSON-RPC transport.\ntype DisallowedHeaders = 'Accept' | 'Content-Length' | 'Content-Type' | 'Solana-Client';\ntype ForbiddenHeaders =\n | 'Accept-Charset'\n /**\n * Though technically forbidden in non-Node environments, we don't have a way to target\n * TypeScript types depending on which platform you are authoring for. `Accept-Encoding` is\n * therefore omitted from the forbidden headers type, but is still a runtime error in dev mode\n * when supplied in a non-Node context.\n */\n // | 'Accept-Encoding'\n | 'Access-Control-Request-Headers'\n | 'Access-Control-Request-Method'\n | 'Connection'\n | 'Content-Length'\n | 'Cookie'\n | 'Date'\n | 'DNT'\n | 'Expect'\n | 'Host'\n | 'Keep-Alive'\n | 'Origin'\n | 'Permissions-Policy'\n | 'Referer'\n | 'TE'\n | 'Trailer'\n | 'Transfer-Encoding'\n | 'Upgrade'\n | 'Via'\n | `Proxy-${string}`\n | `Sec-${string}`;\n\n// These are headers which are fundamental to the JSON-RPC transport, and must not be modified.\nconst DISALLOWED_HEADERS: Record<string, boolean> = {\n accept: true,\n 'content-length': true,\n 'content-type': true,\n};\n// https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_header_name\nconst FORBIDDEN_HEADERS: Record<string, boolean> = /* @__PURE__ */ Object.assign(\n {\n 'accept-charset': true,\n 'access-control-request-headers': true,\n 'access-control-request-method': true,\n connection: true,\n 'content-length': true,\n cookie: true,\n date: true,\n dnt: true,\n expect: true,\n host: true,\n 'keep-alive': true,\n origin: true,\n 'permissions-policy': true,\n // Prefix matching is implemented in code, below.\n // 'proxy-': true,\n // 'sec-': true,\n referer: true,\n te: true,\n trailer: true,\n 'transfer-encoding': true,\n upgrade: true,\n via: true,\n },\n __NODEJS__ ? undefined : { 'accept-encoding': true },\n);\n\nexport function assertIsAllowedHttpRequestHeaders(\n headers: Record<string, string>,\n): asserts headers is AllowedHttpRequestHeaders {\n const badHeaders = Object.keys(headers).filter(headerName => {\n const lowercaseHeaderName = headerName.toLowerCase();\n return (\n DISALLOWED_HEADERS[headerName.toLowerCase()] === true ||\n FORBIDDEN_HEADERS[headerName.toLowerCase()] === true ||\n lowercaseHeaderName.startsWith('proxy-') ||\n lowercaseHeaderName.startsWith('sec-')\n );\n });\n if (badHeaders.length > 0) {\n throw new SolanaError(SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN, {\n headers: badHeaders,\n });\n }\n}\n\n/**\n * Lowercasing header names makes it easier to override user-supplied headers, such as those defined\n * in the `DisallowedHeaders` type.\n */\nexport function normalizeHeaders<T extends Record<string, string>>(\n headers: T,\n): { [K in string & keyof T as Lowercase<K>]: T[K] } {\n const out: Record<string, string> = {};\n for (const headerName in headers) {\n out[headerName.toLowerCase()] = headers[headerName];\n }\n return out as { [K in string & keyof T as Lowercase<K>]: T[K] };\n}\n","import { SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR, SolanaError } from '@solana/errors';\nimport { RpcResponse, RpcTransport } from '@solana/rpc-spec';\nimport type Dispatcher from 'undici-types/dispatcher';\n\nimport {\n AllowedHttpRequestHeaders,\n assertIsAllowedHttpRequestHeaders,\n normalizeHeaders,\n} from './http-transport-headers';\n\ntype Config = Readonly<{\n dispatcher_NODE_ONLY?: Dispatcher;\n fromJson?: (rawResponse: string, payload: unknown) => RpcResponse;\n headers?: AllowedHttpRequestHeaders;\n toJson?: (payload: unknown) => string;\n url: string;\n}>;\n\nlet didWarnDispatcherWasSuppliedInNonNodeEnvironment = false;\nfunction warnDispatcherWasSuppliedInNonNodeEnvironment() {\n if (didWarnDispatcherWasSuppliedInNonNodeEnvironment) {\n return;\n }\n didWarnDispatcherWasSuppliedInNonNodeEnvironment = true;\n console.warn(\n 'You have supplied a `Dispatcher` to `createHttpTransport()`. It has been ignored ' +\n 'because Undici dispatchers only work in Node environments. To eliminate this ' +\n 'warning, omit the `dispatcher_NODE_ONLY` property from your config when running in ' +\n 'a non-Node environment.',\n );\n}\n\nexport function createHttpTransport(config: Config): RpcTransport {\n if (process.env.NODE_ENV !== \"production\" && !__NODEJS__ && 'dispatcher_NODE_ONLY' in config) {\n warnDispatcherWasSuppliedInNonNodeEnvironment();\n }\n const { fromJson, headers, toJson, url } = config;\n if (process.env.NODE_ENV !== \"production\" && headers) {\n assertIsAllowedHttpRequestHeaders(headers);\n }\n let dispatcherConfig: { dispatcher: Dispatcher | undefined } | undefined;\n if (__NODEJS__ && 'dispatcher_NODE_ONLY' in config) {\n dispatcherConfig = { dispatcher: config.dispatcher_NODE_ONLY };\n }\n const customHeaders = headers && normalizeHeaders(headers);\n return async function makeHttpRequest<TResponse>({\n payload,\n signal,\n }: Parameters<RpcTransport>[0]): Promise<RpcResponse<TResponse>> {\n const body = toJson ? toJson(payload) : JSON.stringify(payload);\n const requestInfo = {\n ...dispatcherConfig,\n body,\n headers: {\n ...customHeaders,\n // Keep these headers lowercase so they will override any user-supplied headers above.\n accept: 'application/json',\n 'content-length': body.length.toString(),\n 'content-type': 'application/json; charset=utf-8',\n },\n method: 'POST',\n signal,\n };\n const response = await fetch(url, requestInfo);\n if (!response.ok) {\n throw new SolanaError(SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR, {\n message: response.statusText,\n statusCode: response.status,\n });\n }\n if (fromJson) {\n return fromJson(await response.text(), payload) as TResponse;\n }\n return await response.json();\n };\n}\n","import { isJsonRpcPayload } from '@solana/rpc-spec';\n\nconst SOLANA_RPC_METHODS = [\n 'getAccountInfo',\n 'getBalance',\n 'getBlock',\n 'getBlockCommitment',\n 'getBlockHeight',\n 'getBlockProduction',\n 'getBlocks',\n 'getBlocksWithLimit',\n 'getBlockTime',\n 'getClusterNodes',\n 'getEpochInfo',\n 'getEpochSchedule',\n 'getFeeForMessage',\n 'getFirstAvailableBlock',\n 'getGenesisHash',\n 'getHealth',\n 'getHighestSnapshotSlot',\n 'getIdentity',\n 'getInflationGovernor',\n 'getInflationRate',\n 'getInflationReward',\n 'getLargestAccounts',\n 'getLatestBlockhash',\n 'getLeaderSchedule',\n 'getMaxRetransmitSlot',\n 'getMaxShredInsertSlot',\n 'getMinimumBalanceForRentExemption',\n 'getMultipleAccounts',\n 'getProgramAccounts',\n 'getRecentPerformanceSamples',\n 'getRecentPrioritizationFees',\n 'getSignaturesForAddress',\n 'getSignatureStatuses',\n 'getSlot',\n 'getSlotLeader',\n 'getSlotLeaders',\n 'getStakeActivation',\n 'getStakeMinimumDelegation',\n 'getSupply',\n 'getTokenAccountBalance',\n 'getTokenAccountsByDelegate',\n 'getTokenAccountsByOwner',\n 'getTokenLargestAccounts',\n 'getTokenSupply',\n 'getTransaction',\n 'getTransactionCount',\n 'getVersion',\n 'getVoteAccounts',\n 'index',\n 'isBlockhashValid',\n 'minimumLedgerSlot',\n 'requestAirdrop',\n 'sendTransaction',\n 'simulateTransaction',\n] as const;\n\n/**\n * Helper function that checks if a given `RpcRequest` comes from the Solana RPC API.\n */\nexport function isSolanaRequest(payload: unknown): payload is Readonly<{\n jsonrpc: '2.0';\n method: (typeof SOLANA_RPC_METHODS)[number];\n params: unknown;\n}> {\n return isJsonRpcPayload(payload) && (SOLANA_RPC_METHODS as readonly string[]).includes(payload.method);\n}\n","/**\n * This function is a replacement for `JSON.parse` that can handle large\n * unsafe integers by parsing them as BigInts. It transforms every\n * numerical value into a BigInt without loss of precision.\n */\nexport function parseJsonWithBigInts(json: string): unknown {\n return JSON.parse(wrapIntegersInBigIntValueObject(json), (_, value) => {\n return isBigIntValueObject(value) ? unwrapBigIntValueObject(value) : value;\n });\n}\n\nfunction wrapIntegersInBigIntValueObject(json: string): string {\n const out = [];\n let inQuote = false;\n for (let ii = 0; ii < json.length; ii++) {\n let isEscaped = false;\n if (json[ii] === '\\\\') {\n out.push(json[ii++]);\n isEscaped = !isEscaped;\n }\n if (json[ii] === '\"') {\n out.push(json[ii]);\n if (!isEscaped) {\n inQuote = !inQuote;\n }\n continue;\n }\n if (!inQuote) {\n const consumedNumber = consumeNumber(json, ii);\n if (consumedNumber?.length) {\n ii += consumedNumber.length - 1;\n // Don't wrap numbers that contain a decimal point or a negative exponent.\n if (consumedNumber.match(/\\.|[eE]-/)) {\n out.push(consumedNumber);\n } else {\n out.push(wrapBigIntValueObject(consumedNumber));\n }\n continue;\n }\n }\n out.push(json[ii]);\n }\n\n return out.join('');\n}\n\nfunction consumeNumber(json: string, ii: number): string | null {\n /** @see https://stackoverflow.com/a/13340826/11440277 */\n const JSON_NUMBER_REGEX = /^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?/;\n\n // Stop early if the first character isn't a digit or a minus sign.\n if (!json[ii]?.match(/[-\\d]/)) {\n return null;\n }\n\n // Otherwise, check if the next characters form a valid JSON number.\n const numberMatch = json.slice(ii).match(JSON_NUMBER_REGEX);\n return numberMatch ? numberMatch[0] : null;\n}\n\ntype BigIntValueObject = {\n // `$` implies 'this is a value object'.\n // `n` implies 'interpret the value as a bigint'.\n $n: string;\n};\n\nfunction wrapBigIntValueObject(value: string): string {\n return `{\"$n\":\"${value}\"}`;\n}\n\nfunction unwrapBigIntValueObject({ $n }: BigIntValueObject): bigint {\n if ($n.match(/[eE]/)) {\n const [units, exponent] = $n.split(/[eE]/);\n return BigInt(units) * BigInt(10) ** BigInt(exponent);\n }\n return BigInt($n);\n}\n\nfunction isBigIntValueObject(value: unknown): value is BigIntValueObject {\n return !!value && typeof value === 'object' && '$n' in value && typeof value.$n === 'string';\n}\n","/**\n * Transforms a value into a JSON string, whilst rendering bigints as large unsafe integers.\n */\nexport function stringifyJsonWithBigints(value: unknown, space?: number | string): string {\n return unwrapBigIntValueObject(\n JSON.stringify(value, (_, v) => (typeof v === 'bigint' ? wrapBigIntValueObject(v) : v), space),\n );\n}\n\ntype BigIntValueObject = {\n // `$` implies 'this is a value object'.\n // `n` implies 'interpret the value as a bigint'.\n $n: string;\n};\n\nfunction wrapBigIntValueObject(value: bigint): BigIntValueObject {\n return { $n: `${value}` };\n}\n\nfunction unwrapBigIntValueObject(value: string): string {\n return value.replace(/\\{\\s*\"\\$n\"\\s*:\\s*\"(-?\\d+)\"\\s*\\}/g, '$1');\n}\n","import { RpcTransport } from '@solana/rpc-spec';\nimport type Dispatcher from 'undici-types/dispatcher';\n\nimport { createHttpTransport } from './http-transport';\nimport { AllowedHttpRequestHeaders } from './http-transport-headers';\nimport { isSolanaRequest } from './is-solana-request';\nimport { parseJsonWithBigInts } from './parse-json-with-bigints';\nimport { stringifyJsonWithBigints } from './stringify-json-with-bigints';\n\ntype Config = Readonly<{\n dispatcher_NODE_ONLY?: Dispatcher;\n headers?: AllowedHttpRequestHeaders;\n url: string;\n}>;\n\nexport function createHttpTransportForSolanaRpc(config: Config): RpcTransport {\n return createHttpTransport({\n ...config,\n fromJson: (rawResponse: string, payload: unknown) => {\n if (!isSolanaRequest(payload)) return JSON.parse(rawResponse);\n const response = parseJsonWithBigInts(rawResponse);\n // Error codes are always numbers.\n if (isErrorResponse(response)) {\n return { ...response, error: { ...response.error, code: Number(response.error.code) } };\n }\n return response;\n },\n toJson: (payload: unknown) =>\n isSolanaRequest(payload) ? stringifyJsonWithBigints(payload) : JSON.stringify(payload),\n });\n}\n\nfunction isErrorResponse(value: unknown): value is { error: { code: bigint } } {\n return (\n !!value &&\n typeof value === 'object' &&\n 'error' in value &&\n !!value.error &&\n typeof value.error === 'object' &&\n 'code' in value.error\n );\n}\n"]}