/* * Copyright (C) 2018 "IoT.bzh" * Author Sebastien Douheret * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package main import ( "fmt" "sync" "gerrit.automotivelinux.org/gerrit/src/xds/xds-agent.git/lib/xaapiv1" socketio_client "github.com/sebd71/go-socket.io-client" ) // Disconnection Channel used to notify XDS Server disconnection type Disconnection struct { error string code int svrConf xaapiv1.ServerCfg } // IOSockClient . type IOSockClient struct { URL string Conn *socketio_client.Client Options *socketio_client.Options EmitMutex *sync.Mutex Connected bool ServerDiscoChan chan Disconnection EscapeKeys []byte } // NewIoSocketClient Create a new IOSockClient func NewIoSocketClient(url, clientID string) (*IOSockClient, error) { var err error sCli := &IOSockClient{ URL: url, EmitMutex: &sync.Mutex{}, Options: &socketio_client.Options{ Transport: "websocket", Header: make(map[string][]string), }, ServerDiscoChan: make(chan Disconnection, 1), } sCli.Options.Header["XDS-AGENT-SID"] = []string{clientID} sCli.Conn, err = socketio_client.NewClient(url, sCli.Options) if err != nil { return nil, fmt.Errorf("IO.socket connection error: " + err.Error()) } sCli.Conn.On("connection", func() { sCli.Connected = true }) sCli.Conn.On("disconnection", func(err error) { Log.Debugf("WS disconnection event with err: %v\n", err) sCli.Connected = false }) args := xaapiv1.EventRegisterArgs{Name: xaapiv1.EVTServerConfig} if err := HTTPCli.Post("/events/register", args, nil); err != nil { return sCli, err } sCli.Conn.On(xaapiv1.EVTServerConfig, func(ev xaapiv1.EventMsg) { svrCfg, err := ev.DecodeServerCfg() if err == nil && !svrCfg.Connected { sCli.ServerDiscoChan <- Disconnection{ error: "\nXDS Server (id " + svrCfg.ID + ") disconnected !", code: 1, svrConf: svrCfg, } } }) return sCli, nil } // On record a callback on a specific message func (c *IOSockClient) On(message string, f interface{}) (err error) { return c.Conn.On(message, f) } // Emit send a message func (c *IOSockClient) Emit(message string, args ...interface{}) (err error) { c.EmitMutex.Lock() defer c.EmitMutex.Unlock() return c.Conn.Emit(message, args...) }