github.com/hyperledger/aries-framework-go@v0.3.2/pkg/client/outofbandv2/example_test.go (about) 1 /* 2 Copyright SecureKey Technologies Inc. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package outofbandv2 8 9 import ( 10 "encoding/base64" 11 "encoding/json" 12 "fmt" 13 "time" 14 15 "github.com/google/uuid" 16 17 "github.com/hyperledger/aries-framework-go/component/storageutil/mem" 18 "github.com/hyperledger/aries-framework-go/pkg/client/didexchange" 19 "github.com/hyperledger/aries-framework-go/pkg/client/mediator" 20 "github.com/hyperledger/aries-framework-go/pkg/didcomm/common/service" 21 "github.com/hyperledger/aries-framework-go/pkg/didcomm/protocol/decorator" 22 didsvc "github.com/hyperledger/aries-framework-go/pkg/didcomm/protocol/didexchange" 23 routesvc "github.com/hyperledger/aries-framework-go/pkg/didcomm/protocol/mediator" 24 oobv2 "github.com/hyperledger/aries-framework-go/pkg/didcomm/protocol/outofbandv2" 25 mockdidexchange "github.com/hyperledger/aries-framework-go/pkg/mock/didcomm/protocol/didexchange" 26 mockroute "github.com/hyperledger/aries-framework-go/pkg/mock/didcomm/protocol/mediator" 27 mockkms "github.com/hyperledger/aries-framework-go/pkg/mock/kms" 28 mockprovider "github.com/hyperledger/aries-framework-go/pkg/mock/provider" 29 ) 30 31 const ( 32 // Router is a router that sends an out-of-band/2.0 invitation to the edge agent. 33 Router = "Router" 34 // Bob is an edge agent. 35 Bob = "Bob" 36 ) 37 38 var agentActions = make(map[string]chan service.DIDCommAction) //nolint:gochecknoglobals 39 40 // Example of an edge agent accepting an out-of-band invitation from a router. 41 func ExampleClient_AcceptInvitation() { //nolint:gocyclo,gocognit 42 // set up the router 43 routerCtx := getContext(Router) 44 45 router, err := New(routerCtx) 46 if err != nil { 47 panic(err) 48 } 49 50 routerDIDs, err := didexchange.New(routerCtx) 51 if err != nil { 52 panic(err) 53 } 54 55 routerClient, err := mediator.New(routerCtx) 56 if err != nil { 57 panic(err) 58 } 59 60 routerEvents := makeActionsChannel(Router) 61 62 err = routerDIDs.RegisterActionEvent(routerEvents) 63 if err != nil { 64 panic(err) 65 } 66 67 err = routerClient.RegisterActionEvent(routerEvents) 68 if err != nil { 69 panic(err) 70 } 71 72 // set up the edge agent 73 bobCtx := getContext(Bob) 74 75 bob, err := New(bobCtx) 76 if err != nil { 77 panic(err) 78 } 79 80 // router creates the route-request message 81 routeRequest, err := json.Marshal(mediator.NewRequest()) 82 if err != nil { 83 panic(err) 84 } 85 86 // router creates outofband request and embeds the route-request message in it 87 inv, err := router.CreateInvitation( 88 WithLabel(Router), 89 WithAttachments(&decorator.AttachmentV2{ 90 ID: uuid.New().String(), 91 Data: decorator.AttachmentData{ 92 Base64: base64.StdEncoding.EncodeToString(routeRequest), 93 }, 94 }), 95 ) 96 if err != nil { 97 panic(err) 98 } 99 100 fmt.Printf("%s creates an out-of-band/2.0 invitation message\n", Router) 101 102 // the edge agent accepts the outofband invitation 103 _, err = bob.AcceptInvitation(inv) 104 if err != nil { 105 panic(err) 106 } 107 108 fmt.Printf("%s accepts the out-of-band/2.0 invitation received via an out of band channel and got new connID\n", Bob) 109 110 done := make(chan struct{}) // ends this example 111 112 go func() { 113 for event := range routerEvents { 114 if event.Message != nil { 115 fmt.Printf("%s received %s from %s\n", Router, event.Message.Type(), Bob) 116 } 117 118 switch event.ProtocolName { 119 case didexchange.ProtocolName: 120 if event.Message.Type() == didexchange.RequestMsgType { 121 didExchangeRequest := &didsvc.Request{} 122 123 err = event.Message.Decode(didExchangeRequest) 124 if err != nil { 125 panic(err) 126 } 127 128 if didExchangeRequest.Label != Bob { 129 err = fmt.Errorf( 130 "%s expected a didexchange request from %s but got %s", 131 Router, Bob, didExchangeRequest.Label, 132 ) 133 134 event.Stop(err) 135 panic(err) 136 } 137 138 event.Continue(nil) 139 } 140 case mediator.ProtocolName: 141 if event.Message.Type() == mediator.RequestMsgType { 142 event.Continue(nil) 143 done <- struct{}{} 144 } 145 } 146 } 147 }() 148 149 select { 150 case <-done: 151 case <-time.After(time.Second): // timeout varies in your environment 152 panic("timeout") 153 } 154 155 bobRoutes, err := mediator.New(bobCtx) 156 if err != nil { 157 panic(err) 158 } 159 160 config, err := bobRoutes.GetConfig("xyz") 161 if err != nil { 162 panic(err) 163 } 164 165 fmt.Printf( 166 "%s has registered a route on %s with routerEndpoint %s and routingKeys %+v\n", 167 Bob, Router, config.Endpoint(), config.Keys()) 168 169 // Output: 170 // Router creates an out-of-band/2.0 invitation message 171 // Bob accepts the out-of-band/2.0 invitation received via an out of band channel and got new connID 172 // Router received https://didcomm.org/didexchange/1.0/request from Bob 173 // Router received https://didcomm.org/coordinatemediation/1.0/mediate-request from Bob 174 // Bob has registered a route on Router with routerEndpoint http://routers-r-us.com and routingKeys [key-1 key-2] 175 } 176 177 func getContext(agent string) *mockprovider.Provider { 178 return &mockprovider.Provider{ 179 KMSValue: &mockkms.KeyManager{}, 180 StorageProviderValue: mem.NewProvider(), 181 ProtocolStateStorageProviderValue: mem.NewProvider(), 182 ServiceMap: map[string]interface{}{ 183 oobv2.Name: &stubOOBService{ 184 Event: nil, 185 acceptInvFunc: func(i *oobv2.Invitation) error { 186 agentActions[i.Label] <- service.DIDCommAction{ 187 ProtocolName: didsvc.DIDExchange, 188 Message: service.NewDIDCommMsgMap(&didsvc.Request{ 189 Type: didsvc.RequestMsgType, 190 Label: agent, 191 }), 192 Continue: func(interface{}) { 193 agentActions[i.Label] <- service.DIDCommAction{ 194 ProtocolName: mediator.ProtocolName, 195 Message: service.NewDIDCommMsgMap(mediator.NewRequest()), 196 Continue: func(interface{}) {}, 197 } 198 }, 199 } 200 201 return nil 202 }, 203 }, 204 didsvc.DIDExchange: &mockdidexchange.MockDIDExchangeSvc{}, 205 routesvc.Coordination: &mockroute.MockMediatorSvc{ 206 RouterEndpoint: "http://routers-r-us.com", 207 RoutingKeys: []string{"key-1", "key-2"}, 208 }, 209 }, 210 } 211 } 212 213 func makeActionsChannel(agent string) chan service.DIDCommAction { 214 c := make(chan service.DIDCommAction, 5) 215 agentActions[agent] = c 216 217 return c 218 }