Web SDK

Один JavaScript-файл без зависимостей для HTML5-игр, сайтов и серверов на Node.js.

Комментарии в коде и имена API оставлены на английском, чтобы совпадать с SDK.

На этой странице

Требования#

  • Актуальные версии Chrome, Edge, Firefox и Safari (десктопные и мобильные) или Node.js 18+.
  • Страница должна открываться по HTTPS (или с localhost): API требует HTTPS, а Web Crypto, с помощью которого проверяется удалённая конфигурация, доступен только на защищённых страницах.

Установка#

Загружайте его со своего сервера MAJACLOUD — он отдаёт файл с заголовками CORS:

HTML
<script src="https://majacloud.majanite.com/downloads/majacloud-web-1.0.0.js"></script>
<script type="module">
  const mc = Majacloud.createClient({ baseUrl: 'https://majacloud.majanite.com', projectId: '<project id>', clientKey: 'pk_live_…' });
</script>

Или скопируйте majacloud.js в свой проект:

JavaScript
// Bundlers (Vite, webpack…): copy majacloud.js into your project
import Majacloud from './majacloud.js';

// Node.js 18+
const Majacloud = require('./majacloud.js');

Создание клиента#

Обязательны только baseUrl, projectId и clientKey.

JavaScript
const mc = Majacloud.createClient({
  baseUrl: 'https://majacloud.majanite.com',      // your MAJACLOUD address
  projectId: '<project id>',
  clientKey: 'pk_live_…',     // public, safe in the browser
  configPublicKey: PEM,       // optional: pins Remote Config verification
  storage: 'memory',          // optional: 'memory' or { get, set, remove }; default localStorage
  timeoutMs: 15000,           // optional
  maxRetries: 2,              // optional
});

Результаты#

Каждый вызов завершается значением { ok: true, value } или { ok: false, error } и никогда не отклоняется (reject). value — тело ответа REST без ok, с теми же полями в snake_case, что и в справочнике REST.

У error есть поля code, message, status, requestId, retryAfter, details и retryable.

События#

Подписывайтесь через on(); метод возвращает функцию для отписки.

JavaScript
const stop = mc.auth.on('playerChanged', (player) => {
  document.querySelector('#name').textContent = player ? player.display_name : '';
});
mc.auth.on('sessionExpired', () => showSignIn());
mc.remoteConfig.on('updated', () => applyBalance());

stop(); // every on() returns an unsubscribe function

Таблица лидеров на вашем сайте#

Для чтения таблицы лидеров вход не нужен, поэтому сайт может показывать лучших игроков с одним лишь публичным клиентским ключом:

HTML
<ol id="top-players"></ol>
<script src="https://majacloud.majanite.com/downloads/majacloud-web-1.0.0.js"></script>
<script>
  const mc = Majacloud.createClient({ baseUrl: 'https://majacloud.majanite.com', projectId: '<project id>', clientKey: 'pk_live_…' });
  mc.leaderboards.getTop('coins', { limit: 10 }).then((top) => {
    if (!top.ok) return;
    document.getElementById('top-players').innerHTML = '';
    for (const entry of top.value.entries) {
      const li = document.createElement('li');
      li.textContent = `${entry.player_name} — ${entry.score}`;
      document.getElementById('top-players').append(li);
    }
  });
</script>

Несколько вкладок#

Сессия хранится в localStorage и общая для всех вкладок вашего сайта. Токены обновления меняются при каждом использовании, поэтому вкладки обновляют их по очереди (Web Locks) и подхватывают новые токены друг друга: открытие второй вкладки никогда не завершает сессию игрока.

На сервере с секретным ключом#

На своём сервере Node.js создайте клиент с secretKey вместо clientKey, чтобы использовать server.getPlayer() и server.submitScore(). В браузере SDK не принимает секретный ключ.

JavaScript
// Node.js on your own server only: the secret key never goes to a browser or game build
const Majacloud = require('./majacloud.js');
const admin = Majacloud.createClient({
  baseUrl: 'https://majacloud.majanite.com',
  projectId: process.env.MAJACLOUD_PROJECT_ID,
  secretKey: process.env.MAJACLOUD_SECRET_KEY,
});

const player = await admin.server.getPlayer('player_3f9c…');
await admin.server.submitScore('coins', 'player_3f9c…', 980);

mc.request(method, path, { body, auth }) вызывает любой эндпоинт без отдельного хелпера, например mc.request('GET', '/wallet', { auth: 'player' }).

Поиск по названиям страниц, заголовкам и тексту.

↑↓ навигация ↵ открыть Esc закрыть