Skip to content

Commit

Permalink
feat: add did:webvh as a DID resolver
Browse files Browse the repository at this point in the history
  • Loading branch information
brianorwhatever committed Feb 11, 2025
1 parent bea846b commit 8bed54d
Show file tree
Hide file tree
Showing 6 changed files with 241 additions and 5 deletions.
11 changes: 6 additions & 5 deletions packages/core/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@
"prepublishOnly": "pnpm run build"
},
"dependencies": {
"@animo-id/mdoc": "0.3.0",
"@animo-id/pex": "4.1.1-alpha.0",
"@astronautlabs/jsonpath": "^1.1.2",
"@digitalcredentials/jsonld": "^6.0.0",
"@digitalcredentials/jsonld-signatures": "^9.4.0",
"@digitalcredentials/vc": "^6.0.1",
Expand All @@ -35,14 +38,12 @@
"@peculiar/asn1-schema": "^2.3.13",
"@peculiar/asn1-x509": "^2.3.13",
"@peculiar/x509": "^1.12.1",
"@animo-id/mdoc": "0.3.0",
"@sd-jwt/core": "^0.7.2",
"@sd-jwt/decode": "^0.7.2",
"@sd-jwt/jwt-status-list": "^0.7.2",
"@sd-jwt/sd-jwt-vc": "^0.7.2",
"@sd-jwt/types": "^0.7.2",
"@sd-jwt/utils": "^0.7.2",
"@animo-id/pex": "4.1.1-alpha.0",
"@sphereon/pex-models": "^2.3.1",
"@sphereon/ssi-types": "0.30.2-next.135",
"@stablelib/ed25519": "^1.0.2",
Expand All @@ -53,7 +54,7 @@
"class-transformer": "0.5.1",
"class-validator": "0.14.1",
"did-resolver": "^4.1.0",
"@astronautlabs/jsonpath": "^1.1.2",
"didwebvh-ts": "^1.0.3",
"lru_map": "^0.4.1",
"make-error": "^1.3.6",
"object-inspect": "^1.10.3",
Expand All @@ -70,9 +71,9 @@
"@types/object-inspect": "^1.8.0",
"@types/uuid": "^9.0.1",
"@types/varint": "^6.0.0",
"nock": "^14.0.0-beta.19",
"rimraf": "^4.4.0",
"tslog": "^4.8.2",
"typescript": "~5.5.2",
"nock": "^14.0.0-beta.19"
"typescript": "~5.5.2"
}
}
94 changes: 94 additions & 0 deletions packages/core/src/modules/dids/__tests__/webvh-did.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
import type { AgentContext } from '../../../agent'
import type { Wallet } from '../../../wallet'

import { Subject } from 'rxjs'
import { webcrypto } from 'node:crypto'

import { InMemoryStorageService } from '../../../../../../tests/InMemoryStorageService'
import { InMemoryWallet } from '../../../../../../tests/InMemoryWallet'
import { getAgentConfig, getAgentContext } from '../../../../tests/helpers'
import { EventEmitter } from '../../../agent/EventEmitter'
import { InjectionSymbols } from '../../../constants'
import { CacheModuleConfig } from '../../../modules/cache/CacheModuleConfig'
import { InMemoryLruCache } from '../../cache/InMemoryLruCache'
import { DidsModuleConfig } from '../DidsModuleConfig'
import { DidDocument } from '../domain'
import { DidDocumentRole } from '../domain/DidDocumentRole'
import { WebVHDidResolver } from '../methods'
import { DidRecord, DidRepository } from '../repository'
import { DidResolverService } from '../services'

// Set up crypto for noble-ed25519
;(globalThis as any).crypto = webcrypto

describe('webvh dids', () => {
const config = getAgentConfig('WebVH DIDs Lifecycle')

let didRepository: DidRepository
let didResolverService: DidResolverService
let wallet: Wallet
let agentContext: AgentContext
let eventEmitter: EventEmitter

beforeEach(async () => {
wallet = new InMemoryWallet()
const storageService = new InMemoryStorageService<DidRecord>()
eventEmitter = new EventEmitter(config.agentDependencies, new Subject())
didRepository = new DidRepository(storageService, eventEmitter)

const cacheModuleConfig = new CacheModuleConfig({
cache: new InMemoryLruCache({ limit: 1 }),
})

agentContext = getAgentContext({
wallet,
registerInstances: [
[DidRepository, didRepository],
[InjectionSymbols.StorageService, storageService],
[CacheModuleConfig, cacheModuleConfig],
],
})
await wallet.createAndOpen(config.walletConfig)

didResolverService = new DidResolverService(
config.logger,
new DidsModuleConfig({ resolvers: [new WebVHDidResolver()] }),
didRepository
)
})

afterEach(async () => {
await wallet.delete()
})

test('resolve a webvh did document', async () => {
const did =
'did:webvh:QmPEQVM1JPTyrvEgBcDXwjK4TeyLGSX1PxjgyeAisdWM1p:gist.githubusercontent.com:brianorwhatever:9c4633d18eb644f7a47f93a802691626:raw'

const { didDocument: resolvedDidDocument } = await didResolverService.resolve(agentContext, did)

expect(resolvedDidDocument).toBeInstanceOf(DidDocument)
})

test('receive a webvh did and did document', async () => {
const did =
'did:webvh:QmPEQVM1JPTyrvEgBcDXwjK4TeyLGSX1PxjgyeAisdWM1p:gist.githubusercontent.com:brianorwhatever:9c4633d18eb644f7a47f93a802691626:raw'
const didDocument = new DidDocument({
id: did,
service: [],
verificationMethod: [],
})

const didDocumentRecord = new DidRecord({
did: did,
role: DidDocumentRole.Received,
didDocument: didDocument,
})

await didRepository.save(agentContext, didDocumentRecord)

const { didDocument: resolvedDidDocument } = await didResolverService.resolve(agentContext, did)
expect(resolvedDidDocument).toBeInstanceOf(DidDocument)
expect(resolvedDidDocument?.id).toBe(did)
})
})
1 change: 1 addition & 0 deletions packages/core/src/modules/dids/methods/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@ export * from './key'
export * from './peer'
export * from './web'
export * from './jwk'
export * from './webvh'
38 changes: 38 additions & 0 deletions packages/core/src/modules/dids/methods/webvh/WebVHDidResolver.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import type { AgentContext } from '../../../../agent'
import type { DidResolver } from '../../domain/DidResolver'
import type { DidResolutionResult } from '../../types'

import { resolveDID } from 'didwebvh-ts'

import { JsonTransformer } from '../../../../utils/JsonTransformer'
import { DidDocument } from '../../domain'

export class WebVHDidResolver implements DidResolver {
public readonly supportedMethods = ['webvh']

public readonly allowsCaching = true
public readonly allowsLocalDidRecord = true

// FIXME: Would be nice if we don't have to provide a did resolver instance
// private _resolverInstance = new Resolver()
// private resolver = didWeb.getResolver()

public async resolve(agentContext: AgentContext, did: string): Promise<DidResolutionResult> {
const result = await resolveDID(did)

let didDocument = null

if (result.doc) {
didDocument = JsonTransformer.fromJSON(result.doc, DidDocument)
}

return {
didDocument,
didResolutionMetadata: {
servedFromCache: false,
servedFromDidRecord: false,
},
didDocumentMetadata: result.meta,
}
}
}
1 change: 1 addition & 0 deletions packages/core/src/modules/dids/methods/webvh/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './WebVHDidResolver'
Loading

0 comments on commit 8bed54d

Please sign in to comment.