From 3e8d855fa45ad19a3ea1087510f40c636b42be0e Mon Sep 17 00:00:00 2001 From: Denis Davidyuk Date: Wed, 5 Feb 2025 23:17:24 +0100 Subject: [PATCH] refactor: drop bluebird --- babel.config.js | 7 +- package-lock.json | 231 +++++++++++-------- package.json | 4 +- src/lib/__tests__/rpc.js | 48 ++-- src/lib/rpc.js | 114 +++++---- src/lib/setGlobalPolyfills.js | 10 - src/pages/aens/AuctionBid.vue | 20 +- src/pages/desktop/Send.vue | 3 + src/store/modules/accounts/airGap.js | 23 +- src/store/modules/accounts/hdWallet.js | 25 +- src/store/modules/accounts/hdWalletRemote.js | 4 +- src/store/modules/accounts/index.js | 8 +- src/store/modules/accounts/ledger.js | 23 +- src/store/modules/accounts/utils.js | 21 +- src/store/plugins/initSdk.js | 44 ++-- src/store/plugins/remoteConnection.js | 10 +- src/store/plugins/reverseIframe.js | 1 - src/store/plugins/ui/modals.js | 26 ++- src/store/plugins/ui/observables.js | 8 +- 19 files changed, 345 insertions(+), 285 deletions(-) diff --git a/babel.config.js b/babel.config.js index ee4c98f22..ef06c2e6a 100644 --- a/babel.config.js +++ b/babel.config.js @@ -3,10 +3,7 @@ module.exports = { '@vue/cli-plugin-babel/preset', ], plugins: [ - ['@babel/plugin-transform-async-to-generator', { - module: 'bluebird', - method: 'coroutine', - }], - ['@babel/plugin-syntax-import-attributes'], + '@babel/plugin-syntax-import-attributes', + '@babel/plugin-transform-private-methods', ], }; diff --git a/package-lock.json b/package-lock.json index 2fd832465..93c29251e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,6 @@ "@ledgerhq/hw-transport-webusb": "6.28.6", "@zxing/library": "^0.21.0", "bignumber.js": "^9.1.2", - "bluebird": "^3.7.2", "buffer": "^6.0.3", "copy-to-clipboard": "^3.3.3", "emoji-datasource-apple": "^15.1.2", @@ -40,13 +39,14 @@ "vue-i18n": "^8.28.2", "vue-router": "^3.6.5", "vue-rx": "^6.2.0", - "vuex": "3.3.0", + "vuex": "^3.6.2", "vuex-router-sync": "^5.0.0", "workbox-precaching": "^7.1.0" }, "devDependencies": { "@babel/eslint-parser": "^7.24.6", "@babel/plugin-syntax-import-attributes": "^7.24.6", + "@babel/plugin-transform-private-methods": "^7.25.9", "@frsource/cypress-plugin-visual-regression-diff": "^3.3.10", "@intlify/eslint-plugin-vue-i18n": "^2.0.0", "@vue/cli-plugin-babel": "^5.0.8", @@ -503,13 +503,15 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" @@ -587,26 +589,30 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", + "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@babel/parser": "^7.26.5", + "@babel/types": "^7.26.5", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.18.6", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -641,18 +647,19 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.21.4", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", + "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-member-expression-to-functions": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/helper-split-export-declaration": "^7.18.6" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -735,11 +742,14 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.21.0", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.21.0" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -777,21 +787,24 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.18.6", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.6.tgz", - "integrity": "sha512-MZG/JcWfxybKwsA9N9PmtF2lOSFSEMVCpIRrbxccZFLJPrJciJdG/UhSh5W96GEteJI2ARqm5UAHxISwRDLSNg==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -814,19 +827,21 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.20.7", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz", + "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.20.7", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.26.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-simple-access": { @@ -842,11 +857,14 @@ } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.20.0" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -864,17 +882,18 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", - "dev": true, + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "dev": true, + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -917,24 +936,14 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "dev": true, + "node_modules/@babel/parser": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz", + "integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==", + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "@babel/types": "^7.26.7" }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", - "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1815,6 +1824,23 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", + "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-property-literals": { "version": "7.18.6", "dev": true, @@ -2113,32 +2139,32 @@ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "node_modules/@babel/template": { - "version": "7.22.15", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", - "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.7.tgz", + "integrity": "sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.6", - "@babel/types": "^7.23.6", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.5", + "@babel/parser": "^7.26.7", + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.7", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2147,14 +2173,13 @@ } }, "node_modules/@babel/types": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", - "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", - "dev": true, + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz", + "integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==", + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -3739,13 +3764,15 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" @@ -3760,7 +3787,9 @@ } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "license": "MIT", "engines": { @@ -8962,6 +8991,7 @@ }, "node_modules/bluebird": { "version": "3.7.2", + "dev": true, "license": "MIT" }, "node_modules/body-parser": { @@ -12851,6 +12881,7 @@ "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, "optional": true, "dependencies": { "iconv-lite": "^0.6.2" @@ -12860,6 +12891,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, "optional": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -20746,14 +20778,16 @@ } }, "node_modules/jsesc": { - "version": "2.5.2", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json-bigint": { @@ -25600,7 +25634,7 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", - "devOptional": true, + "dev": true, "license": "MIT" }, "node_modules/sass": { @@ -27808,14 +27842,6 @@ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -28912,7 +28938,9 @@ "license": "MIT" }, "node_modules/vuex": { - "version": "3.3.0", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/vuex/-/vuex-3.6.2.tgz", + "integrity": "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw==", "license": "MIT", "peerDependencies": { "vue": "^2.0.0" @@ -30111,6 +30139,7 @@ }, "node_modules/ws": { "version": "7.5.9", + "dev": true, "license": "MIT", "engines": { "node": ">=8.3.0" diff --git a/package.json b/package.json index ae8bb03bf..04dedcde5 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,6 @@ "@ledgerhq/hw-transport-webusb": "6.28.6", "@zxing/library": "^0.21.0", "bignumber.js": "^9.1.2", - "bluebird": "^3.7.2", "buffer": "^6.0.3", "copy-to-clipboard": "^3.3.3", "emoji-datasource-apple": "^15.1.2", @@ -50,13 +49,14 @@ "vue-i18n": "^8.28.2", "vue-router": "^3.6.5", "vue-rx": "^6.2.0", - "vuex": "3.3.0", + "vuex": "^3.6.2", "vuex-router-sync": "^5.0.0", "workbox-precaching": "^7.1.0" }, "devDependencies": { "@babel/eslint-parser": "^7.24.6", "@babel/plugin-syntax-import-attributes": "^7.24.6", + "@babel/plugin-transform-private-methods": "^7.25.9", "@frsource/cypress-plugin-visual-regression-diff": "^3.3.10", "@intlify/eslint-plugin-vue-i18n": "^2.0.0", "@vue/cli-plugin-babel": "^5.0.8", diff --git a/src/lib/__tests__/rpc.js b/src/lib/__tests__/rpc.js index 859a9e4c4..219671dbd 100644 --- a/src/lib/__tests__/rpc.js +++ b/src/lib/__tests__/rpc.js @@ -1,8 +1,6 @@ import { noop } from 'lodash-es'; -import Promise from 'bluebird'; -import RPC from '../rpc'; +import RpcPeer, { markAbortable } from '../rpc'; -Promise.config({ cancellation: true }); const testMethodName = 'test-method-name'; const testArgs = ['test', 'args']; @@ -15,14 +13,14 @@ describe('notifications', () => { it('sends', () => { const messageHandler = jest.fn(); - const client = new RPC(messageHandler); + const client = new RpcPeer(messageHandler); client.notification(testMethodName, ...testArgs); expect(messageHandler).toHaveBeenCalledWith(testNotification); }); it('processes', async () => { const notificationHandler = jest.fn(); - const server = new RPC(noop, { + const server = new RpcPeer(noop, { [testMethodName]: notificationHandler, }); await server.processMessage(testNotification); @@ -57,7 +55,7 @@ describe('calls', () => { describe('client', () => { it('sends request', () => { const messageHandler = jest.fn(); - const client = new RPC(messageHandler); + const client = new RpcPeer(messageHandler); client.call(testMethodName, ...testArgs); expect(messageHandler).toHaveBeenCalledWith(testRequest); }); @@ -69,33 +67,35 @@ describe('calls', () => { ); if (messageHandler.mock.calls.length === 2) done(); }); - const client = new RPC(messageHandler); - const promise = client.call(testMethodName, ...testArgs); - promise.cancel(); + const client = new RpcPeer(messageHandler); + const controller = new AbortController(); + expect(client.call({ method: testMethodName, signal: controller.signal }, ...testArgs)) + .rejects.toThrow('Request aborted'); + controller.abort(); }); it('receives response', () => { - const client = new RPC(noop); + const client = new RpcPeer(noop); const promise = client.call(testMethodName, ...testArgs); client.processMessage(testResponse); expect(promise).resolves.toBe(testResult); }); it('receives exception', () => { - const client = new RPC(noop); + const client = new RpcPeer(noop); const promise = client.call(testMethodName, ...testArgs); client.processMessage(testErrorResponse); expect(promise).rejects.toThrow(testError); }); it('throws error if response with invalid id', async () => { - const client = new RPC(noop); + const client = new RpcPeer(noop); expect(() => client.processMessage(testResponse)) .toThrow('Can\'t find request with id'); }); it('throws error if message type is invalid', async () => { - const client = new RPC(noop); + const client = new RpcPeer(noop); client.call(testMethodName, ...testArgs); expect(() => client.processMessage({ id: 1, type: 'invalid' })) .toThrow('Invalid response message type'); @@ -105,7 +105,7 @@ describe('calls', () => { describe('server', () => { it('process request', async () => { const requestHandler = jest.fn(); - const server = new RPC(noop, { + const server = new RpcPeer(noop, { [testMethodName]: requestHandler, }); await server.processMessage(testRequest); @@ -113,18 +113,20 @@ describe('calls', () => { }); it('cancels request', () => { - const requestPromise = new Promise(noop); - const server = new RPC(noop, { - [testMethodName]: () => requestPromise, + const abortHandler = jest.fn(); + const server = new RpcPeer(noop, { + [testMethodName]: markAbortable((signal) => { + signal.addEventListener('abort', abortHandler); + }), }); server.processMessage(testRequest); server.processMessage(testRequestCancel); - expect(requestPromise.isCancelled()).toBe(true); + expect(abortHandler).toHaveBeenCalledTimes(1); }); it('sends response', async () => { const messageHandler = jest.fn(); - const server = new RPC(messageHandler, { + const server = new RpcPeer(messageHandler, { [testMethodName]: () => testResult, }); await server.processMessage(testRequest); @@ -133,7 +135,7 @@ describe('calls', () => { it('sends exception', async () => { const messageHandler = jest.fn(); - const server = new RPC(messageHandler, { + const server = new RpcPeer(messageHandler, { [testMethodName]() { throw testError; }, @@ -144,7 +146,7 @@ describe('calls', () => { it('sends error if method not found', async () => { const messageHandler = jest.fn(); - const server = new RPC(messageHandler); + const server = new RpcPeer(messageHandler); await server.processMessage(testRequest); expect(messageHandler).toHaveBeenCalledWith({ id: 1, @@ -154,11 +156,11 @@ describe('calls', () => { it('sends error if cancelling not existing request', () => { const messageHandler = jest.fn(); - const server = new RPC(messageHandler); + const server = new RpcPeer(messageHandler); server.processMessage(testRequestCancel); expect(messageHandler).toHaveBeenCalledWith({ id: testRequestCancel.id, - error: 'Can\'t cancel request: it\'s not found', + error: 'Can\'t cancel request: its abort controller not found', }); }); }); diff --git a/src/lib/rpc.js b/src/lib/rpc.js index a4d533a6c..755a6effc 100644 --- a/src/lib/rpc.js +++ b/src/lib/rpc.js @@ -1,37 +1,51 @@ -import Promise from 'bluebird'; - const NOTIFICATION = 'notification'; const REQUEST = 'request'; const REQUEST_CANCEL = 'request-cancel'; const RESPONSE = 'response'; const ERROR = 'error'; +const abortable = Symbol('abortable'); + +export const markAbortable = (func) => { + const f = func.bind({}); + f[abortable] = true; + return f; +}; + export default class RpcPeer { + #id = 0; + + #pendingRequests = {}; + + #responseControllers = {}; + + #send; + + #handlers = {}; + constructor(send, handlers = {}) { - Object.assign(this, { send, handlers }); - this.id = 0; - this.pendingRequests = {}; - this.responsePromises = {}; + this.#send = send; + this.#handlers = handlers; } processMessage(message) { if (message.type === REQUEST_CANCEL) { - const promise = this.responsePromises[message.id]; - if (!promise) { - this.send({ id: message.id, error: 'Can\'t cancel request: it\'s not found' }); - return undefined; + const controller = this.#responseControllers[message.id]; + if (!controller) { + this.#send({ id: message.id, error: 'Can\'t cancel request: its abort controller not found' }); + return Promise.resolve(); } - promise.cancel(); + controller.abort(); return Promise.resolve(); } return [NOTIFICATION, REQUEST].includes(message.type) - ? this.processRequestMessage(message) - : this.processResponseMessage(message); + ? this.#processRequestMessage(message) + : this.#processResponseMessage(message); } - async processRequestMessage(message) { - if (!this.handlers[message.method]) { - this.send({ + async #processRequestMessage(message) { + if (!this.#handlers[message.method]) { + this.#send({ id: message.id, error: 'Method not found', }); @@ -39,21 +53,30 @@ export default class RpcPeer { } switch (message.type) { case NOTIFICATION: - this.handlers[message.method](...message.params); + this.#handlers[message.method](...message.params); break; case REQUEST: { const response = { id: message.id }; + let controller; try { - const promise = Promise.resolve(this.handlers[message.method](...message.params)); - this.responsePromises[message.id] = promise; - response.result = await promise; + const params = [...message.params]; + const handler = this.#handlers[message.method]; + if (handler[abortable]) { + params.length = handler.length; + controller = new AbortController(); + params[params.length - 1] = controller.signal; + this.#responseControllers[message.id] = controller; + } + response.result = await handler(...params); response.type = RESPONSE; - } catch (e) { - response.error = e.toString(); + } catch (error) { + if (controller?.signal.aborted) return; + response.error = error.message; response.type = ERROR; + } finally { + delete this.#responseControllers[message.id]; } - delete this.responsePromises[message.id]; - this.send(response); + this.#send(response); break; } default: @@ -61,39 +84,48 @@ export default class RpcPeer { } } - processResponseMessage(message) { - if (!this.pendingRequests[message.id]) { + #processResponseMessage(message) { + if (!this.#pendingRequests[message.id]) { throw new Error(`Can't find request with id: ${message.id}`); } switch (message.type) { case RESPONSE: - this.pendingRequests[message.id].resolve(message.result); + this.#pendingRequests[message.id].resolve(message.result); break; case ERROR: - this.pendingRequests[message.id].reject(new Error(message.error)); + this.#pendingRequests[message.id].reject(new Error(message.error)); break; default: throw new Error(`Invalid response message type: '${message.type}'`); } - delete this.pendingRequests[message.id]; + delete this.#pendingRequests[message.id]; } - call(method, ...params) { - this.id += 1; - const { id } = this; - this.send({ + call(methodOrObj, ...params) { + const method = typeof methodOrObj === 'string' ? methodOrObj : methodOrObj.method; + this.#id += 1; + const id = this.#id; + this.#send({ id, type: REQUEST, method, params, }); - return new Promise((resolve, reject, onCancel) => { - this.pendingRequests[id] = { resolve, reject }; - onCancel(() => { - this.send({ id, type: REQUEST_CANCEL }); - delete this.pendingRequests[id]; - }); - }); + let abort; + return new Promise((resolve, reject) => { + abort = () => { + this.#send({ id, type: REQUEST_CANCEL }); + delete this.#pendingRequests[id]; + reject(new Error('Request aborted')); + }; + methodOrObj.signal?.addEventListener('abort', abort); + this.#pendingRequests[id] = { resolve, reject }; + }).finally(() => methodOrObj.signal?.removeEventListener('abort', abort)); + } + + cancelCall(id) { + this.#send({ id, type: REQUEST_CANCEL }); + delete this.#pendingRequests[id]; } notification(method, ...params) { - this.send({ type: NOTIFICATION, method, params }); + this.#send({ type: NOTIFICATION, method, params }); } } diff --git a/src/lib/setGlobalPolyfills.js b/src/lib/setGlobalPolyfills.js index 1459fb17e..ed3921d29 100644 --- a/src/lib/setGlobalPolyfills.js +++ b/src/lib/setGlobalPolyfills.js @@ -1,14 +1,4 @@ -import Promise from 'bluebird'; - -Promise.config({ - cancellation: true, - warnings: { - wForgottenReturn: false, - }, -}); - Object.assign(window, { Int32Array, Uint8ClampedArray, - Promise, }); diff --git a/src/pages/aens/AuctionBid.vue b/src/pages/aens/AuctionBid.vue index 83fb29304..3a3731cd5 100644 --- a/src/pages/aens/AuctionBid.vue +++ b/src/pages/aens/AuctionBid.vue @@ -76,7 +76,7 @@