@oyna360/game-sdk 0.5.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/dist/index.js ADDED
@@ -0,0 +1,551 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PlatformSDK = exports.SDK_VERSION = void 0;
4
+ exports.init = init;
5
+ exports.getUser = getUser;
6
+ exports.getSession = getSession;
7
+ exports.getInitPayload = getInitPayload;
8
+ exports.isReady = isReady;
9
+ exports.submitScore = submitScore;
10
+ exports.getLeaderboard = getLeaderboard;
11
+ exports.unlockAchievement = unlockAchievement;
12
+ exports.getAchievements = getAchievements;
13
+ exports.getWallet = getWallet;
14
+ exports.convertGems = convertGems;
15
+ exports.endSession = endSession;
16
+ const types_1 = require("./types");
17
+ Object.defineProperty(exports, "SDK_VERSION", { enumerable: true, get: function () { return types_1.SDK_VERSION; } });
18
+ const DEFAULT_INIT_TIMEOUT_MS = 10_000;
19
+ const IFRAME_PROBE_MS = 400;
20
+ const DEFAULT_REQUEST_TIMEOUT_MS = 10_000;
21
+ const DEV_AUTH_MESSAGE = 'oyna360:dev-auth';
22
+ const DEV_CODE_QUERY = 'oyna_dev_code';
23
+ let initPayload = null;
24
+ /** Origin of the platform parent after the first trusted iframe message. */
25
+ let trustedPlatformOrigin = null;
26
+ /** API base including `/api` — set in Direct Development for score/wallet/etc. */
27
+ let directPlatformUrl = null;
28
+ const initWaiters = [];
29
+ function isEmbeddedInPlatform() {
30
+ try {
31
+ return typeof window !== 'undefined' && window.parent !== window;
32
+ }
33
+ catch {
34
+ return true;
35
+ }
36
+ }
37
+ function rememberDirectPlatformUrl(url) {
38
+ const trimmed = url.replace(/\/$/, '');
39
+ if (trimmed)
40
+ directPlatformUrl = trimmed;
41
+ }
42
+ function asInitPayload(message) {
43
+ return {
44
+ session: message.session,
45
+ user: message.user,
46
+ game: message.game,
47
+ avatar: message.avatar,
48
+ avatarBases: message.avatarBases,
49
+ lobby: message.lobby,
50
+ };
51
+ }
52
+ function isCompleteInit(data) {
53
+ if (!data || typeof data !== 'object')
54
+ return false;
55
+ const m = data;
56
+ return (m.type === 'platform:init' &&
57
+ !!m.session?.token &&
58
+ !!m.user?.id &&
59
+ !!m.game?.slug &&
60
+ !!m.avatar?.presetKey);
61
+ }
62
+ function rememberTrustedOrigin(origin) {
63
+ if (!trustedPlatformOrigin && origin && origin !== 'null') {
64
+ trustedPlatformOrigin = origin;
65
+ }
66
+ }
67
+ /**
68
+ * Only accept postMessage traffic from the real platform parent.
69
+ * Self-published MessageEvents (publishPlatformInit) have null `source` and must be ignored
70
+ * here so settleInit → publish → onMessage cannot recurse.
71
+ */
72
+ function isTrustedPlatformMessage(event) {
73
+ if (typeof window === 'undefined')
74
+ return false;
75
+ if (!isEmbeddedInPlatform())
76
+ return false;
77
+ if (event.source !== window.parent)
78
+ return false;
79
+ if (trustedPlatformOrigin && event.origin !== trustedPlatformOrigin)
80
+ return false;
81
+ return true;
82
+ }
83
+ /** Publish standard platform:init for lobby-sdk / game listeners (same-window). */
84
+ function publishPlatformInit(payload) {
85
+ if (typeof window === 'undefined')
86
+ return;
87
+ const message = {
88
+ type: 'platform:init',
89
+ version: types_1.SDK_VERSION,
90
+ ...payload,
91
+ };
92
+ window.__OYNA360_PLATFORM_INIT__ = message;
93
+ window.dispatchEvent(new MessageEvent('message', {
94
+ data: message,
95
+ origin: window.location.origin,
96
+ }));
97
+ }
98
+ function settleInit(payload) {
99
+ // Idempotent: ignore re-entry from self-publish or duplicate parent init.
100
+ if (initPayload)
101
+ return;
102
+ initPayload = payload;
103
+ publishPlatformInit(payload);
104
+ for (const waiter of initWaiters.splice(0)) {
105
+ clearTimeout(waiter.timer);
106
+ waiter.resolve(payload);
107
+ }
108
+ }
109
+ function onMessage(event) {
110
+ if (initPayload)
111
+ return;
112
+ if (!isTrustedPlatformMessage(event))
113
+ return;
114
+ const data = event.data;
115
+ if (!isCompleteInit(data)) {
116
+ // Production parent may send init; accept even if avatar missing for backward compat
117
+ if (!data || typeof data !== 'object' || data.type !== 'platform:init') {
118
+ return;
119
+ }
120
+ const message = data;
121
+ if (!message.session?.token || !message.user?.id || !message.game?.slug)
122
+ return;
123
+ const avatar = message.avatar ?? {
124
+ presetId: 'default',
125
+ presetKey: 'default-1',
126
+ presetKind: 'procedural',
127
+ customConfig: {},
128
+ };
129
+ rememberTrustedOrigin(event.origin);
130
+ settleInit(asInitPayload({
131
+ ...message,
132
+ avatar,
133
+ }));
134
+ return;
135
+ }
136
+ rememberTrustedOrigin(event.origin);
137
+ settleInit(asInitPayload(data));
138
+ }
139
+ function signalReady() {
140
+ if (typeof window === 'undefined')
141
+ return;
142
+ if (!isEmbeddedInPlatform())
143
+ return;
144
+ window.parent.postMessage({ type: 'platform:ready' }, '*');
145
+ }
146
+ if (typeof window !== 'undefined') {
147
+ window.addEventListener('message', onMessage);
148
+ signalReady();
149
+ }
150
+ function postToPlatform(outboundType, payload, resultType, timeoutMs = DEFAULT_REQUEST_TIMEOUT_MS) {
151
+ return new Promise((resolve, reject) => {
152
+ if (!isEmbeddedInPlatform()) {
153
+ reject(new Error(`${outboundType} requires the platform iframe parent`));
154
+ return;
155
+ }
156
+ const requestId = typeof crypto !== 'undefined' && crypto.randomUUID
157
+ ? crypto.randomUUID()
158
+ : `${Date.now()}-${Math.random()}`;
159
+ const timer = setTimeout(() => {
160
+ window.removeEventListener('message', onResult);
161
+ reject(new Error('Platform SDK request timeout'));
162
+ }, timeoutMs);
163
+ function onResult(event) {
164
+ if (!isTrustedPlatformMessage(event))
165
+ return;
166
+ const data = event.data;
167
+ if (!data || typeof data !== 'object' || data.type !== resultType)
168
+ return;
169
+ if (data.requestId !== requestId)
170
+ return;
171
+ clearTimeout(timer);
172
+ window.removeEventListener('message', onResult);
173
+ rememberTrustedOrigin(event.origin);
174
+ const error = data.error;
175
+ if (error) {
176
+ reject(new Error(error));
177
+ return;
178
+ }
179
+ resolve(data.result);
180
+ }
181
+ window.addEventListener('message', onResult);
182
+ window.parent.postMessage({ type: outboundType, requestId, ...payload }, '*');
183
+ });
184
+ }
185
+ function nestErrorMessage(data, fallback) {
186
+ if (!data || typeof data !== 'object')
187
+ return fallback;
188
+ const message = data.message;
189
+ if (typeof message === 'string')
190
+ return message;
191
+ if (Array.isArray(message))
192
+ return message.join(', ');
193
+ return fallback;
194
+ }
195
+ /** Direct Development / top-level: call platform REST with the game session token. */
196
+ async function apiRequest(path, options = {}) {
197
+ const base = directPlatformUrl;
198
+ if (!base) {
199
+ throw new Error('Direct API calls require platformUrl. Pass PlatformSDK.init({ platformUrl, gameSlug }) or window.__OYNA360_DEV__.');
200
+ }
201
+ const headers = {
202
+ Accept: 'application/json',
203
+ };
204
+ if (options.body !== undefined) {
205
+ headers['Content-Type'] = 'application/json';
206
+ }
207
+ if (options.auth !== false) {
208
+ const token = initPayload?.session?.token;
209
+ if (!token) {
210
+ throw new Error('PlatformSDK.init() must complete before calling this API');
211
+ }
212
+ headers.Authorization = `Bearer ${token}`;
213
+ }
214
+ const response = await fetch(`${base}${path}`, {
215
+ method: options.method ?? (options.body !== undefined ? 'POST' : 'GET'),
216
+ headers,
217
+ body: options.body !== undefined ? JSON.stringify(options.body) : undefined,
218
+ });
219
+ const data = await response.json().catch(() => ({}));
220
+ if (!response.ok) {
221
+ throw new Error(nestErrorMessage(data, `Platform API error (${response.status})`));
222
+ }
223
+ return data;
224
+ }
225
+ function callPlatformFeature(outboundType, payload, resultType, directCall) {
226
+ if (isEmbeddedInPlatform()) {
227
+ return postToPlatform(outboundType, payload, resultType);
228
+ }
229
+ return directCall();
230
+ }
231
+ async function markDirectSessionReady() {
232
+ if (!directPlatformUrl || !initPayload?.session?.token)
233
+ return;
234
+ try {
235
+ await apiRequest('/sessions/ready', { method: 'POST' });
236
+ }
237
+ catch {
238
+ // Non-fatal: presence analytics only
239
+ }
240
+ }
241
+ function resolveDevConfig(options) {
242
+ const fromWindow = typeof window !== 'undefined' ? window.__OYNA360_DEV__ : undefined;
243
+ const platformUrl = (options?.platformUrl || fromWindow?.platformUrl || '').replace(/\/$/, '');
244
+ const gameSlug = (options?.gameSlug || fromWindow?.gameSlug || '').trim();
245
+ let platformWebUrl = (options?.platformWebUrl || fromWindow?.platformWebUrl || '').replace(/\/$/, '');
246
+ if (!platformWebUrl && platformUrl) {
247
+ try {
248
+ // Same host as API by default (production reverse-proxy). Locally set platformWebUrl explicitly
249
+ // when web (e.g. :3000) differs from API (e.g. :3001).
250
+ platformWebUrl = new URL(platformUrl).origin;
251
+ }
252
+ catch {
253
+ platformWebUrl = '';
254
+ }
255
+ }
256
+ return { platformUrl, platformWebUrl, gameSlug };
257
+ }
258
+ function readCodeFromUrl() {
259
+ if (typeof window === 'undefined')
260
+ return null;
261
+ try {
262
+ const url = new URL(window.location.href);
263
+ const code = url.searchParams.get(DEV_CODE_QUERY);
264
+ if (code) {
265
+ url.searchParams.delete(DEV_CODE_QUERY);
266
+ url.searchParams.delete('oyna_dev_slug');
267
+ window.history.replaceState({}, '', url.toString());
268
+ }
269
+ return code;
270
+ }
271
+ catch {
272
+ return null;
273
+ }
274
+ }
275
+ async function exchangeDevCode(platformUrl, code, gameOrigin) {
276
+ const response = await fetch(`${platformUrl}/dev/game-auth/exchange`, {
277
+ method: 'POST',
278
+ headers: { 'Content-Type': 'application/json' },
279
+ body: JSON.stringify({ code, gameOrigin }),
280
+ });
281
+ const data = await response.json().catch(() => ({}));
282
+ if (!response.ok) {
283
+ const msg = typeof data.message === 'string'
284
+ ? data.message
285
+ : Array.isArray(data.message)
286
+ ? data.message.join(', ')
287
+ : 'Development authorization exchange failed';
288
+ throw new Error(msg);
289
+ }
290
+ const payload = data;
291
+ if (!payload?.session?.token || !payload.avatar || !payload.lobby?.wsUrl) {
292
+ throw new Error('Invalid SdkInitPayload from development exchange');
293
+ }
294
+ return payload;
295
+ }
296
+ function openDevAuthorizePopup(authUrl) {
297
+ const width = 480;
298
+ const height = 720;
299
+ const left = Math.max(0, Math.floor(window.screenX + (window.outerWidth - width) / 2));
300
+ const top = Math.max(0, Math.floor(window.screenY + (window.outerHeight - height) / 2));
301
+ return window.open(authUrl, 'oyna360-dev-auth', `popup=yes,width=${width},height=${height},left=${left},top=${top}`);
302
+ }
303
+ async function runDirectDevelopmentBootstrap(options) {
304
+ const { platformUrl, platformWebUrl, gameSlug } = resolveDevConfig(options);
305
+ if (!platformUrl || !gameSlug || !platformWebUrl) {
306
+ throw new Error('Direct Development Mode requires platformUrl + gameSlug (and platformWebUrl). ' +
307
+ 'Set PlatformSDK.init({ platformUrl, gameSlug }) or window.__OYNA360_DEV__.');
308
+ }
309
+ rememberDirectPlatformUrl(platformUrl);
310
+ const gameOrigin = window.location.origin;
311
+ const existingCode = readCodeFromUrl();
312
+ if (existingCode) {
313
+ return exchangeDevCode(platformUrl, existingCode, gameOrigin);
314
+ }
315
+ const returnPath = `${window.location.pathname}${window.location.search}${window.location.hash}` || '/';
316
+ const authUrl = new URL('/dev/game-auth', platformWebUrl);
317
+ authUrl.searchParams.set('slug', gameSlug);
318
+ authUrl.searchParams.set('origin', gameOrigin);
319
+ authUrl.searchParams.set('return', returnPath.startsWith('/') ? returnPath : '/');
320
+ return new Promise((resolve, reject) => {
321
+ const timeoutMs = options?.timeout ?? 120_000;
322
+ let settled = false;
323
+ const cleanup = () => {
324
+ window.clearTimeout(timer);
325
+ window.removeEventListener('message', onAuthMessage);
326
+ };
327
+ const finish = (payload) => {
328
+ if (settled)
329
+ return;
330
+ settled = true;
331
+ cleanup();
332
+ resolve(payload);
333
+ };
334
+ const fail = (err) => {
335
+ if (settled)
336
+ return;
337
+ settled = true;
338
+ cleanup();
339
+ reject(err);
340
+ };
341
+ const timer = window.setTimeout(() => {
342
+ fail(new Error('Direct Development authorization timed out. Log in on the Oyna360 authorize page and allow popups.'));
343
+ }, timeoutMs);
344
+ const onAuthMessage = (event) => {
345
+ const data = event.data;
346
+ if (!data || typeof data !== 'object')
347
+ return;
348
+ if (data.type !== DEV_AUTH_MESSAGE)
349
+ return;
350
+ let expectedOrigin = '';
351
+ try {
352
+ expectedOrigin = new URL(platformWebUrl).origin;
353
+ }
354
+ catch {
355
+ return;
356
+ }
357
+ if (event.origin !== expectedOrigin)
358
+ return;
359
+ const code = data.code;
360
+ if (!code)
361
+ return;
362
+ void exchangeDevCode(platformUrl, code, gameOrigin).then(finish, fail);
363
+ };
364
+ window.addEventListener('message', onAuthMessage);
365
+ const popup = openDevAuthorizePopup(authUrl.toString());
366
+ if (!popup) {
367
+ // Popup blocked → full redirect; after login, game reloads with ?oyna_dev_code=
368
+ window.location.assign(authUrl.toString());
369
+ return;
370
+ }
371
+ });
372
+ }
373
+ function waitForIframeInit(timeoutMs) {
374
+ return new Promise((resolve, reject) => {
375
+ if (initPayload) {
376
+ resolve(initPayload);
377
+ return;
378
+ }
379
+ const timer = setTimeout(() => {
380
+ const index = initWaiters.findIndex((w) => w.timer === timer);
381
+ if (index >= 0)
382
+ initWaiters.splice(index, 1);
383
+ reject(new Error('Platform SDK init timeout — is the game running inside the platform?'));
384
+ }, timeoutMs);
385
+ initWaiters.push({ resolve, reject, timer });
386
+ signalReady();
387
+ });
388
+ }
389
+ /**
390
+ * Wait for platform init payload.
391
+ * - Production iframe: receives `platform:init` from parent.
392
+ * - Direct Development: Oyna360 authorize → one-time code → standard SdkInitPayload.
393
+ */
394
+ async function init(options) {
395
+ if (initPayload) {
396
+ return initPayload;
397
+ }
398
+ if (typeof window === 'undefined') {
399
+ throw new Error('PlatformSDK.init() requires a browser environment');
400
+ }
401
+ // Pin API base early so Direct Dev feature calls work after init.
402
+ const earlyDev = resolveDevConfig(options);
403
+ if (earlyDev.platformUrl) {
404
+ rememberDirectPlatformUrl(earlyDev.platformUrl);
405
+ }
406
+ // Optional: pin expected parent origin early (iframe + Direct Dev).
407
+ if (options?.platformWebUrl || earlyDev.platformWebUrl) {
408
+ try {
409
+ rememberTrustedOrigin(new URL(options?.platformWebUrl || earlyDev.platformWebUrl).origin);
410
+ }
411
+ catch {
412
+ // ignore invalid URL; message source check still applies in iframe mode
413
+ }
414
+ }
415
+ // Already delivered (e.g. early parent message or prior publish)
416
+ if (window.__OYNA360_PLATFORM_INIT__?.session?.token) {
417
+ const cached = asInitPayload(window.__OYNA360_PLATFORM_INIT__);
418
+ if (!cached.avatar) {
419
+ cached.avatar = {
420
+ presetId: 'default',
421
+ presetKey: 'default-1',
422
+ presetKind: 'procedural',
423
+ customConfig: {},
424
+ };
425
+ }
426
+ settleInit(cached);
427
+ return cached;
428
+ }
429
+ if (isEmbeddedInPlatform()) {
430
+ return waitForIframeInit(options?.timeout ?? DEFAULT_INIT_TIMEOUT_MS);
431
+ }
432
+ // Top-level: brief probe in case a parent/harness message races in, then bootstrap.
433
+ // Synthetic self-publish is ignored (source !== parent); probe usually times out.
434
+ try {
435
+ return await waitForIframeInit(IFRAME_PROBE_MS);
436
+ }
437
+ catch {
438
+ // expected when not in iframe
439
+ }
440
+ const payload = await runDirectDevelopmentBootstrap(options);
441
+ settleInit(payload);
442
+ void markDirectSessionReady();
443
+ return payload;
444
+ }
445
+ function getUser() {
446
+ return initPayload?.user ?? null;
447
+ }
448
+ function getSession() {
449
+ return initPayload?.session ?? null;
450
+ }
451
+ function getInitPayload() {
452
+ return initPayload;
453
+ }
454
+ function isReady() {
455
+ return initPayload !== null;
456
+ }
457
+ /** Submit score (keeps best score per player). Requires active session. */
458
+ async function submitScore(score) {
459
+ const payload = await init();
460
+ if (score < 0 || !Number.isFinite(score)) {
461
+ throw new Error('Score must be a non-negative number');
462
+ }
463
+ const floorScore = Math.floor(score);
464
+ return callPlatformFeature('platform:score:submit', { sessionToken: payload.session.token, score: floorScore }, 'platform:score:result', () => apiRequest(`/games/${payload.game.slug}/scores`, {
465
+ method: 'POST',
466
+ body: { score: floorScore },
467
+ }));
468
+ }
469
+ /** Fetch game leaderboard via platform bridge (iframe) or REST (Direct Dev). */
470
+ async function getLeaderboard(limit = 20) {
471
+ const payload = await init();
472
+ const safeLimit = Math.min(Math.max(Math.floor(limit) || 20, 1), 100);
473
+ return callPlatformFeature('platform:leaderboard:get', { limit: safeLimit }, 'platform:leaderboard:result', () => apiRequest(`/games/${payload.game.slug}/leaderboard?limit=${safeLimit}`, { auth: false }));
474
+ }
475
+ /** Unlock an achievement for the current player. Idempotent. */
476
+ async function unlockAchievement(key) {
477
+ const payload = await init();
478
+ if (!key.trim()) {
479
+ throw new Error('Achievement key is required');
480
+ }
481
+ const achievementKey = key.trim();
482
+ return callPlatformFeature('platform:achievement:unlock', { sessionToken: payload.session.token, key: achievementKey }, 'platform:achievement:unlock:result', () => apiRequest(`/games/${payload.game.slug}/achievements/unlock`, {
483
+ method: 'POST',
484
+ body: { key: achievementKey },
485
+ }));
486
+ }
487
+ /** List achievements with unlock status for the current player. */
488
+ async function getAchievements() {
489
+ const payload = await init();
490
+ return callPlatformFeature('platform:achievements:get', {}, 'platform:achievements:result', () => apiRequest(`/games/${payload.game.slug}/achievements/me`));
491
+ }
492
+ /** Platform gem balance + coins-per-gem rate for this game. */
493
+ async function getWallet() {
494
+ const payload = await init();
495
+ return callPlatformFeature('platform:wallet:get', {}, 'platform:wallet:result', () => apiRequest(`/games/${payload.game.slug}/wallet`));
496
+ }
497
+ /**
498
+ * Convert platform gems into in-game coins.
499
+ * Platform deducts gems; the game must credit `coinsReceived` to its own economy.
500
+ */
501
+ async function convertGems(gems) {
502
+ const payload = await init();
503
+ if (!Number.isInteger(gems) || gems < 1) {
504
+ throw new Error('gems must be a positive integer');
505
+ }
506
+ return callPlatformFeature('platform:gems:exchange', { sessionToken: payload.session.token, gems }, 'platform:gems:exchange:result', () => apiRequest(`/games/${payload.game.slug}/wallet/exchange`, {
507
+ method: 'POST',
508
+ body: { gems },
509
+ }));
510
+ }
511
+ async function endSession() {
512
+ const token = initPayload?.session.token;
513
+ if (!token || typeof window === 'undefined')
514
+ return;
515
+ if (isEmbeddedInPlatform()) {
516
+ window.parent.postMessage({
517
+ type: 'platform:session:end',
518
+ sessionToken: token,
519
+ }, '*');
520
+ return;
521
+ }
522
+ if (directPlatformUrl) {
523
+ try {
524
+ await apiRequest('/sessions/end', {
525
+ method: 'POST',
526
+ body: { token },
527
+ auth: false,
528
+ });
529
+ }
530
+ catch {
531
+ // Session may already be closed
532
+ }
533
+ }
534
+ }
535
+ exports.PlatformSDK = {
536
+ version: types_1.SDK_VERSION,
537
+ init,
538
+ getUser,
539
+ getSession,
540
+ getInitPayload,
541
+ isReady,
542
+ submitScore,
543
+ getLeaderboard,
544
+ unlockAchievement,
545
+ getAchievements,
546
+ getWallet,
547
+ convertGems,
548
+ endSession,
549
+ };
550
+ exports.default = exports.PlatformSDK;
551
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}