feat(rail): add a Rail layer with keyless live trains

Live trains from 30 keyless operator feeds: GPS positions from 29 and
Irish Rail's station reports, shown as the operators publish them. 28
work out of the box; Renfe long and medium distance and KTMB appear once
their pack is built, because their vehicles name no route.

Packs are opt-in (scripts/build-rail-paths.mjs): the operator's own
route lines, stop names, next stops and trip-update delays for live
trains. Nothing downloads when the app starts, no train is placed from a
timetable, and no request carries a deployer's key.
This commit is contained in:
Denis Groshev committed 2026-11-11 16:06:22 +01:00
1 parent 14db73f201
commit 830c080803
114 files changed
+26639 -26

No files matched your search

+99
View File
@@ -3249,6 +3249,27 @@
"src/i18n/marker.js",
"src/sources/nominatim.js",
"src/app/layers/transit.js",
"src/app/layers/rail.js",
"src/data/railFeeds.js",
"src/layers/rail/index.js",
"src/layers/rail/source.js",
"src/layers/rail/policy.js",
"src/layers/rail/ingestion.js",
"src/layers/rail/dedupe.js",
"src/layers/rail/rendering.js",
"src/layers/rail/selection.js",
"src/layers/rail/follow.js",
"src/layers/rail/viewport.js",
"src/layers/rail/controls.js",
"src/layers/rail/lifecycle.js",
"src/layers/rail/pathBinding.js",
"src/layers/rail/routeDisplay.js",
"src/layers/rail/routeLines.js",
"src/layers/rail/schedules.js",
"src/layers/rail/stopLabels.js",
"src/data/railPaths.js",
"src/data/railSchedule.js",
"src/data/railTimeZones.js",
"src/data/transit.js",
"src/data/transitFeeds.js",
"src/data/rioRouteNames.js",
@@ -4072,6 +4093,27 @@
"src/i18n/marker.js",
"src/sources/nominatim.js",
"src/app/layers/transit.js",
"src/app/layers/rail.js",
"src/data/railFeeds.js",
"src/layers/rail/index.js",
"src/layers/rail/source.js",
"src/layers/rail/policy.js",
"src/layers/rail/ingestion.js",
"src/layers/rail/dedupe.js",
"src/layers/rail/rendering.js",
"src/layers/rail/selection.js",
"src/layers/rail/follow.js",
"src/layers/rail/viewport.js",
"src/layers/rail/controls.js",
"src/layers/rail/lifecycle.js",
"src/layers/rail/pathBinding.js",
"src/layers/rail/routeDisplay.js",
"src/layers/rail/routeLines.js",
"src/layers/rail/schedules.js",
"src/layers/rail/stopLabels.js",
"src/data/railPaths.js",
"src/data/railSchedule.js",
"src/data/railTimeZones.js",
"src/data/transitFeeds.js",
"src/data/rioRouteNames.js",
"src/data/transitIcons.js",
@@ -5090,6 +5132,63 @@
],
"external": []
},
"rail-provider": {
"runtime": "node",
"exports": ["./server/providers/rail"],
"modules": [
"server/providers/rail.js",
"src/data/railFeeds.js",
"src/data/railProxy.js",
"src/data/irishRail.js",
"src/data/railSiriVm.js",
"src/data/railTripUpdates.js",
"src/data/railScheduleIndex.js",
"src/data/railSchedule.js",
"src/data/railTimeZones.js",
"src/data/railNoPositions.js",
"src/data/transitFeeds.js",
"src/data/rioRouteNames.js",
"src/geoDistance.js",
"src/data/transitProxy.js",
"src/data/gtfsRealtime.js",
"src/sources/httpBody.js",
"src/i18n/marker.js",
"src/sources/transitHistory.js",
"src/sources/railService.js",
"src/sources/rateLimit.js"
],
"external": ["pbf"]
},
"rail-source-factory": {
"exports": ["./layers/rail/source"],
"modules": ["src/layers/rail/source.js"],
"external": []
},
"rail-service": {
"exports": ["./sources/rail-service"],
"modules": [
"src/data/railFeeds.js",
"src/data/railProxy.js",
"src/data/irishRail.js",
"src/data/railSiriVm.js",
"src/data/railTripUpdates.js",
"src/data/railScheduleIndex.js",
"src/data/railSchedule.js",
"src/data/railTimeZones.js",
"src/data/railNoPositions.js",
"src/data/transitFeeds.js",
"src/data/rioRouteNames.js",
"src/geoDistance.js",
"src/data/transitProxy.js",
"src/data/gtfsRealtime.js",
"src/sources/httpBody.js",
"src/i18n/marker.js",
"src/sources/transitHistory.js",
"src/sources/railService.js",
"src/sources/rateLimit.js"
],
"external": ["pbf"]
},
"transit-service": {
"exports": ["./sources/transit-service"],
"modules": [