jsir 2.4.2 → 2.4.4

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.
package/cmd/oaa.js CHANGED
@@ -12,7 +12,8 @@ const {
12
12
  getEditor, errorStr, getConfigDir,
13
13
  getFullPath, parseUniqueName, toUniqueName, isJsirFileName, toJsirFileName,
14
14
  getAlias, wrapperJsirText, eia, getKeyTips, getValTips, getJsirTypeKey,
15
- createDetachedProcess, interceptStdStreams
15
+ createDetachedProcess, interceptStdStreams,
16
+ draftModify, isRunningInBackground, fileJson, fileLock
16
17
  } = $lib;
17
18
  const _args = process.argv.slice(2).map(trim);
18
19
  const evalCode = require('../deps/evalCode')
@@ -32,7 +33,6 @@ const console = createConsole();
32
33
  const room = require('../deps/room');
33
34
  const server = require('../deps/server')
34
35
  const {reqNode} = require("../deps/room");
35
- const {isRunningInBackground} = require("../deps/util");
36
36
 
37
37
  let lastFilterArg = '';
38
38
  let _cmdMapFile = setting.name + 'CmdMap.json'
@@ -116,6 +116,12 @@ const $data = {
116
116
  }
117
117
  return _dealOnLazyGet(key, onLazyTempCode)
118
118
  },
119
+ gfs: (key, fn, onLazyTempCode) => {
120
+ if (!vl(_data[key])) {
121
+ return _dataSet(key, fn(), onLazyTempCode)
122
+ }
123
+ return _dealOnLazyGet(key, onLazyTempCode)
124
+ },
119
125
  set: _dataSet,
120
126
  del: (key) => {
121
127
  let val = _data[key]
@@ -123,7 +129,9 @@ const $data = {
123
129
  return val
124
130
  },
125
131
  key: () => Object.keys(_data),
126
- has: (key) => vl(_data[key])
132
+ has: (key) => vl(_data[key]),
133
+ json: fileJson,
134
+ lock: fileLock
127
135
  }
128
136
  const $homeDir = getLibDataDir()
129
137
 
@@ -600,7 +608,11 @@ async function _wrapperInput(str) {
600
608
  } else {
601
609
  let fLine = trim(str.substr(1))
602
610
  if (fLine) {
603
- console.log(draftQuery(fLine).join("\n"))
611
+ if (/\s+[+-]$/.test(fLine)) {
612
+ console.log((await draftModify(fLine)).join("\n"))
613
+ } else {
614
+ console.log(draftQuery(fLine).join("\n"))
615
+ }
604
616
  } else {
605
617
  console.$draft(await nextText(line => line, fstr))
606
618
  }
package/deps/evalCode.js CHANGED
@@ -13,10 +13,6 @@ module.exports = async ($text = '', $cmdName = '', $args = [],
13
13
  const require = (moduleName) => $lib.requireG(moduleName, $currentSpace);
14
14
 
15
15
  const $config = $lib.createConfig($cmdName);
16
- const $file = {
17
- json: $lib.fileJson,
18
- lock: $lib.fileLock
19
- };
20
16
 
21
17
  // 兼容
22
18
  $text = $lib.wrapperJsirText($text)
@@ -27,7 +23,7 @@ module.exports = async ($text = '', $cmdName = '', $args = [],
27
23
 
28
24
  const $context = {
29
25
  $defArgs,
30
- $data, $config, $file,
26
+ $data, $config,
31
27
  $require, $requires, $import,
32
28
  $text, $cmdName, $args,
33
29
  $nextLine, $nextText,
package/deps/room.js CHANGED
@@ -7,7 +7,7 @@ const {setRoute, createSign} = require('../deps/server')
7
7
  const roomDataFile = "jsirRoom.json"
8
8
  const roomsDirLockKey = "RW_" + getRoomsDir();
9
9
  const syncRoomsLockKey = "SyncRooms_" + getRoomsDir();
10
- const enrichRoomInfoLockKey = "ENRICH_" + roomDataFile
10
+ const updateRoomInfoLockKey = "UPDATE_" + roomDataFile
11
11
  const console = createConsole();
12
12
  const net = require("net");
13
13
  const setting = require('../deps/setting')
@@ -54,7 +54,7 @@ function onRoom(wrapperInput) {
54
54
  await wrapperInput(req.input)
55
55
  let outputs = setting.enterOutputs || [];
56
56
  setting.enterOutputs = null;
57
- res.output = outputs.join('\n');
57
+ res.output = outputs.join('');
58
58
  }
59
59
  })
60
60
  } catch (e) {
@@ -104,7 +104,7 @@ async function getTailscaleNodes() {
104
104
  return [...new Set(nodes)];
105
105
  }
106
106
 
107
- async function enrichRoomInfo() {
107
+ async function updateRoomInfo() {
108
108
  let nodes = await getTailscaleNodes();
109
109
  let ip = getSelfIP(nodes)
110
110
  await fileJson(roomDataFile, async room => {
@@ -121,6 +121,8 @@ async function enrichRoomInfo() {
121
121
 
122
122
  // 提前设置一下
123
123
  setting.selfRoom = Object.assign(setting.selfRoom || {}, room);
124
+
125
+ await cleanRoom(room)
124
126
  })
125
127
  }
126
128
 
@@ -141,10 +143,14 @@ async function syncRooms() {
141
143
  respBody = await reqNode(node, "get", "/");
142
144
  } catch (e) {
143
145
  debug(`sync ${node} failed:`, e);
144
- respBody = await reqNode(node, "get", "/", setting.defaultPort);
146
+ if (!isDisableConnect(node, setting.defaultPort)) {
147
+ respBody = await reqNode(node, "get", "/", setting.defaultPort);
148
+ }
149
+ }
150
+ if (respBody) {
151
+ syncRooms.push(JSON.parse(respBody))
152
+ debug(`sync ${node} success`);
145
153
  }
146
- syncRooms.push(JSON.parse(respBody))
147
- debug(`sync ${node} success`);
148
154
  } catch (e) {
149
155
  debug(`sync ${node} failed:`, respBody, e);
150
156
  }
@@ -203,9 +209,9 @@ async function _syncSetting(room) {
203
209
  }
204
210
  setting.rooms = [setting.selfRoom, ...rooms]
205
211
  .map(room => {
206
- room.active = Date.now() - (room.lastUpdateTime || 0) <= 9000;
212
+ room.active = Date.now() - (room.lastUpdateTime || 0) <= setting.roomHeartbeatExpire;
207
213
  Object.entries(room.jsirs).forEach(([key, jsir]) =>
208
- jsir.active = Date.now() - (jsir.lastUpdateTime || 0) <= 9000)
214
+ jsir.active = Date.now() - (jsir.lastUpdateTime || 0) <= setting.roomHeartbeatExpire)
209
215
  return room;
210
216
  });
211
217
 
@@ -238,19 +244,35 @@ async function initRoom() {
238
244
  let roomUpdateTouchTime = false;
239
245
  await fileJson(roomDataFile, async room => {
240
246
  await initRoomJsir(room)
241
- if (!vl(room.lastUpdateTime) || (Date.now() - room.lastUpdateTime) > 3000) {
247
+ if (!vl(room.lastUpdateTime) || (Date.now() - room.lastUpdateTime) > setting.roomTimer) {
242
248
  roomUpdateTouchTime = true;
243
249
  }
244
250
  })
245
251
 
246
252
  if (roomUpdateTouchTime) {
247
- await fileLock(enrichRoomInfoLockKey, enrichRoomInfo, false)
253
+ await fileLock(updateRoomInfoLockKey, updateRoomInfo, false)
248
254
  fileLock(syncRoomsLockKey, syncRooms, false);
249
255
  }
250
256
 
251
257
  await syncSetting();
252
258
  }
253
259
 
260
+ async function cleanRoom(room) {
261
+ // 清理进程
262
+ for (let pid of Object.keys(room.jsirs || {})) {
263
+ let jsir = room.jsirs[pid]
264
+ let active = Date.now() - (jsir.lastUpdateTime || 0) <= setting.roomHeartbeatExpire;
265
+ if (!active && isPidAlive(pid)) {
266
+ try {
267
+ debug(`kill inactive jsir ${pid}`)
268
+ process.kill(parseInt(pid), 'SIGKILL'); // 强制终止进程
269
+ } catch (e) {
270
+ debug(`clearRoom ${pid} failed`, e)
271
+ }
272
+ }
273
+ }
274
+ }
275
+
254
276
  /*
255
277
  最小为0
256
278
  100 为1 毫秒
@@ -270,6 +292,7 @@ async function initRoomJsir(room) {
270
292
  Object.entries(room.jsirs || {}).filter(([pid]) => isPidAlive(pid))
271
293
  );
272
294
 
295
+ // 构造services
273
296
  let services = {}
274
297
  for (let key of Object.keys(setting.routes)) {
275
298
  let ss = key.split("/").map(trim).filter(i => i);
@@ -277,6 +300,7 @@ async function initRoomJsir(room) {
277
300
  getOr(services, ss[1] + '/' + ss[2], []).push(ss[3])
278
301
  }
279
302
  }
303
+ // 初始化jsir
280
304
  let lastJsir = room.jsirs[process.pid]
281
305
  room.jsirs[process.pid] = {
282
306
  pid: process.pid,
package/deps/setting.js CHANGED
@@ -32,10 +32,11 @@ module.exports = {
32
32
  serviceFns: {},
33
33
  enterOutputs: null,
34
34
  defaultPort: 52108,
35
- reqNodeDefaultTimeout: 9000,
35
+ reqNodeDefaultTimeout: 33000,
36
36
  reqNodeTimeouts: {
37
37
  '/': 3000
38
38
  },
39
39
  roomTimer: 1000,
40
- serverSignExpire: 6000
40
+ serverSignExpire: 6000,
41
+ roomHeartbeatExpire: 9000
41
42
  }
package/deps/util.js CHANGED
@@ -424,6 +424,42 @@ function parseDraftLog(draftPath) {
424
424
  }
425
425
 
426
426
  function draftQuery(fLine) {
427
+ fLine = fLine.trim();
428
+ let results = [];
429
+ let draftPath = getLibDataDir() + "/log/draft.log";
430
+ if (!fs.existsSync(draftPath)) {
431
+ return results;
432
+ }
433
+
434
+ let { lines } = parseDraftLog(draftPath);
435
+ let limit = 0;
436
+ let filterKeywords = '';
437
+
438
+ if (/\s+\d+$/.test(fLine)) {
439
+ filterKeywords = fLine.replace(/\s+\d+$/, '');
440
+ limit = parseInt(fLine.match(/\d+$/)[0]);
441
+ } else {
442
+ filterKeywords = fLine;
443
+ }
444
+
445
+ if (/^\d+$/.test(filterKeywords)) {
446
+ results = lines.slice(- parseInt(filterKeywords));
447
+ } else {
448
+ lines.forEach(line => {
449
+ if (isMatch(line, filterKeywords)) {
450
+ results.push(line);
451
+ }
452
+ });
453
+ }
454
+
455
+ if (limit > 0) {
456
+ results = results.slice(-limit);
457
+ }
458
+
459
+ return results;
460
+ }
461
+
462
+ async function draftModify(fLine) {
427
463
  fLine = fLine.trim();
428
464
  let results = [];
429
465
  let deleteRanges = [];
@@ -486,7 +522,7 @@ function draftQuery(fLine) {
486
522
  if (isEdit && results.length === 1) {
487
523
  let tempPath = getLibDataDir() + "/log/draft.temp";
488
524
  fs.writeFileSync(tempPath, results[0].split(/\n/).slice(1).join('\n'))
489
- ei(getEditor(), [tempPath])
525
+ await eia(getEditor(), [tempPath])
490
526
  let tempText = String(fs.readFileSync(tempPath))
491
527
  let lineRange = lineRanges.get(results[0]);
492
528
  let before = allLines.filter((_, index) => {
@@ -702,9 +738,8 @@ function createLimitLogger(fileName, {
702
738
  if (error) {
703
739
  global.$newError = true;
704
740
  }
705
- text = `${pad(3, String(process.pid%1000), process.pid >= 1000 ? '0':' ')}> ${text}`
706
741
  if (time) {
707
- text = `${timeStr('YYYY-MM-DD HH:mm:ss.SSS')} ${text}`
742
+ text = `${timeStr('YYYY-MM-DD HH:mm:ss.SSS')} ${pad(3, String(process.pid%1000), process.pid >= 1000 ? '0':' ')}> ${text}`
708
743
  }
709
744
  syncQueue(() => fp.appendFile(logPath, text + '\n'), logPath)
710
745
  let _minNum = (Date.now()/(1000 * 60 * 10)).toFixed(0)
@@ -979,11 +1014,14 @@ function _getConfig(key, defaultVal, uniqueName) {
979
1014
  if (key === undefined) {
980
1015
  return config
981
1016
  }
1017
+ if (uniqueName) {
1018
+ console.msg(`require ${uniqueName} config "${key}"`)
1019
+ }
982
1020
  let writeFlag = false
983
1021
  if (!(key in config)) {
984
1022
  writeFlag = true
985
1023
  config[key] = null
986
- console.warn(`require config "${key}", use .setting`)
1024
+ console.warn(`require ${uniqueName ? uniqueName:'global'} config "${key}"`)
987
1025
  }
988
1026
  if (writeFlag) {
989
1027
  fs.writeFileSync(configFile, JSON.stringify(config, null, 2))
@@ -2164,5 +2202,6 @@ module.exports = {
2164
2202
  getJsirTypeKey,
2165
2203
  isRunningInBackground,
2166
2204
  createDetachedProcess,
2167
- interceptStdStreams
2205
+ interceptStdStreams,
2206
+ draftModify
2168
2207
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jsir",
3
- "version": "2.4.2",
3
+ "version": "2.4.4",
4
4
  "description": "JavaScript Script Management Tool",
5
5
  "main": "index.js",
6
6
  "scripts": {