Skip to content

Commit 284e28b

Browse files
feat: add method to iterate over all registered nano contracts on storage (#654)
1 parent 7a11fce commit 284e28b

File tree

6 files changed

+83
-0
lines changed

6 files changed

+83
-0
lines changed

__tests__/storage/storage.test.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,13 @@ describe('handleStop', () => {
6464
outputs: [],
6565
});
6666
await storage.registerToken(testToken);
67+
const testNano = {
68+
ncId: 'abc',
69+
address: 'nanoAddress',
70+
blueprintId: 'blueprintId',
71+
blueprintName: 'blueprintName',
72+
};
73+
await storage.registerNanoContract('abc', testNano);
6774
// We have 1 transaction
6875
await expect(store.historyCount()).resolves.toEqual(1);
6976
// 20 addresses
@@ -72,6 +79,10 @@ describe('handleStop', () => {
7279
let tokens = await toArray(storage.getRegisteredTokens());
7380
expect(tokens).toHaveLength(1);
7481
expect(tokens[0]).toEqual(testToken);
82+
// And 1 registered nano contract
83+
let nanos = await toArray(storage.getRegisteredNanoContracts());
84+
expect(nanos).toHaveLength(1);
85+
expect(nanos[0]).toEqual(testNano);
7586

7687
storage.version = 'something';
7788
// handleStop with defaults
@@ -82,19 +93,27 @@ describe('handleStop', () => {
8293
await expect(store.historyCount()).resolves.toEqual(1);
8394
await expect(store.addressCount()).resolves.toEqual(20);
8495
await expect(store.isTokenRegistered(testToken.uid)).resolves.toBeTruthy();
96+
await expect(store.isNanoContractRegistered(testNano.ncId)).resolves.toBeTruthy();
8597
tokens = await toArray(storage.getRegisteredTokens());
8698
expect(tokens).toHaveLength(1);
8799
expect(tokens[0]).toEqual(testToken);
100+
nanos = await toArray(storage.getRegisteredNanoContracts());
101+
expect(nanos).toHaveLength(1);
102+
expect(nanos[0]).toEqual(testNano);
88103

89104
// handleStop with cleanStorage = true
90105
await storage.handleStop({ cleanStorage: true });
91106
// Will clean the history bit not addresses or registered tokens
92107
await expect(store.historyCount()).resolves.toEqual(0);
93108
await expect(store.addressCount()).resolves.toEqual(20);
94109
await expect(store.isTokenRegistered(testToken.uid)).resolves.toBeTruthy();
110+
await expect(store.isNanoContractRegistered(testNano.ncId)).resolves.toBeTruthy();
95111
tokens = await toArray(storage.getRegisteredTokens());
96112
expect(tokens).toHaveLength(1);
97113
expect(tokens[0]).toEqual(testToken);
114+
nanos = await toArray(storage.getRegisteredNanoContracts());
115+
expect(nanos).toHaveLength(1);
116+
expect(nanos[0]).toEqual(testNano);
98117

99118
await storage.addTx({
100119
tx_id: 'another-new-tx',
@@ -109,9 +128,13 @@ describe('handleStop', () => {
109128
await expect(store.historyCount()).resolves.toEqual(1);
110129
await expect(store.addressCount()).resolves.toEqual(0);
111130
await expect(store.isTokenRegistered(testToken.uid)).resolves.toBeTruthy();
131+
await expect(store.isNanoContractRegistered(testNano.ncId)).resolves.toBeTruthy();
112132
tokens = await toArray(storage.getRegisteredTokens());
113133
expect(tokens).toHaveLength(1);
114134
expect(tokens[0]).toEqual(testToken);
135+
nanos = await toArray(storage.getRegisteredNanoContracts());
136+
expect(nanos).toHaveLength(1);
137+
expect(nanos[0]).toEqual(testNano);
115138

116139
// handleStop with cleanAddresses = true
117140
await loadAddresses(0, 20, storage);
@@ -120,6 +143,12 @@ describe('handleStop', () => {
120143
await expect(store.historyCount()).resolves.toEqual(1);
121144
await expect(store.addressCount()).resolves.toEqual(20);
122145
await expect(store.isTokenRegistered(testToken.uid)).resolves.toBeFalsy();
146+
await expect(store.isNanoContractRegistered(testNano.ncId)).resolves.toBeFalsy();
147+
148+
tokens = await toArray(storage.getRegisteredTokens());
149+
expect(tokens).toHaveLength(0);
150+
nanos = await toArray(storage.getRegisteredNanoContracts());
151+
expect(nanos).toHaveLength(0);
123152

124153
// Access data is untouched when stopping the wallet
125154
// XXX: since we stringify to save on store, the optional undefined properties are removed

src/storage/leveldb/nanocontract_index.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,19 @@ export default class LevelNanoContractIndex implements IKVNanoContractIndex {
6868
return nc !== null;
6969
}
7070

71+
/**
72+
* Iterate over all registered nano contracts in the database
73+
*
74+
* @async
75+
* @generator
76+
* @returns {AsyncGenerator<INcData>}
77+
*/
78+
async *registeredNanoContractsIter(): AsyncGenerator<INcData> {
79+
for await (const ncData of this.registeredDB.values()) {
80+
yield ncData;
81+
}
82+
}
83+
7184
/**
7285
* Get a nano contract data on database from the ncId.
7386
*

src/storage/leveldb/store.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,19 @@ export default class LevelDBStore implements IStore {
386386
return this.nanoContractIndex.isNanoContractRegistered(ncId);
387387
}
388388

389+
/**
390+
* Iterate over all registered nano contracts in the database
391+
*
392+
* @async
393+
* @generator
394+
* @returns {AsyncGenerator<INcData>}
395+
*/
396+
async *registeredNanoContractsIter(): AsyncGenerator<INcData> {
397+
for await (const ncData of this.nanoContractIndex.registeredNanoContractsIter()) {
398+
yield ncData;
399+
}
400+
}
401+
389402
/**
390403
* Get a nano contract data on storage from the ncId.
391404
*

src/storage/memory_store.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -907,6 +907,19 @@ export class MemoryStore implements IStore {
907907
return this.registeredNanoContracts.has(ncId);
908908
}
909909

910+
/**
911+
* Iterate on registered nano contracts.
912+
*
913+
* @async
914+
* @generator
915+
* @returns {AsyncGenerator<INcData>}
916+
*/
917+
async *registeredNanoContractsIter(): AsyncGenerator<INcData> {
918+
for (const ncData of this.registeredNanoContracts.values()) {
919+
yield ncData;
920+
}
921+
}
922+
910923
/**
911924
* Get a nano contract data on storage from the ncId.
912925
*

src/storage/storage.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -985,6 +985,19 @@ export class Storage implements IStorage {
985985
return this.store.isNanoContractRegistered(ncId);
986986
}
987987

988+
/**
989+
* Iterate on all registered nano contracts of the wallet.
990+
*
991+
* @async
992+
* @generator
993+
* @returns {AsyncGenerator<INcData>}
994+
*/
995+
async *getRegisteredNanoContracts(): AsyncGenerator<INcData> {
996+
for await (const ncData of this.store.registeredNanoContractsIter()) {
997+
yield ncData;
998+
}
999+
}
1000+
9881001
/**
9891002
* Get nano contract data.
9901003
* @param ncId Nano Contract ID.

src/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,7 @@ export interface IStore {
401401

402402
// Nano Contract methods
403403
isNanoContractRegistered(ncId: string): Promise<boolean>;
404+
registeredNanoContractsIter(): AsyncGenerator<INcData>;
404405
getNanoContract(ncId: string): Promise<INcData | null>;
405406
registerNanoContract(ncId: string, ncValue: INcData): Promise<void>;
406407
unregisterNanoContract(ncId: string): Promise<void>;
@@ -595,6 +596,7 @@ export interface IKVNanoContractIndex extends IKVStoreIndex<void> {
595596

596597
export interface INcData {
597598
ncId: string;
599+
address: string;
598600
blueprintId: string;
599601
blueprintName: string;
600602
}

0 commit comments

Comments
 (0)