From 246dfa82f94a535f6a54c09faef60c41735498a4 Mon Sep 17 00:00:00 2001 From: mroz Date: Sun, 20 Nov 2022 12:06:35 +0100 Subject: [PATCH] wip --- ci/test.yml | 1 + packages/connect/src/device/Device.ts | 12 ++++++++++ packages/connect/src/device/DeviceList.ts | 15 +++++++----- .../onboarding/analytics-consent.test.ts | 2 +- .../e2e/tests/onboarding/transport.test.ts | 2 +- .../utils/suite/__tests__/transport.test.ts | 4 ++-- packages/transport/src/index.ts | 1 - packages/transport/src/transports/abstract.ts | 5 ++++ packages/transport/src/transports/bridge.ts | 24 ++++++++++++++++--- packages/transport/src/transports/usb.ts | 10 ++++++-- 10 files changed, 60 insertions(+), 16 deletions(-) diff --git a/ci/test.yml b/ci/test.yml index 7ae9dcb42690..ede057b30a63 100644 --- a/ci/test.yml +++ b/ci/test.yml @@ -200,6 +200,7 @@ transport manual: COMPOSE_PROJECT_NAME: $CI_JOB_ID COMPOSE_FILE: ./docker/docker-compose.connect-popup-ci.yml URL: ${DEV_SERVER_URL}/connect/${CI_BUILD_REF_NAME}/ + TEST_FILE: $TEST_FILE script: - yarn install --immutable - docker-compose pull diff --git a/packages/connect/src/device/Device.ts b/packages/connect/src/device/Device.ts index 9e19d646051f..ae38caed29be 100644 --- a/packages/connect/src/device/Device.ts +++ b/packages/connect/src/device/Device.ts @@ -597,11 +597,23 @@ export class Device extends EventEmitter { dispose() { this.removeAllListeners(); + console.log( + 'DEVICE.DISPOSE', + 'this.isUsedHere()', + this.isUsedHere(), + 'this.activitySessionID', + this.activitySessionID, + ); if (this.isUsedHere() && this.activitySessionID) { try { if (this.commands) { this.commands.cancel(); } + console.log('=============================='); + console.log('=============================='); + console.log('=============================='); + console.log('=============================='); + this.transport.release(this.activitySessionID, true); } catch (err) { // empty diff --git a/packages/connect/src/device/DeviceList.ts b/packages/connect/src/device/DeviceList.ts index 6b5484a5020f..c2913e0dbf39 100644 --- a/packages/connect/src/device/DeviceList.ts +++ b/packages/connect/src/device/DeviceList.ts @@ -143,6 +143,7 @@ export class DeviceList extends EventEmitter { new BridgeTransport({ messages: this.messages, latestVersion: getBridgeInfo().version.join('.'), + debug: true, }), ); return; @@ -190,8 +191,6 @@ export class DeviceList extends EventEmitter { * transport reported some change of descriptors */ this.transport.on(TRANSPORT.UPDATE, diff => { - // new DiffHandler(this, diff).handle(); - diff.connected.forEach(async descriptor => { const path = descriptor.path.toString(); const priority = DataManager.getSettings('priority'); @@ -321,7 +320,7 @@ export class DeviceList extends EventEmitter { this.on(DEVICE.CONNECT, this.resolveTransportEvent.bind(this)); this.on(DEVICE.CONNECT_UNACQUIRED, this.resolveTransportEvent.bind(this)); - this.transport.enumerate(); + await this.transport.enumerate(); this.transport.listen(); @@ -411,11 +410,15 @@ export class DeviceList extends EventEmitter { dispose() { this.removeAllListeners(); + this.allDevices().forEach(device => device.dispose()); + if (this.transport) { - this.transport.stop(); + // while keeping this method (dispose) sync, we need to to wait for final release call + // but also cancel other pending calls. + setTimeout(() => { + this.transport.stop(); + }, 100); } - - this.allDevices().forEach(device => device.dispose()); } disconnectDevices() { diff --git a/packages/suite-web/e2e/tests/onboarding/analytics-consent.test.ts b/packages/suite-web/e2e/tests/onboarding/analytics-consent.test.ts index 1d6b10dd5c95..a25752eb4550 100644 --- a/packages/suite-web/e2e/tests/onboarding/analytics-consent.test.ts +++ b/packages/suite-web/e2e/tests/onboarding/analytics-consent.test.ts @@ -7,7 +7,7 @@ describe('Onboarding - analytics consent', () => { cy.viewport(1080, 1440).resetDb(); }); - it('shows analytics consent when going to settings and back on non-initialized T1 device', () => { + it.only('shows analytics consent when going to settings and back on non-initialized T1 device', () => { cy.task('startEmu', { version: '1-latest', wipe: true }); cy.prefixedVisit('/'); diff --git a/packages/suite-web/e2e/tests/onboarding/transport.test.ts b/packages/suite-web/e2e/tests/onboarding/transport.test.ts index 5d475d50938b..3912f5b8c910 100644 --- a/packages/suite-web/e2e/tests/onboarding/transport.test.ts +++ b/packages/suite-web/e2e/tests/onboarding/transport.test.ts @@ -13,7 +13,7 @@ describe('Onboarding - transport webusb/bridge', () => { .its('store') .invoke('getState') .should(state => { - expect(state?.suite.transport?.type).to.deep.eq('WebusbTransport'); + expect(state?.suite.transport?.type).to.deep.eq('WebUsbTransport'); }); cy.getTestElement('@onboarding/expand-troubleshooting-tips').click(); diff --git a/packages/suite/src/utils/suite/__tests__/transport.test.ts b/packages/suite/src/utils/suite/__tests__/transport.test.ts index 68d4b32fb227..a0c4ca021bd1 100644 --- a/packages/suite/src/utils/suite/__tests__/transport.test.ts +++ b/packages/suite/src/utils/suite/__tests__/transport.test.ts @@ -4,14 +4,14 @@ const fixtures = [ { description: `Transport is webusb`, transport: { - type: 'WebusbTransport', + type: 'WebUsbTransport', }, result: true, }, { description: `Transport is not webusb (bridge)`, transport: { - type: 'bridge', + type: 'BridgeTransport', }, result: false, }, diff --git a/packages/transport/src/index.ts b/packages/transport/src/index.ts index 9f5c33209506..2137fa83dc89 100644 --- a/packages/transport/src/index.ts +++ b/packages/transport/src/index.ts @@ -26,7 +26,6 @@ export { getAvailableTransport } from './utils/getAvailableTransport'; /** * Set fetch for this lib globally */ -export { setFetch } from './utils/http'; export { SessionsBackend } from './sessions/backend'; export { SessionsClient } from './sessions/client'; diff --git a/packages/transport/src/transports/abstract.ts b/packages/transport/src/transports/abstract.ts index eaff4c905199..2d2fea1eaedc 100644 --- a/packages/transport/src/transports/abstract.ts +++ b/packages/transport/src/transports/abstract.ts @@ -219,12 +219,17 @@ export abstract class Transport extends TypedEmitter<{ const diff = this._getDiff(nextDescriptors); this.log('handleDescriptorsChange:diff', diff); + this.log('this.acquiring', this.acquiring); this.descriptors = nextDescriptors; if (diff.didUpdate) { this.emit(TRANSPORT.UPDATE, diff); } + + if (this.acquiring) { + delete this.acquiring; + } } // todo: consider accepting logger class from outside diff --git a/packages/transport/src/transports/bridge.ts b/packages/transport/src/transports/bridge.ts index 81438bbc90a3..b7d109d9e90b 100644 --- a/packages/transport/src/transports/bridge.ts +++ b/packages/transport/src/transports/bridge.ts @@ -93,15 +93,20 @@ export class BridgeTransport extends Transport { expectedSessionIds: { [path: string]: string } = {}; listenPromises: { [path: string]: Deferred } = {}; - constructor({ messages, url = DEFAULT_URL, latestVersion }: BridgeConstructorParameters) { - super({ messages }); + constructor({ + messages, + url = DEFAULT_URL, + latestVersion, + debug, + }: BridgeConstructorParameters) { + super({ messages, debug }); this.name = 'BridgeTransport'; this.url = url; this.latestVersion = latestVersion; // @ts-expect-error this.abortController = getAbortController(); - setFetch(fetch, true); // todo + setFetch(fetch, typeof window === 'undefined'); // todo } async init() { @@ -159,6 +164,9 @@ export class BridgeTransport extends Transport { const reportedNextSession = descriptor.session; const expectedNextSession = this.expectedSessionIds[path]; + this.log('reportedNextSession', reportedNextSession); + this.log('expectedNextSession', expectedNextSession); + if (reportedNextSession == expectedNextSession) { listenPromise.resolve(expectedNextSession); } else { @@ -214,6 +222,7 @@ export class BridgeTransport extends Transport { this.listenPromises[input.path] = createDeferred(); const acquireS = await this._post({ url }); + this.log('acquire response', acquireS); // @ts-ignore this.releasePromise = createDeferred(); @@ -221,8 +230,10 @@ export class BridgeTransport extends Transport { const expectedSessionId = check.acquire(acquireS); this.acquiring = expectedSessionId; this.expectedSessionIds[input.path] = expectedSessionId; + this.log('acquire: settings expectedSessionIds', JSON.stringify(this.expectedSessionIds)); return this.listenPromises[input.path].promise.then(() => { + this.log('acquire listenPromise resolved'); delete this.expectedSessionIds[input.path]; delete this.listenPromises[input.path]; @@ -234,6 +245,12 @@ export class BridgeTransport extends Transport { async release(session: string, onclose?: boolean) { this.releasing = session; + // todo: maybe navigator.sendBeacon should have its use case here but bridge does not react to it + // if (onclose) { + // const res = navigator.sendBeacon(`/release/${session}`); + // return; + // } + this._post({ url: `/release/${session}`, }); @@ -315,6 +332,7 @@ export class BridgeTransport extends Transport { stop() { this.stopped = true; + console.log('TRIGGER ABORT'); this.abortController.abort(); } } diff --git a/packages/transport/src/transports/usb.ts b/packages/transport/src/transports/usb.ts index abb24ba865f4..7b043f970b7b 100644 --- a/packages/transport/src/transports/usb.ts +++ b/packages/transport/src/transports/usb.ts @@ -43,8 +43,14 @@ export class UsbTransport extends Transport { expectedSessionIds: { [path: string]: string } = {}; listenPromises: { [path: string]: Deferred } = {}; - constructor({ messages, usbInterface, sessionsClient, listen }: UsbTransportConstructorParams) { - super({ messages }); + constructor({ + messages, + usbInterface, + sessionsClient, + listen, + debug, + }: UsbTransportConstructorParams) { + super({ messages, debug }); this.usbInterface = usbInterface; this.sessionsClient = sessionsClient;