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 是去掉 ok 后的 REST 响应体,字段与 REST 参考相同,均为 snake_case。

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 关闭