forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			95 lines
		
	
	
		
			No EOL
		
	
	
		
			4.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			No EOL
		
	
	
		
			4.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import FilteringFeatureSource from "../FeatureSource/FilteringFeatureSource";
 | 
						|
import FeatureSourceMerger from "../FeatureSource/FeatureSourceMerger";
 | 
						|
import RememberingSource from "../FeatureSource/RememberingSource";
 | 
						|
import WayHandlingApplyingFeatureSource from "../FeatureSource/WayHandlingApplyingFeatureSource";
 | 
						|
import FeatureDuplicatorPerLayer from "../FeatureSource/FeatureDuplicatorPerLayer";
 | 
						|
import FeatureSource from "../FeatureSource/FeatureSource";
 | 
						|
import {UIEventSource} from "../UIEventSource";
 | 
						|
import LocalStorageSaver from "./LocalStorageSaver";
 | 
						|
import LocalStorageSource from "./LocalStorageSource";
 | 
						|
import Loc from "../../Models/Loc";
 | 
						|
import GeoJsonSource from "./GeoJsonSource";
 | 
						|
import MetaTaggingFeatureSource from "./MetaTaggingFeatureSource";
 | 
						|
import RegisteringFeatureSource from "./RegisteringFeatureSource";
 | 
						|
import FilteredLayer from "../../Models/FilteredLayer";
 | 
						|
import {Changes} from "../Osm/Changes";
 | 
						|
import ChangeApplicator from "./ChangeApplicator";
 | 
						|
import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig";
 | 
						|
 | 
						|
export default class FeaturePipeline implements FeatureSource {
 | 
						|
 | 
						|
    public features: UIEventSource<{ feature: any; freshness: Date }[]>;
 | 
						|
 | 
						|
    public readonly name = "FeaturePipeline"
 | 
						|
 | 
						|
    constructor(flayers: UIEventSource<FilteredLayer[]>,
 | 
						|
                changes: Changes,
 | 
						|
                updater: FeatureSource,
 | 
						|
                fromOsmApi: FeatureSource,
 | 
						|
                layout: UIEventSource<LayoutConfig>,
 | 
						|
                locationControl: UIEventSource<Loc>,
 | 
						|
                selectedElement: UIEventSource<any>) {
 | 
						|
 | 
						|
        const allLoadedFeatures = new UIEventSource<{ feature: any; freshness: Date }[]>([])
 | 
						|
 | 
						|
        // first we metatag, then we save to get the metatags into storage too
 | 
						|
        // Note that we need to register before we do metatagging (as it expects the event sources)
 | 
						|
 | 
						|
        // AT last, the metaTagging also needs to be run _after_ the duplicatorPerLayer
 | 
						|
        const amendedOverpassSource =
 | 
						|
            new RememberingSource(
 | 
						|
                new LocalStorageSaver(
 | 
						|
                    new MetaTaggingFeatureSource(allLoadedFeatures,
 | 
						|
                        new FeatureDuplicatorPerLayer(flayers,
 | 
						|
                            new RegisteringFeatureSource(
 | 
						|
                                new ChangeApplicator(
 | 
						|
                                    updater, changes
 | 
						|
                                ))
 | 
						|
                        )), layout));
 | 
						|
 | 
						|
        const geojsonSources: FeatureSource [] = GeoJsonSource
 | 
						|
            .ConstructMultiSource(flayers.data, locationControl)
 | 
						|
            .map(geojsonSource => {
 | 
						|
                let source = new RegisteringFeatureSource(
 | 
						|
                    new FeatureDuplicatorPerLayer(flayers,
 | 
						|
                        new ChangeApplicator(geojsonSource, changes)));
 | 
						|
                if (!geojsonSource.isOsmCache) {
 | 
						|
                    source = new MetaTaggingFeatureSource(allLoadedFeatures, source, updater.features);
 | 
						|
                }
 | 
						|
                return source
 | 
						|
            });
 | 
						|
 | 
						|
        const amendedLocalStorageSource =
 | 
						|
            new RememberingSource(new RegisteringFeatureSource(new FeatureDuplicatorPerLayer(flayers, new ChangeApplicator(new LocalStorageSource(layout), changes))
 | 
						|
            ));
 | 
						|
 | 
						|
        const amendedOsmApiSource = new RememberingSource(
 | 
						|
            new MetaTaggingFeatureSource(allLoadedFeatures,
 | 
						|
                new FeatureDuplicatorPerLayer(flayers,
 | 
						|
                    new RegisteringFeatureSource(new ChangeApplicator(fromOsmApi, changes,
 | 
						|
                        {
 | 
						|
                            // We lump in the new points here
 | 
						|
                            generateNewGeometries: true
 | 
						|
                        }
 | 
						|
                    )))));
 | 
						|
 | 
						|
        const merged =
 | 
						|
            new FeatureSourceMerger([
 | 
						|
                amendedOverpassSource,
 | 
						|
                amendedOsmApiSource,
 | 
						|
                amendedLocalStorageSource,
 | 
						|
                ...geojsonSources
 | 
						|
            ]);
 | 
						|
 | 
						|
        merged.features.syncWith(allLoadedFeatures)
 | 
						|
 | 
						|
        this.features = new WayHandlingApplyingFeatureSource(flayers,
 | 
						|
            new FilteringFeatureSource(
 | 
						|
                flayers,
 | 
						|
                locationControl,
 | 
						|
                selectedElement,
 | 
						|
                merged
 | 
						|
            )).features;
 | 
						|
    }
 | 
						|
 | 
						|
} |