forked from MapComplete/MapComplete
		
	
		
			
	
	
		
			53 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			53 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
|  | /** | ||
|  |  * Fetches data from random data sources | ||
|  |  */ | ||
|  | import {UIEventSource} from "../UIEventSource"; | ||
|  | import * as $ from "jquery" | ||
|  | 
 | ||
|  | export default class LiveQueryHandler { | ||
|  | 
 | ||
|  | 
 | ||
|  |     private static cache = {} // url --> UIEventSource<actual data>
 | ||
|  |     private static neededShorthands = {} // url -> (shorthand:paths)[]
 | ||
|  | 
 | ||
|  |     public static FetchLiveData(url: string, shorthands: string[]): UIEventSource<any /* string -> string */> { | ||
|  | 
 | ||
|  |         const shorthandsSet: string[] = LiveQueryHandler.neededShorthands[url] ?? [] | ||
|  | 
 | ||
|  |         for (const shorthand of shorthands) { | ||
|  |             if (shorthandsSet.indexOf(shorthand) < 0) { | ||
|  |                 shorthandsSet.push(shorthand); | ||
|  |             } | ||
|  |         } | ||
|  |         LiveQueryHandler.neededShorthands[url] = shorthandsSet; | ||
|  | 
 | ||
|  | 
 | ||
|  |         if (LiveQueryHandler[url] === undefined) { | ||
|  |             const source = new UIEventSource({}); | ||
|  |             LiveQueryHandler[url] = source; | ||
|  | 
 | ||
|  |                 console.log("Fetching live data from a third-party (unknown) API:",url) | ||
|  |             $.getJSON(url, function (data) { | ||
|  |                 for (const shorthandDescription of shorthandsSet) { | ||
|  | 
 | ||
|  |                     const descr = shorthandDescription.trim().split(":"); | ||
|  |                     const shorthand = descr[0]; | ||
|  |                     const path = descr[1]; | ||
|  |                     const parts = path.split("."); | ||
|  |                     let trail = data; | ||
|  |                     for (const part of parts) { | ||
|  |                         if (trail !== undefined) { | ||
|  |                             trail = trail[part]; | ||
|  |                         } | ||
|  |                     } | ||
|  |                     source.data[shorthand] = trail; | ||
|  |                 } | ||
|  |                 source.ping(); | ||
|  | 
 | ||
|  |             }) | ||
|  | 
 | ||
|  |         } | ||
|  |         return LiveQueryHandler[url]; | ||
|  |     } | ||
|  | 
 | ||
|  | } |