@solana/rpc-transport-http 2.0.0-rc.3 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.browser.cjs +1 -11
- package/dist/index.browser.cjs.map +1 -1
- package/dist/index.browser.mjs +1 -11
- package/dist/index.browser.mjs.map +1 -1
- package/dist/index.native.mjs +1 -11
- package/dist/index.native.mjs.map +1 -1
- package/dist/index.node.cjs +1 -11
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.mjs +1 -11
- package/dist/index.node.mjs.map +1 -1
- package/dist/types/http-transport-for-solana-rpc.d.ts.map +1 -1
- package/package.json +4 -12
package/dist/index.browser.cjs
CHANGED
|
@@ -171,20 +171,10 @@ function isSolanaRequest(payload) {
|
|
|
171
171
|
function createHttpTransportForSolanaRpc(config) {
|
|
172
172
|
return createHttpTransport({
|
|
173
173
|
...config,
|
|
174
|
-
fromJson: (rawResponse, payload) =>
|
|
175
|
-
if (!isSolanaRequest(payload)) return JSON.parse(rawResponse);
|
|
176
|
-
const response = rpcSpecTypes.parseJsonWithBigInts(rawResponse);
|
|
177
|
-
if (isErrorResponse(response)) {
|
|
178
|
-
return { ...response, error: { ...response.error, code: Number(response.error.code) } };
|
|
179
|
-
}
|
|
180
|
-
return response;
|
|
181
|
-
},
|
|
174
|
+
fromJson: (rawResponse, payload) => isSolanaRequest(payload) ? rpcSpecTypes.parseJsonWithBigInts(rawResponse) : JSON.parse(rawResponse),
|
|
182
175
|
toJson: (payload) => isSolanaRequest(payload) ? rpcSpecTypes.stringifyJsonWithBigints(payload) : JSON.stringify(payload)
|
|
183
176
|
});
|
|
184
177
|
}
|
|
185
|
-
function isErrorResponse(value) {
|
|
186
|
-
return !!value && typeof value === "object" && "error" in value && !!value.error && typeof value.error === "object" && "code" in value.error;
|
|
187
|
-
}
|
|
188
178
|
|
|
189
179
|
exports.createHttpTransport = createHttpTransport;
|
|
190
180
|
exports.createHttpTransportForSolanaRpc = createHttpTransportForSolanaRpc;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/http-transport-headers.ts","../src/http-transport.ts","../src/is-solana-request.ts","../src/http-transport-for-solana-rpc.ts"],"names":["SolanaError","SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN","SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR","isJsonRpcPayload","parseJsonWithBigInts","stringifyJsonWithBigints"],"mappings":";;;;;;;AAiDA,IAAM,kBAA8C,GAAA;AAAA,EAChD,MAAQ,EAAA,IAAA;AAAA,EACR,gBAAkB,EAAA,IAAA;AAAA,EAClB,cAAgB,EAAA,IAAA;AACpB,CAAA,CAAA;AAEA,IAAM,oCAAoE,MAAA,CAAA,MAAA;AAAA,EACtE;AAAA,IACI,gBAAkB,EAAA,IAAA;AAAA,IAClB,gCAAkC,EAAA,IAAA;AAAA,IAClC,+BAAiC,EAAA,IAAA;AAAA,IACjC,UAAY,EAAA,IAAA;AAAA,IACZ,gBAAkB,EAAA,IAAA;AAAA,IAClB,MAAQ,EAAA,IAAA;AAAA,IACR,IAAM,EAAA,IAAA;AAAA,IACN,GAAK,EAAA,IAAA;AAAA,IACL,MAAQ,EAAA,IAAA;AAAA,IACR,IAAM,EAAA,IAAA;AAAA,IACN,YAAc,EAAA,IAAA;AAAA,IACd,MAAQ,EAAA,IAAA;AAAA,IACR,oBAAsB,EAAA,IAAA;AAAA;AAAA;AAAA;AAAA,IAItB,OAAS,EAAA,IAAA;AAAA,IACT,EAAI,EAAA,IAAA;AAAA,IACJ,OAAS,EAAA,IAAA;AAAA,IACT,mBAAqB,EAAA,IAAA;AAAA,IACrB,OAAS,EAAA,IAAA;AAAA,IACT,GAAK,EAAA,IAAA;AAAA,GACT;AAAA,EACyB,EAAE,iBAAA,EAAmB,IAAK,EAAA;AACvD,CAAA,CAAA;AAEO,SAAS,kCACZ,OAC4C,EAAA;AAC5C,EAAA,MAAM,aAAa,MAAO,CAAA,IAAA,CAAK,OAAO,CAAA,CAAE,OAAO,CAAc,UAAA,KAAA;AACzD,IAAM,MAAA,mBAAA,GAAsB,WAAW,WAAY,EAAA,CAAA;AACnD,IAAA,OACI,mBAAmB,UAAW,CAAA,WAAA,EAAa,CAAM,KAAA,IAAA,IACjD,kBAAkB,UAAW,CAAA,WAAA,EAAa,CAAA,KAAM,QAChD,mBAAoB,CAAA,UAAA,CAAW,QAAQ,CACvC,IAAA,mBAAA,CAAoB,WAAW,MAAM,CAAA,CAAA;AAAA,GAE5C,CAAA,CAAA;AACD,EAAI,IAAA,UAAA,CAAW,SAAS,CAAG,EAAA;AACvB,IAAM,MAAA,IAAIA,mBAAYC,yDAAoD,EAAA;AAAA,MACtE,OAAS,EAAA,UAAA;AAAA,KACZ,CAAA,CAAA;AAAA,GACL;AACJ,CAAA;AAMO,SAAS,iBACZ,OACiD,EAAA;AACjD,EAAA,MAAM,MAA8B,EAAC,CAAA;AACrC,EAAA,KAAA,MAAW,cAAc,OAAS,EAAA;AAC9B,IAAA,GAAA,CAAI,UAAW,CAAA,WAAA,EAAa,CAAA,GAAI,QAAQ,UAAU,CAAA,CAAA;AAAA,GACtD;AACA,EAAO,OAAA,GAAA,CAAA;AACX,CAAA;;;AC/FA,IAAI,gDAAmD,GAAA,KAAA,CAAA;AACvD,SAAS,6CAAgD,GAAA;AACrD,EAAA,IAAI,gDAAkD,EAAA;AAClD,IAAA,OAAA;AAAA,GACJ;AACA,EAAmD,gDAAA,GAAA,IAAA,CAAA;AACnD,EAAQ,OAAA,CAAA,IAAA;AAAA,IACJ,0QAAA;AAAA,GAIJ,CAAA;AACJ,CAAA;AAEO,SAAS,oBAAoB,MAA8B,EAAA;AAC9D,EAAA,IAAI,OAAyB,CAAA,GAAA,CAAA,QAAA,KAAA,YAAA,IAAgB,IAAe,IAAA,sBAAA,IAA0B,MAAQ,EAAA;AAC1F,IAA8C,6CAAA,EAAA,CAAA;AAAA,GAClD;AACA,EAAA,MAAM,EAAE,QAAA,EAAU,OAAS,EAAA,MAAA,EAAQ,KAAQ,GAAA,MAAA,CAAA;AAC3C,EAAI,IAAA,OAAA,CAAA,GAAA,CAAA,QAAA,KAAyB,gBAAgB,OAAS,EAAA;AAClD,IAAA,iCAAA,CAAkC,OAAO,CAAA,CAAA;AAAA,GAC7C;AACA,EAAI,IAAA,gBAAA,CAAA;AAIJ,EAAM,MAAA,aAAA,GAAgB,OAAW,IAAA,gBAAA,CAAiB,OAAO,CAAA,CAAA;AACzD,EAAA,OAAO,eAAe,eAA2B,CAAA;AAAA,IAC7C,OAAA;AAAA,IACA,MAAA;AAAA,GAC6D,EAAA;AAC7D,IAAA,MAAM,OAAO,MAAS,GAAA,MAAA,CAAO,OAAO,CAAI,GAAA,IAAA,CAAK,UAAU,OAAO,CAAA,CAAA;AAC9D,IAAA,MAAM,WAAc,GAAA;AAAA,MAChB,GAAG,gBAAA;AAAA,MACH,IAAA;AAAA,MACA,OAAS,EAAA;AAAA,QACL,GAAG,aAAA;AAAA;AAAA,QAEH,MAAQ,EAAA,kBAAA;AAAA,QACR,gBAAA,EAAkB,IAAK,CAAA,MAAA,CAAO,QAAS,EAAA;AAAA,QACvC,cAAgB,EAAA,iCAAA;AAAA,OACpB;AAAA,MACA,MAAQ,EAAA,MAAA;AAAA,MACR,MAAA;AAAA,KACJ,CAAA;AACA,IAAA,MAAM,QAAW,GAAA,MAAM,KAAM,CAAA,GAAA,EAAK,WAAW,CAAA,CAAA;AAC7C,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AACd,MAAM,MAAA,IAAID,mBAAYE,8CAAyC,EAAA;AAAA,QAC3D,SAAS,QAAS,CAAA,UAAA;AAAA,QAClB,YAAY,QAAS,CAAA,MAAA;AAAA,OACxB,CAAA,CAAA;AAAA,KACL;AACA,IAAA,IAAI,QAAU,EAAA;AACV,MAAA,OAAO,QAAS,CAAA,MAAM,QAAS,CAAA,IAAA,IAAQ,OAAO,CAAA,CAAA;AAAA,KAClD;AACA,IAAO,OAAA,MAAM,SAAS,IAAK,EAAA,CAAA;AAAA,GAC/B,CAAA;AACJ,CAAA;AC1EA,IAAM,kBAAqB,GAAA;AAAA,EACvB,gBAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,oBAAA;AAAA,EACA,gBAAA;AAAA,EACA,oBAAA;AAAA,EACA,WAAA;AAAA,EACA,oBAAA;AAAA,EACA,cAAA;AAAA,EACA,iBAAA;AAAA,EACA,cAAA;AAAA,EACA,kBAAA;AAAA,EACA,kBAAA;AAAA,EACA,wBAAA;AAAA,EACA,gBAAA;AAAA,EACA,WAAA;AAAA,EACA,wBAAA;AAAA,EACA,aAAA;AAAA,EACA,sBAAA;AAAA,EACA,kBAAA;AAAA,EACA,oBAAA;AAAA,EACA,oBAAA;AAAA,EACA,oBAAA;AAAA,EACA,mBAAA;AAAA,EACA,sBAAA;AAAA,EACA,uBAAA;AAAA,EACA,mCAAA;AAAA,EACA,qBAAA;AAAA,EACA,oBAAA;AAAA,EACA,6BAAA;AAAA,EACA,6BAAA;AAAA,EACA,yBAAA;AAAA,EACA,sBAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA,gBAAA;AAAA,EACA,2BAAA;AAAA,EACA,WAAA;AAAA,EACA,wBAAA;AAAA,EACA,4BAAA;AAAA,EACA,yBAAA;AAAA,EACA,yBAAA;AAAA,EACA,gBAAA;AAAA,EACA,gBAAA;AAAA,EACA,qBAAA;AAAA,EACA,YAAA;AAAA,EACA,iBAAA;AAAA,EACA,OAAA;AAAA,EACA,kBAAA;AAAA,EACA,mBAAA;AAAA,EACA,gBAAA;AAAA,EACA,iBAAA;AAAA,EACA,qBAAA;AACJ,CAAA,CAAA;AAKO,SAAS,gBAAgB,OAI7B,EAAA;AACC,EAAA,OAAOC,yBAAiB,OAAO,CAAA,IAAM,kBAAyC,CAAA,QAAA,CAAS,QAAQ,MAAM,CAAA,CAAA;AACzG,CAAA;;;ACrDO,SAAS,gCAAgC,MAA8B,EAAA;AAC1E,EAAA,OAAO,mBAAoB,CAAA;AAAA,IACvB,GAAG,MAAA;AAAA,IACH,QAAA,EAAU,CAAC,WAAA,EAAqB,OAAqB,KAAA;AACjD,MAAA,IAAI,CAAC,eAAgB,CAAA,OAAO,GAAU,OAAA,IAAA,CAAK,MAAM,WAAW,CAAA,CAAA;AAC5D,MAAM,MAAA,QAAA,GAAWC,kCAAqB,WAAW,CAAA,CAAA;AAEjD,MAAI,IAAA,eAAA,CAAgB,QAAQ,CAAG,EAAA;AAC3B,QAAA,OAAO,EAAE,GAAG,QAAU,EAAA,KAAA,EAAO,EAAE,GAAG,QAAA,CAAS,KAAO,EAAA,IAAA,EAAM,MAAO,CAAA,QAAA,CAAS,KAAM,CAAA,IAAI,GAAI,EAAA,CAAA;AAAA,OAC1F;AACA,MAAO,OAAA,QAAA,CAAA;AAAA,KACX;AAAA,IACA,MAAA,EAAQ,CAAC,OAAA,KACL,eAAgB,CAAA,OAAO,CAAI,GAAAC,qCAAA,CAAyB,OAAO,CAAA,GAAI,IAAK,CAAA,SAAA,CAAU,OAAO,CAAA;AAAA,GAC5F,CAAA,CAAA;AACL,CAAA;AAEA,SAAS,gBAAgB,KAAsD,EAAA;AAC3E,EAAA,OACI,CAAC,CAAC,KAAA,IACF,OAAO,KAAA,KAAU,YACjB,OAAW,IAAA,KAAA,IACX,CAAC,CAAC,MAAM,KACR,IAAA,OAAO,MAAM,KAAU,KAAA,QAAA,IACvB,UAAU,KAAM,CAAA,KAAA,CAAA;AAExB","file":"index.browser.cjs","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 type { RpcTransport } from '@solana/rpc-spec';\nimport type { RpcResponse } from '@solana/rpc-spec-types';\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 '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","import { RpcTransport } from '@solana/rpc-spec';\nimport { parseJsonWithBigInts, stringifyJsonWithBigints } from '@solana/rpc-spec-types';\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';\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/http-transport-headers.ts","../src/http-transport.ts","../src/is-solana-request.ts","../src/http-transport-for-solana-rpc.ts"],"names":["SolanaError","SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN","SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR","isJsonRpcPayload","parseJsonWithBigInts","stringifyJsonWithBigints"],"mappings":"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","file":"index.browser.cjs","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 type { RpcTransport } from '@solana/rpc-spec';\nimport type { RpcResponse } from '@solana/rpc-spec-types';\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 '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","import { RpcTransport } from '@solana/rpc-spec';\nimport { parseJsonWithBigInts, stringifyJsonWithBigints } from '@solana/rpc-spec-types';\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';\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 isSolanaRequest(payload) ? parseJsonWithBigInts(rawResponse) : JSON.parse(rawResponse),\n toJson: (payload: unknown) =>\n isSolanaRequest(payload) ? stringifyJsonWithBigints(payload) : JSON.stringify(payload),\n });\n}\n"]}
|
package/dist/index.browser.mjs
CHANGED
|
@@ -169,20 +169,10 @@ function isSolanaRequest(payload) {
|
|
|
169
169
|
function createHttpTransportForSolanaRpc(config) {
|
|
170
170
|
return createHttpTransport({
|
|
171
171
|
...config,
|
|
172
|
-
fromJson: (rawResponse, payload) =>
|
|
173
|
-
if (!isSolanaRequest(payload)) return JSON.parse(rawResponse);
|
|
174
|
-
const response = parseJsonWithBigInts(rawResponse);
|
|
175
|
-
if (isErrorResponse(response)) {
|
|
176
|
-
return { ...response, error: { ...response.error, code: Number(response.error.code) } };
|
|
177
|
-
}
|
|
178
|
-
return response;
|
|
179
|
-
},
|
|
172
|
+
fromJson: (rawResponse, payload) => isSolanaRequest(payload) ? parseJsonWithBigInts(rawResponse) : JSON.parse(rawResponse),
|
|
180
173
|
toJson: (payload) => isSolanaRequest(payload) ? stringifyJsonWithBigints(payload) : JSON.stringify(payload)
|
|
181
174
|
});
|
|
182
175
|
}
|
|
183
|
-
function isErrorResponse(value) {
|
|
184
|
-
return !!value && typeof value === "object" && "error" in value && !!value.error && typeof value.error === "object" && "code" in value.error;
|
|
185
|
-
}
|
|
186
176
|
|
|
187
177
|
export { createHttpTransport, createHttpTransportForSolanaRpc };
|
|
188
178
|
//# sourceMappingURL=index.browser.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/http-transport-headers.ts","../src/http-transport.ts","../src/is-solana-request.ts","../src/http-transport-for-solana-rpc.ts"],"names":["SolanaError"],"mappings":";;;;;AAiDA,IAAM,kBAA8C,GAAA;AAAA,EAChD,MAAQ,EAAA,IAAA;AAAA,EACR,gBAAkB,EAAA,IAAA;AAAA,EAClB,cAAgB,EAAA,IAAA;AACpB,CAAA,CAAA;AAEA,IAAM,oCAAoE,MAAA,CAAA,MAAA;AAAA,EACtE;AAAA,IACI,gBAAkB,EAAA,IAAA;AAAA,IAClB,gCAAkC,EAAA,IAAA;AAAA,IAClC,+BAAiC,EAAA,IAAA;AAAA,IACjC,UAAY,EAAA,IAAA;AAAA,IACZ,gBAAkB,EAAA,IAAA;AAAA,IAClB,MAAQ,EAAA,IAAA;AAAA,IACR,IAAM,EAAA,IAAA;AAAA,IACN,GAAK,EAAA,IAAA;AAAA,IACL,MAAQ,EAAA,IAAA;AAAA,IACR,IAAM,EAAA,IAAA;AAAA,IACN,YAAc,EAAA,IAAA;AAAA,IACd,MAAQ,EAAA,IAAA;AAAA,IACR,oBAAsB,EAAA,IAAA;AAAA;AAAA;AAAA;AAAA,IAItB,OAAS,EAAA,IAAA;AAAA,IACT,EAAI,EAAA,IAAA;AAAA,IACJ,OAAS,EAAA,IAAA;AAAA,IACT,mBAAqB,EAAA,IAAA;AAAA,IACrB,OAAS,EAAA,IAAA;AAAA,IACT,GAAK,EAAA,IAAA;AAAA,GACT;AAAA,EACyB,EAAE,iBAAA,EAAmB,IAAK,EAAA;AACvD,CAAA,CAAA;AAEO,SAAS,kCACZ,OAC4C,EAAA;AAC5C,EAAA,MAAM,aAAa,MAAO,CAAA,IAAA,CAAK,OAAO,CAAA,CAAE,OAAO,CAAc,UAAA,KAAA;AACzD,IAAM,MAAA,mBAAA,GAAsB,WAAW,WAAY,EAAA,CAAA;AACnD,IAAA,OACI,mBAAmB,UAAW,CAAA,WAAA,EAAa,CAAM,KAAA,IAAA,IACjD,kBAAkB,UAAW,CAAA,WAAA,EAAa,CAAA,KAAM,QAChD,mBAAoB,CAAA,UAAA,CAAW,QAAQ,CACvC,IAAA,mBAAA,CAAoB,WAAW,MAAM,CAAA,CAAA;AAAA,GAE5C,CAAA,CAAA;AACD,EAAI,IAAA,UAAA,CAAW,SAAS,CAAG,EAAA;AACvB,IAAM,MAAA,IAAI,YAAY,kDAAoD,EAAA;AAAA,MACtE,OAAS,EAAA,UAAA;AAAA,KACZ,CAAA,CAAA;AAAA,GACL;AACJ,CAAA;AAMO,SAAS,iBACZ,OACiD,EAAA;AACjD,EAAA,MAAM,MAA8B,EAAC,CAAA;AACrC,EAAA,KAAA,MAAW,cAAc,OAAS,EAAA;AAC9B,IAAA,GAAA,CAAI,UAAW,CAAA,WAAA,EAAa,CAAA,GAAI,QAAQ,UAAU,CAAA,CAAA;AAAA,GACtD;AACA,EAAO,OAAA,GAAA,CAAA;AACX,CAAA;;;AC/FA,IAAI,gDAAmD,GAAA,KAAA,CAAA;AACvD,SAAS,6CAAgD,GAAA;AACrD,EAAA,IAAI,gDAAkD,EAAA;AAClD,IAAA,OAAA;AAAA,GACJ;AACA,EAAmD,gDAAA,GAAA,IAAA,CAAA;AACnD,EAAQ,OAAA,CAAA,IAAA;AAAA,IACJ,0QAAA;AAAA,GAIJ,CAAA;AACJ,CAAA;AAEO,SAAS,oBAAoB,MAA8B,EAAA;AAC9D,EAAA,IAAI,OAAyB,CAAA,GAAA,CAAA,QAAA,KAAA,YAAA,IAAgB,IAAe,IAAA,sBAAA,IAA0B,MAAQ,EAAA;AAC1F,IAA8C,6CAAA,EAAA,CAAA;AAAA,GAClD;AACA,EAAA,MAAM,EAAE,QAAA,EAAU,OAAS,EAAA,MAAA,EAAQ,KAAQ,GAAA,MAAA,CAAA;AAC3C,EAAI,IAAA,OAAA,CAAA,GAAA,CAAA,QAAA,KAAyB,gBAAgB,OAAS,EAAA;AAClD,IAAA,iCAAA,CAAkC,OAAO,CAAA,CAAA;AAAA,GAC7C;AACA,EAAI,IAAA,gBAAA,CAAA;AAIJ,EAAM,MAAA,aAAA,GAAgB,OAAW,IAAA,gBAAA,CAAiB,OAAO,CAAA,CAAA;AACzD,EAAA,OAAO,eAAe,eAA2B,CAAA;AAAA,IAC7C,OAAA;AAAA,IACA,MAAA;AAAA,GAC6D,EAAA;AAC7D,IAAA,MAAM,OAAO,MAAS,GAAA,MAAA,CAAO,OAAO,CAAI,GAAA,IAAA,CAAK,UAAU,OAAO,CAAA,CAAA;AAC9D,IAAA,MAAM,WAAc,GAAA;AAAA,MAChB,GAAG,gBAAA;AAAA,MACH,IAAA;AAAA,MACA,OAAS,EAAA;AAAA,QACL,GAAG,aAAA;AAAA;AAAA,QAEH,MAAQ,EAAA,kBAAA;AAAA,QACR,gBAAA,EAAkB,IAAK,CAAA,MAAA,CAAO,QAAS,EAAA;AAAA,QACvC,cAAgB,EAAA,iCAAA;AAAA,OACpB;AAAA,MACA,MAAQ,EAAA,MAAA;AAAA,MACR,MAAA;AAAA,KACJ,CAAA;AACA,IAAA,MAAM,QAAW,GAAA,MAAM,KAAM,CAAA,GAAA,EAAK,WAAW,CAAA,CAAA;AAC7C,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AACd,MAAM,MAAA,IAAIA,YAAY,uCAAyC,EAAA;AAAA,QAC3D,SAAS,QAAS,CAAA,UAAA;AAAA,QAClB,YAAY,QAAS,CAAA,MAAA;AAAA,OACxB,CAAA,CAAA;AAAA,KACL;AACA,IAAA,IAAI,QAAU,EAAA;AACV,MAAA,OAAO,QAAS,CAAA,MAAM,QAAS,CAAA,IAAA,IAAQ,OAAO,CAAA,CAAA;AAAA,KAClD;AACA,IAAO,OAAA,MAAM,SAAS,IAAK,EAAA,CAAA;AAAA,GAC/B,CAAA;AACJ,CAAA;AC1EA,IAAM,kBAAqB,GAAA;AAAA,EACvB,gBAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,oBAAA;AAAA,EACA,gBAAA;AAAA,EACA,oBAAA;AAAA,EACA,WAAA;AAAA,EACA,oBAAA;AAAA,EACA,cAAA;AAAA,EACA,iBAAA;AAAA,EACA,cAAA;AAAA,EACA,kBAAA;AAAA,EACA,kBAAA;AAAA,EACA,wBAAA;AAAA,EACA,gBAAA;AAAA,EACA,WAAA;AAAA,EACA,wBAAA;AAAA,EACA,aAAA;AAAA,EACA,sBAAA;AAAA,EACA,kBAAA;AAAA,EACA,oBAAA;AAAA,EACA,oBAAA;AAAA,EACA,oBAAA;AAAA,EACA,mBAAA;AAAA,EACA,sBAAA;AAAA,EACA,uBAAA;AAAA,EACA,mCAAA;AAAA,EACA,qBAAA;AAAA,EACA,oBAAA;AAAA,EACA,6BAAA;AAAA,EACA,6BAAA;AAAA,EACA,yBAAA;AAAA,EACA,sBAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA,gBAAA;AAAA,EACA,2BAAA;AAAA,EACA,WAAA;AAAA,EACA,wBAAA;AAAA,EACA,4BAAA;AAAA,EACA,yBAAA;AAAA,EACA,yBAAA;AAAA,EACA,gBAAA;AAAA,EACA,gBAAA;AAAA,EACA,qBAAA;AAAA,EACA,YAAA;AAAA,EACA,iBAAA;AAAA,EACA,OAAA;AAAA,EACA,kBAAA;AAAA,EACA,mBAAA;AAAA,EACA,gBAAA;AAAA,EACA,iBAAA;AAAA,EACA,qBAAA;AACJ,CAAA,CAAA;AAKO,SAAS,gBAAgB,OAI7B,EAAA;AACC,EAAA,OAAO,iBAAiB,OAAO,CAAA,IAAM,kBAAyC,CAAA,QAAA,CAAS,QAAQ,MAAM,CAAA,CAAA;AACzG,CAAA;;;ACrDO,SAAS,gCAAgC,MAA8B,EAAA;AAC1E,EAAA,OAAO,mBAAoB,CAAA;AAAA,IACvB,GAAG,MAAA;AAAA,IACH,QAAA,EAAU,CAAC,WAAA,EAAqB,OAAqB,KAAA;AACjD,MAAA,IAAI,CAAC,eAAgB,CAAA,OAAO,GAAU,OAAA,IAAA,CAAK,MAAM,WAAW,CAAA,CAAA;AAC5D,MAAM,MAAA,QAAA,GAAW,qBAAqB,WAAW,CAAA,CAAA;AAEjD,MAAI,IAAA,eAAA,CAAgB,QAAQ,CAAG,EAAA;AAC3B,QAAA,OAAO,EAAE,GAAG,QAAU,EAAA,KAAA,EAAO,EAAE,GAAG,QAAA,CAAS,KAAO,EAAA,IAAA,EAAM,MAAO,CAAA,QAAA,CAAS,KAAM,CAAA,IAAI,GAAI,EAAA,CAAA;AAAA,OAC1F;AACA,MAAO,OAAA,QAAA,CAAA;AAAA,KACX;AAAA,IACA,MAAA,EAAQ,CAAC,OAAA,KACL,eAAgB,CAAA,OAAO,CAAI,GAAA,wBAAA,CAAyB,OAAO,CAAA,GAAI,IAAK,CAAA,SAAA,CAAU,OAAO,CAAA;AAAA,GAC5F,CAAA,CAAA;AACL,CAAA;AAEA,SAAS,gBAAgB,KAAsD,EAAA;AAC3E,EAAA,OACI,CAAC,CAAC,KAAA,IACF,OAAO,KAAA,KAAU,YACjB,OAAW,IAAA,KAAA,IACX,CAAC,CAAC,MAAM,KACR,IAAA,OAAO,MAAM,KAAU,KAAA,QAAA,IACvB,UAAU,KAAM,CAAA,KAAA,CAAA;AAExB","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 type { RpcTransport } from '@solana/rpc-spec';\nimport type { RpcResponse } from '@solana/rpc-spec-types';\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 '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","import { RpcTransport } from '@solana/rpc-spec';\nimport { parseJsonWithBigInts, stringifyJsonWithBigints } from '@solana/rpc-spec-types';\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';\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/http-transport-headers.ts","../src/http-transport.ts","../src/is-solana-request.ts","../src/http-transport-for-solana-rpc.ts"],"names":["SolanaError"],"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 type { RpcTransport } from '@solana/rpc-spec';\nimport type { RpcResponse } from '@solana/rpc-spec-types';\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 '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","import { RpcTransport } from '@solana/rpc-spec';\nimport { parseJsonWithBigInts, stringifyJsonWithBigints } from '@solana/rpc-spec-types';\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';\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 isSolanaRequest(payload) ? parseJsonWithBigInts(rawResponse) : JSON.parse(rawResponse),\n toJson: (payload: unknown) =>\n isSolanaRequest(payload) ? stringifyJsonWithBigints(payload) : JSON.stringify(payload),\n });\n}\n"]}
|
package/dist/index.native.mjs
CHANGED
|
@@ -169,20 +169,10 @@ function isSolanaRequest(payload) {
|
|
|
169
169
|
function createHttpTransportForSolanaRpc(config) {
|
|
170
170
|
return createHttpTransport({
|
|
171
171
|
...config,
|
|
172
|
-
fromJson: (rawResponse, payload) =>
|
|
173
|
-
if (!isSolanaRequest(payload)) return JSON.parse(rawResponse);
|
|
174
|
-
const response = parseJsonWithBigInts(rawResponse);
|
|
175
|
-
if (isErrorResponse(response)) {
|
|
176
|
-
return { ...response, error: { ...response.error, code: Number(response.error.code) } };
|
|
177
|
-
}
|
|
178
|
-
return response;
|
|
179
|
-
},
|
|
172
|
+
fromJson: (rawResponse, payload) => isSolanaRequest(payload) ? parseJsonWithBigInts(rawResponse) : JSON.parse(rawResponse),
|
|
180
173
|
toJson: (payload) => isSolanaRequest(payload) ? stringifyJsonWithBigints(payload) : JSON.stringify(payload)
|
|
181
174
|
});
|
|
182
175
|
}
|
|
183
|
-
function isErrorResponse(value) {
|
|
184
|
-
return !!value && typeof value === "object" && "error" in value && !!value.error && typeof value.error === "object" && "code" in value.error;
|
|
185
|
-
}
|
|
186
176
|
|
|
187
177
|
export { createHttpTransport, createHttpTransportForSolanaRpc };
|
|
188
178
|
//# sourceMappingURL=index.native.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/http-transport-headers.ts","../src/http-transport.ts","../src/is-solana-request.ts","../src/http-transport-for-solana-rpc.ts"],"names":["SolanaError"],"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 type { RpcTransport } from '@solana/rpc-spec';\nimport type { RpcResponse } from '@solana/rpc-spec-types';\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 '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","import { RpcTransport } from '@solana/rpc-spec';\nimport { parseJsonWithBigInts, stringifyJsonWithBigints } from '@solana/rpc-spec-types';\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';\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/http-transport-headers.ts","../src/http-transport.ts","../src/is-solana-request.ts","../src/http-transport-for-solana-rpc.ts"],"names":["SolanaError"],"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 type { RpcTransport } from '@solana/rpc-spec';\nimport type { RpcResponse } from '@solana/rpc-spec-types';\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 '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","import { RpcTransport } from '@solana/rpc-spec';\nimport { parseJsonWithBigInts, stringifyJsonWithBigints } from '@solana/rpc-spec-types';\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';\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 isSolanaRequest(payload) ? parseJsonWithBigInts(rawResponse) : JSON.parse(rawResponse),\n toJson: (payload: unknown) =>\n isSolanaRequest(payload) ? stringifyJsonWithBigints(payload) : JSON.stringify(payload),\n });\n}\n"]}
|
package/dist/index.node.cjs
CHANGED
|
@@ -164,20 +164,10 @@ function isSolanaRequest(payload) {
|
|
|
164
164
|
function createHttpTransportForSolanaRpc(config) {
|
|
165
165
|
return createHttpTransport({
|
|
166
166
|
...config,
|
|
167
|
-
fromJson: (rawResponse, payload) =>
|
|
168
|
-
if (!isSolanaRequest(payload)) return JSON.parse(rawResponse);
|
|
169
|
-
const response = rpcSpecTypes.parseJsonWithBigInts(rawResponse);
|
|
170
|
-
if (isErrorResponse(response)) {
|
|
171
|
-
return { ...response, error: { ...response.error, code: Number(response.error.code) } };
|
|
172
|
-
}
|
|
173
|
-
return response;
|
|
174
|
-
},
|
|
167
|
+
fromJson: (rawResponse, payload) => isSolanaRequest(payload) ? rpcSpecTypes.parseJsonWithBigInts(rawResponse) : JSON.parse(rawResponse),
|
|
175
168
|
toJson: (payload) => isSolanaRequest(payload) ? rpcSpecTypes.stringifyJsonWithBigints(payload) : JSON.stringify(payload)
|
|
176
169
|
});
|
|
177
170
|
}
|
|
178
|
-
function isErrorResponse(value) {
|
|
179
|
-
return !!value && typeof value === "object" && "error" in value && !!value.error && typeof value.error === "object" && "code" in value.error;
|
|
180
|
-
}
|
|
181
171
|
|
|
182
172
|
exports.createHttpTransport = createHttpTransport;
|
|
183
173
|
exports.createHttpTransportForSolanaRpc = createHttpTransportForSolanaRpc;
|
package/dist/index.node.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/http-transport-headers.ts","../src/http-transport.ts","../src/is-solana-request.ts","../src/http-transport-for-solana-rpc.ts"],"names":["SolanaError","SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN","SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR","isJsonRpcPayload","parseJsonWithBigInts","stringifyJsonWithBigints"],"mappings":"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","file":"index.node.cjs","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 type { RpcTransport } from '@solana/rpc-spec';\nimport type { RpcResponse } from '@solana/rpc-spec-types';\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 '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","import { RpcTransport } from '@solana/rpc-spec';\nimport { parseJsonWithBigInts, stringifyJsonWithBigints } from '@solana/rpc-spec-types';\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';\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/http-transport-headers.ts","../src/http-transport.ts","../src/is-solana-request.ts","../src/http-transport-for-solana-rpc.ts"],"names":["SolanaError","SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN","SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR","isJsonRpcPayload","parseJsonWithBigInts","stringifyJsonWithBigints"],"mappings":"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","file":"index.node.cjs","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 type { RpcTransport } from '@solana/rpc-spec';\nimport type { RpcResponse } from '@solana/rpc-spec-types';\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 '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","import { RpcTransport } from '@solana/rpc-spec';\nimport { parseJsonWithBigInts, stringifyJsonWithBigints } from '@solana/rpc-spec-types';\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';\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 isSolanaRequest(payload) ? parseJsonWithBigInts(rawResponse) : JSON.parse(rawResponse),\n toJson: (payload: unknown) =>\n isSolanaRequest(payload) ? stringifyJsonWithBigints(payload) : JSON.stringify(payload),\n });\n}\n"]}
|
package/dist/index.node.mjs
CHANGED
|
@@ -162,20 +162,10 @@ function isSolanaRequest(payload) {
|
|
|
162
162
|
function createHttpTransportForSolanaRpc(config) {
|
|
163
163
|
return createHttpTransport({
|
|
164
164
|
...config,
|
|
165
|
-
fromJson: (rawResponse, payload) =>
|
|
166
|
-
if (!isSolanaRequest(payload)) return JSON.parse(rawResponse);
|
|
167
|
-
const response = parseJsonWithBigInts(rawResponse);
|
|
168
|
-
if (isErrorResponse(response)) {
|
|
169
|
-
return { ...response, error: { ...response.error, code: Number(response.error.code) } };
|
|
170
|
-
}
|
|
171
|
-
return response;
|
|
172
|
-
},
|
|
165
|
+
fromJson: (rawResponse, payload) => isSolanaRequest(payload) ? parseJsonWithBigInts(rawResponse) : JSON.parse(rawResponse),
|
|
173
166
|
toJson: (payload) => isSolanaRequest(payload) ? stringifyJsonWithBigints(payload) : JSON.stringify(payload)
|
|
174
167
|
});
|
|
175
168
|
}
|
|
176
|
-
function isErrorResponse(value) {
|
|
177
|
-
return !!value && typeof value === "object" && "error" in value && !!value.error && typeof value.error === "object" && "code" in value.error;
|
|
178
|
-
}
|
|
179
169
|
|
|
180
170
|
export { createHttpTransport, createHttpTransportForSolanaRpc };
|
|
181
171
|
//# sourceMappingURL=index.node.mjs.map
|
package/dist/index.node.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/http-transport-headers.ts","../src/http-transport.ts","../src/is-solana-request.ts","../src/http-transport-for-solana-rpc.ts"],"names":["SolanaError"],"mappings":"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","file":"index.node.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 type { RpcTransport } from '@solana/rpc-spec';\nimport type { RpcResponse } from '@solana/rpc-spec-types';\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 '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","import { RpcTransport } from '@solana/rpc-spec';\nimport { parseJsonWithBigInts, stringifyJsonWithBigints } from '@solana/rpc-spec-types';\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';\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/http-transport-headers.ts","../src/http-transport.ts","../src/is-solana-request.ts","../src/http-transport-for-solana-rpc.ts"],"names":["SolanaError"],"mappings":"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","file":"index.node.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 type { RpcTransport } from '@solana/rpc-spec';\nimport type { RpcResponse } from '@solana/rpc-spec-types';\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 '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","import { RpcTransport } from '@solana/rpc-spec';\nimport { parseJsonWithBigInts, stringifyJsonWithBigints } from '@solana/rpc-spec-types';\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';\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 isSolanaRequest(payload) ? parseJsonWithBigInts(rawResponse) : JSON.parse(rawResponse),\n toJson: (payload: unknown) =>\n isSolanaRequest(payload) ? stringifyJsonWithBigints(payload) : JSON.stringify(payload),\n });\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-transport-for-solana-rpc.d.ts","sourceRoot":"","sources":["../../src/http-transport-for-solana-rpc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,OAAO,KAAK,UAAU,MAAM,yBAAyB,CAAC;AAGtD,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAGrE,KAAK,MAAM,GAAG,QAAQ,CAAC;IACnB,oBAAoB,CAAC,EAAE,UAAU,CAAC;IAClC,OAAO,CAAC,EAAE,yBAAyB,CAAC;IACpC,GAAG,EAAE,MAAM,CAAC;CACf,CAAC,CAAC;AAEH,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,
|
|
1
|
+
{"version":3,"file":"http-transport-for-solana-rpc.d.ts","sourceRoot":"","sources":["../../src/http-transport-for-solana-rpc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,OAAO,KAAK,UAAU,MAAM,yBAAyB,CAAC;AAGtD,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAGrE,KAAK,MAAM,GAAG,QAAQ,CAAC;IACnB,oBAAoB,CAAC,EAAE,UAAU,CAAC;IAClC,OAAO,CAAC,EAAE,yBAAyB,CAAC;IACpC,GAAG,EAAE,MAAM,CAAC;CACf,CAAC,CAAC;AAEH,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAQ5E"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@solana/rpc-transport-http",
|
|
3
|
-
"version": "2.0.0
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "An RPC transport that uses HTTP requests",
|
|
5
5
|
"exports": {
|
|
6
6
|
"edge-light": {
|
|
@@ -55,21 +55,13 @@
|
|
|
55
55
|
],
|
|
56
56
|
"dependencies": {
|
|
57
57
|
"undici-types": "^6.20.0",
|
|
58
|
-
"@solana/
|
|
59
|
-
"@solana/
|
|
60
|
-
"@solana/rpc-spec": "2.0.0
|
|
58
|
+
"@solana/rpc-spec": "2.0.0",
|
|
59
|
+
"@solana/errors": "2.0.0",
|
|
60
|
+
"@solana/rpc-spec-types": "2.0.0"
|
|
61
61
|
},
|
|
62
62
|
"peerDependencies": {
|
|
63
63
|
"typescript": ">=5"
|
|
64
64
|
},
|
|
65
|
-
"bundlewatch": {
|
|
66
|
-
"defaultCompression": "gzip",
|
|
67
|
-
"files": [
|
|
68
|
-
{
|
|
69
|
-
"path": "./dist/index*.js"
|
|
70
|
-
}
|
|
71
|
-
]
|
|
72
|
-
},
|
|
73
65
|
"engines": {
|
|
74
66
|
"node": ">=20.18.0"
|
|
75
67
|
},
|