From 0dd023b60a0596624f3b218a949e3f3017703425 Mon Sep 17 00:00:00 2001
From: AlexWang <1669499355@qq.com>
Date: Tue, 8 Aug 2017 18:27:27 +0800
Subject: [PATCH] t push -u origin master

---
 dist/.DS_Store        | Bin 0 -> 6148 bytes
 dist/main.html        |   1 +
 dist/ss.js            |   1 +
 dist/test.html        |   1 +
 dist/test.js          |   1 +
 package.json          |   6 ++++--
 src/Emiter.js         |  59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/Loger.js          |  82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/Socket.js         | 153 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/main.js           | 589 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------
 test/test.js          |  99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------
 webpack.config.umd.js |   2 +-
 12 files changed, 967 insertions(+), 27 deletions(-)
 create mode 100644 dist/.DS_Store
 create mode 100644 dist/main.html
 create mode 100644 dist/ss.js
 create mode 100644 dist/test.html
 create mode 100644 dist/test.js
 create mode 100644 src/Emiter.js
 create mode 100644 src/Loger.js
 create mode 100644 src/Socket.js

diff --git a/dist/.DS_Store b/dist/.DS_Store
new file mode 100644
index 0000000..5008ddf
Binary files /dev/null and b/dist/.DS_Store differ
diff --git a/dist/main.html b/dist/main.html
new file mode 100644
index 0000000..cf939fb
--- /dev/null
+++ b/dist/main.html
@@ -0,0 +1 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8"><title>UMD PLAYGROUND</title></head><body><div id="stage"></div><script type="text/javascript" src="main.js"></script></body></html>
\ No newline at end of file
diff --git a/dist/ss.js b/dist/ss.js
new file mode 100644
index 0000000..51c7432
--- /dev/null
+++ b/dist/ss.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.share=t():e.share=t()}(this,function(){return function(e){function t(n){if(_[n])return _[n].exports;var a=_[n]={exports:{},id:n,loaded:!1};return e[n].call(a.exports,a,a.exports,t),a.loaded=!0,a.exports}var _={};return t.m=e,t.c=_,t.p="",t(0)}([function(e,t,_){e.exports=_(2)},function(e,t){"use strict";function _(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var n=function(){function e(e,t){for(var _=0;_<t.length;_++){var n=t[_];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,_,n){return _&&e(t.prototype,_),n&&e(t,n),t}}(),a=function(){function e(){_(this,e),this.MAPS={}}return n(e,[{key:"on",value:function(e,t){if(e&&t){var _=this.MAPS[e];if(!_)return this.MAPS[e]=[t];_.push(t)}}},{key:"off",value:function(e,t){if(e){var _=this.MAPS[e];if(_){if(t)return _.splice(_.indexOf(t),1);_.length=0}}}},{key:"emit",value:function(e,t){if(e){var _=this.MAPS["*"];_&&_.length&&_.forEach(function(_){_(e,t)});var n=this.MAPS[e];n&&n.length&&n.forEach(function(e){e(t)})}}}]),e}();t.default=a},function(e,t,_){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function a(e){var t,_,n,a;n=e.length,t=new Uint8Array(3*n);var r=0;for(_=0;_<n;_++)a=e.charCodeAt(_),a>=1&&a<=127?t[r++]=a:a>2047?(t[r++]=224|a>>12&15,t[r++]=128|a>>6&63,t[r++]=128|a>>0&63):(t[r++]=192|a>>6&31,t[r++]=128|a>>0&63);return new Uint8Array(t.buffer,0,r)}function r(e){var t,_,n,a,r,o;for(t="",n=e.length,_=0;_<n;)switch(a=e[_++],a>>4){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:t+=String.fromCharCode(a);break;case 12:case 13:r=e[_++],t+=String.fromCharCode((31&a)<<6|63&r);break;case 14:r=e[_++],o=e[_++],t+=String.fromCharCode((15&a)<<12|(63&r)<<6|(63&o)<<0)}return t}function o(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",_=new Object;if(_.data_len=0,_.data="",_.name=e,"mov_start"==e)_.type=1;else if("mov_stop"==e)_.type=2;else if("mov_pause"==e){if(_.type=3,pos=t,pos.length>0){_.data_len=4;var n=new ArrayBuffer(_.data_len),r=new Uint32Array(n,0,1);r[0]=parseInt(pos),_.data=new Uint8Array(n,0,4)}}else if("mov_resume"==e)_.type=4;else if("mov_seek"==e){if(_.type=5,pos=t,pos.length>0){_.data_len=4;var n=new ArrayBuffer(_.data_len),r=new Uint32Array(n,0,1);r[0]=parseInt(pos),_.data=new Uint8Array(n,0,4)}}else if("ss_start"==e)_.type=6,_.data=a(t),_.data_len=_.data.length;else if("ss_stop"==e)_.type=7;else if("ss_version"==e)_.type=14;else if("get_mic"==e)_.type=26;else{if("ds_start"==e){_.type=27,_.data_len=536;var n=new ArrayBuffer(_.data_len),o=new Uint32Array(n,0,6);coordstr=t;var i=coordstr.split(",");if(4!=i.length)return;o[0]=parseInt(i[0]),o[1]=parseInt(i[1]),o[2]=parseInt(i[2]),o[3]=parseInt(i[3]);var s=new Uint8Array(n,24,256);window_name=t;for(var S=a(window_name),E=0;E<S.length;E++)s[E]=S[E];o[4]=S.length,o[5]=0;new Uint8Array(n,280,256);return _.data=new Uint8Array(n,0,_.data_len),void A(_)}if("ds_stop"==e)_.type=28;else{if("aud_start"==e){_.type=29,_.data_len=520;var n=new ArrayBuffer(_.data_len),l=new Uint32Array(n,0,1),C=t;l[0]=C.length;var f=new Uint32Array(n,4,1);f[0]=0;for(var c=new Uint8Array(n,8,256),O=a(C),E=0;E<O.length;E++)c[E]=O[E];new Uint8Array(n,264,256);return _.data=new Uint8Array(n,0,_.data_len),void A(_)}if("aud_stop"==e)_.type=30;else if("get_cam"==e)_.type=41;else{if("cam_start"==e){_.type=42,_.data_len=520;var n=new ArrayBuffer(_.data_len),I=new Uint32Array(n,0,1),T=t;I[0]=T.length;var f=new Uint32Array(n,4,1);f[0]=0;for(var U=new Uint8Array(n,8,256),u=a(T),E=0;E<u.length;E++)U[E]=u[E];new Uint8Array(n,264,256);return _.data=new Uint8Array(n,0,_.data_len),void A(_)}"cam_stop"==e?_.type=43:"set_videoparam"==e?(_.type=46,_.data=a(t),_.data_len=_.data.length):"get_videoparam"==e?(_.type=47,_.data=a(t),_.data_len=_.data.length):"start_record"==e?(_.type=48,_.data=a(t),_.data_len=_.data.length):"stop_record"==e?(_.type=49,_.data=a(t),_.data_len=_.data.length):"start_push"==e?(_.type=50,_.data=a(t),_.data_len=_.data.length):"stop_push"==e?(_.type=51,_.data=a(t),_.data_len=_.data.length):"get_rtmp_port"==e?_.type=52:"set_mic_vol"==e?(_.type=53,_.data=a(t),_.data_len=_.data.length):"get_mic_vol"==e&&(_.type=54)}}}A(_)}function A(e){var t=8+e.data_len,_=new ArrayBuffer(t),n=new Uint16Array(_,0,1),a=new Uint8Array(_,2,1),r=new Uint32Array(_,4,1);if(n[0]=e.type,a[0]=0,r[0]=e.data_len,e.data_len>0)for(var o=new Uint8Array(_,8,e.data_len),A=0;A<e.data_len;A++)o[A]=e.data[A];R&&R.send(_)}function i(){try{R&&(R.close(),R=R.onopen=R.onclose=R.onerror=R.onmessage=null,C.emit(C.CLOSE))}catch(e){console.log(e)}}function s(){i()}function S(){R&&i(),R=new WebSocket("ws://"+p+":"+L),g=setTimeout(function(){clearTimeout(g),i()},1500),R.timeout=1500,R.binaryType="arraybuffer",R.onopen=function(){clearTimeout(g),o("get_rtmp_port"),o("get_mic"),o("get_cam"),o("get_mic_vol"),C.emit(C.OPEN)},R.onclose=function(){i()},R.onerror=function(){i()},R.onmessage=function(e){var t=e.data;if("string"==typeof e.data)console.log("on message [string] ignore.");else{var _=new DataView(t),n=_.getUint16(0,!0);console.log("onmessage code->",n);var a=(_.getUint8(2,!0),_.getUint32(4,!0));if(n>=0&&n<f.length){f[n]}if(0==n||6==n||8==n)console.log("mov_start,mov_pause,mov_seek success");else if(10==n){if(a>36){var o=new Uint32Array(t,8,8),A="width:"+o[0]+" height:"+o[1];A="framerate:"+o[2]+" duration:"+o[3],A="playpos:"+o[4]+" filesize:"+o[5],c=A;var i=o[6],s=new Uint8Array(t,40,i),S=r(s);c.filename=S,C.emit(C.MOVIE_INFO_CHANGE,c)}}else if(11==n)console.log("ss_start success"),C.emit(C.SS_START);else if(24<=n&&26>=n){if(a>=4){var E=_.getUint32(8,!0);O=E.toString(),C.emit(C.VERSION_INFO_CHANGE,O)}}else if(55==n)console.log("ds_start success");else if(59==n)console.log("as start success");else if(83==n){if(console.log("get camera sucess"),a>4){var l=_.getUint32(8,!0),R=12;I.length=0;for(var p=0;p<l;p++){var L=_.getUint32(R,!0);R+=4;var g=new Uint8Array(t,R,L-1);R+=L;var y=r(g);I.push(y)}C.emit(C.CAMERA_INFO_CHANGE,I)}}else if(53==n){if(a>4){var v=_.getUint32(8,!0),R=12;T.length=0;for(var p=0;p<v;p++){var M=_.getUint32(R,!0);R+=4;var P=new Uint8Array(t,R,M-1);R+=M;var y=r(P);T.push(y)}C.emit(C.MIC_INFO_CHANGE,T)}}else if(85==n)console.log("cam_share success");else if(95==n){console.log("get_videoparam success");var N=new Uint8Array(t,8,t.byteLength-8-1),y=r(N);U=y,C.emit(C.VIDEO_INFO_CHANGE,U)}else if(105==n){console.log("get_rtmp_port_success");var N=new Uint8Array(t,8,t.byteLength-8-1),y=r(N);u=y,C.emit(C.RTMP_PORT_CHANGE,u)}else if(109==n){console.log("get_mic_vol success");var N=new Uint8Array(t,8,t.byteLength-8-1),y=r(N);d=y,C.emit(C.MIC_VOL_CHANGE,d)}else if(111<=n&&114>=n){var N=new Uint8Array(t,8,t.byteLength-8),V=r(N);console.log("url->",V)}else if(13==n)C.emit(C.SS_STOP);else{var N=new Uint8Array(t,8,t.byteLength-8),y=r(N);console.log("data ->",y)}}}}Object.defineProperty(t,"__esModule",{value:!0});var E=_(1),l=n(E),C=new l.default,f=["MOV_START_SUC","MOV_START_FAIL","MOV_STOP_SUC","MOV_STOP_FAIL","MOV_PAUSE_SUC","MOV_PAUSE_FAIL","MOV_RESUME_SUC","MOV_RESUME_FAIL","MOV_SEEK_SUC","MOV_SEEK_FAIL","MOV_PROPERTY","SS_START_SUC","SS_START_FAIL","SS_STOP_SUC","SS_STOP_FAIL","REC_START_SUC","REC_START_FAIL","REC_STOP_SUC","REC_STOP_FAIL","REC_PAUSE_SUC","REC_PAUSE_FAIL","REC_RESUME_SUC","REC_RESUME_FAIL","MOV_PLAY_FINISH","MOV_VERSION","SS_VERSION","REC_VERSION","MOV_SELECT_FILE_CANCEL","QAV_LOGIN_SUC","QAV_LOGIN_FAIL","QAV_LOGOUT_SUC","QAV_LOGOUT_FAIL","QAV_ENTERROOM_SUC","QAV_ENTERROOM_FAIL","QAV_LEAVEROOM_SUC","QAV_LEAVEROOM_FAIL","QAV_OPEN_MIC_SUC","QAV_OPEN_MIC_FAIL","QAV_OPEN_MIC_NODEV","QAV_CLOSE_MIC_SUC","QAV_CLOSE_MIC_FAIL","QAV_CLOSE_MIC_NODEV","QAV_OPEN_PLAYER_SUC","QAV_OPEN_PLAYER_FAIL","QAV_OPEN_PLAYER_NODEV","QAV_CLOSE_PLAYER_SUC","QAV_CLOSE_PLAYER_FAIL","QAV_CLOSE_PLAYER_NODEV","QAV_MUTE_AUDIO_SUC","QAV_MUTE_AUDIO_FAIL","QAV_UNMUTE_AUDIO_SUC","QAV_UNMUTE_AUDIO_FAIL","REC_SAVE_FILE_CANCEL","GET_MIC_SUC","GET_MIC_FAIL","DS_START_SUC","DS_START_FAIL","DS_STOP_SUC","DS_STOP_FAIL","AUD_START_SUC","AUD_START_FAIL","AUD_STOP_SUC","AUD_STOP_FAIL","AUD_DATA","SS_DATA","MOV_DATA","PEN_START_SUC","PEN_START_FAIL","PEN_STOP_SUC","PEN_STOP_FAIL","PEN_VERSION","QAV_DEVICE_SUC","QAV_DEVICE_FAIL","CBD_QUERY_SUC","CBD_QUERY_FAIL","CBD_GET_SUC","CBD_GET_FAIL","FILE_GET_SUC","FILE_GET_FAIL","FILE_SET_SUC","FILE_SET_FAIL","RESTART_SUC","RESTART_FAIL","GET_CAM_SUC","GET_CAM_FAIL","CAM_START_SUC","CAM_START_FAIL","CAM_STOP_SUC","CAM_STOP_FAIL","SWITCH_SCENE_SUC","SWITCH_SCENE_FAIL","PUSH_STREAM_FAIL","SHOW_UI_SUC","SET_VIDEO_PARAM_SUC","SET_VIDEO_PARAM_FAIL","GET_VIDEO_PARAM_SUC","GET_VIDEO_PARAM_FAIL","START_RECORD_SUC","START_RECORD_FAIL","STOP_RECORD_SUC","STOP_RECORD_FAIL","START_PUSH_SUC","START_PUSH_FAIL","STOP_PUSH_SUC","STOP_PUSH_FAIL","GET_RTMP_PORT_SUC","GET_RTMP_PORT_FAIL","SET_MIC_VOL_SUC","SET_MIC_VOL_FAIL","GET_MIC_VOL_SUC","GET_MIC_VOL_FAIL","RTMP_CONNECTING","RTMP_CONNECT_SUC","RTMP_CONNECT_FAIL","RTMP_CONNECT_CLOSED"],c=null,O="",I=[],T=[],U="",u="",d="",R=null,p="127.0.0.1",L=8090,g=0;C.infos={movieInfo:c,versionInfo:O,cameraInfo:I,micInfo:T,videoInfo:U,rtmpPort:u,micVol:d},C.MOVIE_INFO_CHANGE="MOVIE_INFO_CHANGE",C.VERSION_INFO_CHANGE="VERSION_INFO_CHANGE",C.CAMERA_INFO_CHANGE="CAMERA_INFO_CHANGE",C.MIC_INFO_CHANGE="MIC_INFO_CHANGE",C.VIDEO_INFO_CHANGE="VIDEO_INFO_CHANGE",C.RTMP_PORT_CHANGE="RTMP_PORT_CHANGE",C.MIC_VOL_CHANGE="MIC_VOL_CHANGE",C.SS_START="SS_START",C.SS_STOP="SS_STOP",C.OPEN="OPEN",C.CLOSE="CLOSE",C.ERROR="ERROR",C.getRTMPPort=function(){o("get_rtmp_port")},C.getMicInfo=function(){o("get_mic")},C.getCamInfo=function(){o("get_cam")},C.getMicVol=function(){o("get_mic_vol")},C.start=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"127.0.0.1",t=arguments[1];p=e,L=t,S()},C.stop=function(){s()},C.startShareScreen=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";o("ss_start",e)},C.stopShareScreen=function(){o("ss_stop")},t.default=C}])});
\ No newline at end of file
diff --git a/dist/test.html b/dist/test.html
new file mode 100644
index 0000000..7b00d78
--- /dev/null
+++ b/dist/test.html
@@ -0,0 +1 @@
+<!DOCTYPE html><html><head><meta charset="UTF-8"><title>UMD PLAYGROUND</title></head><body><div id="stage"></div><script type="text/javascript" src="test.js"></script></body></html>
\ No newline at end of file
diff --git a/dist/test.js b/dist/test.js
new file mode 100644
index 0000000..866a8ce
--- /dev/null
+++ b/dist/test.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.share=t():e.share=t()}(this,function(){return function(e){function t(n){if(_[n])return _[n].exports;var a=_[n]={exports:{},id:n,loaded:!1};return e[n].call(a.exports,a,a.exports,t),a.loaded=!0,a.exports}var _={};return t.m=e,t.c=_,t.p="",t(0)}([function(e,t,_){e.exports=_(3)},function(e,t){"use strict";function _(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var n=function(){function e(e,t){for(var _=0;_<t.length;_++){var n=t[_];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,_,n){return _&&e(t.prototype,_),n&&e(t,n),t}}(),a=function(){function e(){_(this,e),this.MAPS={}}return n(e,[{key:"on",value:function(e,t){if(e&&t){var _=this.MAPS[e];if(!_)return this.MAPS[e]=[t];_.push(t)}}},{key:"off",value:function(e,t){if(e){var _=this.MAPS[e];if(_){if(t)return _.splice(_.indexOf(t),1);_.length=0}}}},{key:"emit",value:function(e,t){if(e){var _=this.MAPS["*"];_&&_.length&&_.forEach(function(_){_(e,t)});var n=this.MAPS[e];n&&n.length&&n.forEach(function(e){e(t)})}}}]),e}();t.default=a},function(e,t,_){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function a(e){var t,_,n,a;n=e.length,t=new Uint8Array(3*n);var r=0;for(_=0;_<n;_++)a=e.charCodeAt(_),a>=1&&a<=127?t[r++]=a:a>2047?(t[r++]=224|a>>12&15,t[r++]=128|a>>6&63,t[r++]=128|a>>0&63):(t[r++]=192|a>>6&31,t[r++]=128|a>>0&63);return new Uint8Array(t.buffer,0,r)}function r(e){var t,_,n,a,r,o;for(t="",n=e.length,_=0;_<n;)switch(a=e[_++],a>>4){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:t+=String.fromCharCode(a);break;case 12:case 13:r=e[_++],t+=String.fromCharCode((31&a)<<6|63&r);break;case 14:r=e[_++],o=e[_++],t+=String.fromCharCode((15&a)<<12|(63&r)<<6|(63&o)<<0)}return t}function o(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",_=new Object;if(_.data_len=0,_.data="",_.name=e,"mov_start"==e)_.type=1;else if("mov_stop"==e)_.type=2;else if("mov_pause"==e){if(_.type=3,pos=t,pos.length>0){_.data_len=4;var n=new ArrayBuffer(_.data_len),r=new Uint32Array(n,0,1);r[0]=parseInt(pos),_.data=new Uint8Array(n,0,4)}}else if("mov_resume"==e)_.type=4;else if("mov_seek"==e){if(_.type=5,pos=t,pos.length>0){_.data_len=4;var n=new ArrayBuffer(_.data_len),r=new Uint32Array(n,0,1);r[0]=parseInt(pos),_.data=new Uint8Array(n,0,4)}}else if("ss_start"==e)_.type=6,_.data=a(t),_.data_len=_.data.length;else if("ss_stop"==e)_.type=7;else if("ss_version"==e)_.type=14;else if("get_mic"==e)_.type=26;else{if("ds_start"==e){_.type=27,_.data_len=536;var n=new ArrayBuffer(_.data_len),o=new Uint32Array(n,0,6);coordstr=t;var A=coordstr.split(",");if(4!=A.length)return;o[0]=parseInt(A[0]),o[1]=parseInt(A[1]),o[2]=parseInt(A[2]),o[3]=parseInt(A[3]);var s=new Uint8Array(n,24,256);window_name=t;for(var S=a(window_name),l=0;l<S.length;l++)s[l]=S[l];o[4]=S.length,o[5]=0;new Uint8Array(n,280,256);return _.data=new Uint8Array(n,0,_.data_len),void i(_)}if("ds_stop"==e)_.type=28;else{if("aud_start"==e){_.type=29,_.data_len=520;var n=new ArrayBuffer(_.data_len),E=new Uint32Array(n,0,1),f=t;E[0]=f.length;var c=new Uint32Array(n,4,1);c[0]=0;for(var C=new Uint8Array(n,8,256),O=a(f),l=0;l<O.length;l++)C[l]=O[l];new Uint8Array(n,264,256);return _.data=new Uint8Array(n,0,_.data_len),void i(_)}if("aud_stop"==e)_.type=30;else if("get_cam"==e)_.type=41;else{if("cam_start"==e){_.type=42,_.data_len=520;var n=new ArrayBuffer(_.data_len),u=new Uint32Array(n,0,1),T=t;u[0]=T.length;var c=new Uint32Array(n,4,1);c[0]=0;for(var I=new Uint8Array(n,8,256),U=a(T),l=0;l<U.length;l++)I[l]=U[l];new Uint8Array(n,264,256);return _.data=new Uint8Array(n,0,_.data_len),void i(_)}"cam_stop"==e?_.type=43:"set_videoparam"==e?(_.type=46,_.data=a(t),_.data_len=_.data.length):"get_videoparam"==e?(_.type=47,_.data=a(t),_.data_len=_.data.length):"start_record"==e?(_.type=48,_.data=a(t),_.data_len=_.data.length):"stop_record"==e?(_.type=49,_.data=a(t),_.data_len=_.data.length):"start_push"==e?(_.type=50,_.data=a(t),_.data_len=_.data.length):"stop_push"==e?(_.type=51,_.data=a(t),_.data_len=_.data.length):"get_rtmp_port"==e?_.type=52:"set_mic_vol"==e?(_.type=53,_.data=a(t),_.data_len=_.data.length):"get_mic_vol"==e&&(_.type=54)}}}i(_)}function i(e){var t=8+e.data_len,_=new ArrayBuffer(t),n=new Uint16Array(_,0,1),a=new Uint8Array(_,2,1),r=new Uint32Array(_,4,1);if(n[0]=e.type,a[0]=0,r[0]=e.data_len,e.data_len>0)for(var o=new Uint8Array(_,8,e.data_len),i=0;i<e.data_len;i++)o[i]=e.data[i];R&&R.send(_)}function A(){try{R&&(R.close(),R=R.onopen=R.onclose=R.onerror=R.onmessage=null,f.emit(f.CLOSE))}catch(e){console.log(e)}}function s(){A()}function S(){R&&A(),R=new WebSocket("ws://"+g+":"+p),L=setTimeout(function(){clearTimeout(L),A()},1500),R.timeout=1500,R.binaryType="arraybuffer",R.onopen=function(){clearTimeout(L),o("get_rtmp_port"),o("get_mic"),o("get_cam"),o("get_mic_vol"),f.emit(f.OPEN)},R.onclose=function(){A()},R.onerror=function(){A()},R.onmessage=function(e){var t=e.data;if("string"==typeof e.data)console.log("on message [string] ignore.");else{var _=new DataView(t),n=_.getUint16(0,!0);console.log("onmessage code->",n);var a=(_.getUint8(2,!0),_.getUint32(4,!0));if(n>=0&&n<c.length){c[n]}if(0==n||6==n||8==n)console.log("mov_start,mov_pause,mov_seek success");else if(10==n){if(a>36){var o=new Uint32Array(t,8,8),i="width:"+o[0]+" height:"+o[1];i="framerate:"+o[2]+" duration:"+o[3],i="playpos:"+o[4]+" filesize:"+o[5],C=i;var A=o[6],s=new Uint8Array(t,40,A),S=r(s);C.filename=S,f.emit(f.MOVIE_INFO_CHANGE,C)}}else if(11==n)console.log("ss_start success"),f.emit(f.SS_START);else if(24<=n&&26>=n){if(a>=4){var l=_.getUint32(8,!0);O=l.toString(),f.emit(f.VERSION_INFO_CHANGE,O)}}else if(55==n)console.log("ds_start success");else if(59==n)console.log("as start success");else if(83==n){if(console.log("get camera sucess"),a>4){var E=_.getUint32(8,!0),R=12;u.length=0;for(var g=0;g<E;g++){var p=_.getUint32(R,!0);R+=4;var L=new Uint8Array(t,R,p-1);R+=p;var y=r(L);u.push(y)}f.emit(f.CAMERA_INFO_CHANGE,u)}}else if(53==n){if(a>4){var P=_.getUint32(8,!0),R=12;T.length=0;for(var g=0;g<P;g++){var v=_.getUint32(R,!0);R+=4;var M=new Uint8Array(t,R,v-1);R+=v;var y=r(M);T.push(y)}f.emit(f.MIC_INFO_CHANGE,T)}}else if(85==n)console.log("cam_share success");else if(95==n){console.log("get_videoparam success");var N=new Uint8Array(t,8,t.byteLength-8-1),y=r(N);I=y,f.emit(f.VIDEO_INFO_CHANGE,I)}else if(105==n){console.log("get_rtmp_port_success");var N=new Uint8Array(t,8,t.byteLength-8-1),y=r(N);U=y,f.emit(f.RTMP_PORT_CHANGE,U)}else if(109==n){console.log("get_mic_vol success");var N=new Uint8Array(t,8,t.byteLength-8-1),y=r(N);d=y,f.emit(f.MIC_VOL_CHANGE,d)}else if(111<=n&&114>=n){var N=new Uint8Array(t,8,t.byteLength-8),V=r(N);console.log("url->",V)}else if(13==n)f.emit(f.SS_STOP);else{var N=new Uint8Array(t,8,t.byteLength-8),y=r(N);console.log("data ->",y)}}}}Object.defineProperty(t,"__esModule",{value:!0});var l=_(1),E=n(l),f=new E.default,c=["MOV_START_SUC","MOV_START_FAIL","MOV_STOP_SUC","MOV_STOP_FAIL","MOV_PAUSE_SUC","MOV_PAUSE_FAIL","MOV_RESUME_SUC","MOV_RESUME_FAIL","MOV_SEEK_SUC","MOV_SEEK_FAIL","MOV_PROPERTY","SS_START_SUC","SS_START_FAIL","SS_STOP_SUC","SS_STOP_FAIL","REC_START_SUC","REC_START_FAIL","REC_STOP_SUC","REC_STOP_FAIL","REC_PAUSE_SUC","REC_PAUSE_FAIL","REC_RESUME_SUC","REC_RESUME_FAIL","MOV_PLAY_FINISH","MOV_VERSION","SS_VERSION","REC_VERSION","MOV_SELECT_FILE_CANCEL","QAV_LOGIN_SUC","QAV_LOGIN_FAIL","QAV_LOGOUT_SUC","QAV_LOGOUT_FAIL","QAV_ENTERROOM_SUC","QAV_ENTERROOM_FAIL","QAV_LEAVEROOM_SUC","QAV_LEAVEROOM_FAIL","QAV_OPEN_MIC_SUC","QAV_OPEN_MIC_FAIL","QAV_OPEN_MIC_NODEV","QAV_CLOSE_MIC_SUC","QAV_CLOSE_MIC_FAIL","QAV_CLOSE_MIC_NODEV","QAV_OPEN_PLAYER_SUC","QAV_OPEN_PLAYER_FAIL","QAV_OPEN_PLAYER_NODEV","QAV_CLOSE_PLAYER_SUC","QAV_CLOSE_PLAYER_FAIL","QAV_CLOSE_PLAYER_NODEV","QAV_MUTE_AUDIO_SUC","QAV_MUTE_AUDIO_FAIL","QAV_UNMUTE_AUDIO_SUC","QAV_UNMUTE_AUDIO_FAIL","REC_SAVE_FILE_CANCEL","GET_MIC_SUC","GET_MIC_FAIL","DS_START_SUC","DS_START_FAIL","DS_STOP_SUC","DS_STOP_FAIL","AUD_START_SUC","AUD_START_FAIL","AUD_STOP_SUC","AUD_STOP_FAIL","AUD_DATA","SS_DATA","MOV_DATA","PEN_START_SUC","PEN_START_FAIL","PEN_STOP_SUC","PEN_STOP_FAIL","PEN_VERSION","QAV_DEVICE_SUC","QAV_DEVICE_FAIL","CBD_QUERY_SUC","CBD_QUERY_FAIL","CBD_GET_SUC","CBD_GET_FAIL","FILE_GET_SUC","FILE_GET_FAIL","FILE_SET_SUC","FILE_SET_FAIL","RESTART_SUC","RESTART_FAIL","GET_CAM_SUC","GET_CAM_FAIL","CAM_START_SUC","CAM_START_FAIL","CAM_STOP_SUC","CAM_STOP_FAIL","SWITCH_SCENE_SUC","SWITCH_SCENE_FAIL","PUSH_STREAM_FAIL","SHOW_UI_SUC","SET_VIDEO_PARAM_SUC","SET_VIDEO_PARAM_FAIL","GET_VIDEO_PARAM_SUC","GET_VIDEO_PARAM_FAIL","START_RECORD_SUC","START_RECORD_FAIL","STOP_RECORD_SUC","STOP_RECORD_FAIL","START_PUSH_SUC","START_PUSH_FAIL","STOP_PUSH_SUC","STOP_PUSH_FAIL","GET_RTMP_PORT_SUC","GET_RTMP_PORT_FAIL","SET_MIC_VOL_SUC","SET_MIC_VOL_FAIL","GET_MIC_VOL_SUC","GET_MIC_VOL_FAIL","RTMP_CONNECTING","RTMP_CONNECT_SUC","RTMP_CONNECT_FAIL","RTMP_CONNECT_CLOSED"],C=null,O="",u=[],T=[],I="",U="",d="",R=null,g="127.0.0.1",p=8090,L=0;f.infos={movieInfo:C,versionInfo:O,cameraInfo:u,micInfo:T,videoInfo:I,rtmpPort:U,micVol:d},f.MOVIE_INFO_CHANGE="MOVIE_INFO_CHANGE",f.VERSION_INFO_CHANGE="VERSION_INFO_CHANGE",f.CAMERA_INFO_CHANGE="CAMERA_INFO_CHANGE",f.MIC_INFO_CHANGE="MIC_INFO_CHANGE",f.VIDEO_INFO_CHANGE="VIDEO_INFO_CHANGE",f.RTMP_PORT_CHANGE="RTMP_PORT_CHANGE",f.MIC_VOL_CHANGE="MIC_VOL_CHANGE",f.SS_START="SS_START",f.SS_STOP="SS_STOP",f.OPEN="OPEN",f.CLOSE="CLOSE",f.ERROR="ERROR",f.getRTMPPort=function(){o("get_rtmp_port")},f.getMicInfo=function(){o("get_mic")},f.getCamInfo=function(){o("get_cam")},f.getMicVol=function(){o("get_mic_vol")},f.start=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"127.0.0.1",t=arguments[1];g=e,p=t,S()},f.stop=function(){s()},f.startShareScreen=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";o("ss_start",e)},f.stopShareScreen=function(){o("ss_stop")},t.default=f},function(e,t,_){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function a(){console.log("发起屏幕"),i.default.startShareScreen("rtmp://123.56.205.116/live/alexwang")}function r(){console.log("关闭屏幕"),i.default.stopShareScreen()}var o=_(2),i=n(o);i.default.on(i.default.SS_START,function(){console.log("SS_START"),setTimeout(function(){r()},200)}),i.default.on(i.default.SS_STOP,function(){console.log("SS_STOP"),setTimeout(function(){a()},500)}),i.default.on(i.default.ERROR,function(){console.log("ERROR")}),i.default.on(i.default.CLOSE,function(){console.log("CLOSE")}),i.default.on(i.default.OPEN,function(){console.log("OPEN"),a()}),i.default.start("192.168.222.216",8090)}])});
\ No newline at end of file
diff --git a/package.json b/package.json
index 6de27dd..3b48ea2 100644
--- a/package.json
+++ b/package.json
@@ -15,7 +15,9 @@
   ],
   "author": "AlexWang",
   "license": "MIT",
-  "dependencies": {},
+  "dependencies": {
+    "buffer": "^5.0.6"
+  },
   "wbp": {
     "project": "umd",
     "entries": {
@@ -25,4 +27,4 @@
     "source": "src/",
     "build": "dist/"
   }
-}
\ No newline at end of file
+}
diff --git a/src/Emiter.js b/src/Emiter.js
new file mode 100644
index 0000000..a72e5cc
--- /dev/null
+++ b/src/Emiter.js
@@ -0,0 +1,59 @@
+// //////////////////////////////////////////////////////////////////////////////
+//
+//  Copyright (C) 2016-present  All Rights Reserved.
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Github Home: https://github.com/AlexWang1987
+//  Author: AlexWang
+//  Date: 2017-05-20 11:55:44
+//  QQ Email: 1669499355@qq.com
+//  Last Modified time: 2017-05-20 11:55:45
+//  Description: saas-Emiter
+//
+// //////////////////////////////////////////////////////////////////////////////
+
+export default class Emiter {
+  constructor() {
+    this.MAPS = {};
+  }
+  on(eid, elistener) {
+    if (eid && elistener) {
+      let stub = this.MAPS[eid];
+      if (!stub) {
+        return this.MAPS[eid] = [elistener];
+      }
+      stub.push(elistener);
+    }
+  }
+  off(eid, elistener) {
+    if (eid) {
+      let stub = this.MAPS[eid];
+      if (stub) {
+        if (elistener) {
+          return stub.splice(stub.indexOf(elistener), 1);
+        }
+        stub.length = 0;
+      }
+    }
+  }
+  emit(eid, data) {
+    if (eid) {
+      //eid=* broadcast
+      let asteriskStub = this.MAPS['*'];
+      if (asteriskStub && asteriskStub.length) {
+        asteriskStub.forEach(function (elistener) {
+          elistener(eid, data);
+        })
+      }
+
+      // eid= normal
+      let stub = this.MAPS[eid];
+      if (stub && stub.length) {
+        stub.forEach(function (elistener) {
+          elistener(data);
+        });
+      }
+    }
+  }
+}
diff --git a/src/Loger.js b/src/Loger.js
new file mode 100644
index 0000000..5ac938c
--- /dev/null
+++ b/src/Loger.js
@@ -0,0 +1,82 @@
+// //////////////////////////////////////////////////////////////////////////////
+//
+//  Copyright (C) 2016-present  All Rights Reserved.
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Github Home: https://github.com/AlexWang1987
+//  Author: AlexWang
+//  Date: 2016-08-27 22:58:47
+//  QQ Email: 1669499355@qq.com
+//  Last Modified time: 2017-05-20 11:56:07
+//  Description: LiveClass-Loger
+//
+// //////////////////////////////////////////////////////////////////////////////
+
+class Loger {
+  constructor(info) {
+    this.info = info || '';
+    this.id = this.initId();
+  }
+
+  initId() {
+    const infoType = this.info.constructor.name.toLowerCase();
+    if (infoType === 'string') {
+      return this.info;
+    }
+    if (infoType === 'object') {
+      return this.info.mid || '';
+    }
+    return '';
+  }
+
+  log(...msg) {
+    this._log(Loger.LOG, msg);
+  }
+
+  warn(...msg) {
+    this._log(Loger.WARN, msg);
+  }
+
+  error(...msg) {
+    this._log(Loger.ERROR, msg);
+  }
+
+  _log(type, msg) {
+    msg = JSON.stringify(msg);
+
+    let logMsg = `${this.id} -> ${msg}`;
+    if (type >= Loger.logLevel) {
+      switch (type) {
+      case Loger.LOG:
+        console.log(logMsg);
+        break;
+      case Loger.WARN:
+        console.warn(logMsg);
+        break;
+      case Loger.ERROR:
+        console.error(logMsg);
+        break;
+      }
+    }
+  }
+}
+
+Loger.LOG = 0;
+Loger.WARN = 1;
+Loger.ERROR = 2;
+Loger.NO = Infinity;
+Loger.logLevel = Loger.LOG;
+
+export default {
+  getLoger: function getLoger(info) {
+    return new Loger(info);
+  },
+  setLogLevel: function setLogLevel(logLevel) {
+    Loger.logLevel = logLevel;
+  },
+  LOG: Loger.LOG,
+  WARN: Loger.WARN,
+  ERROR: Loger.ERROR,
+  NO: Loger.NO,
+};
diff --git a/src/Socket.js b/src/Socket.js
new file mode 100644
index 0000000..28113e0
--- /dev/null
+++ b/src/Socket.js
@@ -0,0 +1,153 @@
+// //////////////////////////////////////////////////////////////////////////////
+//
+//  Copyright (C) 2016-present
+//  All Rights Reserved.
+//
+//  Author: AlexWang
+//  Date: 2016-08-27 21:40:49
+//  Last Modified by:   AlexWang
+//  Last Modified time: 2017-05-20 12:38:31
+//  QQ Email: 1669499355@qq.com
+//  Description: 底层Socket管理器,保持一直在线及异常重连.
+//
+// //////////////////////////////////////////////////////////////////////////////
+
+import Emiter from 'Emiter';
+import Loger from 'Loger';
+let loger = Loger.getLoger('EverSocket');
+
+class EverSocket extends Emiter {
+  constructor() {
+    super();
+    this._connected = false;
+    this._lastActiveTime = 0;
+    this._enableEverSocket = false;
+  }
+
+  begin(ip, port) {
+    loger.log('开始WebSocket应用.');
+    this._enableEverSocket = true;
+    this.wsURL = 'ws://' + ip + ':' + port;
+    this._newConnection();
+  }
+
+  end() {
+    loger.log('停止WebSocket应用.');
+    this._clear();
+  }
+
+  get connected() {
+    return this._connected;
+  }
+
+  send(data) {
+    if (this._connected) {
+      loger.log('SEND MESSAGE---->', data);
+      this.websocket.send(data);
+    } else {
+      loger.warn('WebSocket未建立连接.消息忽略');
+    }
+  }
+
+  _setConnected(isConn = true) {
+    this._connected = isConn;
+    if (this._connected) {
+      this.emit(EverSocket.OPEN);
+    } else {
+      this.emit(EverSocket.CLOSED);
+    }
+  }
+
+  _newConnection() {
+    this.websocket = new WebSocket(this.wsURL);
+    this.websocket.binaryType = 'arraybuffer';
+    this.websocket.onopen = this._onOpen.bind(this);
+    this.websocket.onclose = this._onClose.bind(this);
+    this.websocket.onerror = this._onError.bind(this);
+    this.websocket.onmessage = this._onMessage.bind(this);
+  }
+
+  _reConnection() {
+    this._clear();
+    this.reConnectionTimeout = window.setTimeout(() => {
+      loger.log('WebSocket重新建立.');
+      window.clearTimeout(this.reConnectionTimeout);
+      this._newConnection();
+    }, EverSocket.RECONN_INTERVAL);
+  }
+
+  _clear() {
+    loger.log('WebSocket,Timers销毁');
+    window.clearInterval(this.pingTimer);
+    window.clearInterval(this.pongTimer);
+    this.websocket.onopen = undefined;
+    this.websocket.onclose = undefined;
+    this.websocket.onerror = undefined;
+    this.websocket.onmessage = undefined;
+    try {
+      this.websocket.close();
+    } catch (e) {
+      loger.log('ignore errors');
+    }
+    this.websocket = undefined;
+    this._enableEverSocket = false;
+    this._setConnected(false);
+  }
+
+  _onOpen() {
+    loger.log('WebSocket建立成功', this.wsURL);
+    //this.pingTimer = window.setInterval(this._sendPingHandler.bind(this), EverSocket.PING_INTERVAL);
+    //this.pongTimer = window.setInterval(this._checkPongHandler.bind(this), EverSocket.PONG_INTERVAL);
+    this._setConnected();
+  }
+
+  _onClose(closeEvent) {
+    loger.log(`WebSocket连接断开 CODE:${closeEvent.code} REASON:${closeEvent.reason} CLEAN: ${closeEvent.wasClean}`, this.wsURL);
+    this._reConnection();
+  }
+
+  _onError() {
+    loger.log('WebSocket错误出现');
+    this._connected = false;
+    this._reConnection();
+  }
+
+  _onMessage(messageEvent) {
+    loger.log('<----RECEIVE MESSAGE');
+    this._lastActiveTime = Date.now();
+    const bufferData = messageEvent.data;
+    if (bufferData.byteLength > 0) {
+      this.emit(EverSocket.MESSAGE, bufferData);
+    }
+  }
+
+  _sendPingHandler() {
+    if (this._connected) {
+      this.websocket.send(new ArrayBuffer);
+    } else {
+      this._reConnection();
+    }
+  }
+
+  _checkPongHandler() {
+    let pongTime = Date.now();
+    if (this._lastActiveTime &&
+      this._lastActiveTime >= pongTime - EverSocket.PONG_INTERVAL &&
+      this._lastActiveTime <= pongTime
+    ) {} else {
+      loger.warn('---服务器PINGPONG超时-----');
+      this._reConnection();
+    }
+  }
+}
+
+EverSocket.prototype.PONG_INTERVAL = EverSocket.PONG_INTERVAL = 5000;
+EverSocket.prototype.PING_INTERVAL = EverSocket.PING_INTERVAL = 3000;
+EverSocket.prototype.RECONN_INTERVAL = EverSocket.RECONN_INTERVAL = 2000;
+EverSocket.prototype.CONNECTING = EverSocket.CONNECTING = 0;
+EverSocket.prototype.OPEN = EverSocket.OPEN = 1;
+EverSocket.prototype.CLOSING = EverSocket.CLOSING = 2;
+EverSocket.prototype.CLOSED = EverSocket.CLOSED = 3;
+EverSocket.prototype.MESSAGE = EverSocket.MESSAGE = 4;
+
+export default new EverSocket();
diff --git a/src/main.js b/src/main.js
index 90fbf5d..5397191 100644
--- a/src/main.js
+++ b/src/main.js
@@ -6,15 +6,592 @@
 //
 //  Github Home: https://github.com/AlexWang1987
 //  Author: AlexWang
-//  Date: 2017-03-17 11:13:14
+//  Date: 2017-05-20 16:54:13
 //  QQ Email: 1669499355@qq.com
-//  Last Modified time: 2017-03-17 11:13:36
-//  Description: wbp-init-umd-main
+//  Last Modified time: 2017-05-26 18:44:59
+//  Description: saas-main
 //
 // //////////////////////////////////////////////////////////////////////////////
 
-// only for hot reload
-if (module && module.hot) {
-  module.hot.accept();
+import Emiter from './Emiter.js';
+const e = new Emiter();
+
+function utf16to8(str) {
+  var out, i, len, c;
+
+  len = str.length;
+  out = new Uint8Array(len * 3);
+  var utf8len = 0;
+  for (i = 0; i < len; i++) {
+    c = str.charCodeAt(i);
+    if ((c >= 0x0001) && (c <= 0x007F)) {
+      out[utf8len++] = c;
+    } else if (c > 0x07FF) {
+      out[utf8len++] = (0xE0 | ((c >> 12) & 0x0F));
+      out[utf8len++] = (0x80 | ((c >> 6) & 0x3F));
+      out[utf8len++] = (0x80 | ((c >> 0) & 0x3F));
+    } else {
+      out[utf8len++] = (0xC0 | ((c >> 6) & 0x1F));
+      out[utf8len++] = (0x80 | ((c >> 0) & 0x3F));
+    }
+  }
+  return new Uint8Array(out.buffer, 0, utf8len);
+}
+
+function utf8to16(str) {
+  var out, i, len, c;
+  var char2, char3;
+
+  out = "";
+  len = str.length;
+  i = 0;
+  while (i < len) {
+    c = str[i++];
+    switch (c >> 4) {
+    case 0:
+    case 1:
+    case 2:
+    case 3:
+    case 4:
+    case 5:
+    case 6:
+    case 7:
+      // 0xxxxxxx
+      out += String.fromCharCode(c);
+      break;
+    case 12:
+    case 13:
+      // 110x xxxx   10xx xxxx
+      char2 = str[i++];
+      out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
+      break;
+    case 14:
+      // 1110 xxxx  10xx xxxx  10xx xxxx
+      char2 = str[i++];
+      char3 = str[i++];
+      out += String.fromCharCode(((c & 0x0F) << 12) |
+        ((char2 & 0x3F) << 6) |
+        ((char3 & 0x3F) << 0));
+      break;
+    }
+  }
+
+  return out;
+}
+
+const CODE = [
+  "MOV_START_SUC",
+  "MOV_START_FAIL",
+  "MOV_STOP_SUC",
+  "MOV_STOP_FAIL",
+  "MOV_PAUSE_SUC",
+  "MOV_PAUSE_FAIL",
+  "MOV_RESUME_SUC",
+  "MOV_RESUME_FAIL",
+  "MOV_SEEK_SUC",
+  "MOV_SEEK_FAIL",
+  "MOV_PROPERTY",
+  "SS_START_SUC",
+  "SS_START_FAIL",
+  "SS_STOP_SUC",
+  "SS_STOP_FAIL",
+  "REC_START_SUC",
+  "REC_START_FAIL",
+  "REC_STOP_SUC",
+  "REC_STOP_FAIL",
+  "REC_PAUSE_SUC",
+  "REC_PAUSE_FAIL",
+  "REC_RESUME_SUC",
+  "REC_RESUME_FAIL",
+  "MOV_PLAY_FINISH",
+  "MOV_VERSION",
+  "SS_VERSION",
+  "REC_VERSION",
+  "MOV_SELECT_FILE_CANCEL",
+  "QAV_LOGIN_SUC",
+  "QAV_LOGIN_FAIL",
+  "QAV_LOGOUT_SUC",
+  "QAV_LOGOUT_FAIL",
+  "QAV_ENTERROOM_SUC",
+  "QAV_ENTERROOM_FAIL",
+  "QAV_LEAVEROOM_SUC",
+  "QAV_LEAVEROOM_FAIL",
+  "QAV_OPEN_MIC_SUC",
+  "QAV_OPEN_MIC_FAIL",
+  "QAV_OPEN_MIC_NODEV",
+  "QAV_CLOSE_MIC_SUC",
+  "QAV_CLOSE_MIC_FAIL",
+  "QAV_CLOSE_MIC_NODEV",
+  "QAV_OPEN_PLAYER_SUC",
+  "QAV_OPEN_PLAYER_FAIL",
+  "QAV_OPEN_PLAYER_NODEV",
+  "QAV_CLOSE_PLAYER_SUC",
+  "QAV_CLOSE_PLAYER_FAIL",
+  "QAV_CLOSE_PLAYER_NODEV",
+  "QAV_MUTE_AUDIO_SUC",
+  "QAV_MUTE_AUDIO_FAIL",
+  "QAV_UNMUTE_AUDIO_SUC",
+  "QAV_UNMUTE_AUDIO_FAIL",
+  "REC_SAVE_FILE_CANCEL",
+  "GET_MIC_SUC",
+  "GET_MIC_FAIL",
+  "DS_START_SUC",
+  "DS_START_FAIL",
+  "DS_STOP_SUC",
+  "DS_STOP_FAIL",
+  "AUD_START_SUC",
+  "AUD_START_FAIL",
+  "AUD_STOP_SUC",
+  "AUD_STOP_FAIL",
+  "AUD_DATA",
+  "SS_DATA",
+  "MOV_DATA",
+  "PEN_START_SUC",
+  "PEN_START_FAIL",
+  "PEN_STOP_SUC",
+  "PEN_STOP_FAIL",
+  "PEN_VERSION",
+  "QAV_DEVICE_SUC",
+  "QAV_DEVICE_FAIL",
+  "CBD_QUERY_SUC",
+  "CBD_QUERY_FAIL",
+  "CBD_GET_SUC",
+  "CBD_GET_FAIL",
+  "FILE_GET_SUC",
+  "FILE_GET_FAIL",
+  "FILE_SET_SUC",
+  "FILE_SET_FAIL",
+  "RESTART_SUC",
+  "RESTART_FAIL",
+  "GET_CAM_SUC",
+  "GET_CAM_FAIL",
+  "CAM_START_SUC",
+  "CAM_START_FAIL",
+  "CAM_STOP_SUC",
+  "CAM_STOP_FAIL",
+  "SWITCH_SCENE_SUC",
+  "SWITCH_SCENE_FAIL",
+  "PUSH_STREAM_FAIL",
+  "SHOW_UI_SUC",
+  "SET_VIDEO_PARAM_SUC",
+  "SET_VIDEO_PARAM_FAIL",
+  "GET_VIDEO_PARAM_SUC",
+  "GET_VIDEO_PARAM_FAIL",
+  "START_RECORD_SUC",
+  "START_RECORD_FAIL",
+  "STOP_RECORD_SUC",
+  "STOP_RECORD_FAIL",
+  "START_PUSH_SUC",
+  "START_PUSH_FAIL",
+  "STOP_PUSH_SUC",
+  "STOP_PUSH_FAIL",
+  "GET_RTMP_PORT_SUC",
+  "GET_RTMP_PORT_FAIL",
+  "SET_MIC_VOL_SUC",
+  "SET_MIC_VOL_FAIL",
+  "GET_MIC_VOL_SUC",
+  "GET_MIC_VOL_FAIL",
+  "RTMP_CONNECTING",
+  "RTMP_CONNECT_SUC",
+  "RTMP_CONNECT_FAIL",
+  "RTMP_CONNECT_CLOSED"
+];
+
+function sendCommand(cmdName, cmdParams = '') {
+  var cmd = new Object();
+  cmd.data_len = 0;
+  cmd.data = "";
+  cmd.name = cmdName;
+
+  if (cmdName == "mov_start") {
+    cmd.type = 1;
+  } else if (cmdName == "mov_stop") {
+    cmd.type = 2;
+  } else if (cmdName == "mov_pause") {
+    cmd.type = 3;
+    // var pos = document.getElementById("mov_pos").value;
+    pos = cmdParams;
+    if (pos.length > 0) {
+      cmd.data_len = 4;
+      var buffer = new ArrayBuffer(cmd.data_len);
+      var Uint32param = new Uint32Array(buffer, 0, 1);
+      Uint32param[0] = parseInt(pos);
+      cmd.data = new Uint8Array(buffer, 0, 4);
+    }
+  } else if (cmdName == "mov_resume") {
+    cmd.type = 4;
+  } else if (cmdName == "mov_seek") {
+    cmd.type = 5;
+    // var pos = document.getElementById("mov_pos").value;
+    pos = cmdParams;
+    if (pos.length > 0) {
+      cmd.data_len = 4;
+      var buffer = new ArrayBuffer(cmd.data_len);
+      var Uint32param = new Uint32Array(buffer, 0, 1);
+      Uint32param[0] = parseInt(pos);
+      cmd.data = new Uint8Array(buffer, 0, 4);
+    }
+  } else if (cmdName == "ss_start") {
+    cmd.type = 6;
+    // var param = document.getElementById("ss_start_input");
+    // param = cmdParams;
+    cmd.data = utf16to8(cmdParams);
+    cmd.data_len = cmd.data.length;
+  } else if (cmdName == "ss_stop") {
+    cmd.type = 7;
+  } else if (cmdName == "ss_version") {
+    cmd.type = 14;
+  } else if (cmdName == "get_mic") {
+    cmd.type = 26;
+  } else if (cmdName == "ds_start") {
+    cmd.type = 27;
+    cmd.data_len = 4 * 6 + 256 + 256;
+    var buffer = new ArrayBuffer(cmd.data_len);
+    var int32param = new Uint32Array(buffer, 0, 6);
+    // var coordstr = document.getElementById("ds_start_coord").value;
+    coordstr = cmdParams;
+    var coordarray = coordstr.split(",");
+    if (coordarray.length == 4) {
+      int32param[0] = parseInt(coordarray[0]);
+      int32param[1] = parseInt(coordarray[1]);
+      int32param[2] = parseInt(coordarray[2]);
+      int32param[3] = parseInt(coordarray[3]);
+    } else {
+      //promopt error parameter
+      return; //
+    }
+
+    var window_name_buffer = new Uint8Array(buffer, 24, 256);
+    // var window_name = document.getElementById("ds_start_window_name").value;
+    window_name = cmdParams;
+    //var window_name_array = new TextEncoder("utf-8").encode(window_name);
+    var window_name_array = utf16to8(window_name);
+    for (var i = 0; i < window_name_array.length; i++) {
+      window_name_buffer[i] = window_name_array[i];
+    }
+
+    int32param[4] = window_name_array.length;
+    int32param[5] = 0;
+
+    var url_name = new Uint8Array(buffer, 24 + 256, 256); //todo: set push url
+    cmd.data = new Uint8Array(buffer, 0, cmd.data_len);
+    _sendCommand(cmd);
+    return;
+  } else if (cmdName == "ds_stop") {
+    cmd.type = 28;
+  } else if (cmdName == "aud_start") {
+    cmd.type = 29;
+    cmd.data_len = 4 + 4 + 256 + 256;
+    var buffer = new ArrayBuffer(cmd.data_len);
+    var mic_name_len = new Uint32Array(buffer, 0, 1);
+    var sel_mic_name = cmdParams;
+    mic_name_len[0] = sel_mic_name.length;
+    var urlname_len = new Uint32Array(buffer, 4, 1);
+    urlname_len[0] = 0;
+    var mic_name = new Uint8Array(buffer, 8, 256);
+    var mic_name_array = utf16to8(sel_mic_name);
+    for (var i = 0; i < mic_name_array.length; i++) {
+      mic_name[i] = mic_name_array[i];
+    }
+    var url_name = new Uint8Array(buffer, 8 + 256, 256);
+    cmd.data = new Uint8Array(buffer, 0, cmd.data_len);
+    _sendCommand(cmd);
+    return;
+  } else if (cmdName == "aud_stop") {
+    cmd.type = 30;
+  } else if (cmdName == "get_cam") {
+    cmd.type = 41;
+  } else if (cmdName == "cam_start") {
+    cmd.type = 42;
+    cmd.data_len = 4 + 4 + 256 + 256;
+    var buffer = new ArrayBuffer(cmd.data_len);
+    var cam_name_len = new Uint32Array(buffer, 0, 1);
+    var sel_cam_name = cmdParams;
+    cam_name_len[0] = sel_cam_name.length;
+    var urlname_len = new Uint32Array(buffer, 4, 1);
+    urlname_len[0] = 0;
+    var cam_name = new Uint8Array(buffer, 8, 256);
+    //var cam_name_array = new TextEncoder("utf-8").encode(sel_cam_name);
+    var cam_name_array = utf16to8(sel_cam_name);
+    for (var i = 0; i < cam_name_array.length; i++) {
+      cam_name[i] = cam_name_array[i];
+    }
+    var url_name = new Uint8Array(buffer, 8 + 256, 256); //todo: set push url
+    cmd.data = new Uint8Array(buffer, 0, cmd.data_len);
+    _sendCommand(cmd);
+    return;
+  } else if (cmdName == "cam_stop") {
+    cmd.type = 43;
+  } else if (cmdName == "set_videoparam") {
+    cmd.type = 46;
+    cmd.data = utf16to8(cmdParams);
+    cmd.data_len = cmd.data.length;
+  } else if (cmdName == "get_videoparam") {
+    cmd.type = 47;
+    cmd.data = utf16to8(cmdParams);
+    cmd.data_len = cmd.data.length;
+  } else if (cmdName == "start_record") {
+    cmd.type = 48;
+    cmd.data = utf16to8(cmdParams);
+    cmd.data_len = cmd.data.length;
+  } else if (cmdName == "stop_record") {
+    cmd.type = 49;
+    cmd.data = utf16to8(cmdParams);
+    cmd.data_len = cmd.data.length;
+  } else if (cmdName == "start_push") {
+    cmd.type = 50;
+    cmd.data = utf16to8(cmdParams);
+    cmd.data_len = cmd.data.length;
+  } else if (cmdName == "stop_push") {
+    cmd.type = 51;
+    cmd.data = utf16to8(cmdParams);
+    cmd.data_len = cmd.data.length;
+  } else if (cmdName == "get_rtmp_port") {
+    cmd.type = 52;
+  } else if (cmdName == "set_mic_vol") {
+    cmd.type = 53;
+    cmd.data = utf16to8(cmdParams);
+    cmd.data_len = cmd.data.length;
+  } else if (cmdName == "get_mic_vol") {
+    cmd.type = 54;
+  }
+  _sendCommand(cmd);
+}
+
+function _sendCommand(wsCmd) {
+  var cmd_buf_len = 2 + 1 * 2 + 4 + wsCmd.data_len;
+  var buffer = new ArrayBuffer(cmd_buf_len);
+  var cmd = new Uint16Array(buffer, 0, 1);
+  var byte_order = new Uint8Array(buffer, 2, 1);
+  var data_len = new Uint32Array(buffer, 4, 1);
+
+  cmd[0] = wsCmd.type;
+  byte_order[0] = 0;
+  data_len[0] = wsCmd.data_len;
+
+  if (wsCmd.data_len > 0) {
+    var data_buf = new Uint8Array(buffer, 8, wsCmd.data_len);
+    for (var i = 0; i < wsCmd.data_len; i++) {
+      data_buf[i] = wsCmd.data[i];
+    }
+  }
+
+  if (ws) ws.send(buffer);
+}
+
+let movieInfo = null;
+let versionInfo = '';
+let cameraInfo = [];
+let micInfo = [];
+let videoInfo = '';
+let rtmpPort = '';
+let micVol = '';
+let ws = null;
+let host = '127.0.0.1';
+let port = 8090;
+let wstimer = 0;
+
+function clear() {
+  try {
+    if (ws) {
+      ws.close();
+      ws = ws.onopen = ws.onclose = ws.onerror = ws.onmessage = null;
+      e.emit(e.CLOSE);
+    }
+  } catch (er) {
+    console.log(er);
+  }
+}
+
+function stop() {
+  clear();
+}
+
+function start() {
+  if (ws) {
+    clear();
+  }
+  ws = new WebSocket('ws://' + host + ':' + port);
+  wstimer = setTimeout(() => {
+    clearTimeout(wstimer);
+    clear();
+  }, 1500)
+  ws.timeout = 1500;
+  ws.binaryType = 'arraybuffer';
+  ws.onopen = () => {
+    clearTimeout(wstimer);
+    sendCommand("get_rtmp_port");
+    sendCommand("get_mic");
+    sendCommand("get_cam");
+    sendCommand("get_mic_vol");
+    e.emit(e.OPEN);
+  }
+
+  ws.onclose = () => {
+    clear();
+  };
+
+  ws.onerror = () => {
+    clear();
+  }
+
+  ws.onmessage = (evt) => {
+    const msg = evt.data;
+    if (typeof (evt.data) === "string") {
+      console.log('on message [string] ignore.');
+    } else {
+      var dv = new DataView(msg);
+      var result = dv.getUint16(0, true);
+      console.log('onmessage code->', result);
+      var byte_order = dv.getUint8(2, true);
+      var data_len = dv.getUint32(4, true);
+      if (result >= 0 && result < CODE.length) {
+        var resultString = CODE[result];
+      } else {}
+      if (0 == result || 6 == result || 8 == result) { //mov_start,mov_pause,mov_seek success
+        console.log('mov_start,mov_pause,mov_seek success');
+        //playRTMPStream("rtmp://127.0.0.1:" + rtmp_port + "/live/ms");
+      } else if (10 == result) { //movie property
+        if (data_len > 7 * 4 + 8) {
+          var uint32params = new Uint32Array(msg, 8, 8);
+          var info = "width:" + uint32params[0] + " height:" + uint32params[1];
+          info = "framerate:" + uint32params[2] + " duration:" + uint32params[3];
+          info = "playpos:" + uint32params[4] + " filesize:" + uint32params[5];
+          movieInfo = info;
+          var file_name_len = uint32params[6];
+          var file_name = new Uint8Array(msg, 40, file_name_len);
+          var file_name_string = utf8to16(file_name);
+          movieInfo.filename = file_name_string;
+
+          e.emit(e.MOVIE_INFO_CHANGE, movieInfo);
+        }
+      } else if (11 == result) {
+        console.log('ss_start success');
+        e.emit(e.SS_START);
+      } else if (24 <= result && 26 >= result) {
+        if (data_len >= 4) {
+          var version = dv.getUint32(8, true);
+          versionInfo = version.toString();
+          e.emit(e.VERSION_INFO_CHANGE, versionInfo);
+        }
+      } else if (55 == result) { //ds_start success
+        console.log('ds_start success');
+        //playRTMPStream("rtmp://127.0.0.1:" + rtmp_port + "/live/ds");
+      } else if (59 == result) { //as start success
+        console.log('as start success');
+        //playRTMPStream("rtmp://127.0.0.1:" + rtmp_port + "/live/as");
+      } else if (result == 83) { //get camera sucess
+        console.log('get camera sucess');
+        if (data_len > 4) {
+          var cam_num = dv.getUint32(8, true);
+          var offset = 12;
+          cameraInfo.length = 0;
+          for (var i = 0; i < cam_num; i++) {
+            var cam_name_len = dv.getUint32(offset, true);
+            offset += 4;
+            var cam_name = new Uint8Array(msg, offset, cam_name_len - 1);
+            offset += cam_name_len;
+            //var data_sting =  new TextDecoder("utf-8").decode(cam_name);
+            var data_sting = utf8to16(cam_name);
+            cameraInfo.push(data_sting)
+          }
+          e.emit(e.CAMERA_INFO_CHANGE, cameraInfo);
+        }
+      } else if (53 == result) { //get mic success
+        if (data_len > 4) {
+          var mic_num = dv.getUint32(8, true);
+          var offset = 12;
+          micInfo.length = 0;
+          for (var i = 0; i < mic_num; i++) {
+            var mic_name_len = dv.getUint32(offset, true);
+            offset += 4;
+            var mic_name = new Uint8Array(msg, offset, mic_name_len - 1);
+            offset += mic_name_len;
+            //var data_sting =  new TextDecoder("utf-8").decode(mic_name);
+            var data_sting = utf8to16(mic_name);
+            micInfo.push(data_sting);
+          }
+          e.emit(e.MIC_INFO_CHANGE, micInfo);
+        }
+      } else if (85 == result) { //cam_share success
+        console.log('cam_share success');
+        //playRTMPStream("rtmp://127.0.0.1:" + rtmp_port + "/live/cs");
+      } else if (95 == result) { //get_videoparam success
+        console.log('get_videoparam success');
+        var data = new Uint8Array(msg, 8, msg.byteLength - 8 - 1);
+        //var data_sting =  new TextDecoder("utf-8").decode(data);
+        var data_sting = utf8to16(data);
+        videoInfo = data_sting;
+        e.emit(e.VIDEO_INFO_CHANGE, videoInfo);
+      } else if (105 == result) { //get_rtmp_port_success
+        console.log('get_rtmp_port_success');
+        var data = new Uint8Array(msg, 8, msg.byteLength - 8 - 1);
+        //var data_sting =  new TextDecoder("utf-8").decode(data);
+        var data_sting = utf8to16(data);
+        rtmpPort = data_sting;
+        e.emit(e.RTMP_PORT_CHANGE, rtmpPort);
+      } else if (109 == result) { //get_mic_vol success
+        console.log('get_mic_vol success');
+        var data = new Uint8Array(msg, 8, msg.byteLength - 8 - 1);
+        //var data_sting =  new TextDecoder("utf-8").decode(data);
+        var data_sting = utf8to16(data);
+        micVol = data_sting;
+        e.emit(e.MIC_VOL_CHANGE, micVol);
+      } else if (111 <= result && 114 >= result) {
+        var data = new Uint8Array(msg, 8, msg.byteLength - 8);
+        var url = utf8to16(data);
+        console.log('url->', url);
+      } else if (13 == result) {
+        e.emit(e.SS_STOP);
+      } else {
+        var data = new Uint8Array(msg, 8, msg.byteLength - 8);
+        //var data_sting =  new TextDecoder("utf-8").decode(data);
+        var data_sting = utf8to16(data);
+        console.log('data ->', data_sting);
+      }
+    }
+  }
+}
+
+e.infos = { movieInfo, versionInfo, cameraInfo, micInfo, videoInfo, rtmpPort, micVol }
+e.MOVIE_INFO_CHANGE = 'MOVIE_INFO_CHANGE';
+e.VERSION_INFO_CHANGE = 'VERSION_INFO_CHANGE';
+e.CAMERA_INFO_CHANGE = 'CAMERA_INFO_CHANGE';
+e.MIC_INFO_CHANGE = 'MIC_INFO_CHANGE';
+e.VIDEO_INFO_CHANGE = 'VIDEO_INFO_CHANGE';
+e.RTMP_PORT_CHANGE = 'RTMP_PORT_CHANGE';
+e.MIC_VOL_CHANGE = 'MIC_VOL_CHANGE';
+e.SS_START = 'SS_START';
+e.SS_STOP = 'SS_STOP';
+e.OPEN = 'OPEN';
+e.CLOSE = 'CLOSE';
+e.ERROR = 'ERROR';
+
+e.getRTMPPort = () => {
+  sendCommand('get_rtmp_port');
+}
+e.getMicInfo = () => {
+  sendCommand('get_mic');
+}
+e.getCamInfo = () => {
+  sendCommand('get_cam');
+}
+e.getMicVol = () => {
+  sendCommand('get_mic_vol');
+}
+e.start = (_host = '127.0.0.1', _port) => {
+  host = _host;
+  port = _port;
+  start();
+}
+e.stop = () => {
+  stop();
+}
+e.startShareScreen = (params = '') => {
+  sendCommand('ss_start', params);
+}
+e.stopShareScreen = () => {
+  sendCommand('ss_stop');
 }
 
+export default e;
diff --git a/test/test.js b/test/test.js
index eaa7f53..59f8959 100644
--- a/test/test.js
+++ b/test/test.js
@@ -1,20 +1,83 @@
-// //////////////////////////////////////////////////////////////////////////////
-//
-//  Copyright (C) 2016-present  All Rights Reserved.
-//  Licensed under the Apache License, Version 2.0 (the "License");
-//  http://www.apache.org/licenses/LICENSE-2.0
-//
-//  Github Home: https://github.com/AlexWang1987
-//  Author: AlexWang
-//  Date: 2017-03-17 11:13:11
-//  QQ Email: 1669499355@qq.com
-//  Last Modified time: 2017-03-17 11:13:45
-//  Description: wbp-init-umd-test
-//
-// //////////////////////////////////////////////////////////////////////////////
-
-// only for hot reload
-if (module && module.hot) {
-  module.hot.accept();
+import ss from 'main.js';
+
+// 媒体信息
+ss.on(ss.MOVIE_INFO_CHANGE, (d) => {
+  console.log('MOVIE_INFO_CHANGE->', d);
+})
+
+// 版本信息
+ss.on(ss.VERSION_INFO_CHANGE, (d) => {
+  console.log('VERSION_INFO_CHANGE->', d);
+})
+
+// 本地摄像头设备
+ss.on(ss.CAMERA_INFO_CHANGE, (d) => {
+  console.log('CAMERA_INFO_CHANGE->', d);
+})
+
+// 本地麦克风设备
+ss.on(ss.MIC_INFO_CHANGE, (d) => {
+  console.log('MIC_INFO_CHANGE->', d);
+})
+
+// 视频信息
+ss.on(ss.VIDEO_INFO_CHANGE, (d) => {
+  console.log('VIDEO_INFO_CHANGE->', d);
+})
+
+// 本地RTMP服务端口
+ss.on(ss.RTMP_PORT_CHANGE, (d) => {
+  console.log('RTMP_PORT_CHANGE->', d);
+})
+
+// 麦克风音量
+ss.on(ss.MIC_VOL_CHANGE, (d) => {
+  console.log('MIC_VOL_CHANGE->', d);
+})
+
+function startSS() {
+  // 发起屏幕共享[推送地址可选]
+  console.log('发起屏幕');
+  ss.startShareScreen('rtmp://123.56.205.116/live/alexwang');
 }
 
+function stopSS() {
+  // 关闭屏幕共享
+  console.log('关闭屏幕');
+  //ss.stopShareScreen();
+}
+
+// 屏幕共享开始
+ss.on(ss.SS_START, () => {
+  console.log('SS_START');
+  setTimeout(() => {
+    stopSS();
+  }, 200)
+})
+
+// 屏幕共享关闭
+ss.on(ss.SS_STOP, () => {
+  console.log('SS_STOP');
+  setTimeout(() => {
+    startSS();
+  }, 500)
+})
+
+// 发生错误
+ss.on(ss.ERROR, () => {
+  console.log('ERROR');
+})
+
+// 服务关闭
+ss.on(ss.CLOSE, () => {
+  console.log('CLOSE');
+})
+
+// 服务开启
+ss.on(ss.OPEN, () => {
+  console.log('OPEN');
+  startSS();
+})
+
+// 连接本地流媒体服务
+ss.start('192.168.222.216', 8090);
diff --git a/webpack.config.umd.js b/webpack.config.umd.js
index dc51324..1273b9d 100644
--- a/webpack.config.umd.js
+++ b/webpack.config.umd.js
@@ -1,5 +1,6 @@
 module.exports = function (umdConf) {
   umdConf.devServer.host = '0.0.0.0';
+  umdConf.devServer.port = '9000';
   umdConf.output.publicPath = '';
 
   umdConf.webpackFeatures.enableEntryHTML();
@@ -14,4 +15,3 @@ module.exports = function (umdConf) {
     });
   }
 };
-
--
libgit2 0.24.0