@atmosx/event-product-parser 3.0.48 → 3.0.52
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/.vscode/settings.json +3 -3
- package/CODE_OF_CONDUCT.md +9 -9
- package/CONTRIBUTING.md +29 -29
- package/LICENSE +17 -17
- package/README.md +443 -417
- package/SECURITY.md +20 -20
- package/SUPPORTED_EVENTS.md +369 -368
- package/dist/cjs/index.cjs +1925 -1885
- package/dist/esm/index.mjs +1927 -1887
- package/package.json +52 -52
- package/src/@building/building.attachments.ts +82 -82
- package/src/@building/building.clean.ts +29 -29
- package/src/@building/building.create.ts +55 -41
- package/src/@building/building.enhance.ts +59 -59
- package/src/@building/building.geometry.ts +47 -47
- package/src/@building/building.headers.ts +36 -36
- package/src/@building/building.office.ts +42 -42
- package/src/@building/building.polygon.ts +69 -70
- package/src/@building/building.properties.ts +95 -95
- package/src/@building/building.signature.ts +60 -61
- package/src/@building/building.tags.ts +23 -23
- package/src/@building/building.tracking.ts +67 -67
- package/src/@building/building.validate.ts +152 -146
- package/src/@core/core.clearEvents.ts +30 -31
- package/src/@core/core.createListener.ts +23 -23
- package/src/@core/core.getEvents.ts +23 -24
- package/src/@core/core.getNodes.ts +23 -24
- package/src/@core/core.getRandomEvent.ts +23 -24
- package/src/@core/core.getVersion.ts +23 -24
- package/src/@core/core.manualEvent.ts +38 -0
- package/src/@core/core.query.ts +38 -38
- package/src/@core/core.setNode.ts +80 -80
- package/src/@core/core.start.ts +60 -60
- package/src/@core/core.stop.ts +31 -31
- package/src/@dictionaries/dictionaries.actions.ts +27 -27
- package/src/@dictionaries/dictionaries.awips.ts +363 -363
- package/src/@dictionaries/dictionaries.cancellation.ts +30 -30
- package/src/@dictionaries/dictionaries.causes.ts +35 -35
- package/src/@dictionaries/dictionaries.correlations.ts +42 -42
- package/src/@dictionaries/dictionaries.enhanced.ts +66 -109
- package/src/@dictionaries/dictionaries.events.ts +82 -82
- package/src/@dictionaries/dictionaries.expressions.ts +28 -28
- package/src/@dictionaries/dictionaries.global.ts +24 -0
- package/src/@dictionaries/dictionaries.hail.ts +35 -35
- package/src/@dictionaries/dictionaries.icao.ts +258 -258
- package/src/@dictionaries/dictionaries.matches.ts +54 -35
- package/src/@dictionaries/dictionaries.products.ts +24 -24
- package/src/@dictionaries/dictionaries.records.ts +25 -25
- package/src/@dictionaries/dictionaries.severity.ts +27 -27
- package/src/@dictionaries/dictionaries.shapefiles.ts +35 -35
- package/src/@dictionaries/dictionaries.states.ts +71 -71
- package/src/@dictionaries/dictionaries.status.ts +30 -30
- package/src/@dictionaries/dictionaries.tags.ts +92 -92
- package/src/@dictionaries/dictionaries.testing.ts +24 -24
- package/src/@events/events.api.ts +116 -118
- package/src/@events/events.text.ts +84 -81
- package/src/@events/events.ugc.ts +89 -85
- package/src/@events/events.vtec.ts +86 -87
- package/src/@manager/manager.mkEvent.ts +97 -88
- package/src/@manager/manager.rmEvent.ts +56 -49
- package/src/@manager/manager.setHash.ts +35 -36
- package/src/@manager/manager.updateEvents.ts +32 -34
- package/src/@manager/manager.updateListener.ts +154 -159
- package/src/@manager/manager.updateNodes.ts +53 -54
- package/src/@modules/@database/database.broadcastify.ts +66 -66
- package/src/@modules/@database/database.cache.ts +49 -47
- package/src/@modules/@database/database.init.ts +58 -57
- package/src/@modules/@database/database.shapefiles.ts +92 -92
- package/src/@modules/@database/database.stanza.ts +46 -47
- package/src/@modules/@eas/eas.getCleanDescription.ts +91 -91
- package/src/@modules/@eas/eas.getFloatPCM16.ts +29 -29
- package/src/@modules/@eas/eas.getMergedPCM16.ts +32 -32
- package/src/@modules/@eas/eas.getPCM16.ts +52 -52
- package/src/@modules/@eas/eas.getPCMToFloat.ts +26 -26
- package/src/@modules/@eas/eas.getSampledPCM16.ts +36 -36
- package/src/@modules/@eas/eas.getTTS.ts +54 -54
- package/src/@modules/@eas/eas.getWavPCM16.ts +52 -52
- package/src/@modules/@eas/eas.setAFSK.ts +51 -52
- package/src/@modules/@eas/eas.setAsciiToBits.ts +31 -32
- package/src/@modules/@eas/eas.setAttentionTone.ts +40 -40
- package/src/@modules/@eas/eas.setEasTone.ts +151 -147
- package/src/@modules/@eas/eas.setNoise.ts +32 -31
- package/src/@modules/@eas/eas.setRadioEffect.ts +50 -49
- package/src/@modules/@eas/eas.setSameHeader.ts +44 -45
- package/src/@modules/@stanza/stanza.getAwipsType.ts +45 -45
- package/src/@modules/@stanza/stanza.validate.ts +49 -49
- package/src/@modules/@utilities/utilities.createHttp.ts +70 -70
- package/src/@modules/@utilities/utilities.getFormattedTime.ts +43 -43
- package/src/@modules/@utilities/utilities.getLatestIssuance.ts +32 -32
- package/src/@modules/@utilities/utilities.getMatched.ts +33 -0
- package/src/@modules/@utilities/utilities.getSettings.ts +25 -25
- package/src/@modules/@utilities/utilities.getShapeNearestPoint.ts +114 -114
- package/src/@modules/@utilities/utilities.setCronSchedule.ts +94 -94
- package/src/@modules/@utilities/utilities.setDebug.ts +38 -0
- package/src/@modules/@utilities/utilities.setEventEmit.ts +41 -41
- package/src/@modules/@utilities/utilities.setListener.ts +30 -30
- package/src/@modules/@utilities/utilities.setSettings.ts +42 -42
- package/src/@modules/@utilities/utilities.setSleep.ts +33 -33
- package/src/@modules/@utilities/utilities.setTimeoutAction.ts +62 -58
- package/src/@modules/@utilities/utilities.setWarning.ts +34 -34
- package/src/@modules/@xmpp/xmpp.xDeploy.ts +57 -58
- package/src/@modules/@xmpp/xmpp.xError.ts +26 -28
- package/src/@modules/@xmpp/xmpp.xOffline.ts +36 -37
- package/src/@modules/@xmpp/xmpp.xOnline.ts +45 -44
- package/src/@modules/@xmpp/xmpp.xReconnect.ts +64 -64
- package/src/@modules/@xmpp/xmpp.xStanza.ts +62 -62
- package/src/@parsers/@hvtec/hvtec.extract.ts +39 -39
- package/src/@parsers/@pvtec/pvtec.expires.ts +25 -25
- package/src/@parsers/@pvtec/pvtec.extract.ts +48 -48
- package/src/@parsers/@text/text.getDescriptionFromProduct.ts +52 -52
- package/src/@parsers/@text/text.getEmbed.ts +55 -57
- package/src/@parsers/@text/text.getPolygonFromProduct.ts +53 -32
- package/src/@parsers/@text/text.getTextFromProduct.ts +42 -42
- package/src/@parsers/@text/text.getXML.ts +60 -60
- package/src/@parsers/@ugc/ugc.coordinates.ts +110 -109
- package/src/@parsers/@ugc/ugc.expiry.ts +31 -31
- package/src/@parsers/@ugc/ugc.extract.ts +36 -36
- package/src/@parsers/@ugc/ugc.getCache.ts +24 -0
- package/src/@parsers/@ugc/ugc.header.ts +29 -29
- package/src/@parsers/@ugc/ugc.locations.ts +57 -29
- package/src/@parsers/@ugc/ugc.setCache.ts +28 -0
- package/src/@parsers/@ugc/ugc.zones.ts +51 -51
- package/src/@types/type.attributes.ts +28 -28
- package/src/@types/type.compiled.ts +34 -34
- package/src/@types/type.event.ts +69 -69
- package/src/@types/type.hash.ts +24 -24
- package/src/@types/type.hvtec.ts +25 -25
- package/src/@types/type.listener.ts +32 -32
- package/src/@types/type.properties.ts +77 -77
- package/src/@types/type.pvtec.ts +30 -30
- package/src/@types/type.settings.ts +84 -83
- package/src/@types/type.stanza.ts +37 -37
- package/src/@types/type.ugc.ts +24 -24
- package/src/bootstrap.ts +115 -112
- package/src/index.ts +74 -74
- package/test.js +92 -98
- package/tsconfig.json +13 -13
- package/tsup.config.ts +15 -15
- package/dist/index.d.mts +0 -299
- package/dist/index.d.ts +0 -299
- package/src/@core/core.createEvent.ts +0 -83
|
@@ -1,48 +1,50 @@
|
|
|
1
|
-
/*
|
|
2
|
-
_ _ _ __ __
|
|
3
|
-
/\ | | | | (_) \ \ / /
|
|
4
|
-
/ \ | |_ _ __ ___ ___ ___ _ __ | |__ ___ _ __ _ ___ \ V /
|
|
5
|
-
/ /\ \| __| '_ ` _ \ / _ \/ __| '_ \| '_ \ / _ \ '__| |/ __| > <
|
|
6
|
-
/ ____ \ |_| | | | | | (_) \__ \ |_) | | | | __/ | | | (__ / . \
|
|
7
|
-
/_/ \_\__|_| |_| |_|\___/|___/ .__/|_| |_|\___|_| |_|\___/_/ \_\
|
|
8
|
-
| |
|
|
9
|
-
|_|
|
|
10
|
-
|
|
11
|
-
Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
|
|
12
|
-
Discord: https://atmosphericx-discord.scriptkitty.cafe
|
|
13
|
-
Ko-Fi: https://ko-fi.com/k3yomi
|
|
14
|
-
Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
|
|
15
|
-
|
|
16
|
-
Internal Package: @atmosx/event-product-parser
|
|
17
|
-
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
import { TypeSettings } from "../../@types/type.settings"
|
|
21
|
-
import { bootstrap } from '../../bootstrap'
|
|
22
|
-
import { setWarning } from '../@utilities/utilities.setWarning';
|
|
23
|
-
import { createEvent } from '../../@building/building.create';
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
(stanza.isCapEvent
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
}
|
|
1
|
+
/*
|
|
2
|
+
_ _ _ __ __
|
|
3
|
+
/\ | | | | (_) \ \ / /
|
|
4
|
+
/ \ | |_ _ __ ___ ___ ___ _ __ | |__ ___ _ __ _ ___ \ V /
|
|
5
|
+
/ /\ \| __| '_ ` _ \ / _ \/ __| '_ \| '_ \ / _ \ '__| |/ __| > <
|
|
6
|
+
/ ____ \ |_| | | | | | (_) \__ \ |_) | | | | __/ | | | (__ / . \
|
|
7
|
+
/_/ \_\__|_| |_| |_|\___/|___/ .__/|_| |_|\___|_| |_|\___/_/ \_\
|
|
8
|
+
| |
|
|
9
|
+
|_|
|
|
10
|
+
|
|
11
|
+
Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
|
|
12
|
+
Discord: https://atmosphericx-discord.scriptkitty.cafe
|
|
13
|
+
Ko-Fi: https://ko-fi.com/k3yomi
|
|
14
|
+
Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
|
|
15
|
+
|
|
16
|
+
Internal Package: @atmosx/event-product-parser
|
|
17
|
+
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { TypeSettings } from "../../@types/type.settings"
|
|
21
|
+
import { bootstrap } from '../../bootstrap'
|
|
22
|
+
import { setWarning } from '../@utilities/utilities.setWarning';
|
|
23
|
+
import { createEvent } from '../../@building/building.create';
|
|
24
|
+
import { validateEvents } from "../../@building/building.validate";
|
|
25
|
+
|
|
26
|
+
export const getCachedEvents = async (): Promise<void> => {
|
|
27
|
+
try {
|
|
28
|
+
const settings = bootstrap.settings as TypeSettings;
|
|
29
|
+
const tick = performance.now();
|
|
30
|
+
if (settings.NOAAWeatherWireServiceSettings.CacheSettings.Enabled) {
|
|
31
|
+
const max = settings.NOAAWeatherWireServiceSettings.CacheSettings.MaxRetentionHistory ?? 500;
|
|
32
|
+
const get = await bootstrap.database.prepare(`SELECT * FROM stanzas ORDER BY rowid DESC LIMIT ?`).all(max) as { rowid: number; stanza: string }[];
|
|
33
|
+
setWarning({ message: `Fetched ${get.length} cached stanzas from the database in ${Math.floor(performance.now() - tick)} ms` })
|
|
34
|
+
let events = get.map((row) => JSON.parse(row.stanza))
|
|
35
|
+
.filter(stanza => {
|
|
36
|
+
if (!stanza) { return }
|
|
37
|
+
const isSkippable = stanza.isIgnored ||
|
|
38
|
+
(stanza.isCapEvent) ||
|
|
39
|
+
(stanza.isCapEvent && !stanza.isCapAreaDescription)
|
|
40
|
+
return !isSkippable
|
|
41
|
+
});
|
|
42
|
+
events = events.sort((a, b) => b.issued - a.issued)
|
|
43
|
+
await Promise.all(events.map(event => createEvent(event, true)))
|
|
44
|
+
setWarning({ message: `Processed ${events.length} cached stanzas in ${Math.floor(performance.now() - tick)} ms` })
|
|
45
|
+
validateEvents(bootstrap.cache.processed)
|
|
46
|
+
}
|
|
47
|
+
} catch (error) {
|
|
48
|
+
setWarning({ message: `An error occurred while fetching cached stanzas: ${error.message} -> ${error.stack}` })
|
|
49
|
+
}
|
|
48
50
|
}
|
|
@@ -1,58 +1,59 @@
|
|
|
1
|
-
/*
|
|
2
|
-
_ _ _ __ __
|
|
3
|
-
/\ | | | | (_) \ \ / /
|
|
4
|
-
/ \ | |_ _ __ ___ ___ ___ _ __ | |__ ___ _ __ _ ___ \ V /
|
|
5
|
-
/ /\ \| __| '_ ` _ \ / _ \/ __| '_ \| '_ \ / _ \ '__| |/ __| > <
|
|
6
|
-
/ ____ \ |_| | | | | | (_) \__ \ |_) | | | | __/ | | | (__ / . \
|
|
7
|
-
/_/ \_\__|_| |_| |_|\___/|___/ .__/|_| |_|\___|_| |_|\___/_/ \_\
|
|
8
|
-
| |
|
|
9
|
-
|_|
|
|
10
|
-
|
|
11
|
-
Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
|
|
12
|
-
Discord: https://atmosphericx-discord.scriptkitty.cafe
|
|
13
|
-
Ko-Fi: https://ko-fi.com/k3yomi
|
|
14
|
-
Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
|
|
15
|
-
|
|
16
|
-
Internal Package: @atmosx/event-product-parser
|
|
17
|
-
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
import
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
26
|
-
import {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
bootstrap.database
|
|
37
|
-
|
|
38
|
-
.
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
.
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
.
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
.
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
await
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
1
|
+
/*
|
|
2
|
+
_ _ _ __ __
|
|
3
|
+
/\ | | | | (_) \ \ / /
|
|
4
|
+
/ \ | |_ _ __ ___ ___ ___ _ __ | |__ ___ _ __ _ ___ \ V /
|
|
5
|
+
/ /\ \| __| '_ ` _ \ / _ \/ __| '_ \| '_ \ / _ \ '__| |/ __| > <
|
|
6
|
+
/ ____ \ |_| | | | | | (_) \__ \ |_) | | | | __/ | | | (__ / . \
|
|
7
|
+
/_/ \_\__|_| |_| |_|\___/|___/ .__/|_| |_|\___|_| |_|\___/_/ \_\
|
|
8
|
+
| |
|
|
9
|
+
|_|
|
|
10
|
+
|
|
11
|
+
Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
|
|
12
|
+
Discord: https://atmosphericx-discord.scriptkitty.cafe
|
|
13
|
+
Ko-Fi: https://ko-fi.com/k3yomi
|
|
14
|
+
Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
|
|
15
|
+
|
|
16
|
+
Internal Package: @atmosx/event-product-parser
|
|
17
|
+
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
import { TypeSettings } from "../../@types/type.settings"
|
|
22
|
+
import { bootstrap } from "../../bootstrap"
|
|
23
|
+
import { setWarning } from '../@utilities/utilities.setWarning'
|
|
24
|
+
import { importShapefiles } from './database.shapefiles'
|
|
25
|
+
import { importBroadcastify } from "./database.broadcastify"
|
|
26
|
+
import { existsSync, writeFileSync } from "fs"
|
|
27
|
+
import sqlite3 from 'better-sqlite3'
|
|
28
|
+
|
|
29
|
+
export const initializeDatabase = async (): Promise<void> => {
|
|
30
|
+
const settings = bootstrap.settings as TypeSettings;
|
|
31
|
+
try {
|
|
32
|
+
if (!existsSync(settings.Database)) {
|
|
33
|
+
writeFileSync(settings.Database, '')
|
|
34
|
+
setWarning({ message: `Creating new database at ${settings.Database}` })
|
|
35
|
+
}
|
|
36
|
+
bootstrap.database = new sqlite3(settings.Database);
|
|
37
|
+
bootstrap.database
|
|
38
|
+
.prepare(`CREATE TABLE IF NOT EXISTS stanzas ( id INTEGER PRIMARY KEY AUTOINCREMENT, type TEXT, issued TEXT, stanza TEXT )`)
|
|
39
|
+
.run();
|
|
40
|
+
bootstrap.database
|
|
41
|
+
.prepare(`CREATE TABLE IF NOT EXISTS shapefiles (id TEXT PRIMARY KEY, location TEXT, geometry TEXT)`)
|
|
42
|
+
.run();
|
|
43
|
+
const isNeedingShapefiles = bootstrap.database
|
|
44
|
+
.prepare(`SELECT name FROM sqlite_master WHERE type='table' AND name='shapefiles';`)
|
|
45
|
+
.get();
|
|
46
|
+
const isNeedingBroadcastify = bootstrap.database
|
|
47
|
+
.prepare(`SELECT name FROM sqlite_master WHERE type='table' AND name='broadcastify';`)
|
|
48
|
+
.get();
|
|
49
|
+
|
|
50
|
+
if (!isNeedingShapefiles || !isNeedingBroadcastify) {
|
|
51
|
+
setWarning({message: `Required database tables are currently building, please ${bootstrap.ansi_colors.RED}DO NOT${bootstrap.ansi_colors.RESET} close your terminal. The building will not finish and will remain incomplete. If you do mess up, you will need to delete ${settings.Database} and restart the application.` })
|
|
52
|
+
await importBroadcastify();
|
|
53
|
+
await importShapefiles();
|
|
54
|
+
setWarning({ message: `Building has completed, you can now continue or close the terminal`})
|
|
55
|
+
}
|
|
56
|
+
} catch (error) {
|
|
57
|
+
setWarning({ message: `An error occurred while initializing the database: ${error.message}` })
|
|
58
|
+
}
|
|
58
59
|
}
|
|
@@ -1,93 +1,93 @@
|
|
|
1
|
-
/*
|
|
2
|
-
_ _ _ __ __
|
|
3
|
-
/\ | | | | (_) \ \ / /
|
|
4
|
-
/ \ | |_ _ __ ___ ___ ___ _ __ | |__ ___ _ __ _ ___ \ V /
|
|
5
|
-
/ /\ \| __| '_ ` _ \ / _ \/ __| '_ \| '_ \ / _ \ '__| |/ __| > <
|
|
6
|
-
/ ____ \ |_| | | | | | (_) \__ \ |_) | | | | __/ | | | (__ / . \
|
|
7
|
-
/_/ \_\__|_| |_| |_|\___/|___/ .__/|_| |_|\___|_| |_|\___/_/ \_\
|
|
8
|
-
| |
|
|
9
|
-
|_|
|
|
10
|
-
|
|
11
|
-
Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
|
|
12
|
-
Discord: https://atmosphericx-discord.scriptkitty.cafe
|
|
13
|
-
Ko-Fi: https://ko-fi.com/k3yomi
|
|
14
|
-
Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
|
|
15
|
-
|
|
16
|
-
Internal Package: @atmosx/event-product-parser
|
|
17
|
-
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
import
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
26
|
-
import {
|
|
27
|
-
import {
|
|
28
|
-
import {
|
|
29
|
-
|
|
30
|
-
export const importShapefiles = async (): Promise<void> => {
|
|
31
|
-
const settings = bootstrap.settings as TypeSettings;
|
|
32
|
-
try {
|
|
33
|
-
const tShapefiles = bootstrap.database
|
|
34
|
-
.prepare(`SELECT COUNT(*) AS count FROM shapefiles`)
|
|
35
|
-
.get().count;
|
|
36
|
-
if (tShapefiles === 0) {
|
|
37
|
-
await setSleep({timeout: 1e3});
|
|
38
|
-
for (const shapefile of dict_shapefiles) {
|
|
39
|
-
const response = await fetch(shapefile.link);
|
|
40
|
-
const arrayBuff = await response.arrayBuffer();
|
|
41
|
-
const content = await loadAsync(arrayBuff);
|
|
42
|
-
const directory = resolve(__dirname, `../../shapefiles`);
|
|
43
|
-
if (!
|
|
44
|
-
|
|
45
|
-
}
|
|
46
|
-
for (const file of Object.keys(content.files)) {
|
|
47
|
-
if (file.endsWith('.shp') || file.endsWith('.dbf')) {
|
|
48
|
-
const data = await content.files[file].async(`nodebuffer`)
|
|
49
|
-
const output = resolve(directory, `${shapefile?.name ?? ``}_${shapefile?.id ?? ``}${extname(file)}`)
|
|
50
|
-
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
const filepath = resolve(__dirname, '../../shapefiles', shapefile.name + '_' + shapefile.id)
|
|
54
|
-
const { features } = await read(
|
|
55
|
-
filepath,
|
|
56
|
-
filepath,
|
|
57
|
-
);
|
|
58
|
-
setWarning({ message: `Importing ${features.length} features from ${shapefile.name}_${shapefile.id} for Shapefiles` })
|
|
59
|
-
const insert = bootstrap.database
|
|
60
|
-
.prepare(`INSERT OR REPLACE INTO shapefiles (id, location, geometry) VALUES (?, ?, ?)`)
|
|
61
|
-
const transaction = bootstrap.database.transaction((entries: any[]) => {
|
|
62
|
-
for (const entry of entries) {
|
|
63
|
-
const { properties, geometry } = entry;
|
|
64
|
-
let final: string, location: string;
|
|
65
|
-
if (properties.FIPS) {
|
|
66
|
-
final = `${properties.STATE}${shapefile.id}${properties.FIPS.substring(2)}`;
|
|
67
|
-
location = `${properties.COUNTYNAME}, ${properties.STATE}`;
|
|
68
|
-
}
|
|
69
|
-
else if (properties.FULLSTAID) {
|
|
70
|
-
final = `${properties.ST}${shapefile.id}${properties.WFO}`;
|
|
71
|
-
location = `${properties.CITY}, ${properties.STATE}`;
|
|
72
|
-
}
|
|
73
|
-
else if (properties.STATE) {
|
|
74
|
-
final = `${properties.STATE}${shapefile.id}${properties.ZONE ?? properties.SITE_ID}`;
|
|
75
|
-
location = `${properties.NAME ?? `${properties.RFC_NAME} ${properties.RFC_CITY}`}, ${properties.STATE}`;
|
|
76
|
-
}
|
|
77
|
-
else {
|
|
78
|
-
final = properties.ID ?? properties.WFO
|
|
79
|
-
location = properties.NAME;
|
|
80
|
-
}
|
|
81
|
-
insert.run(final, location, JSON.stringify(geometry));
|
|
82
|
-
}
|
|
83
|
-
})
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
transaction(features)
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
}
|
|
90
|
-
} catch (error) {
|
|
91
|
-
setWarning( {message: `An error occurred while compiling shapefiles: ${error.message}` })
|
|
92
|
-
}
|
|
1
|
+
/*
|
|
2
|
+
_ _ _ __ __
|
|
3
|
+
/\ | | | | (_) \ \ / /
|
|
4
|
+
/ \ | |_ _ __ ___ ___ ___ _ __ | |__ ___ _ __ _ ___ \ V /
|
|
5
|
+
/ /\ \| __| '_ ` _ \ / _ \/ __| '_ \| '_ \ / _ \ '__| |/ __| > <
|
|
6
|
+
/ ____ \ |_| | | | | | (_) \__ \ |_) | | | | __/ | | | (__ / . \
|
|
7
|
+
/_/ \_\__|_| |_| |_|\___/|___/ .__/|_| |_|\___|_| |_|\___/_/ \_\
|
|
8
|
+
| |
|
|
9
|
+
|_|
|
|
10
|
+
|
|
11
|
+
Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
|
|
12
|
+
Discord: https://atmosphericx-discord.scriptkitty.cafe
|
|
13
|
+
Ko-Fi: https://ko-fi.com/k3yomi
|
|
14
|
+
Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
|
|
15
|
+
|
|
16
|
+
Internal Package: @atmosx/event-product-parser
|
|
17
|
+
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { TypeSettings } from "../../@types/type.settings"
|
|
21
|
+
import { dict_shapefiles } from '../../@dictionaries/dictionaries.shapefiles'
|
|
22
|
+
import { bootstrap } from "../../bootstrap"
|
|
23
|
+
import { setSleep } from '../@utilities/utilities.setSleep'
|
|
24
|
+
import { setWarning } from '../@utilities/utilities.setWarning'
|
|
25
|
+
import { existsSync, mkdirSync, writeFileSync, unlinkSync, rm } from "fs"
|
|
26
|
+
import { resolve, extname} from 'path'
|
|
27
|
+
import { loadAsync } from 'jszip'
|
|
28
|
+
import { read } from 'shapefile'
|
|
29
|
+
|
|
30
|
+
export const importShapefiles = async (): Promise<void> => {
|
|
31
|
+
const settings = bootstrap.settings as TypeSettings;
|
|
32
|
+
try {
|
|
33
|
+
const tShapefiles = bootstrap.database
|
|
34
|
+
.prepare(`SELECT COUNT(*) AS count FROM shapefiles`)
|
|
35
|
+
.get().count;
|
|
36
|
+
if (tShapefiles === 0) {
|
|
37
|
+
await setSleep({timeout: 1e3});
|
|
38
|
+
for (const shapefile of dict_shapefiles) {
|
|
39
|
+
const response = await fetch(shapefile.link);
|
|
40
|
+
const arrayBuff = await response.arrayBuffer();
|
|
41
|
+
const content = await loadAsync(arrayBuff);
|
|
42
|
+
const directory = resolve(__dirname, `../../shapefiles`);
|
|
43
|
+
if (!existsSync(directory)) {
|
|
44
|
+
mkdirSync(directory, { recursive: true });
|
|
45
|
+
}
|
|
46
|
+
for (const file of Object.keys(content.files)) {
|
|
47
|
+
if (file.endsWith('.shp') || file.endsWith('.dbf')) {
|
|
48
|
+
const data = await content.files[file].async(`nodebuffer`)
|
|
49
|
+
const output = resolve(directory, `${shapefile?.name ?? ``}_${shapefile?.id ?? ``}${extname(file)}`)
|
|
50
|
+
writeFileSync(output, data)
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
const filepath = resolve(__dirname, '../../shapefiles', shapefile.name + '_' + shapefile.id)
|
|
54
|
+
const { features } = await read(
|
|
55
|
+
filepath,
|
|
56
|
+
filepath,
|
|
57
|
+
);
|
|
58
|
+
setWarning({ message: `Importing ${features.length} features from ${shapefile.name}_${shapefile.id} for Shapefiles` })
|
|
59
|
+
const insert = bootstrap.database
|
|
60
|
+
.prepare(`INSERT OR REPLACE INTO shapefiles (id, location, geometry) VALUES (?, ?, ?)`)
|
|
61
|
+
const transaction = bootstrap.database.transaction((entries: any[]) => {
|
|
62
|
+
for (const entry of entries) {
|
|
63
|
+
const { properties, geometry } = entry;
|
|
64
|
+
let final: string, location: string;
|
|
65
|
+
if (properties.FIPS) {
|
|
66
|
+
final = `${properties.STATE}${shapefile.id}${properties.FIPS.substring(2)}`;
|
|
67
|
+
location = `${properties.COUNTYNAME}, ${properties.STATE}`;
|
|
68
|
+
}
|
|
69
|
+
else if (properties.FULLSTAID) {
|
|
70
|
+
final = `${properties.ST}${shapefile.id}${properties.WFO}`;
|
|
71
|
+
location = `${properties.CITY}, ${properties.STATE}`;
|
|
72
|
+
}
|
|
73
|
+
else if (properties.STATE) {
|
|
74
|
+
final = `${properties.STATE}${shapefile.id}${properties.ZONE ?? properties.SITE_ID}`;
|
|
75
|
+
location = `${properties.NAME ?? `${properties.RFC_NAME} ${properties.RFC_CITY}`}, ${properties.STATE}`;
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
final = properties.ID ?? properties.WFO
|
|
79
|
+
location = properties.NAME;
|
|
80
|
+
}
|
|
81
|
+
insert.run(final, location, JSON.stringify(geometry));
|
|
82
|
+
}
|
|
83
|
+
})
|
|
84
|
+
unlinkSync(`${filepath}.shp`)
|
|
85
|
+
unlinkSync(`${filepath}.dbf`)
|
|
86
|
+
transaction(features)
|
|
87
|
+
}
|
|
88
|
+
rm(resolve(__dirname, '../../shapefiles'), { recursive: true, force: true }, () => {});
|
|
89
|
+
}
|
|
90
|
+
} catch (error) {
|
|
91
|
+
setWarning( {message: `An error occurred while compiling shapefiles: ${error.message}` })
|
|
92
|
+
}
|
|
93
93
|
}
|
|
@@ -1,48 +1,47 @@
|
|
|
1
|
-
/*
|
|
2
|
-
_ _ _ __ __
|
|
3
|
-
/\ | | | | (_) \ \ / /
|
|
4
|
-
/ \ | |_ _ __ ___ ___ ___ _ __ | |__ ___ _ __ _ ___ \ V /
|
|
5
|
-
/ /\ \| __| '_ ` _ \ / _ \/ __| '_ \| '_ \ / _ \ '__| |/ __| > <
|
|
6
|
-
/ ____ \ |_| | | | | | (_) \__ \ |_) | | | | __/ | | | (__ / . \
|
|
7
|
-
/_/ \_\__|_| |_| |_|\___/|___/ .__/|_| |_|\___|_| |_|\___/_/ \_\
|
|
8
|
-
| |
|
|
9
|
-
|_|
|
|
10
|
-
|
|
11
|
-
Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
|
|
12
|
-
Discord: https://atmosphericx-discord.scriptkitty.cafe
|
|
13
|
-
Ko-Fi: https://ko-fi.com/k3yomi
|
|
14
|
-
Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
|
|
15
|
-
|
|
16
|
-
Internal Package: @atmosx/event-product-parser
|
|
17
|
-
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
.
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
.
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
.
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
}
|
|
1
|
+
/*
|
|
2
|
+
_ _ _ __ __
|
|
3
|
+
/\ | | | | (_) \ \ / /
|
|
4
|
+
/ \ | |_ _ __ ___ ___ ___ _ __ | |__ ___ _ __ _ ___ \ V /
|
|
5
|
+
/ /\ \| __| '_ ` _ \ / _ \/ __| '_ \| '_ \ / _ \ '__| |/ __| > <
|
|
6
|
+
/ ____ \ |_| | | | | | (_) \__ \ |_) | | | | __/ | | | (__ / . \
|
|
7
|
+
/_/ \_\__|_| |_| |_|\___/|___/ .__/|_| |_|\___|_| |_|\___/_/ \_\
|
|
8
|
+
| |
|
|
9
|
+
|_|
|
|
10
|
+
|
|
11
|
+
Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
|
|
12
|
+
Discord: https://atmosphericx-discord.scriptkitty.cafe
|
|
13
|
+
Ko-Fi: https://ko-fi.com/k3yomi
|
|
14
|
+
Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
|
|
15
|
+
|
|
16
|
+
Internal Package: @atmosx/event-product-parser
|
|
17
|
+
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { TypeSettings } from "../../@types/type.settings"
|
|
21
|
+
import { TypeStanzaCompiled } from '../../@types/type.compiled';
|
|
22
|
+
import { bootstrap } from '../../bootstrap'
|
|
23
|
+
import { setWarning } from '../@utilities/utilities.setWarning';
|
|
24
|
+
|
|
25
|
+
export const importStanza = async (stanza: TypeStanzaCompiled): Promise<void> => {
|
|
26
|
+
const settings = bootstrap.settings as TypeSettings;
|
|
27
|
+
try {
|
|
28
|
+
if (!settings.NOAAWeatherWireServiceSettings.CacheSettings.Enabled) { return }
|
|
29
|
+
bootstrap.database
|
|
30
|
+
.prepare(`INSERT OR IGNORE INTO stanzas (type, stanza, issued) VALUES (?, ?, ?)`)
|
|
31
|
+
.run(stanza.getType.type, JSON.stringify(stanza), stanza.attributes.issue)
|
|
32
|
+
const count = bootstrap.database
|
|
33
|
+
.prepare(`SELECT COUNT(*) as total FROM stanzas`)
|
|
34
|
+
.get() as { total: number }
|
|
35
|
+
const max = settings.NOAAWeatherWireServiceSettings.CacheSettings.MaxDatabaseHistory;
|
|
36
|
+
if (count.total > max) {
|
|
37
|
+
const toDelete = count.total - max;
|
|
38
|
+
if (toDelete > 0) {
|
|
39
|
+
bootstrap.database
|
|
40
|
+
.prepare(`DELETE FROM stanzas WHERE id IN (SELECT id FROM stanzas ORDER BY issued ASC LIMIT ?)`)
|
|
41
|
+
.run(toDelete);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
} catch (error) {
|
|
45
|
+
setWarning({ message: `An error occurred while importing stanza: ${error.message}` })
|
|
46
|
+
}
|
|
48
47
|
}
|