36 lines
1.9 KiB
TypeScript
36 lines
1.9 KiB
TypeScript
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<void> | 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<void> {
|
|
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
|
|
}
|