@trezor/connect 9.0.6 → 9.0.8

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.
Files changed (97) hide show
  1. package/CHANGELOG.md +22 -2
  2. package/README.md +1 -1
  3. package/lib/api/authorizeCoinjoin.d.ts +7 -0
  4. package/lib/api/{authorizeCoinJoin.js → authorizeCoinjoin.js} +3 -3
  5. package/lib/api/bitcoin/createPendingTx.d.ts +35 -0
  6. package/lib/api/bitcoin/createPendingTx.js +60 -0
  7. package/lib/api/bitcoin/index.d.ts +1 -0
  8. package/lib/api/bitcoin/index.js +1 -0
  9. package/lib/api/blockchainGetAccountBalanceHistory.d.ts +1 -1
  10. package/lib/api/blockchainGetCurrentFiatRates.d.ts +2 -1
  11. package/lib/api/blockchainGetCurrentFiatRates.js +6 -1
  12. package/lib/api/blockchainGetFiatRatesForTimestamps.d.ts +3 -1
  13. package/lib/api/blockchainGetFiatRatesForTimestamps.js +9 -1
  14. package/lib/api/blockchainGetTransactions.d.ts +1 -1
  15. package/lib/api/cardano/cardanoAuxiliaryData.js +43 -23
  16. package/lib/api/cardanoSignTransaction.d.ts +2 -1
  17. package/lib/api/cardanoSignTransaction.js +21 -11
  18. package/lib/api/composeTransaction.js +2 -2
  19. package/lib/api/ethereum/ethereumDefinitions.d.ts +7 -0
  20. package/lib/api/ethereum/ethereumDefinitions.js +43 -0
  21. package/lib/api/ethereum/ethereumSignTx.d.ts +3 -2
  22. package/lib/api/ethereum/ethereumSignTx.js +4 -2
  23. package/lib/api/ethereumGetAddress.d.ts +2 -1
  24. package/lib/api/ethereumGetAddress.js +19 -2
  25. package/lib/api/ethereumSignMessage.js +13 -0
  26. package/lib/api/ethereumSignTransaction.js +10 -3
  27. package/lib/api/ethereumSignTypedData.js +13 -0
  28. package/lib/api/firmware/getBinary.d.ts +3 -12
  29. package/lib/api/firmware/getBinary.js +5 -9
  30. package/lib/api/firmwareUpdate.d.ts +3 -2
  31. package/lib/api/firmwareUpdate.js +4 -5
  32. package/lib/api/getAccountInfo.d.ts +8 -8
  33. package/lib/api/getAccountInfo.js +1 -1
  34. package/lib/api/index.d.ts +1 -1
  35. package/lib/api/index.js +3 -3
  36. package/lib/api/setBusy.js +1 -4
  37. package/lib/api/setProxy.js +1 -1
  38. package/lib/api/signTransaction.d.ts +2 -1
  39. package/lib/api/signTransaction.js +12 -2
  40. package/lib/api/unlockPath.js +1 -4
  41. package/lib/backend/Blockchain.d.ts +3 -0
  42. package/lib/core/AbstractMethod.d.ts +1 -0
  43. package/lib/core/AbstractMethod.js +9 -0
  44. package/lib/core/index.d.ts +1 -1
  45. package/lib/core/index.js +24 -11
  46. package/lib/core/method.d.ts +1 -1
  47. package/lib/data/DataManager.d.ts +92 -15
  48. package/lib/data/DataManager.js +3 -53
  49. package/lib/data/config.js +9 -3
  50. package/lib/data/connectSettings.d.ts +0 -1
  51. package/lib/data/connectSettings.js +14 -58
  52. package/lib/data/firmwareInfo.js +48 -46
  53. package/lib/data/transportInfo.d.ts +1 -0
  54. package/lib/data/transportInfo.js +14 -1
  55. package/lib/data/udevInfo.d.ts +1 -0
  56. package/lib/data/udevInfo.js +14 -1
  57. package/lib/data/version.d.ts +1 -1
  58. package/lib/data/version.js +1 -1
  59. package/lib/device/DescriptorStream.js +1 -1
  60. package/lib/device/Device.js +1 -2
  61. package/lib/device/DeviceCommands.d.ts +1 -1
  62. package/lib/device/DeviceCommands.js +6 -7
  63. package/lib/device/DeviceList.d.ts +1 -2
  64. package/lib/device/DeviceList.js +27 -19
  65. package/lib/events/iframe.d.ts +2 -1
  66. package/lib/events/popup.d.ts +2 -1
  67. package/lib/events/transport.d.ts +2 -1
  68. package/lib/factory.js +1 -1
  69. package/lib/index.js +5 -4
  70. package/lib/types/api/{authorizeCoinJoin.d.ts → authorizeCoinjoin.d.ts} +3 -3
  71. package/lib/types/api/{authorizeCoinJoin.js → authorizeCoinjoin.js} +1 -1
  72. package/lib/types/api/bitcoin/index.d.ts +4 -0
  73. package/lib/types/api/cardano/index.d.ts +10 -9
  74. package/lib/types/api/firmwareUpdate.d.ts +2 -1
  75. package/lib/types/api/index.d.ts +2 -2
  76. package/lib/types/firmware.d.ts +2 -3
  77. package/lib/types/index.d.ts +1 -1
  78. package/lib/types/params.d.ts +1 -0
  79. package/lib/types/settings.d.ts +12 -1
  80. package/lib/utils/firmwareUtils.d.ts +0 -1
  81. package/lib/utils/firmwareUtils.js +1 -9
  82. package/lib/utils/pathUtils.d.ts +1 -0
  83. package/lib/utils/pathUtils.js +3 -1
  84. package/lib/utils/promiseUtils.d.ts +5 -1
  85. package/lib/utils/promiseUtils.js +7 -3
  86. package/lib/utils/urlUtils.d.ts +2 -1
  87. package/lib/utils/urlUtils.js +18 -3
  88. package/lib/utils/versionUtils.d.ts +3 -1
  89. package/lib/utils/versionUtils.js +5 -2
  90. package/package.json +16 -16
  91. package/lib/api/authorizeCoinJoin.d.ts +0 -7
  92. package/lib/device/AbortController.d.ts +0 -21
  93. package/lib/device/AbortController.js +0 -40
  94. package/lib/utils/browserUtils.d.ts +0 -21
  95. package/lib/utils/browserUtils.js +0 -100
  96. package/lib/utils/windowsUtils.d.ts +0 -2
  97. package/lib/utils/windowsUtils.js +0 -6
@@ -1,29 +1,106 @@
1
- import { config } from './config';
2
1
  import type { ConnectSettings } from '../types';
3
2
  type AssetCollection = {
4
3
  [key: string]: JSON;
5
4
  };
6
5
  export declare class DataManager {
7
6
  static assets: AssetCollection;
8
- static settings: ConnectSettings;
7
+ private static settings;
9
8
  private static messages;
10
9
  static load(settings: ConnectSettings, withAssets?: boolean): Promise<void>;
11
10
  static getProtobufMessages(): JSON;
12
- static isWhitelisted(origin: string): {
13
- origin: string;
14
- priority: number;
15
- } | undefined;
16
- static isManagementAllowed(): {
17
- origin: string;
18
- } | undefined;
19
- static getPriority(whitelist?: typeof config['whitelist'][0]): number;
20
- static getHostLabel(origin: string): {
21
- origin: string;
22
- label: string;
23
- icon: string;
24
- } | undefined;
25
11
  static getSettings(key?: undefined): ConnectSettings;
26
12
  static getSettings<T extends keyof ConnectSettings>(key: T): ConnectSettings[T];
13
+ static getConfig(): {
14
+ webusb: {
15
+ vendorId: number;
16
+ productId: number;
17
+ }[];
18
+ whitelist: {
19
+ origin: string;
20
+ priority: number;
21
+ }[];
22
+ management: {
23
+ origin: string;
24
+ }[];
25
+ knownHosts: {
26
+ origin: string;
27
+ label: string;
28
+ icon: string;
29
+ }[];
30
+ onionDomains: {
31
+ 'trezor.io': string;
32
+ };
33
+ assets: {
34
+ name: string;
35
+ url: string;
36
+ }[];
37
+ messages: string;
38
+ supportedBrowsers: {
39
+ chrome: {
40
+ version: number;
41
+ download: string;
42
+ update: string;
43
+ };
44
+ chromium: {
45
+ version: number;
46
+ download: string;
47
+ update: string;
48
+ };
49
+ electron: {
50
+ version: number;
51
+ download: string;
52
+ update: string;
53
+ };
54
+ firefox: {
55
+ version: number;
56
+ download: string;
57
+ update: string;
58
+ };
59
+ };
60
+ supportedFirmware: ({
61
+ coin: string[];
62
+ methods: string[];
63
+ min: string[];
64
+ max: undefined;
65
+ comment: string[];
66
+ capabilities?: undefined;
67
+ } | {
68
+ coin: string[];
69
+ min: string[];
70
+ comment: string[];
71
+ methods?: undefined;
72
+ max?: undefined;
73
+ capabilities?: undefined;
74
+ } | {
75
+ methods: string[];
76
+ min: string[];
77
+ comment: string[];
78
+ coin?: undefined;
79
+ max?: undefined;
80
+ capabilities?: undefined;
81
+ } | {
82
+ capabilities: string[];
83
+ min: string[];
84
+ comment: string[];
85
+ coin?: undefined;
86
+ methods?: undefined;
87
+ max?: undefined;
88
+ } | {
89
+ coin: string[];
90
+ methods: string[];
91
+ min: string[];
92
+ comment: string[];
93
+ max?: undefined;
94
+ capabilities?: undefined;
95
+ } | {
96
+ capabilities: string[];
97
+ methods: string[];
98
+ min: string[];
99
+ coin?: undefined;
100
+ max?: undefined;
101
+ comment?: undefined;
102
+ })[];
103
+ };
27
104
  }
28
105
  export {};
29
106
  //# sourceMappingURL=DataManager.d.ts.map
@@ -1,10 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DataManager = void 0;
4
- const tslib_1 = require("tslib");
5
- const parse_uri_1 = tslib_1.__importDefault(require("parse-uri"));
6
4
  const assets_1 = require("../utils/assets");
7
- const connectSettings_1 = require("./connectSettings");
8
5
  const coinInfo_1 = require("./coinInfo");
9
6
  const firmwareInfo_1 = require("./firmwareInfo");
10
7
  const transportInfo_1 = require("./transportInfo");
@@ -13,26 +10,6 @@ class DataManager {
13
10
  static async load(settings, withAssets = true) {
14
11
  const ts = settings.env === 'web' ? `?r=${settings.timestamp}` : '';
15
12
  this.settings = settings;
16
- const isLocalhost = typeof window !== 'undefined' && window.location
17
- ? window.location.hostname === 'localhost'
18
- : true;
19
- const whitelist = DataManager.isWhitelisted(this.settings.origin || '');
20
- this.settings.trustedHost = (isLocalhost || !!whitelist) && !this.settings.popup;
21
- if (!this.settings.trustedHost) {
22
- this.settings.popup = true;
23
- }
24
- if (!this.settings.trustedHost && !whitelist) {
25
- this.settings.debug = false;
26
- }
27
- this.settings.priority = DataManager.getPriority(whitelist);
28
- const knownHost = DataManager.getHostLabel(this.settings.extension || this.settings.origin || '');
29
- if (knownHost) {
30
- this.settings.hostLabel = knownHost.label;
31
- this.settings.hostIcon = knownHost.icon;
32
- }
33
- if (this.settings.popup && this.settings.webusb && this.settings.env !== 'webextension') {
34
- this.settings.webusb = false;
35
- }
36
13
  if (!withAssets)
37
14
  return;
38
15
  const assetPromises = config_1.config.assets.map(async (asset) => {
@@ -49,36 +26,6 @@ class DataManager {
49
26
  static getProtobufMessages() {
50
27
  return this.messages;
51
28
  }
52
- static isWhitelisted(origin) {
53
- const uri = (0, parse_uri_1.default)(origin);
54
- if (uri && typeof uri.host === 'string') {
55
- const parts = uri.host.split('.');
56
- if (parts.length > 2) {
57
- uri.host = parts.slice(parts.length - 2, parts.length).join('.');
58
- }
59
- return config_1.config.whitelist.find(item => item.origin === origin || item.origin === uri.host);
60
- }
61
- }
62
- static isManagementAllowed() {
63
- var _a;
64
- const uri = (0, parse_uri_1.default)((_a = this.settings.origin) !== null && _a !== void 0 ? _a : '');
65
- if (uri && typeof uri.host === 'string') {
66
- const parts = uri.host.split('.');
67
- if (parts.length > 2) {
68
- uri.host = parts.slice(parts.length - 2, parts.length).join('.');
69
- }
70
- return config_1.config.management.find(item => item.origin === this.settings.origin || item.origin === uri.host);
71
- }
72
- }
73
- static getPriority(whitelist) {
74
- if (whitelist) {
75
- return whitelist.priority;
76
- }
77
- return connectSettings_1.DEFAULT_PRIORITY;
78
- }
79
- static getHostLabel(origin) {
80
- return config_1.config.knownHosts.find(host => host.origin === origin);
81
- }
82
29
  static getSettings(key) {
83
30
  if (!this.settings)
84
31
  return null;
@@ -87,6 +34,9 @@ class DataManager {
87
34
  }
88
35
  return this.settings;
89
36
  }
37
+ static getConfig() {
38
+ return config_1.config;
39
+ }
90
40
  }
91
41
  exports.DataManager = DataManager;
92
42
  DataManager.assets = {};
@@ -101,7 +101,7 @@ exports.config = {
101
101
  ],
102
102
  },
103
103
  {
104
- coin: ['eth', 'trop', 'tgor'],
104
+ coin: ['eth', 'tgor'],
105
105
  min: ['1.8.0', '2.1.0'],
106
106
  comment: ['There were protobuf backwards incompatible changes.'],
107
107
  },
@@ -182,8 +182,14 @@ exports.config = {
182
182
  },
183
183
  {
184
184
  capabilities: ['coinjoin'],
185
- methods: ['authorizeCoinJoin', 'getOwnershipId', 'getOwnershipProof'],
186
- min: ['0', '2.5.3'],
185
+ methods: [
186
+ 'authorizeCoinjoin',
187
+ 'getOwnershipId',
188
+ 'getOwnershipProof',
189
+ 'setBusy',
190
+ 'unlockPath',
191
+ ],
192
+ min: ['1.12.1', '2.5.3'],
187
193
  },
188
194
  ],
189
195
  };
@@ -1,6 +1,5 @@
1
1
  import type { ConnectSettings } from '../types';
2
2
  export declare const DEFAULT_PRIORITY = 2;
3
- export declare const getEnv: () => "web" | "webextension" | "electron" | "react-native";
4
3
  export declare const corsValidator: (url?: string) => string | undefined;
5
4
  export declare const parseConnectSettings: (input?: Partial<ConnectSettings>) => ConnectSettings;
6
5
  //# sourceMappingURL=connectSettings.d.ts.map
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseConnectSettings = exports.corsValidator = exports.getEnv = exports.DEFAULT_PRIORITY = void 0;
3
+ exports.parseConnectSettings = exports.corsValidator = exports.DEFAULT_PRIORITY = void 0;
4
4
  const version_1 = require("./version");
5
5
  exports.DEFAULT_PRIORITY = 2;
6
6
  const initialSettings = {
@@ -8,16 +8,15 @@ const initialSettings = {
8
8
  version: version_1.VERSION,
9
9
  debug: false,
10
10
  priority: exports.DEFAULT_PRIORITY,
11
- trustedHost: false,
11
+ trustedHost: true,
12
12
  connectSrc: version_1.DEFAULT_DOMAIN,
13
13
  iframeSrc: `${version_1.DEFAULT_DOMAIN}iframe.html`,
14
- popup: true,
14
+ popup: false,
15
15
  popupSrc: `${version_1.DEFAULT_DOMAIN}popup.html`,
16
16
  webusbSrc: `${version_1.DEFAULT_DOMAIN}webusb.html`,
17
- webusb: true,
17
+ transports: undefined,
18
18
  pendingTransportEvent: true,
19
- supportedBrowser: typeof navigator !== 'undefined' ? !/Trident|MSIE|Edge/.test(navigator.userAgent) : true,
20
- env: 'web',
19
+ env: 'node',
21
20
  lazyLoad: false,
22
21
  timestamp: new Date().getTime(),
23
22
  interactionTimeout: 600,
@@ -34,25 +33,6 @@ const parseManifest = (manifest) => {
34
33
  appUrl: manifest.appUrl,
35
34
  };
36
35
  };
37
- const getEnv = () => {
38
- if (typeof chrome !== 'undefined' &&
39
- chrome.runtime &&
40
- typeof chrome.runtime.onConnect !== 'undefined') {
41
- return 'webextension';
42
- }
43
- if (typeof navigator !== 'undefined') {
44
- if (typeof navigator.product === 'string' &&
45
- navigator.product.toLowerCase() === 'reactnative') {
46
- return 'react-native';
47
- }
48
- const userAgent = navigator.userAgent.toLowerCase();
49
- if (userAgent.indexOf(' electron/') > -1) {
50
- return 'electron';
51
- }
52
- }
53
- return 'web';
54
- };
55
- exports.getEnv = getEnv;
56
36
  const corsValidator = (url) => {
57
37
  if (typeof url !== 'string')
58
38
  return;
@@ -67,10 +47,9 @@ const corsValidator = (url) => {
67
47
  };
68
48
  exports.corsValidator = corsValidator;
69
49
  const parseConnectSettings = (input = {}) => {
50
+ var _a;
70
51
  const settings = { ...initialSettings };
71
- if (Object.prototype.hasOwnProperty.call(input, 'debug')) {
72
- if (Array.isArray(input)) {
73
- }
52
+ if ('debug' in input) {
74
53
  if (typeof input.debug === 'boolean') {
75
54
  settings.debug = input.debug;
76
55
  }
@@ -78,30 +57,11 @@ const parseConnectSettings = (input = {}) => {
78
57
  settings.debug = input.debug === 'true';
79
58
  }
80
59
  }
81
- if (typeof input.connectSrc === 'string') {
82
- settings.connectSrc = input.connectSrc;
83
- }
84
- let globalSrc;
85
- if (typeof window !== 'undefined') {
86
- globalSrc = window.__TREZOR_CONNECT_SRC;
60
+ if (typeof input.connectSrc === 'string' && ((_a = input.connectSrc) === null || _a === void 0 ? void 0 : _a.startsWith('http'))) {
61
+ settings.connectSrc = (0, exports.corsValidator)(input.connectSrc);
87
62
  }
88
- else if (typeof global !== 'undefined') {
89
- globalSrc = global.__TREZOR_CONNECT_SRC;
90
- }
91
- if (typeof globalSrc === 'string') {
92
- settings.connectSrc = (0, exports.corsValidator)(globalSrc);
93
- settings.debug = true;
94
- }
95
- if (typeof window !== 'undefined' &&
96
- window.location &&
97
- typeof window.location.search === 'string') {
98
- const vars = window.location.search.split('&');
99
- const customUrl = vars.find(v => v.indexOf('trezor-connect-src') >= 0);
100
- if (customUrl) {
101
- const [, connectSrc] = customUrl.split('=');
102
- settings.connectSrc = (0, exports.corsValidator)(decodeURIComponent(connectSrc));
103
- settings.debug = true;
104
- }
63
+ else if (settings.trustedHost) {
64
+ settings.connectSrc = input.connectSrc;
105
65
  }
106
66
  const src = settings.connectSrc || version_1.DEFAULT_DOMAIN;
107
67
  settings.iframeSrc = `${src}iframe.html`;
@@ -113,6 +73,9 @@ const parseConnectSettings = (input = {}) => {
113
73
  if (typeof input.webusb === 'boolean') {
114
74
  settings.webusb = input.webusb;
115
75
  }
76
+ if (Array.isArray(input.transports)) {
77
+ settings.transports = input.transports;
78
+ }
116
79
  if (typeof input.popup === 'boolean') {
117
80
  settings.popup = input.popup;
118
81
  }
@@ -122,19 +85,12 @@ const parseConnectSettings = (input = {}) => {
122
85
  if (typeof input.pendingTransportEvent === 'boolean') {
123
86
  settings.pendingTransportEvent = input.pendingTransportEvent;
124
87
  }
125
- if (typeof window !== 'undefined' && window.location && window.location.protocol === 'file:') {
126
- settings.origin = `file://${window.location.pathname}`;
127
- settings.webusb = false;
128
- }
129
88
  if (typeof input.extension === 'string') {
130
89
  settings.extension = input.extension;
131
90
  }
132
91
  if (typeof input.env === 'string') {
133
92
  settings.env = input.env;
134
93
  }
135
- else {
136
- settings.env = (0, exports.getEnv)();
137
- }
138
94
  if (typeof input.timestamp === 'number') {
139
95
  settings.timestamp = input.timestamp;
140
96
  }
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getReleases = exports.getRelease = exports.getFirmwareStatus = exports.getInfo = exports.parseFirmware = void 0;
4
4
  const utils_1 = require("@trezor/utils");
5
5
  const firmwareUtils_1 = require("../utils/firmwareUtils");
6
+ const versionUtils_1 = require("../utils/versionUtils");
6
7
  const releases = {};
7
8
  releases[1] = [];
8
9
  releases[2] = [];
@@ -51,67 +52,68 @@ const isRequired = (changelog) => {
51
52
  return changelog.some(item => item.required);
52
53
  };
53
54
  const isEqual = (release, latest) => utils_1.versionUtils.isEqual(release.version, latest.version);
54
- const getInfo = ({ features, releases }) => {
55
- if (!(0, firmwareUtils_1.isStrictFeatures)(features)) {
56
- throw new Error('Features of unexpected shape provided.');
55
+ const getT1BootloaderVersion = (releases, features) => {
56
+ const { bootloader_mode, major_version, minor_version, patch_version } = features;
57
+ const versionArray = [major_version, minor_version, patch_version];
58
+ if (bootloader_mode) {
59
+ return versionArray;
57
60
  }
58
- if (!(0, firmwareUtils_1.isValidReleases)(releases)) {
59
- throw new Error(`Release object in unexpected shape.`);
61
+ const release = releases.find(({ version }) => utils_1.versionUtils.isEqual(version, versionArray));
62
+ return (release === null || release === void 0 ? void 0 : release.bootloader_version) || [1, 0, 0];
63
+ };
64
+ const getIntermediaryVersion = (releases, features, offerLatest) => {
65
+ if (features.major_version !== 1 || offerLatest) {
66
+ return;
60
67
  }
61
- let parsedReleases = releases;
62
- let score = 0;
63
- if (features.device_id) {
64
- score = (0, firmwareUtils_1.getScore)(features.device_id);
68
+ const bootloaderVersion = getT1BootloaderVersion(releases, features);
69
+ if (utils_1.versionUtils.isNewerOrEqual(bootloaderVersion, [1, 12, 0])) {
70
+ return 3;
65
71
  }
72
+ if (utils_1.versionUtils.isNewerOrEqual(bootloaderVersion, [1, 8, 0])) {
73
+ return 2;
74
+ }
75
+ return 1;
76
+ };
77
+ const getSafeReleases = ({ features, releases }) => {
66
78
  const { bootloader_mode, major_version, minor_version, patch_version, fw_major, fw_minor, fw_patch, } = features;
67
- if (score) {
68
- parsedReleases = parsedReleases.filter(item => {
69
- if (!item.rollout)
70
- return true;
71
- return item.rollout >= score;
72
- });
79
+ const firmwareVersion = [major_version, minor_version, patch_version];
80
+ if (!(0, versionUtils_1.isVersionArray)(firmwareVersion)) {
81
+ return [];
73
82
  }
74
- const latest = parsedReleases[0];
75
83
  if (major_version === 2 && bootloader_mode) {
76
- if (fw_major !== null && fw_minor !== null && fw_patch !== null) {
77
- parsedReleases = (0, firmwareUtils_1.filterSafeListByFirmware)(parsedReleases, [
78
- fw_major,
79
- fw_minor,
80
- fw_patch,
81
- ]);
84
+ const fwVersion = [fw_major, fw_minor, fw_patch];
85
+ if ((0, versionUtils_1.isVersionArray)(fwVersion)) {
86
+ return (0, firmwareUtils_1.filterSafeListByFirmware)(releases, fwVersion);
82
87
  }
83
- parsedReleases = (0, firmwareUtils_1.filterSafeListByBootloader)(parsedReleases, [
84
- major_version,
85
- minor_version,
86
- patch_version,
87
- ]);
88
+ return (0, firmwareUtils_1.filterSafeListByBootloader)(releases, firmwareVersion);
89
+ }
90
+ if (major_version === 1 && bootloader_mode) {
91
+ return (0, firmwareUtils_1.filterSafeListByBootloader)(releases, firmwareVersion);
88
92
  }
89
- else if (major_version === 1 && bootloader_mode) {
90
- parsedReleases = (0, firmwareUtils_1.filterSafeListByBootloader)(parsedReleases, [
91
- major_version,
92
- minor_version,
93
- patch_version,
94
- ]);
93
+ return (0, firmwareUtils_1.filterSafeListByFirmware)(releases, firmwareVersion);
94
+ };
95
+ const getInfo = ({ features, releases }) => {
96
+ if (!(0, firmwareUtils_1.isStrictFeatures)(features)) {
97
+ throw new Error('Features of unexpected shape provided.');
95
98
  }
96
- else {
97
- parsedReleases = (0, firmwareUtils_1.filterSafeListByFirmware)(parsedReleases, [
98
- major_version,
99
- minor_version,
100
- patch_version,
101
- ]);
99
+ if (!(0, firmwareUtils_1.isValidReleases)(releases)) {
100
+ throw new Error(`Release object in unexpected shape.`);
102
101
  }
103
- if (!parsedReleases.length) {
102
+ const latest = releases[0];
103
+ const releasesSafe = getSafeReleases({ features, releases });
104
+ if (!releasesSafe.length) {
104
105
  return null;
105
106
  }
106
- const isLatest = isEqual(parsedReleases[0], latest);
107
- const changelog = getChangelog(parsedReleases, features);
107
+ const releasesParsed = features.major_version === 1 ? releases : releasesSafe;
108
+ const changelog = getChangelog(releasesParsed, features);
109
+ const release = releasesParsed[0];
110
+ const intermediaryVersion = getIntermediaryVersion(releases, features, isEqual(releasesSafe[0], latest));
108
111
  return {
109
112
  changelog,
110
- release: parsedReleases[0],
111
- isLatest,
112
- latest,
113
+ release,
113
114
  isRequired: isRequired(changelog),
114
- isNewer: isNewer(parsedReleases[0], features),
115
+ isNewer: isNewer(latest, features),
116
+ intermediaryVersion,
115
117
  };
116
118
  };
117
119
  exports.getInfo = getInfo;
@@ -1,4 +1,5 @@
1
1
  import type { BridgeInfo } from '../events/transport';
2
2
  export declare const parseBridgeJSON: (json: any) => BridgeInfo;
3
3
  export declare const getBridgeInfo: () => BridgeInfo;
4
+ export declare const suggestBridgeInstaller: (platform?: string) => BridgeInfo;
4
5
  //# sourceMappingURL=transportInfo.d.ts.map
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getBridgeInfo = exports.parseBridgeJSON = void 0;
3
+ exports.suggestBridgeInstaller = exports.getBridgeInfo = exports.parseBridgeJSON = void 0;
4
4
  const info = {
5
5
  version: [],
6
6
  directory: '',
@@ -26,4 +26,17 @@ const parseBridgeJSON = (json) => {
26
26
  exports.parseBridgeJSON = parseBridgeJSON;
27
27
  const getBridgeInfo = () => info;
28
28
  exports.getBridgeInfo = getBridgeInfo;
29
+ const suggestBridgeInstaller = (platform) => {
30
+ const info = (0, exports.getBridgeInfo)();
31
+ if (!info.packages.find(p => p.preferred)) {
32
+ if (platform) {
33
+ info.packages = info.packages.map(p => ({
34
+ ...p,
35
+ preferred: p.platform.indexOf(platform) >= 0,
36
+ }));
37
+ }
38
+ }
39
+ return info;
40
+ };
41
+ exports.suggestBridgeInstaller = suggestBridgeInstaller;
29
42
  //# sourceMappingURL=transportInfo.js.map
@@ -1,3 +1,4 @@
1
1
  import type { UdevInfo } from '../events/transport';
2
2
  export declare const getUdevInfo: () => UdevInfo;
3
+ export declare const suggestUdevInstaller: (platform?: string) => UdevInfo;
3
4
  //# sourceMappingURL=udevInfo.d.ts.map
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getUdevInfo = void 0;
3
+ exports.suggestUdevInstaller = exports.getUdevInfo = void 0;
4
4
  const info = {
5
5
  directory: '',
6
6
  packages: [
@@ -18,4 +18,17 @@ const info = {
18
18
  };
19
19
  const getUdevInfo = () => info;
20
20
  exports.getUdevInfo = getUdevInfo;
21
+ const suggestUdevInstaller = (platform) => {
22
+ const info = (0, exports.getUdevInfo)();
23
+ if (!info.packages.find(p => p.preferred)) {
24
+ if (platform) {
25
+ info.packages = info.packages.map(p => ({
26
+ ...p,
27
+ preferred: p.platform.indexOf(platform) >= 0,
28
+ }));
29
+ }
30
+ }
31
+ return info;
32
+ };
33
+ exports.suggestUdevInstaller = suggestUdevInstaller;
21
34
  //# sourceMappingURL=udevInfo.js.map
@@ -1,3 +1,3 @@
1
- export declare const VERSION = "9.0.6";
1
+ export declare const VERSION = "9.0.8";
2
2
  export declare const DEFAULT_DOMAIN: string;
3
3
  //# sourceMappingURL=version.d.ts.map
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DEFAULT_DOMAIN = exports.VERSION = void 0;
4
- exports.VERSION = '9.0.6';
4
+ exports.VERSION = '9.0.8';
5
5
  const versionN = exports.VERSION.split('.').map(s => parseInt(s, 10));
6
6
  exports.DEFAULT_DOMAIN = `https://connect.trezor.io/${versionN[0]}/`;
7
7
  //# sourceMappingURL=version.js.map
@@ -88,7 +88,7 @@ class DescriptorStream extends events_1.default {
88
88
  const time = new Date().getTime() - this.listenTimestamp;
89
89
  logger.debug('Listen error', 'timestamp', time, typeof error);
90
90
  if (time > 1100) {
91
- await (0, promiseUtils_1.resolveAfter)(1000, null);
91
+ await (0, promiseUtils_1.resolveAfter)(1000, null).promise;
92
92
  if (this.listening)
93
93
  this.listen();
94
94
  }
@@ -123,8 +123,7 @@ class Device extends events_1.default {
123
123
  await this.deferredActions[events_2.DEVICE.ACQUIRE].promise;
124
124
  }
125
125
  if (this.runPromise) {
126
- this.runPromise.reject(error);
127
- this.runPromise = null;
126
+ await this.interruptionFromUser(error);
128
127
  }
129
128
  if (!this.keepSession && this.deferredActions[events_2.DEVICE.RELEASE]) {
130
129
  await this.deferredActions[events_2.DEVICE.RELEASE].promise;
@@ -40,7 +40,7 @@ export declare class DeviceCommands {
40
40
  serializedPath: string;
41
41
  address: string;
42
42
  }>;
43
- ethereumGetAddress({ address_n, show_display }: Messages.EthereumGetAddress): Promise<{
43
+ ethereumGetAddress({ address_n, show_display, encoded_network, }: Messages.EthereumGetAddress): Promise<{
44
44
  path: number[];
45
45
  serializedPath: string;
46
46
  address: string;
@@ -184,10 +184,11 @@ class DeviceCommands {
184
184
  address: response.message.address,
185
185
  };
186
186
  }
187
- async ethereumGetAddress({ address_n, show_display }) {
187
+ async ethereumGetAddress({ address_n, show_display, encoded_network, }) {
188
188
  const response = await this.typedCall('EthereumGetAddress', 'EthereumAddress', {
189
189
  address_n,
190
190
  show_display,
191
+ encoded_network,
191
192
  });
192
193
  return {
193
194
  path: address_n,
@@ -474,15 +475,13 @@ class DeviceCommands {
474
475
  if (this.disposed) {
475
476
  return;
476
477
  }
477
- const { activeName, version } = this.transport;
478
- if (activeName &&
479
- activeName === 'BridgeTransport' &&
480
- (0, versionUtils_1.versionCompare)(version, '2.0.28') < 1) {
478
+ const { name, version } = this.transport;
479
+ if (name === 'BridgeTransport' && (0, versionUtils_1.versionCompare)(version, '2.0.28') < 1) {
481
480
  await this.device.legacyForceRelease();
482
481
  }
483
482
  else {
484
- await this.transport.post(this.sessionId, 'Cancel', {}, false);
485
- await this.transport.read(this.sessionId, false);
483
+ await this.transport.post(this.sessionId, 'Cancel', {}, false).catch(() => { });
484
+ await this.transport.read(this.sessionId, false).catch(() => { });
486
485
  }
487
486
  }
488
487
  }
@@ -5,7 +5,6 @@ import { TRANSPORT, DEVICE, TransportInfo } from '../events';
5
5
  import { DescriptorStream } from './DescriptorStream';
6
6
  import { Device } from './Device';
7
7
  import type { Device as DeviceTyped } from '../types';
8
- import type { Controller } from './AbortController';
9
8
  type LowLevelPlugin = {
10
9
  name: 'WebUsbPlugin' | 'ReactNativePlugin';
11
10
  unreadableHidDeviceChange: {
@@ -44,7 +43,7 @@ export declare class DeviceList extends EventEmitter {
44
43
  penalizedDevices: {
45
44
  [deviceID: string]: number;
46
45
  };
47
- fetchController?: Controller | null;
46
+ fetchController?: AbortController | null;
48
47
  constructor();
49
48
  init(): Promise<void>;
50
49
  resolveTransportEvent(): void;