minecraft-server-ping
Version:
Minecraft server status
2 lines • 5.69 kB
JavaScript
;var A=Object.create;var m=Object.defineProperty;var C=Object.getOwnPropertyDescriptor;var H=Object.getOwnPropertyNames;var D=Object.getPrototypeOf,U=Object.prototype.hasOwnProperty;var N=(r,e)=>{for(var t in e)m(r,t,{get:e[t],enumerable:!0})},B=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of H(e))!U.call(r,o)&&o!==t&&m(r,o,{get:()=>e[o],enumerable:!(n=C(e,o))||n.enumerable});return r};var E=(r,e,t)=>(t=r!=null?A(D(r)):{},B(e||!r||!r.__esModule?m(t,"default",{value:r,enumerable:!0}):t,r)),$=r=>B(m({},"__esModule",{value:!0}),r);var z={};N(z,{MinecraftPackageType:()=>k,PacketDecoder:()=>g,createHandshakePacket:()=>P,createPingPacket:()=>b,ping:()=>w,pingResult:()=>W,pingUri:()=>x,pingUriResult:()=>V,srvRecordResult:()=>h,srvRecordsResult:()=>v});module.exports=$(z);var p=require("net"),d=require("@luolapeikko/result-option");var R=require("dns"),f=require("@luolapeikko/result-option");function M(r){if(r.length===0)throw new Error("Expected at least one element, got none")}function v(r){return new Promise(e=>{(0,R.resolveSrv)(r,(t,n)=>{t?e((0,f.Err)(t)):(M(n),e((0,f.Ok)(n)))})})}async function h(r){let e=await v(r);return e.isOk?(0,f.Ok)(e.ok()[0]):(0,f.Err)(e.err())}var c=E(require("varint"),1),J=736,k=(t=>(t[t.HANDSHAKE=0]="HANDSHAKE",t[t.PING=1]="PING",t))(k||{});function I(r,e){return Buffer.concat([Buffer.from(c.default.encode(c.default.encodingLength(r)+e.length)),Buffer.from(c.default.encode(r)),e])}function P(r){let e=Buffer.allocUnsafe(2);return e.writeUInt16BE(r.port,0),Buffer.concat([I(0,Buffer.concat([Buffer.from(c.default.encode(J)),Buffer.from(c.default.encode(r.hostname.length)),Buffer.from(r.hostname,"utf8"),e,Buffer.from(c.default.encode(1))])),I(0,Buffer.alloc(0))])}function b(r){let e=Buffer.allocUnsafe(8);return e.writeBigUInt64BE(r),I(1,e)}var S=require("stream"),s=E(require("varint"),1);var g=class extends S.Writable{packetInfo;buffer;constructor(e){super(e),this.buffer=Buffer.alloc(0)}oncePromise(e){return new Promise(t=>{this.once(e,t)})}_write(e,t,n){if(this.packetInfo||(this.packetInfo=this.decodeHeader(e)),this.buffer=Buffer.concat([this.buffer,e]),this.buffer.length<this.packetInfo.length)return n();if(this.buffer.length>this.packetInfo.length)return n(new Error("we did overrun expected data size!"));try{switch(this.packetInfo.id){case 0:{this.emit("handshake",this.decodeHandshake(this.getPayload(this.packetInfo,this.buffer)));break}case 1:{this.emit("pong",this.decodePong(this.getPayload(this.packetInfo,this.buffer)));break}default:this.emit("error",new Error(`Unknown packet id: ${this.packetInfo.id}`))}this.buffer=Buffer.alloc(0),this.packetInfo=void 0}catch(o){this.emit("error",o)}n()}decodeHeader(e){let t=s.default.decode(e);return{id:e.readUInt8(s.default.encodingLength(t)),length:t+s.default.encodingLength(t),offset:s.default.encodingLength(t)+1}}getPayload(e,t){return t.subarray(e.offset,t.length)}decodeHandshake(e){let t=s.default.decode(e),n=e.subarray(s.default.encodingLength(t),s.default.encodingLength(t)+t);return JSON.parse(n.toString())}decodePong(e){let t=e.readBigUInt64BE(0);return Number(BigInt(Date.now())-t)}};var _={hostname:"localhost",port:25565};function T(r){return r instanceof Error?r:typeof r=="string"?new Error(r):new Error(`unknown error: ${JSON.stringify(r)}`)}async function G(r,e){if((0,p.isIP)(r)!==0){e.logger?.debug(`checkSrvRecord: ${r} is IP, returning undefined`);return}let t=await h(`_minecraft._tcp.${r}`);if(t.isErr){e.logger?.debug(`checkSrvRecord: ${r} has no SRV record, returning undefined`);return}let{name:n,port:o}=t.ok();return{hostname:n,port:o}}function K(r,e){let t={},{protocol:n,hostname:o,port:u}=typeof r=="string"?new URL(r):r;if(!o||!n||n!=="minecraft:")throw new TypeError("not correct minecraft URI");let i=u?parseInt(u,10):void 0;if(i&&isNaN(i))throw new TypeError("not correct minecraft URI");return o&&(t.hostname=o),i&&(t.port=i),e.logger?.debug(`urlToAddress: ${r.toString()} => ${JSON.stringify(t)}`),t}async function x(r,e={}){let t=await(typeof r=="function"?r():r);return w(K(t,e),e)}async function V(r,e={}){try{return(0,d.Ok)(await x(r,e))}catch(t){return(0,d.Err)(T(t))}}async function w(r,e={}){let t=Object.assign({},_,await(typeof r=="function"?r():r));if(t.hostname!=="localhost"){let n=await G(t.hostname,e);n&&(t=n)}return e.logger?.info(`ping: ${t.hostname}:${t.port.toString()}`),j(t,e)}async function W(r,e={}){try{return(0,d.Ok)(await w(r,e))}catch(t){return(0,d.Err)(T(t))}}function j(r,e){let t;return new Promise((n,o)=>{let u=(a,l)=>{l.destroy(),t&&clearTimeout(t),e.logger?.error(`openConnection: error: ${a.message}`),o(a)},i=(0,p.createConnection)(r.port,r.hostname,async()=>{e.logger?.debug(`openConnection: connected to ${r.hostname}:${r.port.toString()}`);let a=new g;i.pipe(a),a.once("error",O=>u(O,i)),e.logger?.debug("openConnection: => sending handshake"),i.write(P(r));let l=await a.oncePromise("handshake");e.logger?.debug("openConnection: <= received handshake data"),e.logger?.debug("openConnection: => sending ping"),i.write(b(BigInt(Date.now())));let L=await a.oncePromise("pong");e.logger?.debug("openConnection: <= received pong"),t&&clearTimeout(t),i.end(),e.logger?.debug("openConnection: end"),n({...l,ping:L})});i.once("error",a=>u(a,i)),i.once("timeout",()=>{i.destroy(),t&&clearTimeout(t),e.logger?.debug("openConnection: timeout"),o(new Error("Timed out"))});let y=e.timeout??1e4;t=setTimeout(()=>{i.end(),o(new Error(`Timed out (${y.toString()} ms)`))},y)})}0&&(module.exports={MinecraftPackageType,PacketDecoder,createHandshakePacket,createPingPacket,ping,pingResult,pingUri,pingUriResult,srvRecordResult,srvRecordsResult});
//# sourceMappingURL=index.js.map