From 8c8ff87863ff0cd6a639db8daf2e43688e0c6643 Mon Sep 17 00:00:00 2001 From: Maycon Date: Fri, 28 Nov 2025 10:39:09 -0300 Subject: [PATCH 1/4] DID resolution withtou blockchain connection --- integration-tests/did-resolution.test.ts | 27 ++++++++++++------- packages/relay-service/src/index.js | 2 -- .../wasm/src/services/blockchain/service.ts | 19 ++++++++++--- 3 files changed, 33 insertions(+), 15 deletions(-) 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/wasm/src/services/blockchain/service.ts b/packages/wasm/src/services/blockchain/service.ts index 336f9a77..8001778e 100644 --- a/packages/wasm/src/services/blockchain/service.ts +++ b/packages/wasm/src/services/blockchain/service.ts @@ -93,6 +93,7 @@ export class BlockchainService { this.cheqdModules = new CheqdCoreModules(this.cheqdApi); this.modules = new MultiApiCoreModules([this.cheqdModules]); this.emitter = new EventEmitter(); + // Blockchain is not ready yet, but we can use fallback resolvers this.resolver = this.createDIDResolver(); } @@ -162,11 +163,20 @@ export class BlockchainService { * @returns {CachedDIDResolver} Cached DID resolver instance */ createDIDResolver() { - const router = new AnyDIDResolver([ - new DIDKeyResolver(), - new CoreResolver(this.modules), + let resolvers = [ new UniversalResolver(universalResolverUrl), - ]); + ] + + // Add blockchain resolvers if the blockchain is ready + if (this.isBlockchainReady) { + resolvers = [ + new DIDKeyResolver(), + new CoreResolver(this.modules), + ...resolvers + ] + } + + const router = new AnyDIDResolver(resolvers); return new CachedDIDResolver(router); } @@ -226,6 +236,7 @@ export class BlockchainService { } + // Re-create the resolver with the new blockchain connection this.resolver = this.createDIDResolver(); if ( From 32f6a2a7e6f2a62dcbe59372fe9d5d2d983f7268 Mon Sep 17 00:00:00 2001 From: Maycon Date: Fri, 28 Nov 2025 10:52:10 -0300 Subject: [PATCH 2/4] DID resolution with no blockchain connection --- packages/wasm/src/services/blockchain/service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/wasm/src/services/blockchain/service.ts b/packages/wasm/src/services/blockchain/service.ts index 8001778e..1d20d001 100644 --- a/packages/wasm/src/services/blockchain/service.ts +++ b/packages/wasm/src/services/blockchain/service.ts @@ -165,12 +165,12 @@ export class BlockchainService { createDIDResolver() { let resolvers = [ new UniversalResolver(universalResolverUrl), + new DIDKeyResolver(), ] // Add blockchain resolvers if the blockchain is ready if (this.isBlockchainReady) { resolvers = [ - new DIDKeyResolver(), new CoreResolver(this.modules), ...resolvers ] From e12a761529369eae1804fef7edd7bc4a8f8c9a9f Mon Sep 17 00:00:00 2001 From: Maycon Date: Fri, 28 Nov 2025 13:48:23 -0300 Subject: [PATCH 3/4] fixing issues with blockchain ready flag --- packages/wasm/src/services/blockchain/service.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/wasm/src/services/blockchain/service.ts b/packages/wasm/src/services/blockchain/service.ts index 1d20d001..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 @@ -94,7 +98,7 @@ export class BlockchainService { this.modules = new MultiApiCoreModules([this.cheqdModules]); this.emitter = new EventEmitter(); // Blockchain is not ready yet, but we can use fallback resolvers - this.resolver = this.createDIDResolver(); + this._resolver = this.createDIDResolver(); } /** @@ -162,14 +166,14 @@ export class BlockchainService { * @private * @returns {CachedDIDResolver} Cached DID resolver instance */ - createDIDResolver() { + createDIDResolver(isBlockchainReady: boolean) { let resolvers = [ new UniversalResolver(universalResolverUrl), new DIDKeyResolver(), ] // Add blockchain resolvers if the blockchain is ready - if (this.isBlockchainReady) { + if (isBlockchainReady) { resolvers = [ new CoreResolver(this.modules), ...resolvers @@ -237,7 +241,7 @@ export class BlockchainService { // Re-create the resolver with the new blockchain connection - this.resolver = this.createDIDResolver(); + this._resolver = this.createDIDResolver(true); if ( process.env.NODE_ENV !== 'test' || From 293aede952f889eac228c4663c4752a6c2ed8d7e Mon Sep 17 00:00:00 2001 From: Maycon Date: Fri, 28 Nov 2025 14:13:21 -0300 Subject: [PATCH 4/4] fixing tests --- packages/relay-service/tests/didcomm.test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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);