@atmosx/event-product-parser 3.0.54 → 3.0.61

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 (156) hide show
  1. package/.github/CODE_OF_CONDUCT.md +9 -9
  2. package/.github/CONTRIBUTING.md +29 -29
  3. package/.github/LICENSE +17 -17
  4. package/.github/SECURITY.md +20 -20
  5. package/.github/SUPPORTED_EVENTS.md +369 -369
  6. package/.github/docs/docs-functions.md +30 -0
  7. package/.github/docs/docs-general-configurations.md +209 -0
  8. package/.github/docs/docs-integrations.md +37 -0
  9. package/.github/docs/docs-listeners.md +28 -0
  10. package/.github/docs/docs-source-configuration.md +218 -0
  11. package/.github/docs/docs-technical.md +50 -0
  12. package/.github/logo.png +0 -0
  13. package/.github/samples/SAMPLE_EAS_GENERATION.wav +0 -0
  14. package/.github/samples/SAMPLE_GEOJSON.json +204 -0
  15. package/.github/samples/SAMPLE_TEXT_PRODUCT.txt +119 -0
  16. package/.vscode/settings.json +3 -3
  17. package/README.md +167 -0
  18. package/dist/cjs/index.cjs +1475 -1294
  19. package/dist/esm/index.mjs +1456 -1275
  20. package/package.json +47 -52
  21. package/src/@building/{building.create.ts → CreateEvent.ts} +55 -55
  22. package/src/@building/{building.clean.ts → GetCleanedEvent.ts} +29 -29
  23. package/src/@building/{building.attachments.ts → GetEventAttachments.ts} +85 -82
  24. package/src/@building/{building.enhance.ts → GetEventEnhancedName.ts} +54 -59
  25. package/src/@building/{building.geometry.ts → GetEventGeometry.ts} +47 -47
  26. package/src/@building/{building.headers.ts → GetEventHeader.ts} +36 -36
  27. package/src/@building/{building.polygon.ts → GetEventNodes.ts} +72 -69
  28. package/src/@building/{building.office.ts → GetEventOffice.ts} +42 -42
  29. package/src/@building/{building.properties.ts → GetEventProperties.ts} +95 -95
  30. package/src/@building/{building.signature.ts → GetEventSignature.ts} +60 -60
  31. package/src/@building/{building.tags.ts → GetEventTags.ts} +29 -24
  32. package/src/@building/{building.tracking.ts → GetEventTracking.ts} +67 -67
  33. package/src/@core/{core.clearEvents.ts → ClearEvents.ts} +30 -30
  34. package/src/@core/{core.createListener.ts → CreateListener.ts} +23 -23
  35. package/src/@core/{core.getEvents.ts → GetEvents.ts} +23 -23
  36. package/src/@core/{core.getNodes.ts → GetNodes.ts} +23 -23
  37. package/src/@core/{core.getRandomEvent.ts → GetRandomEvent.ts} +23 -23
  38. package/src/@core/{core.getVersion.ts → GetVersion.ts} +23 -23
  39. package/src/@core/{core.manualEvent.ts → ManualEvent.ts} +56 -38
  40. package/src/@core/{core.query.ts → QueryStanza.ts} +38 -38
  41. package/src/@core/{core.setNode.ts → SetNode.ts} +80 -80
  42. package/src/@core/{core.start.ts → StartService.ts} +60 -60
  43. package/src/@core/{core.stop.ts → StopService.ts} +31 -31
  44. package/src/@enums/AWIPS.ts +366 -0
  45. package/src/{@dictionaries/dictionaries.actions.ts → @enums/Actions.ts} +27 -27
  46. package/src/{@dictionaries/dictionaries.cancellation.ts → @enums/Cancellation.ts} +30 -30
  47. package/src/{@dictionaries/dictionaries.causes.ts → @enums/Causes.ts} +35 -35
  48. package/src/{@dictionaries/dictionaries.correlations.ts → @enums/Correlations.ts} +42 -42
  49. package/src/{@dictionaries/dictionaries.enhanced.ts → @enums/Enhanced.ts} +69 -66
  50. package/src/{@dictionaries/dictionaries.events.ts → @enums/Events.ts} +82 -82
  51. package/src/{@dictionaries/dictionaries.expressions.ts → @enums/Expressions.ts} +28 -28
  52. package/src/@enums/GlobalFilter.ts +24 -0
  53. package/src/{@dictionaries/dictionaries.hail.ts → @enums/Hail.ts} +37 -35
  54. package/src/{@dictionaries/dictionaries.icao.ts → @enums/ICAO.ts} +258 -258
  55. package/src/{@dictionaries/dictionaries.matches.ts → @enums/Matches.ts} +54 -54
  56. package/src/{@dictionaries/dictionaries.products.ts → @enums/Products.ts} +24 -24
  57. package/src/{@dictionaries/dictionaries.records.ts → @enums/Records.ts} +25 -25
  58. package/src/{@dictionaries/dictionaries.severity.ts → @enums/Severity.ts} +27 -27
  59. package/src/{@dictionaries/dictionaries.shapefiles.ts → @enums/Shapefiles.ts} +35 -35
  60. package/src/{@dictionaries/dictionaries.states.ts → @enums/States.ts} +71 -71
  61. package/src/{@dictionaries/dictionaries.status.ts → @enums/Status.ts} +30 -30
  62. package/src/{@dictionaries/dictionaries.global.ts → @enums/Strings.ts} +22 -24
  63. package/src/@enums/Tags.ts +167 -0
  64. package/src/{@dictionaries/dictionaries.testing.ts → @enums/Testing.ts} +24 -24
  65. package/src/@events/{events.api.ts → ParseAPI.ts} +116 -116
  66. package/src/@events/{events.text.ts → ParseText.ts} +87 -84
  67. package/src/@events/{events.ugc.ts → ParseUGC.ts} +93 -89
  68. package/src/@events/{events.vtec.ts → ParseVTEC.ts} +86 -86
  69. package/src/@manager/MakeEvents.ts +106 -0
  70. package/src/@manager/RemoveEvent.ts +70 -0
  71. package/src/@manager/{manager.setHash.ts → SetHash.ts} +35 -35
  72. package/src/@manager/Tasks.ts +246 -0
  73. package/src/@manager/{manager.updateEvents.ts → UpdateEvents.ts} +34 -32
  74. package/src/@manager/{manager.updateNodes.ts → UpdateNode.ts} +61 -53
  75. package/src/{@building/building.validate.ts → @manager/ValidateEvents.ts} +141 -152
  76. package/src/@modules/@database/{database.cache.ts → GetCachedEvents.ts} +49 -49
  77. package/src/@modules/@database/{database.broadcastify.ts → ImportBroadcastify.ts} +69 -66
  78. package/src/@modules/@database/{database.shapefiles.ts → ImportShapefiles.ts} +92 -92
  79. package/src/@modules/@database/{database.stanza.ts → ImportStanza.ts} +46 -46
  80. package/src/@modules/@database/{database.init.ts → InitializeDatabase.ts} +58 -58
  81. package/src/@modules/@eas/{eas.setEasTone.ts → GenerateEASMessage.ts} +144 -151
  82. package/src/@modules/@eas/{eas.getCleanDescription.ts → GetCleanDescription.ts} +91 -91
  83. package/src/@modules/@eas/{eas.getFloatPCM16.ts → GetFloatPCM16.ts} +29 -29
  84. package/src/@modules/@eas/{eas.getMergedPCM16.ts → GetMergedPCM16.ts} +32 -32
  85. package/src/@modules/@eas/{eas.getPCM16.ts → GetPCM16.ts} +52 -52
  86. package/src/@modules/@eas/{eas.getPCMToFloat.ts → GetPCMToFloat.ts} +26 -26
  87. package/src/@modules/@eas/{eas.getSampledPCM16.ts → GetSampledPCM16.ts} +36 -36
  88. package/src/@modules/@eas/{eas.getTTS.ts → GetTTS.ts} +54 -54
  89. package/src/@modules/@eas/{eas.getWavPCM16.ts → GetWavPCM16.ts} +52 -52
  90. package/src/@modules/@eas/{eas.setAFSK.ts → SetAFSK.ts} +51 -51
  91. package/src/@modules/@eas/{eas.setAsciiToBits.ts → SetAsciiToBits.ts} +31 -31
  92. package/src/@modules/@eas/{eas.setAttentionTone.ts → SetAttentionTone.ts} +40 -40
  93. package/src/@modules/@eas/{eas.setNoise.ts → SetNoise.ts} +32 -32
  94. package/src/@modules/@eas/{eas.setRadioEffect.ts → SetRadioEffect.ts} +50 -50
  95. package/src/@modules/@eas/{eas.setSameHeader.ts → SetSameHeader.ts} +44 -44
  96. package/src/@modules/@stanza/{stanza.getAwipsType.ts → GetAwipsType.ts} +47 -45
  97. package/src/@modules/@stanza/{stanza.validate.ts → ValidateStanza.ts} +49 -49
  98. package/src/@modules/@utilities/{utilities.createHttp.ts → CreateHttp.ts} +83 -83
  99. package/src/@modules/@utilities/{utilities.getFormattedTime.ts → GetFormattedTime.ts} +43 -43
  100. package/src/@modules/@utilities/{utilities.getLatestIssuance.ts → GetLatestIssuance.ts} +32 -32
  101. package/src/@modules/@utilities/{utilities.getMatched.ts → GetMatched.ts} +33 -33
  102. package/src/@modules/@utilities/{utilities.getSettings.ts → GetSettings.ts} +25 -25
  103. package/src/@modules/@utilities/{utilities.getShapeNearestPoint.ts → GetShapeNearestPoint.ts} +114 -114
  104. package/src/@modules/@utilities/{utilities.setCronSchedule.ts → SetCronSchedule.ts} +94 -94
  105. package/src/@modules/@utilities/{utilities.setDebug.ts → SetDebug.ts} +37 -38
  106. package/src/@modules/@utilities/{utilities.setEventEmit.ts → SetEventEmit.ts} +41 -41
  107. package/src/@modules/@utilities/{utilities.setListener.ts → SetListener.ts} +30 -30
  108. package/src/@modules/@utilities/{utilities.setSettings.ts → SetSettings.ts} +42 -42
  109. package/src/@modules/@utilities/{utilities.setSleep.ts → SetSleep.ts} +33 -33
  110. package/src/@modules/@utilities/{utilities.setTimeoutAction.ts → SetTimeoutAction.ts} +63 -62
  111. package/src/@modules/@utilities/{utilities.setWarning.ts → SetWarning.ts} +34 -34
  112. package/src/@modules/@xmpp/{xmpp.xDeploy.ts → DeployXMPP.ts} +57 -57
  113. package/src/@modules/@xmpp/{xmpp.xError.ts → ErrorXMPP.ts} +26 -26
  114. package/src/@modules/@xmpp/{xmpp.xOffline.ts → OfflineXMPP.ts} +36 -36
  115. package/src/@modules/@xmpp/{xmpp.xOnline.ts → OnlineXMPP.ts} +45 -45
  116. package/src/@modules/@xmpp/{xmpp.xReconnect.ts → ReconnectXMPP.ts} +64 -64
  117. package/src/@modules/@xmpp/{xmpp.xStanza.ts → StanzaXMPP.ts} +62 -62
  118. package/src/@parsers/@hvtec/{hvtec.extract.ts → HVExtract.ts} +39 -39
  119. package/src/@parsers/@pvtec/{pvtec.expires.ts → GetExpiry.ts} +25 -25
  120. package/src/@parsers/@pvtec/{pvtec.extract.ts → VTECExtract.ts} +48 -48
  121. package/src/@parsers/@text/{text.getDescriptionFromProduct.ts → GetDescriptionFromProduct.ts} +59 -52
  122. package/src/@parsers/@text/{text.getEmbedText.ts → GetEmbededText.ts} +55 -55
  123. package/src/@parsers/@text/{text.getPolygonFromProduct.ts → GetPolygonFromProduct.ts} +52 -52
  124. package/src/@parsers/@text/{text.getStringText.ts → GetStringText.ts} +57 -53
  125. package/src/@parsers/@text/{text.getTextFromProduct.ts → GetTextFromProduct.ts} +42 -42
  126. package/src/@parsers/@text/{text.getXML.ts → GetXML.ts} +60 -60
  127. package/src/@parsers/@ugc/{ugc.getCache.ts → GetCache.ts} +23 -23
  128. package/src/@parsers/@ugc/{ugc.expiry.ts → GetExpiry.ts} +31 -31
  129. package/src/@parsers/@ugc/{ugc.locations.ts → GetLocations.ts} +56 -56
  130. package/src/@parsers/@ugc/{ugc.header.ts → GetUGCHeader.ts} +29 -29
  131. package/src/@parsers/@ugc/{ugc.coordinates.ts → GetZonePolygon.ts} +110 -110
  132. package/src/@parsers/@ugc/{ugc.zones.ts → GetZones.ts} +51 -51
  133. package/src/@parsers/@ugc/{ugc.setCache.ts → SetCache.ts} +27 -27
  134. package/src/@parsers/@ugc/{ugc.extract.ts → UGCExtract.ts} +36 -36
  135. package/src/@types/{type.listener.ts → Actions.ts} +37 -38
  136. package/src/@types/{type.attributes.ts → Attributes.ts} +28 -28
  137. package/src/@types/{type.event.ts → Event.ts} +69 -69
  138. package/src/@types/{type.hvtec.ts → HVTEC.ts} +25 -25
  139. package/src/@types/{type.hash.ts → Hash.ts} +24 -24
  140. package/src/@types/{type.properties.ts → Properties.ts} +77 -77
  141. package/src/@types/{type.settings.ts → Settings.ts} +99 -93
  142. package/src/@types/{type.stanza.ts → Stanza.ts} +37 -37
  143. package/src/@types/{type.compiled.ts → StanzaCompiled.ts} +35 -34
  144. package/src/@types/{type.ugc.ts → UGC.ts} +24 -24
  145. package/src/@types/{type.pvtec.ts → VTEC.ts} +30 -30
  146. package/src/bootstrap.ts +128 -124
  147. package/src/index.ts +74 -74
  148. package/tsconfig.json +13 -13
  149. package/tsup.config.ts +15 -15
  150. package/.github/README.md +0 -384
  151. package/src/@dictionaries/dictionaries.awips.ts +0 -364
  152. package/src/@dictionaries/dictionaries.tags.ts +0 -93
  153. package/src/@manager/manager.mkEvent.ts +0 -98
  154. package/src/@manager/manager.rmEvent.ts +0 -59
  155. package/src/@manager/manager.updateListener.ts +0 -177
  156. package/testing/init.js +0 -91
@@ -1,153 +1,142 @@
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 { TypeEvent } from "../@types/type.event";
21
- import { TypeSettings } from "../@types/type.settings";
22
- import { bootstrap } from "../bootstrap"
23
- import { getEventEnhancedName } from "./building.enhance";
24
- import { getEventSignature } from "./building.signature"
25
- import { mkEvent } from "../@manager/manager.mkEvent";
26
- import { rmEvent } from "../@manager/manager.rmEvent";
27
- import { getEventAttachments } from "./building.attachments";
28
- import { updateNode } from "../@manager/manager.updateNodes";
29
- import { setEventEmit } from "../@modules/@utilities/utilities.setEventEmit";
30
- import { setDebug } from "../@modules/@utilities/utilities.setDebug";
31
- import { getMatched } from "../@modules/@utilities/utilities.getMatched";
32
- import { getEventGeometry } from "../@building/building.geometry";
33
- import { createHash } from "crypto"
34
-
35
- export const validateEvents = async (events: TypeEvent[]): Promise<void> => {
36
- const tick = performance.now();
37
- if (events.length === 0) return
38
- const configurations = bootstrap.settings as TypeSettings
39
- const sets = {} as Record<string, Set<string>>;
40
- const bools = {} as Record<string, boolean>;
41
- const megered = {...configurations.GlobalSettings, ...configurations.GlobalSettings.EventFiltering}
42
- for (const key in megered) {
43
- const setting = megered[key];
44
- if (Array.isArray(setting)) { sets[key] = new Set(setting.map(item => item.toLowerCase())); }
45
- if (typeof setting === 'boolean') { bools[key] = setting; }
46
- }
47
-
48
- const isFiltered = (define: TypeEvent): boolean => {
49
- const properties = define.properties;
50
- const zones = properties.geocode.ugc;
51
- const icao = properties.geocode.office.office
52
-
53
- if (properties.status_metadata.is_test) {
54
- setEventEmit({ event: `onTestProduct`, metadata: define })
55
- if (bools?.IgnoreTestProducts) return true;
56
- }
57
-
58
- if (properties.status_metadata.is_expired) {
59
- setEventEmit({ event: `onExpiredProduct`, metadata: define })
60
- rmEvent(define)
61
- return true;
62
- }
63
-
64
- if (properties.metadata?.vtec?.is_watch && properties.metadata.source != `events.api`) {
65
- const isSPC = properties.metadata?.vtec?.prediction_center;
66
- setEventEmit({ event: isSPC ? `onStormPredictionWatch` : `onNonStormPredictionWatch`, metadata: define })
67
- if (bools?.SPCWatchesOnly && !isSPC) {
68
- return true;
69
- }
70
- if ((!bools?.SPCWatchesOnly) && isSPC) {
71
- return true
72
- }
73
- }
74
-
75
- for (const key in sets) {
76
- const setting = sets[key]
77
- const values = [...setting];
78
- if (key === 'ListeningEvents' && setting.size > 0 && !getMatched(values, define.properties.event)) {
79
- setEventEmit({
80
- event: `onFilteredEvent`,
81
- metadata: define
82
- });
83
- return true
84
- }
85
- if (key === 'IgnoredEvents' && setting.size > 0 && getMatched(values, define.properties.event)) {
86
- setEventEmit({
87
- event: `onIgnoredEvent`,
88
- metadata: define
89
- });
90
- return true
91
- }
92
- if (key === 'ListeningICAO' && setting.size > 0 && icao != null && !setting.has(icao.toLowerCase())) {
93
- setEventEmit({
94
- event: `onFilteredICAO`,
95
- metadata: define
96
- });
97
- return true
98
- }
99
- if (key === 'IgnoredICAO' && setting.size > 0 && icao != null && setting.has(icao.toLowerCase())) {
100
- setEventEmit({
101
- event: `onIgnoredICAO`,
102
- metadata: define
103
- });
104
- return true
105
- }
106
- if (key === 'ListeningUGC' && setting.size > 0 && zones.length > 0 && !zones.some((ugc: string) => setting.has(ugc.toLowerCase()))) {
107
- setEventEmit({
108
- event: `onFilteredUGC`,
109
- metadata: define
110
- });
111
- return true
112
- }
113
- if (key === 'ListeningStates' && setting.size > 0 && zones.length > 0 && !zones.some((ugc: string) => setting.has(ugc.substring(0, 2).toLowerCase()))) {
114
- setEventEmit({
115
- event: `onFilteredState`,
116
- metadata: define
117
- });
118
- return true
119
- }
120
- }
121
- return false
122
- }
123
-
124
- const filtering = events.filter((event: TypeEvent) => {
125
- bootstrap.cache.processed = bootstrap.cache.processed.filter((e) => e !== event);
126
- const define = getEventSignature(event) as TypeEvent;
127
- const properties = define.properties; delete properties?.metadata?.ms;
128
- const enhanced = properties.event = getEventEnhancedName(event)
129
- const filtered = isFiltered(define)
130
- if (!filtered) {
131
- event.geometry = !bools?.DisableGeometryParsing ? getEventGeometry(event) : null;
132
- properties.metadata.attachments = getEventAttachments(event)
133
- }
134
- properties.metadata.hash = createHash("sha256").update(JSON.stringify(properties)).digest("hex")
135
- setEventEmit({ event: `onProductType${enhanced.replace(/\s+/g, '')}`, metadata: define });
136
- return !filtered
137
- })
138
-
139
-
140
- if (filtering.length > 0) {
141
- for (const event of filtering) {
142
- await mkEvent(event)
143
- }
144
- }
145
-
146
- await updateNode()
147
- setEventEmit({
148
- event: `onEventCache`,
149
- metadata: bootstrap.cache.events,
150
- limited: true
151
- })
152
- setDebug({ title: `@building.validate`, message: `Filtered ${filtering.length} events which took ${performance.now() - tick} ms` })
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 { TypeEvent } from "../@types/Event";
21
+ import { TypeSettings } from "../@types/Settings";
22
+ import { bootstrap } from "../bootstrap"
23
+ import { GetEventEnhancedName } from "../@building/GetEventEnhancedName";
24
+ import { GetEventSignature } from "../@building/GetEventSignature"
25
+ import { MakeEvents } from "./MakeEvents";
26
+ import { RemoveEvent } from "./RemoveEvent";
27
+ import { GetEventAttachments } from "../@building/GetEventAttachments";
28
+ import { SetEventEmit } from "../@modules/@utilities/SetEventEmit";
29
+ import { SetDebug } from "../@modules/@utilities/SetDebug";
30
+ import { GetMatched } from "../@modules/@utilities/GetMatched";
31
+ import { GetEventGeometry } from "../@building/GetEventGeometry";
32
+ import { createHash } from "crypto"
33
+
34
+ export const ValidateEvents = async (events: TypeEvent[]): Promise<void> => {
35
+ const tick = performance.now();
36
+ if (events.length === 0) return
37
+ const configurations = bootstrap.settings as TypeSettings
38
+ const sets = {} as Record<string, Set<string>>;
39
+ const bools = {} as Record<string, boolean>;
40
+ const megered = {...configurations.GlobalSettings, ...configurations.GlobalSettings.EventFiltering}
41
+ for (const key in megered) {
42
+ const setting = megered[key];
43
+ if (Array.isArray(setting)) { sets[key] = new Set(setting.map(item => item.toLowerCase())); }
44
+ if (typeof setting === 'boolean') { bools[key] = setting; }
45
+ }
46
+
47
+ const isFiltered = (define: TypeEvent): boolean => {
48
+ const properties = define.properties;
49
+ const zones = properties.geocode.ugc;
50
+ const icao = properties.geocode.office.office
51
+
52
+ if (properties.status_metadata.is_test) {
53
+ SetEventEmit({ event: `onTestProduct`, metadata: define })
54
+ if (bools?.IgnoreTestProducts) return true;
55
+ }
56
+
57
+ if (properties.status_metadata.is_expired) {
58
+ SetEventEmit({ event: `onExpiredProduct`, metadata: define })
59
+ RemoveEvent(define, false)
60
+ return true;
61
+ }
62
+
63
+ if (properties.metadata?.vtec?.is_watch && properties.metadata.source != `events.api`) {
64
+ const isSPC = properties.metadata?.vtec?.prediction_center;
65
+ SetEventEmit({ event: isSPC ? `onStormPredictionWatch` : `onNonStormPredictionWatch`, metadata: define })
66
+ if (bools?.SPCWatchesOnly && !isSPC) {
67
+ return true;
68
+ }
69
+ if ((!bools?.SPCWatchesOnly) && isSPC) {
70
+ return true
71
+ }
72
+ }
73
+
74
+ for (const key in sets) {
75
+ const setting = sets[key]
76
+ const values = [...setting];
77
+ if (key === 'ListeningEvents' && setting.size > 0 && !GetMatched(values, define.properties.event)) {
78
+ SetEventEmit({
79
+ event: `onFilteredEvent`,
80
+ metadata: define
81
+ });
82
+ return true
83
+ }
84
+ if (key === 'IgnoredEvents' && setting.size > 0 && GetMatched(values, define.properties.event)) {
85
+ SetEventEmit({
86
+ event: `onIgnoredEvent`,
87
+ metadata: define
88
+ });
89
+ return true
90
+ }
91
+ if (key === 'ListeningICAO' && setting.size > 0 && icao != null && !setting.has(icao.toLowerCase())) {
92
+ SetEventEmit({
93
+ event: `onFilteredICAO`,
94
+ metadata: define
95
+ });
96
+ return true
97
+ }
98
+ if (key === 'IgnoredICAO' && setting.size > 0 && icao != null && setting.has(icao.toLowerCase())) {
99
+ SetEventEmit({
100
+ event: `onIgnoredICAO`,
101
+ metadata: define
102
+ });
103
+ return true
104
+ }
105
+ if (key === 'ListeningUGC' && setting.size > 0 && zones.length > 0 && !zones.some((ugc: string) => setting.has(ugc.toLowerCase()))) {
106
+ SetEventEmit({
107
+ event: `onFilteredUGC`,
108
+ metadata: define
109
+ });
110
+ return true
111
+ }
112
+ if (key === 'ListeningStates' && setting.size > 0 && zones.length > 0 && !zones.some((ugc: string) => setting.has(ugc.substring(0, 2).toLowerCase()))) {
113
+ SetEventEmit({
114
+ event: `onFilteredState`,
115
+ metadata: define
116
+ });
117
+ return true
118
+ }
119
+ }
120
+ return false
121
+ }
122
+
123
+ const filtering = events.filter((event: TypeEvent) => {
124
+ bootstrap.cache.processed = bootstrap.cache.processed.filter((e) => e !== event);
125
+ const define = GetEventSignature(event) as TypeEvent;
126
+ const pre = {...define,properties: {...define.properties, metadata: {...define.properties.metadata }}};
127
+ const properties = define.properties; delete pre.properties.metadata.ms; delete pre.properties.metadata.header;
128
+ const enhanced = properties.event = GetEventEnhancedName(event)
129
+ const filtered = isFiltered(define)
130
+ if (!filtered) {
131
+ event.geometry = !bools?.DisableGeometryParsing ? GetEventGeometry(event) : null;
132
+ properties.metadata.attachments = GetEventAttachments(event)
133
+ }
134
+ properties.metadata.hash = createHash("sha256").update(JSON.stringify(pre)).digest("hex")
135
+ SetEventEmit({ event: `onProductType${enhanced.replace(/\s+/g, '')}`, metadata: define });
136
+ return !filtered
137
+ })
138
+
139
+ SetDebug({ title: `ValidateEvents (PRE) (${filtering.length}/${events.length})`, message: `${Math.round(performance.now() - tick)}ms` })
140
+ await MakeEvents(filtering)
141
+ SetDebug({ title: `MakeEvents (${filtering.length}/${events.length})`, message: `${Math.round(performance.now() - tick)}ms` })
153
142
  }
@@ -1,50 +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
- 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
- }
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/Settings"
21
+ import { bootstrap } from '../../bootstrap'
22
+ import { SetWarning } from '../@utilities/SetWarning';
23
+ import { CreateEvent } from '../../@building/CreateEvent';
24
+ import { ValidateEvents } from "../../@manager/ValidateEvents";
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
+ await ValidateEvents(bootstrap.cache.processed)
46
+ }
47
+ } catch (error) {
48
+ SetWarning({ message: `An error occurred while fetching cached stanzas: ${error.message} -> ${error.stack}` })
49
+ }
50
50
  }
@@ -1,67 +1,70 @@
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 { bootstrap } from "../../bootstrap"
21
- import { createHttp } from '../@utilities/utilities.createHttp'
22
- import { setWarning } from "../@utilities/utilities.setWarning";
23
-
24
- export const importBroadcastify = async (): Promise<void> => {
25
- const settings = bootstrap.settings;
26
-
27
- const isBroadcastifyImported = bootstrap.database
28
- .prepare(`SELECT name FROM sqlite_master WHERE type='table' AND name='broadcastify';`)
29
- .get();
30
-
31
-
32
- if (!settings.BroadcastifySettings.BroadcastifyAttachments) { return }
33
- if (isBroadcastifyImported) { return }
34
-
35
- const broadcastify = await createHttp({
36
- url: settings.BroadcastifySettings.BroadcastifyDatabase,
37
- timeout: 5000,
38
- });
39
- if (!broadcastify.error) {
40
- bootstrap.database.prepare(`CREATE TABLE broadcastify ( state TEXT, county TEXT, feed TEXT, type TEXT, link TEXT);`)
41
- .run();
42
- const states = JSON.parse(broadcastify.message);
43
- const insert = bootstrap.database.prepare(`INSERT INTO broadcastify (state, county, feed, type, link) VALUES (?, ?, ?, ?, ?)`);
44
- const transaction = bootstrap.database.transaction((rows: any[]) => {
45
- for (const row of rows) {
46
- insert.run(row);
47
- }
48
- });
49
- const batch: any[] = [];
50
- for (const state of states) {
51
- setWarning({ message: `Importing ${state.counties.length} counties from ${state.state} for Broadcastify` });
52
- for (const county of state.counties) {
53
- const countyName = county.county;
54
- for (const feed of county.feeds) {
55
- batch.push([
56
- state.state,
57
- countyName,
58
- feed.name,
59
- feed.type,
60
- feed.link
61
- ]);
62
- }
63
- }
64
- }
65
- transaction(batch);
66
- }
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 { bootstrap } from "../../bootstrap"
21
+ import { CreateHttp } from '../@utilities/CreateHttp'
22
+ import { SetWarning } from "../@utilities/SetWarning";
23
+
24
+ export const ImportBroadcastify = async (): Promise<void> => {
25
+ const settings = bootstrap.settings;
26
+
27
+ const isBroadcastifyImported = bootstrap.database
28
+ .prepare(`SELECT name FROM sqlite_master WHERE type='table' AND name='broadcastify';`)
29
+ .get();
30
+
31
+
32
+ if (!settings.BroadcastifySettings.BroadcastifyAttachments) { return }
33
+ if (isBroadcastifyImported) { return }
34
+
35
+ const broadcastify = await CreateHttp({
36
+ url: settings.BroadcastifySettings.BroadcastifyDatabase,
37
+ timeout: 5000,
38
+ });
39
+ if (!broadcastify.error) {
40
+ bootstrap.database.prepare(`CREATE TABLE broadcastify ( state TEXT, county TEXT, feed TEXT, type TEXT, link TEXT);`)
41
+ .run();
42
+ const states = JSON.parse(broadcastify.message);
43
+ const insert = bootstrap.database.prepare(`INSERT INTO broadcastify (state, county, feed, type, link) VALUES (?, ?, ?, ?, ?)`);
44
+ const transaction = bootstrap.database.transaction((rows: any[]) => {
45
+ for (const row of rows) {
46
+ insert.run(row);
47
+ }
48
+ });
49
+ const batch: any[] = [];
50
+ for (const state of states) {
51
+ SetWarning({ message: `Importing ${state.counties.length} counties from ${state.state} for Broadcastify` });
52
+ for (const county of state.counties) {
53
+ const countyName = county.county;
54
+ for (const feed of county.feeds) {
55
+ batch.push([
56
+ state.state,
57
+ countyName,
58
+ feed.name,
59
+ feed.type,
60
+ feed.link
61
+ ]);
62
+ }
63
+ }
64
+ }
65
+ transaction(batch);
66
+ }
67
+ if (broadcastify.error) {
68
+ SetWarning({ message: `Error importing Broadcastify data: ${broadcastify.message}` });
69
+ }
67
70
  };