weex2.0 websocket 使用

安裝包:npm install websocket-extensions
心跳測試文件:

    const socket     = weex.requireModule('webSocket');
    var i = 0;
    console.log(socket)
    var socketioWarpper = (function() {
        function connect(host) {
            socket.WebSocket(host,'');
        }

        function getHostUrl(host) {
            return "ws://"+ host +"/socket.io/?EIO=3&transport=websocket"
        }



        function responseEvent(bind, event) {
                var _this = bind;
                return function(message) {
                    if(_this.eventBus && _this.eventBus[event] ) {
                        var eventCbList = _this.eventBus[event];
                        eventCbList.forEach(function(eventCb) {
                            if( typeof eventCb === 'function' ) {
                                eventCb( message );
                            }
                        });

                    }
                }
            }

        function responseMessageEvent(bind) {
                var _this = bind;
                return function( msg ) {
                    if( !msg || !msg.data) {
                        return;
                    }

                    if( _this.eventBus && _this.eventBus['message'] && typeof _this.eventBus['message'] === 'function' ) {
                        _this.eventBus['message'](msg.data);
                    }


                    var message = parseMsg( msg.data );

                    if( message ) {


                        if( message.event && message.message ) {

                            if( _this.eventBus && _this.eventBus[message.event] ) {
                                var eventCbList = _this.eventBus[message.event];

                                eventCbList.forEach(function(eventCb) {
                                    if( typeof eventCb === 'function' ) {
                                        eventCb( message.message );
                                    }
                                });
                            }
                        }
                    }
                }

            }



        function createConnect(host, channelId) {

                function bindSocket(wrapper) {
                    connect(getHostUrl(host));

                    if(socket) {
                        socket.onclose = responseEvent(wrapper, 'close' );
                        socket.onopen = responseEvent( wrapper, 'open' );
                        socket.onmessage = responseMessageEvent(wrapper);
                        socket.onerror = responseEvent( wrapper, 'error' );
                    }
                    wrapper.host = host;
                    wrapper.socket = socket;
                } 

                bindSocket( this );
                var _this = this;

                this.onOpen(function() {
                    function reConnectionListener() {

                        if(socket.readyState === 3 ) {
                            bindSocket(_this);
                        }

                        setTimeout(reConnectionListener, 1000);
                    };

                    function heatbeat() {
                        // if(socket.readyState === 1 ) {
                            send('register', {'channelId': channelId});

                            send('chatevent',{userName: "user76", message: i++});
                        // }
                        setTimeout(heatbeat, 20000);
                    }

                    heatbeat();

                    reConnectionListener();
                });

                return this;
            }






        function parseMsg(msg) {

            // console.log( msg );

            if( typeof msg === 'object' ) {
                return msg;
            }
            if( typeof msg === 'string' && msg.startsWith('42') ) {
                msg = msg.replace('42[', '[');
                var obj = JSON.parse(msg);
                var event = obj[0];
                var msgObj = obj[1];
                return {
                    event: event,
                    message: msgObj
                }
            }
        }

            function wrapMsg(event, msg) {
                var arr = [event, msg];
                return '42' + JSON.stringify( arr );
            }




            function onEvent(event, cb ) {
                var list = this.eventBus[event] || [];
                list.push( cb );
                this.eventBus[event] = list;

            }

            function registerEvent(event) {
                return function(cb) {
                    var list = this.eventBus[event] || [];
                    list.push(cb);
                    this.eventBus[event] = list;
                }
            }


        function send(event, msg) {
                try{
                    var result = socket.send( wrapMsg(event, msg) );
                } catch(error) {
                    console.error(error);
                }

            }





        return function() {





                var result = {
                    eventBus: {},
                    connection: createConnect,
                    onClose: registerEvent('close'),
                    onOpen: registerEvent('open'),
                    onError: registerEvent('error'),
                    onMessage: registerEvent('message'),
                    onEvent: onEvent,
                    onSend: send
                };

                return result;

            }();

    })();
export default socketioWarpper
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章