Add ShardManager

This commit is contained in:
Amish Shah
2016-08-30 17:26:25 +01:00
parent 4df7968630
commit c70dfa83fb
6 changed files with 67 additions and 3 deletions

View File

@@ -136,9 +136,8 @@ class WebSocketManager {
const payload = this.client.options.ws;
payload.token = this.client.token;
if (this.client.options.shard_count > 0) {
payload.shard = [this.client.options.shard_id, this.client.options.shard_count];
payload.shard = [Number(this.client.options.shard_id), Number(this.client.options.shard_count)];
}
this.send({
op: Constants.OPCodes.IDENTIFY,
d: payload,

View File

@@ -1,3 +1,5 @@
const Client = require('./client/Client');
const ShardingManager = require('./sharding/ShardingManager');
exports.Client = Client;
exports.ShardingManager = ShardingManager;

View File

@@ -0,0 +1,34 @@
const childProcess = require('child_process');
const path = require('path');
const EventEmitter = require('events').EventEmitter;
class ShardingManager extends EventEmitter {
constructor(file, totalShards) {
super();
this.file = file;
if (!path.isAbsolute(file)) {
this.file = path.resolve(`${process.cwd()}${file}`);
}
this.totalShards = totalShards;
this.runningShards = 0;
this.createShards();
}
createShard(id) {
const shard = childProcess.fork(path.resolve(this.file), [id, this.totalShards]);
this.emit('launch', id, shard);
}
createShards() {
this.createShard(0);
const interval = setInterval(() => {
this.runningShards++;
if (this.runningShards === this.totalShards) {
return clearInterval(interval);
}
this.createShard(this.runningShards);
}, 5500);
}
}
module.exports = ShardingManager;