crabatool 1.0.365 → 1.0.367

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/lib/server.js +91 -19
  2. package/package.json +1 -1
package/lib/server.js CHANGED
@@ -8,17 +8,22 @@ var compression = require('compression');
8
8
 
9
9
  exports = module.exports;
10
10
 
11
- // 每次都重启server
12
- var aloneServer;
13
- var connections = new Set();
11
+ // 存储每个使用和的在线预览server实例
12
+ var servers = {};
14
13
 
14
+ // 1. 自定义启动服务模式(crabaai里面启动用户创建的案例,每个使用者仅创建一个server,互不影响,使用者在线预览案例需要)
15
15
  exports.run = function(options) {
16
16
  var that = this;
17
- if (aloneServer) {
18
- forceShutdown(aloneServer, function() {
17
+ var serverid;
18
+ if (options) {
19
+ serverid = options.serverid;
20
+ }
21
+ var oldServer = servers[serverid];
22
+
23
+ if (oldServer) {
24
+ forceShutdown(oldServer, function() {
19
25
  console.log('关闭旧实例...');
20
26
 
21
- connections = new Set();
22
27
  that.start(options);
23
28
  });
24
29
  } else {
@@ -26,12 +31,31 @@ exports.run = function(options) {
26
31
  }
27
32
  }
28
33
 
29
- // 独立server
34
+ // 2. 独立server服务(crabatool使用)
30
35
  exports.start = function(options) {
31
36
  var app = new express();
32
37
  createServer(app, options);
33
38
 
34
39
  }
40
+
41
+ // 3. 返回在线预览案例server总数
42
+ exports.count = function() {
43
+ return Object.keys(servers).length;
44
+ }
45
+
46
+ // 4. 强制结束所有案例server
47
+ exports.closeAll = function() {
48
+ var keys = Object.keys(servers);
49
+ for (var i = 0; i < keys.length; i++) {
50
+ var key = keys[i];
51
+ var oldServer = servers[key];
52
+ forceShutdown(oldServer, function() {
53
+ console.log('强制下线实例:' + key);
54
+ });
55
+ }
56
+ servers = {}; // 置空实例列表
57
+ }
58
+
35
59
  function createServer(app, options) {
36
60
  //app.use(express.json({ limit: '50mb' })); // post数据包大小限制
37
61
  app.use(compression()); // 开启压缩
@@ -155,30 +179,78 @@ function createServer(app, options) {
155
179
  }
156
180
  });
157
181
 
158
- if (options) {
159
- aloneServer = server;
182
+ // 自定义启动服务模式
183
+ if (options && options.serverid) {
184
+ servers[options.serverid] = server;
185
+ server.__serverid = options.serverid;
186
+ server.__connections = new Set();
187
+ //resetTimeout(server); // 启动时初始化计时器
188
+
189
+ // 有新的请求时初始化计时器
190
+ server.on("request", (req, res) => {
191
+ resetTimeout(server);
192
+ });
160
193
 
161
194
  // 记录所有活跃连接
162
195
  server.on('connection', (socket) => {
163
- connections.add(socket);
196
+ server.__connections.add(socket);
197
+
164
198
  socket.on('close', () => {
165
- connections.delete(socket);
199
+ if (server.__connections) {
200
+ server.__connections.delete(socket);
201
+ }
166
202
  });
167
203
  });
168
204
 
169
-
205
+ console.log('当前server实例总数:' + exports.count());
170
206
  }
171
207
  }
172
208
 
209
+ // 重置倒计时
210
+ function resetTimeout(server) {
211
+ var timeoutId = server.__timeoutId;
212
+ if (timeoutId) {
213
+ clearTimeout(timeoutId);
214
+ }
215
+
216
+ server.__timeoutId = setTimeout(() => {
217
+ console.log('10 分钟无活动,关闭server服务器...');
218
+ forceShutdown(server);
219
+ }, 10 * 60 * 1000); // 10 分钟
220
+ }
173
221
 
174
- // 强制关闭所有活跃连接的函数
222
+ // 关闭server服务,先强制关闭所有活跃连接的函数(否则close会很久)
175
223
  function forceShutdown(server, cb) {
176
- console.log(`强制关闭 ${connections.size} 个活跃连接`);
177
- connections.forEach((socket) => {
178
- socket.destroy(); // 强制销毁 socket
179
- });
224
+ // 关闭计时器
225
+ if (server.__timeoutId) {
226
+ clearTimeout(server.__timeoutId);
227
+ delete server.__timeoutId;
228
+ }
229
+
230
+ // 1. 关闭链接
231
+ var connections = server.__connections;
232
+ if (connections) {
233
+ console.log(`强制关闭 ${connections.size} 个活跃连接`);
234
+ connections.forEach((socket) => {
235
+ socket.destroy(); // 强制销毁 socket
236
+ socket.unref(); // 确保进程退出
237
+ });
238
+
239
+ }
240
+ // 2. 如果使用 Node.js >= 18.2.0,可直接清理空闲连接就不需要__connections来管理了链接了
241
+ if (server.closeIdleConnections) {
242
+ server.closeIdleConnections();
243
+ }
244
+
245
+ // 3. 关闭server
180
246
  server.close(() => {
181
- console.log('服务器已关闭');
182
- cb();
247
+ delete server.__connections;
248
+ delete servers[server.__serverid];
249
+
250
+ console.log('服务器已关闭' + server.__serverid);
251
+
252
+ if (typeof cb == 'function') {
253
+ cb();
254
+ }
183
255
  });
184
256
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "crabatool",
3
- "version": "1.0.365",
3
+ "version": "1.0.367",
4
4
  "description": "crabatool",
5
5
  "main": "index.js",
6
6
  "bin": {