# Web (TeaVM/WebGL) और इसकी वास्तविक सीमाएँ

> TeaVM के ज़रिए JS में कंपाइल किया गया ऐप WebGL2 canvas पर चलता है — और क्या काम नहीं करता।

Source: https://crossfly.dev/hi/docs/platforms/web-teavm — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# Web (TeaVM/WebGL) 🌐

**अनुभाग का सबसे ईमानदार पेज।** वेब लक्ष्य (मॉड्यूल `web`, `WebLauncher`) ऐप को
**TeaVM के ज़रिए JavaScript** में कंपाइल करता है और उसे एक `<canvas>` **WebGL2** पर चलाता है (बैकएंड `gdx-teavm`)। **यह GWT नहीं है** और
**न** ही यह एम्बेडेड webview है: यह ब्राउज़र में चलने वाला **स्वयं ऐप** है।

## बिल्ड और सर्व करना
```bash
gradlew :web:webBundle       # (alias: dist)
```
`web/build/webapp/` जनरेट करता है जिसमें `index.html`, `web.js`, `scripts/howler.js`, `gdx.wasm.js`, और
`assets/` + `assets.txt` होते हैं। स्थानीय रूप से सर्व करें:
```bash
cd web/build/webapp && python -m http.server 8080
# http://127.0.0.1:8080/index.html खोलें
```
`WebLauncher` `new TeaApplication(new Main(true, cmdline), config)` करता है।

## ⚠️ क्या काम नहीं करता (*stub* है)
वेब पर, `PlatformUtilsWeb` अधिकांश सुविधाओं को *stub* के रूप में लागू करता है — कॉल मौजूद है लेकिन **कुछ
उपयोगी नहीं करती**:
| सुविधा | वेब पर व्यवहार |
|---|---|
| `WebContainer` | `createWebView()` **`null`** लौटाता है |
| GPS / स्थान | *stub* (कोई fix नहीं) |
| Bluetooth / रेडियो | *stub* (`WirelessState.UNSUPPORTED`) |
| बायोमेट्रिक्स | `AuthResult.ERROR` "Not supported" |
| आवाज़ (TTS/STT) | `voiceToText` → `onError` |
| नेटिव मानचित्र | समर्थित नहीं |
| कंपन / बैटरी | *stub* |
| **फ़ाइल परसिस्टेंस** | `Device.homeFolder = null` |

> चूँकि `crossfly-lib` (JNI) **WebGL में लोड नहीं होती** (`Main.create()` WebGL लक्ष्य पर `SharedLibraryLoader`
> को छोड़ देता है), जो कुछ भी नेटिव पर निर्भर है वह ऊपर बताए गए *stubs* पर आ जाता है।

## क्या काम करता है
- पूरी **UI रेंडर करना** (यह WebGL2 canvas पर वास्तविक ऐप है)।
- **बाहरी URL खोलना / डायल करना**: `PlatformUtils.instance.view(url)` / `dial(numero)` (के ज़रिए
  `Gdx.net.openURI`)।
- **प्रतिबंधों** के साथ HTTP (CORS; विफलता पर `Utils.getRemoteFile` `null` लौटाता है)।

## अनिवार्य पैटर्न: पता लगाएँ और fallback पर जाएँ
```java
if (PlatformUtils.instance.createWebView() != null) {
   // Android/iOS/Desktop: एम्बेडेड webview
} else {
   PlatformUtils.instance.view(url);   // Web: नए टैब में खोलता है
}
```
और वेब पर फ़ाइल परसिस्ट करने का प्रयास करने से पहले `Device.homeFolder == null` जाँचें।

## सर्वोत्तम अभ्यास
- वेब पर डिवाइस सुविधाओं को **अक्षम/अनुकूलित करें** (ऐसे बटन न छोड़ें जो कुछ नहीं करते)।
- वेब पर परसिस्टेंस: अपने बिल्ड में जो उपलब्ध हो उसका उपयोग करें (`homeFolder` पर निर्भर न रहें)।
- होस्ट करने से पहले स्टैटिक बंडल को स्थानीय रूप से सर्व करके परीक्षण करें।

## सामान्य त्रुटियाँ
- वेब पर `WebContainer`/GPS/बायोमेट्रिक्स मान लेना (ये *stub* हैं)।
- वेब पर `Device.homeFolder + "arquivo"` का प्रयास करना (`homeFolder` `null` है → NPE)।

## यह भी देखें
- [नेटिव इंटीग्रेशन](/docs/platforms/native-integration) · [प्लेटफ़ॉर्म मैट्रिक्स](/docs/platforms/overview)
