UNPKG

discord-hybrid-sharding

Version:

The first package which combines sharding manager & internal sharding to save a lot of resources, which allows clustering!

155 lines (154 loc) 6.02 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ClusterClientHandler = exports.ClusterHandler = void 0; const shared_1 = require("../types/shared"); const Util_1 = require("../Util/Util"); class ClusterHandler { manager; cluster; ipc; constructor(manager, cluster, ipc) { this.manager = manager; this.cluster = cluster; this.ipc = ipc; } handleMessage(message) { if (message._type === shared_1.messageType.CLIENT_READY) { this.cluster.ready = true; /** * Emitted upon the cluster's {@link Client#ready} event. * @event Cluster#ready */ this.cluster.emit('ready'); this.cluster.manager._debug('Ready', this.cluster.id); return; } if (message._type === shared_1.messageType.CLIENT_BROADCAST_REQUEST) { this.cluster.manager .broadcastEval(message._eval, message.options) ?.then(results => { return this.ipc.send({ nonce: message.nonce, _type: shared_1.messageType.CLIENT_BROADCAST_RESPONSE, _result: results, }); }) .catch(err => { return this.ipc.send({ nonce: message.nonce, _type: shared_1.messageType.CLIENT_BROADCAST_RESPONSE, _error: (0, Util_1.makePlainError)(err), }); }); return; } if (message._type === shared_1.messageType.CLIENT_MANAGER_EVAL_REQUEST) { this.cluster.manager.evalOnManager(message._eval).then(result => { if (result._error) this.ipc.send({ nonce: message.nonce, _type: shared_1.messageType.CLIENT_MANAGER_EVAL_RESPONSE, _error: (0, Util_1.makePlainError)(result._error), }); return this.ipc.send({ nonce: message.nonce, _type: shared_1.messageType.CLIENT_MANAGER_EVAL_RESPONSE, _result: result._result, }); }); return; } if (message._type === shared_1.messageType.CLIENT_EVAL_RESPONSE) { this.cluster.manager.promise.resolve(message); return; } if (message._type === shared_1.messageType.CLIENT_RESPAWN_ALL) { this.cluster.manager.respawnAll(message.options); return; } if (message._type === shared_1.messageType.CLIENT_RESPAWN) { this.cluster.respawn(message.options); return; } if (message._type === shared_1.messageType.CLIENT_MAINTENANCE) { this.cluster.triggerMaintenance(message.maintenance); return; } if (message._type === shared_1.messageType.CLIENT_MAINTENANCE_ALL) { this.cluster.manager.triggerMaintenance(message.maintenance); return; } if (message._type === shared_1.messageType.CLIENT_SPAWN_NEXT_CLUSTER) { this.cluster.manager.queue.next(); return; } if (message._type === shared_1.messageType.HEARTBEAT_ACK) { this.cluster.manager.heartbeat?.ack(this.cluster.id, message.date); return; } if (message._type === shared_1.messageType.CUSTOM_REPLY) { this.cluster.manager.promise.resolve(message); return; } return true; } } exports.ClusterHandler = ClusterHandler; class ClusterClientHandler { client; ipc; constructor(client, ipc) { this.client = client; this.ipc = ipc; } async handleMessage(message) { if (message._type === shared_1.messageType.CLIENT_EVAL_REQUEST) { try { if (!message._eval) throw new Error('Eval Script not provided'); this.client._respond('eval', { _eval: message._eval, _result: await this.client._eval(message._eval), _type: shared_1.messageType.CLIENT_EVAL_RESPONSE, nonce: message.nonce, }); } catch (err) { this.client._respond('eval', { _eval: message._eval, _error: (0, Util_1.makePlainError)(err), _type: shared_1.messageType.CLIENT_EVAL_RESPONSE, nonce: message.nonce, }); } return null; } if (message._type === shared_1.messageType.CLIENT_MANAGER_EVAL_RESPONSE) { this.client.promise.resolve({ _result: message._result, _error: message._error, nonce: message.nonce }); return null; } if (message._type === shared_1.messageType.CLIENT_BROADCAST_RESPONSE) { this.client.promise.resolve({ _result: message._result, _error: message._error, nonce: message.nonce }); return null; } if (message._type === shared_1.messageType.HEARTBEAT) { this.client.send({ _type: shared_1.messageType.HEARTBEAT_ACK, date: message.date }); return null; } if (message._type === shared_1.messageType.CLIENT_MAINTENANCE_DISABLE) { this.client.maintenance = false; this.client.triggerClusterReady(); return null; } if (message._type === shared_1.messageType.CLIENT_MAINTENANCE_ENABLE) { this.client.maintenance = message.maintenance || true; return null; } if (message._type === shared_1.messageType.CUSTOM_REPLY) { this.client.promise.resolve(message); return null; } return true; } } exports.ClusterClientHandler = ClusterClientHandler;