github.com/hyperledger/aries-framework-go@v0.3.2/pkg/client/messaging/msgservice.go (about) 1 /* 2 Copyright SecureKey Technologies Inc. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package messaging 8 9 import ( 10 "encoding/json" 11 "fmt" 12 13 "github.com/hyperledger/aries-framework-go/pkg/controller/command" 14 "github.com/hyperledger/aries-framework-go/pkg/didcomm/common/service" 15 ) 16 17 const ( 18 errMsgSvcHandleFailed = "failed to handle inbound : %w" 19 errTopicNotFound = "failed to get topic to send notification" 20 ) 21 22 // handleFunc converts incoming message to topic bytes to be sent. 23 type handleFunc func(msg service.DIDCommMsg, ctx service.DIDCommContext) ([]byte, error) 24 25 // newMessageService returns new message service instance. 26 func newMessageService(name, msgType string, purposes []string, notifier command.Notifier) *msgService { 27 return newCustomMessageService(name, msgType, purposes, notifier, genericHandleFunc()) 28 } 29 30 // newCustomMessageService returns new message service instance with custom topic handle for 31 // handling incoming messages. 32 func newCustomMessageService(name, msgType string, purpose []string, notifier command.Notifier, 33 handle handleFunc) *msgService { 34 svc := &msgService{ 35 name: name, 36 msgType: msgType, 37 purpose: purpose, 38 notifier: notifier, 39 topicHandle: handle, 40 } 41 42 return svc 43 } 44 45 // msgService is basic message service implementation 46 // which delegates handling to registered webhook notifier. 47 type msgService struct { 48 name string 49 purpose []string 50 msgType string 51 notifier command.Notifier 52 topicHandle handleFunc 53 } 54 55 func (m *msgService) Name() string { 56 return m.name 57 } 58 59 func (m *msgService) Accept(msgType string, purpose []string) bool { 60 purposeMatched, typeMatched := len(m.purpose) == 0, m.msgType == "" 61 62 if purposeMatched && typeMatched { 63 return false 64 } 65 66 for _, purposeCriteria := range m.purpose { 67 for _, msgPurpose := range purpose { 68 if purposeCriteria == msgPurpose { 69 purposeMatched = true 70 71 break 72 } 73 } 74 } 75 76 if m.msgType == msgType { 77 typeMatched = true 78 } 79 80 return purposeMatched && typeMatched 81 } 82 83 func (m *msgService) HandleInbound(msg service.DIDCommMsg, ctx service.DIDCommContext) (string, error) { 84 if m.name == "" || m.topicHandle == nil { 85 return "", fmt.Errorf(errTopicNotFound) 86 } 87 88 bytes, err := m.topicHandle(msg, ctx) 89 if err != nil { 90 return "", fmt.Errorf(errMsgSvcHandleFailed, err) 91 } 92 93 return "", m.notifier.Notify(m.name, bytes) 94 } 95 96 // genericHandleFunc handle function for converting incoming messages to generic topic. 97 func genericHandleFunc() handleFunc { 98 return func(msg service.DIDCommMsg, ctx service.DIDCommContext) ([]byte, error) { 99 topic := struct { 100 Message interface{} `json:"message"` 101 MyDID string `json:"mydid"` 102 TheirDID string `json:"theirdid"` 103 }{ 104 msg, 105 ctx.MyDID(), 106 ctx.TheirDID(), 107 } 108 109 return json.Marshal(topic) 110 } 111 }