W3C API polyfills (FR-S6)
Опциональный слой @aurobore/polyfills маппит стандартные браузерные API на плагины Aurobore. Цель — перенос SPA/PWA без изменения кода (vision G1).
Подключение
В aurobore.config.json:
{
"web": {
"polyfills": true
}
}polyfills: true включает дефолтный набор из 4 «лёгких» адаптеров: geolocation, share, notification, clipboard. mediaDevices (getUserMedia) в дефолт не входит — это API движка (engine-first), включается только явным opt-in:
{ "web": { "polyfills": ["geolocation", "clipboard", "mediaDevices"] } }Скрипты в HTML (после bridge и plugins); тег несёт выбранный набор в data-polyfills:
<script src="js/aurobore-bridge.js"></script>
<script src="js/aurobore-plugins.js"></script>
<script src="js/aurobore-polyfills.js" data-aurobore-polyfills="1" data-polyfills="geolocation,clipboard,mediaDevices"></script>При aurobore build скрипт и тег инжектятся автоматически, если polyfills включены; рантайм-IIFE читает data-polyfills и ставит только перечисленные адаптеры (без атрибута → дефолтные 4).
Маппинг API
| W3C API | Плагин | Примечания |
|---|---|---|
navigator.geolocation | Geolocation | getCurrentPosition, watchPosition, clearWatch |
navigator.share / canShare | Share | text, url, files[0] |
Notification | Notifications | requestPermission → granted; без SW/actions |
navigator.clipboard | Clipboard | readText / writeText only |
navigator.mediaDevices.getUserMedia | engine-first (opt-in) | движок первичен; Camera-fallback заблокирован на спайк; audio → NotFoundError |
Ошибки (FR-S3 → W3C)
| Код Aurobore | W3C |
|---|---|
BRIDGE_PERMISSION_DENIED, *_CANCELLED | NotAllowedError / Position code 1 |
BRIDGE_TIMEOUT | TimeoutError / Position code 3 |
GEOLOCATION_UNAVAILABLE, CAMERA_UNAVAILABLE | NotFoundError / Position code 2 |
CAMERA_CAPTURE_FAILED | NotReadableError |
Деградация
- Polyfills не патчат API, если нативная реализация уже есть в WebView.
- Bootstrap не бросает исключений; ошибки — при вызове методов.
Camera / getUserMedia (engine-first)
getUserMedia — API движка WebView, не bridge-плагина. Стратегия engine-first, plugin-fallback:
- Полифил не патчит
getUserMedia, если движок его уже отдаёт (feature-detection). Если движок поддерживает камеру при выданном media-permission — polyfill не нужен. mediaDevices— только явный opt-in (web.polyfills: [..., "mediaDevices"]), не в дефолте.- Fallback через
Camera.watchPreview(stream → JPEG-кадры вbinaryPayload, base64) иcanvas.captureStream()для<video srcObject>— заблокирован на device-спайкV-webview-getusermedia(см. ADR-011 §Spike и verification-status). Эмулятор x86 отдаётCAMERA_UNAVAILABLE— проверять только на устройстве с камерой.
Mock mode (dev --web): синтетические кадры из fixture (для отладки контракта, не решает спайк).
Демо
cd examples/w3c-demo
pnpm build:web
aurobore dev --webПример использует только navigator.* и Notification — без @aurobore/* imports.
Non-goals (v1)
- Service Worker notifications,
Notification.actions clipboard.read()/write()сClipboardItemgetUserMediaaudio,MediaRecorder, WebRTC