# DWN Relay Notes
## Config
```json=
{
"handlers": [
{
"filter": {
"method": "CollectionsWrite",
"schema": "CredentialApplication"
},
"endpoint": {
"method": "POST",
"url": "http://localhost:5070/v1/manifests/applications"
},
"expectedResponse": {
201: { "method": "CollectionsWrite", "schema": "CredentialResponse" }
}
},
{
"filter": {
"method": "CollectionsWrite",
"schema": "DIDCreation"
},
"endpoint": {
"method": "POST",
"url": "http://localhost:5070/v1/dwn"
}
},
]
}
```
## Message sent from Wallet -> DWN Relay
```json=
{
"descriptor": {
"target": "did:example:alice",
"recipient": "did:example:alice",
"method": "CollectionsWrite",
"protocol": "6f06bc3c-55ed-4c9f-bccf-1b4345363473",
"contextId": "1",
"schema": "CredentialApplication",
"recordId": "aa36ec55-c59b-4f20-8143-10f74aac696d",
"nonce": "AXwHbetCnCCy8Q1ZSWE5X9yH1RKZ5ZXO",
"dataCid": "bafybeihuzogd3utvlrw7dr3rb4kgzu43vqhlorvpzex33prwyqb777si5e",
"dateCreated": 1663632617121,
"dataFormat": "application/json"
},
"authorization": {
"payload": "eyJkZXNjcmlwdG9yQ2lkIjoiYmFmeXJlaWVoaXVzZ214Y3Q0ejZieHg3emxsampyNzdybWdrNWlzbWZta3Rlcm1oeW5qMnp3aGkzczQifQ",
"signatures": [{
"protected": "eyJhbGciOiJFUzI1NksiLCJraWQiOiJkaWQ6ZXhhbXBsZTpib2Ija2V5MSJ9",
"signature": "MEUCIQC1EC1A95c9Rs-0-_11QnJ0cuedKEPwAgfmDRLK-jVUYgIgd5agGdjriekepYLe94IXvdkID4lEiSTxqDgnF7SV8bs"
}]
},
"encodedData": "eyAicmVxdWVzdGVyRGlkIjogImRpZDp1c2VyOjEyMyIsICJhcHBsaWNhdGlvbiI6IHsgImlkIjogIjliMWRlYjRkLTNiN2QtNGJhZC05YmRkLTJiMGQ3YjNkY2I2ZCIsICJzcGVjX3ZlcnNpb24iOiAiaHR0cHM6Ly9pZGVudGl0eS5mb3VuZGF0aW9uL2NyZWRlbnRpYWwtbWFuaWZlc3Qvc3BlYy92MS4wLjAvIiwgIm1hbmlmZXN0X2lkIjogIldBLURMLUNMQVNTLUEiLCAiZm9ybWF0IjogeyAibGRwX3ZjIjogeyAicHJvb2ZfdHlwZSI6IFsgIkpzb25XZWJTaWduYXR1cmUyMDIwIiwgIkVjZHNhU2VjcDI1NmsxU2lnbmF0dXJlMjAxOSIgXSB9IH0sICJwcmVzZW50YXRpb25fc3VibWlzc2lvbiI6IHsgImlkIjogImEzMGUzYjkxLWZiNzctNGQyMi05NWZhLTg3MTY4OWMzMjJlMiIsICJkZWZpbml0aW9uX2lkIjogIjMyZjU0MTYzLTcxNjYtNDhmMS05M2Q4LWZmMjE3YmRiMDY1MyIsICJkZXNjcmlwdG9yX21hcCI6IFt7ICJpZCI6ICJpZDEiLCAiZm9ybWF0IjogImp3dF92YyIsICJwYXRoIjogIiQudmVyaWZpYWJsZUNyZWRlbnRpYWxbMF0iIH1dIH0gfSB9"
}
```
## DWN Relay -> SSI Service
`PUT - {{baseUrl}}/v1/manifests/applications`
```json=
{
"data": {
"requesterDid": "did:user:123",
"application": {
"id": "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
"spec_version": "https://identity.foundation/credential-manifest/spec/v1.0.0/",
"manifest_id": "WA-DL-CLASS-A",
"format": {
"ldp_vc": {
"proof_type": [
"JsonWebSignature2020",
"EcdsaSecp256k1Signature2019"
]
}
},
"presentation_submission": {
"id": "a30e3b91-fb77-4d22-95fa-871689c322e2",
"definition_id": "32f54163-7166-48f1-93d8-ff217bdb0653",
"descriptor_map": [{
"id": "id1",
"format": "jwt_vc",
"path": "$.verifiableCredential[0]"
}]
}
}
},
"dwnMessage": <raw jank>
}
```
## Synchronous Response SSI Service -> DWN Relay
```json=
{
"response": {
"id": "536eda73-b89f-4aef-8235-292c7c03ae85",
"spec_version": "https://identity.foundation/credential-manifest/spec/v1.0.0/",
"manifest_id": "WA-DL-CLASS-A",
"application_id": "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
"fulfillment": {
"descriptor_map": [
{
"id": "id1",
"format": "jwt_vc",
"path": "$.verifiableCredential[0]"
}
]
}
},
"credentials": [
{
"@context": [
"https://www.w3.org/2018/credentials/v1"
],
"id": "a4a9e17b-b865-4cae-8085-ceb5584c18ea",
"type": [
"VerifiableCredential"
],
"issuer": "did:example:123?linked-domains=3",
"issuanceDate": "2022-09-23T20:15:18Z",
"credentialSubject": {
"id": "did:user:123"
}
}
]
}
```
## DWN Relay -> Wallet
### Expected Response Fromat from DWNs
```json=
{
"replies": [
{
"status": { "code": 200, "detail": "OK" },
"entries": []
}
]
}
```
- Where does `status.code` come from?
- downstream service's `response.status`
- Where does `status.detail` come from?
- Auto-generated by relay service based on `response.status`
- Where do the entries come from?
```json=
{
"descriptor": {
"target": "did:example:alice",
"recipient": "did:example:alice",
"method": "CollectionsWrite",
"protocol": "6f06bc3c-55ed-4c9f-bccf-1b4345363473",
"contextId": "bob email X",
"schema": "CredentialApplication",
"recordId": "aa36ec55-c59b-4f20-8143-10f74aac696d",
"nonce": "AXwHbetCnCCy8Q1ZSWE5X9yH1RKZ5ZXO",
"dataCid": "bafybeihuzogd3utvlrw7dr3rb4kgzu43vqhlorvpzex33prwyqb777si5e",
"dateCreated": 1663632617121,
"dataFormat": "application/json"
},
"authorization": {
"payload": "eyJkZXNjcmlwdG9yQ2lkIjoiYmFmeXJlaWVoaXVzZ214Y3Q0ejZieHg3emxsampyNzdybWdrNWlzbWZta3Rlcm1oeW5qMnp3aGkzczQifQ",
"signatures": [{
"protected": "eyJhbGciOiJFUzI1NksiLCJraWQiOiJkaWQ6ZXhhbXBsZTpib2Ija2V5MSJ9",
"signature": "MEUCIQC1EC1A95c9Rs-0-_11QnJ0cuedKEPwAgfmDRLK-jVUYgIgd5agGdjriekepYLe94IXvdkID4lEiSTxqDgnF7SV8bs"
}]
},
"encodedData": "ZGF0YSBmcm9tIGJvYg"
}
```
* Where does `descriptor.target` come from?
* Moe figures out how to cache this in memory on inbound message ingest
* Neal has to provide it explicitly
* Where does `descriptor.recipient` come from?
* Same as `descriptor.target`
* Where does `descriptor.method` come from?
* Default to `CollectionsWrite` if response.status is `200 >= x <= 299`
* where does `descriptor.protocol` come from?
* IDFK ????? Feels like it has to come from downstream service but i really don't want that
* where does `descriptor.contextId` come from?
* IDFK ????? Feels like it has to come from downstream service but i really don't want that
* where does `descriptor.schema` come from?
* Has to be provided by downstream service