schangxiang@126.com
2025-09-18 49a51c068d62084bc4c3e77c4be94a20de556c4a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
const net = require('net');
const fs = require('fs');
const Class = require('cify');
const utils = require('ntils');
const os = require('os');
 
const EXTNAME = '.oneport';
 
const Oneport = new Class({
 
  constructor: function () {
    this.tmpdir = os.tmpdir() + '/';
  },
 
  /**
   * 获取监时路径
   *@param {string} name 指定一个名称
   */
  _getTmpPath: function (name) {
    return this.tmpdir + name + EXTNAME;
  },
 
  /**
   * 保存在到文件
   * @param {string} name 指定一个名称,可用于再次查询
   * @param {function} callback 回调
   * @returns {void} 无返回 
   */
  _saveToFile(name, port, callback) {
    if (utils.isNull(name)) return callback();
    fs.writeFile(this._getTmpPath(name), port, callback);
  },
 
  /**
   * 申请一个空闲的端口
   * @param {string} name 指定一个名称,可用于再次查询
   * @param {function} callback 回调
   * @returns {void} 无返回 
   */
  acquire: function (name, callback) {
    if (!utils.isFunction(callback)) {
      callback = [name, name = callback][0];
    }
    if (!utils.isFunction(callback)) {
      throw new Error('Invalid paraments');
    }
    const server = net.createServer();
    server.on('error', callback);
    server.on('listening', function () {
      var port = server.address().port;
      this._saveToFile(name, port, function (err) {
        if (err) return callback(err);
        server.close(function () {
          callback(null, port);
        });
      });
    }.bind(this));
    server.listen(0);
  },
 
  /**
   * 查询指定名称最后一个申请到的端口
   * @param {string} name 查询名称
   * @param {function} callback 回调
   * @returns {void} 无返回 
   */
  last: function (name, callback) {
    if (!utils.isString(name) || !utils.isFunction(callback)) {
      throw new Error('Invalid paraments');
    }
    fs.readFile(this._getTmpPath(name), function (err, buffer) {
      if (err) return callback(err);
      callback(null, Number(buffer.toString()));
    });
  }
 
});
 
module.exports = new Oneport();
module.exports.Oneport = Oneport;