# Realtime gameservers op PlayDrop: Colyseus en MongoDB

Draai een gehoste Colyseus 0.17-server met een MongoDB-database voor je game, verbind vanuit de browser met de SDK, test met twee spelers en ken de limieten.

Source: https://www.playdrop.ai/nl/create/learn/game-servers

PlayDrop kan de serverkant van je game hosten: een standaard Colyseus-server met een eigen MongoDB-database, geverifieerde spelers en geen infrastructuur om zelf te beheren. Gebruik hem voor realtime wedstrijden, beurtgebaseerde games, gedeelde werelden en alles waarbij een speler niet mag kunnen valsspelen. Een server is optioneel; je game kan ook een server aanroepen die je zelf host.

## De server schrijven

Exporteer een `rooms`-map uit één ES-module. PlayDrop start de server; roep `listen()` niet aan en definieer geen `onAuth`, want PlayDrop verifieert elke speler vóór `onJoin`.

```js
import { Room, defineRoom } from "colyseus";
import { MongoClient } from "mongodb";

class GameRoom extends Room {
  maxClients = 8;
  async onCreate() {
    this.mongo = new MongoClient(process.env.PLAYDROP_MONGO_URL);
    await this.mongo.connect();
    this.onMessage("move", (client, move) => this.applyMove(client.auth.userId, move));
  }
  onJoin(client) {
    // client.auth is the verified PlayDrop player: userId, username, appRole, isTestPlayer…
  }
  async onDispose() { await this.mongo?.close(); }
}

export const rooms = { game: defineRoom(GameRoom) };
```

Verbind met MongoDB binnen de levenscyclus van de kamer (room), nooit op moduleniveau: `PLAYDROP_MONGO_URL` bestaat alleen tijdens het draaien. Maak indexen aan voor je query's.

## De server declareren

Bundel de server in één bestand en laat de catalogus ernaar verwijzen:

```json
{ "server": { "entry": "server/index.mjs", "rooms": ["game"] } }
```

Upload hem in een [pakket](https://www.playdrop.ai/nl/create/learn/packaging); de eenvoudige HTML-route kan geen server meenemen.

## Regels van de gehoste runtime

- Colyseus 0.17 (`colyseus` 0.17.10, `@colyseus/schema` 4.0.30), MongoDB-driver 7.5, op Node.js 24.22.1.
- Eén op zichzelf staande ES-module van maximaal 2 MiB. Hij mag alleen `colyseus`, `@colyseus/core`, `@colyseus/schema`, `mongodb` en `@playdrop/server` importeren; bundel al het andere.
- Maximaal 2 kamertypen, 8 spelers per kamer, 4 uur per kamer, 30 berichten per seconde per speler en 512 KiB per bericht.
- Geen internettoegang: alleen MongoDB en PlayDrop-diensten zijn bereikbaar.
- Spelers moeten ingelogd zijn.
- Eén database per game, bewaard over versies heen en meegeteld in de opslag van de maker. Stuur het adres of de inloggegevens nooit naar een browser.

## Verbinden vanuit de browser

```js
const sdk = await playdrop.init();
const room = await sdk.multiplayer.join("game");
room.onStateChange((state) => render(state));
room.send("move", { x: 1 });
```

`join` regelt de groepsplaatsen en het inloggen van PlayDrop; zie [onlinegroepen](https://www.playdrop.ai/nl/create/learn/online-party). Voor meer controle op laag niveau geeft `sdk.multiplayer.getConnection()` `{ endpoint, token, expiresAt }` terug voor de officiële Colyseus-client uit `sdk.libs.colyseus.load()`.

## Server-SDK

`@playdrop/server` voegt vertrouwde platformaanroepen toe: vrienden en gamekaarten (`playdrop.social`), verificatie van aankopen (`playdrop.shop`), AI-generatie betaald door de maker (`playdrop.ai`) en kamerspraak (`playdrop.multiplayer.forRoom`). Ze werken alleen bij geüploade games. Zie de [referentie van de server-SDK](https://www.playdrop.ai/nl/create/learn/server-sdk).

## Testen

Draai tijdens de ontwikkeling Colyseus 0.17 en MongoDB lokaal en verbind je lokale client met je lokale server. Om de gehoste server te testen upload je een privéversie en open je `https://www.playdrop.ai/create/games/<slug>/test?v=<version>&player=1`, en daarna dezelfde link met `player=2` in een tweede venster. Elk venster speelt als een aparte testspeler van jou. Publiceer de geteste versie met `publish_game_version` als het werkt.

Houd rekening met verbroken verbindingen: Colyseus houdt bij opnieuw verbinden een plaats korte tijd vrij, en de status van de kamer moet een terugkerende speler laten verdergaan.

## Gerelateerde gidsen

- [Onlinegroepen en spraak](https://www.playdrop.ai/nl/create/learn/online-party): Laat vrienden je game samen online spelen: geef groepsgroottes op, open het groepsvenster van PlayDrop, neem gereserveerde plaatsen in kamers in en regel kamerspraak.
- [Server-SDK](https://www.playdrop.ai/nl/create/learn/server-sdk): Door PlayDrop gehoste gameservers: runtimeregels, de geverifieerde PlayDropPlayer, playdrop.social, playdrop.shop, playdrop.ai en playdrop.multiplayer.
- [Verpakken en .play](https://www.playdrop.ai/nl/create/learn/packaging): Richt een gebouwde gamemap, ZIP of .play in met catalogue.json in de hoofdmap, geef media en servers op en upload met prepare_catalogue_upload.
