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  }