diff --git a/integration-tests/did-resolution.test.ts b/integration-tests/did-resolution.test.ts index c366adef..2166bb8d 100644 --- a/integration-tests/did-resolution.test.ts +++ b/integration-tests/did-resolution.test.ts @@ -1,20 +1,12 @@ import {blockchainService} from '@docknetwork/wallet-sdk-wasm/src/services/blockchain'; -import {issueCredential} from './helpers/certs-helpers'; import { getWallet, getDIDProvider, - getMessageProvider, closeWallet, } from './helpers/wallet-helpers'; -import {logger} from '@docknetwork/wallet-sdk-data-store/src/logger'; import { storageService } from '@docknetwork/wallet-sdk-wasm/src/services/storage'; describe('DID resolution', () => { - let wallet; - - beforeAll(async () => { - wallet = await getWallet(); - }); it('should resolve did service endpoints', async () => { const wallet = await getWallet(); @@ -34,7 +26,24 @@ describe('DID resolution', () => { const cachedEntry = JSON.parse(cacheJSON); expect(cachedEntry.value).toEqual(doc1); expect(cachedEntry.id).toEqual('did:cheqd:testnet:c0890f1c-c7bb-4ea6-be7a-8c31404743b7'); + + closeWallet(wallet) }); - afterAll(() => closeWallet(wallet)); + it('should resolve DID without active blockchain connection (fallback resolver)', async () => { + const doc1 = await blockchainService.resolveDID( + 'did:cheqd:testnet:c0890f1c-c7bb-4ea6-be7a-8c31404743b7', + ); + + const messagingService = doc1.service.find(service => service.type === 'DIDCommMessaging'); + expect(messagingService).toBeDefined(); + + const cacheKey = `did-cache:did:cheqd:testnet:c0890f1c-c7bb-4ea6-be7a-8c31404743b7`; + const cacheJSON = await storageService.getItem(cacheKey); + expect(cacheJSON).toBeDefined(); + + const cachedEntry = JSON.parse(cacheJSON); + expect(cachedEntry.value).toEqual(doc1); + expect(cachedEntry.id).toEqual('did:cheqd:testnet:c0890f1c-c7bb-4ea6-be7a-8c31404743b7'); + }); }); diff --git a/packages/relay-service/src/index.js b/packages/relay-service/src/index.js index d2b67882..1141e00c 100644 --- a/packages/relay-service/src/index.js +++ b/packages/relay-service/src/index.js @@ -112,8 +112,6 @@ const getMessages = async ({ assert(Array.isArray(keyPairDocs), 'keyPairDocs must be an array'); assert(!!keyPairDocs.length, 'keyPairDocs must not be empty'); - await blockchainService.waitBlockchainReady(); - const {payload, dids} = await generateSignedPayloadFromList(keyPairDocs, { limit, }); diff --git a/packages/relay-service/tests/didcomm.test.js b/packages/relay-service/tests/didcomm.test.js index 0dfc04ea..d0527adf 100644 --- a/packages/relay-service/tests/didcomm.test.js +++ b/packages/relay-service/tests/didcomm.test.js @@ -26,11 +26,11 @@ const mockDIDResolver = { }; blockchainService.createDIDResolver = () => mockDIDResolver; -blockchainService.resolver = mockDIDResolver; +blockchainService._resolver = mockDIDResolver; describe('DIDComm', () => { it('expect to decrypt didcomm message', async () => { - blockchainService.resolver = mockDIDResolver; + blockchainService._resolver = mockDIDResolver; const keyAgreementKey = await getDerivedAgreementKey(ALICE_KEY_PAIR_DOC); diff --git a/packages/wasm/src/services/blockchain/service.ts b/packages/wasm/src/services/blockchain/service.ts index 336f9a77..0fb36340 100644 --- a/packages/wasm/src/services/blockchain/service.ts +++ b/packages/wasm/src/services/blockchain/service.ts @@ -60,7 +60,11 @@ export class BlockchainService { cheqdApi; cheqdApiUrl; isBlockchainReady = false; - resolver: any; + private _resolver: any; + + get resolver(): any { + return this._resolver; + } /** * Event names emitted by the blockchain service * @static @@ -93,7 +97,8 @@ export class BlockchainService { this.cheqdModules = new CheqdCoreModules(this.cheqdApi); this.modules = new MultiApiCoreModules([this.cheqdModules]); this.emitter = new EventEmitter(); - this.resolver = this.createDIDResolver(); + // Blockchain is not ready yet, but we can use fallback resolvers + this._resolver = this.createDIDResolver(); } /** @@ -161,12 +166,21 @@ export class BlockchainService { * @private * @returns {CachedDIDResolver} Cached DID resolver instance */ - createDIDResolver() { - const router = new AnyDIDResolver([ - new DIDKeyResolver(), - new CoreResolver(this.modules), + createDIDResolver(isBlockchainReady: boolean) { + let resolvers = [ new UniversalResolver(universalResolverUrl), - ]); + new DIDKeyResolver(), + ] + + // Add blockchain resolvers if the blockchain is ready + if (isBlockchainReady) { + resolvers = [ + new CoreResolver(this.modules), + ...resolvers + ] + } + + const router = new AnyDIDResolver(resolvers); return new CachedDIDResolver(router); } @@ -226,7 +240,8 @@ export class BlockchainService { } - this.resolver = this.createDIDResolver(); + // Re-create the resolver with the new blockchain connection + this._resolver = this.createDIDResolver(true); if ( process.env.NODE_ENV !== 'test' ||