-
Notifications
You must be signed in to change notification settings - Fork 68
/
tracker.js
99 lines (89 loc) · 3.09 KB
/
tracker.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import {RSocketClient, JsonSerializer} from 'rsocket-core';
import RSocketWebSocketClient from 'rsocket-websocket-client';
import {Metadata, JsonMetadataSerializer} from './metadata'
export class TrackerClient {
constructor(url, responder) {
this.client = new RSocketClient({
serializers: {
data: JsonSerializer,
metadata: JsonMetadataSerializer,
},
setup: {
// ms btw sending keepalive to server
keepAlive: 10000,
// ms timeout if no keepalive response
lifetime: 20000,
dataMimeType: 'application/json',
metadataMimeType: JsonMetadataSerializer.MIME_TYPE,
},
transport: new RSocketWebSocketClient({url: url}),
responder: responder
});
}
connect(cb) {
return new Promise(((resolve, reject) => {
this.client.connect().subscribe({
onComplete: s => {
this.socket = s;
resolve(this.socket);
},
onError: error => reject(error),
onSubscribe: cancel => { this.cancel = cancel}
});
}));
}
locateRadars(x, y, max) {
let radars = [];
return new Promise(((resolve, reject) => {
let metadata = new Metadata();
metadata.set(Metadata.ROUTE, 'locate.radars.within');
return this.socket.requestStream({
data: {viewBox: {first: x, second: y}, maxRadars: max},
metadata: metadata,
}).subscribe({
onSubscribe: sub => sub.request(max),
onError: error => reject(error),
onNext: msg => radars.push(msg.data),
onComplete: () => resolve(radars)
});
}));
}
streamAircraftPositions(airports) {
let metadata = new Metadata();
metadata.set(Metadata.ROUTE, 'locate.aircrafts.for');
return this.socket.requestStream({
data: airports,
metadata: metadata,
});
}
locateRadar(code) {
return new Promise((resolve, reject) => {
let metadata = new Metadata();
metadata.set(Metadata.ROUTE, `locate.radar.${code}`);
this.socket.requestResponse({
metadata: metadata,
}).subscribe({
onComplete: msg => resolve(msg.data),
onError: error => reject(error)
});
});
}
fetchUserProfile() {
return this.fetchPublicUserProfile("me");
}
fetchPublicUserProfile(login) {
return new Promise((resolve, reject) => {
let metadata = new Metadata();
metadata.set(Metadata.ROUTE, `fetch.profile.${login}`);
this.socket.requestResponse({
metadata: metadata,
}).subscribe({
onComplete: msg => resolve(msg.data),
onError: error => reject(error)
});
});
}
disconnect() {
this.cancel();
}
}