Skip to content

Commit 1851181

Browse files
committed
fix(connect): webusb sessions sync in all deployments
1 parent 4cc7107 commit 1851181

File tree

5 files changed

+56
-20
lines changed

5 files changed

+56
-20
lines changed

packages/connect-explorer/src/actions/trezorConnectActions.ts

+12
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,17 @@ export const init =
146146
const urlParams = new URLSearchParams(window.location.search);
147147
const coreMode = (urlParams.get('core-mode') as ConnectOptions['coreMode']) || 'auto';
148148

149+
// localhost + dev server
150+
let _sessionsBackgroundUrl = process.env.CONNECT_EXPLORER_FULL_URL
151+
? `${process.env.CONNECT_EXPLORER_FULL_URL}/workers/sessions-background-sharedworker.js`
152+
: window.origin + '/workers/sessions-background-sharedworker.js';
153+
154+
// connect.trezor.io/9 || connect.trezor.io/9.x.y
155+
if (window.location.origin.endsWith('connect.trezor.io')) {
156+
_sessionsBackgroundUrl =
157+
'https://connect.trezor.io/9/workers/sessions-background-sharedworker.js';
158+
}
159+
149160
const connectOptions = {
150161
coreMode,
151162
transportReconnect: true,
@@ -158,6 +169,7 @@ export const init =
158169
},
159170
trustedHost: false,
160171
connectSrc: window.__TREZOR_CONNECT_SRC,
172+
_sessionsBackgroundUrl,
161173
...options,
162174
};
163175

packages/connect/src/data/connectSettings.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ export const parseConnectSettings = (input: Partial<ConnectSettings> = {}) => {
141141
settings._extendWebextensionLifetime = input._extendWebextensionLifetime;
142142
}
143143

144-
if (typeof input._sessionsBackgroundUrl === 'string') {
144+
if (typeof input._sessionsBackgroundUrl === 'string' || input._sessionsBackgroundUrl === null) {
145145
settings._sessionsBackgroundUrl = input._sessionsBackgroundUrl;
146146
}
147147

packages/connect/src/types/settings.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ export interface ConnectSettingsPublic {
2424
* for internal use only!
2525
* in some exotic setups (suite-web where iframe is embedded locally), you might need to tell connect where it should search for sessions background shared-worker
2626
*/
27-
_sessionsBackgroundUrl?: string;
27+
_sessionsBackgroundUrl?: null | string;
2828
// URL for binary files such as firmware, may be local or remote
2929
binFilesBaseUrl?: string;
3030
// enable firmware hash check automatically when device connects. Requires binFilesBaseUrl to be set.

packages/transport/src/transports/webusb.browser.ts

+12-6
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,7 @@ import { UsbApi } from '../api/usb';
55
import { BrowserSessionsBackground } from '../sessions/background-browser';
66

77
const defaultSessionsBackgroundUrl =
8-
window.location.origin +
9-
`${process.env.ASSET_PREFIX || ''}/workers/sessions-background-sharedworker.js`
10-
// just in case so that whoever defines ASSET_PREFIX does not need to worry about trailing slashes
11-
.replace(/\/+/g, '/');
8+
'https://connect.trezor.io/9/workers/sessions-background-sharedworker.js';
129

1310
type WebUsbTransportParams = AbstractTransportParams & { sessionsBackgroundUrl?: string };
1411

@@ -20,18 +17,27 @@ type WebUsbTransportParams = AbstractTransportParams & { sessionsBackgroundUrl?:
2017
export class WebUsbTransport extends AbstractApiTransport {
2118
public name = 'WebUsbTransport' as const;
2219

23-
private readonly sessionsBackgroundUrl;
20+
private readonly sessionsBackgroundUrl: string | null = defaultSessionsBackgroundUrl;
2421

2522
constructor({ logger, sessionsBackgroundUrl, ...rest }: WebUsbTransportParams) {
2623
super({
2724
api: new UsbApi({ usbInterface: navigator.usb, logger }),
2825
logger,
2926
...rest,
3027
});
31-
this.sessionsBackgroundUrl = sessionsBackgroundUrl ?? defaultSessionsBackgroundUrl;
28+
if (sessionsBackgroundUrl || sessionsBackgroundUrl === null) {
29+
this.sessionsBackgroundUrl = sessionsBackgroundUrl;
30+
}
3231
}
3332

3433
private async trySetSessionsBackground() {
34+
if (!this.sessionsBackgroundUrl) {
35+
this.logger?.log(
36+
'No sessionsBackgroundUrl provided. Falling back to use local module.',
37+
);
38+
39+
return;
40+
}
3541
try {
3642
const response = await fetch(this.sessionsBackgroundUrl, { method: 'HEAD' });
3743
if (!response.ok) {

suite-common/connect-init/src/connectInitThunks.ts

+30-12
Original file line numberDiff line numberDiff line change
@@ -109,18 +109,36 @@ export const connectInitThunk = createThunk(
109109

110110
cardanoConnectPatch(getEnabledNetworks);
111111

112-
// note:
113-
// this way, for local development you will get http://localhost:8000/static/connect/workers/sessions-background-sharedworker.js which is still the not-shared shared-worker
114-
// meaning that testing it together with connect-explorer dev build (http://localhost:8088/workers/sessions-background-sharedworker.js) will not work locally.
115-
// in production however, suite and connect are served from the same domain (trezor.io, sldev.cz) so it will work as expected.
116-
let sessionsBackground: string | undefined;
112+
// suite-web connect (explorer) webusb sync
113+
// ====================================================== ==================== ====================
114+
// localhost:8000 localhost:8088 NO
115+
// https://dev.suite.sldev.cz/suite-web/develop/web/ https://dev.suite.sldev.cz/connect/develop/ YES - connect
116+
// suite.trezor.io/web connect.trezor.io/9(x.y)/ YES - connect
117+
118+
let _sessionsBackgroundUrl: string | null = null;
119+
117120
if (typeof window !== 'undefined' && !isNative()) {
118-
sessionsBackground =
119-
window.location.origin +
120-
resolveStaticPath(
121-
'connect/workers/sessions-background-sharedworker.js',
122-
`${process.env.ASSET_PREFIX || ''}`,
123-
);
121+
if (window.location.origin.includes('localhost')) {
122+
_sessionsBackgroundUrl = null;
123+
} else if (window.location.origin.endsWith('dev.suite.sldev.cz')) {
124+
// we are expecting accompanying connect build at specified location
125+
const assetPrefixArr = (process.env.ASSET_PREFIX || '').split('/').filter(Boolean);
126+
const relevantSegments = assetPrefixArr
127+
.map((segment, index) => {
128+
const first = index === 0;
129+
const last = index === assetPrefixArr.length - 1;
130+
if (segment === 'suite-web' && first) return 'connect';
131+
if (segment === 'web' && last) return null;
132+
133+
return segment;
134+
})
135+
.filter(Boolean);
136+
137+
_sessionsBackgroundUrl = `${window.location.origin}/${relevantSegments.join('/')}/workers/sessions-background-sharedworker.js`;
138+
} else {
139+
_sessionsBackgroundUrl =
140+
'https://connect.trezor.io/9/workers/sessions-background-sharedworker.js';
141+
}
124142
}
125143

126144
// Duplicates `getBinFilesBaseUrlThunk`, because calling any other thunk would change store.getActions() history,
@@ -135,7 +153,7 @@ export const connectInitThunk = createThunk(
135153
binFilesBaseUrl,
136154
pendingTransportEvent: selectIsPendingTransportEvent(getState()),
137155
transports: selectDebugSettings(getState()).transports,
138-
_sessionsBackgroundUrl: sessionsBackground,
156+
_sessionsBackgroundUrl,
139157
// debug: true, // Enable debug logs in TrezorConnect
140158
});
141159
} catch (error) {

0 commit comments

Comments
 (0)