@atmosx/event-product-parser 3.0.55 → 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.
- package/.github/CODE_OF_CONDUCT.md +9 -9
- package/.github/CONTRIBUTING.md +29 -29
- package/.github/LICENSE +17 -17
- package/.github/SECURITY.md +20 -20
- package/.github/SUPPORTED_EVENTS.md +369 -369
- package/.github/docs/docs-functions.md +30 -0
- package/.github/docs/docs-general-configurations.md +209 -0
- package/.github/docs/docs-integrations.md +37 -0
- package/.github/docs/docs-listeners.md +28 -0
- package/.github/docs/docs-source-configuration.md +218 -0
- package/.github/docs/docs-technical.md +50 -0
- package/.github/logo.png +0 -0
- package/.github/samples/SAMPLE_EAS_GENERATION.wav +0 -0
- package/.github/samples/SAMPLE_GEOJSON.json +204 -0
- package/.github/samples/SAMPLE_TEXT_PRODUCT.txt +119 -0
- package/.vscode/settings.json +3 -3
- package/README.md +167 -0
- package/dist/cjs/index.cjs +1439 -1277
- package/dist/esm/index.mjs +1420 -1258
- package/package.json +47 -52
- package/src/@building/{building.create.ts → CreateEvent.ts} +55 -55
- package/src/@building/{building.clean.ts → GetCleanedEvent.ts} +29 -29
- package/src/@building/{building.attachments.ts → GetEventAttachments.ts} +85 -82
- package/src/@building/{building.enhance.ts → GetEventEnhancedName.ts} +54 -59
- package/src/@building/{building.geometry.ts → GetEventGeometry.ts} +47 -47
- package/src/@building/{building.headers.ts → GetEventHeader.ts} +36 -36
- package/src/@building/{building.polygon.ts → GetEventNodes.ts} +72 -69
- package/src/@building/{building.office.ts → GetEventOffice.ts} +42 -42
- package/src/@building/{building.properties.ts → GetEventProperties.ts} +95 -95
- package/src/@building/{building.signature.ts → GetEventSignature.ts} +60 -60
- package/src/@building/{building.tags.ts → GetEventTags.ts} +29 -24
- package/src/@building/{building.tracking.ts → GetEventTracking.ts} +67 -67
- package/src/@core/{core.clearEvents.ts → ClearEvents.ts} +30 -30
- package/src/@core/{core.createListener.ts → CreateListener.ts} +23 -23
- package/src/@core/{core.getEvents.ts → GetEvents.ts} +23 -23
- package/src/@core/{core.getNodes.ts → GetNodes.ts} +23 -23
- package/src/@core/{core.getRandomEvent.ts → GetRandomEvent.ts} +23 -23
- package/src/@core/{core.getVersion.ts → GetVersion.ts} +23 -23
- package/src/@core/{core.manualEvent.ts → ManualEvent.ts} +56 -38
- package/src/@core/{core.query.ts → QueryStanza.ts} +38 -38
- package/src/@core/{core.setNode.ts → SetNode.ts} +80 -80
- package/src/@core/{core.start.ts → StartService.ts} +60 -60
- package/src/@core/{core.stop.ts → StopService.ts} +31 -31
- package/src/@enums/AWIPS.ts +366 -0
- package/src/{@dictionaries/dictionaries.actions.ts → @enums/Actions.ts} +27 -27
- package/src/{@dictionaries/dictionaries.cancellation.ts → @enums/Cancellation.ts} +30 -30
- package/src/{@dictionaries/dictionaries.causes.ts → @enums/Causes.ts} +35 -35
- package/src/{@dictionaries/dictionaries.correlations.ts → @enums/Correlations.ts} +42 -42
- package/src/{@dictionaries/dictionaries.enhanced.ts → @enums/Enhanced.ts} +69 -69
- package/src/{@dictionaries/dictionaries.events.ts → @enums/Events.ts} +82 -82
- package/src/{@dictionaries/dictionaries.expressions.ts → @enums/Expressions.ts} +28 -28
- package/src/@enums/GlobalFilter.ts +24 -0
- package/src/{@dictionaries/dictionaries.hail.ts → @enums/Hail.ts} +37 -35
- package/src/{@dictionaries/dictionaries.icao.ts → @enums/ICAO.ts} +258 -258
- package/src/{@dictionaries/dictionaries.matches.ts → @enums/Matches.ts} +54 -54
- package/src/{@dictionaries/dictionaries.products.ts → @enums/Products.ts} +24 -24
- package/src/{@dictionaries/dictionaries.records.ts → @enums/Records.ts} +25 -25
- package/src/{@dictionaries/dictionaries.severity.ts → @enums/Severity.ts} +27 -27
- package/src/{@dictionaries/dictionaries.shapefiles.ts → @enums/Shapefiles.ts} +35 -35
- package/src/{@dictionaries/dictionaries.states.ts → @enums/States.ts} +71 -71
- package/src/{@dictionaries/dictionaries.status.ts → @enums/Status.ts} +30 -30
- package/src/{@dictionaries/dictionaries.global.ts → @enums/Strings.ts} +22 -24
- package/src/@enums/Tags.ts +167 -0
- package/src/{@dictionaries/dictionaries.testing.ts → @enums/Testing.ts} +24 -24
- package/src/@events/{events.api.ts → ParseAPI.ts} +116 -116
- package/src/@events/{events.text.ts → ParseText.ts} +87 -84
- package/src/@events/{events.ugc.ts → ParseUGC.ts} +93 -89
- package/src/@events/{events.vtec.ts → ParseVTEC.ts} +86 -86
- package/src/@manager/MakeEvents.ts +106 -0
- package/src/@manager/{manager.rmEvent.ts → RemoveEvent.ts} +69 -71
- package/src/@manager/{manager.setHash.ts → SetHash.ts} +35 -35
- package/src/@manager/Tasks.ts +246 -0
- package/src/@manager/{manager.updateEvents.ts → UpdateEvents.ts} +34 -34
- package/src/@manager/{manager.updateNodes.ts → UpdateNode.ts} +61 -53
- package/src/{@building/building.validate.ts → @manager/ValidateEvents.ts} +141 -154
- package/src/@modules/@database/{database.cache.ts → GetCachedEvents.ts} +49 -49
- package/src/@modules/@database/{database.broadcastify.ts → ImportBroadcastify.ts} +69 -66
- package/src/@modules/@database/{database.shapefiles.ts → ImportShapefiles.ts} +92 -92
- package/src/@modules/@database/{database.stanza.ts → ImportStanza.ts} +46 -46
- package/src/@modules/@database/{database.init.ts → InitializeDatabase.ts} +58 -58
- package/src/@modules/@eas/{eas.setEasTone.ts → GenerateEASMessage.ts} +144 -151
- package/src/@modules/@eas/{eas.getCleanDescription.ts → GetCleanDescription.ts} +91 -91
- package/src/@modules/@eas/{eas.getFloatPCM16.ts → GetFloatPCM16.ts} +29 -29
- package/src/@modules/@eas/{eas.getMergedPCM16.ts → GetMergedPCM16.ts} +32 -32
- package/src/@modules/@eas/{eas.getPCM16.ts → GetPCM16.ts} +52 -52
- package/src/@modules/@eas/{eas.getPCMToFloat.ts → GetPCMToFloat.ts} +26 -26
- package/src/@modules/@eas/{eas.getSampledPCM16.ts → GetSampledPCM16.ts} +36 -36
- package/src/@modules/@eas/{eas.getTTS.ts → GetTTS.ts} +54 -54
- package/src/@modules/@eas/{eas.getWavPCM16.ts → GetWavPCM16.ts} +52 -52
- package/src/@modules/@eas/{eas.setAFSK.ts → SetAFSK.ts} +51 -51
- package/src/@modules/@eas/{eas.setAsciiToBits.ts → SetAsciiToBits.ts} +31 -31
- package/src/@modules/@eas/{eas.setAttentionTone.ts → SetAttentionTone.ts} +40 -40
- package/src/@modules/@eas/{eas.setNoise.ts → SetNoise.ts} +32 -32
- package/src/@modules/@eas/{eas.setRadioEffect.ts → SetRadioEffect.ts} +50 -50
- package/src/@modules/@eas/{eas.setSameHeader.ts → SetSameHeader.ts} +44 -44
- package/src/@modules/@stanza/{stanza.getAwipsType.ts → GetAwipsType.ts} +47 -45
- package/src/@modules/@stanza/{stanza.validate.ts → ValidateStanza.ts} +49 -49
- package/src/@modules/@utilities/{utilities.createHttp.ts → CreateHttp.ts} +83 -83
- package/src/@modules/@utilities/{utilities.getFormattedTime.ts → GetFormattedTime.ts} +43 -43
- package/src/@modules/@utilities/{utilities.getLatestIssuance.ts → GetLatestIssuance.ts} +32 -32
- package/src/@modules/@utilities/{utilities.getMatched.ts → GetMatched.ts} +33 -33
- package/src/@modules/@utilities/{utilities.getSettings.ts → GetSettings.ts} +25 -25
- package/src/@modules/@utilities/{utilities.getShapeNearestPoint.ts → GetShapeNearestPoint.ts} +114 -114
- package/src/@modules/@utilities/{utilities.setCronSchedule.ts → SetCronSchedule.ts} +94 -94
- package/src/@modules/@utilities/{utilities.setDebug.ts → SetDebug.ts} +37 -38
- package/src/@modules/@utilities/{utilities.setEventEmit.ts → SetEventEmit.ts} +41 -41
- package/src/@modules/@utilities/{utilities.setListener.ts → SetListener.ts} +30 -30
- package/src/@modules/@utilities/{utilities.setSettings.ts → SetSettings.ts} +42 -42
- package/src/@modules/@utilities/{utilities.setSleep.ts → SetSleep.ts} +33 -33
- package/src/@modules/@utilities/{utilities.setTimeoutAction.ts → SetTimeoutAction.ts} +63 -63
- package/src/@modules/@utilities/{utilities.setWarning.ts → SetWarning.ts} +34 -34
- package/src/@modules/@xmpp/{xmpp.xDeploy.ts → DeployXMPP.ts} +57 -57
- package/src/@modules/@xmpp/{xmpp.xError.ts → ErrorXMPP.ts} +26 -26
- package/src/@modules/@xmpp/{xmpp.xOffline.ts → OfflineXMPP.ts} +36 -36
- package/src/@modules/@xmpp/{xmpp.xOnline.ts → OnlineXMPP.ts} +45 -45
- package/src/@modules/@xmpp/{xmpp.xReconnect.ts → ReconnectXMPP.ts} +64 -64
- package/src/@modules/@xmpp/{xmpp.xStanza.ts → StanzaXMPP.ts} +62 -62
- package/src/@parsers/@hvtec/{hvtec.extract.ts → HVExtract.ts} +39 -39
- package/src/@parsers/@pvtec/{pvtec.expires.ts → GetExpiry.ts} +25 -25
- package/src/@parsers/@pvtec/{pvtec.extract.ts → VTECExtract.ts} +48 -48
- package/src/@parsers/@text/{text.getDescriptionFromProduct.ts → GetDescriptionFromProduct.ts} +59 -52
- package/src/@parsers/@text/{text.getEmbedText.ts → GetEmbededText.ts} +55 -55
- package/src/@parsers/@text/{text.getPolygonFromProduct.ts → GetPolygonFromProduct.ts} +52 -52
- package/src/@parsers/@text/{text.getStringText.ts → GetStringText.ts} +57 -53
- package/src/@parsers/@text/{text.getTextFromProduct.ts → GetTextFromProduct.ts} +42 -42
- package/src/@parsers/@text/{text.getXML.ts → GetXML.ts} +60 -60
- package/src/@parsers/@ugc/{ugc.getCache.ts → GetCache.ts} +23 -23
- package/src/@parsers/@ugc/{ugc.expiry.ts → GetExpiry.ts} +31 -31
- package/src/@parsers/@ugc/{ugc.locations.ts → GetLocations.ts} +56 -56
- package/src/@parsers/@ugc/{ugc.header.ts → GetUGCHeader.ts} +29 -29
- package/src/@parsers/@ugc/{ugc.coordinates.ts → GetZonePolygon.ts} +110 -110
- package/src/@parsers/@ugc/{ugc.zones.ts → GetZones.ts} +51 -51
- package/src/@parsers/@ugc/{ugc.setCache.ts → SetCache.ts} +27 -27
- package/src/@parsers/@ugc/{ugc.extract.ts → UGCExtract.ts} +36 -36
- package/src/@types/{type.listener.ts → Actions.ts} +37 -38
- package/src/@types/{type.attributes.ts → Attributes.ts} +28 -28
- package/src/@types/{type.event.ts → Event.ts} +69 -69
- package/src/@types/{type.hvtec.ts → HVTEC.ts} +25 -25
- package/src/@types/{type.hash.ts → Hash.ts} +24 -24
- package/src/@types/{type.properties.ts → Properties.ts} +77 -77
- package/src/@types/{type.settings.ts → Settings.ts} +99 -93
- package/src/@types/{type.stanza.ts → Stanza.ts} +37 -37
- package/src/@types/{type.compiled.ts → StanzaCompiled.ts} +35 -34
- package/src/@types/{type.ugc.ts → UGC.ts} +24 -24
- package/src/@types/{type.pvtec.ts → VTEC.ts} +30 -30
- package/src/bootstrap.ts +128 -124
- package/src/index.ts +74 -74
- package/tsconfig.json +13 -13
- package/tsup.config.ts +15 -15
- package/.github/README.md +0 -384
- package/src/@dictionaries/dictionaries.awips.ts +0 -364
- package/src/@dictionaries/dictionaries.strings.ts +0 -22
- package/src/@dictionaries/dictionaries.tags.ts +0 -93
- package/src/@manager/manager.mkEvent.ts +0 -98
- package/src/@manager/manager.updateListener.ts +0 -180
- package/testing/init.js +0 -91
|
@@ -1,72 +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 { TypeEvent } from "../@types/
|
|
21
|
-
import {
|
|
22
|
-
import { bootstrap } from "../bootstrap"
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
export const
|
|
29
|
-
const gTracking = event.properties.metadata.tracking;
|
|
30
|
-
const isTrackingEventLogged = bootstrap.cache.events.features
|
|
31
|
-
.find(f => f?.properties?.metadata?.tracking === gTracking);
|
|
32
|
-
const isStatement = event.properties.status_metadata.is_statement;
|
|
33
|
-
|
|
34
|
-
if (isTrackingEventLogged) {
|
|
35
|
-
event.properties.expires = new Date().toISOString();
|
|
36
|
-
event.properties.status = `Expired`;
|
|
37
|
-
event.properties.status_metadata.is_expired = true;
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
.replace(`{
|
|
42
|
-
|
|
43
|
-
event.properties.
|
|
44
|
-
event.properties.metadata.history.push({
|
|
45
|
-
description: description,
|
|
46
|
-
issued: event.properties.expires,
|
|
47
|
-
status: event.properties.status
|
|
48
|
-
})
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
limited: true
|
|
71
|
-
})
|
|
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 { EnumStrings } from "../@enums/Strings";
|
|
22
|
+
import { bootstrap } from "../bootstrap"
|
|
23
|
+
import { SetEventEmit } from "../@modules/@utilities/SetEventEmit";
|
|
24
|
+
import { SetTimeoutAction } from "../@modules/@utilities/SetTimeoutAction";
|
|
25
|
+
import { Tasks } from "./Tasks";
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
export const RemoveEvent = async (event: TypeEvent, isTimeBasedExpiration: boolean):Promise<void> => {
|
|
29
|
+
const gTracking = event.properties.metadata.tracking;
|
|
30
|
+
const isTrackingEventLogged = bootstrap.cache.events.features
|
|
31
|
+
.find(f => f?.properties?.metadata?.tracking === gTracking);
|
|
32
|
+
const isStatement = event.properties.status_metadata.is_statement;
|
|
33
|
+
|
|
34
|
+
if (isTrackingEventLogged) {
|
|
35
|
+
event.properties.expires = new Date().toISOString();
|
|
36
|
+
event.properties.status = `Expired`;
|
|
37
|
+
event.properties.status_metadata.is_expired = true;
|
|
38
|
+
|
|
39
|
+
const description = isTimeBasedExpiration ? EnumStrings.cancellation
|
|
40
|
+
.replace(`{SENDER}`, event.properties.geocode.office.name)
|
|
41
|
+
.replace(`{EVENT}`, event.properties.event) : event.properties.description
|
|
42
|
+
event.properties.description = description;
|
|
43
|
+
event.properties.metadata.raw = isTimeBasedExpiration ? description : event.properties.metadata.raw;
|
|
44
|
+
event.properties.metadata.history.push({
|
|
45
|
+
description: isTimeBasedExpiration ? description : event.properties.description,
|
|
46
|
+
issued: event.properties.expires,
|
|
47
|
+
status: event.properties.status
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
bootstrap.cache.events.features
|
|
51
|
+
.splice(bootstrap.cache.events.features.indexOf(isTrackingEventLogged), 1);
|
|
52
|
+
bootstrap.cache.hashes = bootstrap.cache.hashes
|
|
53
|
+
.filter(hash => hash.tracking !== gTracking);
|
|
54
|
+
|
|
55
|
+
if (!isStatement) {
|
|
56
|
+
SetEventEmit({
|
|
57
|
+
event: `onEventStatus`,
|
|
58
|
+
metadata: { type: `Removed`, event: event },
|
|
59
|
+
message: `[Removed] ${event.properties.event} (${event.properties.status}) (${gTracking})`
|
|
60
|
+
})
|
|
61
|
+
await Tasks([event])
|
|
62
|
+
}
|
|
63
|
+
SetTimeoutAction({ identifier: gTracking, expire: true })
|
|
64
|
+
}
|
|
65
|
+
SetEventEmit({
|
|
66
|
+
event: `onEventCache`,
|
|
67
|
+
metadata: bootstrap.cache.events,
|
|
68
|
+
limited: true
|
|
69
|
+
})
|
|
72
70
|
}
|
|
@@ -1,36 +1,36 @@
|
|
|
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/
|
|
21
|
-
import { TypeHash } from "../@types/
|
|
22
|
-
import { bootstrap } from "../bootstrap"
|
|
23
|
-
|
|
24
|
-
export const
|
|
25
|
-
if (entry) {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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 { TypeHash } from "../@types/Hash"
|
|
22
|
+
import { bootstrap } from "../bootstrap"
|
|
23
|
+
|
|
24
|
+
export const SetHash = (event: TypeEvent, entry: TypeHash): void => {
|
|
25
|
+
if (!entry) {
|
|
26
|
+
bootstrap.cache.hashes.push({
|
|
27
|
+
tracking: event.properties.metadata.tracking,
|
|
28
|
+
hashes: [event.properties.metadata.hash],
|
|
29
|
+
expires: event.properties.expires
|
|
30
|
+
});
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
entry.hashes.push(event.properties.metadata.hash);
|
|
35
|
+
entry.expires = event.properties.expires;
|
|
36
36
|
}
|
|
@@ -0,0 +1,246 @@
|
|
|
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 { TypeEvent } from "../@types/Event";
|
|
22
|
+
import { TypeActions } from "../@types/Actions";
|
|
23
|
+
import { bootstrap } from "../bootstrap"
|
|
24
|
+
import { GenerateEASMessage } from "../@modules/@eas/GenerateEASMessage"
|
|
25
|
+
import { SetTimeoutAction } from "../@modules/@utilities/SetTimeoutAction";
|
|
26
|
+
import { GetEmebedText } from "../@parsers/@text/GetEmbededText";
|
|
27
|
+
import { GetStringText } from "../@parsers/@text/GetStringText";
|
|
28
|
+
import { GetCleanedEvent } from "../@building/GetCleanedEvent"
|
|
29
|
+
import { CreateHttp } from "../@modules/@utilities/CreateHttp";
|
|
30
|
+
import { SetDebug } from "../@modules/@utilities/SetDebug";
|
|
31
|
+
import { GetMatched } from "../@modules/@utilities/GetMatched";
|
|
32
|
+
import { mkdir, writeFile, readFile, appendFile } from "fs/promises";
|
|
33
|
+
|
|
34
|
+
export const Tasks = async (events: TypeEvent[]): Promise<void> => {
|
|
35
|
+
const tick = performance.now()
|
|
36
|
+
const settings = bootstrap.settings as TypeSettings;
|
|
37
|
+
const notifyServer = settings.NotifyServer;
|
|
38
|
+
const actions = settings.ActionSettings as TypeActions[];
|
|
39
|
+
for (const event of events) {
|
|
40
|
+
const properties = event.properties;
|
|
41
|
+
const hasActions = Array.isArray(actions) && actions.length > 0;
|
|
42
|
+
if (!hasActions) {
|
|
43
|
+
SetDebug({ title: `Tasks`, message: `${Math.round(performance.now() - tick)}ms` });
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const metadata = {
|
|
47
|
+
text: null,
|
|
48
|
+
eas: null,
|
|
49
|
+
json: null,
|
|
50
|
+
name: properties.event,
|
|
51
|
+
status: properties.status,
|
|
52
|
+
description: properties.description,
|
|
53
|
+
tracking: properties.metadata.tracking,
|
|
54
|
+
header: properties.metadata.header,
|
|
55
|
+
raw: properties.metadata.raw,
|
|
56
|
+
expired: properties.status_metadata.is_expired,
|
|
57
|
+
attachments: properties.metadata.attachments
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const archiveSettings = settings.GlobalSettings?.ArchiveSettings;
|
|
61
|
+
const textArchiveDir = archiveSettings?.TextDirectory;
|
|
62
|
+
const jsonArchiveDir = archiveSettings?.JSONDirectory;
|
|
63
|
+
const eventBaseName = `${metadata.name}_${metadata.tracking}`;
|
|
64
|
+
const easTitle = `${metadata.name}_${metadata.status}_${metadata.tracking}`;
|
|
65
|
+
const cleanedEventText = JSON.stringify(GetCleanedEvent(event), null, 2);
|
|
66
|
+
const stringText = GetStringText(event);
|
|
67
|
+
const embedText = GetEmebedText(event);
|
|
68
|
+
|
|
69
|
+
for (const action of actions) {
|
|
70
|
+
const events = action?.Events;
|
|
71
|
+
const webhook = action?.Webhook;
|
|
72
|
+
const notify = action?.NotificationServer;
|
|
73
|
+
const uploads = action?.Uploads
|
|
74
|
+
const isMatched = GetMatched(events ?? [], metadata.name)
|
|
75
|
+
|
|
76
|
+
if (events?.length == 0 || isMatched) {
|
|
77
|
+
const t = performance.now()
|
|
78
|
+
|
|
79
|
+
if (uploads?.EAS && !metadata.eas) {
|
|
80
|
+
metadata.eas = await GenerateEASMessage({
|
|
81
|
+
title: easTitle,
|
|
82
|
+
message: metadata.description,
|
|
83
|
+
header: metadata.header
|
|
84
|
+
});
|
|
85
|
+
SetDebug({
|
|
86
|
+
title: "Tasks/EAS",
|
|
87
|
+
message: `${Math.round(performance.now() - t)}ms`
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (uploads?.TEXT && metadata.text === null) {
|
|
92
|
+
const t = performance.now()
|
|
93
|
+
if (textArchiveDir) {
|
|
94
|
+
const file = (`${textArchiveDir}/${eventBaseName}.txt`).replace(/[\\:*?"<>|]/g, "_").replace(/\s+/g, " ").trim();
|
|
95
|
+
await mkdir(textArchiveDir, { recursive: true });
|
|
96
|
+
await appendFile(file, `${"\n".repeat(7)}${metadata.raw}`);
|
|
97
|
+
SetDebug({
|
|
98
|
+
title: "Tasks/TEXT",
|
|
99
|
+
message: `${Math.round(performance.now() - t)}ms`
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
metadata.text = metadata.raw;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if (uploads?.JSON && metadata.json === null) {
|
|
106
|
+
const t = performance.now()
|
|
107
|
+
if (jsonArchiveDir) {
|
|
108
|
+
const file = (`${jsonArchiveDir}/${eventBaseName}.json`).replace(/[\\:*?"<>|]/g, "_").replace(/\s+/g, " ").trim();
|
|
109
|
+
await mkdir(jsonArchiveDir, { recursive: true });
|
|
110
|
+
await writeFile(file, cleanedEventText);
|
|
111
|
+
SetDebug({
|
|
112
|
+
title: "Tasks/JSON",
|
|
113
|
+
message: `${Math.round(performance.now() - t)}ms`
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
metadata.json = cleanedEventText;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (notifyServer?.Enabled && notify?.Enabled && notify?.Topic) {
|
|
120
|
+
let buttons = [];
|
|
121
|
+
const t = performance.now()
|
|
122
|
+
const auth = notifyServer?.Credentials?.Username && notifyServer?.Credentials?.Password ? { username: notifyServer?.Credentials?.Username, password: notifyServer?.Credentials?.Password } : undefined;
|
|
123
|
+
const image = metadata.attachments?.find(a => a.name === "Image: Graphic");
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
if (notifyServer?.MediaStorage?.EAS) {
|
|
127
|
+
if (metadata.eas) {
|
|
128
|
+
buttons.push({
|
|
129
|
+
"action": "view",
|
|
130
|
+
"label": "Listen",
|
|
131
|
+
"url": `${notifyServer?.MediaStorage?.EAS}/${metadata.name}_${metadata.status}_${metadata.tracking}.wav`,
|
|
132
|
+
})
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
if (metadata.json) {
|
|
136
|
+
buttons.push({
|
|
137
|
+
"action": "view",
|
|
138
|
+
"label": "View JSON",
|
|
139
|
+
"url": `${notifyServer?.MediaStorage?.JSON}/${metadata.name}_${metadata.tracking}.json`,
|
|
140
|
+
})
|
|
141
|
+
}
|
|
142
|
+
if (metadata.text) {
|
|
143
|
+
buttons.push({
|
|
144
|
+
"action": "view",
|
|
145
|
+
"label": "View Text",
|
|
146
|
+
"url": `${notifyServer?.MediaStorage?.TEXT}/${metadata.name}_${metadata.tracking}.txt`,
|
|
147
|
+
})
|
|
148
|
+
}
|
|
149
|
+
if (image) {
|
|
150
|
+
buttons.push({
|
|
151
|
+
"action": "view",
|
|
152
|
+
"label": "View Image",
|
|
153
|
+
"url": image.link,
|
|
154
|
+
})
|
|
155
|
+
}
|
|
156
|
+
await CreateHttp({
|
|
157
|
+
url: `${notifyServer?.Server?.replace(/\/$/, "")}/${notify.Topic}`,
|
|
158
|
+
timeout: 15_000,
|
|
159
|
+
method: "PUT",
|
|
160
|
+
...(auth && { auth }),
|
|
161
|
+
headers: {
|
|
162
|
+
"Title": `${metadata.name} (${metadata.status})`,
|
|
163
|
+
"Tags": properties.parameters.tags?.join(",") ?? "N/A",
|
|
164
|
+
"Priority": notify?.Priority ?? "5",
|
|
165
|
+
... (buttons.length > 0 && { "Actions": JSON.stringify(buttons) }),
|
|
166
|
+
},
|
|
167
|
+
body: stringText
|
|
168
|
+
})
|
|
169
|
+
SetDebug({
|
|
170
|
+
title: "Tasks/NTFY",
|
|
171
|
+
message: `${Math.round(performance.now() - t)}ms`
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
if (webhook?.Enabled && webhook?.Destination) {
|
|
176
|
+
const t = performance.now()
|
|
177
|
+
const isRatelimited = SetTimeoutAction({ identifier: webhook.Destination, interval: (webhook.Ratelimit ?? 2) * 2, max: (webhook.Ratelimit ?? 2), addTime: true })
|
|
178
|
+
const form = new FormData();
|
|
179
|
+
const embed = {
|
|
180
|
+
title: `${metadata.name} (${metadata.status})`,
|
|
181
|
+
description: embedText,
|
|
182
|
+
fields: [],
|
|
183
|
+
color: 16711680,
|
|
184
|
+
timestamp: new Date().toISOString(),
|
|
185
|
+
footer: { text: webhook.Title ?? `AtmosphericX` }
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
if (isRatelimited.limited) { return }
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
if (metadata.description && !metadata.expired) {
|
|
192
|
+
const description = metadata.description.length > 900
|
|
193
|
+
? metadata.description.substring(0, 900) + "\n\n[Message truncated due to length]"
|
|
194
|
+
: metadata.description;
|
|
195
|
+
embed.fields.push({
|
|
196
|
+
name: "Description",
|
|
197
|
+
value: description ? '```' + '\n' + description.split('\n').map(l => l.trim()).filter(Boolean).join('\n') + '\n' + '```' : ""
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
if (metadata.attachments?.length > 0) {
|
|
203
|
+
const attachments = metadata.attachments.slice(0, 5);
|
|
204
|
+
embed.fields.push({
|
|
205
|
+
name: "Attachments",
|
|
206
|
+
value: attachments.map(attachment => `- [${attachment.name.length > 45 ? attachment.name.substring(0, 45) + '...' : attachment.name}](${attachment.link})`).join('\n')
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
if (uploads?.TEXT) {
|
|
211
|
+
form.append("fUpload", new Blob([Buffer.from(metadata.text)], {type: "application/text"}), `${properties.event}_${properties.status}_${properties.metadata.tracking}.txt`)
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
if (uploads?.JSON) {
|
|
215
|
+
form.append("fUpload2", new Blob([Buffer.from(metadata.json)], {type: "application/json"}), `${properties.event}_${properties.status}_${properties.metadata.tracking}.json`)
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
if (uploads?.EAS) {
|
|
219
|
+
if (metadata.eas) {
|
|
220
|
+
const file = await readFile(metadata.eas);
|
|
221
|
+
form.append("fEas", new Blob([Buffer.from(file)], { type: "audio/mpeg" }), `${properties.event}_${properties.status}_${properties.metadata.tracking}_eas.mp3`)
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
form.append("payload_json", JSON.stringify({
|
|
226
|
+
username: webhook.Title ?? "AtmosphericX",
|
|
227
|
+
content: webhook.Message ?? "",
|
|
228
|
+
embeds: [embed]
|
|
229
|
+
}));
|
|
230
|
+
|
|
231
|
+
await CreateHttp({
|
|
232
|
+
url: webhook.Destination,
|
|
233
|
+
timeout: 15e3,
|
|
234
|
+
method: `POST`,
|
|
235
|
+
body: form
|
|
236
|
+
})
|
|
237
|
+
SetDebug({
|
|
238
|
+
title: "Tasks/Webhook",
|
|
239
|
+
message: `${Math.round(performance.now() - t)}ms`
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
SetDebug({ title: `Tasks`, message: `${Math.round(performance.now() - tick)}ms` })
|
|
246
|
+
}
|
|
@@ -1,35 +1,35 @@
|
|
|
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/
|
|
21
|
-
import { bootstrap } from "../bootstrap"
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
24
|
-
|
|
25
|
-
export const
|
|
26
|
-
const events = bootstrap.cache.events.features;
|
|
27
|
-
async function update(event: TypeEvent) {
|
|
28
|
-
if (new Date(event.properties.expires) < new Date()) {
|
|
29
|
-
|
|
30
|
-
await
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
if (!selectedEvent) { await Promise.all(events.map(async (event) => { await update(event) })) }
|
|
34
|
-
if (selectedEvent) { await update(selectedEvent) }
|
|
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 { bootstrap } from "../bootstrap"
|
|
22
|
+
import { SetEventEmit } from "../@modules/@utilities/SetEventEmit";
|
|
23
|
+
import { RemoveEvent } from "./RemoveEvent";
|
|
24
|
+
|
|
25
|
+
export const UpdateEvents = async (selectedEvent?: TypeEvent): Promise<void> => {
|
|
26
|
+
const events = bootstrap.cache.events.features;
|
|
27
|
+
async function update(event: TypeEvent) {
|
|
28
|
+
if (new Date(event.properties.expires) < new Date()) {
|
|
29
|
+
SetEventEmit({ event: `onExpiredProduct`, metadata: event })
|
|
30
|
+
await RemoveEvent(event, true)
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (!selectedEvent) { await Promise.all(events.map(async (event) => { await update(event) })) }
|
|
34
|
+
if (selectedEvent) { await update(selectedEvent) }
|
|
35
35
|
}
|
|
@@ -1,54 +1,62 @@
|
|
|
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/
|
|
21
|
-
import { bootstrap } from "../bootstrap"
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
24
|
-
|
|
25
|
-
export const
|
|
26
|
-
const events = bootstrap.cache.events.features;
|
|
27
|
-
const ttl = bootstrap.settings.GlobalSettings.NodeTTL * 1e3;
|
|
28
|
-
let total = 0;
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
const lastUpdate = evt?.properties?.metadata?.updated ?? null;
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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 { bootstrap } from "../bootstrap"
|
|
22
|
+
import { GetEventNodes } from "../@building/GetEventNodes";
|
|
23
|
+
import { SetEventEmit } from "../@modules/@utilities/SetEventEmit";
|
|
24
|
+
|
|
25
|
+
export const UpdateNode = async (selectedEvent?: TypeEvent): Promise<void> => {
|
|
26
|
+
const events = bootstrap.cache.events.features;
|
|
27
|
+
const ttl = bootstrap.settings.GlobalSettings.NodeTTL * 1e3;
|
|
28
|
+
let total = 0;
|
|
29
|
+
|
|
30
|
+
const TTLEvents = selectedEvent ? [selectedEvent] : events.filter((evt) => {
|
|
31
|
+
const lastUpdate = evt?.properties?.metadata?.updated ?? null;
|
|
32
|
+
return lastUpdate == null || (Date.now() - lastUpdate) >= ttl;
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
if (TTLEvents.length === 0) return;
|
|
36
|
+
|
|
37
|
+
async function update(evt: TypeEvent) {
|
|
38
|
+
const node = await GetEventNodes(evt);
|
|
39
|
+
if (node.nodes.length > 0) {
|
|
40
|
+
total++;
|
|
41
|
+
}
|
|
42
|
+
evt.properties.metadata.nodes = node.nodes;
|
|
43
|
+
evt.properties.metadata.filtered_proximity = node.filtered;
|
|
44
|
+
evt.properties.metadata.updated = node.updated;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const concurrency = 4;
|
|
48
|
+
for (let index = 0; index < TTLEvents.length; index += concurrency) {
|
|
49
|
+
const batch = TTLEvents.slice(index, index + concurrency);
|
|
50
|
+
await Promise.all(batch.map((evt) => update(evt)));
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (total > 0) {
|
|
54
|
+
SetEventEmit({
|
|
55
|
+
event: `onNodeUpdate`,
|
|
56
|
+
metadata: {
|
|
57
|
+
type: `global-update`,
|
|
58
|
+
updated: total
|
|
59
|
+
},
|
|
60
|
+
})
|
|
61
|
+
}
|
|
54
62
|
}
|