bedrock-protocol/src/datatypes/util.js
2025-08-15 00:59:58 +01:00

69 lines
1.8 KiB
JavaScript

const fs = require('fs')
const UUID = require('uuid-1345')
const { parse } = require('json-bigint')
const debug = require('debug')('minecraft-protocol')
async function checkStatus (res) {
if (res.ok) { // res.status >= 200 && res.status < 300
return res.text().then(parse)
} else {
const resp = await res.text()
debug('Request fail', resp)
throw Error(`${res.status} ${res.statusText} ${resp}`)
}
}
function getRandomUint64 () {
const high = Math.floor(Math.random() * 0xFFFFFFFF)
const low = Math.floor(Math.random() * 0xFFFFFFFF)
const result = (BigInt(high) << 32n) | BigInt(low)
return result
}
function getFiles (dir) {
let results = []
const list = fs.readdirSync(dir)
list.forEach((file) => {
file = dir + '/' + file
const stat = fs.statSync(file)
if (stat && stat.isDirectory()) {
results = results.concat(getFiles(file))
} else {
results.push(file)
}
})
return results
}
function sleep (ms) {
return new Promise(resolve => setTimeout(resolve, ms))
}
async function waitFor (cb, withTimeout, onTimeout) {
let t
const ret = await Promise.race([
new Promise((resolve, reject) => cb(resolve, reject)),
new Promise(resolve => { t = setTimeout(() => resolve('timeout'), withTimeout) })
])
clearTimeout(t)
if (ret === 'timeout') await onTimeout()
return ret
}
function serialize (obj = {}, fmt) {
return JSON.stringify(obj, (k, v) => typeof v === 'bigint' ? v.toString() : v, fmt)
}
function uuidFrom (string) {
return UUID.v3({ namespace: '6ba7b811-9dad-11d1-80b4-00c04fd430c8', name: string })
}
function nextUUID () {
return uuidFrom(Date.now().toString())
}
const isDebug = process.env.DEBUG?.includes('minecraft-protocol')
module.exports = { getFiles, sleep, waitFor, serialize, uuidFrom, nextUUID, isDebug, getRandomUint64, checkStatus }