import * as maplibregl from 'maplibre-gl' import { Protocol } from 'pmtiles' import maplibreWorkerUrl from 'maplibre-gl/dist/maplibre-gl-worker.mjs?worker&url' let setup: Promise | null = null /** * آماده‌سازی وب‌ورکر نقشه — یک‌بار برای همه نقشه‌ها. * * ۱) نشانی وب‌ورکر مپ‌لیبر صریح تعیین می‌شود: مپ‌لیبر به‌صورت پیش‌فرض * «./maplibre-gl-worker.mjs» را کنار باندل جست‌وجو می‌کند که در خروجی ویت * وجود ندارد و ورکر ۴۰۴ می‌شود؛ نسخه‌ی ساخته‌شده‌ی ویت را با setWorkerUrl * می‌دهیم (نشانی مطلق، چون پایه‌ی ورکر می‌تواند Blob باشد). * ۲) پروتکل pmtiles در نخ اصلی ثبت می‌شود. * ۳) همان پروتکل با importScriptInWorkers داخل وب‌ورکر هم ثبت می‌شود — * کاشی‌های برداری آنجا بارگیری می‌شوند و رجیستری پروتکل در هر کانتکست * جداست. اسکریپت وب‌ورکر، خروجی خودبسنده‌ی public/map/pmtiles-worker.mjs * است (ساخته‌شده از src/map/pmtiles.worker.ts با npm run build:map-worker). * * تا پایان بارگیری اسکریپت صبر می‌کنیم تا نخستین درخواست‌های کاشی در وب‌ورکر * بی‌پاسخ نمانند. */ export function ensureMapWorker(): Promise { if (!setup) { maplibregl.setWorkerUrl(new URL(maplibreWorkerUrl, window.location.href).href) maplibregl.addProtocol('pmtiles', new Protocol().tile) const protocolScript = new URL( `${import.meta.env.BASE_URL}map/pmtiles-worker.mjs`, window.location.href, ).href setup = maplibregl.importScriptInWorkers(protocolScript) } return setup }