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