mapcomplete/Logic/Web/LiveQueryHandler.ts

48 lines
1.7 KiB
TypeScript
Raw Normal View History

2022-09-08 21:40:48 +02:00
import { UIEventSource } from "../UIEventSource"
import { Utils } from "../../Utils"
2021-07-03 22:24:12 +02:00
/**
* Fetches data from random data sources, used in the metatagging
*/
2020-10-12 01:25:27 +02:00
export default class LiveQueryHandler {
private static neededShorthands = {} // url -> (shorthand:paths)[]
2022-09-08 21:40:48 +02:00
public static FetchLiveData(
url: string,
shorthands: string[]
): UIEventSource<any /* string -> string */> {
2020-10-12 01:25:27 +02:00
const shorthandsSet: string[] = LiveQueryHandler.neededShorthands[url] ?? []
for (const shorthand of shorthands) {
if (shorthandsSet.indexOf(shorthand) < 0) {
2022-09-08 21:40:48 +02:00
shorthandsSet.push(shorthand)
2020-10-12 01:25:27 +02:00
}
}
2022-09-08 21:40:48 +02:00
LiveQueryHandler.neededShorthands[url] = shorthandsSet
2020-10-12 01:25:27 +02:00
if (LiveQueryHandler[url] === undefined) {
2022-09-08 21:40:48 +02:00
const source = new UIEventSource({})
LiveQueryHandler[url] = source
2020-10-12 01:25:27 +02:00
console.log("Fetching live data from a third-party (unknown) API:", url)
2022-09-08 21:40:48 +02:00
Utils.downloadJson(url).then((data) => {
2020-10-12 01:25:27 +02:00
for (const shorthandDescription of shorthandsSet) {
2022-09-08 21:40:48 +02:00
const descr = shorthandDescription.trim().split(":")
const shorthand = descr[0]
const path = descr[1]
const parts = path.split(".")
let trail = data
2020-10-12 01:25:27 +02:00
for (const part of parts) {
if (trail !== undefined) {
2022-09-08 21:40:48 +02:00
trail = trail[part]
2020-10-12 01:25:27 +02:00
}
}
2022-09-08 21:40:48 +02:00
source.data[shorthand] = trail
2020-10-12 01:25:27 +02:00
}
2022-09-08 21:40:48 +02:00
source.ping()
2020-10-12 01:25:27 +02:00
})
}
2022-09-08 21:40:48 +02:00
return LiveQueryHandler[url]
2020-10-12 01:25:27 +02:00
}
2022-09-08 21:40:48 +02:00
}