@jablum/weather-mcp 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +1319 -0
- package/dist/analytics/anonymizer.d.ts +37 -0
- package/dist/analytics/anonymizer.d.ts.map +1 -0
- package/dist/analytics/anonymizer.js +112 -0
- package/dist/analytics/anonymizer.js.map +1 -0
- package/dist/analytics/collector.d.ts +72 -0
- package/dist/analytics/collector.d.ts.map +1 -0
- package/dist/analytics/collector.js +282 -0
- package/dist/analytics/collector.js.map +1 -0
- package/dist/analytics/config.d.ts +15 -0
- package/dist/analytics/config.d.ts.map +1 -0
- package/dist/analytics/config.js +172 -0
- package/dist/analytics/config.js.map +1 -0
- package/dist/analytics/index.d.ts +8 -0
- package/dist/analytics/index.d.ts.map +1 -0
- package/dist/analytics/index.js +7 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/analytics/middleware.d.ts +33 -0
- package/dist/analytics/middleware.d.ts.map +1 -0
- package/dist/analytics/middleware.js +99 -0
- package/dist/analytics/middleware.js.map +1 -0
- package/dist/analytics/transport.d.ts +11 -0
- package/dist/analytics/transport.d.ts.map +1 -0
- package/dist/analytics/transport.js +92 -0
- package/dist/analytics/transport.js.map +1 -0
- package/dist/analytics/types.d.ts +74 -0
- package/dist/analytics/types.d.ts.map +1 -0
- package/dist/analytics/types.js +6 -0
- package/dist/analytics/types.js.map +1 -0
- package/dist/config/api.d.ts +30 -0
- package/dist/config/api.d.ts.map +1 -0
- package/dist/config/api.js +32 -0
- package/dist/config/api.js.map +1 -0
- package/dist/config/cache.d.ts +31 -0
- package/dist/config/cache.d.ts.map +1 -0
- package/dist/config/cache.js +108 -0
- package/dist/config/cache.js.map +1 -0
- package/dist/config/displayThresholds.d.ts +83 -0
- package/dist/config/displayThresholds.d.ts.map +1 -0
- package/dist/config/displayThresholds.js +83 -0
- package/dist/config/displayThresholds.js.map +1 -0
- package/dist/config/tools.d.ts +44 -0
- package/dist/config/tools.d.ts.map +1 -0
- package/dist/config/tools.js +269 -0
- package/dist/config/tools.js.map +1 -0
- package/dist/errors/ApiError.d.ts +62 -0
- package/dist/errors/ApiError.d.ts.map +1 -0
- package/dist/errors/ApiError.js +171 -0
- package/dist/errors/ApiError.js.map +1 -0
- package/dist/handlers/airQualityHandler.d.ts +11 -0
- package/dist/handlers/airQualityHandler.d.ts.map +1 -0
- package/dist/handlers/airQualityHandler.js +154 -0
- package/dist/handlers/airQualityHandler.js.map +1 -0
- package/dist/handlers/alertsHandler.d.ts +11 -0
- package/dist/handlers/alertsHandler.d.ts.map +1 -0
- package/dist/handlers/alertsHandler.js +98 -0
- package/dist/handlers/alertsHandler.js.map +1 -0
- package/dist/handlers/currentConditionsHandler.d.ts +13 -0
- package/dist/handlers/currentConditionsHandler.d.ts.map +1 -0
- package/dist/handlers/currentConditionsHandler.js +296 -0
- package/dist/handlers/currentConditionsHandler.js.map +1 -0
- package/dist/handlers/forecastHandler.d.ts +16 -0
- package/dist/handlers/forecastHandler.d.ts.map +1 -0
- package/dist/handlers/forecastHandler.js +454 -0
- package/dist/handlers/forecastHandler.js.map +1 -0
- package/dist/handlers/historicalWeatherHandler.d.ts +12 -0
- package/dist/handlers/historicalWeatherHandler.d.ts.map +1 -0
- package/dist/handlers/historicalWeatherHandler.js +188 -0
- package/dist/handlers/historicalWeatherHandler.js.map +1 -0
- package/dist/handlers/lightningHandler.d.ts +14 -0
- package/dist/handlers/lightningHandler.d.ts.map +1 -0
- package/dist/handlers/lightningHandler.js +258 -0
- package/dist/handlers/lightningHandler.js.map +1 -0
- package/dist/handlers/locationHandler.d.ts +12 -0
- package/dist/handlers/locationHandler.d.ts.map +1 -0
- package/dist/handlers/locationHandler.js +149 -0
- package/dist/handlers/locationHandler.js.map +1 -0
- package/dist/handlers/marineConditionsHandler.d.ts +13 -0
- package/dist/handlers/marineConditionsHandler.d.ts.map +1 -0
- package/dist/handlers/marineConditionsHandler.js +270 -0
- package/dist/handlers/marineConditionsHandler.js.map +1 -0
- package/dist/handlers/riverConditionsHandler.d.ts +11 -0
- package/dist/handlers/riverConditionsHandler.d.ts.map +1 -0
- package/dist/handlers/riverConditionsHandler.js +176 -0
- package/dist/handlers/riverConditionsHandler.js.map +1 -0
- package/dist/handlers/savedLocationsHandler.d.ts +50 -0
- package/dist/handlers/savedLocationsHandler.d.ts.map +1 -0
- package/dist/handlers/savedLocationsHandler.js +397 -0
- package/dist/handlers/savedLocationsHandler.js.map +1 -0
- package/dist/handlers/statusHandler.d.ts +12 -0
- package/dist/handlers/statusHandler.d.ts.map +1 -0
- package/dist/handlers/statusHandler.js +115 -0
- package/dist/handlers/statusHandler.js.map +1 -0
- package/dist/handlers/weatherImageryHandler.d.ts +14 -0
- package/dist/handlers/weatherImageryHandler.d.ts.map +1 -0
- package/dist/handlers/weatherImageryHandler.js +143 -0
- package/dist/handlers/weatherImageryHandler.js.map +1 -0
- package/dist/handlers/wildfireHandler.d.ts +11 -0
- package/dist/handlers/wildfireHandler.d.ts.map +1 -0
- package/dist/handlers/wildfireHandler.js +186 -0
- package/dist/handlers/wildfireHandler.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +735 -0
- package/dist/index.js.map +1 -0
- package/dist/services/blitzortung.d.ts +67 -0
- package/dist/services/blitzortung.d.ts.map +1 -0
- package/dist/services/blitzortung.js +475 -0
- package/dist/services/blitzortung.js.map +1 -0
- package/dist/services/geocoding.d.ts +57 -0
- package/dist/services/geocoding.d.ts.map +1 -0
- package/dist/services/geocoding.js +393 -0
- package/dist/services/geocoding.js.map +1 -0
- package/dist/services/locationStore.d.ts +62 -0
- package/dist/services/locationStore.d.ts.map +1 -0
- package/dist/services/locationStore.js +201 -0
- package/dist/services/locationStore.js.map +1 -0
- package/dist/services/ncei.d.ts +61 -0
- package/dist/services/ncei.d.ts.map +1 -0
- package/dist/services/ncei.js +126 -0
- package/dist/services/ncei.js.map +1 -0
- package/dist/services/nifc.d.ts +44 -0
- package/dist/services/nifc.d.ts.map +1 -0
- package/dist/services/nifc.js +159 -0
- package/dist/services/nifc.js.map +1 -0
- package/dist/services/noaa.d.ts +161 -0
- package/dist/services/noaa.d.ts.map +1 -0
- package/dist/services/noaa.js +681 -0
- package/dist/services/noaa.js.map +1 -0
- package/dist/services/nominatim.d.ts +62 -0
- package/dist/services/nominatim.d.ts.map +1 -0
- package/dist/services/nominatim.js +254 -0
- package/dist/services/nominatim.js.map +1 -0
- package/dist/services/openmeteo.d.ts +189 -0
- package/dist/services/openmeteo.d.ts.map +1 -0
- package/dist/services/openmeteo.js +936 -0
- package/dist/services/openmeteo.js.map +1 -0
- package/dist/services/rainviewer.d.ts +37 -0
- package/dist/services/rainviewer.d.ts.map +1 -0
- package/dist/services/rainviewer.js +115 -0
- package/dist/services/rainviewer.js.map +1 -0
- package/dist/types/imagery.d.ts +82 -0
- package/dist/types/imagery.d.ts.map +1 -0
- package/dist/types/imagery.js +6 -0
- package/dist/types/imagery.js.map +1 -0
- package/dist/types/lightning.d.ts +89 -0
- package/dist/types/lightning.d.ts.map +1 -0
- package/dist/types/lightning.js +6 -0
- package/dist/types/lightning.js.map +1 -0
- package/dist/types/noaa.d.ts +535 -0
- package/dist/types/noaa.d.ts.map +1 -0
- package/dist/types/noaa.js +5 -0
- package/dist/types/noaa.js.map +1 -0
- package/dist/types/nominatim.d.ts +72 -0
- package/dist/types/nominatim.d.ts.map +1 -0
- package/dist/types/nominatim.js +6 -0
- package/dist/types/nominatim.js.map +1 -0
- package/dist/types/openmeteo.d.ts +583 -0
- package/dist/types/openmeteo.d.ts.map +1 -0
- package/dist/types/openmeteo.js +6 -0
- package/dist/types/openmeteo.js.map +1 -0
- package/dist/types/savedLocations.d.ts +58 -0
- package/dist/types/savedLocations.d.ts.map +1 -0
- package/dist/types/savedLocations.js +5 -0
- package/dist/types/savedLocations.js.map +1 -0
- package/dist/types/wildfire.d.ts +83 -0
- package/dist/types/wildfire.d.ts.map +1 -0
- package/dist/types/wildfire.js +5 -0
- package/dist/types/wildfire.js.map +1 -0
- package/dist/utils/airQuality.d.ts +54 -0
- package/dist/utils/airQuality.d.ts.map +1 -0
- package/dist/utils/airQuality.js +251 -0
- package/dist/utils/airQuality.js.map +1 -0
- package/dist/utils/cache.d.ts +69 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +164 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/distance.d.ts +25 -0
- package/dist/utils/distance.d.ts.map +1 -0
- package/dist/utils/distance.js +40 -0
- package/dist/utils/distance.js.map +1 -0
- package/dist/utils/fireWeather.d.ts +76 -0
- package/dist/utils/fireWeather.d.ts.map +1 -0
- package/dist/utils/fireWeather.js +243 -0
- package/dist/utils/fireWeather.js.map +1 -0
- package/dist/utils/geography.d.ts +79 -0
- package/dist/utils/geography.d.ts.map +1 -0
- package/dist/utils/geography.js +266 -0
- package/dist/utils/geography.js.map +1 -0
- package/dist/utils/geohash.d.ts +62 -0
- package/dist/utils/geohash.d.ts.map +1 -0
- package/dist/utils/geohash.js +146 -0
- package/dist/utils/geohash.js.map +1 -0
- package/dist/utils/locationResolver.d.ts +34 -0
- package/dist/utils/locationResolver.d.ts.map +1 -0
- package/dist/utils/locationResolver.js +120 -0
- package/dist/utils/locationResolver.js.map +1 -0
- package/dist/utils/logger.d.ts +75 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +153 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/marine.d.ts +59 -0
- package/dist/utils/marine.d.ts.map +1 -0
- package/dist/utils/marine.js +215 -0
- package/dist/utils/marine.js.map +1 -0
- package/dist/utils/normals.d.ts +86 -0
- package/dist/utils/normals.d.ts.map +1 -0
- package/dist/utils/normals.js +223 -0
- package/dist/utils/normals.js.map +1 -0
- package/dist/utils/snow.d.ts +45 -0
- package/dist/utils/snow.d.ts.map +1 -0
- package/dist/utils/snow.js +144 -0
- package/dist/utils/snow.js.map +1 -0
- package/dist/utils/temperatureConversion.d.ts +12 -0
- package/dist/utils/temperatureConversion.d.ts.map +1 -0
- package/dist/utils/temperatureConversion.js +17 -0
- package/dist/utils/temperatureConversion.js.map +1 -0
- package/dist/utils/timezone.d.ts +56 -0
- package/dist/utils/timezone.d.ts.map +1 -0
- package/dist/utils/timezone.js +167 -0
- package/dist/utils/timezone.js.map +1 -0
- package/dist/utils/units.d.ts +69 -0
- package/dist/utils/units.d.ts.map +1 -0
- package/dist/utils/units.js +158 -0
- package/dist/utils/units.js.map +1 -0
- package/dist/utils/validation.d.ts +89 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +177 -0
- package/dist/utils/validation.js.map +1 -0
- package/dist/utils/version.d.ts +15 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +24 -0
- package/dist/utils/version.js.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Blitzortung.org MQTT client for real-time lightning detection
|
|
3
|
+
* Community-operated global lightning detection network (free, no API key required)
|
|
4
|
+
*
|
|
5
|
+
* Data access via public MQTT broker maintained for homeassistant-blitzortung integration
|
|
6
|
+
* @see https://github.com/mrk-its/homeassistant-blitzortung
|
|
7
|
+
* @see https://www.blitzortung.org/
|
|
8
|
+
*/
|
|
9
|
+
import { LightningStrike } from '../types/lightning.js';
|
|
10
|
+
export declare class BlitzortungService {
|
|
11
|
+
private client;
|
|
12
|
+
private readonly brokerUrl;
|
|
13
|
+
private readonly topicPrefix;
|
|
14
|
+
private readonly reconnectPeriod;
|
|
15
|
+
private readonly connectTimeout;
|
|
16
|
+
private strikeBuffer;
|
|
17
|
+
private readonly bufferDuration;
|
|
18
|
+
private readonly maxBufferSize;
|
|
19
|
+
private subscribedGeohashes;
|
|
20
|
+
private readonly maxSubscriptions;
|
|
21
|
+
private isConnecting;
|
|
22
|
+
private isConnected;
|
|
23
|
+
constructor();
|
|
24
|
+
/**
|
|
25
|
+
* Connect to MQTT broker if not already connected
|
|
26
|
+
*/
|
|
27
|
+
private ensureConnected;
|
|
28
|
+
/**
|
|
29
|
+
* Handle incoming MQTT message
|
|
30
|
+
*/
|
|
31
|
+
private handleMessage;
|
|
32
|
+
/**
|
|
33
|
+
* Subscribe to geohash topics for a location
|
|
34
|
+
*/
|
|
35
|
+
private subscribeToLocation;
|
|
36
|
+
/**
|
|
37
|
+
* Evict oldest subscriptions to make room for new ones (LRU eviction)
|
|
38
|
+
*/
|
|
39
|
+
private evictOldestSubscriptions;
|
|
40
|
+
/**
|
|
41
|
+
* Periodically prune stale subscriptions (not accessed in last hour)
|
|
42
|
+
*/
|
|
43
|
+
private startSubscriptionPruning;
|
|
44
|
+
/**
|
|
45
|
+
* Get recent lightning strikes from buffer
|
|
46
|
+
*/
|
|
47
|
+
getLightningStrikes(latitude: number, longitude: number, radiusKm?: number, timeWindowMinutes?: number): Promise<LightningStrike[]>;
|
|
48
|
+
/**
|
|
49
|
+
* Filter strikes from buffer based on location and time window
|
|
50
|
+
*/
|
|
51
|
+
private filterStrikes;
|
|
52
|
+
/**
|
|
53
|
+
* Clean up old strikes from buffer
|
|
54
|
+
*/
|
|
55
|
+
private cleanupBuffer;
|
|
56
|
+
/**
|
|
57
|
+
* Start periodic buffer cleanup
|
|
58
|
+
*/
|
|
59
|
+
private startCleanupInterval;
|
|
60
|
+
/**
|
|
61
|
+
* Disconnect from MQTT broker
|
|
62
|
+
* This method is available for graceful shutdown scenarios
|
|
63
|
+
*/
|
|
64
|
+
disconnect(): Promise<void>;
|
|
65
|
+
}
|
|
66
|
+
export declare const blitzortungService: BlitzortungService;
|
|
67
|
+
//# sourceMappingURL=blitzortung.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blitzortung.d.ts","sourceRoot":"","sources":["../../src/services/blitzortung.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAuCxD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAA2B;IAazC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2E;IACrG,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAQ;IACxC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IAGxC,OAAO,CAAC,YAAY,CAA2C;IAC/D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAmB;IAClD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IAGvC,OAAO,CAAC,mBAAmB,CAAkC;IAC7D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAM;IACvC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,WAAW,CAAS;;IAS5B;;OAEG;YACW,eAAe;IA4E7B;;OAEG;IACH,OAAO,CAAC,aAAa;IAwFrB;;OAEG;YACW,mBAAmB;IAsEjC;;OAEG;YACW,wBAAwB;IA+CtC;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAoDhC;;OAEG;IACG,mBAAmB,CACvB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,QAAQ,GAAE,MAAY,EACtB,iBAAiB,GAAE,MAAW,GAC7B,OAAO,CAAC,eAAe,EAAE,CAAC;IAwC7B;;OAEG;IACH,OAAO,CAAC,aAAa;IAuCrB;;OAEG;IACH,OAAO,CAAC,aAAa;IAoBrB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAO5B;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAiBlC;AAGD,eAAO,MAAM,kBAAkB,oBAA2B,CAAC"}
|
|
@@ -0,0 +1,475 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Blitzortung.org MQTT client for real-time lightning detection
|
|
3
|
+
* Community-operated global lightning detection network (free, no API key required)
|
|
4
|
+
*
|
|
5
|
+
* Data access via public MQTT broker maintained for homeassistant-blitzortung integration
|
|
6
|
+
* @see https://github.com/mrk-its/homeassistant-blitzortung
|
|
7
|
+
* @see https://www.blitzortung.org/
|
|
8
|
+
*/
|
|
9
|
+
import mqtt from 'mqtt';
|
|
10
|
+
import { logger, redactCoordinatesForLogging } from '../utils/logger.js';
|
|
11
|
+
import { calculateGeohashSubscriptions } from '../utils/geohash.js';
|
|
12
|
+
/**
|
|
13
|
+
* Calculate distance between two coordinates using Haversine formula
|
|
14
|
+
*/
|
|
15
|
+
function calculateDistance(lat1, lon1, lat2, lon2) {
|
|
16
|
+
const R = 6371; // Earth's radius in km
|
|
17
|
+
const dLat = ((lat2 - lat1) * Math.PI) / 180;
|
|
18
|
+
const dLon = ((lon2 - lon1) * Math.PI) / 180;
|
|
19
|
+
const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
|
|
20
|
+
Math.cos((lat1 * Math.PI) / 180) *
|
|
21
|
+
Math.cos((lat2 * Math.PI) / 180) *
|
|
22
|
+
Math.sin(dLon / 2) *
|
|
23
|
+
Math.sin(dLon / 2);
|
|
24
|
+
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
|
|
25
|
+
return R * c;
|
|
26
|
+
}
|
|
27
|
+
export class BlitzortungService {
|
|
28
|
+
client = null;
|
|
29
|
+
// SECURITY WARNING: Default broker uses PLAINTEXT MQTT (port 1883)
|
|
30
|
+
// The public Blitzortung community broker (blitzortung.ha.sed.pl) does not support TLS.
|
|
31
|
+
// While lightning strike data is public information, plaintext connections allow:
|
|
32
|
+
// - Network observers to see which regions you're monitoring (via MQTT subscriptions)
|
|
33
|
+
// - Potential message tampering (injecting false lightning data)
|
|
34
|
+
//
|
|
35
|
+
// RECOMMENDED MITIGATIONS:
|
|
36
|
+
// 1. Set BLITZORTUNG_MQTT_URL to a TLS-enabled broker (mqtts:// or wss://)
|
|
37
|
+
// 2. Run a local MQTT proxy with TLS termination
|
|
38
|
+
// 3. Deploy in a trusted network environment
|
|
39
|
+
//
|
|
40
|
+
// Location privacy: Geohash subscriptions have ~4-40km precision (limited tracking risk)
|
|
41
|
+
brokerUrl = process.env.BLITZORTUNG_MQTT_URL || 'mqtt://blitzortung.ha.sed.pl:1883';
|
|
42
|
+
topicPrefix = 'blitzortung/1.1';
|
|
43
|
+
reconnectPeriod = 5000; // 5 seconds
|
|
44
|
+
connectTimeout = 30000; // 30 seconds
|
|
45
|
+
// Rolling buffer of recent strikes (last 2 hours)
|
|
46
|
+
strikeBuffer = new Map();
|
|
47
|
+
bufferDuration = 120 * 60 * 1000; // 2 hours in milliseconds
|
|
48
|
+
maxBufferSize = 10000; // Maximum strikes to buffer (safety limit)
|
|
49
|
+
// Subscription management with LRU tracking
|
|
50
|
+
subscribedGeohashes = new Map(); // geohash -> last access timestamp
|
|
51
|
+
maxSubscriptions = 50; // Limit concurrent subscriptions to prevent unbounded growth
|
|
52
|
+
isConnecting = false;
|
|
53
|
+
isConnected = false;
|
|
54
|
+
constructor() {
|
|
55
|
+
// Start cleanup interval
|
|
56
|
+
this.startCleanupInterval();
|
|
57
|
+
// Start subscription pruning interval
|
|
58
|
+
this.startSubscriptionPruning();
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Connect to MQTT broker if not already connected
|
|
62
|
+
*/
|
|
63
|
+
async ensureConnected() {
|
|
64
|
+
if (this.isConnected && this.client) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
if (this.isConnecting) {
|
|
68
|
+
// Wait for existing connection attempt
|
|
69
|
+
return new Promise((resolve) => {
|
|
70
|
+
const checkInterval = setInterval(() => {
|
|
71
|
+
if (this.isConnected || !this.isConnecting) {
|
|
72
|
+
clearInterval(checkInterval);
|
|
73
|
+
resolve();
|
|
74
|
+
}
|
|
75
|
+
}, 100);
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
this.isConnecting = true;
|
|
79
|
+
try {
|
|
80
|
+
// Security warning for plaintext connections
|
|
81
|
+
const isPlaintext = this.brokerUrl.startsWith('mqtt://') ||
|
|
82
|
+
(!this.brokerUrl.startsWith('mqtts://') && !this.brokerUrl.startsWith('wss://'));
|
|
83
|
+
if (isPlaintext) {
|
|
84
|
+
logger.warn('SECURITY: Using plaintext MQTT connection (unencrypted)', {
|
|
85
|
+
broker: this.brokerUrl,
|
|
86
|
+
securityEvent: true,
|
|
87
|
+
recommendation: 'Use BLITZORTUNG_MQTT_URL environment variable to configure TLS broker (mqtts:// or wss://)'
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
logger.info('Connecting to Blitzortung MQTT broker', {
|
|
91
|
+
broker: this.brokerUrl,
|
|
92
|
+
encrypted: !isPlaintext
|
|
93
|
+
});
|
|
94
|
+
this.client = mqtt.connect(this.brokerUrl, {
|
|
95
|
+
reconnectPeriod: this.reconnectPeriod,
|
|
96
|
+
connectTimeout: this.connectTimeout,
|
|
97
|
+
clientId: `weather-mcp-${Math.random().toString(16).slice(2, 10)}`
|
|
98
|
+
});
|
|
99
|
+
await new Promise((resolve, reject) => {
|
|
100
|
+
const timeoutId = setTimeout(() => {
|
|
101
|
+
reject(new Error('MQTT connection timeout'));
|
|
102
|
+
}, this.connectTimeout);
|
|
103
|
+
this.client.on('connect', () => {
|
|
104
|
+
clearTimeout(timeoutId);
|
|
105
|
+
this.isConnected = true;
|
|
106
|
+
this.isConnecting = false;
|
|
107
|
+
logger.info('Connected to Blitzortung MQTT broker');
|
|
108
|
+
resolve();
|
|
109
|
+
});
|
|
110
|
+
this.client.on('error', (error) => {
|
|
111
|
+
clearTimeout(timeoutId);
|
|
112
|
+
this.isConnecting = false;
|
|
113
|
+
logger.error('MQTT connection error', error);
|
|
114
|
+
reject(error);
|
|
115
|
+
});
|
|
116
|
+
this.client.on('close', () => {
|
|
117
|
+
this.isConnected = false;
|
|
118
|
+
logger.warn('MQTT connection closed');
|
|
119
|
+
});
|
|
120
|
+
this.client.on('message', this.handleMessage.bind(this));
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
this.isConnecting = false;
|
|
125
|
+
throw error;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Handle incoming MQTT message
|
|
130
|
+
*/
|
|
131
|
+
handleMessage(topic, payload) {
|
|
132
|
+
try {
|
|
133
|
+
const payloadStr = payload.toString();
|
|
134
|
+
const data = JSON.parse(payloadStr);
|
|
135
|
+
// Validate required fields
|
|
136
|
+
if (!data.lat || !data.lon || !data.time) {
|
|
137
|
+
logger.warn('Lightning strike missing required fields', {
|
|
138
|
+
topic,
|
|
139
|
+
hasLat: !!data.lat,
|
|
140
|
+
hasLon: !!data.lon,
|
|
141
|
+
hasTime: !!data.time
|
|
142
|
+
});
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
// Convert timestamp - Blitzortung sends nanoseconds, convert to milliseconds
|
|
146
|
+
// Example: 1762715394083570200 nanoseconds -> 1731178800000 milliseconds
|
|
147
|
+
let timestampMs = data.time;
|
|
148
|
+
if (data.time > 10000000000000) {
|
|
149
|
+
// If timestamp is > year 2286 in milliseconds, it's probably in nanoseconds
|
|
150
|
+
timestampMs = Math.floor(data.time / 1000000);
|
|
151
|
+
}
|
|
152
|
+
// Convert to our LightningStrike format
|
|
153
|
+
const strike = {
|
|
154
|
+
timestamp: new Date(timestampMs),
|
|
155
|
+
latitude: data.lat,
|
|
156
|
+
longitude: data.lon,
|
|
157
|
+
polarity: data.pol || 0,
|
|
158
|
+
amplitude: data.mcs || 0,
|
|
159
|
+
stationCount: data.stat,
|
|
160
|
+
distance: 0 // Will be calculated when filtering
|
|
161
|
+
};
|
|
162
|
+
// Validate timestamp
|
|
163
|
+
if (isNaN(strike.timestamp.getTime())) {
|
|
164
|
+
logger.warn('Invalid timestamp in lightning strike', {
|
|
165
|
+
topic,
|
|
166
|
+
time: data.time,
|
|
167
|
+
converted: timestampMs
|
|
168
|
+
});
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
// Check buffer size limit before adding (safety bounds checking)
|
|
172
|
+
if (this.strikeBuffer.size >= this.maxBufferSize) {
|
|
173
|
+
logger.warn('Lightning strike buffer at capacity, removing oldest entries', {
|
|
174
|
+
currentSize: this.strikeBuffer.size,
|
|
175
|
+
maxSize: this.maxBufferSize,
|
|
176
|
+
securityEvent: true
|
|
177
|
+
});
|
|
178
|
+
// Remove oldest 10% of entries to make room
|
|
179
|
+
const entriesToRemove = Math.floor(this.maxBufferSize * 0.1);
|
|
180
|
+
const iterator = this.strikeBuffer.keys();
|
|
181
|
+
for (let i = 0; i < entriesToRemove; i++) {
|
|
182
|
+
const result = iterator.next();
|
|
183
|
+
if (!result.done) {
|
|
184
|
+
this.strikeBuffer.delete(result.value);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// Add to buffer with unique key
|
|
189
|
+
const key = `${data.time}_${data.lat}_${data.lon}`;
|
|
190
|
+
this.strikeBuffer.set(key, strike);
|
|
191
|
+
// Log strikes at DEBUG level with coordinate redaction for privacy
|
|
192
|
+
// Strike coordinates are rounded to ~1km precision to prevent tracking individual locations
|
|
193
|
+
const redacted = redactCoordinatesForLogging(strike.latitude, strike.longitude);
|
|
194
|
+
logger.debug('Lightning strike added to buffer', {
|
|
195
|
+
bufferSize: this.strikeBuffer.size,
|
|
196
|
+
strike: {
|
|
197
|
+
lat: redacted.lat,
|
|
198
|
+
lon: redacted.lon,
|
|
199
|
+
time: strike.timestamp.toISOString(),
|
|
200
|
+
topic
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
catch (error) {
|
|
205
|
+
logger.warn('Failed to parse lightning strike message', {
|
|
206
|
+
error: error.message,
|
|
207
|
+
topic
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Subscribe to geohash topics for a location
|
|
213
|
+
*/
|
|
214
|
+
async subscribeToLocation(latitude, longitude, radiusKm) {
|
|
215
|
+
await this.ensureConnected();
|
|
216
|
+
if (!this.client) {
|
|
217
|
+
throw new Error('MQTT client not connected');
|
|
218
|
+
}
|
|
219
|
+
// Calculate required geohashes
|
|
220
|
+
const geohashes = calculateGeohashSubscriptions(latitude, longitude, radiusKm);
|
|
221
|
+
// Redact coordinates for logging to protect user privacy
|
|
222
|
+
const redacted = redactCoordinatesForLogging(latitude, longitude);
|
|
223
|
+
logger.info('Subscribing to geohash topics', {
|
|
224
|
+
latitude: redacted.lat,
|
|
225
|
+
longitude: redacted.lon,
|
|
226
|
+
radiusKm,
|
|
227
|
+
geohashCount: geohashes.size,
|
|
228
|
+
geohashes: Array.from(geohashes)
|
|
229
|
+
});
|
|
230
|
+
const now = Date.now();
|
|
231
|
+
// Check if we need to evict old subscriptions before adding new ones
|
|
232
|
+
const potentialNewSubs = Array.from(geohashes).filter(g => !this.subscribedGeohashes.has(g));
|
|
233
|
+
if (this.subscribedGeohashes.size + potentialNewSubs.length > this.maxSubscriptions) {
|
|
234
|
+
await this.evictOldestSubscriptions(potentialNewSubs.length);
|
|
235
|
+
}
|
|
236
|
+
// Subscribe to each geohash and track access time
|
|
237
|
+
const subscriptions = [];
|
|
238
|
+
for (const geohash of geohashes) {
|
|
239
|
+
if (!this.subscribedGeohashes.has(geohash)) {
|
|
240
|
+
// IMPORTANT: Geohash characters must be separated by slashes in the topic
|
|
241
|
+
// Example: "dhv" becomes "blitzortung/1.1/d/h/v/#"
|
|
242
|
+
const geohashPath = geohash.split('').join('/');
|
|
243
|
+
const topic = `${this.topicPrefix}/${geohashPath}/#`;
|
|
244
|
+
subscriptions.push(topic);
|
|
245
|
+
}
|
|
246
|
+
// Update access time for all geohashes in this request (LRU tracking)
|
|
247
|
+
this.subscribedGeohashes.set(geohash, now);
|
|
248
|
+
}
|
|
249
|
+
if (subscriptions.length > 0) {
|
|
250
|
+
await new Promise((resolve, reject) => {
|
|
251
|
+
this.client.subscribe(subscriptions, (error) => {
|
|
252
|
+
if (error) {
|
|
253
|
+
logger.error('Failed to subscribe to topics', error, {
|
|
254
|
+
topics: subscriptions
|
|
255
|
+
});
|
|
256
|
+
reject(error);
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
logger.info('Subscribed to geohash topics', {
|
|
260
|
+
count: subscriptions.length,
|
|
261
|
+
totalSubscriptions: this.subscribedGeohashes.size
|
|
262
|
+
});
|
|
263
|
+
resolve();
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
logger.debug('All required geohashes already subscribed', {
|
|
270
|
+
totalSubscriptions: this.subscribedGeohashes.size
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Evict oldest subscriptions to make room for new ones (LRU eviction)
|
|
276
|
+
*/
|
|
277
|
+
async evictOldestSubscriptions(slotsNeeded) {
|
|
278
|
+
if (!this.client || slotsNeeded <= 0) {
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
// Sort by access time (oldest first)
|
|
282
|
+
const sorted = Array.from(this.subscribedGeohashes.entries())
|
|
283
|
+
.sort((a, b) => a[1] - b[1]);
|
|
284
|
+
// Evict oldest entries
|
|
285
|
+
const toEvict = sorted.slice(0, slotsNeeded);
|
|
286
|
+
const topics = toEvict.map(([geohash]) => {
|
|
287
|
+
const geohashPath = geohash.split('').join('/');
|
|
288
|
+
return `${this.topicPrefix}/${geohashPath}/#`;
|
|
289
|
+
});
|
|
290
|
+
logger.info('Evicting old geohash subscriptions (LRU)', {
|
|
291
|
+
count: toEvict.length,
|
|
292
|
+
slotsNeeded,
|
|
293
|
+
currentSize: this.subscribedGeohashes.size,
|
|
294
|
+
maxSubscriptions: this.maxSubscriptions,
|
|
295
|
+
securityEvent: true
|
|
296
|
+
});
|
|
297
|
+
// Unsubscribe from topics
|
|
298
|
+
await new Promise((resolve) => {
|
|
299
|
+
this.client.unsubscribe(topics, (error) => {
|
|
300
|
+
if (error) {
|
|
301
|
+
logger.warn('Failed to unsubscribe from topics', {
|
|
302
|
+
error: error.message,
|
|
303
|
+
topics: topics.slice(0, 3) // Log first 3 for debugging
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
resolve(); // Always resolve to avoid blocking
|
|
307
|
+
});
|
|
308
|
+
});
|
|
309
|
+
// Remove from tracking map
|
|
310
|
+
for (const [geohash] of toEvict) {
|
|
311
|
+
this.subscribedGeohashes.delete(geohash);
|
|
312
|
+
}
|
|
313
|
+
logger.debug('Eviction complete', {
|
|
314
|
+
remainingSubscriptions: this.subscribedGeohashes.size
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Periodically prune stale subscriptions (not accessed in last hour)
|
|
319
|
+
*/
|
|
320
|
+
startSubscriptionPruning() {
|
|
321
|
+
// Prune every 15 minutes
|
|
322
|
+
setInterval(async () => {
|
|
323
|
+
if (!this.client || this.subscribedGeohashes.size === 0) {
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
const now = Date.now();
|
|
327
|
+
const staleThreshold = 60 * 60 * 1000; // 1 hour
|
|
328
|
+
const staleGeohashes = [];
|
|
329
|
+
for (const [geohash, lastAccess] of this.subscribedGeohashes.entries()) {
|
|
330
|
+
if (now - lastAccess > staleThreshold) {
|
|
331
|
+
staleGeohashes.push(geohash);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
if (staleGeohashes.length > 0) {
|
|
335
|
+
logger.info('Pruning stale geohash subscriptions', {
|
|
336
|
+
count: staleGeohashes.length,
|
|
337
|
+
totalBefore: this.subscribedGeohashes.size
|
|
338
|
+
});
|
|
339
|
+
const topics = staleGeohashes.map(geohash => {
|
|
340
|
+
const geohashPath = geohash.split('').join('/');
|
|
341
|
+
return `${this.topicPrefix}/${geohashPath}/#`;
|
|
342
|
+
});
|
|
343
|
+
// Unsubscribe from stale topics
|
|
344
|
+
await new Promise((resolve) => {
|
|
345
|
+
this.client.unsubscribe(topics, (error) => {
|
|
346
|
+
if (error) {
|
|
347
|
+
logger.warn('Failed to unsubscribe from stale topics', {
|
|
348
|
+
error: error.message
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
resolve();
|
|
352
|
+
});
|
|
353
|
+
});
|
|
354
|
+
// Remove from tracking
|
|
355
|
+
for (const geohash of staleGeohashes) {
|
|
356
|
+
this.subscribedGeohashes.delete(geohash);
|
|
357
|
+
}
|
|
358
|
+
logger.debug('Pruning complete', {
|
|
359
|
+
remainingSubscriptions: this.subscribedGeohashes.size
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
}, 15 * 60 * 1000); // Every 15 minutes
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Get recent lightning strikes from buffer
|
|
366
|
+
*/
|
|
367
|
+
async getLightningStrikes(latitude, longitude, radiusKm = 100, timeWindowMinutes = 60) {
|
|
368
|
+
try {
|
|
369
|
+
// Redact coordinates for logging to protect user privacy
|
|
370
|
+
const redacted = redactCoordinatesForLogging(latitude, longitude);
|
|
371
|
+
logger.info('Fetching lightning data from Blitzortung MQTT', {
|
|
372
|
+
latitude: redacted.lat,
|
|
373
|
+
longitude: redacted.lon,
|
|
374
|
+
radiusKm,
|
|
375
|
+
timeWindowMinutes
|
|
376
|
+
});
|
|
377
|
+
// Subscribe to the location
|
|
378
|
+
await this.subscribeToLocation(latitude, longitude, radiusKm);
|
|
379
|
+
// Wait for strikes to accumulate in buffer after subscription
|
|
380
|
+
// This allows time for MQTT messages to arrive and be processed
|
|
381
|
+
// 10 seconds provides good coverage for active lightning areas
|
|
382
|
+
await new Promise(resolve => setTimeout(resolve, 10000));
|
|
383
|
+
// Filter strikes from buffer
|
|
384
|
+
const strikes = this.filterStrikes(latitude, longitude, radiusKm, timeWindowMinutes);
|
|
385
|
+
logger.info('Lightning data retrieved successfully', {
|
|
386
|
+
totalStrikes: strikes.length,
|
|
387
|
+
bufferSize: this.strikeBuffer.size
|
|
388
|
+
});
|
|
389
|
+
return strikes;
|
|
390
|
+
}
|
|
391
|
+
catch (error) {
|
|
392
|
+
logger.error('Failed to fetch lightning data', error);
|
|
393
|
+
// Return empty array on error to allow graceful degradation
|
|
394
|
+
return [];
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Filter strikes from buffer based on location and time window
|
|
399
|
+
*/
|
|
400
|
+
filterStrikes(centerLat, centerLon, radiusKm, timeWindowMinutes) {
|
|
401
|
+
const now = Date.now();
|
|
402
|
+
const cutoffTime = now - timeWindowMinutes * 60 * 1000;
|
|
403
|
+
const strikes = [];
|
|
404
|
+
for (const strike of this.strikeBuffer.values()) {
|
|
405
|
+
// Check time window
|
|
406
|
+
if (strike.timestamp.getTime() < cutoffTime) {
|
|
407
|
+
continue;
|
|
408
|
+
}
|
|
409
|
+
// Calculate distance
|
|
410
|
+
const distance = calculateDistance(centerLat, centerLon, strike.latitude, strike.longitude);
|
|
411
|
+
// Check if within radius
|
|
412
|
+
if (distance <= radiusKm) {
|
|
413
|
+
strikes.push({
|
|
414
|
+
...strike,
|
|
415
|
+
distance
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
// Sort by distance (nearest first)
|
|
420
|
+
strikes.sort((a, b) => (a.distance || 0) - (b.distance || 0));
|
|
421
|
+
return strikes;
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* Clean up old strikes from buffer
|
|
425
|
+
*/
|
|
426
|
+
cleanupBuffer() {
|
|
427
|
+
const now = Date.now();
|
|
428
|
+
const cutoffTime = now - this.bufferDuration;
|
|
429
|
+
let removedCount = 0;
|
|
430
|
+
for (const [key, strike] of this.strikeBuffer.entries()) {
|
|
431
|
+
if (strike.timestamp.getTime() < cutoffTime) {
|
|
432
|
+
this.strikeBuffer.delete(key);
|
|
433
|
+
removedCount++;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
if (removedCount > 0) {
|
|
437
|
+
logger.debug('Cleaned up old lightning strikes from buffer', {
|
|
438
|
+
removed: removedCount,
|
|
439
|
+
remaining: this.strikeBuffer.size
|
|
440
|
+
});
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
/**
|
|
444
|
+
* Start periodic buffer cleanup
|
|
445
|
+
*/
|
|
446
|
+
startCleanupInterval() {
|
|
447
|
+
// Clean up every 5 minutes
|
|
448
|
+
setInterval(() => {
|
|
449
|
+
this.cleanupBuffer();
|
|
450
|
+
}, 5 * 60 * 1000);
|
|
451
|
+
}
|
|
452
|
+
/**
|
|
453
|
+
* Disconnect from MQTT broker
|
|
454
|
+
* This method is available for graceful shutdown scenarios
|
|
455
|
+
*/
|
|
456
|
+
async disconnect() {
|
|
457
|
+
if (this.client) {
|
|
458
|
+
logger.info('Disconnecting from Blitzortung MQTT broker', {
|
|
459
|
+
activeSubscriptions: this.subscribedGeohashes.size
|
|
460
|
+
});
|
|
461
|
+
await new Promise((resolve) => {
|
|
462
|
+
this.client.end(false, {}, () => {
|
|
463
|
+
this.isConnected = false;
|
|
464
|
+
this.subscribedGeohashes.clear();
|
|
465
|
+
logger.info('Disconnected from Blitzortung MQTT broker');
|
|
466
|
+
resolve();
|
|
467
|
+
});
|
|
468
|
+
});
|
|
469
|
+
this.client = null;
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
// Singleton instance
|
|
474
|
+
export const blitzortungService = new BlitzortungService();
|
|
475
|
+
//# sourceMappingURL=blitzortung.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blitzortung.js","sourceRoot":"","sources":["../../src/services/blitzortung.ts"],"names":[],"mappings":"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"}
|