@lokiplay/sdk 0.1.0 → 0.1.2

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,19 @@ 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. Loki creates every room and issues the shareable
23
+ invite code. Games call `createRoom()` and `joinRoom({ inviteCode })` and must
24
+ not invent room keys. Host authority is suitable for casual/unranked games, not
25
+ ranked anti-cheat.
package/dist/index.d.ts CHANGED
@@ -1,17 +1,36 @@
1
1
  import { type ClientEnvelope, type ServerEnvelope } from "@lokiplay/protocol";
2
+ export declare const LOKI_API_ORIGIN = "https://api.lokiplay.cc";
3
+ export type JoinedRoom = {
4
+ roomId: string;
5
+ inviteCode: string;
6
+ snapshot: ServerEnvelope;
7
+ };
8
+ export declare function lokiErrorFromUnknown(error: unknown): Promise<Error>;
2
9
  export interface LokiTransport {
3
10
  authenticate(token: string): Promise<{
4
11
  playerId: string;
5
12
  }>;
13
+ createRoom(input: {
14
+ projectId: string;
15
+ }): Promise<JoinedRoom>;
6
16
  joinRoom(input: {
7
17
  projectId: string;
8
- roomKey: string;
9
- }): Promise<{
10
- roomId: string;
11
- snapshot: ServerEnvelope;
12
- }>;
18
+ inviteCode: string;
19
+ }): Promise<JoinedRoom>;
13
20
  send(message: ClientEnvelope): Promise<void>;
14
21
  subscribe(listener: (message: unknown) => void): () => void;
22
+ resolveInvite?(inviteCode: string): Promise<{
23
+ roomId: string;
24
+ inviteCode: string;
25
+ }>;
26
+ matchmake?(input: {
27
+ minPlayers: number;
28
+ maxPlayers: number;
29
+ teamSize?: number;
30
+ }): Promise<JoinedRoom>;
31
+ leaveRoom?(roomId: string): Promise<void>;
32
+ reconnect?(): Promise<void>;
33
+ refresh?(): Promise<void>;
15
34
  close(): Promise<void>;
16
35
  }
17
36
  export interface LokiClientOptions {
@@ -25,11 +44,72 @@ export declare class LokiClient {
25
44
  authenticate(token: string): Promise<{
26
45
  playerId: string;
27
46
  }>;
28
- joinRoom(roomKey: string): Promise<ServerEnvelope>;
47
+ createRoom(): Promise<JoinedRoom>;
48
+ joinRoom(input: {
49
+ inviteCode: string;
50
+ }): Promise<JoinedRoom>;
29
51
  sendAction(payload: unknown): Promise<void>;
30
52
  sendEvent(payload: unknown, reliable?: boolean): Promise<void>;
31
53
  sendHostState(expectedVersion: number, state: unknown): Promise<void>;
54
+ requestSnapshot(): Promise<void>;
55
+ sendChat(text: string, channel?: "lobby" | "match"): Promise<void>;
56
+ submitScore(leaderboardId: string, score: number, subscore?: number): Promise<void>;
57
+ resolveInvite(inviteCode: string): Promise<{
58
+ roomId: string;
59
+ inviteCode: string;
60
+ }>;
61
+ matchmake(input: {
62
+ minPlayers: number;
63
+ maxPlayers: number;
64
+ teamSize?: number;
65
+ }): Promise<JoinedRoom>;
66
+ leaveRoom(): Promise<void>;
67
+ reconnect(): Promise<void>;
68
+ refresh(): Promise<void>;
32
69
  onMessage(listener: (message: ServerEnvelope) => void): () => void;
33
70
  close(): Promise<void>;
34
71
  }
72
+ export interface FirstPartyTransportOptions {
73
+ apiOrigin?: string;
74
+ nakamaHost?: string;
75
+ nakamaPort?: string;
76
+ nakamaServerKey?: string;
77
+ secure?: boolean;
78
+ fetch?: typeof globalThis.fetch;
79
+ sessionProvider?(token: string): Promise<{
80
+ token: string;
81
+ refreshToken?: string;
82
+ playerId: string;
83
+ }>;
84
+ }
85
+ export declare class FirstPartyTransport implements LokiTransport {
86
+ #private;
87
+ constructor(options?: FirstPartyTransportOptions);
88
+ authenticate(token: string): Promise<{
89
+ playerId: string;
90
+ }>;
91
+ createRoom(_input: {
92
+ projectId: string;
93
+ }): Promise<JoinedRoom>;
94
+ joinRoom(input: {
95
+ projectId: string;
96
+ inviteCode: string;
97
+ }): Promise<JoinedRoom>;
98
+ resolveInvite(inviteCode: string): Promise<{
99
+ roomId: string;
100
+ inviteCode: string;
101
+ }>;
102
+ matchmake(input: {
103
+ minPlayers: number;
104
+ maxPlayers: number;
105
+ teamSize?: number;
106
+ }): Promise<JoinedRoom>;
107
+ send(message: ClientEnvelope): Promise<void>;
108
+ subscribe(listener: (message: unknown) => void): () => void;
109
+ leaveRoom(roomId: string): Promise<void>;
110
+ refresh(): Promise<void>;
111
+ reconnect(): Promise<void>;
112
+ close(): Promise<void>;
113
+ }
114
+ export declare function hostedGameSessionProvider(port: MessagePort, nonce: string, timeoutMs?: number): FirstPartyTransportOptions["sessionProvider"];
35
115
  //# 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,59 @@
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;
6
+ export async function lokiErrorFromUnknown(error) {
7
+ if (typeof Response !== "undefined" && error instanceof Response) {
8
+ const status = error.status;
9
+ let detail = "";
10
+ try {
11
+ const text = await error.clone().text();
12
+ if (text) {
13
+ try {
14
+ const parsed = JSON.parse(text);
15
+ detail = parsed.message || parsed.error || text;
16
+ }
17
+ catch {
18
+ detail = text;
19
+ }
20
+ }
21
+ }
22
+ catch {
23
+ // The body may already have been consumed by the transport.
24
+ }
25
+ return new Error(detail
26
+ ? `Loki request failed (${status}): ${detail}`
27
+ : `Loki request failed (${status})`);
28
+ }
29
+ if (error instanceof Error) {
30
+ if (error.message === "[object Response]") {
31
+ return new Error("Loki request failed");
32
+ }
33
+ return error;
34
+ }
35
+ if (error && typeof error === "object" && "status" in error) {
36
+ const status = Number(error.status);
37
+ return new Error(Number.isFinite(status) ? `Loki request failed (${status})` : "Loki request failed");
38
+ }
39
+ return new Error("Loki request failed");
40
+ }
41
+ const wrapLokiCall = async (operation) => {
42
+ try {
43
+ return await operation();
44
+ }
45
+ catch (error) {
46
+ throw await lokiErrorFromUnknown(error);
47
+ }
48
+ };
49
+ const normalizeInviteCode = (value) => value.trim().toUpperCase();
50
+ const requireInviteCode = (value) => {
51
+ const inviteCode = normalizeInviteCode(value);
52
+ if (!/^[A-F0-9]{16}$/.test(inviteCode)) {
53
+ throw new Error("INVITE_INVALID: invite codes are 16 letters or digits issued by Loki");
54
+ }
55
+ return inviteCode;
56
+ };
2
57
  export class LokiClient {
3
58
  #transport;
4
59
  #projectId;
@@ -6,7 +61,10 @@ export class LokiClient {
6
61
  #unsubscribe;
7
62
  #playerId;
8
63
  #roomId;
9
- #sequence = 0;
64
+ #joining = false;
65
+ #joinBuffer = [];
66
+ #sendSequence = 0;
67
+ #receiveSequence = 0;
10
68
  constructor(options) {
11
69
  if (!/^[0-9a-f-]{36}$/i.test(options.projectId)) {
12
70
  throw new Error("invalid project id");
@@ -19,11 +77,11 @@ export class LokiClient {
19
77
  return;
20
78
  this.#unsubscribe = this.#transport.subscribe((raw) => {
21
79
  const message = ServerEnvelopeSchema.parse(raw);
22
- if (message.roomId !== this.#roomId || message.sequence < this.#sequence)
80
+ if (this.#joining) {
81
+ this.#joinBuffer.push(message);
23
82
  return;
24
- this.#sequence = message.sequence;
25
- for (const listener of this.#listeners)
26
- listener(message);
83
+ }
84
+ this.#dispatch(message);
27
85
  });
28
86
  }
29
87
  async authenticate(token) {
@@ -33,20 +91,54 @@ export class LokiClient {
33
91
  this.#playerId = session.playerId;
34
92
  return session;
35
93
  }
36
- async joinRoom(roomKey) {
94
+ async createRoom() {
95
+ if (!this.#playerId)
96
+ throw new Error("authenticate before creating a room");
97
+ return this.#enterRoom(() => this.#transport.createRoom({ projectId: this.#projectId }));
98
+ }
99
+ async joinRoom(input) {
37
100
  if (!this.#playerId)
38
101
  throw new Error("authenticate before joining a room");
39
- const joined = await this.#transport.joinRoom({
102
+ return this.#enterRoom(() => this.#transport.joinRoom({
40
103
  projectId: this.#projectId,
41
- roomKey,
42
- });
43
- const snapshot = ServerEnvelopeSchema.parse(joined.snapshot);
44
- if (snapshot.roomId !== joined.roomId || snapshot.type !== "snapshot") {
45
- throw new Error("invalid join snapshot");
104
+ inviteCode: requireInviteCode(input.inviteCode),
105
+ }));
106
+ }
107
+ async #enterRoom(join) {
108
+ this.#joining = true;
109
+ this.#joinBuffer = [];
110
+ try {
111
+ const joined = await join();
112
+ const snapshot = ServerEnvelopeSchema.parse(joined.snapshot);
113
+ if (snapshot.roomId !== joined.roomId || snapshot.type !== "snapshot") {
114
+ throw new Error("invalid join snapshot");
115
+ }
116
+ this.#roomId = joined.roomId;
117
+ this.#sendSequence = 0;
118
+ this.#receiveSequence = snapshot.sequence;
119
+ const buffered = this.#joinBuffer;
120
+ this.#joinBuffer = [];
121
+ this.#joining = false;
122
+ for (const message of buffered)
123
+ this.#dispatch(message);
124
+ return {
125
+ roomId: joined.roomId,
126
+ inviteCode: joined.inviteCode,
127
+ snapshot,
128
+ };
129
+ }
130
+ finally {
131
+ this.#joining = false;
132
+ this.#joinBuffer = [];
46
133
  }
47
- this.#roomId = joined.roomId;
48
- this.#sequence = snapshot.sequence;
49
- return snapshot;
134
+ }
135
+ #dispatch(message) {
136
+ if (message.roomId !== this.#roomId ||
137
+ message.sequence < this.#receiveSequence)
138
+ return;
139
+ this.#receiveSequence = message.sequence;
140
+ for (const listener of this.#listeners)
141
+ listener(message);
50
142
  }
51
143
  async sendAction(payload) {
52
144
  if (!this.#roomId)
@@ -54,7 +146,7 @@ export class LokiClient {
54
146
  const message = ClientEnvelopeSchema.parse({
55
147
  protocolVersion: 1,
56
148
  roomId: this.#roomId,
57
- sequence: ++this.#sequence,
149
+ sequence: ++this.#sendSequence,
58
150
  type: "action",
59
151
  payload,
60
152
  });
@@ -66,7 +158,7 @@ export class LokiClient {
66
158
  const message = ClientEnvelopeSchema.parse({
67
159
  protocolVersion: 1,
68
160
  roomId: this.#roomId,
69
- sequence: ++this.#sequence,
161
+ sequence: ++this.#sendSequence,
70
162
  type: "event",
71
163
  reliable,
72
164
  payload,
@@ -79,17 +171,73 @@ export class LokiClient {
79
171
  const message = ClientEnvelopeSchema.parse({
80
172
  protocolVersion: 1,
81
173
  roomId: this.#roomId,
82
- sequence: ++this.#sequence,
174
+ sequence: ++this.#sendSequence,
83
175
  type: "host_state",
84
176
  expectedVersion,
85
177
  state,
86
178
  });
87
179
  await this.#transport.send(message);
88
180
  }
181
+ async requestSnapshot() {
182
+ await this.#sendRoomMessage({ type: "snapshot_request" });
183
+ }
184
+ async sendChat(text, channel = "match") {
185
+ await this.#sendRoomMessage({ type: "chat", channel, text });
186
+ }
187
+ async submitScore(leaderboardId, score, subscore = 0) {
188
+ await this.#sendRoomMessage({
189
+ type: "score_submit",
190
+ leaderboardId,
191
+ score,
192
+ subscore,
193
+ });
194
+ }
195
+ async resolveInvite(inviteCode) {
196
+ if (!this.#transport.resolveInvite)
197
+ throw new Error("invites are unsupported");
198
+ return this.#transport.resolveInvite(requireInviteCode(inviteCode));
199
+ }
200
+ async matchmake(input) {
201
+ if (!this.#playerId)
202
+ throw new Error("authenticate before matchmaking");
203
+ if (!this.#transport.matchmake)
204
+ throw new Error("matchmaking is unsupported");
205
+ return this.#enterRoom(() => this.#transport.matchmake(input));
206
+ }
207
+ async leaveRoom() {
208
+ if (!this.#roomId)
209
+ return;
210
+ await this.#transport.leaveRoom?.(this.#roomId);
211
+ this.#roomId = undefined;
212
+ this.#sendSequence = 0;
213
+ this.#receiveSequence = 0;
214
+ }
215
+ async reconnect() {
216
+ if (!this.#transport.reconnect)
217
+ throw new Error("reconnect is unsupported");
218
+ await this.#transport.reconnect();
219
+ await this.requestSnapshot();
220
+ }
221
+ async refresh() {
222
+ if (!this.#transport.refresh)
223
+ throw new Error("refresh is unsupported");
224
+ await this.#transport.refresh();
225
+ }
89
226
  onMessage(listener) {
90
227
  this.#listeners.add(listener);
91
228
  return () => this.#listeners.delete(listener);
92
229
  }
230
+ async #sendRoomMessage(body) {
231
+ if (!this.#roomId)
232
+ throw new Error("join a room before sending messages");
233
+ const message = ClientEnvelopeSchema.parse({
234
+ protocolVersion: PROTOCOL_VERSION,
235
+ roomId: this.#roomId,
236
+ sequence: ++this.#sendSequence,
237
+ ...body,
238
+ });
239
+ await this.#transport.send(message);
240
+ }
93
241
  async close() {
94
242
  this.#unsubscribe?.();
95
243
  this.#unsubscribe = undefined;
@@ -97,4 +245,235 @@ export class LokiClient {
97
245
  await this.#transport.close();
98
246
  }
99
247
  }
248
+ export class FirstPartyTransport {
249
+ #apiOrigin;
250
+ #client;
251
+ #secure;
252
+ #fetch;
253
+ #sessionProvider;
254
+ #listeners = new Set();
255
+ #session;
256
+ #socket;
257
+ #playerId;
258
+ #roomId;
259
+ #roomKey;
260
+ #closed = false;
261
+ constructor(options = {}) {
262
+ this.#apiOrigin = (options.apiOrigin ?? LOKI_API_ORIGIN).replace(/\/+$/, "");
263
+ this.#secure = options.secure ?? true;
264
+ this.#fetch = options.fetch ?? globalThis.fetch.bind(globalThis);
265
+ this.#sessionProvider = options.sessionProvider;
266
+ this.#client = new Client(options.nakamaServerKey ?? "lokiplay", options.nakamaHost ?? "multiplayer.lokiplay.cc", options.nakamaPort ?? (this.#secure ? "443" : "7350"), this.#secure, 10_000, false);
267
+ }
268
+ async authenticate(token) {
269
+ const value = this.#sessionProvider
270
+ ? await this.#sessionProvider(token)
271
+ : await wrapLokiCall(async () => {
272
+ const response = await this.#fetch(`${this.#apiOrigin}/v1/nakama-session`, {
273
+ method: "POST",
274
+ headers: { authorization: `Bearer ${token}` },
275
+ });
276
+ if (!response.ok) {
277
+ throw await lokiErrorFromUnknown(response);
278
+ }
279
+ return (await response.json());
280
+ });
281
+ const checked = value;
282
+ if (!checked.token || !checked.playerId)
283
+ throw new Error("invalid Loki session response");
284
+ this.#session = Session.restore(checked.token, checked.refreshToken ?? "");
285
+ this.#playerId = checked.playerId;
286
+ await this.#connectSocket();
287
+ return { playerId: checked.playerId };
288
+ }
289
+ async createRoom(_input) {
290
+ const session = this.#requireSession();
291
+ const socket = await this.#connectSocket();
292
+ const created = payload(await wrapLokiCall(() => this.#client.rpc(session, "loki_create_room", {})));
293
+ if (!created.matchId || !created.inviteCode) {
294
+ throw new Error("Loki did not return a room invite");
295
+ }
296
+ await socket.joinMatch(created.matchId);
297
+ this.#roomId = created.matchId;
298
+ this.#roomKey = created.roomKey;
299
+ return {
300
+ roomId: created.matchId,
301
+ inviteCode: created.inviteCode,
302
+ snapshot: await this.#snapshot(created.matchId),
303
+ };
304
+ }
305
+ async joinRoom(input) {
306
+ const session = this.#requireSession();
307
+ const socket = await this.#connectSocket();
308
+ const inviteCode = requireInviteCode(input.inviteCode);
309
+ const joined = payload(await wrapLokiCall(() => this.#client.rpc(session, "loki_join_room", { inviteCode })));
310
+ if (!joined.matchId)
311
+ throw new Error("Loki did not return a room");
312
+ await socket.joinMatch(joined.matchId);
313
+ this.#roomId = joined.matchId;
314
+ return {
315
+ roomId: joined.matchId,
316
+ inviteCode: joined.inviteCode ?? inviteCode,
317
+ snapshot: await this.#snapshot(joined.matchId),
318
+ };
319
+ }
320
+ async resolveInvite(inviteCode) {
321
+ const normalized = requireInviteCode(inviteCode);
322
+ const resolved = payload(await wrapLokiCall(() => this.#client.rpc(this.#requireSession(), "loki_resolve_invite", {
323
+ inviteCode: normalized,
324
+ })));
325
+ if (!resolved.matchId)
326
+ throw new Error("Loki did not return a room");
327
+ return {
328
+ roomId: resolved.matchId,
329
+ inviteCode: resolved.inviteCode ?? normalized,
330
+ };
331
+ }
332
+ async matchmake(input) {
333
+ const socket = await this.#connectSocket();
334
+ const matched = new Promise((resolve, reject) => {
335
+ const timer = setTimeout(() => reject(new Error("matchmaking timed out")), 30_000);
336
+ socket.onmatchmakermatched = (value) => {
337
+ clearTimeout(timer);
338
+ resolve(value);
339
+ };
340
+ });
341
+ await socket.addMatchmaker("*", input.minPlayers, input.maxPlayers, undefined, {
342
+ teamSize: input.teamSize ?? 0,
343
+ });
344
+ const result = await matched;
345
+ const joined = await socket.joinMatch(result.match_id, result.token);
346
+ this.#roomId = joined.match_id;
347
+ this.#roomKey = `match-${joined.match_id.slice(0, 12).toLowerCase()}`;
348
+ return {
349
+ roomId: joined.match_id,
350
+ inviteCode: "",
351
+ snapshot: await this.#snapshot(joined.match_id),
352
+ };
353
+ }
354
+ async send(message) {
355
+ const socket = await this.#connectSocket();
356
+ const opCode = message.type === "action"
357
+ ? 10
358
+ : message.type === "event"
359
+ ? 11
360
+ : message.type === "host_state"
361
+ ? 12
362
+ : message.type === "snapshot_request"
363
+ ? 13
364
+ : message.type === "chat"
365
+ ? 14
366
+ : 15;
367
+ await socket.sendMatchState(message.roomId, opCode, JSON.stringify(message));
368
+ }
369
+ subscribe(listener) {
370
+ this.#listeners.add(listener);
371
+ return () => this.#listeners.delete(listener);
372
+ }
373
+ async leaveRoom(roomId) {
374
+ await this.#socket?.leaveMatch(roomId);
375
+ if (this.#roomId === roomId) {
376
+ this.#roomId = undefined;
377
+ this.#roomKey = undefined;
378
+ }
379
+ }
380
+ async refresh() {
381
+ this.#session = await this.#client.sessionRefresh(this.#requireSession());
382
+ }
383
+ async reconnect() {
384
+ if (this.#closed)
385
+ throw new Error("transport is closed");
386
+ this.#socket?.disconnect(false);
387
+ this.#socket = undefined;
388
+ if (this.#session?.isexpired(Math.floor(Date.now() / 1_000)))
389
+ await this.refresh();
390
+ const socket = await this.#connectSocket();
391
+ if (this.#roomId)
392
+ await socket.joinMatch(this.#roomId);
393
+ }
394
+ async close() {
395
+ this.#closed = true;
396
+ this.#socket?.disconnect(false);
397
+ this.#socket = undefined;
398
+ this.#listeners.clear();
399
+ }
400
+ async #connectSocket() {
401
+ if (this.#closed)
402
+ throw new Error("transport is closed");
403
+ if (this.#socket)
404
+ return this.#socket;
405
+ const socket = this.#client.createSocket(this.#secure, false);
406
+ socket.onmatchdata = (message) => {
407
+ if (message.match_id !== this.#roomId)
408
+ return;
409
+ try {
410
+ const decoded = JSON.parse(textDecoder.decode(message.data));
411
+ for (const listener of this.#listeners)
412
+ listener(decoded);
413
+ }
414
+ catch {
415
+ // Invalid server data is ignored and cannot reach game listeners.
416
+ }
417
+ };
418
+ socket.ondisconnect = () => {
419
+ if (!this.#closed)
420
+ void this.reconnect().catch(() => undefined);
421
+ };
422
+ await socket.connect(this.#requireSession(), true);
423
+ this.#socket = socket;
424
+ return socket;
425
+ }
426
+ async #snapshot(roomId) {
427
+ const state = payload(await wrapLokiCall(() => this.#client.rpc(this.#requireSession(), "loki_room_snapshot", {
428
+ matchId: roomId,
429
+ })));
430
+ if (!state.ok)
431
+ throw new Error("room snapshot failed");
432
+ return ServerEnvelopeSchema.parse({
433
+ protocolVersion: PROTOCOL_VERSION,
434
+ roomId,
435
+ sequence: state.version,
436
+ type: "snapshot",
437
+ hostId: state.hostId,
438
+ state: state.state,
439
+ });
440
+ }
441
+ #requireSession() {
442
+ if (!this.#session || !this.#playerId)
443
+ throw new Error("authenticate first");
444
+ return this.#session;
445
+ }
446
+ }
447
+ export function hostedGameSessionProvider(port, nonce, timeoutMs = 10_000) {
448
+ return async () => {
449
+ const requestId = crypto.randomUUID();
450
+ return new Promise((resolve, reject) => {
451
+ const timer = setTimeout(() => {
452
+ port.removeEventListener("message", onMessage);
453
+ reject(new Error("hosted-game session bridge timed out"));
454
+ }, timeoutMs);
455
+ const onMessage = (event) => {
456
+ const value = event.data;
457
+ if (value.nonce !== nonce || value.requestId !== requestId)
458
+ return;
459
+ clearTimeout(timer);
460
+ port.removeEventListener("message", onMessage);
461
+ if (value.type !== "loki:session" ||
462
+ !value.session?.token ||
463
+ !value.session.playerId) {
464
+ reject(new Error(value.message ?? "hosted-game session bridge failed"));
465
+ return;
466
+ }
467
+ resolve({
468
+ token: value.session.token,
469
+ refreshToken: value.session.refreshToken,
470
+ playerId: value.session.playerId,
471
+ });
472
+ };
473
+ port.addEventListener("message", onMessage);
474
+ port.start();
475
+ port.postMessage({ type: "loki:session", nonce, requestId });
476
+ });
477
+ };
478
+ }
100
479
  //# 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.2",
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.2"
32
41
  }
33
42
  }