@atmosx/event-product-parser 3.0.622 → 3.1.0

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 (199) hide show
  1. package/.github/CHANGELOGS.md +52 -0
  2. package/.github/CODE_OF_CONDUCT.md +24 -1
  3. package/.github/CONTRIBUTING.md +22 -3
  4. package/.github/FUNDING.yaml +3 -0
  5. package/.github/LICENSE +24 -1
  6. package/.github/SECURITY.md +25 -6
  7. package/.github/docs/chapters/general-configurations.md +109 -0
  8. package/.github/docs/chapters/sources-and-attributes.md +219 -0
  9. package/README.md +56 -148
  10. package/dist/{cjs/index.cjs → index.cjs} +4486 -1471
  11. package/package.json +13 -8
  12. package/pnpm-workspace.yaml +1 -0
  13. package/src/bootstrap.ts +66 -51
  14. package/src/components/audio/GenerateAudioMessage.ts +149 -0
  15. package/src/{@modules/@eas → components/audio/components}/GetCleanDescription.ts +2 -2
  16. package/src/{@modules/@eas → components/audio/components}/GetFloatPCM16.ts +2 -2
  17. package/src/{@modules/@eas → components/audio/components}/GetMergedPCM16.ts +2 -2
  18. package/src/{@modules/@eas → components/audio/components}/GetPCM16.ts +13 -8
  19. package/src/{@modules/@eas → components/audio/components}/GetPCMToFloat.ts +2 -2
  20. package/src/{@modules/@eas → components/audio/components}/GetSampledPCM16.ts +14 -8
  21. package/src/{@modules/@eas → components/audio/components}/GetTTS.ts +15 -8
  22. package/src/{@modules/@eas → components/audio/components}/GetWavPCM16.ts +7 -7
  23. package/src/{@modules/@eas → components/audio/components}/SetAFSK.ts +13 -8
  24. package/src/{@modules/@eas → components/audio/components}/SetAsciiToBits.ts +2 -2
  25. package/src/{@modules/@eas → components/audio/components}/SetAttentionTone.ts +11 -6
  26. package/src/{@modules/@eas → components/audio/components}/SetNoise.ts +12 -7
  27. package/src/{@modules/@eas → components/audio/components}/SetRadioEffect.ts +12 -7
  28. package/src/{@modules/@eas → components/audio/components}/SetSameHeader.ts +22 -14
  29. package/src/components/database/CreateQuery.ts +39 -0
  30. package/src/components/database/InitializeDatabase.ts +71 -0
  31. package/src/components/database/imports/Boundaires.ts +168 -0
  32. package/src/{@modules/@database/ImportBroadcastify.ts → components/database/imports/Broadcastify.ts} +15 -25
  33. package/src/components/database/imports/Census.ts +87 -0
  34. package/src/{@modules/@database/ImportShapefiles.ts → components/database/imports/Shapefiles.ts} +18 -21
  35. package/src/{@modules/@database/ImportStanza.ts → components/database/imports/Stanza.ts} +15 -19
  36. package/src/components/events/CreateEvents.ts +88 -0
  37. package/src/components/events/FilterEvents.ts +149 -0
  38. package/src/{@building/CreateEvent.ts → components/events/ProcessStanza.ts} +22 -22
  39. package/src/components/events/RemoveEvents.ts +74 -0
  40. package/src/{@building → components/events/components}/GetCleanedEvent.ts +2 -2
  41. package/src/{@building → components/events/components}/GetEventAttachments.ts +14 -12
  42. package/src/components/events/components/GetEventDirection.ts +28 -0
  43. package/src/{@building → components/events/components}/GetEventEnhancedName.ts +5 -6
  44. package/src/{@building → components/events/components}/GetEventGeometry.ts +19 -13
  45. package/src/{@building → components/events/components}/GetEventHeader.ts +13 -13
  46. package/src/components/events/components/GetEventMerged.ts +51 -0
  47. package/src/{@building → components/events/components}/GetEventNodes.ts +20 -18
  48. package/src/{@building → components/events/components}/GetEventOffice.ts +13 -13
  49. package/src/components/events/components/GetEventPopulation.ts +58 -0
  50. package/src/components/events/components/GetEventProperties.ts +106 -0
  51. package/src/{@building → components/events/components}/GetEventSignature.ts +9 -9
  52. package/src/{@building → components/events/components}/GetEventTags.ts +3 -3
  53. package/src/{@core/CreateListener.ts → components/events/components/GetEventTheme.ts} +8 -6
  54. package/src/components/events/components/GetEventTracking.ts +64 -0
  55. package/src/{@modules/@database → components/events/utilities}/GetCachedEvents.ts +18 -14
  56. package/src/{@manager → components/events/utilities}/SetHash.ts +18 -13
  57. package/src/{@manager → components/events/utilities}/UpdateEvents.ts +12 -12
  58. package/src/{@manager → components/events/utilities}/UpdateNode.ts +14 -14
  59. package/src/{@parsers/@text → components/formatting}/GetEmbededText.ts +12 -6
  60. package/src/{@parsers/@text → components/formatting}/GetStringText.ts +13 -9
  61. package/src/{@modules/@utilities → components/geometry}/GetShapeNearestPoint.ts +24 -19
  62. package/src/components/geometry/GetUnionPolygon.ts +36 -0
  63. package/src/components/images/GenerateGraphic.ts +242 -0
  64. package/src/components/images/components/CreateRectangle.ts +22 -0
  65. package/src/components/images/components/CreateText.ts +22 -0
  66. package/src/components/images/modules/CreateSVG.ts +37 -0
  67. package/src/components/images/modules/GetGeographicalBoundaries.ts +72 -0
  68. package/src/components/images/modules/GetGeographicalCities.ts +58 -0
  69. package/src/components/images/modules/GetGeographicalEvents.ts +48 -0
  70. package/src/components/images/modules/GetGeometryBounds.ts +82 -0
  71. package/src/components/images/modules/GetParsedBoundary.ts +58 -0
  72. package/src/components/images/modules/GetSVGPath.ts +53 -0
  73. package/src/components/images/modules/NormalizePolygon.ts +57 -0
  74. package/src/{@modules/@stanza → components/stanza}/GetAwipsType.ts +16 -17
  75. package/src/{@modules/@stanza → components/stanza}/ValidateStanza.ts +27 -15
  76. package/src/{@modules/@utilities → components/utilities}/CreateHttp.ts +26 -26
  77. package/src/components/utilities/EmitThread.ts +97 -0
  78. package/src/{@modules/@utilities → components/utilities}/GetLatestIssuance.ts +2 -2
  79. package/src/{@modules/@utilities → components/utilities}/GetMatched.ts +10 -5
  80. package/src/{@modules/@utilities → components/utilities}/QueueManager.ts +7 -8
  81. package/src/{@modules/@utilities → components/utilities}/SetDebug.ts +13 -13
  82. package/src/components/utilities/SetEventEmit.ts +42 -0
  83. package/src/{@modules/@utilities → components/utilities}/SetSettings.ts +7 -7
  84. package/src/{@modules/@utilities → components/utilities}/SetSleep.ts +5 -5
  85. package/src/components/utilities/SetTimeoutAction.ts +64 -0
  86. package/src/components/utilities/SetWarning.ts +47 -0
  87. package/src/{@modules/@xmpp → components/xmpp}/DeployXMPP.ts +20 -20
  88. package/src/{@modules/@xmpp → components/xmpp}/ErrorXMPP.ts +6 -6
  89. package/src/{@modules/@xmpp → components/xmpp}/OfflineXMPP.ts +13 -13
  90. package/src/{@modules/@xmpp → components/xmpp}/OnlineXMPP.ts +18 -18
  91. package/src/components/xmpp/ReconnectXMPP.ts +64 -0
  92. package/src/{@modules/@xmpp → components/xmpp}/StanzaXMPP.ts +26 -26
  93. package/src/{@enums → enums}/AWIPS.ts +2 -2
  94. package/src/{@enums → enums}/Actions.ts +2 -2
  95. package/src/{@enums → enums}/Cancellation.ts +2 -2
  96. package/src/{@enums → enums}/Causes.ts +2 -2
  97. package/src/{@enums → enums}/Correlations.ts +2 -2
  98. package/src/{@enums → enums}/Enhanced.ts +4 -3
  99. package/src/{@enums → enums}/Events.ts +2 -2
  100. package/src/{@enums → enums}/Expressions.ts +3 -3
  101. package/src/{@enums → enums}/GlobalFilter.ts +2 -2
  102. package/src/{@enums → enums}/Hail.ts +2 -2
  103. package/src/{@enums → enums}/ICAO.ts +2 -2
  104. package/src/{@enums → enums}/Matches.ts +8 -3
  105. package/src/{@enums → enums}/Products.ts +2 -2
  106. package/src/{@enums → enums}/Records.ts +2 -2
  107. package/src/{@enums → enums}/Severity.ts +2 -2
  108. package/src/{@enums → enums}/Shapefiles.ts +2 -2
  109. package/src/{@enums → enums}/States.ts +68 -4
  110. package/src/{@enums → enums}/Status.ts +2 -2
  111. package/src/{@enums → enums}/Strings.ts +2 -2
  112. package/src/{@enums → enums}/Tags.ts +8 -3
  113. package/src/{@enums → enums}/Testing.ts +2 -2
  114. package/src/enums/Themes.ts +70 -0
  115. package/src/events/ParseAPI.ts +133 -0
  116. package/src/{@events → events}/ParseText.ts +24 -22
  117. package/src/{@events → events}/ParseUGC.ts +27 -26
  118. package/src/{@events → events}/ParseVTEC.ts +37 -36
  119. package/src/{@core → exports}/ClearEvents.ts +9 -9
  120. package/src/{@core → exports}/GetEvents.ts +4 -4
  121. package/src/exports/GetNearestCity.ts +45 -0
  122. package/src/{@core → exports}/GetNodes.ts +4 -4
  123. package/src/{@core → exports}/GetRandomEvent.ts +4 -4
  124. package/src/{@core → exports}/GetVersion.ts +4 -4
  125. package/src/{@core → exports}/ManualEvent.ts +24 -24
  126. package/src/{@core → exports}/QueryStanza.ts +12 -11
  127. package/src/exports/SetNode.ts +100 -0
  128. package/src/{@core → exports}/StartService.ts +22 -21
  129. package/src/{@core → exports}/StopService.ts +10 -10
  130. package/src/index.ts +55 -37
  131. package/src/{@parsers/@hvtec → parsers/hvtec}/HVExtract.ts +7 -7
  132. package/src/{@parsers/@text → parsers/text}/GetDescriptionFromProduct.ts +20 -21
  133. package/src/parsers/text/GetPolygonFromProduct.ts +71 -0
  134. package/src/{@parsers/@text → parsers/text}/GetTextFromProduct.ts +12 -12
  135. package/src/parsers/ugc/GetCache.ts +24 -0
  136. package/src/{@parsers/@ugc → parsers/ugc}/GetExpiry.ts +2 -2
  137. package/src/{@parsers/@ugc/GetUGCHeader.ts → parsers/ugc/GetHeader.ts} +4 -4
  138. package/src/{@parsers/@ugc → parsers/ugc}/GetLocations.ts +10 -10
  139. package/src/parsers/ugc/GetZonePolygon.ts +73 -0
  140. package/src/{@parsers/@ugc → parsers/ugc}/GetZones.ts +3 -3
  141. package/src/{@parsers/@ugc → parsers/ugc}/SetCache.ts +13 -8
  142. package/src/{@parsers/@ugc → parsers/ugc}/UGCExtract.ts +14 -14
  143. package/src/{@parsers/@pvtec → parsers/vtec}/GetExpiry.ts +2 -2
  144. package/src/{@parsers/@pvtec → parsers/vtec}/VTECExtract.ts +17 -17
  145. package/src/tasks/CreateTasks.ts +116 -0
  146. package/src/{@tasks → tasks}/TaskGenerateJSON.ts +10 -11
  147. package/src/{@tasks → tasks}/TaskGenerateText.ts +11 -12
  148. package/src/tasks/TaskSendNTFY.ts +96 -0
  149. package/src/tasks/TaskSendWebhook.ts +107 -0
  150. package/src/{@types → types/event}/Attributes.ts +2 -3
  151. package/src/{@types → types/event}/Event.ts +8 -7
  152. package/src/{@types → types/event}/HVTEC.ts +2 -2
  153. package/src/{@types → types/event}/Properties.ts +17 -4
  154. package/src/{@types → types/event}/Stanza.ts +2 -2
  155. package/src/{@types → types/event}/VTEC.ts +8 -8
  156. package/src/{@types → types/standard}/Actions.ts +3 -3
  157. package/src/{@types → types/standard}/Hash.ts +5 -5
  158. package/src/{@modules/@utilities/GetSettings.ts → types/standard/Nodes.ts} +15 -7
  159. package/src/{@types → types/standard}/Settings.ts +19 -12
  160. package/src/{@types → types/standard}/StanzaCompiled.ts +15 -15
  161. package/src/{@types → types/standard}/UGC.ts +5 -5
  162. package/tools/build.js +2 -15
  163. package/tsconfig.json +29 -17
  164. package/.github/SUPPORTED_EVENTS.md +0 -370
  165. package/.github/docs/docs-functions.md +0 -30
  166. package/.github/docs/docs-general-configurations.md +0 -209
  167. package/.github/docs/docs-integrations.md +0 -37
  168. package/.github/docs/docs-listeners.md +0 -28
  169. package/.github/docs/docs-source-configuration.md +0 -218
  170. package/.github/docs/docs-technical.md +0 -50
  171. package/.github/logo.png +0 -0
  172. package/.github/samples/SAMPLE_EAS_GENERATION.wav +0 -0
  173. package/.github/samples/SAMPLE_GEOJSON.json +0 -204
  174. package/.github/samples/SAMPLE_TEXT_PRODUCT.txt +0 -119
  175. package/dist/esm/index.mjs +0 -22298
  176. package/src/@building/GetEventProperties.ts +0 -101
  177. package/src/@building/GetEventTracking.ts +0 -68
  178. package/src/@core/SetNode.ts +0 -87
  179. package/src/@events/ParseAPI.ts +0 -122
  180. package/src/@manager/MakeEvents.ts +0 -109
  181. package/src/@manager/RemoveEvent.ts +0 -70
  182. package/src/@manager/ValidateEvents.ts +0 -141
  183. package/src/@modules/@database/InitializeDatabase.ts +0 -59
  184. package/src/@modules/@eas/GenerateEASMessage.ts +0 -152
  185. package/src/@modules/@utilities/GetFormattedTime.ts +0 -43
  186. package/src/@modules/@utilities/SetCronSchedule.ts +0 -94
  187. package/src/@modules/@utilities/SetEventEmit.ts +0 -41
  188. package/src/@modules/@utilities/SetListener.ts +0 -30
  189. package/src/@modules/@utilities/SetTimeoutAction.ts +0 -64
  190. package/src/@modules/@utilities/SetWarning.ts +0 -34
  191. package/src/@modules/@xmpp/ReconnectXMPP.ts +0 -64
  192. package/src/@parsers/@text/GetPolygonFromProduct.ts +0 -53
  193. package/src/@parsers/@text/GetXML.ts +0 -61
  194. package/src/@parsers/@ugc/GetCache.ts +0 -24
  195. package/src/@parsers/@ugc/GetZonePolygon.ts +0 -111
  196. package/src/@tasks/CreateTasks.ts +0 -110
  197. package/src/@tasks/TaskGenerateAudio.ts +0 -35
  198. package/src/@tasks/TaskSendNTFY.ts +0 -93
  199. package/src/@tasks/TaskSendWebhook.ts +0 -101
@@ -11,14 +11,14 @@
11
11
  Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
12
12
  Discord: https://atmosphericx-discord.scriptkitty.cafe
13
13
  Ko-Fi: https://ko-fi.com/k3yomi
14
- Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
14
+ Documentation: https://atmosphericx.scriptkitty.cafe/documentation
15
15
 
16
- Internal Package: @atmosx/event-product-parser
16
+ Independent Package: @atmosx/event-product-parser
17
17
 
18
18
  */
19
19
 
20
- import { bootstrap } from "@bootstrap"
20
+ import { Bootstrap } from "@Bootstrap"
21
21
 
22
22
  export const GetRandomEvent = (): any => {
23
- return bootstrap.cache.events.features[Math.floor(Math.random() * bootstrap.cache.events.features.length)]
23
+ return Bootstrap.Cache.Events.features[Math.floor(Math.random() * Bootstrap.Cache.Events.features.length)]
24
24
  }
@@ -11,14 +11,14 @@
11
11
  Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
12
12
  Discord: https://atmosphericx-discord.scriptkitty.cafe
13
13
  Ko-Fi: https://ko-fi.com/k3yomi
14
- Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
14
+ Documentation: https://atmosphericx.scriptkitty.cafe/documentation
15
15
 
16
- Internal Package: @atmosx/event-product-parser
16
+ Independent Package: @atmosx/event-product-parser
17
17
 
18
18
  */
19
19
 
20
- import { bootstrap } from "@bootstrap"
20
+ import { Bootstrap } from "@Bootstrap"
21
21
 
22
22
  export const GetVersion = (): any => {
23
- return bootstrap.version
23
+ return Bootstrap.Version
24
24
  }
@@ -11,45 +11,45 @@
11
11
  Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
12
12
  Discord: https://atmosphericx-discord.scriptkitty.cafe
13
13
  Ko-Fi: https://ko-fi.com/k3yomi
14
- Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
14
+ Documentation: https://atmosphericx.scriptkitty.cafe/documentation
15
15
 
16
- Internal Package: @atmosx/event-product-parser
16
+ Independent Package: @atmosx/event-product-parser
17
17
 
18
18
  */
19
19
 
20
- import { EnumExpressions } from "@enums/Expressions"
21
- import { GetAwipsType } from "@stanza/GetAwipsType"
22
- import { CreateEvent } from "@building/CreateEvent"
20
+ import { EnumExpressions } from "@Enums/Expressions"
21
+ import { GetAwipsType } from "@Stanza/GetAwipsType"
22
+ import { ProcessStanza } from "@Builder/ProcessStanza"
23
23
 
24
24
  interface CreateEventOptions {
25
- message: string
26
- awipsid?: string
25
+ Message: string
26
+ Awipsid?: string
27
27
  }
28
28
 
29
- export const ManualEvent = async (options: CreateEventOptions): Promise<void> => {
30
- const isCapEvent = options.message.includes(`<?xml`);
31
- const isCapAreaDescription = options.message.includes(`<areaDesc>`)
32
- const isVTEC = options.message.match(EnumExpressions.pvtec) != null;
33
- const isUGC = options.message.match(EnumExpressions.ugc1) != null;
29
+ export const ManualEvent = async ({ Message, Awipsid }: CreateEventOptions): Promise<void> => {
30
+ const isCapEvent = Message.includes(`<?xml`);
31
+ const isCapAreaDescription = Message.includes(`<areaDesc>`)
32
+ const isVTEC = Message.match(EnumExpressions.vtec) != null;
33
+ const isUGC = Message.match(EnumExpressions.ugc1) != null;
34
34
  const attributes = {
35
35
  "xmlns": "@atmosx/event-product-parser",
36
36
  "id": "manual_processor.0000",
37
37
  "issue": new Date().toISOString(),
38
38
  "ttaaii": "XXXXX",
39
39
  "cccc": "XXX",
40
- "awipsid": options.awipsid ?? "XXXXXX",
40
+ "awipsid": Awipsid ?? "XXXXXX",
41
41
  }
42
- const getType = GetAwipsType({ attributes })
42
+ const getType = GetAwipsType({ Attributes: attributes})
43
43
  const result = {
44
- message: options.message,
45
- attributes,
46
- isCapEvent,
47
- isVTEC,
48
- isUGC,
49
- isCapAreaDescription,
50
- isIgnored: false,
51
- isNWWS: true,
52
- getType
44
+ Message: Message,
45
+ Attributes: attributes,
46
+ CapEvent: isCapEvent,
47
+ VTEC: isVTEC,
48
+ UGC: isUGC,
49
+ CapAreaDescription: isCapAreaDescription,
50
+ Ignored: false,
51
+ NWWS: true,
52
+ Type: getType,
53
53
  }
54
- await CreateEvent(result);
54
+ await ProcessStanza(result);
55
55
  }
@@ -11,18 +11,18 @@
11
11
  Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
12
12
  Discord: https://atmosphericx-discord.scriptkitty.cafe
13
13
  Ko-Fi: https://ko-fi.com/k3yomi
14
- Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
14
+ Documentation: https://atmosphericx.scriptkitty.cafe/documentation
15
15
 
16
- Internal Package: @atmosx/event-product-parser
16
+ Independent Package: @atmosx/event-product-parser
17
17
 
18
18
  */
19
19
 
20
- import { TypeStanza } from "types/Stanza"
21
- import { bootstrap } from "@bootstrap"
20
+ import { TypeStanza } from "TypesEvent/Stanza"
21
+ import { CreateQuery } from "@Database/CreateQuery"
22
22
 
23
23
  interface QueryStanzaOptions {
24
- search: string
25
- max?: number
24
+ Search: string
25
+ Max?: number
26
26
  }
27
27
 
28
28
  type QueryStanza = {
@@ -30,10 +30,11 @@ type QueryStanza = {
30
30
  stanza: string
31
31
  }
32
32
 
33
- export const QueryStanza = async (options: QueryStanzaOptions): Promise<TypeStanza[]> => {
34
- const get = await bootstrap.database.prepare(
35
- `SELECT * FROM stanzas WHERE stanza LIKE ? LIMIT ?`)
36
- .all(`%${options.search}%`, options.max ?? 100) as QueryStanza[];
37
- const events = get.map((row) => JSON.parse(row.stanza));
33
+ export const QueryStanza = async ({ Search, Max }: QueryStanzaOptions): Promise<TypeStanza[]> => {
34
+ const query = CreateQuery({
35
+ Query: `SELECT * FROM stanzas WHERE stanza LIKE ? LIMIT ?`,
36
+ Parameters: [`%${Search}%`, Max ?? 100]
37
+ }) as QueryStanza[];
38
+ const events = query.map((row) => JSON.parse(row.stanza));
38
39
  return events as TypeStanza[];
39
40
  }
@@ -0,0 +1,100 @@
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: https://atmosphericx.scriptkitty.cafe/documentation
15
+
16
+ Independent Package: @atmosx/event-product-parser
17
+
18
+ */
19
+
20
+ import { Bootstrap } from "@Bootstrap"
21
+ import { SetWarning } from "@Utilities/SetWarning"
22
+ import { SetEventEmit } from "@Utilities/SetEventEmit"
23
+ import { GetNearestCity } from "@Exports/GetNearestCity"
24
+
25
+ interface GetNodeOptions {
26
+ Identifier: string
27
+ Delete?: boolean
28
+ Coordinates: { Longitude: number; Latitude: number }
29
+ }
30
+
31
+ export const SetNode = ({ Identifier, Delete, Coordinates }: GetNodeOptions) => {
32
+ const nodes = Bootstrap.Cache.Nodes.features;
33
+ const exists = nodes.find((node) => node.properties.identifier === Identifier);
34
+ const nearest = GetNearestCity({ Coordinates, Radius: 25 });
35
+ if (Delete) {
36
+ if (exists) {
37
+ const index = nodes.indexOf(exists);
38
+ nodes.splice(index, 1);
39
+ SetWarning({ Message: `Node with identifier '${Identifier}' deleted.` })
40
+ return SetEventEmit({
41
+ Event: `onNodeDelete`,
42
+ Metadata: {
43
+ Type: `node-delete`,
44
+ Node: exists
45
+ }
46
+ })
47
+ }
48
+ return SetWarning({ Message: `Node with identifier '${Identifier}' not found.` })
49
+ }
50
+ if (exists) {
51
+ const index = nodes.indexOf(exists);
52
+ if (exists.geometry.coordinates[0] === Coordinates.Longitude && exists.geometry.coordinates[1] === Coordinates.Latitude) {
53
+ return;
54
+ }
55
+ nodes[index] = {
56
+ ...exists,
57
+ geometry: {
58
+ type: "Point",
59
+ coordinates: [Coordinates.Longitude, Coordinates.Latitude]
60
+ },
61
+ properties: {
62
+ ...exists.properties,
63
+ city: nearest?.name ?? null,
64
+ county: nearest?.county ?? null,
65
+ state: nearest?.state ?? null,
66
+ population: nearest?.population ?? null
67
+ }
68
+ };
69
+ SetWarning({ Message: `Node with identifier '${Identifier}' updated. (${nearest?.name ?? "---"}, ${nearest?.county ?? "---"}, ${nearest?.state ?? "---"})` })
70
+ return SetEventEmit({
71
+ Event: `onNodeUpdate`,
72
+ Metadata: {
73
+ Type: `node-update`,
74
+ Node: nodes[index]
75
+ }
76
+ })
77
+ }
78
+ nodes.push({
79
+ type: "Feature",
80
+ geometry: {
81
+ type: "Point",
82
+ coordinates: [Coordinates.Longitude, Coordinates.Latitude]
83
+ },
84
+ properties: {
85
+ identifier: Identifier,
86
+ city: nearest?.name ?? null,
87
+ county: nearest?.county ?? null,
88
+ state: nearest?.state ?? null,
89
+ population: nearest?.population ?? null
90
+ }
91
+ });
92
+ SetWarning({ Message: `Node with identifier '${Identifier}' added. (${nearest?.name ?? "---"}, ${nearest?.county ?? "---"}, ${nearest?.state ?? "---"})` })
93
+ return SetEventEmit({
94
+ Event: `onNodeAdd`,
95
+ Metadata: {
96
+ Type: `node-add`,
97
+ Node: nodes[nodes.length - 1]
98
+ }
99
+ })
100
+ }
@@ -11,50 +11,51 @@
11
11
  Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
12
12
  Discord: https://atmosphericx-discord.scriptkitty.cafe
13
13
  Ko-Fi: https://ko-fi.com/k3yomi
14
- Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
14
+ Documentation: https://atmosphericx.scriptkitty.cafe/documentation
15
15
 
16
- Internal Package: @atmosx/event-product-parser
16
+ Independent Package: @atmosx/event-product-parser
17
17
 
18
18
  */
19
19
 
20
- import { TypeSettings } from "types/Settings"
21
- import { bootstrap } from "@bootstrap"
22
- import { SetWarning } from "@utilities/SetWarning"
23
- import { SetSettings } from "@utilities/SetSettings"
24
- import { SetCronSchedule } from "@utilities/SetCronSchedule"
25
- import { DeployXMPP } from "@xmpp/DeployXMPP"
26
- import { InitializeDatabase } from "@database/InitializeDatabase"
27
- import { GetCachedEvents } from "@database/GetCachedEvents"
28
- import { UpdateNode } from "@manager/UpdateNode"
29
- import { UpdateEvents } from "@manager/UpdateEvents"
20
+ import { TypeSettings } from "TypesStandard/Settings"
21
+ import { Bootstrap } from "@Bootstrap"
22
+ import { SetWarning } from "@Utilities/SetWarning"
23
+ import { SetSettings } from "@Utilities/SetSettings"
24
+ import { EmitThread } from "@Utilities/EmitThread"
25
+ import { DeployXMPP } from "@XMPP/DeployXMPP"
26
+ import { InitializeDatabase } from "@Database/InitializeDatabase"
27
+ import { GetCachedEvents } from "@BuilderUtilities/GetCachedEvents"
28
+ import { UpdateNode } from "@BuilderUtilities/UpdateNode"
29
+ import { UpdateEvents } from "@BuilderUtilities/UpdateEvents"
30
30
  import { Cron } from "croner"
31
31
 
32
32
  export const StartService = async (configurations: TypeSettings): Promise<void> => {
33
- if (!bootstrap.isReady) {
33
+ if (!Bootstrap.Ready) {
34
34
  return SetWarning({
35
- message: `You can not create another instance without shutting down the current one first, please make sure to call the stop() method first!`
35
+ Message: `You can not create another instance without shutting down the current one first, please make sure to call the stop() method first!`
36
36
  })
37
37
  }
38
38
  const settings = SetSettings(configurations);
39
- bootstrap.isReady = true;
39
+ Bootstrap.Ready = true;
40
40
  await InitializeDatabase();
41
+ if (settings.DeveloperDisableEvents) { return SetWarning({ Message: `DeveloperDisableEvents is enabled, no events will be processed!` }) }
41
42
  if (settings.EnableWireService) {
42
43
  (async () => {
43
44
  await GetCachedEvents();
44
45
  await DeployXMPP()
45
46
  })();
46
47
  }
47
- await SetCronSchedule()
48
+ await EmitThread()
48
49
  let scheduleInterval = !settings.EnableWireService ? settings.NationalWeatherServiceSettings.CallbackInterval : 1;
49
50
  if (!settings.EnableWireService && scheduleInterval < 15) {
50
- SetWarning({ message: `Schedule interval of ${scheduleInterval} seconds is too low, setting to 15 seconds` })
51
- bootstrap.settings.NationalWeatherServiceSettings.CallbackInterval = 15;
51
+ SetWarning({ Message: `Schedule interval of ${scheduleInterval} seconds is too low, setting to 15 seconds` })
52
+ Bootstrap.Settings.NationalWeatherServiceSettings.CallbackInterval = 15;
52
53
  scheduleInterval = 15;
53
54
  }
54
- bootstrap.cron = new Cron(`*/${scheduleInterval} * * * * *`, async () => {
55
- await SetCronSchedule();
55
+ Bootstrap.Job = new Cron(`*/${scheduleInterval} * * * * *`, async () => {
56
+ await EmitThread();
56
57
  })
57
- bootstrap.cron = new Cron(`* * * * * *`, async () => {
58
+ Bootstrap.Job = new Cron(`* * * * * *`, async () => {
58
59
  await UpdateNode();
59
60
  await UpdateEvents();
60
61
  })
@@ -11,22 +11,22 @@
11
11
  Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
12
12
  Discord: https://atmosphericx-discord.scriptkitty.cafe
13
13
  Ko-Fi: https://ko-fi.com/k3yomi
14
- Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
14
+ Documentation: https://atmosphericx.scriptkitty.cafe/documentation
15
15
 
16
- Internal Package: @atmosx/event-product-parser
16
+ Independent Package: @atmosx/event-product-parser
17
17
 
18
18
  */
19
19
 
20
- import { bootstrap } from "@bootstrap"
20
+ import { Bootstrap } from "@Bootstrap"
21
21
 
22
22
  export const StopService = async (): Promise<void> => {
23
- if (bootstrap.isReady) {
24
- bootstrap.isReady = false;
25
- if (bootstrap.session_xmpp) {
26
- try { await bootstrap.session_xmpp.stop(); } catch {}
27
- bootstrap.cache.isConnected = false;
28
- bootstrap.cache.sigHault = true;
29
- bootstrap.session_xmpp = null;
23
+ if (Bootstrap.Ready) {
24
+ Bootstrap.Ready = false;
25
+ if (Bootstrap.Session) {
26
+ try { await Bootstrap.Session.stop(); } catch {}
27
+ Bootstrap.Cache.Connected = false;
28
+ Bootstrap.Cache.Hault = true;
29
+ Bootstrap.Session = null;
30
30
  }
31
31
  }
32
32
  }
package/src/index.ts CHANGED
@@ -11,66 +11,84 @@
11
11
  Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
12
12
  Discord: https://atmosphericx-discord.scriptkitty.cafe
13
13
  Ko-Fi: https://ko-fi.com/k3yomi
14
- Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
14
+ Documentation: https://atmosphericx.scriptkitty.cafe/documentation
15
15
 
16
- Internal Package: @atmosx/event-product-parser
16
+ Independent Package: @atmosx/event-product-parser
17
17
 
18
18
  */
19
19
 
20
- import { TypeSettings } from "types/Settings"
21
- import { GetEventGeometry } from "@building/GetEventGeometry"
22
- import { GetCleanedEvent } from "@building/GetCleanedEvent"
23
- import { SetSettings } from "@utilities/SetSettings"
24
- import { SetEventEmit } from "@utilities/SetEventEmit"
25
- import { SetWarning } from "@utilities/SetWarning"
26
- import { GenerateEASMessage } from "@eas/GenerateEASMessage"
27
- import { SetNode } from "@core/SetNode"
28
- import { GetEvents } from "@core/GetEvents"
29
- import { GetNodes } from "@core/GetNodes"
30
- import { ManualEvent } from "@core/ManualEvent"
31
- import { GetRandomEvent } from "@core/GetRandomEvent"
32
- import { QueryStanza } from "@core/QueryStanza"
33
- import { ClearEvents } from "@core/ClearEvents"
34
- import { CreateListener } from "@core/CreateListener"
35
- import { StartService } from "@core/StartService"
36
- import { StopService } from "@core/StopService"
20
+ import { TypeSettings } from "TypesStandard/Settings"
21
+ import { Bootstrap } from "@Bootstrap"
22
+ import { GetEventGeometry } from "@BuilderComponents/GetEventGeometry"
23
+ import { GetCleanedEvent } from "@BuilderComponents/GetCleanedEvent"
24
+ import { SetSettings } from "@Utilities/SetSettings"
25
+ import { SetEventEmit } from "@Utilities/SetEventEmit"
26
+ import { SetWarning } from "@Utilities/SetWarning"
27
+ import { GenerateAudioMessage } from "@Audio/GenerateAudioMessage"
28
+ import { GenerateGraphic } from "@Image/GenerateGraphic"
29
+ import { SetNode } from "@Exports/SetNode"
30
+ import { GetEvents } from "@Exports/GetEvents"
31
+ import { GetNodes } from "@Exports/GetNodes"
32
+ import { ManualEvent } from "@Exports/ManualEvent"
33
+ import { GetRandomEvent } from "@Exports/GetRandomEvent"
34
+ import { QueryStanza } from "@Exports/QueryStanza"
35
+ import { ClearEvents } from "@Exports/ClearEvents"
36
+ import { StartService } from "@Exports/StartService"
37
+ import { StopService } from "@Exports/StopService"
38
+ import { GetVersion } from "@Exports/GetVersion"
39
+
37
40
 
38
41
  export class Manager {
39
42
  public constructor(settings: TypeSettings) {
40
- this.trycatch(); StartService(settings)
43
+ this.ErrorHandler(); StartService(settings)
41
44
  }
42
45
 
43
- on(event: string, callback: () => void) {
44
- CreateListener(event, callback)
46
+ public on(event: string, callback: () => void) {
47
+ Bootstrap.Listener.on(event, callback)
48
+ return () => { void Bootstrap.Listener.off(event, callback) };
45
49
  }
46
50
 
47
- trycatch() {
48
- process.on('uncaughtException', (err: any) => {
49
- const ignored = ['ETIMEDOUT', 'ECONNRESET', 'EHOSTUNREACH', 'ENOTFOUND', 'ECONNREFUSED', 'EPIPE', 'EADDRINUSE', 'EALREADY', 'EACCES', 'EAGAIN', 'EHOSTDOWN', 'STARTTLS_FAILURE'];
50
- if (ignored.includes(err?.code)) {
51
+ private ErrorHandler() {
52
+ process.on('uncaughtException', (error: any) => {
53
+ const _IGNORED = [
54
+ 'ETIMEDOUT',
55
+ 'ECONNRESET',
56
+ 'EHOSTUNREACH',
57
+ 'ENOTFOUND',
58
+ 'ECONNREFUSED',
59
+ 'EPIPE',
60
+ 'EADDRINUSE',
61
+ 'EALREADY',
62
+ 'EACCES',
63
+ 'EAGAIN',
64
+ 'EHOSTDOWN',
65
+ 'STARTTLS_FAILURE'
66
+ ];
67
+ if (_IGNORED.includes(error?.code)) {
51
68
  SetEventEmit({
52
- event: `onServiceStatus`,
53
- metadata: {
54
- message: `Ignored Critical Error: ${err?.code ?? 'Unknown error code'}. This may indicate a connection issue. Attempting to continue...`,
55
- data: {},
56
- type: `error`,
57
- error: true
69
+ Event: `onServiceStatus`,
70
+ Metadata: {
71
+ Message: `Ignored Critical Error: ${error?.code ?? 'Unknown error code'}. This may indicate a connection issue. Attempting to continue...`,
72
+ Data: {},
73
+ Type: `error`,
74
+ Error: true
58
75
  }
59
76
  })
60
- return;
61
77
  }
62
- SetWarning({message: `Uncaught Exception: ${err instanceof Error ? err.stack ?? err.message : String(err)}`})
78
+ console.log(`Uncaught Exception: ${error instanceof Error ? error.stack ?? error.message : String(error)}`);
79
+ SetWarning({Message: `Uncaught Exception: ${error instanceof Error ? error.stack ?? error.message : String(error)}`})
63
80
  })
64
81
  }
65
82
  }
66
83
 
67
84
  export default Manager;
68
- export type { TypeEvent } from "types/Event"
85
+ export type { TypeEvent } from "TypesEvent/Event"
69
86
  export {
70
87
  SetSettings, GetEventGeometry, ManualEvent,
71
88
  GetCleanedEvent, StopService, ClearEvents,
72
- StartService, SetNode, GetRandomEvent,
73
- GetEvents, GetNodes, GenerateEASMessage, QueryStanza
89
+ StartService, SetNode, GetRandomEvent, GetVersion,
90
+ GetEvents, GetNodes, GenerateAudioMessage, GenerateGraphic,
91
+ QueryStanza
74
92
  }
75
93
 
76
94
 
@@ -11,17 +11,17 @@
11
11
  Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
12
12
  Discord: https://atmosphericx-discord.scriptkitty.cafe
13
13
  Ko-Fi: https://ko-fi.com/k3yomi
14
- Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
14
+ Documentation: https://atmosphericx.scriptkitty.cafe/documentation
15
15
 
16
- Internal Package: @atmosx/event-product-parser
16
+ Independent Package: @atmosx/event-product-parser
17
17
 
18
18
  */
19
19
 
20
- import { TypeHVTEC } from "types/HVTEC"
21
- import { EnumCauses } from "@enums/Causes"
22
- import { EnumRecords } from "@enums/Records"
23
- import { EnumExpressions } from "@enums/Expressions"
24
- import { EnumSeverity } from "@enums/Severity"
20
+ import { TypeHVTEC } from "TypesEvent/HVTEC"
21
+ import { EnumCauses } from "@Enums/Causes"
22
+ import { EnumRecords } from "@Enums/Records"
23
+ import { EnumExpressions } from "@Enums/Expressions"
24
+ import { EnumSeverity } from "@Enums/Severity"
25
25
 
26
26
  export const HVExtract = (message: string): TypeHVTEC[] | null => {
27
27
  const getHVTECs = message.match(EnumExpressions.hvtec) ?? [];
@@ -11,21 +11,20 @@
11
11
  Created with ♥ by the AtmosphericX Team (KiyoWx, StarflightWx, & CJ Ziegler)
12
12
  Discord: https://atmosphericx-discord.scriptkitty.cafe
13
13
  Ko-Fi: https://ko-fi.com/k3yomi
14
- Documentation: http://localhost/documentation | https://atmosphericx.scriptkitty.cafe/documentation
14
+ Documentation: https://atmosphericx.scriptkitty.cafe/documentation
15
15
 
16
- Internal Package: @atmosx/event-product-parser
16
+ Independent Package: @atmosx/event-product-parser
17
17
 
18
18
  */
19
19
 
20
- import { EnumExpressions } from "@enums/Expressions"
20
+ import { EnumExpressions } from "@Enums/Expressions"
21
21
 
22
22
  interface GetDescriptionFromProductOptions {
23
- message: string
24
- handle?: string
23
+ Message: string
24
+ Handle?: string
25
25
  }
26
26
 
27
- export const GetDescriptionFromProduct = (options: GetDescriptionFromProductOptions): string => {
28
- let message = options.message;
27
+ export const GetDescriptionFromProduct = ({ Message, Handle }: GetDescriptionFromProductOptions): string => {
29
28
  const predefinedEndMarkers = ['&&', 'LAT...'];
30
29
  const getEndIndex = (text: string, fromIndex = 0): number => {
31
30
  const indices = predefinedEndMarkers
@@ -33,28 +32,28 @@ export const GetDescriptionFromProduct = (options: GetDescriptionFromProductOpti
33
32
  .filter((idx) => idx !== -1);
34
33
  return indices.length ? Math.min(...indices) : -1;
35
34
  };
36
- const dates = Array.from(message.matchAll(EnumExpressions.dateline));
35
+ const dates = Array.from(Message.matchAll(EnumExpressions.dateline));
37
36
  if (dates.length) {
38
37
  const lastMatch = dates[dates.length - 1][0];
39
- const sIndx = message.lastIndexOf(lastMatch);
38
+ const sIndx = Message.lastIndexOf(lastMatch);
40
39
  if (sIndx !== -1) {
41
- const endIndx = getEndIndex(message, sIndx);
42
- message = message.substring(sIndx + lastMatch.length, endIndx !== -1 ? endIndx : undefined).trimStart();
43
- if (message.startsWith('/')) message = message.slice(1).trimStart();
44
- if (options.handle && message.includes(options.handle)) {
45
- const handleIdx = message.indexOf(options.handle);
46
- message = message.substring(handleIdx + options.handle.length).trimStart();
47
- if (message.startsWith('/')) message = message.slice(1).trimStart();
40
+ const endIndx = getEndIndex(Message, sIndx);
41
+ Message = Message.substring(sIndx + lastMatch.length, endIndx !== -1 ? endIndx : undefined).trimStart();
42
+ if (Message.startsWith('/')) Message = Message.slice(1).trimStart();
43
+ if (Handle && Message.includes(Handle)) {
44
+ const handleIdx = Message.indexOf(Handle);
45
+ Message = Message.substring(handleIdx + Handle.length).trimStart();
46
+ if (Message.startsWith('/')) Message = Message.slice(1).trimStart();
48
47
  }
49
48
  }
50
- } else if (options.handle) {
51
- const handleIndx = message.indexOf(options.handle);
49
+ } else if (Handle) {
50
+ const handleIndx = Message.indexOf(Handle);
52
51
  if (handleIndx !== -1) {
53
- let afterHandle = message.substring(handleIndx + options.handle.length).trimStart();
52
+ let afterHandle = Message.substring(handleIndx + Handle.length).trimStart();
54
53
  if (afterHandle.startsWith('/')) afterHandle = afterHandle.slice(1).trimStart();
55
54
  const latEnd = getEndIndex(afterHandle);
56
- message = latEnd !== -1 ? afterHandle.substring(0, latEnd).trim() : afterHandle.trim();
55
+ Message = latEnd !== -1 ? afterHandle.substring(0, latEnd).trim() : afterHandle.trim();
57
56
  }
58
57
  }
59
- return message.trim();
58
+ return Message.trim();
60
59
  }