UNPKG

4.36 kBJavaScriptView Raw
1"use strict";
2import { deepCopy, defineReadOnly } from "@ethersproject/properties";
3import { Logger } from "@ethersproject/logger";
4import { version } from "./_version";
5const logger = new Logger(version);
6import { JsonRpcProvider } from "./json-rpc-provider";
7let _nextId = 1;
8function buildWeb3LegacyFetcher(provider, sendFunc) {
9 const fetcher = "Web3LegacyFetcher";
10 return function (method, params) {
11 const request = {
12 method: method,
13 params: params,
14 id: (_nextId++),
15 jsonrpc: "2.0"
16 };
17 return new Promise((resolve, reject) => {
18 this.emit("debug", {
19 action: "request",
20 fetcher,
21 request: deepCopy(request),
22 provider: this
23 });
24 sendFunc(request, (error, response) => {
25 if (error) {
26 this.emit("debug", {
27 action: "response",
28 fetcher,
29 error,
30 request,
31 provider: this
32 });
33 return reject(error);
34 }
35 this.emit("debug", {
36 action: "response",
37 fetcher,
38 request,
39 response,
40 provider: this
41 });
42 if (response.error) {
43 const error = new Error(response.error.message);
44 error.code = response.error.code;
45 error.data = response.error.data;
46 return reject(error);
47 }
48 resolve(response.result);
49 });
50 });
51 };
52}
53function buildEip1193Fetcher(provider) {
54 return function (method, params) {
55 if (params == null) {
56 params = [];
57 }
58 const request = { method, params };
59 this.emit("debug", {
60 action: "request",
61 fetcher: "Eip1193Fetcher",
62 request: deepCopy(request),
63 provider: this
64 });
65 return provider.request(request).then((response) => {
66 this.emit("debug", {
67 action: "response",
68 fetcher: "Eip1193Fetcher",
69 request,
70 response,
71 provider: this
72 });
73 return response;
74 }, (error) => {
75 this.emit("debug", {
76 action: "response",
77 fetcher: "Eip1193Fetcher",
78 request,
79 error,
80 provider: this
81 });
82 throw error;
83 });
84 };
85}
86export class Web3Provider extends JsonRpcProvider {
87 constructor(provider, network) {
88 if (provider == null) {
89 logger.throwArgumentError("missing provider", "provider", provider);
90 }
91 let path = null;
92 let jsonRpcFetchFunc = null;
93 let subprovider = null;
94 if (typeof (provider) === "function") {
95 path = "unknown:";
96 jsonRpcFetchFunc = provider;
97 }
98 else {
99 path = provider.host || provider.path || "";
100 if (!path && provider.isMetaMask) {
101 path = "metamask";
102 }
103 subprovider = provider;
104 if (provider.request) {
105 if (path === "") {
106 path = "eip-1193:";
107 }
108 jsonRpcFetchFunc = buildEip1193Fetcher(provider);
109 }
110 else if (provider.sendAsync) {
111 jsonRpcFetchFunc = buildWeb3LegacyFetcher(provider, provider.sendAsync.bind(provider));
112 }
113 else if (provider.send) {
114 jsonRpcFetchFunc = buildWeb3LegacyFetcher(provider, provider.send.bind(provider));
115 }
116 else {
117 logger.throwArgumentError("unsupported provider", "provider", provider);
118 }
119 if (!path) {
120 path = "unknown:";
121 }
122 }
123 super(path, network);
124 defineReadOnly(this, "jsonRpcFetchFunc", jsonRpcFetchFunc);
125 defineReadOnly(this, "provider", subprovider);
126 }
127 send(method, params) {
128 return this.jsonRpcFetchFunc(method, params);
129 }
130}
131//# sourceMappingURL=web3-provider.js.map
\No newline at end of file