diff --git a/AIS-protobuf b/AIS-protobuf index b88adf5..4c12be8 160000 --- a/AIS-protobuf +++ b/AIS-protobuf @@ -1 +1 @@ -Subproject commit b88adf58a75107115145a233f3630f035728edc3 +Subproject commit 4c12be8167089ae6cdcfdddde704bbeaf34ccc12 diff --git a/src/implementations/GRPCClientHandler.ts b/src/implementations/GRPCClientHandler.ts index 8dc110c..ed34234 100644 --- a/src/implementations/GRPCClientHandler.ts +++ b/src/implementations/GRPCClientHandler.ts @@ -19,7 +19,7 @@ import { ILocation } from '../models/location' export default class GRPCClientHandler implements IClientHandler { constructor(private readonly client: AISServiceClientImpl) {} - async GetVesselInfo(request: { mmsi: number; timestamp: number }): Promise { + async getVesselInfo(request: { mmsi: number; timestamp: number }): Promise { const grpcReq: VesselInfoRequest = { mmsi: request.mmsi, timestamp: request.timestamp, @@ -30,7 +30,20 @@ export default class GRPCClientHandler implements IClientHandler { return this.convertToDetailedVessel(response) } - StartStreaming(request: { + async getSimpleVessles(request: { timestamp: number }): Promise { + const response = await this.client.GetSimpleVessels({ timestamp: request.timestamp }) + return response.vessels.map(this.convertToSimpleVessel.bind(this)) + } + + async getMonitoredVessels(request: { timestamp: number; selection: ISelectionArea }): Promise { + const response = await this.client.GetMonitoredVessels({ + timestamp: request.timestamp, + selectedArea: request.selection.points, + }) + return response.vessels.map(this.convertToMoniteredVessel.bind(this)) + } + + startStreaming(request: { startTime: number selection: ISelectionArea timeSpeed: number diff --git a/src/implementations/StreamManager.ts b/src/implementations/StreamManager.ts index 670f0c2..1552132 100644 --- a/src/implementations/StreamManager.ts +++ b/src/implementations/StreamManager.ts @@ -3,12 +3,10 @@ import { IMonitoredVessel } from '../models/monitoredVessel' import { IPoint } from '../models/point' import { ISimpleVessel } from '../models/simpleVessel' import { IStreamManager } from '../interfaces/IStreamManager' -import { Subscription } from 'rxjs' export default class StreamManager implements IStreamManager { private allVessels: ISimpleVessel[] | undefined private monitoredVessels: IMonitoredVessel[] | undefined - private subscription?: Subscription = undefined private zone: IPoint[] = [] constructor( @@ -26,29 +24,31 @@ export default class StreamManager implements IStreamManager { this.monitoredVessels = vessels } - public startStream() { - const stream = this.clientHandler.StartStreaming({ - startTime: 1725844950, - selection: { points: this.zone }, - timeSpeed: 1, + public async fetchNewVesselData() { + const simpleVessels = await this.clientHandler.getSimpleVessles({ + timestamp: 1725844950, }) - this.subscription = stream.subscribe((data) => { - this.manageNewSimpleVessels(data.simpleVessels) - this.manageNewMonitoredVessels(data.monitoredVessels) - }) - } + let monitoredVessels: IMonitoredVessel[] = [] + + if (this.zone.length >= 4) { + monitoredVessels = await this.clientHandler.getMonitoredVessels({ + selection: { points: this.zone }, + timestamp: 1725844950, + }) + } + console.log(simpleVessels) + console.log(monitoredVessels) - public endStream() { - this.subscription?.unsubscribe() + this.manageNewSimpleVessels(simpleVessels) + this.manageNewMonitoredVessels(monitoredVessels) } public onMonitoringZoneChange(zone: IPoint[] | undefined) { this.zone = zone || [] - this.endStream() this.setAllVessels(undefined) this.setMonitoredVessels(undefined) - this.startStream() + this.fetchNewVesselData() } private manageNewSimpleVessels(vessels: ISimpleVessel[]) { diff --git a/src/interfaces/IClientHandler.ts b/src/interfaces/IClientHandler.ts index feee826..a33e197 100644 --- a/src/interfaces/IClientHandler.ts +++ b/src/interfaces/IClientHandler.ts @@ -2,13 +2,19 @@ import { Observable } from 'rxjs' import { IDetailedVessel } from '../models/detailedVessel' import { ISelectionArea } from '../models/selectionArea' import { IStreamResponse } from '../models/streamResponse' +import { IMonitoredVessel } from '../models/monitoredVessel' +import { ISimpleVessel } from '../models/simpleVessel' // This interface abstracts away the client implementation for the backend api // It should never use any GRPC models export interface IClientHandler { - GetVesselInfo(request: { mmsi: number; timestamp: number }): Promise - StartStreaming(request: { + getVesselInfo(request: { mmsi: number; timestamp: number }): Promise + getSimpleVessles(request: { timestamp: number }): Promise + getMonitoredVessels(request: { timestamp: number; selection: ISelectionArea }): Promise + + //Deprecated cant close stream + startStreaming(request: { startTime: number selection: ISelectionArea timeSpeed: number diff --git a/src/interfaces/IStreamManager.ts b/src/interfaces/IStreamManager.ts index 47b947a..750ec83 100644 --- a/src/interfaces/IStreamManager.ts +++ b/src/interfaces/IStreamManager.ts @@ -1,7 +1,6 @@ import { IPoint } from '../models/point' export interface IStreamManager { - startStream(): void - endStream(): void + fetchNewVesselData(): void onMonitoringZoneChange(zone: IPoint[] | undefined): void } diff --git a/src/pages/vesselMapPage.tsx b/src/pages/vesselMapPage.tsx index f636036..cc0e526 100644 --- a/src/pages/vesselMapPage.tsx +++ b/src/pages/vesselMapPage.tsx @@ -26,11 +26,7 @@ export default function VesselMapPage() { const [streamManager] = useState(new StreamManager(clientHandler, setAllVessels, setMonitoredVessels)) useEffect(() => { - streamManager.startStream() - // Cleanup function to close the stream when the component unmounts - return () => { - streamManager.endStream() - } + streamManager.fetchNewVesselData() }, []) useEffect(() => {