2017-09-25 20:22:57 +02:00
|
|
|
package signal
|
2017-05-16 15:09:52 +03:00
|
|
|
|
|
|
|
/*
|
|
|
|
#include <stddef.h>
|
|
|
|
#include <stdbool.h>
|
2018-07-26 13:04:52 +02:00
|
|
|
#include <stdlib.h>
|
2017-05-16 15:09:52 +03:00
|
|
|
extern bool StatusServiceSignalEvent(const char *jsonEvent);
|
2018-06-28 02:16:27 +03:00
|
|
|
extern void SetEventCallback(void *cb);
|
2017-05-16 15:09:52 +03:00
|
|
|
*/
|
|
|
|
import "C"
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
2017-08-10 15:35:58 +02:00
|
|
|
|
2018-06-28 02:16:27 +03:00
|
|
|
"unsafe"
|
|
|
|
|
2017-11-28 16:17:15 +03:00
|
|
|
"sync"
|
2018-02-05 05:37:59 -05:00
|
|
|
|
2018-03-20 14:35:28 -04:00
|
|
|
"github.com/ethereum/go-ethereum/log"
|
2017-05-16 15:09:52 +03:00
|
|
|
)
|
|
|
|
|
2018-05-03 09:35:58 +02:00
|
|
|
// All general log messages in this package should be routed through this logger.
|
|
|
|
var logger = log.New("package", "status-go/signal")
|
2017-05-16 15:09:52 +03:00
|
|
|
|
2017-09-25 20:22:57 +02:00
|
|
|
// Envelope is a general signal sent upward from node to RN app
|
|
|
|
type Envelope struct {
|
2017-05-16 15:09:52 +03:00
|
|
|
Type string `json:"type"`
|
|
|
|
Event interface{} `json:"event"`
|
|
|
|
}
|
|
|
|
|
2018-05-03 09:35:58 +02:00
|
|
|
// NewEnvelope creates new envlope of given type and event payload.
|
|
|
|
func NewEnvelope(typ string, event interface{}) *Envelope {
|
|
|
|
return &Envelope{
|
|
|
|
Type: typ,
|
|
|
|
Event: event,
|
|
|
|
}
|
2018-02-05 05:37:59 -05:00
|
|
|
}
|
|
|
|
|
2018-05-03 09:35:58 +02:00
|
|
|
// send sends application signal (in JSON) upwards to application (via default notification handler)
|
|
|
|
func send(typ string, event interface{}) {
|
|
|
|
signal := NewEnvelope(typ, event)
|
|
|
|
data, err := json.Marshal(&signal)
|
|
|
|
if err != nil {
|
|
|
|
logger.Error("Marshalling signal envelope", "error", err)
|
2018-07-26 13:04:52 +02:00
|
|
|
return
|
2018-05-03 09:35:58 +02:00
|
|
|
}
|
2018-07-26 13:04:52 +02:00
|
|
|
|
|
|
|
str := C.CString(string(data))
|
|
|
|
C.StatusServiceSignalEvent(str)
|
|
|
|
C.free(unsafe.Pointer(str))
|
2017-05-16 15:09:52 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// NodeNotificationHandler defines a handler able to process incoming node events.
|
|
|
|
// Events are encoded as JSON strings.
|
|
|
|
type NodeNotificationHandler func(jsonEvent string)
|
|
|
|
|
|
|
|
var notificationHandler NodeNotificationHandler = TriggerDefaultNodeNotificationHandler
|
|
|
|
|
2017-11-28 16:17:15 +03:00
|
|
|
// notificationHandlerMutex guards notificationHandler for concurrent calls
|
|
|
|
var notificationHandlerMutex sync.RWMutex
|
|
|
|
|
2017-09-25 20:22:57 +02:00
|
|
|
// SetDefaultNodeNotificationHandler sets notification handler to invoke on Send
|
2017-05-16 15:09:52 +03:00
|
|
|
func SetDefaultNodeNotificationHandler(fn NodeNotificationHandler) {
|
2017-11-28 16:17:15 +03:00
|
|
|
notificationHandlerMutex.Lock()
|
2017-05-16 15:09:52 +03:00
|
|
|
notificationHandler = fn
|
2017-11-28 16:17:15 +03:00
|
|
|
notificationHandlerMutex.Unlock()
|
2017-05-16 15:09:52 +03:00
|
|
|
}
|
|
|
|
|
2017-09-25 20:22:57 +02:00
|
|
|
// ResetDefaultNodeNotificationHandler sets notification handler to default one
|
2017-05-25 16:14:52 +03:00
|
|
|
func ResetDefaultNodeNotificationHandler() {
|
2017-11-28 16:17:15 +03:00
|
|
|
notificationHandlerMutex.Lock()
|
2017-05-25 16:14:52 +03:00
|
|
|
notificationHandler = TriggerDefaultNodeNotificationHandler
|
2017-11-28 16:17:15 +03:00
|
|
|
notificationHandlerMutex.Unlock()
|
2017-05-25 16:14:52 +03:00
|
|
|
}
|
|
|
|
|
2017-05-16 15:09:52 +03:00
|
|
|
// TriggerDefaultNodeNotificationHandler triggers default notification handler (helpful in tests)
|
|
|
|
func TriggerDefaultNodeNotificationHandler(jsonEvent string) {
|
2018-06-12 09:49:38 +02:00
|
|
|
logger.Trace("Notification received", "event", jsonEvent)
|
2017-05-16 15:09:52 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
//export NotifyNode
|
2017-10-20 12:06:22 +03:00
|
|
|
//nolint: golint
|
|
|
|
func NotifyNode(jsonEvent *C.char) {
|
2017-11-28 16:17:15 +03:00
|
|
|
notificationHandlerMutex.RLock()
|
|
|
|
defer notificationHandlerMutex.RUnlock()
|
2017-05-16 15:09:52 +03:00
|
|
|
notificationHandler(C.GoString(jsonEvent))
|
|
|
|
}
|
|
|
|
|
|
|
|
//export TriggerTestSignal
|
2017-10-20 12:06:22 +03:00
|
|
|
//nolint: golint
|
|
|
|
func TriggerTestSignal() {
|
2018-07-26 13:04:52 +02:00
|
|
|
str := C.CString(`{"answer": 42}`)
|
|
|
|
C.StatusServiceSignalEvent(str)
|
|
|
|
C.free(unsafe.Pointer(str))
|
2017-05-16 15:09:52 +03:00
|
|
|
}
|
2018-06-28 02:16:27 +03:00
|
|
|
|
|
|
|
// SetSignalEventCallback set callback
|
|
|
|
func SetSignalEventCallback(cb unsafe.Pointer) {
|
|
|
|
C.SetEventCallback(cb)
|
|
|
|
}
|