Skip to content

Commit 4c794c9

Browse files
refactor(suite): subscribe migration to suite sync ensure
Refs #28176
1 parent 5877ead commit 4c794c9

12 files changed

Lines changed: 152 additions & 91 deletions

File tree

packages/suite/src/support/extraDependencies.ts

Lines changed: 16 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,9 @@ import { lockDevice } from '@suite/locks';
77
import {
88
metadataActions,
99
metadataLabelingActions,
10-
selectHasLegacyLabelsMigrated,
11-
selectIsMetadataEnabled,
1210
selectLabelingDataForAccount,
13-
selectSelectedProviderForLabels,
1411
} from '@suite/metadata';
15-
import {
16-
createEnsureWalletSuiteSyncOnWithMigration,
17-
createMetadataMigrationCompositionRoot,
18-
} from '@suite/metadata-migration';
12+
import { createMetadataMigrationCompositionRoot } from '@suite/metadata-migration';
1913
import type { MetadataMigrationDep } from '@suite/metadata-migration';
2014
import { closeModal, openModal } from '@suite/modal';
2115
import {
@@ -48,7 +42,6 @@ import {
4842
selectIsSuiteSyncEnabled,
4943
selectSuiteSyncWalletLabel,
5044
} from '@suite-common/suite-sync';
51-
import { type SuiteSync } from '@suite-common/suite-sync-types';
5245
import {
5346
type TokenDefinitionsState,
5447
buildTokenDefinitionsFromStorage,
@@ -115,22 +108,7 @@ export const createSuiteServicesCompositionRoot = (deps: SuiteAppDeps): SuiteSer
115108

116109
const analytics = createAnalytics();
117110

118-
const getCurrentAccountLabels = toGetter(deps.getState, selectAllLabelsForAccount);
119-
const getAccountsByDeviceState = toGetter(deps.getState, selectAccountsByDeviceState);
120-
const migrateLegacyLabelsToSuiteSyncRef: {
121-
current: MetadataMigrationDep['migrateLegacyLabelsToSuiteSync'] | undefined;
122-
} = { current: undefined };
123-
124-
const createDecoratedEnsureWalletSuiteSyncOn = createEnsureWalletSuiteSyncOnWithMigration({
125-
dispatch: deps.dispatch,
126-
getMigrateLegacyLabelsToSuiteSync: () => migrateLegacyLabelsToSuiteSyncRef.current,
127-
getIsMetadataEnabled: toGetter(deps.getState, selectIsMetadataEnabled),
128-
getSelectedProviderForLabels: toGetter(deps.getState, selectSelectedProviderForLabels),
129-
getHasLegacyLabelsMigrated: toGetter(deps.getState, selectHasLegacyLabelsMigrated),
130-
getDeviceByStaticSessionId: toGetter(deps.getState, selectDeviceByStaticSessionId),
131-
});
132-
133-
const suiteSync: SuiteSync = createSuiteSyncDesktopCompositionRoot({
111+
const suiteSync = createSuiteSyncDesktopCompositionRoot({
134112
dispatch: deps.dispatch,
135113
getState: deps.getState,
136114
platformEncryption: deps.platformEncryption,
@@ -144,18 +122,23 @@ export const createSuiteServicesCompositionRoot = (deps: SuiteAppDeps): SuiteSer
144122
dispatch: deps.dispatch,
145123
deviceStaticSessionId: device?.state?.staticSessionId ?? null,
146124
}),
147-
createDecoratedEnsureWalletSuiteSyncOn,
148125
});
149126

150-
const { migrateLegacyLabelsToSuiteSync } = createMetadataMigrationCompositionRoot({
151-
getState: deps.getState,
152-
getAccountsByDeviceState,
153-
getCurrentWalletLabel: toGetter(deps.getState, selectSuiteSyncWalletLabel),
154-
getCurrentAccountLabels,
155-
labeling: suiteSync.labeling,
156-
});
127+
const getCurrentAccountLabels = toGetter(deps.getState, selectAllLabelsForAccount);
128+
const getAccountsByDeviceState = toGetter(deps.getState, selectAccountsByDeviceState);
129+
130+
const { ensureWalletSuiteSyncOnWithMigration, migrateLegacyLabelsToSuiteSync } =
131+
createMetadataMigrationCompositionRoot({
132+
dispatch: deps.dispatch,
133+
getState: deps.getState,
134+
getAccountsByDeviceState,
135+
getCurrentWalletLabel: toGetter(deps.getState, selectSuiteSyncWalletLabel),
136+
getCurrentAccountLabels,
137+
getDeviceByStaticSessionId: toGetter(deps.getState, selectDeviceByStaticSessionId),
138+
labeling: suiteSync.labeling,
139+
});
157140

158-
migrateLegacyLabelsToSuiteSyncRef.current = migrateLegacyLabelsToSuiteSync;
141+
suiteSync.onWalletSuiteSyncOnEnsured(ensureWalletSuiteSyncOnWithMigration);
159142

160143
const { bip329 } = createBip329CompositionRoot({
161144
getIsSuiteSyncEnabled: toGetter(deps.getState, selectIsSuiteSyncEnabled),

suite-common/suite-sync-types/src/SuiteSync.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { type ChangeRelayUrlDep } from './relay/changeRelayUrl';
77
import {
88
type EnsureWalletSuiteSyncOnAsyncDep,
99
type EnsureWalletSuiteSyncOnDep,
10+
type OnWalletSuiteSyncOnEnsuredDep,
1011
} from './storage/ensureWalletSuiteSyncOn';
1112
import { type TurnOffSuiteSyncForWalletDep } from './storage/turnOffSuiteSyncForWallet';
1213
import { type TurnOffSuiteSyncDep } from './turnOffSuiteSync';
@@ -24,6 +25,7 @@ export type SuiteSync = ChangeRelayUrlDep &
2425
TurnOffSuiteSyncDep &
2526
EnsureWalletSuiteSyncOnDep &
2627
EnsureWalletSuiteSyncOnAsyncDep &
28+
OnWalletSuiteSyncOnEnsuredDep &
2729
DangerouslyWipeAllLabelsFromWalletDep &
2830
TurnOffSuiteSyncForWalletDep &
2931
LabelingDep;

suite-common/suite-sync-types/src/index.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,16 +57,18 @@ export {
5757
selectTurnOffSuiteSyncForWalletDep,
5858
} from './storage/turnOffSuiteSyncForWallet';
5959
export {
60-
type CreateDecoratedEnsureWalletSuiteSyncOn,
61-
type CreateDecoratedEnsureWalletSuiteSyncOnDep,
6260
type EnsureWalletSuiteSyncOnAsync,
6361
type EnsureWalletSuiteSyncOnAsyncDep,
6462
type EnsureWalletSuiteSyncOn,
6563
type EnsureWalletSuiteSyncOnErrors,
6664
type EnsureWalletSuiteSyncOnDep,
6765
type EnsureWalletSuiteSyncOnParams,
66+
type OnWalletSuiteSyncOnEnsured,
67+
type OnWalletSuiteSyncOnEnsuredDep,
6868
type SuiteSyncFirmwareUpgradeNeededDeviceErrorType,
6969
type SuiteSyncUserFacingErrorType,
70+
type WalletSuiteSyncOnEnsuredListener,
71+
type WalletSuiteSyncOnEnsuredParams,
7072
selectEnsureWalletSuiteSyncOnAsyncDep,
7173
selectEnsureWalletSuiteSyncOnDep,
7274
} from './storage/ensureWalletSuiteSyncOn';

suite-common/suite-sync-types/src/storage/ensureWalletSuiteSyncOn.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,18 @@ export type EnsureWalletSuiteSyncOn = (
3535
params: EnsureWalletSuiteSyncOnParams,
3636
) => Promise<Result<SuiteSyncStorage, EnsureWalletSuiteSyncOnErrors>>;
3737

38-
export type CreateDecoratedEnsureWalletSuiteSyncOn = (
39-
ensureWalletSuiteSyncOn: EnsureWalletSuiteSyncOn,
40-
) => EnsureWalletSuiteSyncOn;
38+
export type WalletSuiteSyncOnEnsuredParams = EnsureWalletSuiteSyncOnParams & {
39+
storage: SuiteSyncStorage;
40+
};
41+
42+
export type WalletSuiteSyncOnEnsuredListener = (
43+
params: WalletSuiteSyncOnEnsuredParams,
44+
) => Promise<void> | void;
45+
46+
export type OnWalletSuiteSyncOnEnsured = (listener: WalletSuiteSyncOnEnsuredListener) => void;
4147

42-
export type CreateDecoratedEnsureWalletSuiteSyncOnDep = {
43-
createDecoratedEnsureWalletSuiteSyncOn: CreateDecoratedEnsureWalletSuiteSyncOn;
48+
export type OnWalletSuiteSyncOnEnsuredDep = {
49+
onWalletSuiteSyncOnEnsured: OnWalletSuiteSyncOnEnsured;
4450
};
4551

4652
export type EnsureWalletSuiteSyncOnDep = { ensureWalletSuiteSyncOn: EnsureWalletSuiteSyncOn };

suite-common/suite-sync/src/createSuiteSyncCompositionRoot.ts

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,10 @@ import {
2020
type CreateSuiteSyncOwnerDep,
2121
} from '@suite-common/suite-sync-storage';
2222
import {
23-
type CreateDecoratedEnsureWalletSuiteSyncOnDep,
23+
type OnWalletSuiteSyncOnEnsured,
2424
type SuiteSync,
2525
type SuiteSyncInternalErrorHandler,
26+
type WalletSuiteSyncOnEnsuredListener,
2627
} from '@suite-common/suite-sync-types';
2728
import { type AccountsRootState, selectAccounts } from '@suite-common/wallet-core';
2829
import { type Analytics } from '@trezor/analytics-uploader';
@@ -96,8 +97,7 @@ type CreateSuiteSyncCompositionRootDeps = {
9697
CreateSuiteSyncOwnerDep &
9798
PlatformEncryptionDep &
9899
FetchDep &
99-
SuiteSyncAsyncErrorHandlerDep &
100-
CreateDecoratedEnsureWalletSuiteSyncOnDep;
100+
SuiteSyncAsyncErrorHandlerDep;
101101

102102
export const createSuiteSyncCompositionRoot = (
103103
deps: CreateSuiteSyncCompositionRootDeps,
@@ -174,16 +174,21 @@ export const createSuiteSyncCompositionRoot = (
174174
suiteSyncListener,
175175
});
176176

177+
const walletSuiteSyncOnEnsuredListeners: WalletSuiteSyncOnEnsuredListener[] = [];
178+
179+
const onWalletSuiteSyncOnEnsured: OnWalletSuiteSyncOnEnsured = listener => {
180+
walletSuiteSyncOnEnsuredListeners.push(listener);
181+
};
182+
177183
const ensureWalletSuiteSyncOn = createEnsureWalletSuiteSyncOnWithErrorHandler({
178184
dispatch: deps.dispatch,
179-
ensureWalletSuiteSyncOn: deps.createDecoratedEnsureWalletSuiteSyncOn(
180-
createEnsureWalletSuiteSyncOn({
181-
getState: deps.getState,
182-
ensureSuiteSyncKeys,
183-
ensureSubscribedStorage,
184-
subscriptionStorage,
185-
}),
186-
),
185+
ensureWalletSuiteSyncOn: createEnsureWalletSuiteSyncOn({
186+
getState: deps.getState,
187+
ensureSuiteSyncKeys,
188+
ensureSubscribedStorage,
189+
subscriptionStorage,
190+
getWalletSuiteSyncOnEnsuredListeners: () => walletSuiteSyncOnEnsuredListeners,
191+
}),
187192
});
188193

189194
const ensureWalletSuiteSyncOnAsync = createEnsureWalletSuiteSyncOnAsync({
@@ -222,6 +227,7 @@ export const createSuiteSyncCompositionRoot = (
222227
getAllDeviceSessionIds,
223228
dispatch: deps.dispatch,
224229
}),
230+
onWalletSuiteSyncOnEnsured,
225231
ensureWalletSuiteSyncOnAsync,
226232
ensureWalletSuiteSyncOn,
227233
turnOffSuiteSyncForWallet,

suite-common/suite-sync/src/storage/createEnsureWalletSuiteSyncOn.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,15 @@ import {
88
type EnsureSuiteSyncKeysDep,
99
type EnsureWalletSuiteSyncOn,
1010
type SubscriptionStorageDep,
11+
type WalletSuiteSyncOnEnsuredListener,
1112
} from '@suite-common/suite-sync-types';
1213
import { err } from '@trezor/type-utils';
1314

1415
import { isFwUpgradeNeededForSuiteSync, isSuiteSyncSupportedByDevice } from '../suiteSyncUtils';
1516

1617
export type EnsureWalletSuiteSyncOnDeps = {
1718
getState: () => DeviceRootState;
19+
getWalletSuiteSyncOnEnsuredListeners: () => WalletSuiteSyncOnEnsuredListener[];
1820
} & EnsureSubscribedStorageDep &
1921
EnsureSuiteSyncKeysDep &
2022
SubscriptionStorageDep;
@@ -39,5 +41,19 @@ export const createEnsureWalletSuiteSyncOn =
3941
return err({ type: 'SuiteSyncUnavailableOnDeviceError' });
4042
}
4143

42-
return await deps.ensureSubscribedStorage({ deviceStaticSessionId, isWriteMode });
44+
const result = await deps.ensureSubscribedStorage({ deviceStaticSessionId, isWriteMode });
45+
46+
if (!result.success) {
47+
return result;
48+
}
49+
50+
for (const listener of deps.getWalletSuiteSyncOnEnsuredListeners()) {
51+
await listener({
52+
deviceStaticSessionId,
53+
isWriteMode,
54+
storage: result.payload,
55+
});
56+
}
57+
58+
return result;
4359
};

suite-common/suite-sync/src/storage/tests/createEnsureWalletSuiteSyncOn.test.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { createMockDeps } from '@suite-common/dependency-injection';
22
import type { DeviceRootState } from '@suite-common/device';
33
import { deviceReducerInitialState } from '@suite-common/device';
4+
import { type WalletSuiteSyncOnEnsuredListener } from '@suite-common/suite-sync-types';
45
import type { TrezorDevice } from '@suite-common/suite-types';
56
import { mockSuiteDevice } from '@suite-common/suite-types/mocks';
67
import type { StaticSessionId, UnavailableCapabilities } from '@trezor/connect';
@@ -29,6 +30,7 @@ describe(createEnsureWalletSuiteSyncOn.name, () => {
2930
ensureSubscribedStorage: null,
3031
subscriptionStorage: createSubscriptionStorageMock(),
3132
ensureSuiteSyncKeys: null,
33+
getWalletSuiteSyncOnEnsuredListeners: () => [],
3234
});
3335

3436
const result = await createEnsureWalletSuiteSyncOn(deps)({
@@ -51,6 +53,7 @@ describe(createEnsureWalletSuiteSyncOn.name, () => {
5153
ensureSuiteSyncKeys: null,
5254
ensureSubscribedStorage: null,
5355
subscriptionStorage: createSubscriptionStorageMock(),
56+
getWalletSuiteSyncOnEnsuredListeners: () => [],
5457
});
5558

5659
const result = await createEnsureWalletSuiteSyncOn(deps)({
@@ -73,6 +76,7 @@ describe(createEnsureWalletSuiteSyncOn.name, () => {
7376
ensureSuiteSyncKeys: null,
7477
ensureSubscribedStorage: () => Promise.resolve(ensureResult),
7578
subscriptionStorage: createSubscriptionStorageMock(),
79+
getWalletSuiteSyncOnEnsuredListeners: () => [],
7680
});
7781

7882
const result = await createEnsureWalletSuiteSyncOn(deps)({
@@ -95,6 +99,7 @@ describe(createEnsureWalletSuiteSyncOn.name, () => {
9599
ensureSuiteSyncKeys: null,
96100
ensureSubscribedStorage: () => Promise.resolve(ensureResult),
97101
subscriptionStorage: createSubscriptionStorageMock(),
102+
getWalletSuiteSyncOnEnsuredListeners: () => [],
98103
});
99104

100105
const result = await createEnsureWalletSuiteSyncOn(deps)({
@@ -108,4 +113,34 @@ describe(createEnsureWalletSuiteSyncOn.name, () => {
108113
});
109114
expect(result).toBe(ensureResult);
110115
});
116+
117+
it('calls onWalletSuiteSyncOnEnsured listeners after successful ensure', async () => {
118+
const ensureResult = ok({ data: {} } as any);
119+
if (!ensureResult.success) {
120+
throw new Error('Expected successful ensureResult in test.');
121+
}
122+
123+
const onWalletSuiteSyncOnEnsured: WalletSuiteSyncOnEnsuredListener = jest.fn(() =>
124+
Promise.resolve(),
125+
);
126+
127+
const deps = createMockDeps<EnsureWalletSuiteSyncOnDeps>({
128+
getState: () => createMockState([DEVICE_123]),
129+
ensureSuiteSyncKeys: null,
130+
ensureSubscribedStorage: () => Promise.resolve(ensureResult),
131+
subscriptionStorage: createSubscriptionStorageMock(),
132+
getWalletSuiteSyncOnEnsuredListeners: () => [onWalletSuiteSyncOnEnsured],
133+
});
134+
135+
await createEnsureWalletSuiteSyncOn(deps)({
136+
deviceStaticSessionId: DEVICE_STATIC_SESSION_ID_123,
137+
isWriteMode: false,
138+
});
139+
140+
expect(onWalletSuiteSyncOnEnsured).toHaveBeenCalledWith({
141+
deviceStaticSessionId: DEVICE_STATIC_SESSION_ID_123,
142+
isWriteMode: false,
143+
storage: ensureResult.payload,
144+
});
145+
});
111146
});

suite-native/suite-sync/src/createSuiteSyncNativeCompositionRoot.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ export const createSuiteSyncNativeCompositionRoot = (
4343

4444
return createSuiteSyncCompositionRoot({
4545
...deps,
46-
createDecoratedEnsureWalletSuiteSyncOn: ensureWalletSuiteSyncOn => ensureWalletSuiteSyncOn,
4746
createSuiteStorage: createEvoluStorageFactory({
4847
createEvoluInstance: createEvoluInstanceFactory({ run }),
4948
}),

0 commit comments

Comments
 (0)