diff --git a/src/sharding/Shard.js b/src/sharding/Shard.js new file mode 100644 index 000000000..af71d23b5 --- /dev/null +++ b/src/sharding/Shard.js @@ -0,0 +1,29 @@ +const childProcess = require('child_process'); +const path = require('path'); +const crypto = require('crypto'); + +class Shard { + constructor(manager, id) { + this.manager = manager; + this.id = id; + this.process = childProcess.fork(path.resolve(this.manager.file), [id, this.manager.shards.size], { silent: true }); + this.process.on('message', m => { + if (m && m.type && m.id) { + + } + }); + } + + send(type, timeout = 60000, data = {}) { + return new Promise((resolve, reject) => { + const id = crypto.randomBytes(16).toString('hex'); + this.process.send({ + type, + id, + data, + }); + }); + } +} + +module.exports = Shard; diff --git a/src/sharding/ShardingManager.js b/src/sharding/ShardingManager.js index 90ec133ae..ea7bcd1f2 100644 --- a/src/sharding/ShardingManager.js +++ b/src/sharding/ShardingManager.js @@ -2,6 +2,8 @@ const childProcess = require('child_process'); const path = require('path'); const EventEmitter = require('events').EventEmitter; const Collection = require('../util/Collection'); +const Shard = require('./Shard'); +const crypto = require('crypto'); class ShardingManager extends EventEmitter { constructor(file, totalShards) { @@ -12,11 +14,12 @@ class ShardingManager extends EventEmitter { } this.totalShards = totalShards; this.shards = new Collection(); + this.waiting = new Collection(); } createShard() { const id = this.shards.size; - const shard = childProcess.fork(path.resolve(this.file), [id, this.totalShards], { silent: true }); + const shard = new Shard(this, id); this.shards.set(id, shard); this.emit('launch', id, shard); }