@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 +14 -2
- package/dist/index.d.ts +74 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +280 -8
- package/dist/index.js.map +1 -1
- package/package.json +12 -3
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
|
-
|
|
11
|
-
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
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
|
-
#
|
|
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 ||
|
|
27
|
+
if (message.roomId !== this.#roomId ||
|
|
28
|
+
message.sequence < this.#receiveSequence)
|
|
23
29
|
return;
|
|
24
|
-
this.#
|
|
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.#
|
|
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.#
|
|
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.#
|
|
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.#
|
|
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":"AAAA,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,gBAAgB,GAGjB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAe,MAAM,uBAAuB,CAAC;AAErE,MAAM,CAAC,MAAM,eAAe,GAAG,yBAAyB,CAAC;AAEzD,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;AAEtC,MAAM,OAAO,GAAG,CAAI,QAA8B,EAAK,EAAE,CAAC,QAAQ,CAAC,OAAY,CAAC;AAuBhF,MAAM,OAAO,UAAU;IACZ,UAAU,CAAgB;IAC1B,UAAU,CAAS;IACnB,UAAU,GAAG,IAAI,GAAG,EAAqC,CAAC;IACnE,YAAY,CAAc;IAC1B,SAAS,CAAU;IACnB,OAAO,CAAU;IACjB,aAAa,GAAG,CAAC,CAAC;IAClB,gBAAgB,GAAG,CAAC,CAAC;IAErB,YAAY,OAA0B;QACpC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;QACpC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;IACtC,CAAC;IAED,UAAU;QACR,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO;QAC9B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE;YACpD,MAAM,OAAO,GAAG,oBAAoB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAChD,IACE,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,OAAO;gBAC/B,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,gBAAgB;gBACxC,OAAO;YACT,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;YACzC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,UAAU;gBAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,KAAa;QAC9B,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,IAAI,CAAC,UAAU,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAC1D,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC;QAClC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAe;QAC5B,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAC3E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAC5C,SAAS,EAAE,IAAI,CAAC,UAAU;YAC1B,OAAO;SACR,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,oBAAoB,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC7D,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,IAAI,QAAQ,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACtE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC3C,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAC1C,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAAgB;QAC/B,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACzE,MAAM,OAAO,GAAG,oBAAoB,CAAC,KAAK,CAAC;YACzC,eAAe,EAAE,CAAC;YAClB,MAAM,EAAE,IAAI,CAAC,OAAO;YACpB,QAAQ,EAAE,EAAE,IAAI,CAAC,aAAa;YAC9B,IAAI,EAAE,QAAQ;YACd,OAAO;SACR,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,OAAgB,EAAE,QAAQ,GAAG,IAAI;QAC/C,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACxE,MAAM,OAAO,GAAG,oBAAoB,CAAC,KAAK,CAAC;YACzC,eAAe,EAAE,CAAC;YAClB,MAAM,EAAE,IAAI,CAAC,OAAO;YACpB,QAAQ,EAAE,EAAE,IAAI,CAAC,aAAa;YAC9B,IAAI,EAAE,OAAO;YACb,QAAQ;YACR,OAAO;SACR,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,eAAuB,EAAE,KAAc;QACzD,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACvE,MAAM,OAAO,GAAG,oBAAoB,CAAC,KAAK,CAAC;YACzC,eAAe,EAAE,CAAC;YAClB,MAAM,EAAE,IAAI,CAAC,OAAO;YACpB,QAAQ,EAAE,EAAE,IAAI,CAAC,aAAa;YAC9B,IAAI,EAAE,YAAY;YAClB,eAAe;YACf,KAAK;SACN,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,MAAM,IAAI,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,UAA6B,OAAO;QAC/D,MAAM,IAAI,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,WAAW,CACf,aAAqB,EACrB,KAAa,EACb,QAAQ,GAAG,CAAC;QAEZ,MAAM,IAAI,CAAC,gBAAgB,CAAC;YAC1B,IAAI,EAAE,cAAc;YACpB,aAAa;YACb,KAAK;YACL,QAAQ;SACT,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,UAAkB;QACpC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC/E,OAAO,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAIf;QACC,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACxE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC9E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC7D,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAC1C,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,SAAS;QACb,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAC1B,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;QACzB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,SAAS;QACb,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC5E,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;QAClC,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QACxE,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;IAClC,CAAC;IAED,SAAS,CAAC,QAA2C;QACnD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9B,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,gBAAgB,CACpB,IAQK;QAEL,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAC1E,MAAM,OAAO,GAAG,oBAAoB,CAAC,KAAK,CAAC;YACzC,eAAe,EAAE,gBAAgB;YACjC,MAAM,EAAE,IAAI,CAAC,OAAO;YACpB,QAAQ,EAAE,EAAE,IAAI,CAAC,aAAa;YAC9B,GAAG,IAAI;SACR,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;QACtB,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;QAC9B,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACxB,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAChC,CAAC;CACF;AAgBD,MAAM,OAAO,mBAAmB;IACrB,UAAU,CAAS;IACnB,OAAO,CAAS;IAChB,OAAO,CAAU;IACjB,MAAM,CAA0B;IAChC,gBAAgB,CAAiD;IACjE,UAAU,GAAG,IAAI,GAAG,EAA8B,CAAC;IAC5D,QAAQ,CAAW;IACnB,OAAO,CAAU;IACjB,SAAS,CAAU;IACnB,OAAO,CAAU;IACjB,QAAQ,CAAU;IAClB,OAAO,GAAG,KAAK,CAAC;IAEhB,YAAY,UAAsC,EAAE;QAClD,IAAI,CAAC,UAAU,GAAG,CAAC,OAAO,CAAC,SAAS,IAAI,eAAe,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC7E,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC;QACtC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACjE,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;QAChD,IAAI,CAAC,OAAO,GAAG,IAAI,MAAM,CACvB,OAAO,CAAC,eAAe,IAAI,UAAU,EACrC,OAAO,CAAC,UAAU,IAAI,yBAAyB,EAC/C,OAAO,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EACrD,IAAI,CAAC,OAAO,EACZ,MAAM,EACN,KAAK,CACN,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,KAAa;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB;YACjC,CAAC,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;YACpC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;gBAChB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,oBAAoB,EAAE;oBACzE,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE;iBAC9C,CAAC,CAAC;gBACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;oBACjB,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;gBACrE,CAAC;gBACD,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAI5B,CAAC;YACJ,CAAC,CAAC,EAAE,CAAC;QACT,MAAM,OAAO,GAAG,KAIf,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC1F,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;QAC3E,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC;QAClC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5B,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAGd;QACC,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,OAAO,CAIrB,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,kBAAkB,EAAE;YAClD,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC,CACH,CAAC;QACF,MAAM,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC;QAC9B,OAAO;YACL,MAAM,EAAE,OAAO,CAAC,OAAO;YACvB,QAAQ,EAAE,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC;SAChD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,UAAkB;QACpC,MAAM,QAAQ,GAAG,OAAO,CACtB,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,qBAAqB,EAAE;YACpE,UAAU;SACX,CAAC,CACH,CAAC;QACF,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAIf;QACC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAwC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrF,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YACnF,MAAM,CAAC,mBAAmB,GAAG,CAAC,KAAK,EAAE,EAAE;gBACrC,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,MAAM,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,SAAS,EAAE;YAC7E,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,CAAC;SAC9B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;QAC7B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QACrE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,SAAS,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACtE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;IACtF,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAuB;QAChC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC3C,MAAM,MAAM,GACV,OAAO,CAAC,IAAI,KAAK,QAAQ;YACvB,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,OAAO;gBACxB,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,YAAY;oBAC7B,CAAC,CAAC,EAAE;oBACJ,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,kBAAkB;wBACnC,CAAC,CAAC,EAAE;wBACJ,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM;4BACvB,CAAC,CAAC,EAAE;4BACJ,CAAC,CAAC,EAAE,CAAC;QACjB,MAAM,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/E,CAAC;IAED,SAAS,CAAC,QAAoC;QAC5C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9B,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAAc;QAC5B,MAAM,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,IAAI,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;YACzB,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,KAAK,CAAC,SAAS;QACb,IAAI,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACzD,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;QACzB,IAAI,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC;YAAE,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACnF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC3C,IAAI,IAAI,CAAC,OAAO;YAAE,MAAM,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;QACzB,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,IAAI,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACzD,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC,OAAO,CAAC;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC9D,MAAM,CAAC,WAAW,GAAG,CAAC,OAAO,EAAE,EAAE;YAC/B,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI,CAAC,OAAO;gBAAE,OAAO;YAC9C,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAY,CAAC;gBACxE,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,UAAU;oBAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC5D,CAAC;YAAC,MAAM,CAAC;gBACP,kEAAkE;YACpE,CAAC;QACH,CAAC,CAAC;QACF,MAAM,CAAC,YAAY,GAAG,GAAG,EAAE;YACzB,IAAI,CAAC,IAAI,CAAC,OAAO;gBAAE,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAClE,CAAC,CAAC;QACF,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAAc;QAC5B,MAAM,KAAK,GAAG,OAAO,CAMnB,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,oBAAoB,EAAE;YACnE,OAAO,EAAE,MAAM;SAChB,CAAC,CACH,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACvD,OAAO,oBAAoB,CAAC,KAAK,CAAC;YAChC,eAAe,EAAE,gBAAgB;YACjC,MAAM;YACN,QAAQ,EAAE,KAAK,CAAC,OAAO;YACvB,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,KAAK,EAAE,KAAK,CAAC,KAAK;SACnB,CAAC,CAAC;IACL,CAAC;IAED,eAAe;QACb,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAC7E,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;CACF;AAED,MAAM,UAAU,yBAAyB,CACvC,IAAiB,EACjB,KAAa,EACb,SAAS,GAAG,MAAM;IAElB,OAAO,KAAK,IAAI,EAAE;QAChB,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QACtC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;gBAC/C,MAAM,CAAC,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC,CAAC;YAC5D,CAAC,EAAE,SAAS,CAAC,CAAC;YACd,MAAM,SAAS,GAAG,CAAC,KAAmB,EAAQ,EAAE;gBAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,IAUnB,CAAC;gBACF,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS;oBAAE,OAAO;gBACnE,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;gBAC/C,IACE,KAAK,CAAC,IAAI,KAAK,cAAc;oBAC7B,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK;oBACrB,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EACvB,CAAC;oBACD,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,mCAAmC,CAAC,CAAC,CAAC;oBACxE,OAAO;gBACT,CAAC;gBACD,OAAO,CAAC;oBACN,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK;oBAC1B,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,YAAY;oBACxC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,QAAQ;iBACjC,CAAC,CAAC;YACL,CAAC,CAAC;YACF,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YAC5C,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lokiplay/sdk",
|
|
3
|
-
"version": "0.1.
|
|
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
|
-
"@
|
|
39
|
+
"@heroiclabs/nakama-js": "^2.8.0",
|
|
40
|
+
"@lokiplay/protocol": "0.1.1"
|
|
32
41
|
}
|
|
33
42
|
}
|