Skip to content

Commit ed2dbcd

Browse files
authored
feat(webvh): centralize metadata keys and improve update key lookup (#2798)
Signed-off-by: andres vallecilla <andresfelipe083195@hotmail.com>
1 parent ae13b3a commit ed2dbcd

4 files changed

Lines changed: 38 additions & 11 deletions

File tree

packages/webvh/src/dids/WebVhDidRegistrar.ts

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,20 @@ import type {
1111
VerificationMethod,
1212
} from '@credo-ts/core'
1313

14-
import { DidDocument, DidDocumentRole, DidRecord, DidRepository, JsonTransformer, Kms } from '@credo-ts/core'
14+
import {
15+
DidDocument,
16+
DidDocumentRole,
17+
DidRecord,
18+
DidRepository,
19+
getKmsKeyIdForVerifiacationMethod,
20+
JsonTransformer,
21+
Kms,
22+
} from '@credo-ts/core'
1523
import { createDID, type DIDLog, MultibaseEncoding, multibaseEncode, updateDID } from 'didwebvh-ts'
1624

1725
import { WebVhDidCrypto } from './WebVhDidCrypto'
1826
import { WebVhDidCryptoSigner } from './WebVhDidCryptoSigner'
27+
import { WebVhDidRecordMetadataKeys } from './webVhDidRecordMetadataTypes'
1928

2029
interface WebVhDidCreateOptions extends DidCreateOptions {
2130
domain: string
@@ -98,7 +107,7 @@ export class WebVhDidRegistrar implements DidRegistrar {
98107
role: DidDocumentRole.Created,
99108
keys,
100109
})
101-
didRecord.metadata.set('log', log)
110+
didRecord.metadata.set(WebVhDidRecordMetadataKeys.DidLog, log)
102111
didRecord.setTags({ domain: domainKey })
103112
await didRepository.save(agentContext, didRecord)
104113

@@ -134,9 +143,13 @@ export class WebVhDidRegistrar implements DidRegistrar {
134143
})
135144
if (!didRecord) return this.handleError('DID not found')
136145

137-
const log = didRecord.metadata.get('log') as DIDLog
146+
const log = didRecord.metadata.get(WebVhDidRecordMetadataKeys.DidLog) as DIDLog
138147
const domain = didRecord.getTag('domain') as string
139-
const keyId = didRecord.keys?.[0].kmsKeyId
148+
const activeUpdateKey = log[log.length - 1]?.parameters?.updateKeys?.[0] ?? log[0]?.parameters?.updateKeys?.[0]
149+
const vm = didRecord.didDocument?.verificationMethod?.find((v) => v.publicKeyMultibase === activeUpdateKey)
150+
let keyId = vm ? getKmsKeyIdForVerifiacationMethod(vm, didRecord.keys) : undefined
151+
if (!keyId && activeUpdateKey)
152+
keyId = didRecord.metadata.get(WebVhDidRecordMetadataKeys.UpdateKeyKmsKeyIds)?.[activeUpdateKey]
140153

141154
if (!log) return this.handleError('The log registry must be created before it can be edited.')
142155
if (!keyId) return this.handleError('The key ID must be present before the log can be edited.')
@@ -174,7 +187,7 @@ export class WebVhDidRegistrar implements DidRegistrar {
174187
keyAgreement: normalizeMethodArray(keyAgreement),
175188
services,
176189
})
177-
didRecord.metadata.set('log', logResult)
190+
didRecord.metadata.set(WebVhDidRecordMetadataKeys.DidLog, logResult)
178191
didRecord.didDocument = JsonTransformer.fromJSON(doc, DidDocument)
179192
await didRepository.update(agentContext, didRecord)
180193

packages/webvh/src/dids/__tests__/WebVhDidRegistrar.boundary.test.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import type { WebVhDidLog, WebVhDidLogEntry } from '../../resources'
3131
import { parseResourceId } from '../../resources'
3232
import { WebVhDidCrypto } from '../WebVhDidCrypto'
3333
import { WebVhDidRegistrar } from '../WebVhDidRegistrar'
34+
import { WebVhDidRecordMetadataKeys } from '../webVhDidRecordMetadataTypes'
3435

3536
// didwebvh-ts calls fetchWitnessProofs during resolve/update. In this offline unit-test
3637
// environment those HTTP requests fail (ENOTFOUND) and generate stderr noise even when
@@ -77,7 +78,7 @@ describe('WebVhDidRegistrar boundary contracts', () => {
7778
const record = await repository.findSingleByQuery(agentContext, { did })
7879
expect(record).toBeDefined()
7980

80-
const log = record?.metadata.get('log') as WebVhDidLog
81+
const log = record?.metadata.get(WebVhDidRecordMetadataKeys.DidLog) as WebVhDidLog
8182
expect(Array.isArray(log)).toBe(true)
8283
expect(log).toHaveLength(1)
8384

@@ -98,7 +99,7 @@ describe('WebVhDidRegistrar boundary contracts', () => {
9899
const did = result.didState.did
99100
if (!did) throw new Error('create failed')
100101
const record = await repository.findSingleByQuery(agentContext, { did })
101-
const log = record?.metadata.get('log') as WebVhDidLog
102+
const log = record?.metadata.get(WebVhDidRecordMetadataKeys.DidLog) as WebVhDidLog
102103

103104
expect(Array.isArray(log[0].parameters.updateKeys)).toBe(true)
104105
expect(log[0].parameters.updateKeys?.length).toBeGreaterThan(0)
@@ -119,7 +120,7 @@ describe('WebVhDidRegistrar boundary contracts', () => {
119120
expect(updateResult.didState.state).toBe('finished')
120121

121122
const record = await repository.findSingleByQuery(agentContext, { did })
122-
const log = record?.metadata.get('log') as WebVhDidLog
123+
const log = record?.metadata.get(WebVhDidRecordMetadataKeys.DidLog) as WebVhDidLog
123124

124125
expect(log).toHaveLength(2)
125126
})
@@ -135,7 +136,7 @@ describe('WebVhDidRegistrar boundary contracts', () => {
135136
await registrar.update(agentContext, { did, didDocument })
136137

137138
const record = await repository.findSingleByQuery(agentContext, { did })
138-
const log = record?.metadata.get('log') as WebVhDidLog
139+
const log = record?.metadata.get(WebVhDidRecordMetadataKeys.DidLog) as WebVhDidLog
139140

140141
const indices = log.map((e) => parseInt(e.versionId.split('-')[0], 10))
141142
for (let i = 1; i < indices.length; i++) {
@@ -152,7 +153,7 @@ describe('WebVhDidRegistrar boundary contracts', () => {
152153
if (!did) throw new Error('create failed')
153154

154155
const record = await repository.findSingleByQuery(agentContext, { did })
155-
const log = record?.metadata.get('log') as WebVhDidLog
156+
const log = record?.metadata.get(WebVhDidRecordMetadataKeys.DidLog) as WebVhDidLog
156157

157158
// Delegate directly to the upstream library — no Credo resolver involved.
158159
const verifier = new WebVhDidCrypto(agentContext)
@@ -176,7 +177,7 @@ describe('WebVhDidRegistrar boundary contracts', () => {
176177
expect(updateResult.didState.state).toBe('finished')
177178

178179
const record = await repository.findSingleByQuery(agentContext, { did })
179-
const log = record?.metadata.get('log') as WebVhDidLog
180+
const log = record?.metadata.get(WebVhDidRecordMetadataKeys.DidLog) as WebVhDidLog
180181

181182
const verifier = new WebVhDidCrypto(agentContext)
182183
const resolved = await resolveDIDFromLog(log, { verifier })

packages/webvh/src/dids/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ export { WebVhDidCrypto } from './WebVhDidCrypto'
22
export { WebVhDidCryptoSigner } from './WebVhDidCryptoSigner'
33
export { WebVhDidRegistrar } from './WebVhDidRegistrar'
44
export { WebVhDidResolver } from './WebVhDidResolver'
5+
export { type WebVhDidRecordMetadata, WebVhDidRecordMetadataKeys } from './webVhDidRecordMetadataTypes'
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import type { WebVhDidLog } from '../resources'
2+
3+
export enum WebVhDidRecordMetadataKeys {
4+
// FIXME: refactor to '_internal/webvhDidLog' in next major release
5+
DidLog = 'log',
6+
UpdateKeyKmsKeyIds = '_internal/webvhUpdateKeyKmsKeyIds',
7+
}
8+
9+
export type WebVhDidRecordMetadata = {
10+
[WebVhDidRecordMetadataKeys.DidLog]: WebVhDidLog
11+
[WebVhDidRecordMetadataKeys.UpdateKeyKmsKeyIds]: Record<string, string>
12+
}

0 commit comments

Comments
 (0)