mirror of
https://github.com/mainflux/mainflux.git
synced 2025-04-27 13:48:49 +08:00

* Commit for mainflux-596 Modified and tested: - cli - http - mqtt - normalizer - all readers - sdk messages - all writers - ws Missing: - coap - lora Signed-off-by: ale <ale@metaverso.org> * - fix subtopic name in, when starting with dot, http/ws/mqtt - add some test on readers Signed-off-by: ale <ale@metaverso.org> * - fix string concatenation - update http/transport regexp to match subtopic names with only \w- - update ws/transport regexp like http ones with also the wildcard * and > Signed-off-by: ale <ale@metaverso.org> * added subtopic support to coap adapter Signed-off-by: ale <ale@metaverso.org> * - update replace functions with replaceall when needed - renamed getDestChannel to fmtSubject - update api/transport and ws/transport route to be more readable - fix mqtt syntax - renamed func andQuery to query as suggested by @anovakovic01 - have a nice we :) Signed-off-by: ale <ale@metaverso.org> * - fix error declaration on ws/nat/publisher - fix regexp added missing allowed chars - and _ on coap/api/transport - fix subtopic clean suffix / if present on coap/api/transport - improve regexp on http and ws /api/transport, now does not accept url that do not strictly match - add some ws subtopic tests Signed-off-by: ale <ale@metaverso.org> * - enabled wildcard chars on coap/api/transport - allow use special chars on http and ws api/transport Signed-off-by: ale <ale@metaverso.org> * - use strings.Replace() insted ReplaceAll() Signed-off-by: ale <ale@metaverso.org> * - allow every chars on subtopics - fix replace error on mqtt Signed-off-by: ale <ale@metaverso.org> * fix cassandra test Signed-off-by: ale <ale@metaverso.org> * fix ws test with invalid subtopic Signed-off-by: ale <ale@metaverso.org> * fix invalid GOCACHE in go1.12, replaced by -count 1, see https://golang.org/doc/go1.10#test Signed-off-by: ale <ale@metaverso.org> * - improve regexp on http/ws api/transport - minor changes Signed-off-by: ale <ale@metaverso.org> * - add generic function parseSubtopic on ws/http adapters Signed-off-by: ale <ale@metaverso.org> * - add generic function fmtSubtopic on coap adapter Signed-off-by: ale <ale@metaverso.org>
107 lines
2.4 KiB
Go
107 lines
2.4 KiB
Go
//
|
|
// Copyright (c) 2018
|
|
// Mainflux
|
|
//
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
//
|
|
|
|
// Package ws contains the domain concept definitions needed to support
|
|
// Mainflux ws adapter service functionality.
|
|
package ws
|
|
|
|
import (
|
|
"errors"
|
|
"sync"
|
|
|
|
"github.com/mainflux/mainflux"
|
|
broker "github.com/nats-io/go-nats"
|
|
)
|
|
|
|
var (
|
|
// ErrFailedMessagePublish indicates that message publishing failed.
|
|
ErrFailedMessagePublish = errors.New("failed to publish message")
|
|
|
|
// ErrFailedSubscription indicates that client couldn't subscribe to specified channel.
|
|
ErrFailedSubscription = errors.New("failed to subscribe to a channel")
|
|
|
|
// ErrFailedConnection indicates that service couldn't connect to message broker.
|
|
ErrFailedConnection = errors.New("failed to connect to message broker")
|
|
)
|
|
|
|
// Service specifies web socket service API.
|
|
type Service interface {
|
|
mainflux.MessagePublisher
|
|
|
|
// Subscribes to channel with specified id.
|
|
Subscribe(string, string, *Channel) error
|
|
}
|
|
|
|
// Channel is used for receiving and sending messages.
|
|
type Channel struct {
|
|
Messages chan mainflux.RawMessage
|
|
Closed chan bool
|
|
closed bool
|
|
mutex sync.Mutex
|
|
}
|
|
|
|
// NewChannel instantiates empty channel.
|
|
func NewChannel() *Channel {
|
|
return &Channel{
|
|
Messages: make(chan mainflux.RawMessage),
|
|
Closed: make(chan bool),
|
|
closed: false,
|
|
mutex: sync.Mutex{},
|
|
}
|
|
}
|
|
|
|
// Send method send message over Messages channel.
|
|
func (channel *Channel) Send(msg mainflux.RawMessage) {
|
|
channel.mutex.Lock()
|
|
defer channel.mutex.Unlock()
|
|
|
|
if !channel.closed {
|
|
channel.Messages <- msg
|
|
}
|
|
}
|
|
|
|
// Close channel and stop message transfer.
|
|
func (channel *Channel) Close() {
|
|
channel.mutex.Lock()
|
|
defer channel.mutex.Unlock()
|
|
|
|
channel.closed = true
|
|
channel.Closed <- true
|
|
close(channel.Messages)
|
|
close(channel.Closed)
|
|
}
|
|
|
|
var _ Service = (*adapterService)(nil)
|
|
|
|
type adapterService struct {
|
|
pubsub Service
|
|
}
|
|
|
|
// New instantiates the WS adapter implementation.
|
|
func New(pubsub Service) Service {
|
|
return &adapterService{pubsub}
|
|
}
|
|
|
|
func (as *adapterService) Publish(msg mainflux.RawMessage) error {
|
|
if err := as.pubsub.Publish(msg); err != nil {
|
|
switch err {
|
|
case broker.ErrConnectionClosed, broker.ErrInvalidConnection:
|
|
return ErrFailedConnection
|
|
default:
|
|
return ErrFailedMessagePublish
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (as *adapterService) Subscribe(chanID, subtopic string, channel *Channel) error {
|
|
if err := as.pubsub.Subscribe(chanID, subtopic, channel); err != nil {
|
|
return ErrFailedSubscription
|
|
}
|
|
return nil
|
|
}
|