dredless 0.4.0 → 0.5.0
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 +58 -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 +59 -2
|
@@ -342,6 +342,54 @@
|
|
|
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 startedAt = Date.now();
|
|
350
|
+
const socket = new WebSocket2(`wss://${resolved.domain}:4000/`);
|
|
351
|
+
return new Promise((resolve, reject) => {
|
|
352
|
+
let settled = false;
|
|
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 = () => socket.send("yo");
|
|
362
|
+
const onMessage = async (event) => {
|
|
363
|
+
try {
|
|
364
|
+
const data = JSON.parse(await websocketText(event?.data ?? event));
|
|
365
|
+
const playerCount = Number(data.player_count);
|
|
366
|
+
const maxPlayerCount = Number(data.player_max);
|
|
367
|
+
if (!Number.isFinite(playerCount) || !Number.isFinite(maxPlayerCount)) throw new Error("Invalid server status response");
|
|
368
|
+
finish(resolve, { playerCount, maxPlayerCount, ping: Date.now() - startedAt });
|
|
369
|
+
} catch (error) {
|
|
370
|
+
finish(reject, new Error(`Invalid status response from ${resolved.domain}: ${error.message}`));
|
|
371
|
+
}
|
|
372
|
+
};
|
|
373
|
+
const onError = (event) => finish(reject, event?.error || new Error(`WebSocket error while fetching ${resolved.domain}`));
|
|
374
|
+
if (typeof socket.on === "function") {
|
|
375
|
+
socket.on("open", onOpen);
|
|
376
|
+
socket.on("message", onMessage);
|
|
377
|
+
socket.on("error", onError);
|
|
378
|
+
} else if (typeof socket.addEventListener === "function") {
|
|
379
|
+
socket.addEventListener("open", onOpen);
|
|
380
|
+
socket.addEventListener("message", onMessage);
|
|
381
|
+
socket.addEventListener("error", onError);
|
|
382
|
+
} else {
|
|
383
|
+
socket.onopen = onOpen;
|
|
384
|
+
socket.onmessage = onMessage;
|
|
385
|
+
socket.onerror = onError;
|
|
386
|
+
}
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
async function fetchServerStatuses(baseUrl = DEFAULT_BASE_URL) {
|
|
390
|
+
const servers = await fetchServers(baseUrl);
|
|
391
|
+
return Promise.all(servers.map(async (server2) => ({ ...server2, ...await fetchServerStatus(server2, baseUrl) })));
|
|
392
|
+
}
|
|
345
393
|
async function fetchNoticeVersion(baseUrl = DEFAULT_BASE_URL) {
|
|
346
394
|
const response = await new HttpClient({ baseUrl }).request("index.html");
|
|
347
395
|
if (!response.ok) throw new Error(`Failed to fetch notice version: ${response.status} ${response.statusText}`);
|
|
@@ -406,8 +454,15 @@
|
|
|
406
454
|
meta
|
|
407
455
|
};
|
|
408
456
|
}
|
|
457
|
+
async function websocketText(data) {
|
|
458
|
+
if (typeof data === "string") return data;
|
|
459
|
+
if (data instanceof ArrayBuffer) return new TextDecoder().decode(data);
|
|
460
|
+
if (ArrayBuffer.isView(data)) return new TextDecoder().decode(data);
|
|
461
|
+
if (typeof data?.text === "function") return data.text();
|
|
462
|
+
return String(data);
|
|
463
|
+
}
|
|
409
464
|
function server(index, domain, description) {
|
|
410
|
-
return { index, domain, description
|
|
465
|
+
return { index, domain, description };
|
|
411
466
|
}
|
|
412
467
|
var cache, ServerDirectory, fetchGameVersion, fetchServers;
|
|
413
468
|
var init_servers = __esm({
|
|
@@ -12043,6 +12098,8 @@
|
|
|
12043
12098
|
fetchAccountStatus,
|
|
12044
12099
|
fetchNoticeVersion,
|
|
12045
12100
|
fetchGameVersion,
|
|
12101
|
+
fetchServerStatus,
|
|
12102
|
+
fetchServerStatuses,
|
|
12046
12103
|
fetchServers,
|
|
12047
12104
|
fetchShips: fetchShips2,
|
|
12048
12105
|
fetchShipList: fetchShipListForBrowser,
|