Bir odayı çevrimiçi tut
Servisin sınırlarına uyan bekleyerek yeniden deneme ile odanız her kapandığında yeniden açın.
Bir oda, hostu servis bağlantısını kaybettiğinde, anahtarı iptal edildiğinde veya süresi dolduğunda ya da siz kapattığınızda kapanır. Bu host sonsuza kadar çalışır: odası her sona erdiğinde yeni bir oda açar ve servis istediğinde bekleyerek yeniden dener.
host.mjs
import { createRoom, RoomAdmissionError } from 'ball2d/node';
const config = {
apiKey: process.env.BALL2D_API_KEY,
roomName: 'Always-on football',
noPlayer: true,
public: true,
};
const stopping = new AbortController();
for (const signal of ['SIGINT', 'SIGTERM'])
process.once(signal, () => stopping.abort());
const sleep = (seconds) =>
new Promise((resolve) => {
const timer = setTimeout(resolve, seconds * 1000);
stopping.signal.addEventListener(
'abort',
() => (clearTimeout(timer), resolve()),
{ once: true },
);
});
function setUp(room) {
room.onError = (message) =>
console.error(`[${room.roomId}]`, message);
room.onPlayerJoin = (player) =>
room.setPlayerTeam(player.id, 1);
return room.setDefaultStadium('Classic');
}
let failures = 0;
while (!stopping.signal.aborted) {
let room;
try {
room = await createRoom(config, {
signal: stopping.signal,
});
} catch (error) {
if (stopping.signal.aborted) break;
// Bad configuration.
if (error instanceof TypeError) throw error;
if (
error instanceof RoomAdmissionError &&
[400, 401, 403].includes(error.status)
)
throw error;
failures++;
const wait =
error.retryAfterSeconds ??
Math.min(300, 2 ** failures) + Math.random() * 3;
console.warn(
`Room did not open: ${error.message}.` +
` Retrying in ${Math.round(wait)} s.`,
);
await sleep(wait);
continue;
}
failures = 0;
console.log('Room open:', room.roomLink);
await setUp(room).catch((error) =>
console.error('Setup failed:', error),
);
// Wait until the room ends or we are asked to stop.
await new Promise((resolve) => {
room.signal.addEventListener('abort', resolve, {
once: true,
});
stopping.signal.addEventListener('abort', resolve, {
once: true,
});
});
room.close();
await room.closed;
if (!stopping.signal.aborted) await sleep(5);
}Nasıl çalışır
- Kalıcı hatalarda durun. Geçersiz ayarlar ve geçersiz, süresi dolmuş veya iptal edilmiş anahtarlar kendiliğinden düzelmez; bu nedenle host çıkar ve süreç yöneticiniz veya uyarı sisteminiz devreye girer.
- Kalanlarında bekleyerek yeniden deneyin. Sınırlar (
429) servisin gönderdiğiretryAfterSecondssüresi kadar bekler. Diğer hatalar, birden çok hostun aynı anda yeniden denememesi için jitter ile birlikte üstel olarak daha uzun, en fazla beş dakikaya kadar bekler. - Odanın kendi sinyalini bekleyin.
room.signal, oda nasıl sona ererse ersin iptal edilir; böylece tek birawaitkaybolan bir bağlantıyı, bir iptali ve bir süre dolmasını kapsar. - Yeniden açmadan önce duraklayın. Kısa bir gecikme, odalar sürekli kapanırsa dakika başına istek kotanızı bir döngüde tüketmenizi önler.
- Düzgün şekilde kapatın.
SIGTERM, odayı kapatır,room.closed'ı bekler ve döngüyü sonlandırır.
Kapanan bir odadaki oyuncular yeni odaya taşınmaz; yeni oda yeni bir bağlantıya sahiptir. Kendi sitenizde, güncel room.roomLink'e işaret eden sabit bir bağlantı yayınlayın veya oyuncuların oda listesinde bulabilmesi için odayı herkese açık olarak listeleyin.