@solana/rpc-transport-http 2.0.0-experimental.12ae1c6
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/LICENSE +20 -0
- package/README.md +17 -0
- package/dist/index.browser.cjs +108 -0
- package/dist/index.browser.cjs.map +1 -0
- package/dist/index.browser.js +106 -0
- package/dist/index.browser.js.map +1 -0
- package/dist/index.native.js +106 -0
- package/dist/index.native.js.map +1 -0
- package/dist/index.node.cjs +108 -0
- package/dist/index.node.cjs.map +1 -0
- package/dist/index.node.js +106 -0
- package/dist/index.node.js.map +1 -0
- package/dist/types/http-transport-errors.d.ts +11 -0
- package/dist/types/http-transport-errors.d.ts.map +1 -0
- package/dist/types/http-transport-headers.d.ts +17 -0
- package/dist/types/http-transport-headers.d.ts.map +1 -0
- package/dist/types/http-transport.d.ts +9 -0
- package/dist/types/http-transport.d.ts.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -0
- package/package.json +75 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
Copyright (c) 2023 Solana Labs, Inc
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
4
|
+
a copy of this software and associated documentation files (the
|
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
9
|
+
the following conditions:
|
|
10
|
+
|
|
11
|
+
The above copyright notice and this permission notice shall be
|
|
12
|
+
included in all copies or substantial portions of the Software.
|
|
13
|
+
|
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
[![npm][npm-image]][npm-url]
|
|
2
|
+
[![npm-downloads][npm-downloads-image]][npm-url]
|
|
3
|
+
[![semantic-release][semantic-release-image]][semantic-release-url]
|
|
4
|
+
<br />
|
|
5
|
+
[![code-style-prettier][code-style-prettier-image]][code-style-prettier-url]
|
|
6
|
+
|
|
7
|
+
[code-style-prettier-image]: https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square
|
|
8
|
+
[code-style-prettier-url]: https://github.com/prettier/prettier
|
|
9
|
+
[npm-downloads-image]: https://img.shields.io/npm/dm/@solana/rpc-transport-http/experimental.svg?style=flat
|
|
10
|
+
[npm-image]: https://img.shields.io/npm/v/@solana/rpc-transport-http/experimental.svg?style=flat
|
|
11
|
+
[npm-url]: https://www.npmjs.com/package/@solana/rpc-transport-http/v/experimental
|
|
12
|
+
[semantic-release-image]: https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg
|
|
13
|
+
[semantic-release-url]: https://github.com/semantic-release/semantic-release
|
|
14
|
+
|
|
15
|
+
# @solana/rpc-transport-http
|
|
16
|
+
|
|
17
|
+
TODO
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// ../build-scripts/env-shim.ts
|
|
4
|
+
var __DEV__ = /* @__PURE__ */ (() => process["env"].NODE_ENV === "development")();
|
|
5
|
+
|
|
6
|
+
// ../fetch-impl/dist/index.browser.js
|
|
7
|
+
var e = globalThis.fetch;
|
|
8
|
+
|
|
9
|
+
// src/http-transport-errors.ts
|
|
10
|
+
var SolanaHttpError = class extends Error {
|
|
11
|
+
statusCode;
|
|
12
|
+
constructor(details) {
|
|
13
|
+
super(`HTTP error (${details.statusCode}): ${details.message}`);
|
|
14
|
+
Error.captureStackTrace(this, this.constructor);
|
|
15
|
+
this.statusCode = details.statusCode;
|
|
16
|
+
}
|
|
17
|
+
get name() {
|
|
18
|
+
return "SolanaHttpError";
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
// src/http-transport-headers.ts
|
|
23
|
+
var DISALLOWED_HEADERS = {
|
|
24
|
+
accept: true,
|
|
25
|
+
"content-length": true,
|
|
26
|
+
"content-type": true
|
|
27
|
+
};
|
|
28
|
+
var FORBIDDEN_HEADERS = {
|
|
29
|
+
"accept-charset": true,
|
|
30
|
+
"accept-encoding": true,
|
|
31
|
+
"access-control-request-headers": true,
|
|
32
|
+
"access-control-request-method": true,
|
|
33
|
+
connection: true,
|
|
34
|
+
"content-length": true,
|
|
35
|
+
cookie: true,
|
|
36
|
+
date: true,
|
|
37
|
+
dnt: true,
|
|
38
|
+
expect: true,
|
|
39
|
+
host: true,
|
|
40
|
+
"keep-alive": true,
|
|
41
|
+
origin: true,
|
|
42
|
+
"permissions-policy": true,
|
|
43
|
+
// No currently available Typescript technique allows you to match on a prefix.
|
|
44
|
+
// 'proxy-':true,
|
|
45
|
+
// 'sec-':true,
|
|
46
|
+
referer: true,
|
|
47
|
+
te: true,
|
|
48
|
+
trailer: true,
|
|
49
|
+
"transfer-encoding": true,
|
|
50
|
+
upgrade: true,
|
|
51
|
+
via: true
|
|
52
|
+
};
|
|
53
|
+
function assertIsAllowedHttpRequestHeaders(headers) {
|
|
54
|
+
const badHeaders = Object.keys(headers).filter((headerName) => {
|
|
55
|
+
const lowercaseHeaderName = headerName.toLowerCase();
|
|
56
|
+
return DISALLOWED_HEADERS[headerName.toLowerCase()] === true || FORBIDDEN_HEADERS[headerName.toLowerCase()] === true || lowercaseHeaderName.startsWith("proxy-") || lowercaseHeaderName.startsWith("sec-");
|
|
57
|
+
});
|
|
58
|
+
if (badHeaders.length > 0) {
|
|
59
|
+
throw new Error(
|
|
60
|
+
`${badHeaders.length > 1 ? "These headers are" : "This header is"} forbidden: \`${badHeaders.join("`, `")}\`. Learn more at https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_header_name.`
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function normalizeHeaders(headers) {
|
|
65
|
+
const out = {};
|
|
66
|
+
for (const headerName in headers) {
|
|
67
|
+
out[headerName.toLowerCase()] = headers[headerName];
|
|
68
|
+
}
|
|
69
|
+
return out;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// src/http-transport.ts
|
|
73
|
+
function createHttpTransport({ headers, url }) {
|
|
74
|
+
if (__DEV__ && headers) {
|
|
75
|
+
assertIsAllowedHttpRequestHeaders(headers);
|
|
76
|
+
}
|
|
77
|
+
const customHeaders = headers && normalizeHeaders(headers);
|
|
78
|
+
return async function makeHttpRequest({
|
|
79
|
+
payload,
|
|
80
|
+
signal
|
|
81
|
+
}) {
|
|
82
|
+
const body = JSON.stringify(payload);
|
|
83
|
+
const requestInfo = {
|
|
84
|
+
body,
|
|
85
|
+
headers: {
|
|
86
|
+
...customHeaders,
|
|
87
|
+
// Keep these headers lowercase so they will override any user-supplied headers above.
|
|
88
|
+
accept: "application/json",
|
|
89
|
+
"content-length": body.length.toString(),
|
|
90
|
+
"content-type": "application/json; charset=utf-8"
|
|
91
|
+
},
|
|
92
|
+
method: "POST",
|
|
93
|
+
signal
|
|
94
|
+
};
|
|
95
|
+
const response = await e(url, requestInfo);
|
|
96
|
+
if (!response.ok) {
|
|
97
|
+
throw new SolanaHttpError({
|
|
98
|
+
message: response.statusText,
|
|
99
|
+
statusCode: response.status
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
return await response.json();
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
exports.createHttpTransport = createHttpTransport;
|
|
107
|
+
//# sourceMappingURL=out.js.map
|
|
108
|
+
//# sourceMappingURL=index.browser.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../build-scripts/env-shim.ts","../../fetch-impl/src/index.browser.ts","../src/http-transport-errors.ts","../src/http-transport-headers.ts","../src/http-transport.ts"],"names":["index_browser_default"],"mappings":";AACO,IAAM,UAA2B,uBAAO,QAAgB,KAAU,EAAE,aAAa,eAAe;;;ACDvG,IAAOA,IAAQ,WAAW;;;ACKnB,IAAM,kBAAN,cAA8B,MAAM;AAAA,EAC9B;AAAA,EACT,YAAY,SAAiC;AACzC,UAAM,eAAe,QAAQ,UAAU,MAAM,QAAQ,OAAO,EAAE;AAC9D,UAAM,kBAAkB,MAAM,KAAK,WAAW;AAC9C,SAAK,aAAa,QAAQ;AAAA,EAC9B;AAAA,EACA,IAAI,OAAO;AACP,WAAO;AAAA,EACX;AACJ;;;AC2BA,IAAM,qBAA8C;AAAA,EAChD,QAAQ;AAAA,EACR,kBAAkB;AAAA,EAClB,gBAAgB;AACpB;AAEA,IAAM,oBAA6C;AAAA,EAC/C,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,kCAAkC;AAAA,EAClC,iCAAiC;AAAA,EACjC,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,sBAAsB;AAAA;AAAA;AAAA;AAAA,EAItB,SAAS;AAAA,EACT,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,qBAAqB;AAAA,EACrB,SAAS;AAAA,EACT,KAAK;AACT;AAEO,SAAS,kCACZ,SAC4C;AAC5C,QAAM,aAAa,OAAO,KAAK,OAAO,EAAE,OAAO,gBAAc;AACzD,UAAM,sBAAsB,WAAW,YAAY;AACnD,WACI,mBAAmB,WAAW,YAAY,CAAC,MAAM,QACjD,kBAAkB,WAAW,YAAY,CAAC,MAAM,QAChD,oBAAoB,WAAW,QAAQ,KACvC,oBAAoB,WAAW,MAAM;AAAA,EAE7C,CAAC;AACD,MAAI,WAAW,SAAS,GAAG;AACvB,UAAM,IAAI;AAAA,MACN,GAAG,WAAW,SAAS,IAAI,sBAAsB,gBAAgB,iBACxD,WAAW,KAAK,MAAM,CAAC;AAAA,IAEpC;AAAA,EACJ;AACJ;AAMO,SAAS,iBACZ,SACiD;AACjD,QAAM,MAA8B,CAAC;AACrC,aAAW,cAAc,SAAS;AAC9B,QAAI,WAAW,YAAY,CAAC,IAAI,QAAQ,UAAU;AAAA,EACtD;AACA,SAAO;AACX;;;AC5FO,SAAS,oBAAoB,EAAE,SAAS,IAAI,GAAyB;AACxE,MAAI,WAAW,SAAS;AACpB,sCAAkC,OAAO;AAAA,EAC7C;AACA,QAAM,gBAAgB,WAAW,iBAAiB,OAAO;AACzD,SAAO,eAAe,gBAA2B;AAAA,IAC7C;AAAA,IACA;AAAA,EACJ,GAAoD;AAChD,UAAM,OAAO,KAAK,UAAU,OAAO;AACnC,UAAM,cAAc;AAAA,MAChB;AAAA,MACA,SAAS;AAAA,QACL,GAAG;AAAA;AAAA,QAEH,QAAQ;AAAA,QACR,kBAAkB,KAAK,OAAO,SAAS;AAAA,QACvC,gBAAgB;AAAA,MACpB;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,IACJ;AACA,UAAM,WAAW,MAAM,EAAU,KAAK,WAAW;AACjD,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,IAAI,gBAAgB;AAAA,QACtB,SAAS,SAAS;AAAA,QAClB,YAAY,SAAS;AAAA,MACzB,CAAC;AAAA,IACL;AACA,WAAQ,MAAM,SAAS,KAAK;AAAA,EAChC;AACJ","sourcesContent":["// Clever obfuscation to prevent the build system from inlining the value of `NODE_ENV`\nexport const __DEV__ = /* @__PURE__ */ (() => (process as any)['en' + 'v'].NODE_ENV === 'development')();\n","export default globalThis.fetch;\n","type SolanaHttpErrorDetails = Readonly<{\n statusCode: number;\n message: string;\n}>;\n\nexport class SolanaHttpError extends Error {\n readonly statusCode: number;\n constructor(details: SolanaHttpErrorDetails) {\n super(`HTTP error (${details.statusCode}): ${details.message}`);\n Error.captureStackTrace(this, this.constructor);\n this.statusCode = details.statusCode;\n }\n get name() {\n return 'SolanaHttpError';\n }\n}\n","export type AllowedHttpRequestHeaders = Readonly<\n { [headerName: string]: string } & {\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 | K // `Foo-Bar`\n | Capitalize<Lowercase<K>> // `Foo-bar`\n | Lowercase<K> // `foo-bar`\n | Uncapitalize<K> // `foo-Bar`\n // `FOO-BAR`\n | Uppercase<K>]?: never;\n }\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 | '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 // No currently available Typescript technique allows you to match on a prefix.\n // | 'Proxy-'\n // | 'Sec-'\n | 'Referer'\n | 'TE'\n | 'Trailer'\n | 'Transfer-Encoding'\n | 'Upgrade'\n | 'Via';\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> = {\n 'accept-charset': true,\n 'accept-encoding': 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 // No currently available Typescript technique allows you to match on a prefix.\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\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 Error(\n `${badHeaders.length > 1 ? 'These headers are' : 'This header is'} forbidden: ` +\n `\\`${badHeaders.join('`, `')}\\`. Learn more at ` +\n 'https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_header_name.',\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 keyof T & string 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 keyof T & string as Lowercase<K>]: T[K] };\n}\n","import fetchImpl from '@solana/fetch-impl';\nimport { RpcTransport } from '@solana/rpc-spec';\n\nimport { SolanaHttpError } from './http-transport-errors';\nimport {\n AllowedHttpRequestHeaders,\n assertIsAllowedHttpRequestHeaders,\n normalizeHeaders,\n} from './http-transport-headers';\n\ntype Config = Readonly<{\n headers?: AllowedHttpRequestHeaders;\n url: string;\n}>;\n\nexport function createHttpTransport({ headers, url }: Config): RpcTransport {\n if (__DEV__ && headers) {\n assertIsAllowedHttpRequestHeaders(headers);\n }\n const customHeaders = headers && normalizeHeaders(headers);\n return async function makeHttpRequest<TResponse>({\n payload,\n signal,\n }: Parameters<RpcTransport>[0]): Promise<TResponse> {\n const body = JSON.stringify(payload);\n const requestInfo = {\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 fetchImpl(url, requestInfo);\n if (!response.ok) {\n throw new SolanaHttpError({\n message: response.statusText,\n statusCode: response.status,\n });\n }\n return (await response.json()) as TResponse;\n };\n}\n"]}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
// ../build-scripts/env-shim.ts
|
|
2
|
+
var __DEV__ = /* @__PURE__ */ (() => process["env"].NODE_ENV === "development")();
|
|
3
|
+
|
|
4
|
+
// ../fetch-impl/dist/index.browser.js
|
|
5
|
+
var e = globalThis.fetch;
|
|
6
|
+
|
|
7
|
+
// src/http-transport-errors.ts
|
|
8
|
+
var SolanaHttpError = class extends Error {
|
|
9
|
+
statusCode;
|
|
10
|
+
constructor(details) {
|
|
11
|
+
super(`HTTP error (${details.statusCode}): ${details.message}`);
|
|
12
|
+
Error.captureStackTrace(this, this.constructor);
|
|
13
|
+
this.statusCode = details.statusCode;
|
|
14
|
+
}
|
|
15
|
+
get name() {
|
|
16
|
+
return "SolanaHttpError";
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
// src/http-transport-headers.ts
|
|
21
|
+
var DISALLOWED_HEADERS = {
|
|
22
|
+
accept: true,
|
|
23
|
+
"content-length": true,
|
|
24
|
+
"content-type": true
|
|
25
|
+
};
|
|
26
|
+
var FORBIDDEN_HEADERS = {
|
|
27
|
+
"accept-charset": true,
|
|
28
|
+
"accept-encoding": true,
|
|
29
|
+
"access-control-request-headers": true,
|
|
30
|
+
"access-control-request-method": true,
|
|
31
|
+
connection: true,
|
|
32
|
+
"content-length": true,
|
|
33
|
+
cookie: true,
|
|
34
|
+
date: true,
|
|
35
|
+
dnt: true,
|
|
36
|
+
expect: true,
|
|
37
|
+
host: true,
|
|
38
|
+
"keep-alive": true,
|
|
39
|
+
origin: true,
|
|
40
|
+
"permissions-policy": true,
|
|
41
|
+
// No currently available Typescript technique allows you to match on a prefix.
|
|
42
|
+
// 'proxy-':true,
|
|
43
|
+
// 'sec-':true,
|
|
44
|
+
referer: true,
|
|
45
|
+
te: true,
|
|
46
|
+
trailer: true,
|
|
47
|
+
"transfer-encoding": true,
|
|
48
|
+
upgrade: true,
|
|
49
|
+
via: true
|
|
50
|
+
};
|
|
51
|
+
function assertIsAllowedHttpRequestHeaders(headers) {
|
|
52
|
+
const badHeaders = Object.keys(headers).filter((headerName) => {
|
|
53
|
+
const lowercaseHeaderName = headerName.toLowerCase();
|
|
54
|
+
return DISALLOWED_HEADERS[headerName.toLowerCase()] === true || FORBIDDEN_HEADERS[headerName.toLowerCase()] === true || lowercaseHeaderName.startsWith("proxy-") || lowercaseHeaderName.startsWith("sec-");
|
|
55
|
+
});
|
|
56
|
+
if (badHeaders.length > 0) {
|
|
57
|
+
throw new Error(
|
|
58
|
+
`${badHeaders.length > 1 ? "These headers are" : "This header is"} forbidden: \`${badHeaders.join("`, `")}\`. Learn more at https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_header_name.`
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function normalizeHeaders(headers) {
|
|
63
|
+
const out = {};
|
|
64
|
+
for (const headerName in headers) {
|
|
65
|
+
out[headerName.toLowerCase()] = headers[headerName];
|
|
66
|
+
}
|
|
67
|
+
return out;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// src/http-transport.ts
|
|
71
|
+
function createHttpTransport({ headers, url }) {
|
|
72
|
+
if (__DEV__ && headers) {
|
|
73
|
+
assertIsAllowedHttpRequestHeaders(headers);
|
|
74
|
+
}
|
|
75
|
+
const customHeaders = headers && normalizeHeaders(headers);
|
|
76
|
+
return async function makeHttpRequest({
|
|
77
|
+
payload,
|
|
78
|
+
signal
|
|
79
|
+
}) {
|
|
80
|
+
const body = JSON.stringify(payload);
|
|
81
|
+
const requestInfo = {
|
|
82
|
+
body,
|
|
83
|
+
headers: {
|
|
84
|
+
...customHeaders,
|
|
85
|
+
// Keep these headers lowercase so they will override any user-supplied headers above.
|
|
86
|
+
accept: "application/json",
|
|
87
|
+
"content-length": body.length.toString(),
|
|
88
|
+
"content-type": "application/json; charset=utf-8"
|
|
89
|
+
},
|
|
90
|
+
method: "POST",
|
|
91
|
+
signal
|
|
92
|
+
};
|
|
93
|
+
const response = await e(url, requestInfo);
|
|
94
|
+
if (!response.ok) {
|
|
95
|
+
throw new SolanaHttpError({
|
|
96
|
+
message: response.statusText,
|
|
97
|
+
statusCode: response.status
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
return await response.json();
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export { createHttpTransport };
|
|
105
|
+
//# sourceMappingURL=out.js.map
|
|
106
|
+
//# sourceMappingURL=index.browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../build-scripts/env-shim.ts","../../fetch-impl/src/index.browser.ts","../src/http-transport-errors.ts","../src/http-transport-headers.ts","../src/http-transport.ts"],"names":["index_browser_default"],"mappings":";AACO,IAAM,UAA2B,uBAAO,QAAgB,KAAU,EAAE,aAAa,eAAe;;;ACDvG,IAAOA,IAAQ,WAAW;;;ACKnB,IAAM,kBAAN,cAA8B,MAAM;AAAA,EAC9B;AAAA,EACT,YAAY,SAAiC;AACzC,UAAM,eAAe,QAAQ,UAAU,MAAM,QAAQ,OAAO,EAAE;AAC9D,UAAM,kBAAkB,MAAM,KAAK,WAAW;AAC9C,SAAK,aAAa,QAAQ;AAAA,EAC9B;AAAA,EACA,IAAI,OAAO;AACP,WAAO;AAAA,EACX;AACJ;;;AC2BA,IAAM,qBAA8C;AAAA,EAChD,QAAQ;AAAA,EACR,kBAAkB;AAAA,EAClB,gBAAgB;AACpB;AAEA,IAAM,oBAA6C;AAAA,EAC/C,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,kCAAkC;AAAA,EAClC,iCAAiC;AAAA,EACjC,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,sBAAsB;AAAA;AAAA;AAAA;AAAA,EAItB,SAAS;AAAA,EACT,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,qBAAqB;AAAA,EACrB,SAAS;AAAA,EACT,KAAK;AACT;AAEO,SAAS,kCACZ,SAC4C;AAC5C,QAAM,aAAa,OAAO,KAAK,OAAO,EAAE,OAAO,gBAAc;AACzD,UAAM,sBAAsB,WAAW,YAAY;AACnD,WACI,mBAAmB,WAAW,YAAY,CAAC,MAAM,QACjD,kBAAkB,WAAW,YAAY,CAAC,MAAM,QAChD,oBAAoB,WAAW,QAAQ,KACvC,oBAAoB,WAAW,MAAM;AAAA,EAE7C,CAAC;AACD,MAAI,WAAW,SAAS,GAAG;AACvB,UAAM,IAAI;AAAA,MACN,GAAG,WAAW,SAAS,IAAI,sBAAsB,gBAAgB,iBACxD,WAAW,KAAK,MAAM,CAAC;AAAA,IAEpC;AAAA,EACJ;AACJ;AAMO,SAAS,iBACZ,SACiD;AACjD,QAAM,MAA8B,CAAC;AACrC,aAAW,cAAc,SAAS;AAC9B,QAAI,WAAW,YAAY,CAAC,IAAI,QAAQ,UAAU;AAAA,EACtD;AACA,SAAO;AACX;;;AC5FO,SAAS,oBAAoB,EAAE,SAAS,IAAI,GAAyB;AACxE,MAAI,WAAW,SAAS;AACpB,sCAAkC,OAAO;AAAA,EAC7C;AACA,QAAM,gBAAgB,WAAW,iBAAiB,OAAO;AACzD,SAAO,eAAe,gBAA2B;AAAA,IAC7C;AAAA,IACA;AAAA,EACJ,GAAoD;AAChD,UAAM,OAAO,KAAK,UAAU,OAAO;AACnC,UAAM,cAAc;AAAA,MAChB;AAAA,MACA,SAAS;AAAA,QACL,GAAG;AAAA;AAAA,QAEH,QAAQ;AAAA,QACR,kBAAkB,KAAK,OAAO,SAAS;AAAA,QACvC,gBAAgB;AAAA,MACpB;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,IACJ;AACA,UAAM,WAAW,MAAM,EAAU,KAAK,WAAW;AACjD,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,IAAI,gBAAgB;AAAA,QACtB,SAAS,SAAS;AAAA,QAClB,YAAY,SAAS;AAAA,MACzB,CAAC;AAAA,IACL;AACA,WAAQ,MAAM,SAAS,KAAK;AAAA,EAChC;AACJ","sourcesContent":["// Clever obfuscation to prevent the build system from inlining the value of `NODE_ENV`\nexport const __DEV__ = /* @__PURE__ */ (() => (process as any)['en' + 'v'].NODE_ENV === 'development')();\n","export default globalThis.fetch;\n","type SolanaHttpErrorDetails = Readonly<{\n statusCode: number;\n message: string;\n}>;\n\nexport class SolanaHttpError extends Error {\n readonly statusCode: number;\n constructor(details: SolanaHttpErrorDetails) {\n super(`HTTP error (${details.statusCode}): ${details.message}`);\n Error.captureStackTrace(this, this.constructor);\n this.statusCode = details.statusCode;\n }\n get name() {\n return 'SolanaHttpError';\n }\n}\n","export type AllowedHttpRequestHeaders = Readonly<\n { [headerName: string]: string } & {\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 | K // `Foo-Bar`\n | Capitalize<Lowercase<K>> // `Foo-bar`\n | Lowercase<K> // `foo-bar`\n | Uncapitalize<K> // `foo-Bar`\n // `FOO-BAR`\n | Uppercase<K>]?: never;\n }\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 | '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 // No currently available Typescript technique allows you to match on a prefix.\n // | 'Proxy-'\n // | 'Sec-'\n | 'Referer'\n | 'TE'\n | 'Trailer'\n | 'Transfer-Encoding'\n | 'Upgrade'\n | 'Via';\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> = {\n 'accept-charset': true,\n 'accept-encoding': 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 // No currently available Typescript technique allows you to match on a prefix.\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\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 Error(\n `${badHeaders.length > 1 ? 'These headers are' : 'This header is'} forbidden: ` +\n `\\`${badHeaders.join('`, `')}\\`. Learn more at ` +\n 'https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_header_name.',\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 keyof T & string 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 keyof T & string as Lowercase<K>]: T[K] };\n}\n","import fetchImpl from '@solana/fetch-impl';\nimport { RpcTransport } from '@solana/rpc-spec';\n\nimport { SolanaHttpError } from './http-transport-errors';\nimport {\n AllowedHttpRequestHeaders,\n assertIsAllowedHttpRequestHeaders,\n normalizeHeaders,\n} from './http-transport-headers';\n\ntype Config = Readonly<{\n headers?: AllowedHttpRequestHeaders;\n url: string;\n}>;\n\nexport function createHttpTransport({ headers, url }: Config): RpcTransport {\n if (__DEV__ && headers) {\n assertIsAllowedHttpRequestHeaders(headers);\n }\n const customHeaders = headers && normalizeHeaders(headers);\n return async function makeHttpRequest<TResponse>({\n payload,\n signal,\n }: Parameters<RpcTransport>[0]): Promise<TResponse> {\n const body = JSON.stringify(payload);\n const requestInfo = {\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 fetchImpl(url, requestInfo);\n if (!response.ok) {\n throw new SolanaHttpError({\n message: response.statusText,\n statusCode: response.status,\n });\n }\n return (await response.json()) as TResponse;\n };\n}\n"]}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
// ../build-scripts/env-shim.ts
|
|
2
|
+
var __DEV__ = /* @__PURE__ */ (() => process["env"].NODE_ENV === "development")();
|
|
3
|
+
|
|
4
|
+
// ../fetch-impl/dist/index.browser.js
|
|
5
|
+
var e = globalThis.fetch;
|
|
6
|
+
|
|
7
|
+
// src/http-transport-errors.ts
|
|
8
|
+
var SolanaHttpError = class extends Error {
|
|
9
|
+
statusCode;
|
|
10
|
+
constructor(details) {
|
|
11
|
+
super(`HTTP error (${details.statusCode}): ${details.message}`);
|
|
12
|
+
Error.captureStackTrace(this, this.constructor);
|
|
13
|
+
this.statusCode = details.statusCode;
|
|
14
|
+
}
|
|
15
|
+
get name() {
|
|
16
|
+
return "SolanaHttpError";
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
// src/http-transport-headers.ts
|
|
21
|
+
var DISALLOWED_HEADERS = {
|
|
22
|
+
accept: true,
|
|
23
|
+
"content-length": true,
|
|
24
|
+
"content-type": true
|
|
25
|
+
};
|
|
26
|
+
var FORBIDDEN_HEADERS = {
|
|
27
|
+
"accept-charset": true,
|
|
28
|
+
"accept-encoding": true,
|
|
29
|
+
"access-control-request-headers": true,
|
|
30
|
+
"access-control-request-method": true,
|
|
31
|
+
connection: true,
|
|
32
|
+
"content-length": true,
|
|
33
|
+
cookie: true,
|
|
34
|
+
date: true,
|
|
35
|
+
dnt: true,
|
|
36
|
+
expect: true,
|
|
37
|
+
host: true,
|
|
38
|
+
"keep-alive": true,
|
|
39
|
+
origin: true,
|
|
40
|
+
"permissions-policy": true,
|
|
41
|
+
// No currently available Typescript technique allows you to match on a prefix.
|
|
42
|
+
// 'proxy-':true,
|
|
43
|
+
// 'sec-':true,
|
|
44
|
+
referer: true,
|
|
45
|
+
te: true,
|
|
46
|
+
trailer: true,
|
|
47
|
+
"transfer-encoding": true,
|
|
48
|
+
upgrade: true,
|
|
49
|
+
via: true
|
|
50
|
+
};
|
|
51
|
+
function assertIsAllowedHttpRequestHeaders(headers) {
|
|
52
|
+
const badHeaders = Object.keys(headers).filter((headerName) => {
|
|
53
|
+
const lowercaseHeaderName = headerName.toLowerCase();
|
|
54
|
+
return DISALLOWED_HEADERS[headerName.toLowerCase()] === true || FORBIDDEN_HEADERS[headerName.toLowerCase()] === true || lowercaseHeaderName.startsWith("proxy-") || lowercaseHeaderName.startsWith("sec-");
|
|
55
|
+
});
|
|
56
|
+
if (badHeaders.length > 0) {
|
|
57
|
+
throw new Error(
|
|
58
|
+
`${badHeaders.length > 1 ? "These headers are" : "This header is"} forbidden: \`${badHeaders.join("`, `")}\`. Learn more at https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_header_name.`
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function normalizeHeaders(headers) {
|
|
63
|
+
const out = {};
|
|
64
|
+
for (const headerName in headers) {
|
|
65
|
+
out[headerName.toLowerCase()] = headers[headerName];
|
|
66
|
+
}
|
|
67
|
+
return out;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// src/http-transport.ts
|
|
71
|
+
function createHttpTransport({ headers, url }) {
|
|
72
|
+
if (__DEV__ && headers) {
|
|
73
|
+
assertIsAllowedHttpRequestHeaders(headers);
|
|
74
|
+
}
|
|
75
|
+
const customHeaders = headers && normalizeHeaders(headers);
|
|
76
|
+
return async function makeHttpRequest({
|
|
77
|
+
payload,
|
|
78
|
+
signal
|
|
79
|
+
}) {
|
|
80
|
+
const body = JSON.stringify(payload);
|
|
81
|
+
const requestInfo = {
|
|
82
|
+
body,
|
|
83
|
+
headers: {
|
|
84
|
+
...customHeaders,
|
|
85
|
+
// Keep these headers lowercase so they will override any user-supplied headers above.
|
|
86
|
+
accept: "application/json",
|
|
87
|
+
"content-length": body.length.toString(),
|
|
88
|
+
"content-type": "application/json; charset=utf-8"
|
|
89
|
+
},
|
|
90
|
+
method: "POST",
|
|
91
|
+
signal
|
|
92
|
+
};
|
|
93
|
+
const response = await e(url, requestInfo);
|
|
94
|
+
if (!response.ok) {
|
|
95
|
+
throw new SolanaHttpError({
|
|
96
|
+
message: response.statusText,
|
|
97
|
+
statusCode: response.status
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
return await response.json();
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export { createHttpTransport };
|
|
105
|
+
//# sourceMappingURL=out.js.map
|
|
106
|
+
//# sourceMappingURL=index.native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../build-scripts/env-shim.ts","../../fetch-impl/src/index.browser.ts","../src/http-transport-errors.ts","../src/http-transport-headers.ts","../src/http-transport.ts"],"names":["index_browser_default"],"mappings":";AACO,IAAM,UAA2B,uBAAO,QAAgB,KAAU,EAAE,aAAa,eAAe;;;ACDvG,IAAOA,IAAQ,WAAW;;;ACKnB,IAAM,kBAAN,cAA8B,MAAM;AAAA,EAC9B;AAAA,EACT,YAAY,SAAiC;AACzC,UAAM,eAAe,QAAQ,UAAU,MAAM,QAAQ,OAAO,EAAE;AAC9D,UAAM,kBAAkB,MAAM,KAAK,WAAW;AAC9C,SAAK,aAAa,QAAQ;AAAA,EAC9B;AAAA,EACA,IAAI,OAAO;AACP,WAAO;AAAA,EACX;AACJ;;;AC2BA,IAAM,qBAA8C;AAAA,EAChD,QAAQ;AAAA,EACR,kBAAkB;AAAA,EAClB,gBAAgB;AACpB;AAEA,IAAM,oBAA6C;AAAA,EAC/C,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,kCAAkC;AAAA,EAClC,iCAAiC;AAAA,EACjC,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,sBAAsB;AAAA;AAAA;AAAA;AAAA,EAItB,SAAS;AAAA,EACT,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,qBAAqB;AAAA,EACrB,SAAS;AAAA,EACT,KAAK;AACT;AAEO,SAAS,kCACZ,SAC4C;AAC5C,QAAM,aAAa,OAAO,KAAK,OAAO,EAAE,OAAO,gBAAc;AACzD,UAAM,sBAAsB,WAAW,YAAY;AACnD,WACI,mBAAmB,WAAW,YAAY,CAAC,MAAM,QACjD,kBAAkB,WAAW,YAAY,CAAC,MAAM,QAChD,oBAAoB,WAAW,QAAQ,KACvC,oBAAoB,WAAW,MAAM;AAAA,EAE7C,CAAC;AACD,MAAI,WAAW,SAAS,GAAG;AACvB,UAAM,IAAI;AAAA,MACN,GAAG,WAAW,SAAS,IAAI,sBAAsB,gBAAgB,iBACxD,WAAW,KAAK,MAAM,CAAC;AAAA,IAEpC;AAAA,EACJ;AACJ;AAMO,SAAS,iBACZ,SACiD;AACjD,QAAM,MAA8B,CAAC;AACrC,aAAW,cAAc,SAAS;AAC9B,QAAI,WAAW,YAAY,CAAC,IAAI,QAAQ,UAAU;AAAA,EACtD;AACA,SAAO;AACX;;;AC5FO,SAAS,oBAAoB,EAAE,SAAS,IAAI,GAAyB;AACxE,MAAI,WAAW,SAAS;AACpB,sCAAkC,OAAO;AAAA,EAC7C;AACA,QAAM,gBAAgB,WAAW,iBAAiB,OAAO;AACzD,SAAO,eAAe,gBAA2B;AAAA,IAC7C;AAAA,IACA;AAAA,EACJ,GAAoD;AAChD,UAAM,OAAO,KAAK,UAAU,OAAO;AACnC,UAAM,cAAc;AAAA,MAChB;AAAA,MACA,SAAS;AAAA,QACL,GAAG;AAAA;AAAA,QAEH,QAAQ;AAAA,QACR,kBAAkB,KAAK,OAAO,SAAS;AAAA,QACvC,gBAAgB;AAAA,MACpB;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,IACJ;AACA,UAAM,WAAW,MAAM,EAAU,KAAK,WAAW;AACjD,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,IAAI,gBAAgB;AAAA,QACtB,SAAS,SAAS;AAAA,QAClB,YAAY,SAAS;AAAA,MACzB,CAAC;AAAA,IACL;AACA,WAAQ,MAAM,SAAS,KAAK;AAAA,EAChC;AACJ","sourcesContent":["// Clever obfuscation to prevent the build system from inlining the value of `NODE_ENV`\nexport const __DEV__ = /* @__PURE__ */ (() => (process as any)['en' + 'v'].NODE_ENV === 'development')();\n","export default globalThis.fetch;\n","type SolanaHttpErrorDetails = Readonly<{\n statusCode: number;\n message: string;\n}>;\n\nexport class SolanaHttpError extends Error {\n readonly statusCode: number;\n constructor(details: SolanaHttpErrorDetails) {\n super(`HTTP error (${details.statusCode}): ${details.message}`);\n Error.captureStackTrace(this, this.constructor);\n this.statusCode = details.statusCode;\n }\n get name() {\n return 'SolanaHttpError';\n }\n}\n","export type AllowedHttpRequestHeaders = Readonly<\n { [headerName: string]: string } & {\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 | K // `Foo-Bar`\n | Capitalize<Lowercase<K>> // `Foo-bar`\n | Lowercase<K> // `foo-bar`\n | Uncapitalize<K> // `foo-Bar`\n // `FOO-BAR`\n | Uppercase<K>]?: never;\n }\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 | '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 // No currently available Typescript technique allows you to match on a prefix.\n // | 'Proxy-'\n // | 'Sec-'\n | 'Referer'\n | 'TE'\n | 'Trailer'\n | 'Transfer-Encoding'\n | 'Upgrade'\n | 'Via';\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> = {\n 'accept-charset': true,\n 'accept-encoding': 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 // No currently available Typescript technique allows you to match on a prefix.\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\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 Error(\n `${badHeaders.length > 1 ? 'These headers are' : 'This header is'} forbidden: ` +\n `\\`${badHeaders.join('`, `')}\\`. Learn more at ` +\n 'https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_header_name.',\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 keyof T & string 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 keyof T & string as Lowercase<K>]: T[K] };\n}\n","import fetchImpl from '@solana/fetch-impl';\nimport { RpcTransport } from '@solana/rpc-spec';\n\nimport { SolanaHttpError } from './http-transport-errors';\nimport {\n AllowedHttpRequestHeaders,\n assertIsAllowedHttpRequestHeaders,\n normalizeHeaders,\n} from './http-transport-headers';\n\ntype Config = Readonly<{\n headers?: AllowedHttpRequestHeaders;\n url: string;\n}>;\n\nexport function createHttpTransport({ headers, url }: Config): RpcTransport {\n if (__DEV__ && headers) {\n assertIsAllowedHttpRequestHeaders(headers);\n }\n const customHeaders = headers && normalizeHeaders(headers);\n return async function makeHttpRequest<TResponse>({\n payload,\n signal,\n }: Parameters<RpcTransport>[0]): Promise<TResponse> {\n const body = JSON.stringify(payload);\n const requestInfo = {\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 fetchImpl(url, requestInfo);\n if (!response.ok) {\n throw new SolanaHttpError({\n message: response.statusText,\n statusCode: response.status,\n });\n }\n return (await response.json()) as TResponse;\n };\n}\n"]}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// ../build-scripts/env-shim.ts
|
|
4
|
+
var __DEV__ = /* @__PURE__ */ (() => process["env"].NODE_ENV === "development")();
|
|
5
|
+
|
|
6
|
+
// ../fetch-impl/dist/index.node.js
|
|
7
|
+
var e = globalThis.fetch;
|
|
8
|
+
|
|
9
|
+
// src/http-transport-errors.ts
|
|
10
|
+
var SolanaHttpError = class extends Error {
|
|
11
|
+
statusCode;
|
|
12
|
+
constructor(details) {
|
|
13
|
+
super(`HTTP error (${details.statusCode}): ${details.message}`);
|
|
14
|
+
Error.captureStackTrace(this, this.constructor);
|
|
15
|
+
this.statusCode = details.statusCode;
|
|
16
|
+
}
|
|
17
|
+
get name() {
|
|
18
|
+
return "SolanaHttpError";
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
// src/http-transport-headers.ts
|
|
23
|
+
var DISALLOWED_HEADERS = {
|
|
24
|
+
accept: true,
|
|
25
|
+
"content-length": true,
|
|
26
|
+
"content-type": true
|
|
27
|
+
};
|
|
28
|
+
var FORBIDDEN_HEADERS = {
|
|
29
|
+
"accept-charset": true,
|
|
30
|
+
"accept-encoding": true,
|
|
31
|
+
"access-control-request-headers": true,
|
|
32
|
+
"access-control-request-method": true,
|
|
33
|
+
connection: true,
|
|
34
|
+
"content-length": true,
|
|
35
|
+
cookie: true,
|
|
36
|
+
date: true,
|
|
37
|
+
dnt: true,
|
|
38
|
+
expect: true,
|
|
39
|
+
host: true,
|
|
40
|
+
"keep-alive": true,
|
|
41
|
+
origin: true,
|
|
42
|
+
"permissions-policy": true,
|
|
43
|
+
// No currently available Typescript technique allows you to match on a prefix.
|
|
44
|
+
// 'proxy-':true,
|
|
45
|
+
// 'sec-':true,
|
|
46
|
+
referer: true,
|
|
47
|
+
te: true,
|
|
48
|
+
trailer: true,
|
|
49
|
+
"transfer-encoding": true,
|
|
50
|
+
upgrade: true,
|
|
51
|
+
via: true
|
|
52
|
+
};
|
|
53
|
+
function assertIsAllowedHttpRequestHeaders(headers) {
|
|
54
|
+
const badHeaders = Object.keys(headers).filter((headerName) => {
|
|
55
|
+
const lowercaseHeaderName = headerName.toLowerCase();
|
|
56
|
+
return DISALLOWED_HEADERS[headerName.toLowerCase()] === true || FORBIDDEN_HEADERS[headerName.toLowerCase()] === true || lowercaseHeaderName.startsWith("proxy-") || lowercaseHeaderName.startsWith("sec-");
|
|
57
|
+
});
|
|
58
|
+
if (badHeaders.length > 0) {
|
|
59
|
+
throw new Error(
|
|
60
|
+
`${badHeaders.length > 1 ? "These headers are" : "This header is"} forbidden: \`${badHeaders.join("`, `")}\`. Learn more at https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_header_name.`
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function normalizeHeaders(headers) {
|
|
65
|
+
const out = {};
|
|
66
|
+
for (const headerName in headers) {
|
|
67
|
+
out[headerName.toLowerCase()] = headers[headerName];
|
|
68
|
+
}
|
|
69
|
+
return out;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// src/http-transport.ts
|
|
73
|
+
function createHttpTransport({ headers, url }) {
|
|
74
|
+
if (__DEV__ && headers) {
|
|
75
|
+
assertIsAllowedHttpRequestHeaders(headers);
|
|
76
|
+
}
|
|
77
|
+
const customHeaders = headers && normalizeHeaders(headers);
|
|
78
|
+
return async function makeHttpRequest({
|
|
79
|
+
payload,
|
|
80
|
+
signal
|
|
81
|
+
}) {
|
|
82
|
+
const body = JSON.stringify(payload);
|
|
83
|
+
const requestInfo = {
|
|
84
|
+
body,
|
|
85
|
+
headers: {
|
|
86
|
+
...customHeaders,
|
|
87
|
+
// Keep these headers lowercase so they will override any user-supplied headers above.
|
|
88
|
+
accept: "application/json",
|
|
89
|
+
"content-length": body.length.toString(),
|
|
90
|
+
"content-type": "application/json; charset=utf-8"
|
|
91
|
+
},
|
|
92
|
+
method: "POST",
|
|
93
|
+
signal
|
|
94
|
+
};
|
|
95
|
+
const response = await e(url, requestInfo);
|
|
96
|
+
if (!response.ok) {
|
|
97
|
+
throw new SolanaHttpError({
|
|
98
|
+
message: response.statusText,
|
|
99
|
+
statusCode: response.status
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
return await response.json();
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
exports.createHttpTransport = createHttpTransport;
|
|
107
|
+
//# sourceMappingURL=out.js.map
|
|
108
|
+
//# sourceMappingURL=index.node.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../build-scripts/env-shim.ts","../../fetch-impl/src/index.node.ts","../src/http-transport-errors.ts","../src/http-transport-headers.ts","../src/http-transport.ts"],"names":["index_node_default"],"mappings":";AACO,IAAM,UAA2B,uBAAO,QAAgB,KAAU,EAAE,aAAa,eAAe;;;ACAvG,IAAOA,IAAQ,WAAW;;;ACInB,IAAM,kBAAN,cAA8B,MAAM;AAAA,EAC9B;AAAA,EACT,YAAY,SAAiC;AACzC,UAAM,eAAe,QAAQ,UAAU,MAAM,QAAQ,OAAO,EAAE;AAC9D,UAAM,kBAAkB,MAAM,KAAK,WAAW;AAC9C,SAAK,aAAa,QAAQ;AAAA,EAC9B;AAAA,EACA,IAAI,OAAO;AACP,WAAO;AAAA,EACX;AACJ;;;AC2BA,IAAM,qBAA8C;AAAA,EAChD,QAAQ;AAAA,EACR,kBAAkB;AAAA,EAClB,gBAAgB;AACpB;AAEA,IAAM,oBAA6C;AAAA,EAC/C,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,kCAAkC;AAAA,EAClC,iCAAiC;AAAA,EACjC,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,sBAAsB;AAAA;AAAA;AAAA;AAAA,EAItB,SAAS;AAAA,EACT,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,qBAAqB;AAAA,EACrB,SAAS;AAAA,EACT,KAAK;AACT;AAEO,SAAS,kCACZ,SAC4C;AAC5C,QAAM,aAAa,OAAO,KAAK,OAAO,EAAE,OAAO,gBAAc;AACzD,UAAM,sBAAsB,WAAW,YAAY;AACnD,WACI,mBAAmB,WAAW,YAAY,CAAC,MAAM,QACjD,kBAAkB,WAAW,YAAY,CAAC,MAAM,QAChD,oBAAoB,WAAW,QAAQ,KACvC,oBAAoB,WAAW,MAAM;AAAA,EAE7C,CAAC;AACD,MAAI,WAAW,SAAS,GAAG;AACvB,UAAM,IAAI;AAAA,MACN,GAAG,WAAW,SAAS,IAAI,sBAAsB,gBAAgB,iBACxD,WAAW,KAAK,MAAM,CAAC;AAAA,IAEpC;AAAA,EACJ;AACJ;AAMO,SAAS,iBACZ,SACiD;AACjD,QAAM,MAA8B,CAAC;AACrC,aAAW,cAAc,SAAS;AAC9B,QAAI,WAAW,YAAY,CAAC,IAAI,QAAQ,UAAU;AAAA,EACtD;AACA,SAAO;AACX;;;AC5FO,SAAS,oBAAoB,EAAE,SAAS,IAAI,GAAyB;AACxE,MAAI,WAAW,SAAS;AACpB,sCAAkC,OAAO;AAAA,EAC7C;AACA,QAAM,gBAAgB,WAAW,iBAAiB,OAAO;AACzD,SAAO,eAAe,gBAA2B;AAAA,IAC7C;AAAA,IACA;AAAA,EACJ,GAAoD;AAChD,UAAM,OAAO,KAAK,UAAU,OAAO;AACnC,UAAM,cAAc;AAAA,MAChB;AAAA,MACA,SAAS;AAAA,QACL,GAAG;AAAA;AAAA,QAEH,QAAQ;AAAA,QACR,kBAAkB,KAAK,OAAO,SAAS;AAAA,QACvC,gBAAgB;AAAA,MACpB;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,IACJ;AACA,UAAM,WAAW,MAAM,EAAU,KAAK,WAAW;AACjD,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,IAAI,gBAAgB;AAAA,QACtB,SAAS,SAAS;AAAA,QAClB,YAAY,SAAS;AAAA,MACzB,CAAC;AAAA,IACL;AACA,WAAQ,MAAM,SAAS,KAAK;AAAA,EAChC;AACJ","sourcesContent":["// Clever obfuscation to prevent the build system from inlining the value of `NODE_ENV`\nexport const __DEV__ = /* @__PURE__ */ (() => (process as any)['en' + 'v'].NODE_ENV === 'development')();\n","// TODO(https://github.com/solana-labs/solana-web3.js/issues/1787) Write HTTP/2 implementation.\nexport default globalThis.fetch; // The Fetch API is supported natively in Node 18+.\n","type SolanaHttpErrorDetails = Readonly<{\n statusCode: number;\n message: string;\n}>;\n\nexport class SolanaHttpError extends Error {\n readonly statusCode: number;\n constructor(details: SolanaHttpErrorDetails) {\n super(`HTTP error (${details.statusCode}): ${details.message}`);\n Error.captureStackTrace(this, this.constructor);\n this.statusCode = details.statusCode;\n }\n get name() {\n return 'SolanaHttpError';\n }\n}\n","export type AllowedHttpRequestHeaders = Readonly<\n { [headerName: string]: string } & {\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 | K // `Foo-Bar`\n | Capitalize<Lowercase<K>> // `Foo-bar`\n | Lowercase<K> // `foo-bar`\n | Uncapitalize<K> // `foo-Bar`\n // `FOO-BAR`\n | Uppercase<K>]?: never;\n }\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 | '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 // No currently available Typescript technique allows you to match on a prefix.\n // | 'Proxy-'\n // | 'Sec-'\n | 'Referer'\n | 'TE'\n | 'Trailer'\n | 'Transfer-Encoding'\n | 'Upgrade'\n | 'Via';\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> = {\n 'accept-charset': true,\n 'accept-encoding': 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 // No currently available Typescript technique allows you to match on a prefix.\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\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 Error(\n `${badHeaders.length > 1 ? 'These headers are' : 'This header is'} forbidden: ` +\n `\\`${badHeaders.join('`, `')}\\`. Learn more at ` +\n 'https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_header_name.',\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 keyof T & string 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 keyof T & string as Lowercase<K>]: T[K] };\n}\n","import fetchImpl from '@solana/fetch-impl';\nimport { RpcTransport } from '@solana/rpc-spec';\n\nimport { SolanaHttpError } from './http-transport-errors';\nimport {\n AllowedHttpRequestHeaders,\n assertIsAllowedHttpRequestHeaders,\n normalizeHeaders,\n} from './http-transport-headers';\n\ntype Config = Readonly<{\n headers?: AllowedHttpRequestHeaders;\n url: string;\n}>;\n\nexport function createHttpTransport({ headers, url }: Config): RpcTransport {\n if (__DEV__ && headers) {\n assertIsAllowedHttpRequestHeaders(headers);\n }\n const customHeaders = headers && normalizeHeaders(headers);\n return async function makeHttpRequest<TResponse>({\n payload,\n signal,\n }: Parameters<RpcTransport>[0]): Promise<TResponse> {\n const body = JSON.stringify(payload);\n const requestInfo = {\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 fetchImpl(url, requestInfo);\n if (!response.ok) {\n throw new SolanaHttpError({\n message: response.statusText,\n statusCode: response.status,\n });\n }\n return (await response.json()) as TResponse;\n };\n}\n"]}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
// ../build-scripts/env-shim.ts
|
|
2
|
+
var __DEV__ = /* @__PURE__ */ (() => process["env"].NODE_ENV === "development")();
|
|
3
|
+
|
|
4
|
+
// ../fetch-impl/dist/index.node.js
|
|
5
|
+
var e = globalThis.fetch;
|
|
6
|
+
|
|
7
|
+
// src/http-transport-errors.ts
|
|
8
|
+
var SolanaHttpError = class extends Error {
|
|
9
|
+
statusCode;
|
|
10
|
+
constructor(details) {
|
|
11
|
+
super(`HTTP error (${details.statusCode}): ${details.message}`);
|
|
12
|
+
Error.captureStackTrace(this, this.constructor);
|
|
13
|
+
this.statusCode = details.statusCode;
|
|
14
|
+
}
|
|
15
|
+
get name() {
|
|
16
|
+
return "SolanaHttpError";
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
// src/http-transport-headers.ts
|
|
21
|
+
var DISALLOWED_HEADERS = {
|
|
22
|
+
accept: true,
|
|
23
|
+
"content-length": true,
|
|
24
|
+
"content-type": true
|
|
25
|
+
};
|
|
26
|
+
var FORBIDDEN_HEADERS = {
|
|
27
|
+
"accept-charset": true,
|
|
28
|
+
"accept-encoding": true,
|
|
29
|
+
"access-control-request-headers": true,
|
|
30
|
+
"access-control-request-method": true,
|
|
31
|
+
connection: true,
|
|
32
|
+
"content-length": true,
|
|
33
|
+
cookie: true,
|
|
34
|
+
date: true,
|
|
35
|
+
dnt: true,
|
|
36
|
+
expect: true,
|
|
37
|
+
host: true,
|
|
38
|
+
"keep-alive": true,
|
|
39
|
+
origin: true,
|
|
40
|
+
"permissions-policy": true,
|
|
41
|
+
// No currently available Typescript technique allows you to match on a prefix.
|
|
42
|
+
// 'proxy-':true,
|
|
43
|
+
// 'sec-':true,
|
|
44
|
+
referer: true,
|
|
45
|
+
te: true,
|
|
46
|
+
trailer: true,
|
|
47
|
+
"transfer-encoding": true,
|
|
48
|
+
upgrade: true,
|
|
49
|
+
via: true
|
|
50
|
+
};
|
|
51
|
+
function assertIsAllowedHttpRequestHeaders(headers) {
|
|
52
|
+
const badHeaders = Object.keys(headers).filter((headerName) => {
|
|
53
|
+
const lowercaseHeaderName = headerName.toLowerCase();
|
|
54
|
+
return DISALLOWED_HEADERS[headerName.toLowerCase()] === true || FORBIDDEN_HEADERS[headerName.toLowerCase()] === true || lowercaseHeaderName.startsWith("proxy-") || lowercaseHeaderName.startsWith("sec-");
|
|
55
|
+
});
|
|
56
|
+
if (badHeaders.length > 0) {
|
|
57
|
+
throw new Error(
|
|
58
|
+
`${badHeaders.length > 1 ? "These headers are" : "This header is"} forbidden: \`${badHeaders.join("`, `")}\`. Learn more at https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_header_name.`
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function normalizeHeaders(headers) {
|
|
63
|
+
const out = {};
|
|
64
|
+
for (const headerName in headers) {
|
|
65
|
+
out[headerName.toLowerCase()] = headers[headerName];
|
|
66
|
+
}
|
|
67
|
+
return out;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// src/http-transport.ts
|
|
71
|
+
function createHttpTransport({ headers, url }) {
|
|
72
|
+
if (__DEV__ && headers) {
|
|
73
|
+
assertIsAllowedHttpRequestHeaders(headers);
|
|
74
|
+
}
|
|
75
|
+
const customHeaders = headers && normalizeHeaders(headers);
|
|
76
|
+
return async function makeHttpRequest({
|
|
77
|
+
payload,
|
|
78
|
+
signal
|
|
79
|
+
}) {
|
|
80
|
+
const body = JSON.stringify(payload);
|
|
81
|
+
const requestInfo = {
|
|
82
|
+
body,
|
|
83
|
+
headers: {
|
|
84
|
+
...customHeaders,
|
|
85
|
+
// Keep these headers lowercase so they will override any user-supplied headers above.
|
|
86
|
+
accept: "application/json",
|
|
87
|
+
"content-length": body.length.toString(),
|
|
88
|
+
"content-type": "application/json; charset=utf-8"
|
|
89
|
+
},
|
|
90
|
+
method: "POST",
|
|
91
|
+
signal
|
|
92
|
+
};
|
|
93
|
+
const response = await e(url, requestInfo);
|
|
94
|
+
if (!response.ok) {
|
|
95
|
+
throw new SolanaHttpError({
|
|
96
|
+
message: response.statusText,
|
|
97
|
+
statusCode: response.status
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
return await response.json();
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export { createHttpTransport };
|
|
105
|
+
//# sourceMappingURL=out.js.map
|
|
106
|
+
//# sourceMappingURL=index.node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../build-scripts/env-shim.ts","../../fetch-impl/src/index.node.ts","../src/http-transport-errors.ts","../src/http-transport-headers.ts","../src/http-transport.ts"],"names":["index_node_default"],"mappings":";AACO,IAAM,UAA2B,uBAAO,QAAgB,KAAU,EAAE,aAAa,eAAe;;;ACAvG,IAAOA,IAAQ,WAAW;;;ACInB,IAAM,kBAAN,cAA8B,MAAM;AAAA,EAC9B;AAAA,EACT,YAAY,SAAiC;AACzC,UAAM,eAAe,QAAQ,UAAU,MAAM,QAAQ,OAAO,EAAE;AAC9D,UAAM,kBAAkB,MAAM,KAAK,WAAW;AAC9C,SAAK,aAAa,QAAQ;AAAA,EAC9B;AAAA,EACA,IAAI,OAAO;AACP,WAAO;AAAA,EACX;AACJ;;;AC2BA,IAAM,qBAA8C;AAAA,EAChD,QAAQ;AAAA,EACR,kBAAkB;AAAA,EAClB,gBAAgB;AACpB;AAEA,IAAM,oBAA6C;AAAA,EAC/C,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,kCAAkC;AAAA,EAClC,iCAAiC;AAAA,EACjC,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,sBAAsB;AAAA;AAAA;AAAA;AAAA,EAItB,SAAS;AAAA,EACT,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,qBAAqB;AAAA,EACrB,SAAS;AAAA,EACT,KAAK;AACT;AAEO,SAAS,kCACZ,SAC4C;AAC5C,QAAM,aAAa,OAAO,KAAK,OAAO,EAAE,OAAO,gBAAc;AACzD,UAAM,sBAAsB,WAAW,YAAY;AACnD,WACI,mBAAmB,WAAW,YAAY,CAAC,MAAM,QACjD,kBAAkB,WAAW,YAAY,CAAC,MAAM,QAChD,oBAAoB,WAAW,QAAQ,KACvC,oBAAoB,WAAW,MAAM;AAAA,EAE7C,CAAC;AACD,MAAI,WAAW,SAAS,GAAG;AACvB,UAAM,IAAI;AAAA,MACN,GAAG,WAAW,SAAS,IAAI,sBAAsB,gBAAgB,iBACxD,WAAW,KAAK,MAAM,CAAC;AAAA,IAEpC;AAAA,EACJ;AACJ;AAMO,SAAS,iBACZ,SACiD;AACjD,QAAM,MAA8B,CAAC;AACrC,aAAW,cAAc,SAAS;AAC9B,QAAI,WAAW,YAAY,CAAC,IAAI,QAAQ,UAAU;AAAA,EACtD;AACA,SAAO;AACX;;;AC5FO,SAAS,oBAAoB,EAAE,SAAS,IAAI,GAAyB;AACxE,MAAI,WAAW,SAAS;AACpB,sCAAkC,OAAO;AAAA,EAC7C;AACA,QAAM,gBAAgB,WAAW,iBAAiB,OAAO;AACzD,SAAO,eAAe,gBAA2B;AAAA,IAC7C;AAAA,IACA;AAAA,EACJ,GAAoD;AAChD,UAAM,OAAO,KAAK,UAAU,OAAO;AACnC,UAAM,cAAc;AAAA,MAChB;AAAA,MACA,SAAS;AAAA,QACL,GAAG;AAAA;AAAA,QAEH,QAAQ;AAAA,QACR,kBAAkB,KAAK,OAAO,SAAS;AAAA,QACvC,gBAAgB;AAAA,MACpB;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,IACJ;AACA,UAAM,WAAW,MAAM,EAAU,KAAK,WAAW;AACjD,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,IAAI,gBAAgB;AAAA,QACtB,SAAS,SAAS;AAAA,QAClB,YAAY,SAAS;AAAA,MACzB,CAAC;AAAA,IACL;AACA,WAAQ,MAAM,SAAS,KAAK;AAAA,EAChC;AACJ","sourcesContent":["// Clever obfuscation to prevent the build system from inlining the value of `NODE_ENV`\nexport const __DEV__ = /* @__PURE__ */ (() => (process as any)['en' + 'v'].NODE_ENV === 'development')();\n","// TODO(https://github.com/solana-labs/solana-web3.js/issues/1787) Write HTTP/2 implementation.\nexport default globalThis.fetch; // The Fetch API is supported natively in Node 18+.\n","type SolanaHttpErrorDetails = Readonly<{\n statusCode: number;\n message: string;\n}>;\n\nexport class SolanaHttpError extends Error {\n readonly statusCode: number;\n constructor(details: SolanaHttpErrorDetails) {\n super(`HTTP error (${details.statusCode}): ${details.message}`);\n Error.captureStackTrace(this, this.constructor);\n this.statusCode = details.statusCode;\n }\n get name() {\n return 'SolanaHttpError';\n }\n}\n","export type AllowedHttpRequestHeaders = Readonly<\n { [headerName: string]: string } & {\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 | K // `Foo-Bar`\n | Capitalize<Lowercase<K>> // `Foo-bar`\n | Lowercase<K> // `foo-bar`\n | Uncapitalize<K> // `foo-Bar`\n // `FOO-BAR`\n | Uppercase<K>]?: never;\n }\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 | '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 // No currently available Typescript technique allows you to match on a prefix.\n // | 'Proxy-'\n // | 'Sec-'\n | 'Referer'\n | 'TE'\n | 'Trailer'\n | 'Transfer-Encoding'\n | 'Upgrade'\n | 'Via';\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> = {\n 'accept-charset': true,\n 'accept-encoding': 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 // No currently available Typescript technique allows you to match on a prefix.\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\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 Error(\n `${badHeaders.length > 1 ? 'These headers are' : 'This header is'} forbidden: ` +\n `\\`${badHeaders.join('`, `')}\\`. Learn more at ` +\n 'https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_header_name.',\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 keyof T & string 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 keyof T & string as Lowercase<K>]: T[K] };\n}\n","import fetchImpl from '@solana/fetch-impl';\nimport { RpcTransport } from '@solana/rpc-spec';\n\nimport { SolanaHttpError } from './http-transport-errors';\nimport {\n AllowedHttpRequestHeaders,\n assertIsAllowedHttpRequestHeaders,\n normalizeHeaders,\n} from './http-transport-headers';\n\ntype Config = Readonly<{\n headers?: AllowedHttpRequestHeaders;\n url: string;\n}>;\n\nexport function createHttpTransport({ headers, url }: Config): RpcTransport {\n if (__DEV__ && headers) {\n assertIsAllowedHttpRequestHeaders(headers);\n }\n const customHeaders = headers && normalizeHeaders(headers);\n return async function makeHttpRequest<TResponse>({\n payload,\n signal,\n }: Parameters<RpcTransport>[0]): Promise<TResponse> {\n const body = JSON.stringify(payload);\n const requestInfo = {\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 fetchImpl(url, requestInfo);\n if (!response.ok) {\n throw new SolanaHttpError({\n message: response.statusText,\n statusCode: response.status,\n });\n }\n return (await response.json()) as TResponse;\n };\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
type SolanaHttpErrorDetails = Readonly<{
|
|
2
|
+
statusCode: number;
|
|
3
|
+
message: string;
|
|
4
|
+
}>;
|
|
5
|
+
export declare class SolanaHttpError extends Error {
|
|
6
|
+
readonly statusCode: number;
|
|
7
|
+
constructor(details: SolanaHttpErrorDetails);
|
|
8
|
+
get name(): string;
|
|
9
|
+
}
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=http-transport-errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-transport-errors.d.ts","sourceRoot":"","sources":["../../src/http-transport-errors.ts"],"names":[],"mappings":"AAAA,KAAK,sBAAsB,GAAG,QAAQ,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACnB,CAAC,CAAC;AAEH,qBAAa,eAAgB,SAAQ,KAAK;IACtC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;gBAChB,OAAO,EAAE,sBAAsB;IAK3C,IAAI,IAAI,WAEP;CACJ"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type AllowedHttpRequestHeaders = Readonly<{
|
|
2
|
+
[headerName: string]: string;
|
|
3
|
+
} & {
|
|
4
|
+
[K in DisallowedHeaders | ForbiddenHeaders as K | Capitalize<Lowercase<K>> | Lowercase<K> | Uncapitalize<K> | Uppercase<K>]?: never;
|
|
5
|
+
}>;
|
|
6
|
+
type DisallowedHeaders = 'Accept' | 'Content-Length' | 'Content-Type' | 'Solana-Client';
|
|
7
|
+
type ForbiddenHeaders = 'Accept-Charset' | 'Accept-Encoding' | 'Access-Control-Request-Headers' | 'Access-Control-Request-Method' | 'Connection' | 'Content-Length' | 'Cookie' | 'Date' | 'DNT' | 'Expect' | 'Host' | 'Keep-Alive' | 'Origin' | 'Permissions-Policy' | 'Referer' | 'TE' | 'Trailer' | 'Transfer-Encoding' | 'Upgrade' | 'Via';
|
|
8
|
+
export declare function assertIsAllowedHttpRequestHeaders(headers: Record<string, string>): asserts headers is AllowedHttpRequestHeaders;
|
|
9
|
+
/**
|
|
10
|
+
* Lowercasing header names makes it easier to override user-supplied headers, such as those defined
|
|
11
|
+
* in the `DisallowedHeaders` type.
|
|
12
|
+
*/
|
|
13
|
+
export declare function normalizeHeaders<T extends Record<string, string>>(headers: T): {
|
|
14
|
+
[K in keyof T & string as Lowercase<K>]: T[K];
|
|
15
|
+
};
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=http-transport-headers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-transport-headers.d.ts","sourceRoot":"","sources":["../../src/http-transport-headers.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,yBAAyB,GAAG,QAAQ,CAC5C;IAAE,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,GAAG;KAG9B,CAAC,IAAI,iBAAiB,GAAG,gBAAgB,IACpC,CAAC,GACD,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GACxB,SAAS,CAAC,CAAC,CAAC,GACZ,YAAY,CAAC,CAAC,CAAC,GAEf,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK;CAC9B,CACJ,CAAC;AAGF,KAAK,iBAAiB,GAAG,QAAQ,GAAG,gBAAgB,GAAG,cAAc,GAAG,eAAe,CAAC;AACxF,KAAK,gBAAgB,GACf,gBAAgB,GAChB,iBAAiB,GACjB,gCAAgC,GAChC,+BAA+B,GAC/B,YAAY,GACZ,gBAAgB,GAChB,QAAQ,GACR,MAAM,GACN,KAAK,GACL,QAAQ,GACR,MAAM,GACN,YAAY,GACZ,QAAQ,GACR,oBAAoB,GAIpB,SAAS,GACT,IAAI,GACJ,SAAS,GACT,mBAAmB,GACnB,SAAS,GACT,KAAK,CAAC;AAmCZ,wBAAgB,iCAAiC,CAC7C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,OAAO,CAAC,OAAO,IAAI,yBAAyB,CAiB9C;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7D,OAAO,EAAE,CAAC,GACX;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,MAAM,IAAI,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,CAMnD"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { RpcTransport } from '@solana/rpc-spec';
|
|
2
|
+
import { AllowedHttpRequestHeaders } from './http-transport-headers.js';
|
|
3
|
+
type Config = Readonly<{
|
|
4
|
+
headers?: AllowedHttpRequestHeaders;
|
|
5
|
+
url: string;
|
|
6
|
+
}>;
|
|
7
|
+
export declare function createHttpTransport({ headers, url }: Config): RpcTransport;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=http-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-transport.d.ts","sourceRoot":"","sources":["../../src/http-transport.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGhD,OAAO,EACH,yBAAyB,EAG5B,MAAM,0BAA0B,CAAC;AAElC,KAAK,MAAM,GAAG,QAAQ,CAAC;IACnB,OAAO,CAAC,EAAE,yBAAyB,CAAC;IACpC,GAAG,EAAE,MAAM,CAAC;CACf,CAAC,CAAC;AAEH,wBAAgB,mBAAmB,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,MAAM,GAAG,YAAY,CA+B1E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@solana/rpc-transport-http",
|
|
3
|
+
"version": "2.0.0-experimental.12ae1c6",
|
|
4
|
+
"description": "An RPC transport that uses HTTP requests",
|
|
5
|
+
"exports": {
|
|
6
|
+
"browser": {
|
|
7
|
+
"import": "./dist/index.browser.js",
|
|
8
|
+
"require": "./dist/index.browser.cjs"
|
|
9
|
+
},
|
|
10
|
+
"node": {
|
|
11
|
+
"import": "./dist/index.node.js",
|
|
12
|
+
"require": "./dist/index.node.cjs"
|
|
13
|
+
},
|
|
14
|
+
"react-native": "./dist/index.native.js",
|
|
15
|
+
"types": "./dist/types/index.d.ts"
|
|
16
|
+
},
|
|
17
|
+
"browser": {
|
|
18
|
+
"./dist/index.node.cjs": "./dist/index.browser.cjs",
|
|
19
|
+
"./dist/index.node.js": "./dist/index.browser.js"
|
|
20
|
+
},
|
|
21
|
+
"main": "./dist/index.node.cjs",
|
|
22
|
+
"module": "./dist/index.node.js",
|
|
23
|
+
"react-native": "./dist/index.native.js",
|
|
24
|
+
"types": "./dist/types/index.d.ts",
|
|
25
|
+
"type": "module",
|
|
26
|
+
"files": [
|
|
27
|
+
"./dist/"
|
|
28
|
+
],
|
|
29
|
+
"sideEffects": false,
|
|
30
|
+
"keywords": [
|
|
31
|
+
"blockchain",
|
|
32
|
+
"solana",
|
|
33
|
+
"web3"
|
|
34
|
+
],
|
|
35
|
+
"author": "Solana Labs Maintainers <maintainers@solanalabs.com>",
|
|
36
|
+
"license": "MIT",
|
|
37
|
+
"repository": {
|
|
38
|
+
"type": "git",
|
|
39
|
+
"url": "https://github.com/solana-labs/solana-web3.js"
|
|
40
|
+
},
|
|
41
|
+
"bugs": {
|
|
42
|
+
"url": "http://github.com/solana-labs/solana-web3.js/issues"
|
|
43
|
+
},
|
|
44
|
+
"browserslist": [
|
|
45
|
+
"supports bigint and not dead",
|
|
46
|
+
"maintained node versions"
|
|
47
|
+
],
|
|
48
|
+
"dependencies": {
|
|
49
|
+
"@solana/rpc-spec": "2.0.0-development"
|
|
50
|
+
},
|
|
51
|
+
"bundlewatch": {
|
|
52
|
+
"defaultCompression": "gzip",
|
|
53
|
+
"files": [
|
|
54
|
+
{
|
|
55
|
+
"path": "./dist/index*.js"
|
|
56
|
+
}
|
|
57
|
+
]
|
|
58
|
+
},
|
|
59
|
+
"scripts": {
|
|
60
|
+
"compile:js": "tsup --config build-scripts/tsup.config.package.ts",
|
|
61
|
+
"compile:typedefs": "tsc -p ./tsconfig.declarations.json && node node_modules/@solana/build-scripts/add-js-extension-to-types.mjs",
|
|
62
|
+
"dev": "jest -c node_modules/@solana/test-config/jest-dev.config.ts --rootDir . --watch",
|
|
63
|
+
"publish-impl": "npm view $npm_package_name@$npm_package_version > /dev/null 2>&1 || pnpm publish --tag experimental --access public --no-git-checks",
|
|
64
|
+
"publish-packages": "pnpm prepublishOnly && pnpm publish-impl",
|
|
65
|
+
"style:fix": "pnpm eslint --fix src/* && pnpm prettier -w src/* package.json",
|
|
66
|
+
"test:lint": "jest -c node_modules/@solana/test-config/jest-lint.config.ts --rootDir . --silent",
|
|
67
|
+
"test:prettier": "jest -c node_modules/@solana/test-config/jest-prettier.config.ts --rootDir . --silent",
|
|
68
|
+
"test:treeshakability:browser": "agadoo dist/index.browser.js",
|
|
69
|
+
"test:treeshakability:native": "agadoo dist/index.native.js",
|
|
70
|
+
"test:treeshakability:node": "agadoo dist/index.node.js",
|
|
71
|
+
"test:typecheck": "tsc --noEmit",
|
|
72
|
+
"test:unit:browser": "jest -c node_modules/@solana/test-config/jest-unit.config.browser.ts --rootDir . --silent",
|
|
73
|
+
"test:unit:node": "jest -c node_modules/@solana/test-config/jest-unit.config.node.ts --rootDir . --silent"
|
|
74
|
+
}
|
|
75
|
+
}
|