atmosx-nwws-parser 1.0.19 → 1.0.22
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/README.md +182 -64
- package/dist/cjs/index.cjs +3799 -0
- package/dist/esm/index.mjs +3757 -0
- package/package.json +49 -37
- package/src/bootstrap.ts +196 -0
- package/src/database.ts +148 -0
- package/src/dictionaries/awips.ts +342 -0
- package/src/dictionaries/events.ts +142 -0
- package/src/dictionaries/icao.ts +237 -0
- package/src/dictionaries/offshore.ts +12 -0
- package/src/dictionaries/signatures.ts +107 -0
- package/src/eas.ts +493 -0
- package/src/index.ts +229 -0
- package/src/parsers/events/api.ts +151 -0
- package/src/parsers/events/cap.ts +138 -0
- package/src/parsers/events/text.ts +106 -0
- package/src/parsers/events/ugc.ts +109 -0
- package/src/parsers/events/vtec.ts +78 -0
- package/src/parsers/events.ts +367 -0
- package/src/parsers/hvtec.ts +46 -0
- package/src/parsers/pvtec.ts +71 -0
- package/src/parsers/stanza.ts +132 -0
- package/src/parsers/text.ts +166 -0
- package/src/parsers/ugc.ts +197 -0
- package/src/types.ts +251 -0
- package/src/utils.ts +314 -0
- package/src/xmpp.ts +144 -0
- package/test.js +58 -34
- package/tsconfig.json +12 -5
- package/tsup.config.ts +14 -0
- package/bootstrap.ts +0 -122
- package/dist/bootstrap.js +0 -153
- package/dist/src/events.js +0 -585
- package/dist/src/helper.js +0 -463
- package/dist/src/stanza.js +0 -147
- package/dist/src/text-parser.js +0 -119
- package/dist/src/ugc.js +0 -214
- package/dist/src/vtec.js +0 -125
- package/src/events.ts +0 -394
- package/src/helper.ts +0 -298
- package/src/stanza.ts +0 -102
- package/src/text-parser.ts +0 -120
- package/src/ugc.ts +0 -122
- package/src/vtec.ts +0 -99
package/src/xmpp.ts
ADDED
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/*
|
|
2
|
+
_ _ __ __
|
|
3
|
+
/\ | | | | (_) \ \ / /
|
|
4
|
+
/ \ | |_ _ __ ___ ___ ___ _ __ | |__ ___ _ __ _ ___ \ V /
|
|
5
|
+
/ /\ \| __| "_ ` _ \ / _ \/ __| "_ \| "_ \ / _ \ "__| |/ __| > <
|
|
6
|
+
/ ____ \ |_| | | | | | (_) \__ \ |_) | | | | __/ | | | (__ / . \
|
|
7
|
+
/_/ \_\__|_| |_| |_|\___/|___/ .__/|_| |_|\___|_| |_|\___/_/ \_\
|
|
8
|
+
| |
|
|
9
|
+
|_|
|
|
10
|
+
|
|
11
|
+
Written by: KiyoWx (k3yomi)
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
import * as loader from './bootstrap';
|
|
16
|
+
import * as types from './types';
|
|
17
|
+
import Utils from './utils';
|
|
18
|
+
import StanzaParser from './parsers/stanza';
|
|
19
|
+
import Database from './database';
|
|
20
|
+
import EventParser from './parsers/events';
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
export class Xmpp {
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* @function isSessionReconnectionEligible
|
|
27
|
+
* @description
|
|
28
|
+
* Checks if the XMPP session has been inactive longer than the given interval
|
|
29
|
+
* and, if so, attempts a controlled reconnection.
|
|
30
|
+
*
|
|
31
|
+
* @async
|
|
32
|
+
* @static
|
|
33
|
+
* @param {number} currentInterval
|
|
34
|
+
* @returns {Promise<void>}
|
|
35
|
+
*/
|
|
36
|
+
public static async isSessionReconnectionEligible(currentInterval: number): Promise<void> {
|
|
37
|
+
const settings = loader.settings as types.ClientSettingsTypes;
|
|
38
|
+
const lastStanzaElapsed = Date.now() - loader.cache.lastStanza;
|
|
39
|
+
const threshold = currentInterval * 1000;
|
|
40
|
+
if ((!loader.cache.isConnected && !loader.cache.sigHalt) || !loader.cache.session) { return; }
|
|
41
|
+
if (lastStanzaElapsed < threshold) { return; }
|
|
42
|
+
if (loader.cache.attemptingReconnect) { return; }
|
|
43
|
+
loader.cache.attemptingReconnect = true;
|
|
44
|
+
loader.cache.isConnected = false;
|
|
45
|
+
loader.cache.totalReconnects += 1;
|
|
46
|
+
try {
|
|
47
|
+
loader.cache.events.emit("onReconnection", {
|
|
48
|
+
reconnects: loader.cache.totalReconnects,
|
|
49
|
+
lastStanza: lastStanzaElapsed,
|
|
50
|
+
lastName: settings.noaa_weather_wire_service_settings.credentials.nickname,
|
|
51
|
+
});
|
|
52
|
+
await loader.cache.session.stop().catch(() => {});
|
|
53
|
+
await loader.cache.session.start().catch(() => {});
|
|
54
|
+
} catch (err) {
|
|
55
|
+
Utils.warn(`XMPP reconnection failed: ${(err as Error).message}`);
|
|
56
|
+
} finally {
|
|
57
|
+
loader.cache.attemptingReconnect = false;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* @function deploySession
|
|
63
|
+
* @description
|
|
64
|
+
* Initializes the NOAA Weather Wire Service (NWWS-OI) XMPP client session and
|
|
65
|
+
* manages its lifecycle events including connection, disconnection, errors,
|
|
66
|
+
* and message handling.
|
|
67
|
+
*
|
|
68
|
+
* @async
|
|
69
|
+
* @static
|
|
70
|
+
* @returns {Promise<void>}
|
|
71
|
+
*/
|
|
72
|
+
public static async deploySession(): Promise<void> {
|
|
73
|
+
const settings = loader.settings as types.ClientSettingsTypes;
|
|
74
|
+
settings.noaa_weather_wire_service_settings.credentials.nickname ??= settings.noaa_weather_wire_service_settings.credentials.username;
|
|
75
|
+
loader.cache.session = loader.packages.xmpp.client({
|
|
76
|
+
service: 'xmpp://nwws-oi.weather.gov',
|
|
77
|
+
domain: 'nwws-oi.weather.gov',
|
|
78
|
+
username: settings.noaa_weather_wire_service_settings.credentials.username,
|
|
79
|
+
password: settings.noaa_weather_wire_service_settings.credentials.password,
|
|
80
|
+
});
|
|
81
|
+
loader.cache.session.on('online', async (address: string) => {
|
|
82
|
+
const now = Date.now();
|
|
83
|
+
if (loader.cache.lastConnect && now - loader.cache.lastConnect < 10_000) {
|
|
84
|
+
loader.cache.sigHalt = true;
|
|
85
|
+
Utils.warn(loader.definitions.messages.reconnect_too_fast);
|
|
86
|
+
await Utils.sleep(2_000);
|
|
87
|
+
await loader.cache.session.stop().catch(() => {});
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
loader.cache.isConnected = true;
|
|
91
|
+
loader.cache.sigHalt = false;
|
|
92
|
+
loader.cache.lastConnect = now;
|
|
93
|
+
loader.cache.session.send(loader.packages.xmpp.xml('presence', {
|
|
94
|
+
to: `nwws@conference.nwws-oi.weather.gov/${settings.noaa_weather_wire_service_settings.credentials.nickname}`,
|
|
95
|
+
xmlns: 'http://jabber.org/protocol/muc',
|
|
96
|
+
}));
|
|
97
|
+
loader.cache.events.emit('onConnection', settings.noaa_weather_wire_service_settings.credentials.nickname);
|
|
98
|
+
if (loader.cache.attemptingReconnect) return;
|
|
99
|
+
loader.cache.attemptingReconnect = true;
|
|
100
|
+
await Utils.sleep(15_000);
|
|
101
|
+
loader.cache.attemptingReconnect = false;
|
|
102
|
+
});
|
|
103
|
+
loader.cache.session.on('offline', () => {
|
|
104
|
+
loader.cache.isConnected = false;
|
|
105
|
+
loader.cache.sigHalt = true;
|
|
106
|
+
Utils.warn('XMPP connection went offline');
|
|
107
|
+
});
|
|
108
|
+
loader.cache.session.on('error', (error: Error) => {
|
|
109
|
+
loader.cache.isConnected = false;
|
|
110
|
+
loader.cache.sigHalt = true;
|
|
111
|
+
Utils.warn(`XMPP connection error: ${error.message}`);
|
|
112
|
+
});
|
|
113
|
+
loader.cache.session.on('stanza', async (stanza: any) => {
|
|
114
|
+
try {
|
|
115
|
+
loader.cache.lastStanza = Date.now();
|
|
116
|
+
if (stanza.is('message')) {
|
|
117
|
+
const validate = StanzaParser.validate(stanza);
|
|
118
|
+
const skipMessage = validate.ignore ||
|
|
119
|
+
(validate.isCap && !settings.noaa_weather_wire_service_settings.preferences.cap_only) ||
|
|
120
|
+
(!validate.isCap && settings.noaa_weather_wire_service_settings.preferences.cap_only) ||
|
|
121
|
+
(validate.isCap && !validate.isCapDescription);
|
|
122
|
+
if (skipMessage) return;
|
|
123
|
+
await EventParser.eventHandler(validate);
|
|
124
|
+
await Database.stanzaCacheImport(JSON.stringify(validate));
|
|
125
|
+
loader.cache.events.emit('onMessage', validate);
|
|
126
|
+
}
|
|
127
|
+
if (stanza.is('presence') && stanza.attrs.from?.startsWith('nwws@conference.nwws-oi.weather.gov/')) {
|
|
128
|
+
const occupant = stanza.attrs.from.split('/').slice(1).join('/');
|
|
129
|
+
loader.cache.events.emit('onOccupant', {
|
|
130
|
+
occupant,
|
|
131
|
+
type: stanza.attrs.type === 'unavailable' ? 'unavailable' : 'available',
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
} catch (err: unknown) {
|
|
135
|
+
Utils.warn(`Error processing stanza: ${(err as Error).message}`);
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
try { await loader.cache.session.start(); } catch (err: unknown) {
|
|
139
|
+
Utils.warn(`Failed to start XMPP session: ${(err as Error).message}`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export default Xmpp;
|
package/test.js
CHANGED
|
@@ -1,41 +1,65 @@
|
|
|
1
|
+
const { AlertManager } = require(`atmosx-nwws-parser`)
|
|
1
2
|
|
|
2
|
-
AtmosXWireParser = require(`./dist/src/helper.js`)
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
database:
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
4
|
+
const parser = new AlertManager({
|
|
5
|
+
database: `shapefile-manager.db`,
|
|
6
|
+
is_wire: true,
|
|
7
|
+
journal: true,
|
|
8
|
+
noaa_weather_wire_service_settings: {
|
|
9
|
+
reconnection_settings: {
|
|
10
|
+
enabled: true,
|
|
11
|
+
interval: 60,
|
|
12
|
+
},
|
|
13
|
+
credentials: {
|
|
14
|
+
username: `username123`,
|
|
15
|
+
password: `password123`,
|
|
16
|
+
nickname: "AtmosphericX Standalone Parser",
|
|
17
|
+
},
|
|
18
|
+
cache: {
|
|
19
|
+
enabled: true,
|
|
20
|
+
max_file_size: 5,
|
|
21
|
+
max_db_history: 5000,
|
|
22
|
+
directory: `cache`,
|
|
23
|
+
},
|
|
24
|
+
preferences: {
|
|
25
|
+
disable_ugc: false,
|
|
26
|
+
disable_vtec: false,
|
|
27
|
+
disable_text: false,
|
|
28
|
+
cap_only: false,
|
|
29
|
+
shapefile_coordinates: false,
|
|
30
|
+
}
|
|
10
31
|
},
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
cacheDir: `./cache`, // Directory for cache files
|
|
32
|
+
national_weather_service_settings: {
|
|
33
|
+
interval: 15,
|
|
34
|
+
endpoint: `https://api.weather.gov/alerts/active`,
|
|
15
35
|
},
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
36
|
+
global_settings: {
|
|
37
|
+
parent_events_only: true,
|
|
38
|
+
better_event_parsing: true,
|
|
39
|
+
filtering: {
|
|
40
|
+
events: [`Severe Thunderstorm Warning`],
|
|
41
|
+
filtered_icao: ["PAFC"],
|
|
42
|
+
ignored_icao: [`KWNS`],
|
|
43
|
+
ignored_events: [`Xx`, `Test Message`],
|
|
44
|
+
ugc_filter: [],
|
|
45
|
+
state_filter: [],
|
|
46
|
+
check_expired: true,
|
|
47
|
+
ignore_text_products: true,
|
|
48
|
+
location: {
|
|
49
|
+
unit: `miles`
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
eas_settings: {
|
|
53
|
+
directory: null,
|
|
54
|
+
intro_wav: null,
|
|
55
|
+
}
|
|
32
56
|
}
|
|
33
57
|
})
|
|
34
|
-
Client.onEvent(`onStormReport`, (report) => {});
|
|
35
|
-
Client.onEvent(`onMesoscaleDiscussion`, (discussions) => {});
|
|
36
|
-
Client.onEvent(`onMessage`, (message) => {});
|
|
37
|
-
Client.onEvent(`onOccupant`, (occupant) => {});
|
|
38
|
-
Client.onEvent(`onError`, (error) => {console.log(error)});
|
|
39
|
-
Client.onEvent(`onReconnect`, (service) => {})
|
|
40
|
-
Client.onEvent(`onConnection`, (c) => {})
|
|
41
58
|
|
|
59
|
+
parser.on(`onEvents`, (alerts) => {
|
|
60
|
+
for (const alert of alerts) {
|
|
61
|
+
if (alert.geometry != null) {
|
|
62
|
+
console.log(`[${alert.properties.issued}] ${alert.properties.event} for ${alert.properties.locations} (ID: ${alert.details.tracking})`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
});
|
package/tsconfig.json
CHANGED
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES6",
|
|
4
|
+
"module": "ESNext",
|
|
5
|
+
"moduleResolution": "Node",
|
|
6
|
+
"outDir": "dist",
|
|
7
|
+
"declaration": true,
|
|
8
|
+
"declarationDir": "dist/types",
|
|
9
|
+
"esModuleInterop": true,
|
|
10
|
+
"allowSyntheticDefaultImports": true,
|
|
11
|
+
"skipLibCheck": true
|
|
12
|
+
},
|
|
13
|
+
"include": ["src"]
|
|
7
14
|
}
|
package/tsup.config.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { defineConfig } from 'tsup'
|
|
2
|
+
|
|
3
|
+
export default defineConfig({
|
|
4
|
+
entry: ['src/index.ts'],
|
|
5
|
+
outDir: 'dist',
|
|
6
|
+
format: ['esm', 'cjs'],
|
|
7
|
+
clean: true,
|
|
8
|
+
outExtension({ format }) {
|
|
9
|
+
return { js: format === 'esm' ? '.mjs' : '.cjs' }
|
|
10
|
+
},
|
|
11
|
+
esbuildOptions(options, context) {
|
|
12
|
+
options.outdir = `dist/${context.format}`
|
|
13
|
+
},
|
|
14
|
+
})
|
package/bootstrap.ts
DELETED
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
_ _ __ __
|
|
3
|
-
/\ | | | | (_) \ \ / /
|
|
4
|
-
/ \ | |_ _ __ ___ ___ ___ _ __ | |__ ___ _ __ _ ___ \ V /
|
|
5
|
-
/ /\ \| __| '_ ` _ \ / _ \/ __| '_ \| '_ \ / _ \ '__| |/ __| > <
|
|
6
|
-
/ ____ \ |_| | | | | | (_) \__ \ |_) | | | | __/ | | | (__ / . \
|
|
7
|
-
/_/ \_\__|_| |_| |_|\___/|___/ .__/|_| |_|\___|_| |_|\___/_/ \_\
|
|
8
|
-
| |
|
|
9
|
-
|_|
|
|
10
|
-
|
|
11
|
-
Written by: k3yomi@GitHub
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
import * as fs from 'fs';
|
|
16
|
-
import * as path from 'path';
|
|
17
|
-
import * as events from 'events';
|
|
18
|
-
import * as xmpp from '@xmpp/client';
|
|
19
|
-
import * as shapefile from 'shapefile';
|
|
20
|
-
import * as xml2js from 'xml2js';
|
|
21
|
-
import sqlite3 from 'better-sqlite3';
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
export const packages = {fs, path, events, xmpp, shapefile, xml2js, sqlite3 };
|
|
25
|
-
|
|
26
|
-
export const statics = {
|
|
27
|
-
events: new events.EventEmitter(),
|
|
28
|
-
session: null as any,
|
|
29
|
-
db: null as any,
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
export const cache = {
|
|
33
|
-
lastStanza: Date.now(),
|
|
34
|
-
session: null as any,
|
|
35
|
-
lastConnect: null as any,
|
|
36
|
-
sigHault: false,
|
|
37
|
-
isConnected: false,
|
|
38
|
-
attemptingReconnect: false,
|
|
39
|
-
totalReconnects: 0
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
export const settings = {
|
|
43
|
-
alertSettings: {
|
|
44
|
-
ugcPolygons: false,
|
|
45
|
-
onlyCap: false,
|
|
46
|
-
betterEvents: false,
|
|
47
|
-
expiryCheck: true,
|
|
48
|
-
filteredAlerts: [],
|
|
49
|
-
},
|
|
50
|
-
xmpp: {
|
|
51
|
-
reconnect: true,
|
|
52
|
-
reconnectInterval: 60,
|
|
53
|
-
},
|
|
54
|
-
cacheSettings: {
|
|
55
|
-
readCache: false,
|
|
56
|
-
maxMegabytes: 1,
|
|
57
|
-
cacheDir: null,
|
|
58
|
-
},
|
|
59
|
-
database: path.join(process.cwd(), 'shapefiles.db'),
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
export const definitions = {
|
|
63
|
-
events: { "AF": "Ashfall", "AS": "Air Stagnation", "BH": "Beach Hazard", "BW": "Brisk Wind", "BZ": "Blizzard", "CF": "Coastal Flood", "DF": "Debris Flow", "DS": "Dust Storm", "EC": "Extreme Cold", "EH": "Excessive Heat", "XH": "Extreme Heat", "EW": "Extreme Wind", "FA": "Areal Flood", "FF": "Flash Flood", "FG": "Dense Fog", "FL": "Flood", "FR": "Frost", "FW": "Fire Weather", "FZ": "Freeze", "GL": "Gale", "HF": "Hurricane Force Wind", "HT": "Heat", "HU": "Hurricane", "HW": "High Wind", "HY": "Hydrologic", "HZ": "Hard Freeze", "IS": "Ice Storm", "LE": "Lake Effect Snow", "LO": "Low Water", "LS": "Lakeshore Flood", "LW": "Lake Wind", "MA": "Special Marine", "MF": "Dense Fog", "MH": "Ashfall", "MS": "Dense Smoke", "RB": "Small Craft for Rough Bar", "RP": "Rip Current Risk", "SC": "Small Craft", "SE": "Hazardous Seas", "SI": "Small Craft for Winds", "SM": "Dense Smoke", "SQ": "Snow Squall", "SR": "Storm", "SS": "Storm Surge", "SU": "High Surf", "SV": "Severe Thunderstorm", "SW": "Small Craft for Hazardous Seas", "TO": "Tornado", "TR": "Tropical Storm", "TS": "Tsunami", "TY": "Typhoon", "UP": "Heavy Freezing Spray", "WC": "Wind Chill", "WI": "Wind", "WS": "Winter Storm", "WW": "Winter Weather", "ZF": "Freezing Fog", "ZR": "Freezing Rain", "ZY": "Freezing Spray" },
|
|
64
|
-
actions: { "W": "Warning", "F": "Forecast", "A": "Watch", "O": "Outlook", "Y": "Advisory", "N": "Synopsis", "S": "Statement"},
|
|
65
|
-
status: { "NEW": "Issued", "CON": "Updated", "EXT": "Extended", "EXA": "Extended", "EXB": "Extended", "UPG": "Upgraded", "COR": "Correction", "ROU": "Routine", "CAN": "Cancelled", "EXP": "Expired" },
|
|
66
|
-
awips: { SWOMCD: `mesoscale-discussion`, LSR: `local-storm-report`, SPS: `special-weather-statement`},
|
|
67
|
-
expressions: {
|
|
68
|
-
vtec: `[OTEX].(NEW|CON|EXT|EXA|EXB|UPG|CAN|EXP|COR|ROU).[A-Z]{4}.[A-Z]{2}.[WAYSFON].[0-9]{4}.[0-9]{6}T[0-9]{4}Z-[0-9]{6}T[0-9]{4}Z`,
|
|
69
|
-
wmo: `[A-Z0-9]{6}\\s[A-Z]{4}\\s\\d{6}`,
|
|
70
|
-
ugc1: `(\\w{2}[CZ](\\d{3}((-|>)\\s?(\n\n)?))+)`,
|
|
71
|
-
ugc2: `(\\d{6}(-|>)\\s?(\n\n)?)`,
|
|
72
|
-
dateline: `/\d{3,4}\s*(AM|PM)?\s*[A-Z]{2,4}\s+[A-Z]{3,}\s+[A-Z]{3,}\s+\d{1,2}\s+\d{4}`
|
|
73
|
-
},
|
|
74
|
-
tags: {
|
|
75
|
-
"A LARGE AND EXTREMELY DANGEROUS TORNADO": "Large and Dangerous Tornado",
|
|
76
|
-
"THIS IS A PARTICULARLY DANGEROUS SITUATION": "Particularly Dangerous Situation",
|
|
77
|
-
"RADAR INDICATED ROTATION": "Radar Indicated Tornado",
|
|
78
|
-
"WEATHER SPOTTERS CONFIRMED TORNADO": "Confirmed by Storm Spotters",
|
|
79
|
-
"A SEVERE THUNDERSTORM CAPABLE OF PRODUCING A TORNADO": "Developing Tornado",
|
|
80
|
-
"LAW ENFORCEMENT CONFIRMED TORNADO": "Reported by Law Enforcement",
|
|
81
|
-
"A TORNADO IS ON THE GROUND": "Confirmed Tornado",
|
|
82
|
-
"WEATHER SPOTTERS REPORTED FUNNEL CLOUD": "Confirmed Funnel Cloud by Storm Spotters",
|
|
83
|
-
"PUBLIC CONFIRMED TORNADO": "Public reports of Tornado",
|
|
84
|
-
"RADAR CONFIRMED": "Radar Confirmed",
|
|
85
|
-
"TORNADO WAS REPORTED BRIEFLY ON THE GROUND": "Tornado no longer on ground",
|
|
86
|
-
"SPOTTERS INDICATE THAT A FUNNEL CLOUD CONTINUES WITH THIS STORM": "Funnel Cloud Continues",
|
|
87
|
-
"A TORNADO MAY DEVELOP AT ANY TIME": "Potentional still exists for Tornado to form",
|
|
88
|
-
"LIFE-THREATENING SITUATION": "Life Threating Situation",
|
|
89
|
-
"COMPLETE DESTRUCTION IS POSSIBLE": "Extremly Damaging Tornado",
|
|
90
|
-
"POTENTIALLY DEADLY TORNADO": "Deadly Tornado",
|
|
91
|
-
"RADAR INDICATED": "Radar Indicated",
|
|
92
|
-
"HAIL DAMAGE TO VEHICLES IS EXPECTED": "Damaging to Vehicles",
|
|
93
|
-
"EXPECT WIND DAMAGE": "Wind Damage",
|
|
94
|
-
"FREQUENT LIGHTNING": "Frequent Lightning",
|
|
95
|
-
"PEOPLE AND ANIMALS OUTDOORS WILL BE INJURED": "Capable of Injuring People and Animals",
|
|
96
|
-
"TRAINED WEATHER SPOTTERS": "Confirmed by Storm Spotters",
|
|
97
|
-
"SOURCE...PUBLIC": "Confirmed by Public",
|
|
98
|
-
"SMALL CRAFT COULD BE DAMAGED": "Potential Damage to Small Craft",
|
|
99
|
-
"A TORNADO WATCH REMAINS IN EFFECT": "Active Tornado Watch",
|
|
100
|
-
"TENNIS BALL SIZE HAIL": "Tennis Ball Size Hail",
|
|
101
|
-
"BASEBALL SIZE HAIL": "Baseball Size Hail",
|
|
102
|
-
"GOLF BALL SIZE HAIL": "Golf Ball Size Hail",
|
|
103
|
-
"QUARTER SIZE HAIL": "Quarter Size Hail",
|
|
104
|
-
"PING PONG BALL SIZE HAIL": "Ping Pong Ball Size Hail",
|
|
105
|
-
"NICKEL SIZE HAIL": "Nickel Size Hail",
|
|
106
|
-
"DOPPLER RADAR.": "Confirmed by Radar",
|
|
107
|
-
"DOPPLER RADAR AND AUTOMATED GAUGES.": "Confirmed by Radar and Gauges",
|
|
108
|
-
"FLASH FLOODING CAUSED BY THUNDERSTORMS.": "Caused by Thunderstorm",
|
|
109
|
-
"SOURCE...EMERGENCY MANAGEMENT.": "Confirmed by Emergency Management",
|
|
110
|
-
"FLASH FLOODING CAUSED BY HEAVY RAIN.": "Caused by heavy rain",
|
|
111
|
-
"SOURCE...LAW ENFORCEMENT REPORTED.": "Confirmed by Law Enforcement"
|
|
112
|
-
},
|
|
113
|
-
haultingConditions: [
|
|
114
|
-
{ error: "error-database-not-configured", message: "The database is not configured properly. Please set the database path in the constructor." },
|
|
115
|
-
{ error: "error-reconnecting-too-fast", message: "The client is attempting to reconnect too fast. Please wait a few seconds before trying again." },
|
|
116
|
-
{ error: "error-connection-lost", message: "The connection to the XMPP server has been lost. Please try reconnecting manually as the automatic reconnect feature is not setup for offline hault conditions." },
|
|
117
|
-
],
|
|
118
|
-
messages: {
|
|
119
|
-
shapefile_creation: `\n\n[NOTICE] DO NOT CLOSE THIS PROJECT UNTIL THE SHAPEFILES ARE DONE COMPLETING!\n\t THIS COULD TAKE A WHILE DEPENDING ON THE SPEED OF YOUR STORAGE!!\n\t IF YOU CLOSE YOUR PROJECT, THE SHAPEFILES WILL NOT BE CREATED AND YOU WILL NEED TO DELETE ${settings.database} AND RESTART TO CREATE THEM AGAIN!\n\n`,
|
|
120
|
-
shapefile_creation_finished: `\n\n[NOTICE] SHAPEFILES HAVE BEEN SUCCESSFULLY CREATED AND THE DATABASE IS READY FOR USE!\n\n`
|
|
121
|
-
}
|
|
122
|
-
};
|
package/dist/bootstrap.js
DELETED
|
@@ -1,153 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/*
|
|
3
|
-
_ _ __ __
|
|
4
|
-
/\ | | | | (_) \ \ / /
|
|
5
|
-
/ \ | |_ _ __ ___ ___ ___ _ __ | |__ ___ _ __ _ ___ \ V /
|
|
6
|
-
/ /\ \| __| '_ ` _ \ / _ \/ __| '_ \| '_ \ / _ \ '__| |/ __| > <
|
|
7
|
-
/ ____ \ |_| | | | | | (_) \__ \ |_) | | | | __/ | | | (__ / . \
|
|
8
|
-
/_/ \_\__|_| |_| |_|\___/|___/ .__/|_| |_|\___|_| |_|\___/_/ \_\
|
|
9
|
-
| |
|
|
10
|
-
|_|
|
|
11
|
-
|
|
12
|
-
Written by: k3yomi@GitHub
|
|
13
|
-
*/
|
|
14
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
15
|
-
if (k2 === undefined) k2 = k;
|
|
16
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
17
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
18
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
19
|
-
}
|
|
20
|
-
Object.defineProperty(o, k2, desc);
|
|
21
|
-
}) : (function(o, m, k, k2) {
|
|
22
|
-
if (k2 === undefined) k2 = k;
|
|
23
|
-
o[k2] = m[k];
|
|
24
|
-
}));
|
|
25
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
26
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
27
|
-
}) : function(o, v) {
|
|
28
|
-
o["default"] = v;
|
|
29
|
-
});
|
|
30
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
31
|
-
var ownKeys = function(o) {
|
|
32
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
33
|
-
var ar = [];
|
|
34
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
35
|
-
return ar;
|
|
36
|
-
};
|
|
37
|
-
return ownKeys(o);
|
|
38
|
-
};
|
|
39
|
-
return function (mod) {
|
|
40
|
-
if (mod && mod.__esModule) return mod;
|
|
41
|
-
var result = {};
|
|
42
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
43
|
-
__setModuleDefault(result, mod);
|
|
44
|
-
return result;
|
|
45
|
-
};
|
|
46
|
-
})();
|
|
47
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
48
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
49
|
-
};
|
|
50
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
51
|
-
exports.definitions = exports.settings = exports.cache = exports.statics = exports.packages = void 0;
|
|
52
|
-
var fs = __importStar(require("fs"));
|
|
53
|
-
var path = __importStar(require("path"));
|
|
54
|
-
var events = __importStar(require("events"));
|
|
55
|
-
var xmpp = __importStar(require("@xmpp/client"));
|
|
56
|
-
var shapefile = __importStar(require("shapefile"));
|
|
57
|
-
var xml2js = __importStar(require("xml2js"));
|
|
58
|
-
var better_sqlite3_1 = __importDefault(require("better-sqlite3"));
|
|
59
|
-
exports.packages = { fs: fs, path: path, events: events, xmpp: xmpp, shapefile: shapefile, xml2js: xml2js, sqlite3: better_sqlite3_1.default };
|
|
60
|
-
exports.statics = {
|
|
61
|
-
events: new events.EventEmitter(),
|
|
62
|
-
session: null,
|
|
63
|
-
db: null,
|
|
64
|
-
};
|
|
65
|
-
exports.cache = {
|
|
66
|
-
lastStanza: Date.now(),
|
|
67
|
-
session: null,
|
|
68
|
-
lastConnect: null,
|
|
69
|
-
sigHault: false,
|
|
70
|
-
isConnected: false,
|
|
71
|
-
attemptingReconnect: false,
|
|
72
|
-
totalReconnects: 0
|
|
73
|
-
};
|
|
74
|
-
exports.settings = {
|
|
75
|
-
alertSettings: {
|
|
76
|
-
ugcPolygons: false,
|
|
77
|
-
onlyCap: false,
|
|
78
|
-
betterEvents: false,
|
|
79
|
-
expiryCheck: true,
|
|
80
|
-
filteredAlerts: [],
|
|
81
|
-
},
|
|
82
|
-
xmpp: {
|
|
83
|
-
reconnect: true,
|
|
84
|
-
reconnectInterval: 60,
|
|
85
|
-
},
|
|
86
|
-
cacheSettings: {
|
|
87
|
-
readCache: false,
|
|
88
|
-
maxMegabytes: 1,
|
|
89
|
-
cacheDir: null,
|
|
90
|
-
},
|
|
91
|
-
database: path.join(process.cwd(), 'shapefiles.db'),
|
|
92
|
-
};
|
|
93
|
-
exports.definitions = {
|
|
94
|
-
events: { "AF": "Ashfall", "AS": "Air Stagnation", "BH": "Beach Hazard", "BW": "Brisk Wind", "BZ": "Blizzard", "CF": "Coastal Flood", "DF": "Debris Flow", "DS": "Dust Storm", "EC": "Extreme Cold", "EH": "Excessive Heat", "XH": "Extreme Heat", "EW": "Extreme Wind", "FA": "Areal Flood", "FF": "Flash Flood", "FG": "Dense Fog", "FL": "Flood", "FR": "Frost", "FW": "Fire Weather", "FZ": "Freeze", "GL": "Gale", "HF": "Hurricane Force Wind", "HT": "Heat", "HU": "Hurricane", "HW": "High Wind", "HY": "Hydrologic", "HZ": "Hard Freeze", "IS": "Ice Storm", "LE": "Lake Effect Snow", "LO": "Low Water", "LS": "Lakeshore Flood", "LW": "Lake Wind", "MA": "Special Marine", "MF": "Dense Fog", "MH": "Ashfall", "MS": "Dense Smoke", "RB": "Small Craft for Rough Bar", "RP": "Rip Current Risk", "SC": "Small Craft", "SE": "Hazardous Seas", "SI": "Small Craft for Winds", "SM": "Dense Smoke", "SQ": "Snow Squall", "SR": "Storm", "SS": "Storm Surge", "SU": "High Surf", "SV": "Severe Thunderstorm", "SW": "Small Craft for Hazardous Seas", "TO": "Tornado", "TR": "Tropical Storm", "TS": "Tsunami", "TY": "Typhoon", "UP": "Heavy Freezing Spray", "WC": "Wind Chill", "WI": "Wind", "WS": "Winter Storm", "WW": "Winter Weather", "ZF": "Freezing Fog", "ZR": "Freezing Rain", "ZY": "Freezing Spray" },
|
|
95
|
-
actions: { "W": "Warning", "F": "Forecast", "A": "Watch", "O": "Outlook", "Y": "Advisory", "N": "Synopsis", "S": "Statement" },
|
|
96
|
-
status: { "NEW": "Issued", "CON": "Updated", "EXT": "Extended", "EXA": "Extended", "EXB": "Extended", "UPG": "Upgraded", "COR": "Correction", "ROU": "Routine", "CAN": "Cancelled", "EXP": "Expired" },
|
|
97
|
-
awips: { SWOMCD: "mesoscale-discussion", LSR: "local-storm-report", SPS: "special-weather-statement" },
|
|
98
|
-
expressions: {
|
|
99
|
-
vtec: "[OTEX].(NEW|CON|EXT|EXA|EXB|UPG|CAN|EXP|COR|ROU).[A-Z]{4}.[A-Z]{2}.[WAYSFON].[0-9]{4}.[0-9]{6}T[0-9]{4}Z-[0-9]{6}T[0-9]{4}Z",
|
|
100
|
-
wmo: "[A-Z0-9]{6}\\s[A-Z]{4}\\s\\d{6}",
|
|
101
|
-
ugc1: "(\\w{2}[CZ](\\d{3}((-|>)\\s?(\n\n)?))+)",
|
|
102
|
-
ugc2: "(\\d{6}(-|>)\\s?(\n\n)?)",
|
|
103
|
-
dateline: "/d{3,4}s*(AM|PM)?s*[A-Z]{2,4}s+[A-Z]{3,}s+[A-Z]{3,}s+d{1,2}s+d{4}"
|
|
104
|
-
},
|
|
105
|
-
tags: {
|
|
106
|
-
"A LARGE AND EXTREMELY DANGEROUS TORNADO": "Large and Dangerous Tornado",
|
|
107
|
-
"THIS IS A PARTICULARLY DANGEROUS SITUATION": "Particularly Dangerous Situation",
|
|
108
|
-
"RADAR INDICATED ROTATION": "Radar Indicated Tornado",
|
|
109
|
-
"WEATHER SPOTTERS CONFIRMED TORNADO": "Confirmed by Storm Spotters",
|
|
110
|
-
"A SEVERE THUNDERSTORM CAPABLE OF PRODUCING A TORNADO": "Developing Tornado",
|
|
111
|
-
"LAW ENFORCEMENT CONFIRMED TORNADO": "Reported by Law Enforcement",
|
|
112
|
-
"A TORNADO IS ON THE GROUND": "Confirmed Tornado",
|
|
113
|
-
"WEATHER SPOTTERS REPORTED FUNNEL CLOUD": "Confirmed Funnel Cloud by Storm Spotters",
|
|
114
|
-
"PUBLIC CONFIRMED TORNADO": "Public reports of Tornado",
|
|
115
|
-
"RADAR CONFIRMED": "Radar Confirmed",
|
|
116
|
-
"TORNADO WAS REPORTED BRIEFLY ON THE GROUND": "Tornado no longer on ground",
|
|
117
|
-
"SPOTTERS INDICATE THAT A FUNNEL CLOUD CONTINUES WITH THIS STORM": "Funnel Cloud Continues",
|
|
118
|
-
"A TORNADO MAY DEVELOP AT ANY TIME": "Potentional still exists for Tornado to form",
|
|
119
|
-
"LIFE-THREATENING SITUATION": "Life Threating Situation",
|
|
120
|
-
"COMPLETE DESTRUCTION IS POSSIBLE": "Extremly Damaging Tornado",
|
|
121
|
-
"POTENTIALLY DEADLY TORNADO": "Deadly Tornado",
|
|
122
|
-
"RADAR INDICATED": "Radar Indicated",
|
|
123
|
-
"HAIL DAMAGE TO VEHICLES IS EXPECTED": "Damaging to Vehicles",
|
|
124
|
-
"EXPECT WIND DAMAGE": "Wind Damage",
|
|
125
|
-
"FREQUENT LIGHTNING": "Frequent Lightning",
|
|
126
|
-
"PEOPLE AND ANIMALS OUTDOORS WILL BE INJURED": "Capable of Injuring People and Animals",
|
|
127
|
-
"TRAINED WEATHER SPOTTERS": "Confirmed by Storm Spotters",
|
|
128
|
-
"SOURCE...PUBLIC": "Confirmed by Public",
|
|
129
|
-
"SMALL CRAFT COULD BE DAMAGED": "Potential Damage to Small Craft",
|
|
130
|
-
"A TORNADO WATCH REMAINS IN EFFECT": "Active Tornado Watch",
|
|
131
|
-
"TENNIS BALL SIZE HAIL": "Tennis Ball Size Hail",
|
|
132
|
-
"BASEBALL SIZE HAIL": "Baseball Size Hail",
|
|
133
|
-
"GOLF BALL SIZE HAIL": "Golf Ball Size Hail",
|
|
134
|
-
"QUARTER SIZE HAIL": "Quarter Size Hail",
|
|
135
|
-
"PING PONG BALL SIZE HAIL": "Ping Pong Ball Size Hail",
|
|
136
|
-
"NICKEL SIZE HAIL": "Nickel Size Hail",
|
|
137
|
-
"DOPPLER RADAR.": "Confirmed by Radar",
|
|
138
|
-
"DOPPLER RADAR AND AUTOMATED GAUGES.": "Confirmed by Radar and Gauges",
|
|
139
|
-
"FLASH FLOODING CAUSED BY THUNDERSTORMS.": "Caused by Thunderstorm",
|
|
140
|
-
"SOURCE...EMERGENCY MANAGEMENT.": "Confirmed by Emergency Management",
|
|
141
|
-
"FLASH FLOODING CAUSED BY HEAVY RAIN.": "Caused by heavy rain",
|
|
142
|
-
"SOURCE...LAW ENFORCEMENT REPORTED.": "Confirmed by Law Enforcement"
|
|
143
|
-
},
|
|
144
|
-
haultingConditions: [
|
|
145
|
-
{ error: "error-database-not-configured", message: "The database is not configured properly. Please set the database path in the constructor." },
|
|
146
|
-
{ error: "error-reconnecting-too-fast", message: "The client is attempting to reconnect too fast. Please wait a few seconds before trying again." },
|
|
147
|
-
{ error: "error-connection-lost", message: "The connection to the XMPP server has been lost. Please try reconnecting manually as the automatic reconnect feature is not setup for offline hault conditions." },
|
|
148
|
-
],
|
|
149
|
-
messages: {
|
|
150
|
-
shapefile_creation: "\n\n[NOTICE] DO NOT CLOSE THIS PROJECT UNTIL THE SHAPEFILES ARE DONE COMPLETING!\n\t THIS COULD TAKE A WHILE DEPENDING ON THE SPEED OF YOUR STORAGE!!\n\t IF YOU CLOSE YOUR PROJECT, THE SHAPEFILES WILL NOT BE CREATED AND YOU WILL NEED TO DELETE ".concat(exports.settings.database, " AND RESTART TO CREATE THEM AGAIN!\n\n"),
|
|
151
|
-
shapefile_creation_finished: "\n\n[NOTICE] SHAPEFILES HAVE BEEN SUCCESSFULLY CREATED AND THE DATABASE IS READY FOR USE!\n\n"
|
|
152
|
-
}
|
|
153
|
-
};
|