1 | ;
|
2 | /**
|
3 | * {}
|
4 | *
|
5 | * @class autoRefresh
|
6 | * {
|
7 | * type:refresh、updateCss、updateJs、updateReact、updateImg
|
8 | * listenPort:3000
|
9 | * }
|
10 | */
|
11 | class autoRefresh{
|
12 | constructor(option){
|
13 | const _ts = this;
|
14 |
|
15 | option = option || {};
|
16 |
|
17 | let m = _ts.m = {
|
18 | path:require('path'),
|
19 | net:require('net'),
|
20 | fs:require('fs-extra'),
|
21 | Koa:require('koa'),
|
22 | Io:require('koa-socket'),
|
23 | static:require('koa-static'),
|
24 | range:require('koa-range'),
|
25 | Router:require('koa-router')
|
26 | },
|
27 | config = _ts.config = {};
|
28 |
|
29 |
|
30 |
|
31 | for(let i in option){
|
32 | config[i] = option[i];
|
33 | };
|
34 |
|
35 | _ts.listenPort = typeof _ts.listenPort === 'number' ? _ts.listenPort : fws.config.listenPort ? fws.config.listenPort : 3000;
|
36 |
|
37 | config.listen = +config.listenPort > 0 ? fws.config.listenPort : 3000;
|
38 |
|
39 | _ts.app = new m.Koa();
|
40 | _ts.app.use(m.range);
|
41 | _ts.io = new m.Io();
|
42 | _ts.router = new m.Router();
|
43 |
|
44 | //return new Promise(_ts.init());
|
45 | }
|
46 | init(){
|
47 | const _ts = this;
|
48 | let m = _ts.m,
|
49 | config = _ts.config;
|
50 | return new Promise((resolve,reject)=>{
|
51 | //_ts.app.use(m.static(m.path.join(fws.fwsPath,'staticfile')));
|
52 |
|
53 | //_ts.app.use(m.static(m.path.join(fws.cmdPath,'staticfile')));
|
54 | //_ts.app.use(m.static(m.path.join(fws.fwsPath)));
|
55 |
|
56 | // m.router.get('/',(ctx,next)=>{
|
57 | // let content = m.fs.readFileSync(m.path.join(fws.fwsPath,'staticfile','index.html')).toString();
|
58 | // ctx.body = content;
|
59 | // });
|
60 |
|
61 | //静态页面到
|
62 | _ts.app.use(m.static(m.path.join(fws.fwsPath,'welcome')));
|
63 |
|
64 | //当前项目
|
65 | _ts.app.use(m.static(m.path.join(fws.srcPath,'..')));
|
66 |
|
67 | _ts.io.attach(_ts.app);
|
68 | // _ts.io.on('connection',(ctx,data) => {
|
69 | // console.log('客户端有新的响应');
|
70 | // });
|
71 |
|
72 | _ts.io.on('pageLoad',(ctx,data)=>{
|
73 | console.log('加载 '+data.url);
|
74 | });
|
75 |
|
76 | // setInterval(function(){
|
77 | // //广播
|
78 | // _ts.io.broadcast('news',111);
|
79 | // },1000);
|
80 |
|
81 | // _ts.io.on('my other event',(ctx,data)=>{
|
82 | // console.log(data);
|
83 | // });
|
84 |
|
85 | _ts.app
|
86 | .use(_ts.router.routes())
|
87 | .use(_ts.router.allowedMethods());
|
88 |
|
89 | let initialNumber = 0, //初始次数
|
90 | maxTryNumber = 20; //如果端口被占用,最多允许尝试的次数
|
91 |
|
92 |
|
93 | let testServer;
|
94 | (testServer = ()=>{
|
95 | var s = m.net.createServer().listen(_ts.listenPort);
|
96 | s.on('listening',()=>{
|
97 | //测试端口可用,则关闭当前端口并启动server
|
98 | s.close();
|
99 | _ts.app.listen(_ts.listenPort);
|
100 | resolve({
|
101 | status:'success',
|
102 | msg:'启动 http Server',
|
103 | data:{
|
104 | listenPort:_ts.listenPort
|
105 | }
|
106 | });
|
107 |
|
108 | });
|
109 |
|
110 | s.on('error',err => {
|
111 | //端口被占用
|
112 | if(err.code === 'EADDRINUSE'){
|
113 | initialNumber++;
|
114 | _ts.listenPort++;
|
115 | if(initialNumber < maxTryNumber){
|
116 | testServer();
|
117 | }else{
|
118 | reject({
|
119 | status:'error',
|
120 | msg:'启动 http Server 失败',
|
121 | info:err
|
122 | });
|
123 | };
|
124 | };
|
125 | });
|
126 | })();
|
127 |
|
128 |
|
129 |
|
130 |
|
131 | // try {
|
132 | // _ts.app.listen(_ts.listenPort);
|
133 | // resolve({
|
134 | // status:'success',
|
135 | // msg:'启动 http Server',
|
136 | // data:{
|
137 | // listenPort:_ts.listenPort
|
138 | // }
|
139 | // });
|
140 | // } catch (error) {
|
141 | // if(addNumber < 10){
|
142 | // addNumber++;
|
143 | // _ts.listenPort++;
|
144 | // _ts.app.listen(_ts.listenPort);
|
145 | // }else{
|
146 | // reject({
|
147 | // status:'error',
|
148 | // msg:'启动 http Server 失败',
|
149 | // info:error
|
150 | // });
|
151 | // };
|
152 | // };
|
153 | })
|
154 |
|
155 |
|
156 |
|
157 | }
|
158 | };
|
159 |
|
160 | module.exports = autoRefresh; |
\ | No newline at end of file |