@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.
Files changed (141) hide show
  1. package/.vscode/settings.json +3 -3
  2. package/CODE_OF_CONDUCT.md +9 -9
  3. package/CONTRIBUTING.md +29 -29
  4. package/LICENSE +17 -17
  5. package/README.md +443 -417
  6. package/SECURITY.md +20 -20
  7. package/SUPPORTED_EVENTS.md +369 -368
  8. package/dist/cjs/index.cjs +1925 -1885
  9. package/dist/esm/index.mjs +1927 -1887
  10. package/package.json +52 -52
  11. package/src/@building/building.attachments.ts +82 -82
  12. package/src/@building/building.clean.ts +29 -29
  13. package/src/@building/building.create.ts +55 -41
  14. package/src/@building/building.enhance.ts +59 -59
  15. package/src/@building/building.geometry.ts +47 -47
  16. package/src/@building/building.headers.ts +36 -36
  17. package/src/@building/building.office.ts +42 -42
  18. package/src/@building/building.polygon.ts +69 -70
  19. package/src/@building/building.properties.ts +95 -95
  20. package/src/@building/building.signature.ts +60 -61
  21. package/src/@building/building.tags.ts +23 -23
  22. package/src/@building/building.tracking.ts +67 -67
  23. package/src/@building/building.validate.ts +152 -146
  24. package/src/@core/core.clearEvents.ts +30 -31
  25. package/src/@core/core.createListener.ts +23 -23
  26. package/src/@core/core.getEvents.ts +23 -24
  27. package/src/@core/core.getNodes.ts +23 -24
  28. package/src/@core/core.getRandomEvent.ts +23 -24
  29. package/src/@core/core.getVersion.ts +23 -24
  30. package/src/@core/core.manualEvent.ts +38 -0
  31. package/src/@core/core.query.ts +38 -38
  32. package/src/@core/core.setNode.ts +80 -80
  33. package/src/@core/core.start.ts +60 -60
  34. package/src/@core/core.stop.ts +31 -31
  35. package/src/@dictionaries/dictionaries.actions.ts +27 -27
  36. package/src/@dictionaries/dictionaries.awips.ts +363 -363
  37. package/src/@dictionaries/dictionaries.cancellation.ts +30 -30
  38. package/src/@dictionaries/dictionaries.causes.ts +35 -35
  39. package/src/@dictionaries/dictionaries.correlations.ts +42 -42
  40. package/src/@dictionaries/dictionaries.enhanced.ts +66 -109
  41. package/src/@dictionaries/dictionaries.events.ts +82 -82
  42. package/src/@dictionaries/dictionaries.expressions.ts +28 -28
  43. package/src/@dictionaries/dictionaries.global.ts +24 -0
  44. package/src/@dictionaries/dictionaries.hail.ts +35 -35
  45. package/src/@dictionaries/dictionaries.icao.ts +258 -258
  46. package/src/@dictionaries/dictionaries.matches.ts +54 -35
  47. package/src/@dictionaries/dictionaries.products.ts +24 -24
  48. package/src/@dictionaries/dictionaries.records.ts +25 -25
  49. package/src/@dictionaries/dictionaries.severity.ts +27 -27
  50. package/src/@dictionaries/dictionaries.shapefiles.ts +35 -35
  51. package/src/@dictionaries/dictionaries.states.ts +71 -71
  52. package/src/@dictionaries/dictionaries.status.ts +30 -30
  53. package/src/@dictionaries/dictionaries.tags.ts +92 -92
  54. package/src/@dictionaries/dictionaries.testing.ts +24 -24
  55. package/src/@events/events.api.ts +116 -118
  56. package/src/@events/events.text.ts +84 -81
  57. package/src/@events/events.ugc.ts +89 -85
  58. package/src/@events/events.vtec.ts +86 -87
  59. package/src/@manager/manager.mkEvent.ts +97 -88
  60. package/src/@manager/manager.rmEvent.ts +56 -49
  61. package/src/@manager/manager.setHash.ts +35 -36
  62. package/src/@manager/manager.updateEvents.ts +32 -34
  63. package/src/@manager/manager.updateListener.ts +154 -159
  64. package/src/@manager/manager.updateNodes.ts +53 -54
  65. package/src/@modules/@database/database.broadcastify.ts +66 -66
  66. package/src/@modules/@database/database.cache.ts +49 -47
  67. package/src/@modules/@database/database.init.ts +58 -57
  68. package/src/@modules/@database/database.shapefiles.ts +92 -92
  69. package/src/@modules/@database/database.stanza.ts +46 -47
  70. package/src/@modules/@eas/eas.getCleanDescription.ts +91 -91
  71. package/src/@modules/@eas/eas.getFloatPCM16.ts +29 -29
  72. package/src/@modules/@eas/eas.getMergedPCM16.ts +32 -32
  73. package/src/@modules/@eas/eas.getPCM16.ts +52 -52
  74. package/src/@modules/@eas/eas.getPCMToFloat.ts +26 -26
  75. package/src/@modules/@eas/eas.getSampledPCM16.ts +36 -36
  76. package/src/@modules/@eas/eas.getTTS.ts +54 -54
  77. package/src/@modules/@eas/eas.getWavPCM16.ts +52 -52
  78. package/src/@modules/@eas/eas.setAFSK.ts +51 -52
  79. package/src/@modules/@eas/eas.setAsciiToBits.ts +31 -32
  80. package/src/@modules/@eas/eas.setAttentionTone.ts +40 -40
  81. package/src/@modules/@eas/eas.setEasTone.ts +151 -147
  82. package/src/@modules/@eas/eas.setNoise.ts +32 -31
  83. package/src/@modules/@eas/eas.setRadioEffect.ts +50 -49
  84. package/src/@modules/@eas/eas.setSameHeader.ts +44 -45
  85. package/src/@modules/@stanza/stanza.getAwipsType.ts +45 -45
  86. package/src/@modules/@stanza/stanza.validate.ts +49 -49
  87. package/src/@modules/@utilities/utilities.createHttp.ts +70 -70
  88. package/src/@modules/@utilities/utilities.getFormattedTime.ts +43 -43
  89. package/src/@modules/@utilities/utilities.getLatestIssuance.ts +32 -32
  90. package/src/@modules/@utilities/utilities.getMatched.ts +33 -0
  91. package/src/@modules/@utilities/utilities.getSettings.ts +25 -25
  92. package/src/@modules/@utilities/utilities.getShapeNearestPoint.ts +114 -114
  93. package/src/@modules/@utilities/utilities.setCronSchedule.ts +94 -94
  94. package/src/@modules/@utilities/utilities.setDebug.ts +38 -0
  95. package/src/@modules/@utilities/utilities.setEventEmit.ts +41 -41
  96. package/src/@modules/@utilities/utilities.setListener.ts +30 -30
  97. package/src/@modules/@utilities/utilities.setSettings.ts +42 -42
  98. package/src/@modules/@utilities/utilities.setSleep.ts +33 -33
  99. package/src/@modules/@utilities/utilities.setTimeoutAction.ts +62 -58
  100. package/src/@modules/@utilities/utilities.setWarning.ts +34 -34
  101. package/src/@modules/@xmpp/xmpp.xDeploy.ts +57 -58
  102. package/src/@modules/@xmpp/xmpp.xError.ts +26 -28
  103. package/src/@modules/@xmpp/xmpp.xOffline.ts +36 -37
  104. package/src/@modules/@xmpp/xmpp.xOnline.ts +45 -44
  105. package/src/@modules/@xmpp/xmpp.xReconnect.ts +64 -64
  106. package/src/@modules/@xmpp/xmpp.xStanza.ts +62 -62
  107. package/src/@parsers/@hvtec/hvtec.extract.ts +39 -39
  108. package/src/@parsers/@pvtec/pvtec.expires.ts +25 -25
  109. package/src/@parsers/@pvtec/pvtec.extract.ts +48 -48
  110. package/src/@parsers/@text/text.getDescriptionFromProduct.ts +52 -52
  111. package/src/@parsers/@text/text.getEmbed.ts +55 -57
  112. package/src/@parsers/@text/text.getPolygonFromProduct.ts +53 -32
  113. package/src/@parsers/@text/text.getTextFromProduct.ts +42 -42
  114. package/src/@parsers/@text/text.getXML.ts +60 -60
  115. package/src/@parsers/@ugc/ugc.coordinates.ts +110 -109
  116. package/src/@parsers/@ugc/ugc.expiry.ts +31 -31
  117. package/src/@parsers/@ugc/ugc.extract.ts +36 -36
  118. package/src/@parsers/@ugc/ugc.getCache.ts +24 -0
  119. package/src/@parsers/@ugc/ugc.header.ts +29 -29
  120. package/src/@parsers/@ugc/ugc.locations.ts +57 -29
  121. package/src/@parsers/@ugc/ugc.setCache.ts +28 -0
  122. package/src/@parsers/@ugc/ugc.zones.ts +51 -51
  123. package/src/@types/type.attributes.ts +28 -28
  124. package/src/@types/type.compiled.ts +34 -34
  125. package/src/@types/type.event.ts +69 -69
  126. package/src/@types/type.hash.ts +24 -24
  127. package/src/@types/type.hvtec.ts +25 -25
  128. package/src/@types/type.listener.ts +32 -32
  129. package/src/@types/type.properties.ts +77 -77
  130. package/src/@types/type.pvtec.ts +30 -30
  131. package/src/@types/type.settings.ts +84 -83
  132. package/src/@types/type.stanza.ts +37 -37
  133. package/src/@types/type.ugc.ts +24 -24
  134. package/src/bootstrap.ts +115 -112
  135. package/src/index.ts +74 -74
  136. package/test.js +92 -98
  137. package/tsconfig.json +13 -13
  138. package/tsup.config.ts +15 -15
  139. package/dist/index.d.mts +0 -299
  140. package/dist/index.d.ts +0 -299
  141. package/src/@core/core.createEvent.ts +0 -83
@@ -1,114 +1,114 @@
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
- interface GetShapeNearestPointResponse {
21
- proximity: boolean
22
- point: [number, number]
23
- distance: number | null
24
- distanceKm?: number | null
25
- distanceMeters?: number | null
26
- }
27
-
28
- export const getShapeNearestPoint = (coordinates: number[][], point: [number, number]): GetShapeNearestPointResponse => {
29
- if (!coordinates || !point) {
30
- return { proximity: false, point: [0, 0], distance: null }
31
- }
32
- const normalize = (coords: any): any[] => {
33
- if (!Array.isArray(coords)) return [];
34
- if (typeof coords[0] === 'number' && typeof coords[1] === 'number') return [];
35
- if (Array.isArray(coords[0]) && typeof coords[0][0] === 'number') {
36
- return [[coords]];
37
- }
38
- if (Array.isArray(coords[0]) && Array.isArray(coords[0][0]) && typeof coords[0][0][0] === 'number') {
39
- return [coords];
40
- }
41
- if (Array.isArray(coords[0]) && Array.isArray(coords[0][0]) && Array.isArray(coords[0][0][0]) && typeof coords[0][0][0][0] === 'number') {
42
- return coords;
43
- }
44
- return [];
45
- }
46
- const polys = normalize(coordinates);
47
- if (polys.length === 0) return { proximity: false, point: [0, 0], distance: null };
48
- const lon = point[0];
49
- const lat = point[1];
50
- const pointInRing = (pt: [number, number], ring: number[][]): boolean => {
51
- let x = pt[0], y = pt[1];
52
- let inside = false;
53
- for (let i = 0, j = ring.length - 1; i < ring.length; j = i++) {
54
- const xi = ring[i][0], yi = ring[i][1];
55
- const xj = ring[j][0], yj = ring[j][1];
56
- const intersect = ((yi > y) !== (yj > y)) && (x < (xj - xi) * (y - yi) / (yj - yi + 0) + xi);
57
- if (intersect) inside = !inside;
58
- }
59
- return inside;
60
- };
61
-
62
- const toRadians = (deg: number) => (deg * Math.PI) / 180;
63
- const haversineMiles = (a: [number, number], b: [number, number]) => {
64
- const R = 3958.8;
65
- const dLat = toRadians(b[1] - a[1]);
66
- const dLon = toRadians(b[0] - a[0]);
67
- const lat1 = toRadians(a[1]);
68
- const lat2 = toRadians(b[1]);
69
- const sinDLat = Math.sin(dLat / 2);
70
- const sinDLon = Math.sin(dLon / 2);
71
- const c = 2 * Math.asin(Math.sqrt(sinDLat * sinDLat + Math.cos(lat1) * Math.cos(lat2) * sinDLon * sinDLon));
72
- return R * c;
73
- };
74
- let minDistance = Infinity;
75
- let closestPoint: [number, number] | null = null;
76
- for (const poly of polys) {
77
- const outer = poly[0];
78
- const holes = poly.slice(1);
79
- if (pointInRing(point, outer)) {
80
- let inHole = false;
81
- for (const hole of holes) {
82
- if (pointInRing(point, hole)) { inHole = true; break; }
83
- }
84
- if (!inHole) {
85
- return { proximity: true, point, distance: 0 };
86
- }
87
- }
88
- for (const ring of poly) {
89
- for (let i = 0; i < ring.length - 1; i++) {
90
- const start = [ring[i][0], ring[i][1]] as [number, number];
91
- const end = [ring[i+1][0], ring[i+1][1]] as [number, number];
92
- const A = lon - start[0];
93
- const B = lat - start[1];
94
- const C = end[0] - start[0];
95
- const D = end[1] - start[1];
96
- const lenSq = C*C + D*D;
97
- const t = lenSq === 0 ? 0 : Math.max(0, Math.min(1, (A*C + B*D) / lenSq));
98
- const candidate: [number, number] = [start[0] + t*C, start[1] + t*D];
99
- const dist = haversineMiles([lon, lat], candidate);
100
- if (!isNaN(dist) && dist < minDistance) {
101
- minDistance = Number(dist.toFixed(3));
102
- closestPoint = candidate;
103
- }
104
- }
105
- }
106
- }
107
- if (!isFinite(minDistance) || closestPoint == null) {
108
- return { proximity: false, point: [0,0], distance: null };
109
- }
110
- const distanceMiles = minDistance;
111
- const distanceKm = Number((distanceMiles * 1.609344).toFixed(3));
112
- const distanceMeters = Math.round(distanceKm * 1000);
113
- return { proximity: distanceMiles === 0, point: closestPoint, distance: distanceMiles, distanceKm, distanceMeters };
114
- }
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
+ interface GetShapeNearestPointResponse {
21
+ proximity: boolean
22
+ point: [number, number]
23
+ distance: number | null
24
+ distanceKm?: number | null
25
+ distanceMeters?: number | null
26
+ }
27
+
28
+ export const getShapeNearestPoint = (coordinates: number[][], point: [number, number]): GetShapeNearestPointResponse => {
29
+ if (!coordinates || !point) {
30
+ return { proximity: false, point: [0, 0], distance: null }
31
+ }
32
+ const normalize = (coords: any): any[] => {
33
+ if (!Array.isArray(coords)) return [];
34
+ if (typeof coords[0] === 'number' && typeof coords[1] === 'number') return [];
35
+ if (Array.isArray(coords[0]) && typeof coords[0][0] === 'number') {
36
+ return [[coords]];
37
+ }
38
+ if (Array.isArray(coords[0]) && Array.isArray(coords[0][0]) && typeof coords[0][0][0] === 'number') {
39
+ return [coords];
40
+ }
41
+ if (Array.isArray(coords[0]) && Array.isArray(coords[0][0]) && Array.isArray(coords[0][0][0]) && typeof coords[0][0][0][0] === 'number') {
42
+ return coords;
43
+ }
44
+ return [];
45
+ }
46
+ const polys = normalize(coordinates);
47
+ if (polys.length === 0) return { proximity: false, point: [0, 0], distance: null };
48
+ const lon = point[0];
49
+ const lat = point[1];
50
+ const pointInRing = (pt: [number, number], ring: number[][]): boolean => {
51
+ let x = pt[0], y = pt[1];
52
+ let inside = false;
53
+ for (let i = 0, j = ring.length - 1; i < ring.length; j = i++) {
54
+ const xi = ring[i][0], yi = ring[i][1];
55
+ const xj = ring[j][0], yj = ring[j][1];
56
+ const intersect = ((yi > y) !== (yj > y)) && (x < (xj - xi) * (y - yi) / (yj - yi + 0) + xi);
57
+ if (intersect) inside = !inside;
58
+ }
59
+ return inside;
60
+ };
61
+
62
+ const toRadians = (deg: number) => (deg * Math.PI) / 180;
63
+ const haversineMiles = (a: [number, number], b: [number, number]) => {
64
+ const R = 3958.8;
65
+ const dLat = toRadians(b[1] - a[1]);
66
+ const dLon = toRadians(b[0] - a[0]);
67
+ const lat1 = toRadians(a[1]);
68
+ const lat2 = toRadians(b[1]);
69
+ const sinDLat = Math.sin(dLat / 2);
70
+ const sinDLon = Math.sin(dLon / 2);
71
+ const c = 2 * Math.asin(Math.sqrt(sinDLat * sinDLat + Math.cos(lat1) * Math.cos(lat2) * sinDLon * sinDLon));
72
+ return R * c;
73
+ };
74
+ let minDistance = Infinity;
75
+ let closestPoint: [number, number] | null = null;
76
+ for (const poly of polys) {
77
+ const outer = poly[0];
78
+ const holes = poly.slice(1);
79
+ if (pointInRing(point, outer)) {
80
+ let inHole = false;
81
+ for (const hole of holes) {
82
+ if (pointInRing(point, hole)) { inHole = true; break; }
83
+ }
84
+ if (!inHole) {
85
+ return { proximity: true, point, distance: 0 };
86
+ }
87
+ }
88
+ for (const ring of poly) {
89
+ for (let i = 0; i < ring.length - 1; i++) {
90
+ const start = [ring[i][0], ring[i][1]] as [number, number];
91
+ const end = [ring[i+1][0], ring[i+1][1]] as [number, number];
92
+ const A = lon - start[0];
93
+ const B = lat - start[1];
94
+ const C = end[0] - start[0];
95
+ const D = end[1] - start[1];
96
+ const lenSq = C*C + D*D;
97
+ const t = lenSq === 0 ? 0 : Math.max(0, Math.min(1, (A*C + B*D) / lenSq));
98
+ const candidate: [number, number] = [start[0] + t*C, start[1] + t*D];
99
+ const dist = haversineMiles([lon, lat], candidate);
100
+ if (!isNaN(dist) && dist < minDistance) {
101
+ minDistance = Number(dist.toFixed(3));
102
+ closestPoint = candidate;
103
+ }
104
+ }
105
+ }
106
+ }
107
+ if (!isFinite(minDistance) || closestPoint == null) {
108
+ return { proximity: false, point: [0,0], distance: null };
109
+ }
110
+ const distanceMiles = minDistance;
111
+ const distanceKm = Number((distanceMiles * 1.609344).toFixed(3));
112
+ const distanceMeters = Math.round(distanceKm * 1000);
113
+ return { proximity: distanceMiles === 0, point: closestPoint, distance: distanceMiles, distanceKm, distanceMeters };
114
+ }
@@ -1,94 +1,94 @@
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 { xReconnect } from "../@xmpp/xmpp.xReconnect"
23
- import { bootstrap } from "../../bootstrap";
24
- import { createHttp } from "./utilities.createHttp";
25
- import { createEvent } from "../../@building/building.create";
26
- import { setEventEmit } from "./utilities.setEventEmit";
27
- import { readdirSync, unlinkSync, statSync, existsSync } from "fs";
28
- import { join } from "path";
29
-
30
- export const setCronSchedule = async (): Promise<void> => {
31
- const settings = bootstrap.settings as TypeSettings;
32
-
33
- const TTL = settings.GlobalSettings.ArchiveSettings.TTL
34
- const TTLCUT = Date.now() - TTL * 1000;
35
-
36
- const walk = (dir: string): void => {
37
- if (existsSync(dir)) {
38
- const entries = readdirSync(dir, { withFileTypes: true });
39
- for (const entry of entries) {
40
- const fullPath = join(dir, entry.name);
41
- if (entry.isDirectory()) { walk(fullPath); continue; }
42
- const stats = statSync(fullPath);
43
- if (stats.mtime.getTime() < TTLCUT) {
44
- try {
45
- unlinkSync(fullPath);
46
- } catch (err) {
47
- console.error(`Failed to delete ${fullPath}:`, err);
48
- }
49
- }
50
- }
51
- }
52
- };
53
- walk(settings.GlobalSettings.ArchiveSettings.TextDirectory)
54
- walk(settings.GlobalSettings.ArchiveSettings.EasDirectory)
55
- walk(settings.GlobalSettings.ArchiveSettings.EventDirectory)
56
-
57
-
58
-
59
- if (settings.EnableWireService) {
60
- if (settings.NOAAWeatherWireServiceSettings.ReconnectionSettings.Enabled) {
61
- void xReconnect(settings.NOAAWeatherWireServiceSettings.ReconnectionSettings.ReconnectionInterval)
62
- }
63
- } else {
64
- const response = await createHttp({
65
- url: settings.NationalWeatherServiceSettings.EventsEndpoint,
66
- headers: {
67
- "User-Agent": "@atmosx/event-product-parser"
68
- }
69
- })
70
- if (response.error) {
71
- return setEventEmit({
72
- event: `onServiceStatus`,
73
- metadata: {
74
- type: "fetch-api",
75
- message: `Failed to fetch latest events from National Weather Service API - ${response.message}`,
76
- data: {},
77
- error: true
78
- },
79
- })
80
- }
81
- setEventEmit({
82
- event: `onServiceStatus`,
83
- metadata: {
84
- message: `Fetched latest events from National Weather Service API`,
85
- data: {},
86
- type: "fetch-api",
87
- error: false
88
- },
89
- })
90
- createEvent({ message: response.message, isNWWS: false })
91
- }
92
- }
93
-
94
-
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 { xReconnect } from "../@xmpp/xmpp.xReconnect"
23
+ import { bootstrap } from "../../bootstrap";
24
+ import { createHttp } from "./utilities.createHttp";
25
+ import { createEvent } from "../../@building/building.create";
26
+ import { setEventEmit } from "./utilities.setEventEmit";
27
+ import { readdirSync, unlinkSync, statSync, existsSync } from "fs";
28
+ import { join } from "path";
29
+
30
+ export const setCronSchedule = async (): Promise<void> => {
31
+ const settings = bootstrap.settings as TypeSettings;
32
+
33
+ const TTL = settings.GlobalSettings.ArchiveSettings.TTL
34
+ const TTLCUT = Date.now() - TTL * 1000;
35
+
36
+ const walk = (dir: string): void => {
37
+ if (existsSync(dir)) {
38
+ const entries = readdirSync(dir, { withFileTypes: true });
39
+ for (const entry of entries) {
40
+ const fullPath = join(dir, entry.name);
41
+ if (entry.isDirectory()) { walk(fullPath); continue; }
42
+ const stats = statSync(fullPath);
43
+ if (stats.mtime.getTime() < TTLCUT) {
44
+ try {
45
+ unlinkSync(fullPath);
46
+ } catch (err) {
47
+ console.error(`Failed to delete ${fullPath}:`, err);
48
+ }
49
+ }
50
+ }
51
+ }
52
+ };
53
+ walk(settings.GlobalSettings.ArchiveSettings.TextDirectory)
54
+ walk(settings.GlobalSettings.ArchiveSettings.EasDirectory)
55
+ walk(settings.GlobalSettings.ArchiveSettings.EventDirectory)
56
+
57
+
58
+
59
+ if (settings.EnableWireService) {
60
+ if (settings.NOAAWeatherWireServiceSettings.ReconnectionSettings.Enabled) {
61
+ void xReconnect(settings.NOAAWeatherWireServiceSettings.ReconnectionSettings.ReconnectionInterval)
62
+ }
63
+ } else {
64
+ const response = await createHttp({
65
+ url: settings.NationalWeatherServiceSettings.EventsEndpoint,
66
+ headers: {
67
+ "User-Agent": "@atmosx/event-product-parser"
68
+ }
69
+ })
70
+ if (response.error) {
71
+ return setEventEmit({
72
+ event: `onServiceStatus`,
73
+ metadata: {
74
+ type: "fetch-api",
75
+ message: `Failed to fetch latest events from National Weather Service API - ${response.message}`,
76
+ data: {},
77
+ error: true
78
+ },
79
+ })
80
+ }
81
+ setEventEmit({
82
+ event: `onServiceStatus`,
83
+ metadata: {
84
+ message: `Fetched latest events from National Weather Service API`,
85
+ data: {},
86
+ type: "fetch-api",
87
+ error: false
88
+ },
89
+ })
90
+ createEvent({ message: response.message, isNWWS: false })
91
+ }
92
+ }
93
+
94
+
@@ -0,0 +1,38 @@
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
+
23
+ interface SetDebugOptions {
24
+ title?: string
25
+ message: string
26
+ }
27
+
28
+ export const setDebug = (options: SetDebugOptions): void => {
29
+ const settings = bootstrap.settings as TypeSettings;
30
+ bootstrap.listener.emit(`debug`, {
31
+ message: options.message,
32
+ parent: options?.title?.split(`.`)[0]?.replace(`@`, ``),
33
+ function: options?.title?.split(`.`)[1]
34
+ })
35
+ if (settings.EnableDebugging) {
36
+ console.log(`[${bootstrap.ansi_colors.BLUE}${options.title ?? `debug`}${bootstrap.ansi_colors.RESET}] ${options.message}`)
37
+ }
38
+ }
@@ -1,41 +1,41 @@
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 { setTimeoutAction } from "./utilities.setTimeoutAction";
22
- import { setWarning } from "./utilities.setWarning";
23
-
24
- interface SetEventEmitOptions {
25
- event: string
26
- metadata: any
27
- message?: string
28
- limited?: boolean
29
- }
30
-
31
- export const setEventEmit = (options: SetEventEmitOptions): void => {
32
- if (options.limited) {
33
- const isTimeout = setTimeoutAction({ identifier: `event.${options.event}`, addTime: true, max: 1, interval: 1 })
34
- if (isTimeout.limited) return;
35
- }
36
- bootstrap.listener.emit(options.event, options.metadata)
37
- if (options.event != `log`) { bootstrap.listener.emit(`*`, {event: options.event, data: options.metadata}) }
38
- if (options.message) {
39
- setWarning({ message: options.message })
40
- }
41
- }
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 { setTimeoutAction } from "./utilities.setTimeoutAction";
22
+ import { setWarning } from "./utilities.setWarning";
23
+
24
+ interface SetEventEmitOptions {
25
+ event: string
26
+ metadata: any
27
+ message?: string
28
+ limited?: boolean
29
+ }
30
+
31
+ export const setEventEmit = (options: SetEventEmitOptions): void => {
32
+ if (options.limited) {
33
+ const isTimeout = setTimeoutAction({ identifier: `event.${options.event}`, addTime: true, max: 1, interval: 1 })
34
+ if (isTimeout.limited) return;
35
+ }
36
+ bootstrap.listener.emit(options.event, options.metadata)
37
+ if (options.event != `log`) { bootstrap.listener.emit(`*`, {event: options.event, data: options.metadata}) }
38
+ if (options.message) {
39
+ setWarning({ message: options.message })
40
+ }
41
+ }
@@ -1,30 +1,30 @@
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
-
22
- interface SetListenerOptions {
23
- event: string,
24
- callback: () => void
25
- }
26
-
27
- export const setListener = (options: SetListenerOptions): (() => void) => {
28
- bootstrap.listener.on(options.event, options.callback)
29
- return () => { void bootstrap.listener.off(options.event, options.callback) };
30
- }
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
+
22
+ interface SetListenerOptions {
23
+ event: string,
24
+ callback: () => void
25
+ }
26
+
27
+ export const setListener = (options: SetListenerOptions): (() => void) => {
28
+ bootstrap.listener.on(options.event, options.callback)
29
+ return () => { void bootstrap.listener.off(options.event, options.callback) };
30
+ }