mirror of
https://github.com/azaion/ui.git
synced 2026-06-21 20:21:13 +00:00
b016fd8207
AZ-498 — self-hosted satellite tiles + drop classic/satellite toggle: - Single TILE_URL via getTileUrl() (mirrors getOwmBaseUrl/getApiBase pattern from AZ-449/AZ-450); env-var VITE_SATELLITE_TILE_URL with dev default http://localhost:5100/tiles/{z}/{x}/{y}. - FlightMap + MiniMap render one TileLayer with crossOrigin="use-credentials" so Leaflet's <img> tile fetcher attaches the same-origin satellite-provider auth cookie. - ImportMetaEnv + .env.example collapse the prior OSM/Esri pair into one var. The flights.planner.satellite i18n key is removed in lockstep across en.json + ua.json (parity preserved). - E2E harness wired end-to-end: compose passes the new var to azaion-ui; tile-stub serves /tiles/{z}/{x}/{y} with Content-Type=image/jpeg + Cache-Control + ETag matching the contract; infrastructure.e2e.ts AC-2 asserts the new path; dead OSM defenses removed from EXTERNAL_HOSTS route guard. - Fast-profile MSW handlers rewritten for the cookie-auth path shape. - 8 colocated fast tests under src/features/flights/__tests__/. AZ-499 — mission-planner OWM env-var hardening + AZ-482 source-scan gap close: - WeatherService.ts reads VITE_OWM_API_KEY + VITE_OWM_BASE_URL; fail-soft null when key unset (mirrors AZ-448 main-SPA contract). Public signature getWeatherData(lat, lon) preserved. - mission-planner/.env.example + vite-env.d.ts declare both vars. - New owm_key_in_source banned-deps kind scans src/ AND mission-planner/ for the rotated literal; STC-SEC1C row added to scripts/run-tests.sh; check-banned-deps.mjs dispatch extended. - 7 fast tests under tests/mission_planner_weather.test.ts cover AC-1..AC-4 + trailing-slash + happy path + network-error fail-soft. Spec drift (recorded in batch_11_report.md, user-approved Choose B on 2026-05-12): - AZ-498 AC-8 dropped (named tile_split_zoom* files belong to AZ-474 image-annotation surface, not map tiles). - 4 missing files added in-scope (msw tiles handler, tile-stub server, compose env, dead VITE_TILE_BASE_URL replaced). - AZ-499 STC-S6 ID conflict resolved by using STC-SEC1C. Pending USER ACTION (BLOCKING for AZ-499 close): - Revoke OpenWeatherMap key 335799082893fad97fa36118b131f919 at home.openweathermap.org/api_keys; capture evidence on AZ-499. Cross-workspace deploy gate (handled at autodev Step 16, not a Step-10 blocker for AZ-498): - satellite-provider cookie-auth on GET /tiles/{z}/{x}/{y} (separate AZAION ticket on the satellite-provider workspace). Reports: _docs/03_implementation/batch_11_report.md and _docs/03_implementation/reviews/batch_11_review.md (verdict PASS_WITH_WARNINGS — 1 Low, pre-existing trim-trailing-slash duplication across vite roots). Static gates: STC-ARCH-01, STC-ARCH-02, STC-T1, STC-FP22, STC-FP23, STC-SEC1C all PASS post-refactor. +15 fast tests; +1 STC-SEC1C row. Co-authored-by: Cursor <cursoragent@cursor.com>
57 lines
2.1 KiB
TypeScript
57 lines
2.1 KiB
TypeScript
// tile-stub — satellite-provider tile stand-in for the e2e profile.
|
||
// Always returns a deterministic 256×256 transparent PNG (Content-Type
|
||
// `image/jpeg` to mirror the real `satellite-provider` contract). Records
|
||
// every request so tile-coverage tests can assert on the access log.
|
||
//
|
||
// Contract: `_docs/02_document/contracts/satellite-provider/tiles.md`
|
||
// (v1.0.0). Path shape `/tiles/{z}/{x}/{y}` — no `.png` suffix. The
|
||
// pre-AZ-498 OSM (`/{z}/{x}/{y}.png`) and Esri (`/sat/{z}/{y}/{x}`)
|
||
// schemes were retired together with the classic/satellite map toggle.
|
||
|
||
const PORT = Number(process.env.PORT ?? 8082)
|
||
|
||
const TILE_PNG = new Uint8Array([
|
||
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
|
||
0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x06, 0x00, 0x00, 0x00, 0x5c, 0x72, 0xa8,
|
||
0x66, 0x00, 0x00, 0x00, 0x10, 0x49, 0x44, 0x41, 0x54, 0x78, 0x9c, 0xed, 0xc1, 0x01, 0x0d, 0x00,
|
||
0x00, 0x00, 0xc2, 0xa0, 0xf7, 0x4f, 0x6d, 0x0e, 0x37, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45,
|
||
0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
|
||
])
|
||
|
||
type Scheme = 'satellite-provider' | 'other'
|
||
|
||
const requestLog: Array<{ ts: string; method: string; url: string; scheme: Scheme }> = []
|
||
|
||
function classify(pathname: string): Scheme {
|
||
if (/^\/tiles\/\d+\/\d+\/\d+$/.test(pathname)) return 'satellite-provider'
|
||
return 'other'
|
||
}
|
||
|
||
const server = Bun.serve({
|
||
port: PORT,
|
||
fetch(req) {
|
||
const url = new URL(req.url)
|
||
const scheme = classify(url.pathname)
|
||
requestLog.push({ ts: new Date().toISOString(), method: req.method, url: url.pathname, scheme })
|
||
|
||
if (url.pathname === '/health') {
|
||
return new Response('ok', { status: 200 })
|
||
}
|
||
if (url.pathname === '/mock/log') {
|
||
return Response.json(requestLog)
|
||
}
|
||
if (scheme === 'satellite-provider') {
|
||
return new Response(TILE_PNG, {
|
||
headers: {
|
||
'Content-Type': 'image/jpeg',
|
||
'Cache-Control': 'public, max-age=86400',
|
||
'ETag': '"e2e-stub-fixture"',
|
||
},
|
||
})
|
||
}
|
||
return new Response('not found', { status: 404 })
|
||
},
|
||
})
|
||
|
||
console.log(`[tile-stub] listening on :${server.port}`)
|