Skip to content

Commit 76e8b6e

Browse files
committed
wip: adding dipose to the repository storage
1 parent ce28db5 commit 76e8b6e

File tree

3 files changed

+128
-1
lines changed

3 files changed

+128
-1
lines changed

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ export type CreateSuiteSyncStorageRepositoryFactoryDeps = CreateSuiteStorageDep
2626
export type SuiteSyncStorageRepository = {
2727
get: (owner: SuiteSyncOwner) => SuiteSyncStorage;
2828
delete: (ownerId: SuiteSyncOwnerId) => Promise<void>;
29+
deleteAll: () => Promise<void>;
2930
};
3031

3132
export type CreateSuiteSyncStorageRepository = () => SuiteSyncStorageRepository;
@@ -62,5 +63,10 @@ export const createSuiteSyncStorageRepositoryFactory =
6263
await storages.get(suiteSyncOwner)?.dispose();
6364
storages.delete(suiteSyncOwner);
6465
},
66+
67+
deleteAll: async () => {
68+
await Promise.all(Array.from(storages.values()).map(storage => storage.dispose()));
69+
storages.clear();
70+
},
6571
};
6672
};

suite-common/suite-sync-storage/tests/SuiteSyncStorageRepository.test.ts

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
asSuiteSyncOwnerSecretHex,
55
} from '@suite-common/suite-types';
66

7+
import { SuiteSyncStorage } from '../src';
78
import {
89
CreateSuiteStorage,
910
createSuiteSyncStorageRepositoryFactory,
@@ -31,4 +32,117 @@ describe('SuiteSyncStorageRepository', () => {
3132
suiteSyncOwner: owner,
3233
});
3334
});
35+
36+
it('stores only one storage per owner', () => {
37+
const mockStorage = {
38+
dispose: jest.fn(),
39+
updateRelayUrl: jest.fn(),
40+
} as unknown as SuiteSyncStorage;
41+
const createSuiteStorage: CreateSuiteStorage = jest.fn().mockReturnValue(mockStorage);
42+
43+
const repository = createSuiteSyncStorageRepositoryFactory({
44+
createSuiteStorage,
45+
getRelayUrl: () => '',
46+
defaultRelayUrl: 'http://default-relay.trezor.io',
47+
})();
48+
49+
repository.get(owner);
50+
repository.get(owner);
51+
52+
expect(createSuiteStorage).toHaveBeenCalledTimes(1);
53+
});
54+
55+
it('deletes and owner instance and creates a new one', async () => {
56+
const mockStorage = {
57+
dispose: jest.fn(),
58+
updateRelayUrl: jest.fn(),
59+
} as unknown as SuiteSyncStorage;
60+
61+
const createSuiteStorage: CreateSuiteStorage = jest.fn().mockReturnValue(mockStorage);
62+
63+
const repository = createSuiteSyncStorageRepositoryFactory({
64+
createSuiteStorage,
65+
getRelayUrl: () => '',
66+
defaultRelayUrl: 'http://default-relay.trezor.io',
67+
})();
68+
69+
repository.get(owner);
70+
await repository.delete(owner.ownerId);
71+
repository.get(owner);
72+
73+
expect(createSuiteStorage).toHaveBeenCalledTimes(2);
74+
});
75+
76+
it('deletes all storages', async () => {
77+
const owner2: SuiteSyncOwner = {
78+
ownerSecret: asSuiteSyncOwnerSecretHex('Secret1235'),
79+
ownerId: asSuiteSyncOwnerId('Owner1235'),
80+
};
81+
const mockStorage1 = {
82+
id: '1',
83+
dispose: jest.fn(),
84+
updateRelayUrl: jest.fn(),
85+
} as unknown as SuiteSyncStorage;
86+
87+
const mockStorage2 = {
88+
id: '2',
89+
dispose: jest.fn(),
90+
updateRelayUrl: jest.fn(),
91+
} as unknown as SuiteSyncStorage;
92+
93+
const createSuiteStorage: CreateSuiteStorage = jest
94+
.fn()
95+
.mockReturnValueOnce(mockStorage1)
96+
.mockReturnValueOnce(mockStorage2);
97+
98+
const repository = createSuiteSyncStorageRepositoryFactory({
99+
createSuiteStorage,
100+
getRelayUrl: () => '',
101+
defaultRelayUrl: 'http://default-relay.trezor.io',
102+
})();
103+
104+
repository.get(owner);
105+
repository.get(owner2);
106+
await repository.deleteAll();
107+
108+
expect(mockStorage1.dispose).toHaveBeenCalledTimes(1);
109+
expect(mockStorage2.dispose).toHaveBeenCalledTimes(1);
110+
});
111+
112+
it('clears all storages in memory after deleteAll', async () => {
113+
const owner2: SuiteSyncOwner = {
114+
ownerSecret: asSuiteSyncOwnerSecretHex('Secret1235'),
115+
ownerId: asSuiteSyncOwnerId('Owner1235'),
116+
};
117+
const mockStorage1 = {
118+
id: '1',
119+
dispose: jest.fn(),
120+
updateRelayUrl: jest.fn(),
121+
} as unknown as SuiteSyncStorage;
122+
123+
const mockStorage2 = {
124+
id: '2',
125+
dispose: jest.fn(),
126+
updateRelayUrl: jest.fn(),
127+
} as unknown as SuiteSyncStorage;
128+
129+
const createSuiteStorage: CreateSuiteStorage = jest
130+
.fn()
131+
.mockReturnValueOnce(mockStorage1)
132+
.mockReturnValueOnce(mockStorage2);
133+
134+
const repository = createSuiteSyncStorageRepositoryFactory({
135+
createSuiteStorage,
136+
getRelayUrl: () => '',
137+
defaultRelayUrl: 'http://default-relay.trezor.io',
138+
})();
139+
140+
repository.get(owner);
141+
repository.get(owner2);
142+
await repository.deleteAll();
143+
repository.get(owner);
144+
repository.get(owner2);
145+
146+
expect(createSuiteStorage).toHaveBeenCalledTimes(4);
147+
});
34148
});

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
import type { Dispatch } from '@reduxjs/toolkit';
22

3-
import { TurnOffSuiteSync, UnsubscribeSuiteSyncStorage } from '@suite-common/suite-sync-storage';
3+
import {
4+
SuiteSyncStorageRepository,
5+
TurnOffSuiteSync,
6+
UnsubscribeSuiteSyncStorage,
7+
} from '@suite-common/suite-sync-storage';
48
import { selectDevices } from '@suite-common/wallet-core';
59
import { isTrezorDeviceWithState } from '@suite-common/wallet-utils';
610

@@ -10,6 +14,7 @@ type CreateTurnOffSuiteSyncDeps = {
1014
getState: () => any;
1115
dispatch: Dispatch;
1216
unsubscribeSuiteSyncStorage: UnsubscribeSuiteSyncStorage;
17+
suiteSyncStorageRepository: SuiteSyncStorageRepository;
1318
};
1419

1520
export const createTurnOffSuiteSync =
@@ -32,4 +37,6 @@ export const createTurnOffSuiteSync =
3237
.filter(isTrezorDeviceWithState)
3338
.map(device => deps.unsubscribeSuiteSyncStorage({ device })),
3439
);
40+
41+
await deps.suiteSyncStorageRepository.deleteAll();
3542
};

0 commit comments

Comments
 (0)