@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/LICENSE +21 -0
- package/README.md +173 -0
- package/dist/index.d.ts +56 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +551 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +112 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/docs/00-overview.md +71 -0
- package/docs/01-shoro.md +80 -0
- package/docs/02-init.md +136 -0
- package/docs/03-user-session.md +33 -0
- package/docs/04-end-session.md +22 -0
- package/docs/05-scores.md +30 -0
- package/docs/06-leaderboard.md +19 -0
- package/docs/07-postmessage-protocol.md +45 -0
- package/docs/08-wallet.md +32 -0
- package/docs/09-direct-development.md +144 -0
- package/docs/10-achievements.md +27 -0
- package/docs/11-troubleshooting.md +44 -0
- package/package.json +56 -0
|
@@ -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
|
+
}
|