# @sojogg/sdk

Sojo: one account, every game. Players prove their X account once, and every Sojo game knows who they are. This package is the browser client and the server helpers for a game on Sojo.

Full docs for you or your agent: https://sojo.gg/agents.txt

## Install

```sh
npm i @sojogg/sdk
```

ESM only. Types included. No dependencies.

## Client (browser)

```js
import { init } from "@sojogg/sdk/client";

const sojo = init({ game: "gridrunner" }); // your registered game id
const me = await sojo.me(); // null, or { sub, handle, name, pfp, perks }
button.onclick = () => sojo.signIn(); // Sojo's sign-in sheet, drawn in Sojo's frame
const token = await sojo.token(); // a 15-minute game token: send it to your server
```

Nothing runs on import; the first `init()` mounts Sojo's frame. Payments (`gems`, `topUp`, `spend`), Royal (`supporter`, `subscribe`), events (`track`), X intents (`sojo.x`) and ads (`sojo.ads`): https://sojo.gg/docs/api.md

A plain page can use the script instead: `<script src="https://id.sojo.gg/v1/sdk.js"></script>` sets `window.Sojo`.

## Server (Workers and Node 20+)

```js
import { verifySojoToken, SojoTokenError } from "@sojogg/sdk/server";

const claims = await verifySojoToken(token, { aud: "gridrunner" }); // throws SojoTokenError
// claims.sub is the player's id in your game
```

Also `verifySojoReceipt` (spend receipts), `sendSojoEvents`, `sojoServer` and `verifySojoWebhook`. Tokens: https://sojo.gg/docs/tokens.md

## Links

- https://sojo.gg/agents.txt
- https://sojo.gg/docs/integrate.md
- https://sojo.gg/docs/security.md
