Skip to content

Commit

Permalink
feat: nodusb concept
Browse files Browse the repository at this point in the history
  • Loading branch information
mroz22 committed Oct 24, 2022
1 parent f8e86c7 commit fd5bc6e
Show file tree
Hide file tree
Showing 63 changed files with 2,224 additions and 945 deletions.
5 changes: 3 additions & 2 deletions ci/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -173,8 +173,9 @@ suite desktop manual:

transport:
extends: .e2e transport
only:
<<: *run_everything_rules
# for development purposes now, run always
# only:
# <<: *run_everything_rules

transport manual:
extends: .e2e transport
Expand Down
2 changes: 2 additions & 0 deletions packages/connect-explorer/src/actions/trezorConnectActions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,11 +53,13 @@ export const init =
console.log('using @trezor/connect hosted on: ', window.__TREZOR_CONNECT_SRC);
}

const transports = ['bridge'];
const connectOptions = {
transportReconnect: true,
popup: true,
debug: true,
lazyLoad: true,
transports,
manifest: {
email: '[email protected]',
appUrl: '@trezor/suite',
Expand Down
25 changes: 16 additions & 9 deletions packages/connect-iframe/webpack/prod.webpack.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,15 +32,15 @@ export default {
},
},
},
{
test: /sharedConnectionWorker/i,
loader: 'worker-loader',
issuer: /workers\/workers-*/i, // replace import ONLY in /workers\/workers- not @trezor/transport
options: {
worker: 'SharedWorker',
filename: './workers/shared-connection-worker.[contenthash].js',
},
},
// {
// test: /sharedConnectionWorker/i,
// loader: 'worker-loader',
// issuer: /workers\/workers-*/i, // replace import ONLY in /workers\/workers- not @trezor/transport
// options: {
// worker: 'SharedWorker',
// filename: './workers/shared-connection-worker.[contenthash].js',
// },
// },
{
test: /\workers\/blockbook\/index/i,
loader: 'worker-loader',
Expand Down Expand Up @@ -78,6 +78,10 @@ export default {
crypto: require.resolve('crypto-browserify'), // required by multiple dependencies
stream: require.resolve('stream-browserify'), // required by utxo-lib and keccak
events: require.resolve('events'),
// nodeusb, but it should't be needed, since it is only in desktop
// path: require.resolve('path-browserify'),
// nodeusb
// os: require.resolve('os-browserify/browser'),
},
},
performance: {
Expand All @@ -98,6 +102,9 @@ export default {
new webpack.NormalModuleReplacementPlugin(/\/utils\/assets$/, resource => {
resource.request = resource.request.replace(/assets$/, 'assets-browser');
}),
// resolve @trezor/transport module as "browser"
// ? ???

// copy public files
new CopyWebpackPlugin({
patterns: [
Expand Down
5 changes: 5 additions & 0 deletions packages/connect-web/src/iframe/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,9 +88,14 @@ export const init = async (settings: ConnectSettings) => {
}

instance.setAttribute('src', src);

// todo: webusb deprecated, use transports[]
if (settings.webusb) {
instance.setAttribute('allow', 'usb');
}
if (settings.transports?.includes('webusb')) {
instance.setAttribute('allow', 'usb');
}

origin = getOrigin(instance.src);
timeout = window.setTimeout(() => {
Expand Down
4 changes: 3 additions & 1 deletion packages/connect/e2e/common.setup.js
Original file line number Diff line number Diff line change
Expand Up @@ -108,11 +108,13 @@ const initTrezorConnect = async (TrezorUserEnvLink, options) => {
appUrl: 'tests.connect.trezor.io',
email: '[email protected]',
},
webusb: false,
webusb: false, // deprecated, use transports
transports: ['bridge'],
debug: false,
popup: false,
pendingTransportEvent: true,
connectSrc: process.env.TREZOR_CONNECT_SRC, // custom source for karma tests

...options,
});
};
Expand Down
6 changes: 2 additions & 4 deletions packages/connect/e2e/tests/device/methods.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,10 @@ describe(`TrezorConnect methods`, () => {
controller = undefined;
});
}

await setup(controller, testCase.setup);

await initTrezorConnect(controller);

// done();
} catch (error) {
console.log('Controller WS init error', error);
Expand All @@ -60,7 +60,6 @@ describe(`TrezorConnect methods`, () => {
TrezorConnect.dispose();
done();
});

testCase.tests.forEach(t => {
// check if test should be skipped on current configuration
conditionalTest(
Expand All @@ -82,6 +81,7 @@ describe(`TrezorConnect methods`, () => {
controller.options.name = t.description;
// @ts-expect-error, string + params union
const result = await TrezorConnect[testCase.method](t.params);

let expected = t.result
? { success: true, payload: t.result }
: { success: false };
Expand All @@ -97,9 +97,7 @@ describe(`TrezorConnect methods`, () => {
}
});
}

expect(result).toMatchObject(expected);
// done();
},
t.customTimeout || 20000,
);
Expand Down
15 changes: 11 additions & 4 deletions packages/connect/src/core/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,7 @@ const initDevice = async (method: AbstractMethod) => {
throw ERRORS.TypedError('Transport_Missing');
}

const isWebUsb = _deviceList.transportType() === 'WebUsbPlugin';
const isWebUsb = _deviceList.transportType() === 'WebusbTransport';
let device: Device | typeof undefined;
let showDeviceSelection = isWebUsb;
if (method.devicePath) {
Expand Down Expand Up @@ -908,7 +908,8 @@ const initDeviceList = async (settings: ConnectSettings) => {
});

_deviceList.on(TRANSPORT.ERROR, async error => {
_log.warn('TRANSPORT.ERROR', error);
console.log('core _deviceList.on.TRANSPORT.ERROR error=', error);
// _log.warn('TRANSPORT.ERROR', error);
if (_deviceList) {
_deviceList.disconnectDevices();
_deviceList.dispose();
Expand All @@ -930,9 +931,12 @@ const initDeviceList = async (settings: ConnectSettings) => {

await _deviceList.init();
if (_deviceList) {
await _deviceList.waitForTransportFirstEvent();
console.log('==core initDeviceList, waitForTransportFirstEvent, awaiting...');
// await _deviceList.waitForTransportFirstEvent();
console.log('==core initDeviceList, waitForTransportFirstEvent, done');
}
} catch (error) {
console.log('core, initDeviceList, error', error);
_deviceList = undefined;
postMessage(createTransportMessage(TRANSPORT.ERROR, { error }));
if (!settings.transportReconnect) {
Expand Down Expand Up @@ -1021,7 +1025,9 @@ export const initTransport = async (settings: ConnectSettings) => {
try {
if (!settings.transportReconnect) {
// try only once, if it fails kill and throw initialization error
console.log('===initTransport, initDeviceList awaiting... ');
await initDeviceList(settings);
console.log('===initTransport, initDeviceList done ');
} else {
// don't wait for DeviceList result, further communication will be thru TRANSPORT events
initDeviceList(settings);
Expand All @@ -1034,10 +1040,11 @@ export const initTransport = async (settings: ConnectSettings) => {

const disableWebUSBTransport = async () => {
if (!_deviceList) return;
if (_deviceList.transportType() !== 'WebUsbPlugin') return;
if (_deviceList.transportType() !== 'WebusbTransport') return;
// override settings
const settings = DataManager.getSettings();
settings.webusb = false;
// todo: settings.transports.splice(...meow)

try {
// disconnect previous device list
Expand Down
8 changes: 8 additions & 0 deletions packages/connect/src/data/connectSettings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,9 @@ const initialSettings: ConnectSettings = {
popup: true,
popupSrc: `${DEFAULT_DOMAIN}popup.html`,
webusbSrc: `${DEFAULT_DOMAIN}webusb.html`,
// deprecated, use transports instead
webusb: true,
transports: ['bridge'],
pendingTransportEvent: true,
supportedBrowser:
typeof navigator !== 'undefined' ? !/Trident|MSIE|Edge/.test(navigator.userAgent) : true, // TODO: https://github.com/trezor/trezor-suite/issues/5319
Expand Down Expand Up @@ -147,10 +149,16 @@ export const parseConnectSettings = (input: Partial<ConnectSettings> = {}) => {
settings.transportReconnect = input.transportReconnect;
}

// todo: deprecated
if (typeof input.webusb === 'boolean') {
settings.webusb = input.webusb;
}

if (Array.isArray(input.transports)) {
// todo: validate
settings.transports = input.transports;
}

if (typeof input.popup === 'boolean') {
settings.popup = input.popup;
}
Expand Down
Loading

0 comments on commit fd5bc6e

Please sign in to comment.