From 063be5cee2692364a6cb1de18011d9b20d2dfd0d Mon Sep 17 00:00:00 2001 From: Gus Caplan Date: Fri, 23 Sep 2016 15:43:16 -0500 Subject: [PATCH] =?UTF-8?q?smarter=20sharding=E2=84=A2=20(#732)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintrc.json | 1 - src/client/Client.js | 8 ++++++++ src/sharding/Shard.js | 12 ++++++++---- src/sharding/ShardingManager.js | 9 ++------- 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index b0f5c06b8..90f35dc06 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -69,7 +69,6 @@ "no-mixed-requires": "error", "no-new-require": "error", "no-path-concat": "error", - "no-process-env": "error", "array-bracket-spacing": "error", "block-spacing": "error", diff --git a/src/client/Client.js b/src/client/Client.js index 560a01519..7df1c82cb 100644 --- a/src/client/Client.js +++ b/src/client/Client.js @@ -27,6 +27,14 @@ class Client extends EventEmitter { */ this.options = mergeDefault(Constants.DefaultOptions, options); + if (!this.options.shard_id && process.env.hasOwnProperty('SHARD_ID')) { + this.options.shard_id = process.env.SHARD_ID; + } + + if (!this.options.shard_count && process.env.hasOwnProperty('SHARD_COUNT')) { + this.options.shard_count = process.env.SHARD_COUNT; + } + /** * The REST manager of the client * @type {RESTManager} diff --git a/src/sharding/Shard.js b/src/sharding/Shard.js index c4d713e71..b3517b6d7 100644 --- a/src/sharding/Shard.js +++ b/src/sharding/Shard.js @@ -26,15 +26,19 @@ class Shard { * The process of the shard * @type {ChildProcess} */ - this.process = childProcess.fork(path.resolve(this.manager.file), [id, this.manager.shards.size]); - - this.process.once('exit', () => { - if (this.manager.respawn) this.manager.createShard(this.id); + this.process = childProcess.fork(path.resolve(this.manager.file), [], { + env: { + SHARD_ID: this.id, SHARD_COUNT: this.manager.totalShards, + }, }); this.process.on('message', message => { this.manager.emit('message', this, message); }); + + this.process.once('exit', () => { + if (this.manager.respawn) this.manager.createShard(this.id); + }); } /** diff --git a/src/sharding/ShardingManager.js b/src/sharding/ShardingManager.js index 461002cf4..e5cdcdb6a 100644 --- a/src/sharding/ShardingManager.js +++ b/src/sharding/ShardingManager.js @@ -69,13 +69,8 @@ class ShardingManager extends EventEmitter { * @param {number} [amount=this.totalShards] Number of shards to spawn * @param {number} [delay=5500] How long to wait in between spawning each shard (in milliseconds) */ - spawn(amount, delay = 5500) { - if (typeof amount !== 'undefined') { - if (typeof amount !== 'number' || isNaN(amount)) throw new TypeError('Amount of shards must be a number.'); - if (amount < 1) throw new RangeError('Amount of shards must be at least 1.'); - this.totalShards = amount; - } - + spawn(amount = this.totalShards, delay = 5500) { + this.totalShards = amount; this.createShard(); const interval = setInterval(() => { if (this.shards.size === this.totalShards) clearInterval(interval);