@lokiplay/sdk 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -7,5 +7,17 @@ rooms, sending actions and events, and subscribing to server messages.
7
7
  npm install @lokiplay/sdk
8
8
  ```
9
9
 
10
- Create a `LokiClient` with a project ID and a transport implementing the
11
- exported `LokiTransport` interface.
10
+ Use `FirstPartyTransport` for production. It defaults to
11
+ `https://api.lokiplay.cc` and the managed Loki multiplayer endpoint; explicit
12
+ endpoint overrides are available for local and staging environments. The
13
+ public API exposes Loki protocol values only—Nakama objects are never returned.
14
+
15
+ Hosted sandbox games receive a `MessagePort` in the `loki:init` message. Pass
16
+ that port and nonce to `hostedGameSessionProvider` so session exchange occurs
17
+ through the approved parent bridge without adding Loki infrastructure to the
18
+ game manifest allowlist.
19
+
20
+ `LokiClient` supports rooms, invite resolution, matchmaking, actions, events,
21
+ host state, snapshots, presence, chat, private scores, token refresh, reconnect,
22
+ and host-migration messages. Host authority is suitable for casual/unranked
23
+ games, not ranked anti-cheat.
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { type ClientEnvelope, type ServerEnvelope } from "@lokiplay/protocol";
2
+ export declare const LOKI_API_ORIGIN = "https://api.lokiplay.cc";
2
3
  export interface LokiTransport {
3
4
  authenticate(token: string): Promise<{
4
5
  playerId: string;
@@ -12,6 +13,20 @@ export interface LokiTransport {
12
13
  }>;
13
14
  send(message: ClientEnvelope): Promise<void>;
14
15
  subscribe(listener: (message: unknown) => void): () => void;
16
+ resolveInvite?(inviteCode: string): Promise<{
17
+ roomId: string;
18
+ }>;
19
+ matchmake?(input: {
20
+ minPlayers: number;
21
+ maxPlayers: number;
22
+ teamSize?: number;
23
+ }): Promise<{
24
+ roomId: string;
25
+ snapshot: ServerEnvelope;
26
+ }>;
27
+ leaveRoom?(roomId: string): Promise<void>;
28
+ reconnect?(): Promise<void>;
29
+ refresh?(): Promise<void>;
15
30
  close(): Promise<void>;
16
31
  }
17
32
  export interface LokiClientOptions {
@@ -29,7 +44,66 @@ export declare class LokiClient {
29
44
  sendAction(payload: unknown): Promise<void>;
30
45
  sendEvent(payload: unknown, reliable?: boolean): Promise<void>;
31
46
  sendHostState(expectedVersion: number, state: unknown): Promise<void>;
47
+ requestSnapshot(): Promise<void>;
48
+ sendChat(text: string, channel?: "lobby" | "match"): Promise<void>;
49
+ submitScore(leaderboardId: string, score: number, subscore?: number): Promise<void>;
50
+ resolveInvite(inviteCode: string): Promise<{
51
+ roomId: string;
52
+ }>;
53
+ matchmake(input: {
54
+ minPlayers: number;
55
+ maxPlayers: number;
56
+ teamSize?: number;
57
+ }): Promise<ServerEnvelope>;
58
+ leaveRoom(): Promise<void>;
59
+ reconnect(): Promise<void>;
60
+ refresh(): Promise<void>;
32
61
  onMessage(listener: (message: ServerEnvelope) => void): () => void;
33
62
  close(): Promise<void>;
34
63
  }
64
+ export interface FirstPartyTransportOptions {
65
+ apiOrigin?: string;
66
+ nakamaHost?: string;
67
+ nakamaPort?: string;
68
+ nakamaServerKey?: string;
69
+ secure?: boolean;
70
+ fetch?: typeof globalThis.fetch;
71
+ sessionProvider?(token: string): Promise<{
72
+ token: string;
73
+ refreshToken?: string;
74
+ playerId: string;
75
+ }>;
76
+ }
77
+ export declare class FirstPartyTransport implements LokiTransport {
78
+ #private;
79
+ constructor(options?: FirstPartyTransportOptions);
80
+ authenticate(token: string): Promise<{
81
+ playerId: string;
82
+ }>;
83
+ joinRoom(input: {
84
+ projectId: string;
85
+ roomKey: string;
86
+ }): Promise<{
87
+ roomId: string;
88
+ snapshot: ServerEnvelope;
89
+ }>;
90
+ resolveInvite(inviteCode: string): Promise<{
91
+ roomId: string;
92
+ }>;
93
+ matchmake(input: {
94
+ minPlayers: number;
95
+ maxPlayers: number;
96
+ teamSize?: number;
97
+ }): Promise<{
98
+ roomId: string;
99
+ snapshot: ServerEnvelope;
100
+ }>;
101
+ send(message: ClientEnvelope): Promise<void>;
102
+ subscribe(listener: (message: unknown) => void): () => void;
103
+ leaveRoom(roomId: string): Promise<void>;
104
+ refresh(): Promise<void>;
105
+ reconnect(): Promise<void>;
106
+ close(): Promise<void>;
107
+ }
108
+ export declare function hostedGameSessionProvider(port: MessagePort, nonce: string, timeoutMs?: number): FirstPartyTransportOptions["sessionProvider"];
35
109
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,cAAc,EACpB,MAAM,6BAA6B,CAAC;AAErC,MAAM,WAAW,aAAa;IAC5B,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3D,QAAQ,CAAC,KAAK,EAAE;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,cAAc,CAAA;KAAE,CAAC,CAAC;IAC1D,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAC5D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,aAAa,CAAC;CAC1B;AAED,qBAAa,UAAU;;gBAST,OAAO,EAAE,iBAAiB;IAQtC,UAAU,IAAI,IAAI;IAUZ,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAO1D,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAelD,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAY3C,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,UAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAa3D,aAAa,CAAC,eAAe,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAa3E,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,GAAG,MAAM,IAAI;IAK5D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAM7B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,4 +1,8 @@
1
- import { ClientEnvelopeSchema, ServerEnvelopeSchema, } from "@lokiplay/protocol";
1
+ import { ClientEnvelopeSchema, ServerEnvelopeSchema, PROTOCOL_VERSION, } from "@lokiplay/protocol";
2
+ import { Client, Session } from "@heroiclabs/nakama-js";
3
+ export const LOKI_API_ORIGIN = "https://api.lokiplay.cc";
4
+ const textDecoder = new TextDecoder();
5
+ const payload = (response) => response.payload;
2
6
  export class LokiClient {
3
7
  #transport;
4
8
  #projectId;
@@ -6,7 +10,8 @@ export class LokiClient {
6
10
  #unsubscribe;
7
11
  #playerId;
8
12
  #roomId;
9
- #sequence = 0;
13
+ #sendSequence = 0;
14
+ #receiveSequence = 0;
10
15
  constructor(options) {
11
16
  if (!/^[0-9a-f-]{36}$/i.test(options.projectId)) {
12
17
  throw new Error("invalid project id");
@@ -19,9 +24,10 @@ export class LokiClient {
19
24
  return;
20
25
  this.#unsubscribe = this.#transport.subscribe((raw) => {
21
26
  const message = ServerEnvelopeSchema.parse(raw);
22
- if (message.roomId !== this.#roomId || message.sequence < this.#sequence)
27
+ if (message.roomId !== this.#roomId ||
28
+ message.sequence < this.#receiveSequence)
23
29
  return;
24
- this.#sequence = message.sequence;
30
+ this.#receiveSequence = message.sequence;
25
31
  for (const listener of this.#listeners)
26
32
  listener(message);
27
33
  });
@@ -45,7 +51,8 @@ export class LokiClient {
45
51
  throw new Error("invalid join snapshot");
46
52
  }
47
53
  this.#roomId = joined.roomId;
48
- this.#sequence = snapshot.sequence;
54
+ this.#sendSequence = 0;
55
+ this.#receiveSequence = snapshot.sequence;
49
56
  return snapshot;
50
57
  }
51
58
  async sendAction(payload) {
@@ -54,7 +61,7 @@ export class LokiClient {
54
61
  const message = ClientEnvelopeSchema.parse({
55
62
  protocolVersion: 1,
56
63
  roomId: this.#roomId,
57
- sequence: ++this.#sequence,
64
+ sequence: ++this.#sendSequence,
58
65
  type: "action",
59
66
  payload,
60
67
  });
@@ -66,7 +73,7 @@ export class LokiClient {
66
73
  const message = ClientEnvelopeSchema.parse({
67
74
  protocolVersion: 1,
68
75
  roomId: this.#roomId,
69
- sequence: ++this.#sequence,
76
+ sequence: ++this.#sendSequence,
70
77
  type: "event",
71
78
  reliable,
72
79
  payload,
@@ -79,17 +86,78 @@ export class LokiClient {
79
86
  const message = ClientEnvelopeSchema.parse({
80
87
  protocolVersion: 1,
81
88
  roomId: this.#roomId,
82
- sequence: ++this.#sequence,
89
+ sequence: ++this.#sendSequence,
83
90
  type: "host_state",
84
91
  expectedVersion,
85
92
  state,
86
93
  });
87
94
  await this.#transport.send(message);
88
95
  }
96
+ async requestSnapshot() {
97
+ await this.#sendRoomMessage({ type: "snapshot_request" });
98
+ }
99
+ async sendChat(text, channel = "match") {
100
+ await this.#sendRoomMessage({ type: "chat", channel, text });
101
+ }
102
+ async submitScore(leaderboardId, score, subscore = 0) {
103
+ await this.#sendRoomMessage({
104
+ type: "score_submit",
105
+ leaderboardId,
106
+ score,
107
+ subscore,
108
+ });
109
+ }
110
+ async resolveInvite(inviteCode) {
111
+ if (!this.#transport.resolveInvite)
112
+ throw new Error("invites are unsupported");
113
+ return this.#transport.resolveInvite(inviteCode);
114
+ }
115
+ async matchmake(input) {
116
+ if (!this.#playerId)
117
+ throw new Error("authenticate before matchmaking");
118
+ if (!this.#transport.matchmake)
119
+ throw new Error("matchmaking is unsupported");
120
+ const joined = await this.#transport.matchmake(input);
121
+ const snapshot = ServerEnvelopeSchema.parse(joined.snapshot);
122
+ this.#roomId = joined.roomId;
123
+ this.#sendSequence = 0;
124
+ this.#receiveSequence = snapshot.sequence;
125
+ return snapshot;
126
+ }
127
+ async leaveRoom() {
128
+ if (!this.#roomId)
129
+ return;
130
+ await this.#transport.leaveRoom?.(this.#roomId);
131
+ this.#roomId = undefined;
132
+ this.#sendSequence = 0;
133
+ this.#receiveSequence = 0;
134
+ }
135
+ async reconnect() {
136
+ if (!this.#transport.reconnect)
137
+ throw new Error("reconnect is unsupported");
138
+ await this.#transport.reconnect();
139
+ await this.requestSnapshot();
140
+ }
141
+ async refresh() {
142
+ if (!this.#transport.refresh)
143
+ throw new Error("refresh is unsupported");
144
+ await this.#transport.refresh();
145
+ }
89
146
  onMessage(listener) {
90
147
  this.#listeners.add(listener);
91
148
  return () => this.#listeners.delete(listener);
92
149
  }
150
+ async #sendRoomMessage(body) {
151
+ if (!this.#roomId)
152
+ throw new Error("join a room before sending messages");
153
+ const message = ClientEnvelopeSchema.parse({
154
+ protocolVersion: PROTOCOL_VERSION,
155
+ roomId: this.#roomId,
156
+ sequence: ++this.#sendSequence,
157
+ ...body,
158
+ });
159
+ await this.#transport.send(message);
160
+ }
93
161
  async close() {
94
162
  this.#unsubscribe?.();
95
163
  this.#unsubscribe = undefined;
@@ -97,4 +165,208 @@ export class LokiClient {
97
165
  await this.#transport.close();
98
166
  }
99
167
  }
168
+ export class FirstPartyTransport {
169
+ #apiOrigin;
170
+ #client;
171
+ #secure;
172
+ #fetch;
173
+ #sessionProvider;
174
+ #listeners = new Set();
175
+ #session;
176
+ #socket;
177
+ #playerId;
178
+ #roomId;
179
+ #roomKey;
180
+ #closed = false;
181
+ constructor(options = {}) {
182
+ this.#apiOrigin = (options.apiOrigin ?? LOKI_API_ORIGIN).replace(/\/+$/, "");
183
+ this.#secure = options.secure ?? true;
184
+ this.#fetch = options.fetch ?? globalThis.fetch.bind(globalThis);
185
+ this.#sessionProvider = options.sessionProvider;
186
+ this.#client = new Client(options.nakamaServerKey ?? "lokiplay", options.nakamaHost ?? "multiplayer.lokiplay.cc", options.nakamaPort ?? (this.#secure ? "443" : "7350"), this.#secure, 10_000, false);
187
+ }
188
+ async authenticate(token) {
189
+ const value = this.#sessionProvider
190
+ ? await this.#sessionProvider(token)
191
+ : await (async () => {
192
+ const response = await this.#fetch(`${this.#apiOrigin}/v1/nakama-session`, {
193
+ method: "POST",
194
+ headers: { authorization: `Bearer ${token}` },
195
+ });
196
+ if (!response.ok) {
197
+ throw new Error(`Loki authentication failed (${response.status})`);
198
+ }
199
+ return (await response.json());
200
+ })();
201
+ const checked = value;
202
+ if (!checked.token || !checked.playerId)
203
+ throw new Error("invalid Loki session response");
204
+ this.#session = Session.restore(checked.token, checked.refreshToken ?? "");
205
+ this.#playerId = checked.playerId;
206
+ await this.#connectSocket();
207
+ return { playerId: checked.playerId };
208
+ }
209
+ async joinRoom(input) {
210
+ const session = this.#requireSession();
211
+ const socket = await this.#connectSocket();
212
+ const created = payload(await this.#client.rpc(session, "loki_create_room", {
213
+ roomKey: input.roomKey,
214
+ }));
215
+ await socket.joinMatch(created.matchId);
216
+ this.#roomId = created.matchId;
217
+ this.#roomKey = input.roomKey;
218
+ return {
219
+ roomId: created.matchId,
220
+ snapshot: await this.#snapshot(created.matchId),
221
+ };
222
+ }
223
+ async resolveInvite(inviteCode) {
224
+ const resolved = payload(await this.#client.rpc(this.#requireSession(), "loki_resolve_invite", {
225
+ inviteCode,
226
+ }));
227
+ return { roomId: resolved.matchId };
228
+ }
229
+ async matchmake(input) {
230
+ const socket = await this.#connectSocket();
231
+ const matched = new Promise((resolve, reject) => {
232
+ const timer = setTimeout(() => reject(new Error("matchmaking timed out")), 30_000);
233
+ socket.onmatchmakermatched = (value) => {
234
+ clearTimeout(timer);
235
+ resolve(value);
236
+ };
237
+ });
238
+ await socket.addMatchmaker("*", input.minPlayers, input.maxPlayers, undefined, {
239
+ teamSize: input.teamSize ?? 0,
240
+ });
241
+ const result = await matched;
242
+ const joined = await socket.joinMatch(result.match_id, result.token);
243
+ this.#roomId = joined.match_id;
244
+ this.#roomKey = `match-${joined.match_id.slice(0, 12).toLowerCase()}`;
245
+ return { roomId: joined.match_id, snapshot: await this.#snapshot(joined.match_id) };
246
+ }
247
+ async send(message) {
248
+ const socket = await this.#connectSocket();
249
+ const opCode = message.type === "action"
250
+ ? 10
251
+ : message.type === "event"
252
+ ? 11
253
+ : message.type === "host_state"
254
+ ? 12
255
+ : message.type === "snapshot_request"
256
+ ? 13
257
+ : message.type === "chat"
258
+ ? 14
259
+ : 15;
260
+ await socket.sendMatchState(message.roomId, opCode, JSON.stringify(message));
261
+ }
262
+ subscribe(listener) {
263
+ this.#listeners.add(listener);
264
+ return () => this.#listeners.delete(listener);
265
+ }
266
+ async leaveRoom(roomId) {
267
+ await this.#socket?.leaveMatch(roomId);
268
+ if (this.#roomId === roomId) {
269
+ this.#roomId = undefined;
270
+ this.#roomKey = undefined;
271
+ }
272
+ }
273
+ async refresh() {
274
+ this.#session = await this.#client.sessionRefresh(this.#requireSession());
275
+ }
276
+ async reconnect() {
277
+ if (this.#closed)
278
+ throw new Error("transport is closed");
279
+ this.#socket?.disconnect(false);
280
+ this.#socket = undefined;
281
+ if (this.#session?.isexpired(Math.floor(Date.now() / 1_000)))
282
+ await this.refresh();
283
+ const socket = await this.#connectSocket();
284
+ if (this.#roomId)
285
+ await socket.joinMatch(this.#roomId);
286
+ }
287
+ async close() {
288
+ this.#closed = true;
289
+ this.#socket?.disconnect(false);
290
+ this.#socket = undefined;
291
+ this.#listeners.clear();
292
+ }
293
+ async #connectSocket() {
294
+ if (this.#closed)
295
+ throw new Error("transport is closed");
296
+ if (this.#socket)
297
+ return this.#socket;
298
+ const socket = this.#client.createSocket(this.#secure, false);
299
+ socket.onmatchdata = (message) => {
300
+ if (message.match_id !== this.#roomId)
301
+ return;
302
+ try {
303
+ const decoded = JSON.parse(textDecoder.decode(message.data));
304
+ for (const listener of this.#listeners)
305
+ listener(decoded);
306
+ }
307
+ catch {
308
+ // Invalid server data is ignored and cannot reach game listeners.
309
+ }
310
+ };
311
+ socket.ondisconnect = () => {
312
+ if (!this.#closed)
313
+ void this.reconnect().catch(() => undefined);
314
+ };
315
+ await socket.connect(this.#requireSession(), true);
316
+ this.#socket = socket;
317
+ return socket;
318
+ }
319
+ async #snapshot(roomId) {
320
+ const state = payload(await this.#client.rpc(this.#requireSession(), "loki_room_snapshot", {
321
+ matchId: roomId,
322
+ }));
323
+ if (!state.ok)
324
+ throw new Error("room snapshot failed");
325
+ return ServerEnvelopeSchema.parse({
326
+ protocolVersion: PROTOCOL_VERSION,
327
+ roomId,
328
+ sequence: state.version,
329
+ type: "snapshot",
330
+ hostId: state.hostId,
331
+ state: state.state,
332
+ });
333
+ }
334
+ #requireSession() {
335
+ if (!this.#session || !this.#playerId)
336
+ throw new Error("authenticate first");
337
+ return this.#session;
338
+ }
339
+ }
340
+ export function hostedGameSessionProvider(port, nonce, timeoutMs = 10_000) {
341
+ return async () => {
342
+ const requestId = crypto.randomUUID();
343
+ return new Promise((resolve, reject) => {
344
+ const timer = setTimeout(() => {
345
+ port.removeEventListener("message", onMessage);
346
+ reject(new Error("hosted-game session bridge timed out"));
347
+ }, timeoutMs);
348
+ const onMessage = (event) => {
349
+ const value = event.data;
350
+ if (value.nonce !== nonce || value.requestId !== requestId)
351
+ return;
352
+ clearTimeout(timer);
353
+ port.removeEventListener("message", onMessage);
354
+ if (value.type !== "loki:session" ||
355
+ !value.session?.token ||
356
+ !value.session.playerId) {
357
+ reject(new Error(value.message ?? "hosted-game session bridge failed"));
358
+ return;
359
+ }
360
+ resolve({
361
+ token: value.session.token,
362
+ refreshToken: value.session.refreshToken,
363
+ playerId: value.session.playerId,
364
+ });
365
+ };
366
+ port.addEventListener("message", onMessage);
367
+ port.start();
368
+ port.postMessage({ type: "loki:session", nonce, requestId });
369
+ });
370
+ };
371
+ }
100
372
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,12 +1,20 @@
1
1
  {
2
2
  "name": "@lokiplay/sdk",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "JavaScript client SDK for Loki multiplayer games.",
5
5
  "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/sanbornli/loki.git",
9
+ "directory": "packages/sdk-js"
10
+ },
11
+ "homepage": "https://github.com/sanbornli/loki#readme",
12
+ "bugs": "https://github.com/sanbornli/loki/issues",
6
13
  "type": "module",
7
14
  "files": [
8
15
  "dist",
9
- "README.md"
16
+ "README.md",
17
+ "LICENSE"
10
18
  ],
11
19
  "main": "./dist/index.js",
12
20
  "types": "./dist/index.d.ts",
@@ -28,6 +36,7 @@
28
36
  "access": "public"
29
37
  },
30
38
  "dependencies": {
31
- "@lokiplay/protocol": "0.1.0"
39
+ "@heroiclabs/nakama-js": "^2.8.0",
40
+ "@lokiplay/protocol": "0.1.1"
32
41
  }
33
42
  }