web3-provider.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. "use strict";
  2. import { deepCopy, defineReadOnly } from "@ethersproject/properties";
  3. import { Logger } from "@ethersproject/logger";
  4. import { version } from "./_version";
  5. const logger = new Logger(version);
  6. import { JsonRpcProvider } from "./json-rpc-provider";
  7. let _nextId = 1;
  8. function 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. }
  53. function 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. }
  86. export class Web3Provider extends JsonRpcProvider {
  87. constructor(provider, network) {
  88. logger.checkNew(new.target, Web3Provider);
  89. if (provider == null) {
  90. logger.throwArgumentError("missing provider", "provider", provider);
  91. }
  92. let path = null;
  93. let jsonRpcFetchFunc = null;
  94. let subprovider = null;
  95. if (typeof (provider) === "function") {
  96. path = "unknown:";
  97. jsonRpcFetchFunc = provider;
  98. }
  99. else {
  100. path = provider.host || provider.path || "";
  101. if (!path && provider.isMetaMask) {
  102. path = "metamask";
  103. }
  104. subprovider = provider;
  105. if (provider.request) {
  106. if (path === "") {
  107. path = "eip-1193:";
  108. }
  109. jsonRpcFetchFunc = buildEip1193Fetcher(provider);
  110. }
  111. else if (provider.sendAsync) {
  112. jsonRpcFetchFunc = buildWeb3LegacyFetcher(provider, provider.sendAsync.bind(provider));
  113. }
  114. else if (provider.send) {
  115. jsonRpcFetchFunc = buildWeb3LegacyFetcher(provider, provider.send.bind(provider));
  116. }
  117. else {
  118. logger.throwArgumentError("unsupported provider", "provider", provider);
  119. }
  120. if (!path) {
  121. path = "unknown:";
  122. }
  123. }
  124. super(path, network);
  125. defineReadOnly(this, "jsonRpcFetchFunc", jsonRpcFetchFunc);
  126. defineReadOnly(this, "provider", subprovider);
  127. }
  128. send(method, params) {
  129. return this.jsonRpcFetchFunc(method, params);
  130. }
  131. }
  132. //# sourceMappingURL=web3-provider.js.map