Skip to content

Commit dbcd8c4

Browse files
authored
fix: did sov service type resolving (#689)
Signed-off-by: James Ebert <jamesebert.k@gmail.com>
1 parent e1528b9 commit dbcd8c4

4 files changed

Lines changed: 54 additions & 20 deletions

File tree

packages/core/src/modules/dids/__tests__/__fixtures__/didSovR1xKJw17sUoXhejEpugMYJ.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,15 @@
3232
"type": "endpoint",
3333
"serviceEndpoint": "https://ssi.com"
3434
},
35+
{
36+
"accept": ["didcomm/aip2;env=rfc19"],
37+
"id": "did:sov:R1xKJw17sUoXhejEpugMYJ#did-communication",
38+
"priority": 0,
39+
"recipientKeys": ["did:sov:R1xKJw17sUoXhejEpugMYJ#key-agreement-1"],
40+
"routingKeys": [],
41+
"serviceEndpoint": "https://ssi.com",
42+
"type": "did-communication"
43+
},
3544
{
3645
"id": "did:sov:R1xKJw17sUoXhejEpugMYJ#profile",
3746
"serviceEndpoint": "https://profile.com",

packages/core/src/modules/dids/methods/indy/IndyDidResolver.ts renamed to packages/core/src/modules/dids/methods/sov/SovDidResolver.ts

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { DidDocumentBuilder } from '../../domain/DidDocumentBuilder'
1111
import { DidCommService } from '../../domain/service/DidCommService'
1212
import { DidCommV2Service } from '../../domain/service/DidCommV2Service'
1313

14-
export class IndyDidResolver implements DidResolver {
14+
export class SovDidResolver implements DidResolver {
1515
private indyLedgerService: IndyLedgerService
1616

1717
public constructor(indyLedgerService: IndyLedgerService) {
@@ -73,6 +73,27 @@ export class IndyDidResolver implements DidResolver {
7373
}
7474
}
7575

76+
// Process Indy Attrib Endpoint Types according to: https://sovrin-foundation.github.io/sovrin/spec/did-method-spec-template.html > Read (Resolve) > DID Service Endpoint
77+
private processEndpointTypes(types?: string[]) {
78+
const expectedTypes = ['endpoint', 'did-communication', 'DIDComm']
79+
const defaultTypes = ['endpoint', 'did-communication']
80+
81+
// Return default types if types "is NOT present [or] empty"
82+
if (!types || types?.length <= 0) {
83+
return defaultTypes
84+
}
85+
86+
// Return default types if types "contain any other values"
87+
for (const type of types) {
88+
if (!expectedTypes.includes(type)) {
89+
return defaultTypes
90+
}
91+
}
92+
93+
// Return provided types
94+
return types
95+
}
96+
7697
private addServices(
7798
builder: DidDocumentBuilder,
7899
parsed: ParsedDid,
@@ -81,18 +102,22 @@ export class IndyDidResolver implements DidResolver {
81102
) {
82103
const { endpoint, routingKeys, types, ...otherEndpoints } = endpoints
83104

84-
// If 'endpoint' type add id to the services array
85105
if (endpoint) {
86-
builder.addService(
87-
new DidDocumentService({
88-
id: `${parsed.did}#endpoint`,
89-
serviceEndpoint: endpoint,
90-
type: 'endpoint',
91-
})
92-
)
106+
const processedTypes = this.processEndpointTypes(types)
107+
108+
// If 'endpoint' included in types, add id to the services array
109+
if (processedTypes.includes('endpoint')) {
110+
builder.addService(
111+
new DidDocumentService({
112+
id: `${parsed.did}#endpoint`,
113+
serviceEndpoint: endpoint,
114+
type: 'endpoint',
115+
})
116+
)
117+
}
93118

94119
// If 'did-communication' included in types, add DIDComm v1 entry
95-
if (types?.includes('did-communication')) {
120+
if (processedTypes.includes('did-communication')) {
96121
builder.addService(
97122
new DidCommService({
98123
id: `${parsed.did}#did-communication`,
@@ -105,7 +130,7 @@ export class IndyDidResolver implements DidResolver {
105130
)
106131

107132
// If 'DIDComm' included in types, add DIDComm v2 entry
108-
if (types?.includes('DIDComm')) {
133+
if (processedTypes.includes('DIDComm')) {
109134
builder
110135
.addService(
111136
new DidCommV2Service({

packages/core/src/modules/dids/methods/indy/__tests__/IndyDidResolver.test.ts renamed to packages/core/src/modules/dids/methods/sov/__tests__/SovDidResolver.test.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,19 @@ import { IndyLedgerService } from '../../../../ledger/services/IndyLedgerService
77
import didSovR1xKJw17sUoXhejEpugMYJFixture from '../../../__tests__/__fixtures__/didSovR1xKJw17sUoXhejEpugMYJ.json'
88
import didSovWJz9mHyW9BZksioQnRsrAoFixture from '../../../__tests__/__fixtures__/didSovWJz9mHyW9BZksioQnRsrAo.json'
99
import { parseDid } from '../../../domain/parse'
10-
import { IndyDidResolver } from '../IndyDidResolver'
10+
import { SovDidResolver } from '../SovDidResolver'
1111

1212
jest.mock('../../../../ledger/services/IndyLedgerService')
1313
const IndyLedgerServiceMock = IndyLedgerService as jest.Mock<IndyLedgerService>
1414

1515
describe('DidResolver', () => {
16-
describe('IndyDidResolver', () => {
16+
describe('SovDidResolver', () => {
1717
let ledgerService: IndyLedgerService
18-
let indyDidResolver: IndyDidResolver
18+
let sovDidResolver: SovDidResolver
1919

2020
beforeEach(() => {
2121
ledgerService = new IndyLedgerServiceMock()
22-
indyDidResolver = new IndyDidResolver(ledgerService)
22+
sovDidResolver = new SovDidResolver(ledgerService)
2323
})
2424

2525
it('should correctly resolve a did:sov document', async () => {
@@ -40,7 +40,7 @@ describe('DidResolver', () => {
4040
mockFunction(ledgerService.getPublicDid).mockResolvedValue(nymResponse)
4141
mockFunction(ledgerService.getEndpointsForDid).mockResolvedValue(endpoints)
4242

43-
const result = await indyDidResolver.resolve(did, parseDid(did))
43+
const result = await sovDidResolver.resolve(did, parseDid(did))
4444

4545
expect(JsonTransformer.toJSON(result)).toMatchObject({
4646
didDocument: didSovR1xKJw17sUoXhejEpugMYJFixture,
@@ -69,7 +69,7 @@ describe('DidResolver', () => {
6969
mockFunction(ledgerService.getPublicDid).mockReturnValue(Promise.resolve(nymResponse))
7070
mockFunction(ledgerService.getEndpointsForDid).mockReturnValue(Promise.resolve(endpoints))
7171

72-
const result = await indyDidResolver.resolve(did, parseDid(did))
72+
const result = await sovDidResolver.resolve(did, parseDid(did))
7373

7474
expect(JsonTransformer.toJSON(result)).toMatchObject({
7575
didDocument: didSovWJz9mHyW9BZksioQnRsrAoFixture,
@@ -85,7 +85,7 @@ describe('DidResolver', () => {
8585

8686
mockFunction(ledgerService.getPublicDid).mockRejectedValue(new Error('Error retrieving did'))
8787

88-
const result = await indyDidResolver.resolve(did, parseDid(did))
88+
const result = await sovDidResolver.resolve(did, parseDid(did))
8989

9090
expect(result).toMatchObject({
9191
didDocument: null,

packages/core/src/modules/dids/services/DidResolverService.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ import { Lifecycle, scoped } from 'tsyringe'
77
import { AgentConfig } from '../../../agent/AgentConfig'
88
import { IndyLedgerService } from '../../ledger'
99
import { parseDid } from '../domain/parse'
10-
import { IndyDidResolver } from '../methods/indy/IndyDidResolver'
1110
import { KeyDidResolver } from '../methods/key/KeyDidResolver'
1211
import { PeerDidResolver } from '../methods/peer/PeerDidResolver'
12+
import { SovDidResolver } from '../methods/sov/SovDidResolver'
1313
import { WebDidResolver } from '../methods/web/WebDidResolver'
1414
import { DidRepository } from '../repository'
1515

@@ -22,7 +22,7 @@ export class DidResolverService {
2222
this.logger = agentConfig.logger
2323

2424
this.resolvers = [
25-
new IndyDidResolver(indyLedgerService),
25+
new SovDidResolver(indyLedgerService),
2626
new WebDidResolver(),
2727
new KeyDidResolver(),
2828
new PeerDidResolver(didRepository),

0 commit comments

Comments
 (0)