From 4e8b741ea216f54a2fce0fc66a6d91d0d2463183 Mon Sep 17 00:00:00 2001 From: Luke Childs Date: Tue, 21 Apr 2020 14:26:55 +0700 Subject: [PATCH] Refactor XMLHttpRequest to use isomorphic-fetch --- package-lock.json | 43 ++++++++++++++++++++++++++++++++++++++----- package.json | 4 +++- src/index.js | 33 ++++++++++++++++----------------- ts_src/index.ts | 35 ++++++++++++++++++----------------- 4 files changed, 75 insertions(+), 40 deletions(-) diff --git a/package-lock.json b/package-lock.json index a943f22..03d0003 100644 --- a/package-lock.json +++ b/package-lock.json @@ -651,6 +651,11 @@ "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", "dev": true }, + "@types/isomorphic-fetch": { + "version": "0.0.35", + "resolved": "https://registry.npmjs.org/@types/isomorphic-fetch/-/isomorphic-fetch-0.0.35.tgz", + "integrity": "sha512-DaZNUvLDCAnCTjgwxgiL1eQdxIKEpNLOlTNtAgnZc50bG2copGhRrFN9/PxPBuJe+tZVLCbQ7ls0xveXVRPkvw==" + }, "@types/istanbul-lib-coverage": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", @@ -1654,6 +1659,14 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "~0.4.13" + } + }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -2207,7 +2220,6 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -2365,8 +2377,7 @@ "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "is-typedarray": { "version": "1.0.0", @@ -2405,6 +2416,15 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "requires": { + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" + } + }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -3315,6 +3335,15 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + }, "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -3917,8 +3946,7 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sane": { "version": "4.1.0", @@ -4965,6 +4993,11 @@ "iconv-lite": "0.4.24" } }, + "whatwg-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", + "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" + }, "whatwg-mimetype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", diff --git a/package.json b/package.json index 947b672..9b482c1 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,9 @@ "src" ], "dependencies": { - "bitcoinjs-lib": "^5.1.7" + "@types/isomorphic-fetch": "0.0.35", + "bitcoinjs-lib": "^5.1.7", + "isomorphic-fetch": "^2.2.1" }, "devDependencies": { "@types/jest": "^25.2.1", diff --git a/src/index.js b/src/index.js index 16acc04..436fc8d 100644 --- a/src/index.js +++ b/src/index.js @@ -1,6 +1,7 @@ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); const bitcoinjs_lib_1 = require('bitcoinjs-lib'); +const fetch = require('isomorphic-fetch'); async function requestPayjoinWithCustomRemoteCall(psbt, remoteCall) { const clonedPsbt = psbt.clone(); clonedPsbt.finalizeAllInputs(); @@ -219,22 +220,20 @@ function getGlobalTransaction(psbt) { // @ts-ignore return psbt.__CACHE.__TX; } -function doRequest(psbt, payjoinEndpoint) { - return new Promise((resolve, reject) => { - if (!psbt) { - reject(); - } - const xhr = new XMLHttpRequest(); - xhr.onreadystatechange = () => { - if (xhr.readyState !== 4) return; - if (xhr.status >= 200 && xhr.status < 300) { - resolve(bitcoinjs_lib_1.Psbt.fromHex(xhr.responseText)); - } else { - reject(xhr.responseText); - } - }; - xhr.setRequestHeader('Content-Type', 'text/plain'); - xhr.open('POST', payjoinEndpoint); - xhr.send(psbt.toHex()); +async function doRequest(psbt, payjoinEndpoint) { + if (!psbt) { + throw new Error(); + } + const response = await fetch(payjoinEndpoint, { + method: 'POST', + headers: new Headers({ + 'Content-Type': 'text/plain', + }), + body: psbt.toHex(), }); + const responseText = await response.text(); + if (!response.ok) { + throw new Error(responseText); + } + return bitcoinjs_lib_1.Psbt.fromBase64(responseText); } diff --git a/ts_src/index.ts b/ts_src/index.ts index 581ed96..63dd1e2 100644 --- a/ts_src/index.ts +++ b/ts_src/index.ts @@ -4,6 +4,7 @@ import { GlobalXpub, PsbtInput, } from 'bip174/src/lib/interfaces'; +import * as fetch from 'isomorphic-fetch'; type Nullable = T | null; @@ -254,26 +255,26 @@ function getGlobalTransaction(psbt: Psbt): Transaction { return psbt.__CACHE.__TX; } -function doRequest( +async function doRequest( psbt: Psbt, payjoinEndpoint: string, ): Promise> { - return new Promise>((resolve, reject): void => { - if (!psbt) { - reject(); - } + if (!psbt) { + throw new Error(); + } - const xhr = new XMLHttpRequest(); - xhr.onreadystatechange = (): void => { - if (xhr.readyState !== 4) return; - if (xhr.status >= 200 && xhr.status < 300) { - resolve(Psbt.fromHex(xhr.responseText)); - } else { - reject(xhr.responseText); - } - }; - xhr.setRequestHeader('Content-Type', 'text/plain'); - xhr.open('POST', payjoinEndpoint); - xhr.send(psbt.toHex()); + const response = await fetch(payjoinEndpoint, { + method: 'POST', + headers: new Headers({ + 'Content-Type': 'text/plain', + }), + body: psbt.toHex(), }); + const responseText = await response.text(); + + if (!response.ok) { + throw new Error(responseText); + } + + return Psbt.fromBase64(responseText); }