dredless 0.4.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/dredless.global.js +61 -1
- package/dist/browser/dredless.global.js.map +3 -3
- package/docs/API_REFERENCE.md +1 -4
- package/docs/BROWSER_API.md +2 -0
- package/docs/NODE_API.md +16 -1
- package/package.json +1 -1
- package/src/browser.d.ts +3 -1
- package/src/browser.js +4 -2
- package/src/index.d.ts +12 -4
- package/src/index.js +3 -1
- package/src/network/index.js +1 -1
- package/src/network/servers.d.ts +2 -0
- package/src/network/servers.js +62 -2
|
@@ -342,6 +342,57 @@
|
|
|
342
342
|
});
|
|
343
343
|
|
|
344
344
|
// src/network/servers.js
|
|
345
|
+
async function fetchServerStatus(server2, baseUrl = DEFAULT_BASE_URL) {
|
|
346
|
+
const resolved = await resolveServer(server2, baseUrl);
|
|
347
|
+
if (!resolved?.domain) throw new Error(`Unable to resolve server ${serverId(server2)}`);
|
|
348
|
+
const WebSocket2 = await getWebSocket();
|
|
349
|
+
const socket = new WebSocket2(`wss://${resolved.domain}:4000/`);
|
|
350
|
+
return new Promise((resolve, reject) => {
|
|
351
|
+
let settled = false;
|
|
352
|
+
let startedAt = 0;
|
|
353
|
+
const finish = (callback, value) => {
|
|
354
|
+
if (settled) return;
|
|
355
|
+
settled = true;
|
|
356
|
+
clearTimeout(timeout);
|
|
357
|
+
callback(value);
|
|
358
|
+
if (socket.readyState === 0 || socket.readyState === 1) socket.close();
|
|
359
|
+
};
|
|
360
|
+
const timeout = setTimeout(() => finish(reject, new Error(`Timed out fetching status for ${resolved.domain}`)), 1e4);
|
|
361
|
+
const onOpen = () => {
|
|
362
|
+
startedAt = Date.now();
|
|
363
|
+
socket.send("yo");
|
|
364
|
+
};
|
|
365
|
+
const onMessage = async (event) => {
|
|
366
|
+
try {
|
|
367
|
+
const data = JSON.parse(await websocketText(event?.data ?? event));
|
|
368
|
+
const playerCount = Number(data.player_count);
|
|
369
|
+
const maxPlayerCount = Number(data.player_max);
|
|
370
|
+
if (!Number.isFinite(playerCount) || !Number.isFinite(maxPlayerCount)) throw new Error("Invalid server status response");
|
|
371
|
+
finish(resolve, { playerCount, maxPlayerCount, ping: Date.now() - startedAt });
|
|
372
|
+
} catch (error) {
|
|
373
|
+
finish(reject, new Error(`Invalid status response from ${resolved.domain}: ${error.message}`));
|
|
374
|
+
}
|
|
375
|
+
};
|
|
376
|
+
const onError = (event) => finish(reject, event?.error || new Error(`WebSocket error while fetching ${resolved.domain}`));
|
|
377
|
+
if (typeof socket.on === "function") {
|
|
378
|
+
socket.on("open", onOpen);
|
|
379
|
+
socket.on("message", onMessage);
|
|
380
|
+
socket.on("error", onError);
|
|
381
|
+
} else if (typeof socket.addEventListener === "function") {
|
|
382
|
+
socket.addEventListener("open", onOpen);
|
|
383
|
+
socket.addEventListener("message", onMessage);
|
|
384
|
+
socket.addEventListener("error", onError);
|
|
385
|
+
} else {
|
|
386
|
+
socket.onopen = onOpen;
|
|
387
|
+
socket.onmessage = onMessage;
|
|
388
|
+
socket.onerror = onError;
|
|
389
|
+
}
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
async function fetchServerStatuses(baseUrl = DEFAULT_BASE_URL) {
|
|
393
|
+
const servers = await fetchServers(baseUrl);
|
|
394
|
+
return Promise.all(servers.map(async (server2) => ({ ...server2, ...await fetchServerStatus(server2, baseUrl) })));
|
|
395
|
+
}
|
|
345
396
|
async function fetchNoticeVersion(baseUrl = DEFAULT_BASE_URL) {
|
|
346
397
|
const response = await new HttpClient({ baseUrl }).request("index.html");
|
|
347
398
|
if (!response.ok) throw new Error(`Failed to fetch notice version: ${response.status} ${response.statusText}`);
|
|
@@ -406,8 +457,15 @@
|
|
|
406
457
|
meta
|
|
407
458
|
};
|
|
408
459
|
}
|
|
460
|
+
async function websocketText(data) {
|
|
461
|
+
if (typeof data === "string") return data;
|
|
462
|
+
if (data instanceof ArrayBuffer) return new TextDecoder().decode(data);
|
|
463
|
+
if (ArrayBuffer.isView(data)) return new TextDecoder().decode(data);
|
|
464
|
+
if (typeof data?.text === "function") return data.text();
|
|
465
|
+
return String(data);
|
|
466
|
+
}
|
|
409
467
|
function server(index, domain, description) {
|
|
410
|
-
return { index, domain, description
|
|
468
|
+
return { index, domain, description };
|
|
411
469
|
}
|
|
412
470
|
var cache, ServerDirectory, fetchGameVersion, fetchServers;
|
|
413
471
|
var init_servers = __esm({
|
|
@@ -12043,6 +12101,8 @@
|
|
|
12043
12101
|
fetchAccountStatus,
|
|
12044
12102
|
fetchNoticeVersion,
|
|
12045
12103
|
fetchGameVersion,
|
|
12104
|
+
fetchServerStatus,
|
|
12105
|
+
fetchServerStatuses,
|
|
12046
12106
|
fetchServers,
|
|
12047
12107
|
fetchShips: fetchShips2,
|
|
12048
12108
|
fetchShipList: fetchShipListForBrowser,
|