@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.
@@ -0,0 +1,144 @@
1
+ # Direct Development Mode
2
+
3
+ بازی را روی **Host توسعه خودتان** اجرا کنید و به **سرور واقعی oyna360** وصل شوید — بدون iframe و بدون کلون پلتفرم.
4
+
5
+ هدف: سشن واقعی + Context کامل + لابی واقعی + امتیاز / لیدربورد / جِم / دستاورد از طریق REST مستقیم به API (بدون iframe).
6
+
7
+ Origin بازی باید در allowlist و CORS باشد (`DEV_GAME_ORIGINS` و/یا `allowedOrigins` بازی).
8
+
9
+ ---
10
+
11
+ ## جریان
12
+
13
+ ```text
14
+ npm run dev
15
+ → بازی روی مثلاً http://localhost:5180 یا هر origin دیگر
16
+ → PlatformSDK.init({ platformUrl, platformWebUrl, gameSlug })
17
+ → صفحه Authorize oyna360 (لاگین اکانت واقعی)
18
+ → one-time code (کوتاه‌عمر، یک‌بارمصرف)
19
+ → SdkInitPayload = همان شکل platform:init
20
+ → PlatformLobby.create({ platformInit })
21
+ → WebSocket لابی واقعی
22
+ ```
23
+
24
+ رمز عبور یا `SESSION_TOKEN` دائمی داخل پروژهٔ بازی نگذارید.
25
+
26
+ ---
27
+
28
+ ## پیکربندی سمت بازی
29
+
30
+ ### گزینه ۱ — آرگومان `init`
31
+
32
+ ```ts
33
+ await PlatformSDK.init({
34
+ platformUrl: 'https://oyna360.ir/api',
35
+ platformWebUrl: 'https://oyna360.ir',
36
+ gameSlug: 'my-game',
37
+ timeout: 120_000,
38
+ });
39
+ ```
40
+
41
+ ### گزینه ۲ — `window.__OYNA360_DEV__`
42
+
43
+ ```ts
44
+ window.__OYNA360_DEV__ = {
45
+ platformUrl: 'https://oyna360.ir/api',
46
+ platformWebUrl: 'https://oyna360.ir',
47
+ gameSlug: 'my-game',
48
+ };
49
+ await PlatformSDK.init();
50
+ ```
51
+
52
+ ### گزینه ۳ — env باندلر (Vite)
53
+
54
+ ```env
55
+ VITE_PLATFORM_API_URL=https://oyna360.ir/api
56
+ VITE_PLATFORM_WEB_URL=https://oyna360.ir
57
+ VITE_PLATFORM_GAME_SLUG=my-game
58
+ ```
59
+
60
+ در boot قبل از `init` آن‌ها را روی `__OYNA360_DEV__` بگذارید.
61
+
62
+ **لوکال پلتفرم:** اگر API روی `:3001` و Web روی `:3000` است، هر دو URL را جدا بدهید؛ فقط `platformUrl` کافی نیست.
63
+
64
+ ---
65
+
66
+ ## پیکربندی سمت پلتفرم (ادمین / DevOps)
67
+
68
+ Origin بازی باید مجاز باشد. سرور اتحاد این‌ها را چک می‌کند:
69
+
70
+ 1. env `DEV_GAME_ORIGINS` (لیست با ویرگول)
71
+ 2. `allowedOrigins` همان بازی در ادمین
72
+ 3. origin استخراج‌شده از `entryUrl`
73
+
74
+ مثال:
75
+
76
+ ```env
77
+ DEV_GAME_ORIGINS=http://localhost:5180,http://127.0.0.1:5173,http://192.168.1.20:5180
78
+ ```
79
+
80
+ همان originها برای **CORS** API هم باید دیده شوند (از طریق `DEV_GAME_ORIGINS` یا `CORS_ORIGINS`).
81
+ `Access-Control-Allow-Origin: *` برای این مسیر استفاده نمی‌شود.
82
+
83
+ پورت خاصی فرض نشده؛ هر `scheme://host:port` معتبر که allowlist شده باشد کار می‌کند.
84
+
85
+ ---
86
+
87
+ ## اتصال به لابی
88
+
89
+ ```ts
90
+ import { PlatformSDK } from '@oyna360/game-sdk';
91
+ import { PlatformLobby } from '@oyna360/lobby-sdk';
92
+
93
+ const init = await PlatformSDK.init({
94
+ platformUrl: 'https://oyna360.ir/api',
95
+ platformWebUrl: 'https://oyna360.ir',
96
+ gameSlug: 'my-game',
97
+ });
98
+
99
+ const lobby = await PlatformLobby.create({
100
+ canvas: document.getElementById('lobby') as HTMLCanvasElement,
101
+ platformInit: init,
102
+ roomId: init.lobby!.roomId,
103
+ wsUrl: init.lobby!.wsUrl,
104
+ });
105
+
106
+ lobby.applyPlazaLayout({
107
+ onRoomStart: (room) => {
108
+ lobby.destroy();
109
+ startMatch(room.id);
110
+ },
111
+ });
112
+ ```
113
+
114
+ `createDev()` لابی را برای این مسیر استفاده نکنید؛ آن Fake/Offline است.
115
+
116
+ ---
117
+
118
+ ## تفاوت با Production
119
+
120
+ | | Production | Direct Dev |
121
+ |--|------------|------------|
122
+ | باز شدن بازی | `/play/{slug}` + iframe | origin خودتان |
123
+ | Auth | لاگین پلتفرم قبل از play | Authorize هنگام `init` |
124
+ | Context | `platform:init` | همان شکل بعد از exchange |
125
+ | Score / wallet / achievement | ✅ postMessage | ✅ REST مستقیم |
126
+ | لابی واقعی | ✅ | ✅ |
127
+ | `endSession` | ✅ postMessage | ✅ REST `/sessions/end` |
128
+
129
+ کد بازی ترجیحاً `if (dev)` نداشته باشد؛ همان `init()` در هر دو حالت.
130
+
131
+ ---
132
+
133
+ ## عیب‌یابی سریع
134
+
135
+ | مشکل | کار |
136
+ |------|-----|
137
+ | Popup بسته می‌شود / بلاک | اجازه popup بدهید یا منتظر redirect با `?oyna_dev_code=` بمانید |
138
+ | `Development origin not allowed` | origin فعلی (`location.origin`) را به allowlist اضافه کنید |
139
+ | CORS error روی exchange / score / wallet | همان origin در `DEV_GAME_ORIGINS` یا `allowedOrigins` بازی |
140
+ | `Direct API calls require platformUrl` | `platformUrl` را در `init` یا `__OYNA360_DEV__` بگذارید |
141
+ | لابی وصل نمی‌شود | `init.lobby.wsUrl` را لاگ کنید؛ نباید localhost فرضی باشد مگر سرور لوکال |
142
+ | Avatar لود نمی‌شود | URLهای `/uploads` باید از origin API مطلق باشند (از Context سرور می‌آیند) |
143
+
144
+ بعدی: [10-achievements.md](./10-achievements.md) · [11-troubleshooting.md](./11-troubleshooting.md)
@@ -0,0 +1,27 @@
1
+ # دستاوردها — Achievements
2
+
3
+ ```ts
4
+ const list = await PlatformSDK.getAchievements();
5
+ // { gameSlug, achievements: [{ key, title, description, iconUrl, sortOrder, unlocked, unlockedAt }] }
6
+
7
+ const unlocked = await PlatformSDK.unlockAchievement('first_win');
8
+ // { key, title, unlocked, unlockedAt, alreadyUnlocked }
9
+ ```
10
+
11
+ ## نکات
12
+
13
+ - `key` باید در ادمین برای همان بازی تعریف شده باشد.
14
+ - `unlockAchievement` idempotent است؛ تکرار همان کلید `alreadyUnlocked: true` می‌دهد.
15
+ - نیاز به سشن فعال و `init()` دارد.
16
+ - در **Production** و **Direct Dev** هر دو کار می‌کند.
17
+
18
+ ```ts
19
+ await PlatformSDK.init();
20
+ if (playerWon) {
21
+ await PlatformSDK.unlockAchievement('first_win');
22
+ }
23
+ ```
24
+
25
+ کلید خالی خطا می‌دهد.
26
+
27
+ بعدی: [11-troubleshooting.md](./11-troubleshooting.md)
@@ -0,0 +1,44 @@
1
+ # عیب‌یابی — game-sdk
2
+
3
+ ## init timeout در Production
4
+
5
+ 1. آیا صفحه از `/play/{slug}` باز شده؟
6
+ 2. آیا `entryUrl` و origin iframe درست است؟
7
+ 3. کنسول parent را برای خطای launch/session ببینید.
8
+ 4. `PlatformSDK.version` با `minSdkVersion` بازی سازگار باشد.
9
+
10
+ ## Direct: «requires platformUrl + gameSlug»
11
+
12
+ `init` را با گزینه‌ها صدا بزنید یا `window.__OYNA360_DEV__` را قبل از init ست کنید.
13
+
14
+ ## Direct: origin not allowed
15
+
16
+ ```js
17
+ console.log(location.origin);
18
+ ```
19
+
20
+ همین مقدار را در `allowedOrigins` بازی یا `DEV_GAME_ORIGINS` سرور بگذارید.
21
+
22
+ ## Direct: CORS
23
+
24
+ مرورگر درخواست‌های Direct (`/dev/game-auth/exchange`، score، wallet، …) را بلاک می‌کند اگر origin در CORS / `DEV_GAME_ORIGINS` / `allowedOrigins` نباشد.
25
+
26
+ ## Score / wallet در Direct خطا می‌دهد
27
+
28
+ 1. `platformUrl` در `init` / `__OYNA360_DEV__` ست شده باشد (game-sdk ≥ 0.5.1).
29
+ 2. Origin بازی در allowlist و CORS باشد.
30
+ 3. سشن هنوز فعال باشد (`endSession` نزده باشید).
31
+
32
+ ## Context بدون avatar / lobby
33
+
34
+ از game-sdk **≥ 0.5.0** استفاده کنید. نسخهٔ قدیمی‌تر فیلدها را دور می‌ریخت.
35
+
36
+ ## چندبار init
37
+
38
+ مشکلی نیست؛ idempotent است. اگر می‌خواهید از صفر شروع کنید صفحه را رفرش کنید (سشن جدید با authorize دوباره).
39
+
40
+ ## تداخل با lobby-sdk
41
+
42
+ - اول `PlatformSDK.init()`، بعد `PlatformLobby.create({ platformInit })`.
43
+ - `createDev()` لابی ≠ Direct Development.
44
+ - `lobby.wsUrl` را دستی `localhost:3001` نگذارید.
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "@oyna360/game-sdk",
3
+ "version": "0.5.1",
4
+ "description": "oyna360 Game SDK — postMessage bridge + Direct Development Mode (init, scores, achievements, gem→coin).",
5
+ "license": "MIT",
6
+ "author": "oyna360",
7
+ "keywords": [
8
+ "oyna360",
9
+ "game-sdk",
10
+ "iframe",
11
+ "postmessage",
12
+ "leaderboard",
13
+ "achievements"
14
+ ],
15
+ "main": "./dist/index.js",
16
+ "types": "./dist/index.d.ts",
17
+ "exports": {
18
+ ".": {
19
+ "types": "./dist/index.d.ts",
20
+ "import": "./dist/index.js",
21
+ "require": "./dist/index.js",
22
+ "default": "./dist/index.js"
23
+ }
24
+ },
25
+ "files": [
26
+ "dist",
27
+ "docs",
28
+ "README.md",
29
+ "LICENSE"
30
+ ],
31
+ "sideEffects": false,
32
+ "scripts": {
33
+ "build": "tsc",
34
+ "dev": "tsc --watch",
35
+ "prepublishOnly": "npm run build",
36
+ "typecheck": "tsc --noEmit",
37
+ "lint": "echo \"No lint configured for @oyna360/game-sdk\""
38
+ },
39
+ "devDependencies": {
40
+ "typescript": "^5.7.2"
41
+ },
42
+ "engines": {
43
+ "node": ">=18"
44
+ },
45
+ "repository": {
46
+ "type": "git",
47
+ "url": "git+https://github.com/mamadjavadrasti/oyna360-game-sdk.git"
48
+ },
49
+ "bugs": {
50
+ "url": "https://github.com/mamadjavadrasti/oyna360-game-sdk/issues"
51
+ },
52
+ "homepage": "https://github.com/mamadjavadrasti/oyna360-game-sdk#readme",
53
+ "publishConfig": {
54
+ "access": "public"
55
+ }
56
+ }