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,209 @@
1
+ import { isPointInRadius } from '../geo';
2
+ import { FetchError } from '../errors';
3
+ import { withRetry, generateCacheKey, parseCSV } from '../utils';
4
+ /**
5
+ * Abstract base class for alert plugins.
6
+ *
7
+ * Provides common functionality for:
8
+ * - Location coverage checking
9
+ * - HTTP fetching with retry
10
+ * - Caching
11
+ * - Alert creation helpers
12
+ */
13
+ export class BasePlugin {
14
+ config;
15
+ cache;
16
+ constructor(config) {
17
+ this.config = {
18
+ cacheTtlMs: 5 * 60 * 1000, // 5 minutes default
19
+ maxRetries: 3,
20
+ userAgent: 'LocalRiskAlertFeed/1.0',
21
+ ...config,
22
+ };
23
+ this.cache = config?.cache;
24
+ }
25
+ /**
26
+ * Initialize the plugin. Override if needed.
27
+ */
28
+ async initialize(config) {
29
+ if (config?.cache) {
30
+ this.cache = config.cache;
31
+ }
32
+ if (config?.cacheTtlMs) {
33
+ this.config.cacheTtlMs = config.cacheTtlMs;
34
+ }
35
+ }
36
+ /**
37
+ * Check if this plugin covers the given location.
38
+ *
39
+ * For global plugins, always returns true.
40
+ * For regional plugins, checks if the point is within the coverage radius.
41
+ */
42
+ coversLocation(point) {
43
+ const { coverage } = this.metadata;
44
+ if (coverage.type === 'global') {
45
+ return true;
46
+ }
47
+ if (coverage.center && coverage.radiusMeters) {
48
+ return isPointInRadius(point, coverage.center, coverage.radiusMeters);
49
+ }
50
+ return false;
51
+ }
52
+ /**
53
+ * Clean up resources. Override if needed.
54
+ */
55
+ async dispose() {
56
+ // Default: no cleanup needed
57
+ }
58
+ /**
59
+ * Fetch JSON data from a URL with retry logic.
60
+ */
61
+ async fetchJson(url, init) {
62
+ return withRetry(async () => {
63
+ const response = await fetch(url, {
64
+ ...init,
65
+ headers: {
66
+ 'User-Agent': this.config.userAgent,
67
+ Accept: 'application/json',
68
+ ...init?.headers,
69
+ },
70
+ });
71
+ if (!response.ok) {
72
+ throw FetchError.fromResponse(url, response);
73
+ }
74
+ return response.json();
75
+ }, {
76
+ maxAttempts: this.config.maxRetries,
77
+ isRetryable: (error) => {
78
+ if (error instanceof FetchError) {
79
+ return error.isRetryable();
80
+ }
81
+ return true;
82
+ },
83
+ });
84
+ }
85
+ /**
86
+ * Fetch CSV data from a URL with retry logic.
87
+ *
88
+ * @param url - The URL to fetch from
89
+ * @param options - CSV parsing options
90
+ * @param init - Optional fetch init options
91
+ * @returns Parsed CSV data as array of objects
92
+ */
93
+ async fetchCsv(url, options, init) {
94
+ return withRetry(async () => {
95
+ const response = await fetch(url, {
96
+ ...init,
97
+ headers: {
98
+ 'User-Agent': this.config.userAgent,
99
+ Accept: 'text/csv, application/csv, */*',
100
+ ...init?.headers,
101
+ },
102
+ });
103
+ if (!response.ok) {
104
+ throw FetchError.fromResponse(url, response);
105
+ }
106
+ const text = await response.text();
107
+ return parseCSV(text, options);
108
+ }, {
109
+ maxAttempts: this.config.maxRetries,
110
+ isRetryable: (error) => {
111
+ if (error instanceof FetchError) {
112
+ return error.isRetryable();
113
+ }
114
+ return true;
115
+ },
116
+ });
117
+ }
118
+ /**
119
+ * Get cached data or fetch fresh data.
120
+ */
121
+ async getCachedOrFetch(cacheKey, fetcher, ttlMs) {
122
+ if (this.cache) {
123
+ const cached = await this.cache.get(cacheKey);
124
+ if (cached !== null) {
125
+ return { data: cached, fromCache: true };
126
+ }
127
+ }
128
+ const data = await fetcher();
129
+ if (this.cache) {
130
+ await this.cache.set(cacheKey, data, ttlMs ?? this.config.cacheTtlMs);
131
+ }
132
+ return { data, fromCache: false };
133
+ }
134
+ /**
135
+ * Generate a cache key for this plugin and query options.
136
+ */
137
+ generateCacheKey(options) {
138
+ return generateCacheKey(this.metadata.id, options.location, options.timeRange);
139
+ }
140
+ /**
141
+ * Create an alert with common fields filled in.
142
+ */
143
+ createAlert(data) {
144
+ const { externalId, ...rest } = data;
145
+ return {
146
+ ...rest,
147
+ source: {
148
+ pluginId: this.metadata.id,
149
+ name: this.metadata.name,
150
+ externalId,
151
+ type: this.getSourceType(),
152
+ },
153
+ };
154
+ }
155
+ /**
156
+ * Get the source type based on plugin categories.
157
+ */
158
+ getSourceType() {
159
+ const categories = this.metadata.supportedCategories;
160
+ if (categories.includes('crime'))
161
+ return 'police';
162
+ if (categories.includes('fire') || categories.includes('medical'))
163
+ return 'fire';
164
+ if (categories.includes('weather'))
165
+ return 'weather';
166
+ if (categories.includes('traffic'))
167
+ return 'traffic';
168
+ if (categories.includes('event'))
169
+ return 'events';
170
+ return 'other';
171
+ }
172
+ /**
173
+ * Map a numeric severity to a risk level.
174
+ *
175
+ * @param value - Numeric value (0-100 scale)
176
+ * @returns Corresponding risk level
177
+ */
178
+ mapToRiskLevel(value) {
179
+ if (value >= 80)
180
+ return 'extreme';
181
+ if (value >= 60)
182
+ return 'severe';
183
+ if (value >= 40)
184
+ return 'high';
185
+ if (value >= 20)
186
+ return 'moderate';
187
+ return 'low';
188
+ }
189
+ /**
190
+ * Map a risk level to a priority.
191
+ */
192
+ riskLevelToPriority(level) {
193
+ const map = {
194
+ extreme: 1,
195
+ severe: 2,
196
+ high: 3,
197
+ moderate: 4,
198
+ low: 5,
199
+ };
200
+ return map[level];
201
+ }
202
+ /**
203
+ * Create an empty result (no alerts).
204
+ */
205
+ emptyResult() {
206
+ return { alerts: [] };
207
+ }
208
+ }
209
+ //# 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,2 @@
1
+ export { PhoenixEventsPlugin } from './phoenix-events.plugin';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/events/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,378 @@
1
+ import { BasePlugin } from '../base-plugin';
2
+ /**
3
+ * Phoenix downtown center coordinates.
4
+ */
5
+ const PHOENIX_DOWNTOWN = {
6
+ latitude: 33.4484,
7
+ longitude: -112.074,
8
+ };
9
+ /**
10
+ * Coverage radius - 10km for downtown Phoenix events.
11
+ */
12
+ const COVERAGE_RADIUS_METERS = 10_000;
13
+ /**
14
+ * Major Phoenix venues with coordinates.
15
+ */
16
+ const PHOENIX_VENUES = {
17
+ 'Chase Field': { latitude: 33.4455, longitude: -112.0667 },
18
+ 'Footprint Center': { latitude: 33.4459, longitude: -112.0712 },
19
+ 'State Farm Stadium': { latitude: 33.5276, longitude: -112.2626 },
20
+ 'Arizona State University': { latitude: 33.4242, longitude: -111.9281 },
21
+ 'Phoenix Convention Center': { latitude: 33.4419, longitude: -112.0711 },
22
+ 'Comerica Theatre': { latitude: 33.4461, longitude: -112.0710 },
23
+ 'Celebrity Theatre': { latitude: 33.4870, longitude: -112.0744 },
24
+ 'Van Buren': { latitude: 33.4542, longitude: -112.0747 },
25
+ 'Crescent Ballroom': { latitude: 33.4509, longitude: -112.0714 },
26
+ };
27
+ /**
28
+ * Event types that may cause civil unrest concerns.
29
+ */
30
+ const CIVIL_UNREST_KEYWORDS = [
31
+ 'protest',
32
+ 'march',
33
+ 'rally',
34
+ 'demonstration',
35
+ 'strike',
36
+ 'political',
37
+ ];
38
+ /**
39
+ * Plugin that fetches event data from Ticketmaster and Phoenix city permits.
40
+ *
41
+ * Aggregates from:
42
+ * - Ticketmaster Discovery API for concerts, sports, theater
43
+ * - Phoenix Open Data for special event permits (street closures, parades)
44
+ */
45
+ export class PhoenixEventsPlugin extends BasePlugin {
46
+ metadata = {
47
+ id: 'phoenix-events',
48
+ name: 'Phoenix Events',
49
+ version: '1.0.0',
50
+ description: 'Events from Ticketmaster and Phoenix city permits',
51
+ coverage: {
52
+ type: 'regional',
53
+ center: PHOENIX_DOWNTOWN,
54
+ radiusMeters: COVERAGE_RADIUS_METERS,
55
+ description: 'Downtown Phoenix area',
56
+ },
57
+ supportedTemporalTypes: ['scheduled'],
58
+ supportedCategories: ['event', 'civil-unrest'],
59
+ refreshIntervalMs: 30 * 60 * 1000, // 30 minutes
60
+ };
61
+ eventsConfig;
62
+ constructor(config) {
63
+ super(config);
64
+ this.eventsConfig = {
65
+ limit: 100,
66
+ enablePhoenixPermits: true,
67
+ ...config,
68
+ enableTicketmaster: config?.enableTicketmaster ?? !!config?.ticketmasterApiKey,
69
+ };
70
+ }
71
+ async fetchAlerts(options) {
72
+ const cacheKey = this.generateCacheKey(options);
73
+ const warnings = [];
74
+ try {
75
+ const { data, fromCache } = await this.getCachedOrFetch(cacheKey, () => this.fetchAllEvents(options, warnings), this.config.cacheTtlMs);
76
+ // Filter by categories if specified
77
+ let alerts = data;
78
+ if (options.categories && options.categories.length > 0) {
79
+ alerts = alerts.filter((alert) => options.categories.includes(alert.category));
80
+ }
81
+ return {
82
+ alerts,
83
+ fromCache,
84
+ cacheKey,
85
+ warnings: warnings.length > 0 ? warnings : undefined,
86
+ };
87
+ }
88
+ catch (error) {
89
+ console.error('Phoenix Events fetch error:', error);
90
+ throw error;
91
+ }
92
+ }
93
+ /**
94
+ * Fetch events from all enabled sources.
95
+ */
96
+ async fetchAllEvents(options, warnings) {
97
+ const allAlerts = [];
98
+ // Fetch from Ticketmaster
99
+ if (this.eventsConfig.enableTicketmaster && this.eventsConfig.ticketmasterApiKey) {
100
+ try {
101
+ const tmAlerts = await this.fetchTicketmasterEvents(options);
102
+ allAlerts.push(...tmAlerts);
103
+ }
104
+ catch (error) {
105
+ warnings.push(`Ticketmaster fetch failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
106
+ }
107
+ }
108
+ // Fetch from Phoenix permits
109
+ if (this.eventsConfig.enablePhoenixPermits) {
110
+ try {
111
+ const permitAlerts = await this.fetchPhoenixPermitEvents(options);
112
+ allAlerts.push(...permitAlerts);
113
+ }
114
+ catch (error) {
115
+ warnings.push(`Phoenix permits fetch failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
116
+ }
117
+ }
118
+ // Deduplicate events by venue + date
119
+ return this.deduplicateEvents(allAlerts);
120
+ }
121
+ /**
122
+ * Fetch events from Ticketmaster Discovery API.
123
+ */
124
+ async fetchTicketmasterEvents(options) {
125
+ const { location, timeRange } = options;
126
+ const apiKey = this.eventsConfig.ticketmasterApiKey;
127
+ const params = new URLSearchParams({
128
+ apikey: apiKey,
129
+ latlong: `${location.latitude},${location.longitude}`,
130
+ radius: '25', // miles
131
+ unit: 'miles',
132
+ startDateTime: new Date(timeRange.start).toISOString().replace('.000', ''),
133
+ endDateTime: new Date(timeRange.end).toISOString().replace('.000', ''),
134
+ size: String(this.eventsConfig.limit),
135
+ sort: 'date,asc',
136
+ });
137
+ const url = `https://app.ticketmaster.com/discovery/v2/events.json?${params}`;
138
+ const response = await this.fetchJson(url);
139
+ if (!response._embedded?.events) {
140
+ return [];
141
+ }
142
+ return response._embedded.events.map((event) => this.transformTicketmasterEvent(event));
143
+ }
144
+ /**
145
+ * Transform a Ticketmaster event to our Alert format.
146
+ */
147
+ transformTicketmasterEvent(event) {
148
+ const venue = event._embedded?.venues?.[0];
149
+ const classification = event.classifications?.[0];
150
+ // Determine location
151
+ let latitude = PHOENIX_DOWNTOWN.latitude;
152
+ let longitude = PHOENIX_DOWNTOWN.longitude;
153
+ if (venue?.location) {
154
+ latitude = parseFloat(venue.location.latitude);
155
+ longitude = parseFloat(venue.location.longitude);
156
+ }
157
+ else if (venue?.name && PHOENIX_VENUES[venue.name]) {
158
+ latitude = PHOENIX_VENUES[venue.name].latitude;
159
+ longitude = PHOENIX_VENUES[venue.name].longitude;
160
+ }
161
+ // Build timestamps
162
+ const startDateTime = event.dates.start.dateTime ?? `${event.dates.start.localDate}T${event.dates.start.localTime ?? '00:00:00'}`;
163
+ const endDateTime = event.dates.end?.dateTime;
164
+ // Determine risk level based on event type/venue
165
+ const riskLevel = this.assessEventRisk(event, venue?.name);
166
+ return this.createAlert({
167
+ id: `tm-${event.id}`,
168
+ externalId: event.id,
169
+ title: event.name,
170
+ description: this.buildTicketmasterDescription(event, classification, venue),
171
+ riskLevel,
172
+ priority: this.riskLevelToPriority(riskLevel),
173
+ category: 'event',
174
+ temporalType: 'scheduled',
175
+ location: {
176
+ point: { latitude, longitude },
177
+ address: venue?.address?.line1,
178
+ city: venue?.city?.name ?? 'Phoenix',
179
+ state: venue?.state?.stateCode ?? 'AZ',
180
+ zipCode: venue?.postalCode,
181
+ },
182
+ timestamps: {
183
+ issued: new Date().toISOString(),
184
+ eventStart: startDateTime,
185
+ eventEnd: endDateTime,
186
+ },
187
+ url: event.url,
188
+ metadata: {
189
+ source: 'ticketmaster',
190
+ venue: venue?.name,
191
+ segment: classification?.segment?.name,
192
+ genre: classification?.genre?.name,
193
+ status: event.dates.status?.code,
194
+ },
195
+ });
196
+ }
197
+ /**
198
+ * Fetch events from Phoenix Open Data special events permits.
199
+ */
200
+ async fetchPhoenixPermitEvents(options) {
201
+ const { timeRange } = options;
202
+ // Phoenix special events dataset (if available)
203
+ // Note: This endpoint may need to be updated based on actual Phoenix Open Data availability
204
+ const baseUrl = 'https://www.phoenixopendata.com/resource/yqvh-8bti.json';
205
+ const params = new URLSearchParams({
206
+ $limit: String(this.eventsConfig.limit),
207
+ $order: 'start_date ASC',
208
+ });
209
+ // Filter by date range
210
+ const startDate = timeRange.start.split('T')[0];
211
+ const endDate = timeRange.end.split('T')[0];
212
+ params.set('$where', `start_date >= '${startDate}' AND start_date <= '${endDate}'`);
213
+ if (this.eventsConfig.socrataAppToken) {
214
+ params.set('$$app_token', this.eventsConfig.socrataAppToken);
215
+ }
216
+ const url = `${baseUrl}?${params}`;
217
+ try {
218
+ const events = await this.fetchJson(url);
219
+ return events.map((event) => this.transformPhoenixPermitEvent(event));
220
+ }
221
+ catch (error) {
222
+ // Phoenix permits endpoint might not always be available
223
+ console.warn('Phoenix permits fetch failed, continuing with other sources:', error);
224
+ return [];
225
+ }
226
+ }
227
+ /**
228
+ * Transform a Phoenix permit event to our Alert format.
229
+ */
230
+ transformPhoenixPermitEvent(event) {
231
+ // Parse location
232
+ const latitude = event.latitude ? parseFloat(event.latitude) : PHOENIX_DOWNTOWN.latitude;
233
+ const longitude = event.longitude ? parseFloat(event.longitude) : PHOENIX_DOWNTOWN.longitude;
234
+ // Build timestamps
235
+ const startDate = event.start_date ?? new Date().toISOString().split('T')[0];
236
+ const startTime = event.start_time ?? '00:00:00';
237
+ const startDateTime = `${startDate}T${startTime}`;
238
+ let endDateTime;
239
+ if (event.end_date) {
240
+ const endTime = event.end_time ?? '23:59:59';
241
+ endDateTime = `${event.end_date}T${endTime}`;
242
+ }
243
+ // Determine category and risk
244
+ const { category, riskLevel } = this.assessPermitEventRisk(event);
245
+ return this.createAlert({
246
+ id: `phoenix-permit-${event.permit_number ?? Date.now()}`,
247
+ externalId: event.permit_number,
248
+ title: event.event_name ?? 'Special Event',
249
+ description: this.buildPermitDescription(event),
250
+ riskLevel,
251
+ priority: this.riskLevelToPriority(riskLevel),
252
+ category,
253
+ temporalType: 'scheduled',
254
+ location: {
255
+ point: { latitude, longitude },
256
+ address: event.event_location,
257
+ city: 'Phoenix',
258
+ state: 'AZ',
259
+ },
260
+ timestamps: {
261
+ issued: new Date().toISOString(),
262
+ eventStart: startDateTime,
263
+ eventEnd: endDateTime,
264
+ },
265
+ metadata: {
266
+ source: 'phoenix-permits',
267
+ eventType: event.event_type,
268
+ streetClosure: event.street_closure,
269
+ permitNumber: event.permit_number,
270
+ },
271
+ });
272
+ }
273
+ /**
274
+ * Assess risk level for a Ticketmaster event.
275
+ */
276
+ assessEventRisk(event, venueName) {
277
+ // Large venue events have higher crowd impact
278
+ const largeVenues = ['Chase Field', 'Footprint Center', 'State Farm Stadium'];
279
+ if (venueName && largeVenues.includes(venueName)) {
280
+ return 'moderate';
281
+ }
282
+ // Sports events typically have high attendance
283
+ const segment = event.classifications?.[0]?.segment?.name?.toLowerCase();
284
+ if (segment === 'sports') {
285
+ return 'moderate';
286
+ }
287
+ // Music events can vary
288
+ if (segment === 'music') {
289
+ return 'low';
290
+ }
291
+ return 'low';
292
+ }
293
+ /**
294
+ * Assess risk and category for a permit event.
295
+ */
296
+ assessPermitEventRisk(event) {
297
+ const name = (event.event_name ?? '').toLowerCase();
298
+ const type = (event.event_type ?? '').toLowerCase();
299
+ const description = (event.description ?? '').toLowerCase();
300
+ const combined = `${name} ${type} ${description}`;
301
+ // Check for civil unrest indicators
302
+ for (const keyword of CIVIL_UNREST_KEYWORDS) {
303
+ if (combined.includes(keyword)) {
304
+ return { category: 'civil-unrest', riskLevel: 'moderate' };
305
+ }
306
+ }
307
+ // Check for street closures
308
+ if (event.street_closure && event.street_closure.toLowerCase() !== 'no') {
309
+ return { category: 'event', riskLevel: 'moderate' };
310
+ }
311
+ // Default
312
+ return { category: 'event', riskLevel: 'low' };
313
+ }
314
+ /**
315
+ * Build description for Ticketmaster event.
316
+ */
317
+ buildTicketmasterDescription(event, classification, venue) {
318
+ const parts = [];
319
+ if (classification?.segment?.name) {
320
+ parts.push(`Type: ${classification.segment.name}`);
321
+ }
322
+ if (classification?.genre?.name) {
323
+ parts.push(`Genre: ${classification.genre.name}`);
324
+ }
325
+ if (venue?.name) {
326
+ parts.push(`Venue: ${venue.name}`);
327
+ }
328
+ if (event.dates.start.localDate) {
329
+ const time = event.dates.start.localTime ?? '';
330
+ parts.push(`Date: ${event.dates.start.localDate} ${time}`.trim());
331
+ }
332
+ return parts.join('\n');
333
+ }
334
+ /**
335
+ * Build description for permit event.
336
+ */
337
+ buildPermitDescription(event) {
338
+ const parts = [];
339
+ if (event.event_type) {
340
+ parts.push(`Type: ${event.event_type}`);
341
+ }
342
+ if (event.event_location) {
343
+ parts.push(`Location: ${event.event_location}`);
344
+ }
345
+ if (event.description) {
346
+ parts.push(`\n${event.description}`);
347
+ }
348
+ if (event.street_closure && event.street_closure.toLowerCase() !== 'no') {
349
+ parts.push(`\nStreet Closure: ${event.street_closure}`);
350
+ }
351
+ return parts.join('\n');
352
+ }
353
+ /**
354
+ * Deduplicate events that might appear in both sources.
355
+ */
356
+ deduplicateEvents(alerts) {
357
+ const seen = new Map();
358
+ for (const alert of alerts) {
359
+ // Create dedup key from venue + date
360
+ const venue = alert.metadata?.venue ?? alert.location.address ?? 'unknown';
361
+ const date = alert.timestamps.eventStart?.split('T')[0] ?? '';
362
+ const key = `${venue.toLowerCase()}-${date}`;
363
+ const existing = seen.get(key);
364
+ if (!existing) {
365
+ seen.set(key, alert);
366
+ }
367
+ else {
368
+ // Prefer Ticketmaster data (usually more complete)
369
+ if (alert.metadata?.source === 'ticketmaster' &&
370
+ existing.metadata?.source !== 'ticketmaster') {
371
+ seen.set(key, alert);
372
+ }
373
+ }
374
+ }
375
+ return Array.from(seen.values());
376
+ }
377
+ }
378
+ //# sourceMappingURL=phoenix-events.plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phoenix-events.plugin.js","sourceRoot":"","sources":["../../../../src/plugins/events/phoenix-events.plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { PhoenixFirePlugin } from './phoenix-fire.plugin';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/fire-emt/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC"}