local-risk-alert-feed 0.1.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.
Files changed (283) hide show
  1. package/dist/cjs/adapters/index.js +8 -0
  2. package/dist/cjs/adapters/index.js.map +1 -0
  3. package/dist/cjs/adapters/lambda.js +143 -0
  4. package/dist/cjs/adapters/lambda.js.map +1 -0
  5. package/dist/cjs/adapters/vercel.js +119 -0
  6. package/dist/cjs/adapters/vercel.js.map +1 -0
  7. package/dist/cjs/core/alert-aggregator.js +207 -0
  8. package/dist/cjs/core/alert-aggregator.js.map +1 -0
  9. package/dist/cjs/core/alert-feed.js +236 -0
  10. package/dist/cjs/core/alert-feed.js.map +1 -0
  11. package/dist/cjs/core/index.js +22 -0
  12. package/dist/cjs/core/index.js.map +1 -0
  13. package/dist/cjs/core/plugin-registry.js +193 -0
  14. package/dist/cjs/core/plugin-registry.js.map +1 -0
  15. package/dist/cjs/core/plugin-resolver.js +121 -0
  16. package/dist/cjs/core/plugin-resolver.js.map +1 -0
  17. package/dist/cjs/core/time-range.js +67 -0
  18. package/dist/cjs/core/time-range.js.map +1 -0
  19. package/dist/cjs/errors/fetch-error.js +71 -0
  20. package/dist/cjs/errors/fetch-error.js.map +1 -0
  21. package/dist/cjs/errors/index.js +15 -0
  22. package/dist/cjs/errors/index.js.map +1 -0
  23. package/dist/cjs/errors/plugin-error.js +80 -0
  24. package/dist/cjs/errors/plugin-error.js.map +1 -0
  25. package/dist/cjs/errors/validation-error.js +49 -0
  26. package/dist/cjs/errors/validation-error.js.map +1 -0
  27. package/dist/cjs/geo/distance.js +94 -0
  28. package/dist/cjs/geo/distance.js.map +1 -0
  29. package/dist/cjs/geo/index.js +18 -0
  30. package/dist/cjs/geo/index.js.map +1 -0
  31. package/dist/cjs/geo/point-in-radius.js +86 -0
  32. package/dist/cjs/geo/point-in-radius.js.map +1 -0
  33. package/dist/cjs/index.js +90 -0
  34. package/dist/cjs/index.js.map +1 -0
  35. package/dist/cjs/plugins/air-quality/airnow.plugin.js +343 -0
  36. package/dist/cjs/plugins/air-quality/airnow.plugin.js.map +1 -0
  37. package/dist/cjs/plugins/air-quality/index.js +6 -0
  38. package/dist/cjs/plugins/air-quality/index.js.map +1 -0
  39. package/dist/cjs/plugins/base-plugin.js +213 -0
  40. package/dist/cjs/plugins/base-plugin.js.map +1 -0
  41. package/dist/cjs/plugins/events/index.js +6 -0
  42. package/dist/cjs/plugins/events/index.js.map +1 -0
  43. package/dist/cjs/plugins/events/phoenix-events.plugin.js +382 -0
  44. package/dist/cjs/plugins/events/phoenix-events.plugin.js.map +1 -0
  45. package/dist/cjs/plugins/fire-emt/index.js +6 -0
  46. package/dist/cjs/plugins/fire-emt/index.js.map +1 -0
  47. package/dist/cjs/plugins/fire-emt/phoenix-fire.plugin.js +262 -0
  48. package/dist/cjs/plugins/fire-emt/phoenix-fire.plugin.js.map +1 -0
  49. package/dist/cjs/plugins/index.js +28 -0
  50. package/dist/cjs/plugins/index.js.map +1 -0
  51. package/dist/cjs/plugins/police-blotter/index.js +6 -0
  52. package/dist/cjs/plugins/police-blotter/index.js.map +1 -0
  53. package/dist/cjs/plugins/police-blotter/phoenix-police.plugin.js +198 -0
  54. package/dist/cjs/plugins/police-blotter/phoenix-police.plugin.js.map +1 -0
  55. package/dist/cjs/plugins/pulsepoint/index.js +6 -0
  56. package/dist/cjs/plugins/pulsepoint/index.js.map +1 -0
  57. package/dist/cjs/plugins/pulsepoint/pulsepoint.plugin.js +275 -0
  58. package/dist/cjs/plugins/pulsepoint/pulsepoint.plugin.js.map +1 -0
  59. package/dist/cjs/plugins/traffic/arizona-traffic.plugin.js +391 -0
  60. package/dist/cjs/plugins/traffic/arizona-traffic.plugin.js.map +1 -0
  61. package/dist/cjs/plugins/traffic/index.js +6 -0
  62. package/dist/cjs/plugins/traffic/index.js.map +1 -0
  63. package/dist/cjs/plugins/weather/index.js +6 -0
  64. package/dist/cjs/plugins/weather/index.js.map +1 -0
  65. package/dist/cjs/plugins/weather/nws-weather.plugin.js +180 -0
  66. package/dist/cjs/plugins/weather/nws-weather.plugin.js.map +1 -0
  67. package/dist/cjs/schemas/alert.schema.js +93 -0
  68. package/dist/cjs/schemas/alert.schema.js.map +1 -0
  69. package/dist/cjs/schemas/index.js +24 -0
  70. package/dist/cjs/schemas/index.js.map +1 -0
  71. package/dist/cjs/schemas/query.schema.js +76 -0
  72. package/dist/cjs/schemas/query.schema.js.map +1 -0
  73. package/dist/cjs/types/alert.js +35 -0
  74. package/dist/cjs/types/alert.js.map +1 -0
  75. package/dist/cjs/types/config.js +13 -0
  76. package/dist/cjs/types/config.js.map +1 -0
  77. package/dist/cjs/types/geo.js +3 -0
  78. package/dist/cjs/types/geo.js.map +1 -0
  79. package/dist/cjs/types/index.js +16 -0
  80. package/dist/cjs/types/index.js.map +1 -0
  81. package/dist/cjs/types/plugin.js +3 -0
  82. package/dist/cjs/types/plugin.js.map +1 -0
  83. package/dist/cjs/types/query.js +28 -0
  84. package/dist/cjs/types/query.js.map +1 -0
  85. package/dist/cjs/utils/cache.js +188 -0
  86. package/dist/cjs/utils/cache.js.map +1 -0
  87. package/dist/cjs/utils/csv.js +189 -0
  88. package/dist/cjs/utils/csv.js.map +1 -0
  89. package/dist/cjs/utils/date.js +153 -0
  90. package/dist/cjs/utils/date.js.map +1 -0
  91. package/dist/cjs/utils/index.js +28 -0
  92. package/dist/cjs/utils/index.js.map +1 -0
  93. package/dist/cjs/utils/retry.js +109 -0
  94. package/dist/cjs/utils/retry.js.map +1 -0
  95. package/dist/esm/adapters/index.js +3 -0
  96. package/dist/esm/adapters/index.js.map +1 -0
  97. package/dist/esm/adapters/lambda.js +140 -0
  98. package/dist/esm/adapters/lambda.js.map +1 -0
  99. package/dist/esm/adapters/vercel.js +116 -0
  100. package/dist/esm/adapters/vercel.js.map +1 -0
  101. package/dist/esm/core/alert-aggregator.js +203 -0
  102. package/dist/esm/core/alert-aggregator.js.map +1 -0
  103. package/dist/esm/core/alert-feed.js +232 -0
  104. package/dist/esm/core/alert-feed.js.map +1 -0
  105. package/dist/esm/core/index.js +6 -0
  106. package/dist/esm/core/index.js.map +1 -0
  107. package/dist/esm/core/plugin-registry.js +189 -0
  108. package/dist/esm/core/plugin-registry.js.map +1 -0
  109. package/dist/esm/core/plugin-resolver.js +117 -0
  110. package/dist/esm/core/plugin-resolver.js.map +1 -0
  111. package/dist/esm/core/time-range.js +57 -0
  112. package/dist/esm/core/time-range.js.map +1 -0
  113. package/dist/esm/errors/fetch-error.js +67 -0
  114. package/dist/esm/errors/fetch-error.js.map +1 -0
  115. package/dist/esm/errors/index.js +4 -0
  116. package/dist/esm/errors/index.js.map +1 -0
  117. package/dist/esm/errors/plugin-error.js +71 -0
  118. package/dist/esm/errors/plugin-error.js.map +1 -0
  119. package/dist/esm/errors/validation-error.js +45 -0
  120. package/dist/esm/errors/validation-error.js.map +1 -0
  121. package/dist/esm/geo/distance.js +85 -0
  122. package/dist/esm/geo/distance.js.map +1 -0
  123. package/dist/esm/geo/index.js +3 -0
  124. package/dist/esm/geo/index.js.map +1 -0
  125. package/dist/esm/geo/point-in-radius.js +79 -0
  126. package/dist/esm/geo/point-in-radius.js.map +1 -0
  127. package/dist/esm/index.js +30 -0
  128. package/dist/esm/index.js.map +1 -0
  129. package/dist/esm/plugins/air-quality/airnow.plugin.js +339 -0
  130. package/dist/esm/plugins/air-quality/airnow.plugin.js.map +1 -0
  131. package/dist/esm/plugins/air-quality/index.js +2 -0
  132. package/dist/esm/plugins/air-quality/index.js.map +1 -0
  133. package/dist/esm/plugins/base-plugin.js +209 -0
  134. package/dist/esm/plugins/base-plugin.js.map +1 -0
  135. package/dist/esm/plugins/events/index.js +2 -0
  136. package/dist/esm/plugins/events/index.js.map +1 -0
  137. package/dist/esm/plugins/events/phoenix-events.plugin.js +378 -0
  138. package/dist/esm/plugins/events/phoenix-events.plugin.js.map +1 -0
  139. package/dist/esm/plugins/fire-emt/index.js +2 -0
  140. package/dist/esm/plugins/fire-emt/index.js.map +1 -0
  141. package/dist/esm/plugins/fire-emt/phoenix-fire.plugin.js +258 -0
  142. package/dist/esm/plugins/fire-emt/phoenix-fire.plugin.js.map +1 -0
  143. package/dist/esm/plugins/index.js +17 -0
  144. package/dist/esm/plugins/index.js.map +1 -0
  145. package/dist/esm/plugins/police-blotter/index.js +2 -0
  146. package/dist/esm/plugins/police-blotter/index.js.map +1 -0
  147. package/dist/esm/plugins/police-blotter/phoenix-police.plugin.js +194 -0
  148. package/dist/esm/plugins/police-blotter/phoenix-police.plugin.js.map +1 -0
  149. package/dist/esm/plugins/pulsepoint/index.js +2 -0
  150. package/dist/esm/plugins/pulsepoint/index.js.map +1 -0
  151. package/dist/esm/plugins/pulsepoint/pulsepoint.plugin.js +271 -0
  152. package/dist/esm/plugins/pulsepoint/pulsepoint.plugin.js.map +1 -0
  153. package/dist/esm/plugins/traffic/arizona-traffic.plugin.js +387 -0
  154. package/dist/esm/plugins/traffic/arizona-traffic.plugin.js.map +1 -0
  155. package/dist/esm/plugins/traffic/index.js +2 -0
  156. package/dist/esm/plugins/traffic/index.js.map +1 -0
  157. package/dist/esm/plugins/weather/index.js +2 -0
  158. package/dist/esm/plugins/weather/index.js.map +1 -0
  159. package/dist/esm/plugins/weather/nws-weather.plugin.js +176 -0
  160. package/dist/esm/plugins/weather/nws-weather.plugin.js.map +1 -0
  161. package/dist/esm/schemas/alert.schema.js +90 -0
  162. package/dist/esm/schemas/alert.schema.js.map +1 -0
  163. package/dist/esm/schemas/index.js +5 -0
  164. package/dist/esm/schemas/index.js.map +1 -0
  165. package/dist/esm/schemas/query.schema.js +72 -0
  166. package/dist/esm/schemas/query.schema.js.map +1 -0
  167. package/dist/esm/types/alert.js +32 -0
  168. package/dist/esm/types/alert.js.map +1 -0
  169. package/dist/esm/types/config.js +10 -0
  170. package/dist/esm/types/config.js.map +1 -0
  171. package/dist/esm/types/geo.js +2 -0
  172. package/dist/esm/types/geo.js.map +1 -0
  173. package/dist/esm/types/index.js +4 -0
  174. package/dist/esm/types/index.js.map +1 -0
  175. package/dist/esm/types/plugin.js +2 -0
  176. package/dist/esm/types/plugin.js.map +1 -0
  177. package/dist/esm/types/query.js +25 -0
  178. package/dist/esm/types/query.js.map +1 -0
  179. package/dist/esm/utils/cache.js +181 -0
  180. package/dist/esm/utils/cache.js.map +1 -0
  181. package/dist/esm/utils/csv.js +185 -0
  182. package/dist/esm/utils/csv.js.map +1 -0
  183. package/dist/esm/utils/date.js +142 -0
  184. package/dist/esm/utils/date.js.map +1 -0
  185. package/dist/esm/utils/index.js +5 -0
  186. package/dist/esm/utils/index.js.map +1 -0
  187. package/dist/esm/utils/retry.js +102 -0
  188. package/dist/esm/utils/retry.js.map +1 -0
  189. package/dist/types/adapters/index.d.ts +5 -0
  190. package/dist/types/adapters/index.d.ts.map +1 -0
  191. package/dist/types/adapters/lambda.d.ts +37 -0
  192. package/dist/types/adapters/lambda.d.ts.map +1 -0
  193. package/dist/types/adapters/vercel.d.ts +54 -0
  194. package/dist/types/adapters/vercel.d.ts.map +1 -0
  195. package/dist/types/core/alert-aggregator.d.ts +81 -0
  196. package/dist/types/core/alert-aggregator.d.ts.map +1 -0
  197. package/dist/types/core/alert-feed.d.ts +80 -0
  198. package/dist/types/core/alert-feed.d.ts.map +1 -0
  199. package/dist/types/core/index.d.ts +8 -0
  200. package/dist/types/core/index.d.ts.map +1 -0
  201. package/dist/types/core/plugin-registry.d.ts +91 -0
  202. package/dist/types/core/plugin-registry.d.ts.map +1 -0
  203. package/dist/types/core/plugin-resolver.d.ts +78 -0
  204. package/dist/types/core/plugin-resolver.d.ts.map +1 -0
  205. package/dist/types/core/time-range.d.ts +40 -0
  206. package/dist/types/core/time-range.d.ts.map +1 -0
  207. package/dist/types/errors/fetch-error.d.ts +46 -0
  208. package/dist/types/errors/fetch-error.d.ts.map +1 -0
  209. package/dist/types/errors/index.d.ts +5 -0
  210. package/dist/types/errors/index.d.ts.map +1 -0
  211. package/dist/types/errors/plugin-error.d.ts +42 -0
  212. package/dist/types/errors/plugin-error.d.ts.map +1 -0
  213. package/dist/types/errors/validation-error.d.ts +34 -0
  214. package/dist/types/errors/validation-error.d.ts.map +1 -0
  215. package/dist/types/geo/distance.d.ts +50 -0
  216. package/dist/types/geo/distance.d.ts.map +1 -0
  217. package/dist/types/geo/index.d.ts +3 -0
  218. package/dist/types/geo/index.d.ts.map +1 -0
  219. package/dist/types/geo/point-in-radius.d.ts +44 -0
  220. package/dist/types/geo/point-in-radius.d.ts.map +1 -0
  221. package/dist/types/index.d.ts +32 -0
  222. package/dist/types/index.d.ts.map +1 -0
  223. package/dist/types/plugins/air-quality/airnow.plugin.d.ts +84 -0
  224. package/dist/types/plugins/air-quality/airnow.plugin.d.ts.map +1 -0
  225. package/dist/types/plugins/air-quality/index.d.ts +3 -0
  226. package/dist/types/plugins/air-quality/index.d.ts.map +1 -0
  227. package/dist/types/plugins/base-plugin.d.ts +99 -0
  228. package/dist/types/plugins/base-plugin.d.ts.map +1 -0
  229. package/dist/types/plugins/events/index.d.ts +3 -0
  230. package/dist/types/plugins/events/index.d.ts.map +1 -0
  231. package/dist/types/plugins/events/phoenix-events.plugin.d.ts +71 -0
  232. package/dist/types/plugins/events/phoenix-events.plugin.d.ts.map +1 -0
  233. package/dist/types/plugins/fire-emt/index.d.ts +3 -0
  234. package/dist/types/plugins/fire-emt/index.d.ts.map +1 -0
  235. package/dist/types/plugins/fire-emt/phoenix-fire.plugin.d.ts +47 -0
  236. package/dist/types/plugins/fire-emt/phoenix-fire.plugin.d.ts.map +1 -0
  237. package/dist/types/plugins/index.d.ts +17 -0
  238. package/dist/types/plugins/index.d.ts.map +1 -0
  239. package/dist/types/plugins/police-blotter/index.d.ts +3 -0
  240. package/dist/types/plugins/police-blotter/index.d.ts.map +1 -0
  241. package/dist/types/plugins/police-blotter/phoenix-police.plugin.d.ts +49 -0
  242. package/dist/types/plugins/police-blotter/phoenix-police.plugin.d.ts.map +1 -0
  243. package/dist/types/plugins/pulsepoint/index.d.ts +3 -0
  244. package/dist/types/plugins/pulsepoint/index.d.ts.map +1 -0
  245. package/dist/types/plugins/pulsepoint/pulsepoint.plugin.d.ts +61 -0
  246. package/dist/types/plugins/pulsepoint/pulsepoint.plugin.d.ts.map +1 -0
  247. package/dist/types/plugins/traffic/arizona-traffic.plugin.d.ts +83 -0
  248. package/dist/types/plugins/traffic/arizona-traffic.plugin.d.ts.map +1 -0
  249. package/dist/types/plugins/traffic/index.d.ts +3 -0
  250. package/dist/types/plugins/traffic/index.d.ts.map +1 -0
  251. package/dist/types/plugins/weather/index.d.ts +3 -0
  252. package/dist/types/plugins/weather/index.d.ts.map +1 -0
  253. package/dist/types/plugins/weather/nws-weather.plugin.d.ts +50 -0
  254. package/dist/types/plugins/weather/nws-weather.plugin.d.ts.map +1 -0
  255. package/dist/types/schemas/alert.schema.d.ts +266 -0
  256. package/dist/types/schemas/alert.schema.d.ts.map +1 -0
  257. package/dist/types/schemas/index.d.ts +5 -0
  258. package/dist/types/schemas/index.d.ts.map +1 -0
  259. package/dist/types/schemas/query.schema.d.ts +150 -0
  260. package/dist/types/schemas/query.schema.d.ts.map +1 -0
  261. package/dist/types/types/alert.d.ts +96 -0
  262. package/dist/types/types/alert.d.ts.map +1 -0
  263. package/dist/types/types/config.d.ts +63 -0
  264. package/dist/types/types/config.d.ts.map +1 -0
  265. package/dist/types/types/geo.d.ts +33 -0
  266. package/dist/types/types/geo.d.ts.map +1 -0
  267. package/dist/types/types/index.d.ts +9 -0
  268. package/dist/types/types/index.d.ts.map +1 -0
  269. package/dist/types/types/plugin.d.ts +125 -0
  270. package/dist/types/types/plugin.d.ts.map +1 -0
  271. package/dist/types/types/query.d.ts +86 -0
  272. package/dist/types/types/query.d.ts.map +1 -0
  273. package/dist/types/utils/cache.d.ts +112 -0
  274. package/dist/types/utils/cache.d.ts.map +1 -0
  275. package/dist/types/utils/csv.d.ts +38 -0
  276. package/dist/types/utils/csv.d.ts.map +1 -0
  277. package/dist/types/utils/date.d.ts +47 -0
  278. package/dist/types/utils/date.d.ts.map +1 -0
  279. package/dist/types/utils/index.d.ts +7 -0
  280. package/dist/types/utils/index.d.ts.map +1 -0
  281. package/dist/types/utils/retry.d.ts +51 -0
  282. package/dist/types/utils/retry.d.ts.map +1 -0
  283. package/package.json +115 -0
@@ -0,0 +1,343 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AirNowPlugin = void 0;
4
+ const base_plugin_1 = require("../base-plugin");
5
+ /**
6
+ * AQI Category to risk level mapping.
7
+ * Based on EPA AQI scale:
8
+ * 1: Good (0-50)
9
+ * 2: Moderate (51-100)
10
+ * 3: Unhealthy for Sensitive Groups (101-150)
11
+ * 4: Unhealthy (151-200)
12
+ * 5: Very Unhealthy (201-300)
13
+ * 6: Hazardous (301+)
14
+ */
15
+ const AQI_CATEGORY_RISK_MAP = {
16
+ 1: 'low', // Good
17
+ 2: 'low', // Moderate
18
+ 3: 'moderate', // Unhealthy for Sensitive Groups
19
+ 4: 'high', // Unhealthy
20
+ 5: 'severe', // Very Unhealthy
21
+ 6: 'extreme', // Hazardous
22
+ };
23
+ /**
24
+ * AQI Category descriptions.
25
+ */
26
+ const AQI_CATEGORY_DESCRIPTIONS = {
27
+ 1: 'Good - Air quality is satisfactory and poses little or no risk.',
28
+ 2: 'Moderate - Air quality is acceptable; some pollutants may affect unusually sensitive people.',
29
+ 3: 'Unhealthy for Sensitive Groups - Members of sensitive groups may experience health effects.',
30
+ 4: 'Unhealthy - Everyone may begin to experience health effects.',
31
+ 5: 'Very Unhealthy - Health alert: everyone may experience more serious health effects.',
32
+ 6: 'Hazardous - Health warnings of emergency conditions.',
33
+ };
34
+ /**
35
+ * Plugin that fetches air quality data from AirNow API.
36
+ *
37
+ * Provides current AQI observations and forecasts for US locations.
38
+ * Important for Phoenix due to dust storms and air quality concerns.
39
+ *
40
+ * @see https://docs.airnowapi.org
41
+ */
42
+ class AirNowPlugin extends base_plugin_1.BasePlugin {
43
+ metadata = {
44
+ id: 'airnow',
45
+ name: 'AirNow Air Quality',
46
+ version: '1.0.0',
47
+ description: 'Air quality index (AQI) data from EPA AirNow',
48
+ coverage: {
49
+ type: 'global',
50
+ description: 'United States',
51
+ },
52
+ supportedTemporalTypes: ['real-time', 'scheduled'],
53
+ supportedCategories: ['weather'], // Air quality is weather-related
54
+ refreshIntervalMs: 60 * 60 * 1000, // 1 hour - AQI updates hourly
55
+ };
56
+ airNowConfig;
57
+ constructor(config) {
58
+ super(config);
59
+ if (!config.apiKey) {
60
+ throw new Error('AirNow API key is required');
61
+ }
62
+ this.airNowConfig = {
63
+ includeForecast: true,
64
+ distanceMiles: 25,
65
+ ...config,
66
+ };
67
+ }
68
+ async fetchAlerts(options) {
69
+ const { location } = options;
70
+ const cacheKey = this.generateCacheKey(options);
71
+ const warnings = [];
72
+ try {
73
+ const { data, fromCache } = await this.getCachedOrFetch(cacheKey, () => this.fetchAirQualityData(location, warnings), this.config.cacheTtlMs);
74
+ return {
75
+ alerts: data,
76
+ fromCache,
77
+ cacheKey,
78
+ warnings: warnings.length > 0 ? warnings : undefined,
79
+ };
80
+ }
81
+ catch (error) {
82
+ console.error('AirNow fetch error:', error);
83
+ throw error;
84
+ }
85
+ }
86
+ /**
87
+ * Fetch air quality data from AirNow API.
88
+ */
89
+ async fetchAirQualityData(location, warnings) {
90
+ const allAlerts = [];
91
+ // Fetch current observations
92
+ try {
93
+ const observations = await this.fetchCurrentObservations(location);
94
+ const observationAlerts = observations.map((obs) => this.transformObservation(obs));
95
+ allAlerts.push(...observationAlerts);
96
+ }
97
+ catch (error) {
98
+ warnings.push(`Failed to fetch current observations: ${error instanceof Error ? error.message : 'Unknown error'}`);
99
+ }
100
+ // Fetch forecasts if enabled
101
+ if (this.airNowConfig.includeForecast) {
102
+ try {
103
+ const forecasts = await this.fetchForecasts(location);
104
+ const forecastAlerts = forecasts.map((forecast) => this.transformForecast(forecast));
105
+ allAlerts.push(...forecastAlerts);
106
+ }
107
+ catch (error) {
108
+ warnings.push(`Failed to fetch forecasts: ${error instanceof Error ? error.message : 'Unknown error'}`);
109
+ }
110
+ }
111
+ // Deduplicate and prioritize by AQI
112
+ return this.deduplicateAlerts(allAlerts);
113
+ }
114
+ /**
115
+ * Fetch current air quality observations.
116
+ */
117
+ async fetchCurrentObservations(location) {
118
+ const url = new URL('https://www.airnowapi.org/aq/observation/latLong/current/');
119
+ url.searchParams.set('format', 'application/json');
120
+ url.searchParams.set('latitude', String(location.latitude));
121
+ url.searchParams.set('longitude', String(location.longitude));
122
+ url.searchParams.set('distance', String(this.airNowConfig.distanceMiles));
123
+ url.searchParams.set('API_KEY', this.airNowConfig.apiKey);
124
+ return this.fetchJson(url.toString());
125
+ }
126
+ /**
127
+ * Fetch air quality forecasts.
128
+ */
129
+ async fetchForecasts(location) {
130
+ const url = new URL('https://www.airnowapi.org/aq/forecast/latLong/');
131
+ url.searchParams.set('format', 'application/json');
132
+ url.searchParams.set('latitude', String(location.latitude));
133
+ url.searchParams.set('longitude', String(location.longitude));
134
+ url.searchParams.set('distance', String(this.airNowConfig.distanceMiles));
135
+ url.searchParams.set('API_KEY', this.airNowConfig.apiKey);
136
+ // Get next 3 days of forecasts
137
+ const today = new Date();
138
+ const endDate = new Date(today);
139
+ endDate.setDate(endDate.getDate() + 3);
140
+ url.searchParams.set('date', this.formatDate(today));
141
+ return this.fetchJson(url.toString());
142
+ }
143
+ /**
144
+ * Transform an observation to an alert.
145
+ */
146
+ transformObservation(obs) {
147
+ const riskLevel = this.mapAqiToRiskLevel(obs.AQI, obs.Category.Number);
148
+ // Only create alerts for notable air quality (category 3+)
149
+ // Or always create if the AQI is significant
150
+ const issued = `${obs.DateObserved}T${String(obs.HourObserved).padStart(2, '0')}:00:00`;
151
+ return this.createAlert({
152
+ id: `airnow-obs-${obs.ReportingArea}-${obs.ParameterName}-${obs.DateObserved}`,
153
+ externalId: `${obs.ReportingArea}-${obs.ParameterName}`,
154
+ title: this.buildObservationTitle(obs),
155
+ description: this.buildObservationDescription(obs),
156
+ riskLevel,
157
+ priority: this.riskLevelToPriority(riskLevel),
158
+ category: 'weather',
159
+ temporalType: 'real-time',
160
+ location: {
161
+ point: { latitude: obs.Latitude, longitude: obs.Longitude },
162
+ address: `${obs.ReportingArea}, ${obs.StateCode}`,
163
+ },
164
+ timestamps: {
165
+ issued,
166
+ eventStart: issued,
167
+ },
168
+ metadata: {
169
+ parameterName: obs.ParameterName,
170
+ aqi: obs.AQI,
171
+ categoryNumber: obs.Category.Number,
172
+ categoryName: obs.Category.Name,
173
+ reportingArea: obs.ReportingArea,
174
+ isObservation: true,
175
+ },
176
+ });
177
+ }
178
+ /**
179
+ * Transform a forecast to an alert.
180
+ */
181
+ transformForecast(forecast) {
182
+ const riskLevel = this.mapAqiToRiskLevel(forecast.AQI, forecast.Category.Number);
183
+ return this.createAlert({
184
+ id: `airnow-fcst-${forecast.ReportingArea}-${forecast.ParameterName}-${forecast.DateForecast}`,
185
+ externalId: `${forecast.ReportingArea}-${forecast.ParameterName}-${forecast.DateForecast}`,
186
+ title: this.buildForecastTitle(forecast),
187
+ description: this.buildForecastDescription(forecast),
188
+ riskLevel,
189
+ priority: this.riskLevelToPriority(riskLevel),
190
+ category: 'weather',
191
+ temporalType: 'scheduled',
192
+ location: {
193
+ point: { latitude: forecast.Latitude, longitude: forecast.Longitude },
194
+ address: `${forecast.ReportingArea}, ${forecast.StateCode}`,
195
+ },
196
+ timestamps: {
197
+ issued: forecast.DateIssue,
198
+ eventStart: `${forecast.DateForecast}T00:00:00`,
199
+ eventEnd: `${forecast.DateForecast}T23:59:59`,
200
+ },
201
+ metadata: {
202
+ parameterName: forecast.ParameterName,
203
+ aqi: forecast.AQI,
204
+ categoryNumber: forecast.Category.Number,
205
+ categoryName: forecast.Category.Name,
206
+ reportingArea: forecast.ReportingArea,
207
+ actionDay: forecast.ActionDay,
208
+ discussion: forecast.Discussion,
209
+ isForecast: true,
210
+ },
211
+ });
212
+ }
213
+ /**
214
+ * Map AQI value to risk level.
215
+ */
216
+ mapAqiToRiskLevel(aqi, categoryNumber) {
217
+ // Use category number if available
218
+ if (AQI_CATEGORY_RISK_MAP[categoryNumber]) {
219
+ return AQI_CATEGORY_RISK_MAP[categoryNumber];
220
+ }
221
+ // Fall back to AQI value ranges
222
+ if (aqi <= 50)
223
+ return 'low';
224
+ if (aqi <= 100)
225
+ return 'low';
226
+ if (aqi <= 150)
227
+ return 'moderate';
228
+ if (aqi <= 200)
229
+ return 'high';
230
+ if (aqi <= 300)
231
+ return 'severe';
232
+ return 'extreme';
233
+ }
234
+ /**
235
+ * Build observation title.
236
+ */
237
+ buildObservationTitle(obs) {
238
+ const pollutant = this.formatPollutant(obs.ParameterName);
239
+ return `Air Quality ${obs.Category.Name} - ${pollutant} AQI ${obs.AQI}`;
240
+ }
241
+ /**
242
+ * Build forecast title.
243
+ */
244
+ buildForecastTitle(forecast) {
245
+ const pollutant = this.formatPollutant(forecast.ParameterName);
246
+ const dateStr = this.formatForecastDate(forecast.DateForecast);
247
+ const actionDay = forecast.ActionDay ? ' (Action Day)' : '';
248
+ return `${dateStr} Air Quality Forecast: ${pollutant} AQI ${forecast.AQI}${actionDay}`;
249
+ }
250
+ /**
251
+ * Format pollutant name for display.
252
+ */
253
+ formatPollutant(parameterName) {
254
+ const names = {
255
+ O3: 'Ozone',
256
+ 'PM2.5': 'Fine Particles (PM2.5)',
257
+ PM10: 'Coarse Particles (PM10)',
258
+ };
259
+ return names[parameterName] ?? parameterName;
260
+ }
261
+ /**
262
+ * Format forecast date.
263
+ */
264
+ formatForecastDate(dateStr) {
265
+ const date = new Date(dateStr);
266
+ const today = new Date();
267
+ const tomorrow = new Date(today);
268
+ tomorrow.setDate(tomorrow.getDate() + 1);
269
+ if (date.toDateString() === today.toDateString()) {
270
+ return 'Today';
271
+ }
272
+ if (date.toDateString() === tomorrow.toDateString()) {
273
+ return 'Tomorrow';
274
+ }
275
+ return date.toLocaleDateString('en-US', { weekday: 'long', month: 'short', day: 'numeric' });
276
+ }
277
+ /**
278
+ * Build observation description.
279
+ */
280
+ buildObservationDescription(obs) {
281
+ const parts = [];
282
+ parts.push(`${this.formatPollutant(obs.ParameterName)}: AQI ${obs.AQI}`);
283
+ parts.push(`Category: ${obs.Category.Name}`);
284
+ parts.push('');
285
+ parts.push(AQI_CATEGORY_DESCRIPTIONS[obs.Category.Number] ?? '');
286
+ parts.push('');
287
+ parts.push(`Reporting Area: ${obs.ReportingArea}, ${obs.StateCode}`);
288
+ parts.push(`Observed: ${obs.DateObserved} ${obs.HourObserved}:00 ${obs.LocalTimeZone}`);
289
+ return parts.join('\n');
290
+ }
291
+ /**
292
+ * Build forecast description.
293
+ */
294
+ buildForecastDescription(forecast) {
295
+ const parts = [];
296
+ parts.push(`${this.formatPollutant(forecast.ParameterName)}: AQI ${forecast.AQI}`);
297
+ parts.push(`Category: ${forecast.Category.Name}`);
298
+ if (forecast.ActionDay) {
299
+ parts.push('');
300
+ parts.push('⚠️ ACTION DAY - Consider reducing outdoor activities');
301
+ }
302
+ parts.push('');
303
+ parts.push(AQI_CATEGORY_DESCRIPTIONS[forecast.Category.Number] ?? '');
304
+ if (forecast.Discussion) {
305
+ parts.push('');
306
+ parts.push(`Forecast Discussion: ${forecast.Discussion}`);
307
+ }
308
+ parts.push('');
309
+ parts.push(`Reporting Area: ${forecast.ReportingArea}, ${forecast.StateCode}`);
310
+ parts.push(`Forecast Date: ${forecast.DateForecast}`);
311
+ return parts.join('\n');
312
+ }
313
+ /**
314
+ * Format date as YYYY-MM-DD.
315
+ */
316
+ formatDate(date) {
317
+ return date.toISOString().split('T')[0];
318
+ }
319
+ /**
320
+ * Deduplicate alerts, keeping highest AQI per location/date.
321
+ */
322
+ deduplicateAlerts(alerts) {
323
+ const seen = new Map();
324
+ for (const alert of alerts) {
325
+ const key = `${alert.location.address}-${alert.temporalType}-${alert.timestamps.eventStart?.split('T')[0]}`;
326
+ const existing = seen.get(key);
327
+ if (!existing) {
328
+ seen.set(key, alert);
329
+ }
330
+ else {
331
+ // Keep higher AQI
332
+ const existingAqi = existing.metadata?.aqi ?? 0;
333
+ const currentAqi = alert.metadata?.aqi ?? 0;
334
+ if (currentAqi > existingAqi) {
335
+ seen.set(key, alert);
336
+ }
337
+ }
338
+ }
339
+ return Array.from(seen.values());
340
+ }
341
+ }
342
+ exports.AirNowPlugin = AirNowPlugin;
343
+ //# sourceMappingURL=airnow.plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"airnow.plugin.js","sourceRoot":"","sources":["../../../../src/plugins/air-quality/airnow.plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AirNowPlugin = void 0;
4
+ var airnow_plugin_1 = require("./airnow.plugin");
5
+ Object.defineProperty(exports, "AirNowPlugin", { enumerable: true, get: function () { return airnow_plugin_1.AirNowPlugin; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/air-quality/index.ts"],"names":[],"mappings":";;;AAAA,iDAA+C;AAAtC,6GAAA,YAAY,OAAA"}
@@ -0,0 +1,213 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BasePlugin = void 0;
4
+ const geo_1 = require("../geo");
5
+ const errors_1 = require("../errors");
6
+ const utils_1 = require("../utils");
7
+ /**
8
+ * Abstract base class for alert plugins.
9
+ *
10
+ * Provides common functionality for:
11
+ * - Location coverage checking
12
+ * - HTTP fetching with retry
13
+ * - Caching
14
+ * - Alert creation helpers
15
+ */
16
+ class BasePlugin {
17
+ config;
18
+ cache;
19
+ constructor(config) {
20
+ this.config = {
21
+ cacheTtlMs: 5 * 60 * 1000, // 5 minutes default
22
+ maxRetries: 3,
23
+ userAgent: 'LocalRiskAlertFeed/1.0',
24
+ ...config,
25
+ };
26
+ this.cache = config?.cache;
27
+ }
28
+ /**
29
+ * Initialize the plugin. Override if needed.
30
+ */
31
+ async initialize(config) {
32
+ if (config?.cache) {
33
+ this.cache = config.cache;
34
+ }
35
+ if (config?.cacheTtlMs) {
36
+ this.config.cacheTtlMs = config.cacheTtlMs;
37
+ }
38
+ }
39
+ /**
40
+ * Check if this plugin covers the given location.
41
+ *
42
+ * For global plugins, always returns true.
43
+ * For regional plugins, checks if the point is within the coverage radius.
44
+ */
45
+ coversLocation(point) {
46
+ const { coverage } = this.metadata;
47
+ if (coverage.type === 'global') {
48
+ return true;
49
+ }
50
+ if (coverage.center && coverage.radiusMeters) {
51
+ return (0, geo_1.isPointInRadius)(point, coverage.center, coverage.radiusMeters);
52
+ }
53
+ return false;
54
+ }
55
+ /**
56
+ * Clean up resources. Override if needed.
57
+ */
58
+ async dispose() {
59
+ // Default: no cleanup needed
60
+ }
61
+ /**
62
+ * Fetch JSON data from a URL with retry logic.
63
+ */
64
+ async fetchJson(url, init) {
65
+ return (0, utils_1.withRetry)(async () => {
66
+ const response = await fetch(url, {
67
+ ...init,
68
+ headers: {
69
+ 'User-Agent': this.config.userAgent,
70
+ Accept: 'application/json',
71
+ ...init?.headers,
72
+ },
73
+ });
74
+ if (!response.ok) {
75
+ throw errors_1.FetchError.fromResponse(url, response);
76
+ }
77
+ return response.json();
78
+ }, {
79
+ maxAttempts: this.config.maxRetries,
80
+ isRetryable: (error) => {
81
+ if (error instanceof errors_1.FetchError) {
82
+ return error.isRetryable();
83
+ }
84
+ return true;
85
+ },
86
+ });
87
+ }
88
+ /**
89
+ * Fetch CSV data from a URL with retry logic.
90
+ *
91
+ * @param url - The URL to fetch from
92
+ * @param options - CSV parsing options
93
+ * @param init - Optional fetch init options
94
+ * @returns Parsed CSV data as array of objects
95
+ */
96
+ async fetchCsv(url, options, init) {
97
+ return (0, utils_1.withRetry)(async () => {
98
+ const response = await fetch(url, {
99
+ ...init,
100
+ headers: {
101
+ 'User-Agent': this.config.userAgent,
102
+ Accept: 'text/csv, application/csv, */*',
103
+ ...init?.headers,
104
+ },
105
+ });
106
+ if (!response.ok) {
107
+ throw errors_1.FetchError.fromResponse(url, response);
108
+ }
109
+ const text = await response.text();
110
+ return (0, utils_1.parseCSV)(text, options);
111
+ }, {
112
+ maxAttempts: this.config.maxRetries,
113
+ isRetryable: (error) => {
114
+ if (error instanceof errors_1.FetchError) {
115
+ return error.isRetryable();
116
+ }
117
+ return true;
118
+ },
119
+ });
120
+ }
121
+ /**
122
+ * Get cached data or fetch fresh data.
123
+ */
124
+ async getCachedOrFetch(cacheKey, fetcher, ttlMs) {
125
+ if (this.cache) {
126
+ const cached = await this.cache.get(cacheKey);
127
+ if (cached !== null) {
128
+ return { data: cached, fromCache: true };
129
+ }
130
+ }
131
+ const data = await fetcher();
132
+ if (this.cache) {
133
+ await this.cache.set(cacheKey, data, ttlMs ?? this.config.cacheTtlMs);
134
+ }
135
+ return { data, fromCache: false };
136
+ }
137
+ /**
138
+ * Generate a cache key for this plugin and query options.
139
+ */
140
+ generateCacheKey(options) {
141
+ return (0, utils_1.generateCacheKey)(this.metadata.id, options.location, options.timeRange);
142
+ }
143
+ /**
144
+ * Create an alert with common fields filled in.
145
+ */
146
+ createAlert(data) {
147
+ const { externalId, ...rest } = data;
148
+ return {
149
+ ...rest,
150
+ source: {
151
+ pluginId: this.metadata.id,
152
+ name: this.metadata.name,
153
+ externalId,
154
+ type: this.getSourceType(),
155
+ },
156
+ };
157
+ }
158
+ /**
159
+ * Get the source type based on plugin categories.
160
+ */
161
+ getSourceType() {
162
+ const categories = this.metadata.supportedCategories;
163
+ if (categories.includes('crime'))
164
+ return 'police';
165
+ if (categories.includes('fire') || categories.includes('medical'))
166
+ return 'fire';
167
+ if (categories.includes('weather'))
168
+ return 'weather';
169
+ if (categories.includes('traffic'))
170
+ return 'traffic';
171
+ if (categories.includes('event'))
172
+ return 'events';
173
+ return 'other';
174
+ }
175
+ /**
176
+ * Map a numeric severity to a risk level.
177
+ *
178
+ * @param value - Numeric value (0-100 scale)
179
+ * @returns Corresponding risk level
180
+ */
181
+ mapToRiskLevel(value) {
182
+ if (value >= 80)
183
+ return 'extreme';
184
+ if (value >= 60)
185
+ return 'severe';
186
+ if (value >= 40)
187
+ return 'high';
188
+ if (value >= 20)
189
+ return 'moderate';
190
+ return 'low';
191
+ }
192
+ /**
193
+ * Map a risk level to a priority.
194
+ */
195
+ riskLevelToPriority(level) {
196
+ const map = {
197
+ extreme: 1,
198
+ severe: 2,
199
+ high: 3,
200
+ moderate: 4,
201
+ low: 5,
202
+ };
203
+ return map[level];
204
+ }
205
+ /**
206
+ * Create an empty result (no alerts).
207
+ */
208
+ emptyResult() {
209
+ return { alerts: [] };
210
+ }
211
+ }
212
+ exports.BasePlugin = BasePlugin;
213
+ //# sourceMappingURL=base-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-plugin.js","sourceRoot":"","sources":["../../../src/plugins/base-plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PhoenixEventsPlugin = void 0;
4
+ var phoenix_events_plugin_1 = require("./phoenix-events.plugin");
5
+ Object.defineProperty(exports, "PhoenixEventsPlugin", { enumerable: true, get: function () { return phoenix_events_plugin_1.PhoenixEventsPlugin; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/events/index.ts"],"names":[],"mappings":";;;AAAA,iEAA8D;AAArD,4HAAA,mBAAmB,OAAA"}