text: import io from 'socket.io';
  import Socket from 'socket.io/lib/socket';
  import * as Metrics from './metrics/metrics';
  import { JSONFileMetricsReporter } from './metrics/jsonfilemetricsreporter';
  
  const LOGGER = require('@calzoneman/jsli')('counters');
  
  var server = null;
  
  exports.add = Metrics.incCounter;
  
  Socket.prototype._packet = Socket.prototype.packet;
  Socket.prototype.packet = function () {
      this._packet.apply(this, arguments);
      exports.add('socket.io:packet');
  };
  
  function getConnectedSockets() {
      var sockets = io.instance.sockets.sockets;
      if (typeof sockets.length === 'number') {
          return sockets.length;
      } else {
          return Object.keys(sockets).length;
      }
  }
  
  function setChannelCounts(metrics) {
      if (server === null) {
          server = require('./server').getServer();
      }
  
      try {
          var publicCount = 0;
          var allCount = 0;
          server.channels.forEach(function (c) {
              allCount++;
              if (c.modules.options && c.modules.options.get("show_public")) {
                  publicCount++;
              }
          });
  
          metrics.addProperty('channelCount:all', allCount);
          metrics.addProperty('channelCount:public', publicCount);
      } catch (error) {
          LOGGER.error(error.stack);
      }
  }
  
  const reporter = new JSONFileMetricsReporter('counters.log');
  Metrics.setReporter(reporter);
  Metrics.setReportInterval(60000);
  Metrics.addReportHook((metrics) => {
      metrics.addProperty('socket.io:count', getConnectedSockets());
      setChannelCounts(metrics);
  });
  