Skip to content

Commit 98bcbcf

Browse files
authored
DID resolution with no active blockchain connection (#443)
* DID resolution withtou blockchain connection * DID resolution with no blockchain connection * fixing issues with blockchain ready flag * fixing tests
1 parent 0466ba7 commit 98bcbcf

4 files changed

Lines changed: 43 additions & 21 deletions

File tree

integration-tests/did-resolution.test.ts

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,12 @@
11
import {blockchainService} from '@docknetwork/wallet-sdk-wasm/src/services/blockchain';
2-
import {issueCredential} from './helpers/certs-helpers';
32
import {
43
getWallet,
54
getDIDProvider,
6-
getMessageProvider,
75
closeWallet,
86
} from './helpers/wallet-helpers';
9-
import {logger} from '@docknetwork/wallet-sdk-data-store/src/logger';
107
import { storageService } from '@docknetwork/wallet-sdk-wasm/src/services/storage';
118

129
describe('DID resolution', () => {
13-
let wallet;
14-
15-
beforeAll(async () => {
16-
wallet = await getWallet();
17-
});
1810

1911
it('should resolve did service endpoints', async () => {
2012
const wallet = await getWallet();
@@ -34,7 +26,24 @@ describe('DID resolution', () => {
3426
const cachedEntry = JSON.parse(cacheJSON);
3527
expect(cachedEntry.value).toEqual(doc1);
3628
expect(cachedEntry.id).toEqual('did:cheqd:testnet:c0890f1c-c7bb-4ea6-be7a-8c31404743b7');
29+
30+
closeWallet(wallet)
3731
});
3832

39-
afterAll(() => closeWallet(wallet));
33+
it('should resolve DID without active blockchain connection (fallback resolver)', async () => {
34+
const doc1 = await blockchainService.resolveDID(
35+
'did:cheqd:testnet:c0890f1c-c7bb-4ea6-be7a-8c31404743b7',
36+
);
37+
38+
const messagingService = doc1.service.find(service => service.type === 'DIDCommMessaging');
39+
expect(messagingService).toBeDefined();
40+
41+
const cacheKey = `did-cache:did:cheqd:testnet:c0890f1c-c7bb-4ea6-be7a-8c31404743b7`;
42+
const cacheJSON = await storageService.getItem(cacheKey);
43+
expect(cacheJSON).toBeDefined();
44+
45+
const cachedEntry = JSON.parse(cacheJSON);
46+
expect(cachedEntry.value).toEqual(doc1);
47+
expect(cachedEntry.id).toEqual('did:cheqd:testnet:c0890f1c-c7bb-4ea6-be7a-8c31404743b7');
48+
});
4049
});

packages/relay-service/src/index.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,6 @@ const getMessages = async ({
112112
assert(Array.isArray(keyPairDocs), 'keyPairDocs must be an array');
113113
assert(!!keyPairDocs.length, 'keyPairDocs must not be empty');
114114

115-
await blockchainService.waitBlockchainReady();
116-
117115
const {payload, dids} = await generateSignedPayloadFromList(keyPairDocs, {
118116
limit,
119117
});

packages/relay-service/tests/didcomm.test.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@ const mockDIDResolver = {
2626
};
2727

2828
blockchainService.createDIDResolver = () => mockDIDResolver;
29-
blockchainService.resolver = mockDIDResolver;
29+
blockchainService._resolver = mockDIDResolver;
3030

3131
describe('DIDComm', () => {
3232
it('expect to decrypt didcomm message', async () => {
33-
blockchainService.resolver = mockDIDResolver;
33+
blockchainService._resolver = mockDIDResolver;
3434

3535
const keyAgreementKey = await getDerivedAgreementKey(ALICE_KEY_PAIR_DOC);
3636

packages/wasm/src/services/blockchain/service.ts

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,11 @@ export class BlockchainService {
6060
cheqdApi;
6161
cheqdApiUrl;
6262
isBlockchainReady = false;
63-
resolver: any;
63+
private _resolver: any;
64+
65+
get resolver(): any {
66+
return this._resolver;
67+
}
6468
/**
6569
* Event names emitted by the blockchain service
6670
* @static
@@ -93,7 +97,8 @@ export class BlockchainService {
9397
this.cheqdModules = new CheqdCoreModules(this.cheqdApi);
9498
this.modules = new MultiApiCoreModules([this.cheqdModules]);
9599
this.emitter = new EventEmitter();
96-
this.resolver = this.createDIDResolver();
100+
// Blockchain is not ready yet, but we can use fallback resolvers
101+
this._resolver = this.createDIDResolver();
97102
}
98103

99104
/**
@@ -161,12 +166,21 @@ export class BlockchainService {
161166
* @private
162167
* @returns {CachedDIDResolver} Cached DID resolver instance
163168
*/
164-
createDIDResolver() {
165-
const router = new AnyDIDResolver([
166-
new DIDKeyResolver(),
167-
new CoreResolver(this.modules),
169+
createDIDResolver(isBlockchainReady: boolean) {
170+
let resolvers = [
168171
new UniversalResolver(universalResolverUrl),
169-
]);
172+
new DIDKeyResolver(),
173+
]
174+
175+
// Add blockchain resolvers if the blockchain is ready
176+
if (isBlockchainReady) {
177+
resolvers = [
178+
new CoreResolver(this.modules),
179+
...resolvers
180+
]
181+
}
182+
183+
const router = new AnyDIDResolver(resolvers);
170184

171185
return new CachedDIDResolver(router);
172186
}
@@ -226,7 +240,8 @@ export class BlockchainService {
226240
}
227241

228242

229-
this.resolver = this.createDIDResolver();
243+
// Re-create the resolver with the new blockchain connection
244+
this._resolver = this.createDIDResolver(true);
230245

231246
if (
232247
process.env.NODE_ENV !== 'test' ||

0 commit comments

Comments
 (0)