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.
@@ -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, playerCount: 0, maxPlayerCount: 0, ping: null };
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,