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.
Files changed (44) hide show
  1. package/README.md +182 -64
  2. package/dist/cjs/index.cjs +3799 -0
  3. package/dist/esm/index.mjs +3757 -0
  4. package/package.json +49 -37
  5. package/src/bootstrap.ts +196 -0
  6. package/src/database.ts +148 -0
  7. package/src/dictionaries/awips.ts +342 -0
  8. package/src/dictionaries/events.ts +142 -0
  9. package/src/dictionaries/icao.ts +237 -0
  10. package/src/dictionaries/offshore.ts +12 -0
  11. package/src/dictionaries/signatures.ts +107 -0
  12. package/src/eas.ts +493 -0
  13. package/src/index.ts +229 -0
  14. package/src/parsers/events/api.ts +151 -0
  15. package/src/parsers/events/cap.ts +138 -0
  16. package/src/parsers/events/text.ts +106 -0
  17. package/src/parsers/events/ugc.ts +109 -0
  18. package/src/parsers/events/vtec.ts +78 -0
  19. package/src/parsers/events.ts +367 -0
  20. package/src/parsers/hvtec.ts +46 -0
  21. package/src/parsers/pvtec.ts +71 -0
  22. package/src/parsers/stanza.ts +132 -0
  23. package/src/parsers/text.ts +166 -0
  24. package/src/parsers/ugc.ts +197 -0
  25. package/src/types.ts +251 -0
  26. package/src/utils.ts +314 -0
  27. package/src/xmpp.ts +144 -0
  28. package/test.js +58 -34
  29. package/tsconfig.json +12 -5
  30. package/tsup.config.ts +14 -0
  31. package/bootstrap.ts +0 -122
  32. package/dist/bootstrap.js +0 -153
  33. package/dist/src/events.js +0 -585
  34. package/dist/src/helper.js +0 -463
  35. package/dist/src/stanza.js +0 -147
  36. package/dist/src/text-parser.js +0 -119
  37. package/dist/src/ugc.js +0 -214
  38. package/dist/src/vtec.js +0 -125
  39. package/src/events.ts +0 -394
  40. package/src/helper.ts +0 -298
  41. package/src/stanza.ts +0 -102
  42. package/src/text-parser.ts +0 -120
  43. package/src/ugc.ts +0 -122
  44. 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
- let Client = new AtmosXWireParser.Parser({
5
- database: `./database.db`,
6
- authentication: {
7
- username: `YOUR_USERNAME`,
8
- password: `YOUR_PASSWORD`,
9
- display: `DISPLAY_NAME_HERE`, // Display name for the XMPP client
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
- cacheSettings: {
12
- readCache: true, // Set to true if you wish to reupload the cache from earlier
13
- maxMegabytes: 5, // Maximum cache size in megabytes
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
- alertSettings: {
17
- onlyCap: false, // Set to true to only receive CAP messages only
18
- betterEvents: true, // Set to true to receive better event handling
19
- expiryCheck: true, // Set to true to filter out expired alerts
20
- ugcPolygons: false, // Set to true to receive UGC Polygons instead of reading from raw products.
21
- filteredAlerts: [] // Alerts you want to only log, leave empty to receive all alerts
22
- },
23
- xmpp: {
24
- reconnect: true, // Set to true to enable automatic reconnection if you lose connection
25
- reconnectInterval: 60, // Interval in seconds to attempt reconnection
26
- },
27
- });
28
-
29
- Client.onEvent(`onAlert`, (alert) => {
30
- for (let a of alert) {
31
- console.log(`${a.properties.event} ${a.properties.messageType} ${a.tracking} - ${a.history[0].issued}`);
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
- "compilerOptions": {
3
- "esModuleInterop": true,
4
- "allowSyntheticDefaultImports": true,
5
- "outDir": "dist"
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
- };