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.
- package/dist/cjs/adapters/index.js +8 -0
- package/dist/cjs/adapters/index.js.map +1 -0
- package/dist/cjs/adapters/lambda.js +143 -0
- package/dist/cjs/adapters/lambda.js.map +1 -0
- package/dist/cjs/adapters/vercel.js +119 -0
- package/dist/cjs/adapters/vercel.js.map +1 -0
- package/dist/cjs/core/alert-aggregator.js +207 -0
- package/dist/cjs/core/alert-aggregator.js.map +1 -0
- package/dist/cjs/core/alert-feed.js +236 -0
- package/dist/cjs/core/alert-feed.js.map +1 -0
- package/dist/cjs/core/index.js +22 -0
- package/dist/cjs/core/index.js.map +1 -0
- package/dist/cjs/core/plugin-registry.js +193 -0
- package/dist/cjs/core/plugin-registry.js.map +1 -0
- package/dist/cjs/core/plugin-resolver.js +121 -0
- package/dist/cjs/core/plugin-resolver.js.map +1 -0
- package/dist/cjs/core/time-range.js +67 -0
- package/dist/cjs/core/time-range.js.map +1 -0
- package/dist/cjs/errors/fetch-error.js +71 -0
- package/dist/cjs/errors/fetch-error.js.map +1 -0
- package/dist/cjs/errors/index.js +15 -0
- package/dist/cjs/errors/index.js.map +1 -0
- package/dist/cjs/errors/plugin-error.js +80 -0
- package/dist/cjs/errors/plugin-error.js.map +1 -0
- package/dist/cjs/errors/validation-error.js +49 -0
- package/dist/cjs/errors/validation-error.js.map +1 -0
- package/dist/cjs/geo/distance.js +94 -0
- package/dist/cjs/geo/distance.js.map +1 -0
- package/dist/cjs/geo/index.js +18 -0
- package/dist/cjs/geo/index.js.map +1 -0
- package/dist/cjs/geo/point-in-radius.js +86 -0
- package/dist/cjs/geo/point-in-radius.js.map +1 -0
- package/dist/cjs/index.js +90 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/plugins/air-quality/airnow.plugin.js +343 -0
- package/dist/cjs/plugins/air-quality/airnow.plugin.js.map +1 -0
- package/dist/cjs/plugins/air-quality/index.js +6 -0
- package/dist/cjs/plugins/air-quality/index.js.map +1 -0
- package/dist/cjs/plugins/base-plugin.js +213 -0
- package/dist/cjs/plugins/base-plugin.js.map +1 -0
- package/dist/cjs/plugins/events/index.js +6 -0
- package/dist/cjs/plugins/events/index.js.map +1 -0
- package/dist/cjs/plugins/events/phoenix-events.plugin.js +382 -0
- package/dist/cjs/plugins/events/phoenix-events.plugin.js.map +1 -0
- package/dist/cjs/plugins/fire-emt/index.js +6 -0
- package/dist/cjs/plugins/fire-emt/index.js.map +1 -0
- package/dist/cjs/plugins/fire-emt/phoenix-fire.plugin.js +262 -0
- package/dist/cjs/plugins/fire-emt/phoenix-fire.plugin.js.map +1 -0
- package/dist/cjs/plugins/index.js +28 -0
- package/dist/cjs/plugins/index.js.map +1 -0
- package/dist/cjs/plugins/police-blotter/index.js +6 -0
- package/dist/cjs/plugins/police-blotter/index.js.map +1 -0
- package/dist/cjs/plugins/police-blotter/phoenix-police.plugin.js +198 -0
- package/dist/cjs/plugins/police-blotter/phoenix-police.plugin.js.map +1 -0
- package/dist/cjs/plugins/pulsepoint/index.js +6 -0
- package/dist/cjs/plugins/pulsepoint/index.js.map +1 -0
- package/dist/cjs/plugins/pulsepoint/pulsepoint.plugin.js +275 -0
- package/dist/cjs/plugins/pulsepoint/pulsepoint.plugin.js.map +1 -0
- package/dist/cjs/plugins/traffic/arizona-traffic.plugin.js +391 -0
- package/dist/cjs/plugins/traffic/arizona-traffic.plugin.js.map +1 -0
- package/dist/cjs/plugins/traffic/index.js +6 -0
- package/dist/cjs/plugins/traffic/index.js.map +1 -0
- package/dist/cjs/plugins/weather/index.js +6 -0
- package/dist/cjs/plugins/weather/index.js.map +1 -0
- package/dist/cjs/plugins/weather/nws-weather.plugin.js +180 -0
- package/dist/cjs/plugins/weather/nws-weather.plugin.js.map +1 -0
- package/dist/cjs/schemas/alert.schema.js +93 -0
- package/dist/cjs/schemas/alert.schema.js.map +1 -0
- package/dist/cjs/schemas/index.js +24 -0
- package/dist/cjs/schemas/index.js.map +1 -0
- package/dist/cjs/schemas/query.schema.js +76 -0
- package/dist/cjs/schemas/query.schema.js.map +1 -0
- package/dist/cjs/types/alert.js +35 -0
- package/dist/cjs/types/alert.js.map +1 -0
- package/dist/cjs/types/config.js +13 -0
- package/dist/cjs/types/config.js.map +1 -0
- package/dist/cjs/types/geo.js +3 -0
- package/dist/cjs/types/geo.js.map +1 -0
- package/dist/cjs/types/index.js +16 -0
- package/dist/cjs/types/index.js.map +1 -0
- package/dist/cjs/types/plugin.js +3 -0
- package/dist/cjs/types/plugin.js.map +1 -0
- package/dist/cjs/types/query.js +28 -0
- package/dist/cjs/types/query.js.map +1 -0
- package/dist/cjs/utils/cache.js +188 -0
- package/dist/cjs/utils/cache.js.map +1 -0
- package/dist/cjs/utils/csv.js +189 -0
- package/dist/cjs/utils/csv.js.map +1 -0
- package/dist/cjs/utils/date.js +153 -0
- package/dist/cjs/utils/date.js.map +1 -0
- package/dist/cjs/utils/index.js +28 -0
- package/dist/cjs/utils/index.js.map +1 -0
- package/dist/cjs/utils/retry.js +109 -0
- package/dist/cjs/utils/retry.js.map +1 -0
- package/dist/esm/adapters/index.js +3 -0
- package/dist/esm/adapters/index.js.map +1 -0
- package/dist/esm/adapters/lambda.js +140 -0
- package/dist/esm/adapters/lambda.js.map +1 -0
- package/dist/esm/adapters/vercel.js +116 -0
- package/dist/esm/adapters/vercel.js.map +1 -0
- package/dist/esm/core/alert-aggregator.js +203 -0
- package/dist/esm/core/alert-aggregator.js.map +1 -0
- package/dist/esm/core/alert-feed.js +232 -0
- package/dist/esm/core/alert-feed.js.map +1 -0
- package/dist/esm/core/index.js +6 -0
- package/dist/esm/core/index.js.map +1 -0
- package/dist/esm/core/plugin-registry.js +189 -0
- package/dist/esm/core/plugin-registry.js.map +1 -0
- package/dist/esm/core/plugin-resolver.js +117 -0
- package/dist/esm/core/plugin-resolver.js.map +1 -0
- package/dist/esm/core/time-range.js +57 -0
- package/dist/esm/core/time-range.js.map +1 -0
- package/dist/esm/errors/fetch-error.js +67 -0
- package/dist/esm/errors/fetch-error.js.map +1 -0
- package/dist/esm/errors/index.js +4 -0
- package/dist/esm/errors/index.js.map +1 -0
- package/dist/esm/errors/plugin-error.js +71 -0
- package/dist/esm/errors/plugin-error.js.map +1 -0
- package/dist/esm/errors/validation-error.js +45 -0
- package/dist/esm/errors/validation-error.js.map +1 -0
- package/dist/esm/geo/distance.js +85 -0
- package/dist/esm/geo/distance.js.map +1 -0
- package/dist/esm/geo/index.js +3 -0
- package/dist/esm/geo/index.js.map +1 -0
- package/dist/esm/geo/point-in-radius.js +79 -0
- package/dist/esm/geo/point-in-radius.js.map +1 -0
- package/dist/esm/index.js +30 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/plugins/air-quality/airnow.plugin.js +339 -0
- package/dist/esm/plugins/air-quality/airnow.plugin.js.map +1 -0
- package/dist/esm/plugins/air-quality/index.js +2 -0
- package/dist/esm/plugins/air-quality/index.js.map +1 -0
- package/dist/esm/plugins/base-plugin.js +209 -0
- package/dist/esm/plugins/base-plugin.js.map +1 -0
- package/dist/esm/plugins/events/index.js +2 -0
- package/dist/esm/plugins/events/index.js.map +1 -0
- package/dist/esm/plugins/events/phoenix-events.plugin.js +378 -0
- package/dist/esm/plugins/events/phoenix-events.plugin.js.map +1 -0
- package/dist/esm/plugins/fire-emt/index.js +2 -0
- package/dist/esm/plugins/fire-emt/index.js.map +1 -0
- package/dist/esm/plugins/fire-emt/phoenix-fire.plugin.js +258 -0
- package/dist/esm/plugins/fire-emt/phoenix-fire.plugin.js.map +1 -0
- package/dist/esm/plugins/index.js +17 -0
- package/dist/esm/plugins/index.js.map +1 -0
- package/dist/esm/plugins/police-blotter/index.js +2 -0
- package/dist/esm/plugins/police-blotter/index.js.map +1 -0
- package/dist/esm/plugins/police-blotter/phoenix-police.plugin.js +194 -0
- package/dist/esm/plugins/police-blotter/phoenix-police.plugin.js.map +1 -0
- package/dist/esm/plugins/pulsepoint/index.js +2 -0
- package/dist/esm/plugins/pulsepoint/index.js.map +1 -0
- package/dist/esm/plugins/pulsepoint/pulsepoint.plugin.js +271 -0
- package/dist/esm/plugins/pulsepoint/pulsepoint.plugin.js.map +1 -0
- package/dist/esm/plugins/traffic/arizona-traffic.plugin.js +387 -0
- package/dist/esm/plugins/traffic/arizona-traffic.plugin.js.map +1 -0
- package/dist/esm/plugins/traffic/index.js +2 -0
- package/dist/esm/plugins/traffic/index.js.map +1 -0
- package/dist/esm/plugins/weather/index.js +2 -0
- package/dist/esm/plugins/weather/index.js.map +1 -0
- package/dist/esm/plugins/weather/nws-weather.plugin.js +176 -0
- package/dist/esm/plugins/weather/nws-weather.plugin.js.map +1 -0
- package/dist/esm/schemas/alert.schema.js +90 -0
- package/dist/esm/schemas/alert.schema.js.map +1 -0
- package/dist/esm/schemas/index.js +5 -0
- package/dist/esm/schemas/index.js.map +1 -0
- package/dist/esm/schemas/query.schema.js +72 -0
- package/dist/esm/schemas/query.schema.js.map +1 -0
- package/dist/esm/types/alert.js +32 -0
- package/dist/esm/types/alert.js.map +1 -0
- package/dist/esm/types/config.js +10 -0
- package/dist/esm/types/config.js.map +1 -0
- package/dist/esm/types/geo.js +2 -0
- package/dist/esm/types/geo.js.map +1 -0
- package/dist/esm/types/index.js +4 -0
- package/dist/esm/types/index.js.map +1 -0
- package/dist/esm/types/plugin.js +2 -0
- package/dist/esm/types/plugin.js.map +1 -0
- package/dist/esm/types/query.js +25 -0
- package/dist/esm/types/query.js.map +1 -0
- package/dist/esm/utils/cache.js +181 -0
- package/dist/esm/utils/cache.js.map +1 -0
- package/dist/esm/utils/csv.js +185 -0
- package/dist/esm/utils/csv.js.map +1 -0
- package/dist/esm/utils/date.js +142 -0
- package/dist/esm/utils/date.js.map +1 -0
- package/dist/esm/utils/index.js +5 -0
- package/dist/esm/utils/index.js.map +1 -0
- package/dist/esm/utils/retry.js +102 -0
- package/dist/esm/utils/retry.js.map +1 -0
- package/dist/types/adapters/index.d.ts +5 -0
- package/dist/types/adapters/index.d.ts.map +1 -0
- package/dist/types/adapters/lambda.d.ts +37 -0
- package/dist/types/adapters/lambda.d.ts.map +1 -0
- package/dist/types/adapters/vercel.d.ts +54 -0
- package/dist/types/adapters/vercel.d.ts.map +1 -0
- package/dist/types/core/alert-aggregator.d.ts +81 -0
- package/dist/types/core/alert-aggregator.d.ts.map +1 -0
- package/dist/types/core/alert-feed.d.ts +80 -0
- package/dist/types/core/alert-feed.d.ts.map +1 -0
- package/dist/types/core/index.d.ts +8 -0
- package/dist/types/core/index.d.ts.map +1 -0
- package/dist/types/core/plugin-registry.d.ts +91 -0
- package/dist/types/core/plugin-registry.d.ts.map +1 -0
- package/dist/types/core/plugin-resolver.d.ts +78 -0
- package/dist/types/core/plugin-resolver.d.ts.map +1 -0
- package/dist/types/core/time-range.d.ts +40 -0
- package/dist/types/core/time-range.d.ts.map +1 -0
- package/dist/types/errors/fetch-error.d.ts +46 -0
- package/dist/types/errors/fetch-error.d.ts.map +1 -0
- package/dist/types/errors/index.d.ts +5 -0
- package/dist/types/errors/index.d.ts.map +1 -0
- package/dist/types/errors/plugin-error.d.ts +42 -0
- package/dist/types/errors/plugin-error.d.ts.map +1 -0
- package/dist/types/errors/validation-error.d.ts +34 -0
- package/dist/types/errors/validation-error.d.ts.map +1 -0
- package/dist/types/geo/distance.d.ts +50 -0
- package/dist/types/geo/distance.d.ts.map +1 -0
- package/dist/types/geo/index.d.ts +3 -0
- package/dist/types/geo/index.d.ts.map +1 -0
- package/dist/types/geo/point-in-radius.d.ts +44 -0
- package/dist/types/geo/point-in-radius.d.ts.map +1 -0
- package/dist/types/index.d.ts +32 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/plugins/air-quality/airnow.plugin.d.ts +84 -0
- package/dist/types/plugins/air-quality/airnow.plugin.d.ts.map +1 -0
- package/dist/types/plugins/air-quality/index.d.ts +3 -0
- package/dist/types/plugins/air-quality/index.d.ts.map +1 -0
- package/dist/types/plugins/base-plugin.d.ts +99 -0
- package/dist/types/plugins/base-plugin.d.ts.map +1 -0
- package/dist/types/plugins/events/index.d.ts +3 -0
- package/dist/types/plugins/events/index.d.ts.map +1 -0
- package/dist/types/plugins/events/phoenix-events.plugin.d.ts +71 -0
- package/dist/types/plugins/events/phoenix-events.plugin.d.ts.map +1 -0
- package/dist/types/plugins/fire-emt/index.d.ts +3 -0
- package/dist/types/plugins/fire-emt/index.d.ts.map +1 -0
- package/dist/types/plugins/fire-emt/phoenix-fire.plugin.d.ts +47 -0
- package/dist/types/plugins/fire-emt/phoenix-fire.plugin.d.ts.map +1 -0
- package/dist/types/plugins/index.d.ts +17 -0
- package/dist/types/plugins/index.d.ts.map +1 -0
- package/dist/types/plugins/police-blotter/index.d.ts +3 -0
- package/dist/types/plugins/police-blotter/index.d.ts.map +1 -0
- package/dist/types/plugins/police-blotter/phoenix-police.plugin.d.ts +49 -0
- package/dist/types/plugins/police-blotter/phoenix-police.plugin.d.ts.map +1 -0
- package/dist/types/plugins/pulsepoint/index.d.ts +3 -0
- package/dist/types/plugins/pulsepoint/index.d.ts.map +1 -0
- package/dist/types/plugins/pulsepoint/pulsepoint.plugin.d.ts +61 -0
- package/dist/types/plugins/pulsepoint/pulsepoint.plugin.d.ts.map +1 -0
- package/dist/types/plugins/traffic/arizona-traffic.plugin.d.ts +83 -0
- package/dist/types/plugins/traffic/arizona-traffic.plugin.d.ts.map +1 -0
- package/dist/types/plugins/traffic/index.d.ts +3 -0
- package/dist/types/plugins/traffic/index.d.ts.map +1 -0
- package/dist/types/plugins/weather/index.d.ts +3 -0
- package/dist/types/plugins/weather/index.d.ts.map +1 -0
- package/dist/types/plugins/weather/nws-weather.plugin.d.ts +50 -0
- package/dist/types/plugins/weather/nws-weather.plugin.d.ts.map +1 -0
- package/dist/types/schemas/alert.schema.d.ts +266 -0
- package/dist/types/schemas/alert.schema.d.ts.map +1 -0
- package/dist/types/schemas/index.d.ts +5 -0
- package/dist/types/schemas/index.d.ts.map +1 -0
- package/dist/types/schemas/query.schema.d.ts +150 -0
- package/dist/types/schemas/query.schema.d.ts.map +1 -0
- package/dist/types/types/alert.d.ts +96 -0
- package/dist/types/types/alert.d.ts.map +1 -0
- package/dist/types/types/config.d.ts +63 -0
- package/dist/types/types/config.d.ts.map +1 -0
- package/dist/types/types/geo.d.ts +33 -0
- package/dist/types/types/geo.d.ts.map +1 -0
- package/dist/types/types/index.d.ts +9 -0
- package/dist/types/types/index.d.ts.map +1 -0
- package/dist/types/types/plugin.d.ts +125 -0
- package/dist/types/types/plugin.d.ts.map +1 -0
- package/dist/types/types/query.d.ts +86 -0
- package/dist/types/types/query.d.ts.map +1 -0
- package/dist/types/utils/cache.d.ts +112 -0
- package/dist/types/utils/cache.d.ts.map +1 -0
- package/dist/types/utils/csv.d.ts +38 -0
- package/dist/types/utils/csv.d.ts.map +1 -0
- package/dist/types/utils/date.d.ts +47 -0
- package/dist/types/utils/date.d.ts.map +1 -0
- package/dist/types/utils/index.d.ts +7 -0
- package/dist/types/utils/index.d.ts.map +1 -0
- package/dist/types/utils/retry.d.ts +51 -0
- package/dist/types/utils/retry.d.ts.map +1 -0
- package/package.json +115 -0
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AlertFeed = void 0;
|
|
4
|
+
const types_1 = require("../types");
|
|
5
|
+
const plugin_registry_1 = require("./plugin-registry");
|
|
6
|
+
const plugin_resolver_1 = require("./plugin-resolver");
|
|
7
|
+
const alert_aggregator_1 = require("./alert-aggregator");
|
|
8
|
+
const time_range_1 = require("./time-range");
|
|
9
|
+
const errors_1 = require("../errors");
|
|
10
|
+
const utils_1 = require("../utils");
|
|
11
|
+
/**
|
|
12
|
+
* Main AlertFeed class that coordinates plugin fetching and alert aggregation.
|
|
13
|
+
*/
|
|
14
|
+
class AlertFeed {
|
|
15
|
+
registry;
|
|
16
|
+
resolver;
|
|
17
|
+
aggregator;
|
|
18
|
+
config;
|
|
19
|
+
constructor(config) {
|
|
20
|
+
this.registry = new plugin_registry_1.PluginRegistry();
|
|
21
|
+
this.resolver = new plugin_resolver_1.PluginResolver();
|
|
22
|
+
this.aggregator = new alert_aggregator_1.AlertAggregator();
|
|
23
|
+
this.config = {
|
|
24
|
+
defaultCacheTtlMs: config?.defaultCacheTtlMs ?? 5 * 60 * 1000,
|
|
25
|
+
pluginTimeoutMs: config?.pluginTimeoutMs ?? 30 * 1000,
|
|
26
|
+
continueOnPluginError: config?.continueOnPluginError ?? true,
|
|
27
|
+
maxConcurrentFetches: config?.maxConcurrentFetches ?? 5,
|
|
28
|
+
};
|
|
29
|
+
// Register initial plugins if provided
|
|
30
|
+
if (config?.plugins) {
|
|
31
|
+
// Don't await here - call registerPlugins separately
|
|
32
|
+
this.registerPluginsSync(config.plugins);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Register plugins synchronously (for constructor use).
|
|
37
|
+
* Initialization happens lazily on first query.
|
|
38
|
+
*/
|
|
39
|
+
registerPluginsSync(registrations) {
|
|
40
|
+
for (const reg of registrations) {
|
|
41
|
+
// Queue registration without awaiting
|
|
42
|
+
this.registry.register(reg).catch(() => {
|
|
43
|
+
// Errors will be caught on first query
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Register plugins with the feed.
|
|
49
|
+
*
|
|
50
|
+
* @param registrations - Array of plugin registrations
|
|
51
|
+
*/
|
|
52
|
+
async registerPlugins(registrations) {
|
|
53
|
+
await this.registry.registerAll(registrations);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Register a single plugin.
|
|
57
|
+
*
|
|
58
|
+
* @param registration - Plugin registration
|
|
59
|
+
*/
|
|
60
|
+
async registerPlugin(registration) {
|
|
61
|
+
await this.registry.register(registration);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Unregister a plugin by ID.
|
|
65
|
+
*
|
|
66
|
+
* @param pluginId - The plugin ID to unregister
|
|
67
|
+
*/
|
|
68
|
+
async unregisterPlugin(pluginId) {
|
|
69
|
+
await this.registry.unregister(pluginId);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Query for alerts based on location and filters.
|
|
73
|
+
*
|
|
74
|
+
* @param query - Query parameters
|
|
75
|
+
* @returns Query response with alerts and metadata
|
|
76
|
+
*/
|
|
77
|
+
async query(query) {
|
|
78
|
+
// Normalize query parameters
|
|
79
|
+
const radiusMeters = query.radiusMeters ?? types_1.DEFAULT_QUERY_RADIUS_METERS;
|
|
80
|
+
const limit = query.limit ?? types_1.DEFAULT_QUERY_LIMIT;
|
|
81
|
+
const timeRange = (0, time_range_1.normalizeTimeRange)(query.timeRange);
|
|
82
|
+
// Get all enabled plugins
|
|
83
|
+
const allPlugins = this.registry.getAll(true);
|
|
84
|
+
// Resolve which plugins to query based on location and filters
|
|
85
|
+
const applicablePlugins = this.resolver.resolve(allPlugins, {
|
|
86
|
+
location: query.location,
|
|
87
|
+
categories: query.categories,
|
|
88
|
+
temporalTypes: query.temporalTypes,
|
|
89
|
+
});
|
|
90
|
+
// Fetch from all applicable plugins
|
|
91
|
+
const { alertSets, pluginResults } = await this.fetchFromPlugins(applicablePlugins, {
|
|
92
|
+
location: query.location,
|
|
93
|
+
radiusMeters,
|
|
94
|
+
timeRange,
|
|
95
|
+
limit,
|
|
96
|
+
categories: query.categories,
|
|
97
|
+
temporalTypes: query.temporalTypes,
|
|
98
|
+
}, query.includePluginResults ?? false);
|
|
99
|
+
// Aggregate alerts
|
|
100
|
+
const aggregatedAlerts = this.aggregator.aggregate(alertSets, {
|
|
101
|
+
minRiskLevel: query.minRiskLevel,
|
|
102
|
+
timeRange,
|
|
103
|
+
location: query.location,
|
|
104
|
+
radiusMeters,
|
|
105
|
+
limit,
|
|
106
|
+
});
|
|
107
|
+
const truncated = aggregatedAlerts.length < this.getTotalAlertCount(alertSets);
|
|
108
|
+
// Build response
|
|
109
|
+
const response = {
|
|
110
|
+
alerts: aggregatedAlerts,
|
|
111
|
+
meta: {
|
|
112
|
+
totalCount: aggregatedAlerts.length,
|
|
113
|
+
queriedAt: new Date().toISOString(),
|
|
114
|
+
timeRange,
|
|
115
|
+
location: query.location,
|
|
116
|
+
radiusMeters,
|
|
117
|
+
truncated,
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
if (query.includePluginResults) {
|
|
121
|
+
response.pluginResults = pluginResults;
|
|
122
|
+
}
|
|
123
|
+
return response;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Fetch alerts from multiple plugins with concurrency control.
|
|
127
|
+
*/
|
|
128
|
+
async fetchFromPlugins(plugins, options, includeResults) {
|
|
129
|
+
const alertSets = [];
|
|
130
|
+
const pluginResults = [];
|
|
131
|
+
// Process plugins with concurrency limit
|
|
132
|
+
const chunks = this.chunkArray(plugins, this.config.maxConcurrentFetches);
|
|
133
|
+
for (const chunk of chunks) {
|
|
134
|
+
const chunkResults = await Promise.all(chunk.map((plugin) => this.fetchFromPlugin(plugin, options)));
|
|
135
|
+
for (const result of chunkResults) {
|
|
136
|
+
alertSets.push(result.alerts);
|
|
137
|
+
if (includeResults) {
|
|
138
|
+
pluginResults.push(result.info);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return { alertSets, pluginResults };
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Fetch alerts from a single plugin with timeout handling.
|
|
146
|
+
*/
|
|
147
|
+
async fetchFromPlugin(plugin, options) {
|
|
148
|
+
const startTime = Date.now();
|
|
149
|
+
const pluginId = plugin.metadata.id;
|
|
150
|
+
const pluginName = plugin.metadata.name;
|
|
151
|
+
try {
|
|
152
|
+
const result = await (0, utils_1.withTimeout)(() => plugin.fetchAlerts(options), this.config.pluginTimeoutMs, `Plugin "${pluginId}" timed out`);
|
|
153
|
+
return {
|
|
154
|
+
alerts: result.alerts,
|
|
155
|
+
info: {
|
|
156
|
+
pluginId,
|
|
157
|
+
pluginName,
|
|
158
|
+
success: true,
|
|
159
|
+
alertCount: result.alerts.length,
|
|
160
|
+
durationMs: Date.now() - startTime,
|
|
161
|
+
fromCache: result.fromCache,
|
|
162
|
+
warnings: result.warnings,
|
|
163
|
+
},
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
const durationMs = Date.now() - startTime;
|
|
168
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
169
|
+
const info = {
|
|
170
|
+
pluginId,
|
|
171
|
+
pluginName,
|
|
172
|
+
success: false,
|
|
173
|
+
alertCount: 0,
|
|
174
|
+
durationMs,
|
|
175
|
+
error: errorMessage,
|
|
176
|
+
};
|
|
177
|
+
if (!this.config.continueOnPluginError) {
|
|
178
|
+
if (error instanceof errors_1.PluginTimeoutError) {
|
|
179
|
+
throw error;
|
|
180
|
+
}
|
|
181
|
+
throw new errors_1.PluginFetchError(pluginId, errorMessage, error instanceof Error ? error : undefined);
|
|
182
|
+
}
|
|
183
|
+
return { alerts: [], info };
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Get total count of alerts across all sets.
|
|
188
|
+
*/
|
|
189
|
+
getTotalAlertCount(alertSets) {
|
|
190
|
+
return alertSets.reduce((sum, set) => sum + set.length, 0);
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Split an array into chunks.
|
|
194
|
+
*/
|
|
195
|
+
chunkArray(array, size) {
|
|
196
|
+
const chunks = [];
|
|
197
|
+
for (let i = 0; i < array.length; i += size) {
|
|
198
|
+
chunks.push(array.slice(i, i + size));
|
|
199
|
+
}
|
|
200
|
+
return chunks;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Get registered plugin metadata.
|
|
204
|
+
*
|
|
205
|
+
* @param enabledOnly - Only return enabled plugins (default: true)
|
|
206
|
+
*/
|
|
207
|
+
getPluginMetadata(enabledOnly = true) {
|
|
208
|
+
return this.registry.getMetadata(enabledOnly);
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Check if a plugin is registered.
|
|
212
|
+
*/
|
|
213
|
+
hasPlugin(pluginId) {
|
|
214
|
+
return this.registry.has(pluginId);
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Enable a plugin.
|
|
218
|
+
*/
|
|
219
|
+
async enablePlugin(pluginId) {
|
|
220
|
+
await this.registry.enable(pluginId);
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Disable a plugin.
|
|
224
|
+
*/
|
|
225
|
+
disablePlugin(pluginId) {
|
|
226
|
+
this.registry.disable(pluginId);
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Dispose of the feed and all plugins.
|
|
230
|
+
*/
|
|
231
|
+
async dispose() {
|
|
232
|
+
await this.registry.dispose();
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
exports.AlertFeed = AlertFeed;
|
|
236
|
+
//# sourceMappingURL=alert-feed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alert-feed.js","sourceRoot":"","sources":["../../../src/core/alert-feed.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isTimeRangeCurrent = exports.isTimeRangeInFuture = exports.isTimeRangeInPast = exports.getTimeRangeDuration = exports.normalizeTimeRange = exports.getDefaultTimeRangePreset = exports.getDefaultTimeRange = exports.resolveTimeRangePreset = exports.resolveTimeRange = exports.AlertAggregator = exports.PluginResolver = exports.PluginRegistry = exports.AlertFeed = void 0;
|
|
4
|
+
var alert_feed_1 = require("./alert-feed");
|
|
5
|
+
Object.defineProperty(exports, "AlertFeed", { enumerable: true, get: function () { return alert_feed_1.AlertFeed; } });
|
|
6
|
+
var plugin_registry_1 = require("./plugin-registry");
|
|
7
|
+
Object.defineProperty(exports, "PluginRegistry", { enumerable: true, get: function () { return plugin_registry_1.PluginRegistry; } });
|
|
8
|
+
var plugin_resolver_1 = require("./plugin-resolver");
|
|
9
|
+
Object.defineProperty(exports, "PluginResolver", { enumerable: true, get: function () { return plugin_resolver_1.PluginResolver; } });
|
|
10
|
+
var alert_aggregator_1 = require("./alert-aggregator");
|
|
11
|
+
Object.defineProperty(exports, "AlertAggregator", { enumerable: true, get: function () { return alert_aggregator_1.AlertAggregator; } });
|
|
12
|
+
var time_range_1 = require("./time-range");
|
|
13
|
+
Object.defineProperty(exports, "resolveTimeRange", { enumerable: true, get: function () { return time_range_1.resolveTimeRange; } });
|
|
14
|
+
Object.defineProperty(exports, "resolveTimeRangePreset", { enumerable: true, get: function () { return time_range_1.resolveTimeRangePreset; } });
|
|
15
|
+
Object.defineProperty(exports, "getDefaultTimeRange", { enumerable: true, get: function () { return time_range_1.getDefaultTimeRange; } });
|
|
16
|
+
Object.defineProperty(exports, "getDefaultTimeRangePreset", { enumerable: true, get: function () { return time_range_1.getDefaultTimeRangePreset; } });
|
|
17
|
+
Object.defineProperty(exports, "normalizeTimeRange", { enumerable: true, get: function () { return time_range_1.normalizeTimeRange; } });
|
|
18
|
+
Object.defineProperty(exports, "getTimeRangeDuration", { enumerable: true, get: function () { return time_range_1.getTimeRangeDuration; } });
|
|
19
|
+
Object.defineProperty(exports, "isTimeRangeInPast", { enumerable: true, get: function () { return time_range_1.isTimeRangeInPast; } });
|
|
20
|
+
Object.defineProperty(exports, "isTimeRangeInFuture", { enumerable: true, get: function () { return time_range_1.isTimeRangeInFuture; } });
|
|
21
|
+
Object.defineProperty(exports, "isTimeRangeCurrent", { enumerable: true, get: function () { return time_range_1.isTimeRangeCurrent; } });
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/index.ts"],"names":[],"mappings":";;;AAAA,2CAAyC;AAAhC,uGAAA,SAAS,OAAA;AAClB,qDAAmD;AAA1C,iHAAA,cAAc,OAAA;AACvB,qDAAmD;AAA1C,iHAAA,cAAc,OAAA;AAEvB,uDAAqD;AAA5C,mHAAA,eAAe,OAAA;AAExB,2CAUsB;AATpB,8GAAA,gBAAgB,OAAA;AAChB,oHAAA,sBAAsB,OAAA;AACtB,iHAAA,mBAAmB,OAAA;AACnB,uHAAA,yBAAyB,OAAA;AACzB,gHAAA,kBAAkB,OAAA;AAClB,kHAAA,oBAAoB,OAAA;AACpB,+GAAA,iBAAiB,OAAA;AACjB,iHAAA,mBAAmB,OAAA;AACnB,gHAAA,kBAAkB,OAAA"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PluginRegistry = void 0;
|
|
4
|
+
const errors_1 = require("../errors");
|
|
5
|
+
/**
|
|
6
|
+
* Registry for managing alert plugins.
|
|
7
|
+
*
|
|
8
|
+
* Handles registration, initialization, and lifecycle of plugins.
|
|
9
|
+
*/
|
|
10
|
+
class PluginRegistry {
|
|
11
|
+
plugins = new Map();
|
|
12
|
+
/**
|
|
13
|
+
* Register a single plugin.
|
|
14
|
+
*
|
|
15
|
+
* @param registration - Plugin registration details
|
|
16
|
+
* @throws DuplicatePluginError if a plugin with the same ID is already registered
|
|
17
|
+
*/
|
|
18
|
+
async register(registration) {
|
|
19
|
+
const { plugin, config, enabled = true } = registration;
|
|
20
|
+
const pluginId = plugin.metadata.id;
|
|
21
|
+
if (this.plugins.has(pluginId)) {
|
|
22
|
+
throw new errors_1.DuplicatePluginError(pluginId);
|
|
23
|
+
}
|
|
24
|
+
const entry = {
|
|
25
|
+
plugin,
|
|
26
|
+
config,
|
|
27
|
+
enabled,
|
|
28
|
+
initialized: false,
|
|
29
|
+
};
|
|
30
|
+
this.plugins.set(pluginId, entry);
|
|
31
|
+
// Initialize if enabled
|
|
32
|
+
if (enabled) {
|
|
33
|
+
await this.initializePlugin(entry);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Register multiple plugins at once.
|
|
38
|
+
*
|
|
39
|
+
* @param registrations - Array of plugin registrations
|
|
40
|
+
*/
|
|
41
|
+
async registerAll(registrations) {
|
|
42
|
+
for (const registration of registrations) {
|
|
43
|
+
await this.register(registration);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Unregister a plugin by ID.
|
|
48
|
+
*
|
|
49
|
+
* @param pluginId - The plugin ID to unregister
|
|
50
|
+
* @throws PluginNotFoundError if the plugin is not registered
|
|
51
|
+
*/
|
|
52
|
+
async unregister(pluginId) {
|
|
53
|
+
const entry = this.plugins.get(pluginId);
|
|
54
|
+
if (!entry) {
|
|
55
|
+
throw new errors_1.PluginNotFoundError(pluginId);
|
|
56
|
+
}
|
|
57
|
+
// Dispose if initialized
|
|
58
|
+
if (entry.initialized && entry.plugin.dispose) {
|
|
59
|
+
await entry.plugin.dispose();
|
|
60
|
+
}
|
|
61
|
+
this.plugins.delete(pluginId);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Get a plugin by ID.
|
|
65
|
+
*
|
|
66
|
+
* @param pluginId - The plugin ID to retrieve
|
|
67
|
+
* @returns The plugin instance or undefined if not found
|
|
68
|
+
*/
|
|
69
|
+
get(pluginId) {
|
|
70
|
+
return this.plugins.get(pluginId)?.plugin;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Get all registered plugins.
|
|
74
|
+
*
|
|
75
|
+
* @param enabledOnly - If true, only return enabled plugins (default: true)
|
|
76
|
+
* @returns Array of plugin instances
|
|
77
|
+
*/
|
|
78
|
+
getAll(enabledOnly = true) {
|
|
79
|
+
const plugins = [];
|
|
80
|
+
for (const entry of this.plugins.values()) {
|
|
81
|
+
if (!enabledOnly || entry.enabled) {
|
|
82
|
+
plugins.push(entry.plugin);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return plugins;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Get metadata for all registered plugins.
|
|
89
|
+
*
|
|
90
|
+
* @param enabledOnly - If true, only return enabled plugins
|
|
91
|
+
* @returns Array of plugin metadata
|
|
92
|
+
*/
|
|
93
|
+
getMetadata(enabledOnly = true) {
|
|
94
|
+
return this.getAll(enabledOnly).map((p) => p.metadata);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Check if a plugin is registered.
|
|
98
|
+
*
|
|
99
|
+
* @param pluginId - The plugin ID to check
|
|
100
|
+
* @returns true if the plugin is registered
|
|
101
|
+
*/
|
|
102
|
+
has(pluginId) {
|
|
103
|
+
return this.plugins.has(pluginId);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Enable a registered plugin.
|
|
107
|
+
*
|
|
108
|
+
* @param pluginId - The plugin ID to enable
|
|
109
|
+
*/
|
|
110
|
+
async enable(pluginId) {
|
|
111
|
+
const entry = this.plugins.get(pluginId);
|
|
112
|
+
if (!entry) {
|
|
113
|
+
throw new errors_1.PluginNotFoundError(pluginId);
|
|
114
|
+
}
|
|
115
|
+
entry.enabled = true;
|
|
116
|
+
if (!entry.initialized) {
|
|
117
|
+
await this.initializePlugin(entry);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Disable a registered plugin.
|
|
122
|
+
*
|
|
123
|
+
* @param pluginId - The plugin ID to disable
|
|
124
|
+
*/
|
|
125
|
+
disable(pluginId) {
|
|
126
|
+
const entry = this.plugins.get(pluginId);
|
|
127
|
+
if (!entry) {
|
|
128
|
+
throw new errors_1.PluginNotFoundError(pluginId);
|
|
129
|
+
}
|
|
130
|
+
entry.enabled = false;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Check if a plugin is enabled.
|
|
134
|
+
*
|
|
135
|
+
* @param pluginId - The plugin ID to check
|
|
136
|
+
* @returns true if the plugin is enabled
|
|
137
|
+
*/
|
|
138
|
+
isEnabled(pluginId) {
|
|
139
|
+
return this.plugins.get(pluginId)?.enabled ?? false;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Get the number of registered plugins.
|
|
143
|
+
*
|
|
144
|
+
* @param enabledOnly - If true, only count enabled plugins
|
|
145
|
+
*/
|
|
146
|
+
size(enabledOnly = false) {
|
|
147
|
+
if (!enabledOnly) {
|
|
148
|
+
return this.plugins.size;
|
|
149
|
+
}
|
|
150
|
+
let count = 0;
|
|
151
|
+
for (const entry of this.plugins.values()) {
|
|
152
|
+
if (entry.enabled)
|
|
153
|
+
count++;
|
|
154
|
+
}
|
|
155
|
+
return count;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Dispose all plugins and clear the registry.
|
|
159
|
+
*/
|
|
160
|
+
async dispose() {
|
|
161
|
+
for (const entry of this.plugins.values()) {
|
|
162
|
+
if (entry.initialized && entry.plugin.dispose) {
|
|
163
|
+
try {
|
|
164
|
+
await entry.plugin.dispose();
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
// Ignore disposal errors
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
this.plugins.clear();
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Initialize a plugin.
|
|
175
|
+
*/
|
|
176
|
+
async initializePlugin(entry) {
|
|
177
|
+
if (entry.initialized)
|
|
178
|
+
return;
|
|
179
|
+
const pluginId = entry.plugin.metadata.id;
|
|
180
|
+
try {
|
|
181
|
+
if (entry.plugin.initialize) {
|
|
182
|
+
await entry.plugin.initialize(entry.config);
|
|
183
|
+
}
|
|
184
|
+
entry.initialized = true;
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
188
|
+
throw new errors_1.PluginInitializationError(pluginId, message, error instanceof Error ? error : undefined);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
exports.PluginRegistry = PluginRegistry;
|
|
193
|
+
//# sourceMappingURL=plugin-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-registry.js","sourceRoot":"","sources":["../../../src/core/plugin-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PluginResolver = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Resolves which plugins are applicable for a given query.
|
|
6
|
+
*
|
|
7
|
+
* Determines plugin coverage based on:
|
|
8
|
+
* - Geographic coverage (global or regional with center + radius)
|
|
9
|
+
* - Supported alert categories
|
|
10
|
+
* - Supported temporal types
|
|
11
|
+
*/
|
|
12
|
+
class PluginResolver {
|
|
13
|
+
/**
|
|
14
|
+
* Resolve which plugins cover the given location and match the filters.
|
|
15
|
+
*
|
|
16
|
+
* @param plugins - Available plugins to check
|
|
17
|
+
* @param options - Resolution options including location and filters
|
|
18
|
+
* @returns Array of plugins that match all criteria
|
|
19
|
+
*/
|
|
20
|
+
resolve(plugins, options) {
|
|
21
|
+
const { location, categories, temporalTypes } = options;
|
|
22
|
+
return plugins.filter((plugin) => {
|
|
23
|
+
// Check location coverage
|
|
24
|
+
if (!plugin.coversLocation(location)) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
// Check category support
|
|
28
|
+
if (categories && categories.length > 0) {
|
|
29
|
+
const supported = plugin.metadata.supportedCategories;
|
|
30
|
+
const hasCategory = categories.some((c) => supported.includes(c));
|
|
31
|
+
if (!hasCategory) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// Check temporal type support
|
|
36
|
+
if (temporalTypes && temporalTypes.length > 0) {
|
|
37
|
+
const supported = plugin.metadata.supportedTemporalTypes;
|
|
38
|
+
const hasTemporalType = temporalTypes.some((t) => supported.includes(t));
|
|
39
|
+
if (!hasTemporalType) {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return true;
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Resolve plugins with detailed coverage information.
|
|
48
|
+
*
|
|
49
|
+
* @param plugins - Available plugins to check
|
|
50
|
+
* @param options - Resolution options
|
|
51
|
+
* @returns Array of resolved plugins with coverage details
|
|
52
|
+
*/
|
|
53
|
+
resolveWithDetails(plugins, options) {
|
|
54
|
+
const { location, categories, temporalTypes } = options;
|
|
55
|
+
return plugins.map((plugin) => {
|
|
56
|
+
const coversLocation = plugin.coversLocation(location);
|
|
57
|
+
let supportsCategories = true;
|
|
58
|
+
if (categories && categories.length > 0) {
|
|
59
|
+
const supported = plugin.metadata.supportedCategories;
|
|
60
|
+
supportsCategories = categories.some((c) => supported.includes(c));
|
|
61
|
+
}
|
|
62
|
+
let supportsTemporalTypes = true;
|
|
63
|
+
if (temporalTypes && temporalTypes.length > 0) {
|
|
64
|
+
const supported = plugin.metadata.supportedTemporalTypes;
|
|
65
|
+
supportsTemporalTypes = temporalTypes.some((t) => supported.includes(t));
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
plugin,
|
|
69
|
+
coversLocation,
|
|
70
|
+
supportsCategories,
|
|
71
|
+
supportsTemporalTypes,
|
|
72
|
+
};
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Get plugins that cover a specific location (regardless of category/temporal filters).
|
|
77
|
+
*
|
|
78
|
+
* @param plugins - Available plugins
|
|
79
|
+
* @param location - The location to check
|
|
80
|
+
* @returns Plugins that cover the location
|
|
81
|
+
*/
|
|
82
|
+
getPluginsForLocation(plugins, location) {
|
|
83
|
+
return plugins.filter((plugin) => plugin.coversLocation(location));
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Get plugins that support specific categories.
|
|
87
|
+
*
|
|
88
|
+
* @param plugins - Available plugins
|
|
89
|
+
* @param categories - Categories to filter by
|
|
90
|
+
* @returns Plugins that support at least one of the specified categories
|
|
91
|
+
*/
|
|
92
|
+
getPluginsForCategories(plugins, categories) {
|
|
93
|
+
if (categories.length === 0) {
|
|
94
|
+
return plugins;
|
|
95
|
+
}
|
|
96
|
+
return plugins.filter((plugin) => {
|
|
97
|
+
const supported = plugin.metadata.supportedCategories;
|
|
98
|
+
return categories.some((c) => supported.includes(c));
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Get global plugins (plugins that cover all locations).
|
|
103
|
+
*
|
|
104
|
+
* @param plugins - Available plugins
|
|
105
|
+
* @returns Plugins with global coverage
|
|
106
|
+
*/
|
|
107
|
+
getGlobalPlugins(plugins) {
|
|
108
|
+
return plugins.filter((plugin) => plugin.metadata.coverage.type === 'global');
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Get regional plugins (plugins that cover specific geographic areas).
|
|
112
|
+
*
|
|
113
|
+
* @param plugins - Available plugins
|
|
114
|
+
* @returns Plugins with regional coverage
|
|
115
|
+
*/
|
|
116
|
+
getRegionalPlugins(plugins) {
|
|
117
|
+
return plugins.filter((plugin) => plugin.metadata.coverage.type === 'regional');
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
exports.PluginResolver = PluginResolver;
|
|
121
|
+
//# sourceMappingURL=plugin-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-resolver.js","sourceRoot":"","sources":["../../../src/core/plugin-resolver.ts"],"names":[],"mappings":";;;AAwBA;;;;;;;GAOG;AACH,MAAa,cAAc;IACzB;;;;;;OAMG;IACH,OAAO,CAAC,OAAsB,EAAE,OAA6B;QAC3D,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;QAExD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;YAC/B,0BAA0B;YAC1B,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACrC,OAAO,KAAK,CAAC;YACf,CAAC;YAED,yBAAyB;YACzB,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxC,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC;gBACtD,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;gBAClE,IAAI,CAAC,WAAW,EAAE,CAAC;oBACjB,OAAO,KAAK,CAAC;gBACf,CAAC;YACH,CAAC;YAED,8BAA8B;YAC9B,IAAI,aAAa,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9C,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAC;gBACzD,MAAM,eAAe,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzE,IAAI,CAAC,eAAe,EAAE,CAAC;oBACrB,OAAO,KAAK,CAAC;gBACf,CAAC;YACH,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACH,kBAAkB,CAAC,OAAsB,EAAE,OAA6B;QACtE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;QAExD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YAC5B,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YAEvD,IAAI,kBAAkB,GAAG,IAAI,CAAC;YAC9B,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxC,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC;gBACtD,kBAAkB,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YACrE,CAAC;YAED,IAAI,qBAAqB,GAAG,IAAI,CAAC;YACjC,IAAI,aAAa,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9C,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAC;gBACzD,qBAAqB,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3E,CAAC;YAED,OAAO;gBACL,MAAM;gBACN,cAAc;gBACd,kBAAkB;gBAClB,qBAAqB;aACtB,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACH,qBAAqB,CAAC,OAAsB,EAAE,QAAkB;QAC9D,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;IACrE,CAAC;IAED;;;;;;OAMG;IACH,uBAAuB,CAAC,OAAsB,EAAE,UAA2B;QACzE,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;YAC/B,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC;YACtD,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,gBAAgB,CAAC,OAAsB;QACrC,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IAChF,CAAC;IAED;;;;;OAKG;IACH,kBAAkB,CAAC,OAAsB;QACvC,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;IAClF,CAAC;CACF;AAzHD,wCAyHC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveTimeRangePreset = exports.resolveTimeRange = void 0;
|
|
4
|
+
exports.getDefaultTimeRangePreset = getDefaultTimeRangePreset;
|
|
5
|
+
exports.getDefaultTimeRange = getDefaultTimeRange;
|
|
6
|
+
exports.normalizeTimeRange = normalizeTimeRange;
|
|
7
|
+
exports.getTimeRangeDuration = getTimeRangeDuration;
|
|
8
|
+
exports.isTimeRangeInPast = isTimeRangeInPast;
|
|
9
|
+
exports.isTimeRangeInFuture = isTimeRangeInFuture;
|
|
10
|
+
exports.isTimeRangeCurrent = isTimeRangeCurrent;
|
|
11
|
+
const utils_1 = require("../utils");
|
|
12
|
+
Object.defineProperty(exports, "resolveTimeRangePreset", { enumerable: true, get: function () { return utils_1.resolveTimeRangePreset; } });
|
|
13
|
+
/**
|
|
14
|
+
* Re-export time range utilities for use in core module.
|
|
15
|
+
*/
|
|
16
|
+
exports.resolveTimeRange = utils_1.resolveTimeRange;
|
|
17
|
+
/**
|
|
18
|
+
* Get the default time range preset.
|
|
19
|
+
*/
|
|
20
|
+
function getDefaultTimeRangePreset() {
|
|
21
|
+
return 'next-24h';
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Get the default resolved time range.
|
|
25
|
+
*/
|
|
26
|
+
function getDefaultTimeRange() {
|
|
27
|
+
return (0, utils_1.resolveTimeRangePreset)(getDefaultTimeRangePreset(), new Date());
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Normalize a time range input to an explicit TimeRange.
|
|
31
|
+
*
|
|
32
|
+
* @param input - Time range input (preset or explicit)
|
|
33
|
+
* @param defaultPreset - Default preset to use if input is undefined
|
|
34
|
+
* @returns Normalized TimeRange
|
|
35
|
+
*/
|
|
36
|
+
function normalizeTimeRange(input, defaultPreset = 'next-24h') {
|
|
37
|
+
if (!input) {
|
|
38
|
+
return (0, utils_1.resolveTimeRangePreset)(defaultPreset, new Date());
|
|
39
|
+
}
|
|
40
|
+
return (0, utils_1.resolveTimeRange)(input, new Date());
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get the duration of a time range in milliseconds.
|
|
44
|
+
*/
|
|
45
|
+
function getTimeRangeDuration(range) {
|
|
46
|
+
return new Date(range.end).getTime() - new Date(range.start).getTime();
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Check if a time range is in the past.
|
|
50
|
+
*/
|
|
51
|
+
function isTimeRangeInPast(range) {
|
|
52
|
+
return new Date(range.end).getTime() < Date.now();
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Check if a time range is in the future.
|
|
56
|
+
*/
|
|
57
|
+
function isTimeRangeInFuture(range) {
|
|
58
|
+
return new Date(range.start).getTime() > Date.now();
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Check if a time range spans the current time.
|
|
62
|
+
*/
|
|
63
|
+
function isTimeRangeCurrent(range) {
|
|
64
|
+
const now = Date.now();
|
|
65
|
+
return new Date(range.start).getTime() <= now && new Date(range.end).getTime() >= now;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=time-range.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time-range.js","sourceRoot":"","sources":["../../../src/core/time-range.ts"],"names":[],"mappings":";;;AAYA,8DAEC;AAKD,kDAEC;AASD,gDASC;AAKD,oDAEC;AAKD,8CAEC;AAKD,kDAEC;AAKD,gDAGC;AAnED,oCAA4F;AAMnF,uGAN0C,8BAAsB,OAM1C;AAJ/B;;GAEG;AACU,QAAA,gBAAgB,GAAG,wBAAoB,CAAC;AAGrD;;GAEG;AACH,SAAgB,yBAAyB;IACvC,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB;IACjC,OAAO,IAAA,8BAAsB,EAAC,yBAAyB,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;AACzE,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,kBAAkB,CAChC,KAAsB,EACtB,gBAAiC,UAAU;IAE3C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAA,8BAAsB,EAAC,aAAa,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,IAAA,wBAAoB,EAAC,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,SAAgB,oBAAoB,CAAC,KAAgB;IACnD,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;AACzE,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,KAAgB;IAChD,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB,CAAC,KAAgB;IAClD,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAAC,KAAgB;IACjD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,IAAI,GAAG,CAAC;AACxF,CAAC"}
|