UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

122 lines (119 loc) 15 kB
import * as network_Handlers from './Handlers.es.js'; import * as network_Packets from './Packets.es.js'; import Timer from '../utils/Timer.es.js'; import Identifiers from './Identifiers.es.js'; class PacketRegistry { server; packets = /* @__PURE__ */ new Map(); handlers = /* @__PURE__ */ new Map(); constructor(server) { this.server = server; } /** * On enable hook. * @group Lifecycle */ async enable() { await this.registerPackets(); await this.registerHandlers(); } /** * On disable hook. * @group Lifecycle */ async disable() { this.handlers.clear(); this.packets.clear(); } /** * Register a packet. * @param packet - the packet. */ registerPacket(packet) { if (this.packets.has(packet.NetID)) throw new Error( `Packet ${packet.name} is trying to use id ${packet.NetID.toString(16)} which already exists!` ); this.packets.set(packet.NetID, packet); this.server.getLogger().debug(`Packet with id §b${packet.name}§r registered`); } /** * Get a packet by it's network ID. * @param id - the NetID. */ getPacket(id) { if (!this.packets.has(id)) throw new Error(`Invalid packet with id ${id}!`); return this.packets.get(id); } /** * Remove a packet from the registry. * @param id - the NetID. */ removePacket(id) { this.packets.delete(id); } registerHandler(id, handler) { if (this.handlers.has(id)) throw new Error(`Handler with id ${id} already exists!`); this.handlers.set(id, handler); this.server.getLogger().debug(`Handler with id §b${handler.constructor.name}§r registered`, "PacketRegistry/registerHandler"); } getHandler(id) { if (!this.handlers.has(id)) throw new Error(`Invalid handler with id ${id.toString(16)}!`); return this.handlers.get(id); } /** * Merge two handlers. * This is useful if you want to extend a handler without actually replacing it. * * @param handler - the first handler, executed first. * @param handler2 - the second handler. */ appendHandler(handler, handler2) { const res = new class Handler { async handle(packet, server, session) { await handler.handle(packet, server, session); await handler2.handle(packet, server, session); } }(); return res; } /** * Remove a handler from the registry. * @param id - the handler id. */ removeHandler(id) { this.handlers.delete(id); } /** * Dynamically register all packets exported by './Protocol'. */ async registerPackets() { const timer = new Timer(); Object.entries(network_Packets).filter(([, value]) => value.name !== "DataPacket" && value.name !== "BatchPacket").map(([, value]) => this.registerPacket(value)); this.server.getLogger().verbose( `Registered §b${this.packets.size}§r of §b${Array.from(Object.keys(Identifiers)).length - 2}§r packet(s) (took §e${timer.stop()} ms§r)!` ); } /** * Dynamically register all handlers exported by './Handlers'. */ async registerHandlers() { const timer = new Timer(); Object.entries(network_Handlers).map(([, value]) => this.registerHandler(value.NetID, new value())); this.server.getLogger().verbose(`Registered §b${this.handlers.size}§r packet handler(s) (took §e${timer.stop()} ms§r)!`); } /** * Get all packets from the registry. */ getPackets() { return this.packets; } /** * Get all handlers from the registry. */ getHandlers() { return this.handlers; } } export { PacketRegistry as default }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFja2V0UmVnaXN0cnkuZXMuanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9uZXR3b3JrL1BhY2tldFJlZ2lzdHJ5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIEhhbmRsZXJzIGZyb20gJy4vSGFuZGxlcnMnO1xuaW1wb3J0ICogYXMgUGFja2V0cyBmcm9tICcuL1BhY2tldHMnO1xuXG5pbXBvcnQgdHlwZSB7IFBsYXllclNlc3Npb24gfSBmcm9tICcuLi8nO1xuaW1wb3J0IHR5cGUgU2VydmVyIGZyb20gJy4uL1NlcnZlcic7XG5pbXBvcnQgVGltZXIgZnJvbSAnLi4vdXRpbHMvVGltZXInO1xuaW1wb3J0IElkZW50aWZpZXJzIGZyb20gJy4vSWRlbnRpZmllcnMnO1xuaW1wb3J0IHR5cGUgUGFja2V0SGFuZGxlciBmcm9tICcuL2hhbmRsZXIvUGFja2V0SGFuZGxlcic7XG5pbXBvcnQgdHlwZSBQcmVMb2dpblBhY2tldEhhbmRsZXIgZnJvbSAnLi9oYW5kbGVyL1ByZUxvZ2luUGFja2V0SGFuZGxlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhY2tldFJlZ2lzdHJ5IHtcbiAgICBwcml2YXRlIHNlcnZlcjogU2VydmVyO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFja2V0czogTWFwPG51bWJlciwgdHlwZW9mIFBhY2tldHMuRGF0YVBhY2tldD4gPSBuZXcgTWFwKCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVyczogTWFwPG51bWJlciwgUGFja2V0SGFuZGxlcjxhbnk+PiA9IG5ldyBNYXAoKTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihzZXJ2ZXI6IFNlcnZlcikge1xuICAgICAgICB0aGlzLnNlcnZlciA9IHNlcnZlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPbiBlbmFibGUgaG9vay5cbiAgICAgKiBAZ3JvdXAgTGlmZWN5Y2xlXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGVuYWJsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZWdpc3RlclBhY2tldHMoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5yZWdpc3RlckhhbmRsZXJzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT24gZGlzYWJsZSBob29rLlxuICAgICAqIEBncm91cCBMaWZlY3ljbGVcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZGlzYWJsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVycy5jbGVhcigpO1xuICAgICAgICB0aGlzLnBhY2tldHMuY2xlYXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciBhIHBhY2tldC5cbiAgICAgKiBAcGFyYW0gcGFja2V0IC0gdGhlIHBhY2tldC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJQYWNrZXQocGFja2V0OiB0eXBlb2YgUGFja2V0cy5EYXRhUGFja2V0KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnBhY2tldHMuaGFzKHBhY2tldC5OZXRJRCkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYFBhY2tldCAke3BhY2tldC5uYW1lfSBpcyB0cnlpbmcgdG8gdXNlIGlkICR7cGFja2V0Lk5ldElELnRvU3RyaW5nKDE2KX0gd2hpY2ggYWxyZWFkeSBleGlzdHMhYFxuICAgICAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnBhY2tldHMuc2V0KHBhY2tldC5OZXRJRCwgcGFja2V0KTtcbiAgICAgICAgdGhpcy5zZXJ2ZXIuZ2V0TG9nZ2VyKCkuZGVidWcoYFBhY2tldCB3aXRoIGlkIMKnYiR7cGFja2V0Lm5hbWV9wqdyIHJlZ2lzdGVyZWRgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBwYWNrZXQgYnkgaXQncyBuZXR3b3JrIElELlxuICAgICAqIEBwYXJhbSBpZCAtIHRoZSBOZXRJRC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0UGFja2V0KGlkOiBudW1iZXIpOiBhbnkge1xuICAgICAgICBpZiAoIXRoaXMucGFja2V0cy5oYXMoaWQpKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGFja2V0IHdpdGggaWQgJHtpZH0hYCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucGFja2V0cy5nZXQoaWQpITtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSBwYWNrZXQgZnJvbSB0aGUgcmVnaXN0cnkuXG4gICAgICogQHBhcmFtIGlkIC0gdGhlIE5ldElELlxuICAgICAqL1xuICAgIHB1YmxpYyByZW1vdmVQYWNrZXQoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnBhY2tldHMuZGVsZXRlKGlkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJIYW5kbGVyKGlkOiBudW1iZXIsIGhhbmRsZXI6IFBhY2tldEhhbmRsZXI8YW55Pik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5oYW5kbGVycy5oYXMoaWQpKSB0aHJvdyBuZXcgRXJyb3IoYEhhbmRsZXIgd2l0aCBpZCAke2lkfSBhbHJlYWR5IGV4aXN0cyFgKTtcblxuICAgICAgICB0aGlzLmhhbmRsZXJzLnNldChpZCwgaGFuZGxlcik7XG4gICAgICAgIHRoaXMuc2VydmVyXG4gICAgICAgICAgICAuZ2V0TG9nZ2VyKClcbiAgICAgICAgICAgIC5kZWJ1ZyhgSGFuZGxlciB3aXRoIGlkIMKnYiR7aGFuZGxlci5jb25zdHJ1Y3Rvci5uYW1lfcKnciByZWdpc3RlcmVkYCwgJ1BhY2tldFJlZ2lzdHJ5L3JlZ2lzdGVySGFuZGxlcicpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRIYW5kbGVyKGlkOiBudW1iZXIpOiBQYWNrZXRIYW5kbGVyPGFueT4gfCBQcmVMb2dpblBhY2tldEhhbmRsZXI8YW55PiB7XG4gICAgICAgIGlmICghdGhpcy5oYW5kbGVycy5oYXMoaWQpKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaGFuZGxlciB3aXRoIGlkICR7aWQudG9TdHJpbmcoMTYpfSFgKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVycy5nZXQoaWQpITtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNZXJnZSB0d28gaGFuZGxlcnMuXG4gICAgICogVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gZXh0ZW5kIGEgaGFuZGxlciB3aXRob3V0IGFjdHVhbGx5IHJlcGxhY2luZyBpdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gdGhlIGZpcnN0IGhhbmRsZXIsIGV4ZWN1dGVkIGZpcnN0LlxuICAgICAqIEBwYXJhbSBoYW5kbGVyMiAtIHRoZSBzZWNvbmQgaGFuZGxlci5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXBwZW5kSGFuZGxlcihoYW5kbGVyOiBQYWNrZXRIYW5kbGVyPGFueT4sIGhhbmRsZXIyOiBQYWNrZXRIYW5kbGVyPGFueT4pOiBQYWNrZXRIYW5kbGVyPGFueT4ge1xuICAgICAgICBjb25zdCByZXMgPSBuZXcgKGNsYXNzIEhhbmRsZXIge1xuICAgICAgICAgICAgcHVibGljIGFzeW5jIGhhbmRsZShwYWNrZXQ6IGFueSwgc2VydmVyOiBTZXJ2ZXIsIHNlc3Npb246IFBsYXllclNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVyLmhhbmRsZShwYWNrZXQsIHNlcnZlciwgc2Vzc2lvbik7XG4gICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlcjIuaGFuZGxlKHBhY2tldCwgc2VydmVyLCBzZXNzaW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkoKTtcblxuICAgICAgICByZXR1cm4gcmVzIGFzIFBhY2tldEhhbmRsZXI8YW55PjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSBoYW5kbGVyIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICAgICAqIEBwYXJhbSBpZCAtIHRoZSBoYW5kbGVyIGlkLlxuICAgICAqL1xuICAgIHB1YmxpYyByZW1vdmVIYW5kbGVyKGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5oYW5kbGVycy5kZWxldGUoaWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIER5bmFtaWNhbGx5IHJlZ2lzdGVyIGFsbCBwYWNrZXRzIGV4cG9ydGVkIGJ5ICcuL1Byb3RvY29sJy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIHJlZ2lzdGVyUGFja2V0cygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgdGltZXIgPSBuZXcgVGltZXIoKTtcblxuICAgICAgICAvLyBEeW5hbWljYWxseSByZWdpc3RlciBwYWNrZXRzXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gbWFudWFsbHkgaWdub3JlIERhdGFQYWNrZXQgJiBCYXRjaFBhY2tldFxuICAgICAgICBPYmplY3QuZW50cmllcyhQYWNrZXRzKVxuICAgICAgICAgICAgLmZpbHRlcigoWywgdmFsdWVdKSA9PiB2YWx1ZS5uYW1lICE9PSAnRGF0YVBhY2tldCcgJiYgdmFsdWUubmFtZSAhPT0gJ0JhdGNoUGFja2V0JylcbiAgICAgICAgICAgIC5tYXAoKFssIHZhbHVlXSkgPT4gdGhpcy5yZWdpc3RlclBhY2tldCh2YWx1ZSkpO1xuXG4gICAgICAgIHRoaXMuc2VydmVyXG4gICAgICAgICAgICAuZ2V0TG9nZ2VyKClcbiAgICAgICAgICAgIC52ZXJib3NlKFxuICAgICAgICAgICAgICAgIGBSZWdpc3RlcmVkIMKnYiR7dGhpcy5wYWNrZXRzLnNpemV9wqdyIG9mIMKnYiR7XG4gICAgICAgICAgICAgICAgICAgIEFycmF5LmZyb20oT2JqZWN0LmtleXMoSWRlbnRpZmllcnMpKS5sZW5ndGggLSAyXG4gICAgICAgICAgICAgICAgfcKnciBwYWNrZXQocykgKHRvb2sgwqdlJHt0aW1lci5zdG9wKCl9IG1zwqdyKSFgXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIER5bmFtaWNhbGx5IHJlZ2lzdGVyIGFsbCBoYW5kbGVycyBleHBvcnRlZCBieSAnLi9IYW5kbGVycycuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyByZWdpc3RlckhhbmRsZXJzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB0aW1lciA9IG5ldyBUaW1lcigpO1xuXG4gICAgICAgIC8vIER5bmFtaWNhbGx5IHJlZ2lzdGVyIGhhbmRsZXJzXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKEhhbmRsZXJzKS5tYXAoKFssIHZhbHVlXSkgPT4gdGhpcy5yZWdpc3RlckhhbmRsZXIodmFsdWUuTmV0SUQhLCBuZXcgKHZhbHVlIGFzIGFueSkoKSkpO1xuXG4gICAgICAgIHRoaXMuc2VydmVyXG4gICAgICAgICAgICAuZ2V0TG9nZ2VyKClcbiAgICAgICAgICAgIC52ZXJib3NlKGBSZWdpc3RlcmVkIMKnYiR7dGhpcy5oYW5kbGVycy5zaXplfcKnciBwYWNrZXQgaGFuZGxlcihzKSAodG9vayDCp2Uke3RpbWVyLnN0b3AoKX0gbXPCp3IpIWApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhbGwgcGFja2V0cyBmcm9tIHRoZSByZWdpc3RyeS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0UGFja2V0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFja2V0cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYWxsIGhhbmRsZXJzIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRIYW5kbGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlcnM7XG4gICAgfVxufVxuIl0sIm5hbWVzIjpbIlBhY2tldHMiLCJIYW5kbGVycyJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFVQSxNQUFxQixjQUFlLENBQUE7QUFBQSxFQUN4QixNQUFBO0FBQUEsRUFDUyxPQUFBLHVCQUFzRCxHQUFJLEVBQUE7QUFBQSxFQUMxRCxRQUFBLHVCQUFnRCxHQUFJLEVBQUE7QUFBQSxFQUU5RCxZQUFZLE1BQWdCLEVBQUE7QUFDL0IsSUFBQSxJQUFBLENBQUssTUFBUyxHQUFBLE1BQUE7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