camstreamerlib 4.0.32-d499827 → 4.0.33-4b63673
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -0
- package/cjs/PlaneTrackerAPI.js +2 -1
- package/cjs/types/ws/PlaneTrackerEvents.d.ts +36 -0
- package/cjs/types/ws/PlaneTrackerEvents.js +14 -1
- package/cjs/ws/PlaneTrackerEvents.d.ts +1 -1
- package/cjs/ws/PlaneTrackerEvents.js +2 -2
- package/cjs/ws/PlaneTrackerEvents.test.d.ts +1 -0
- package/cjs/ws/PlaneTrackerEvents.test.js +27 -0
- package/esm/PlaneTrackerAPI.js +2 -1
- package/esm/types/ws/PlaneTrackerEvents.js +13 -0
- package/esm/ws/PlaneTrackerEvents.js +3 -3
- package/esm/ws/PlaneTrackerEvents.test.js +25 -0
- package/package.json +3 -2
- package/types/types/ws/PlaneTrackerEvents.d.ts +36 -0
- package/types/ws/PlaneTrackerEvents.d.ts +1 -1
- package/types/ws/PlaneTrackerEvents.test.d.ts +1 -0
package/README.md
CHANGED
|
@@ -39,6 +39,15 @@ npm install camstreamerlib
|
|
|
39
39
|
|
|
40
40
|
</br>
|
|
41
41
|
|
|
42
|
+
# Examples
|
|
43
|
+
|
|
44
|
+
| Example | Description | Open in browser |
|
|
45
|
+
| --------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- |
|
|
46
|
+
| [CamSwitcherEvents](examples/camswitcher-events.html) ([source](https://github.com/CamStreamer/CamStreamerLib/blob/master/examples/camswitcher-events.html)) | Logs every CamSwitcher event. `DeviceConnectClient` (HTTP) backs [CamSwitcherAPI](doc/CamSwitcherAPI.md) to obtain the websocket authorization token, `DeviceConnectWsClient` (websocket) backs [CamSwitcherEvents](doc/ws/CamSwitcherEvents.md), which validates and dispatches the events. Connection state is taken from the `authorization` event. | [open](https://camstreamer.github.io/CamStreamerLib/examples/camswitcher-events.html) |
|
|
47
|
+
| [PlaneTrackerEvents](examples/planetracker-events.html) ([source](https://github.com/CamStreamer/CamStreamerLib/blob/master/examples/planetracker-events.html)) | Logs every PlaneTracker event. PlaneTracker needs no authorization token — [PlaneTrackerEvents](doc/ws/PlaneTrackerEvents.md) announces the connecting user (`userId` / `userName` / `userPriority`, editable in the form) as the init message instead, so only the websocket client is needed. The continuous `CAMERA_POSITION` and `FLIGHT_LIST` events only update the summary line unless the checkbox is ticked. | [open](https://camstreamer.github.io/CamStreamerLib/examples/planetracker-events.html) |
|
|
48
|
+
|
|
49
|
+
</br>
|
|
50
|
+
|
|
42
51
|
# Breaking Changes
|
|
43
52
|
|
|
44
53
|
<details open>
|
package/cjs/PlaneTrackerAPI.js
CHANGED
|
@@ -5,12 +5,13 @@ const zod_1 = require("zod");
|
|
|
5
5
|
const PlaneTrackerAPI_1 = require("./types/PlaneTrackerAPI");
|
|
6
6
|
const errors_1 = require("./errors/errors");
|
|
7
7
|
const BasicAPI_1 = require("./internal/BasicAPI");
|
|
8
|
+
const PlaneTrackerEvents_1 = require("./types/ws/PlaneTrackerEvents");
|
|
8
9
|
const BASE_PATH = '/local/planetracker';
|
|
9
10
|
class PlaneTrackerAPI extends BasicAPI_1.BasicAPI {
|
|
10
11
|
apiUser;
|
|
11
12
|
constructor(client, apiUser) {
|
|
12
13
|
super(client);
|
|
13
|
-
this.apiUser = apiUser;
|
|
14
|
+
this.apiUser = PlaneTrackerEvents_1.apiUserInputSchema.parse(apiUser);
|
|
14
15
|
}
|
|
15
16
|
static getProxyPath = () => `${BASE_PATH}/proxy.cgi`;
|
|
16
17
|
static getWsEventsPath = () => `${BASE_PATH}/package/ws`;
|
|
@@ -2,6 +2,7 @@ import { z } from 'zod';
|
|
|
2
2
|
declare const wsApiFlightDataSchema: z.ZodObject<{
|
|
3
3
|
targetId: z.ZodString;
|
|
4
4
|
icao: z.ZodString;
|
|
5
|
+
callsign: z.ZodOptional<z.ZodString>;
|
|
5
6
|
domain: z.ZodEnum<["adsb", "remoteId"]>;
|
|
6
7
|
categoryId: z.ZodString;
|
|
7
8
|
groupId: z.ZodOptional<z.ZodString>;
|
|
@@ -50,6 +51,7 @@ declare const wsApiFlightDataSchema: z.ZodObject<{
|
|
|
50
51
|
emitterCategory: number;
|
|
51
52
|
emergencyState: boolean;
|
|
52
53
|
emergencyStatusMessage: string;
|
|
54
|
+
callsign?: string | undefined;
|
|
53
55
|
groupId?: string | undefined;
|
|
54
56
|
}, {
|
|
55
57
|
icao: string;
|
|
@@ -74,6 +76,7 @@ declare const wsApiFlightDataSchema: z.ZodObject<{
|
|
|
74
76
|
signalQuality: number;
|
|
75
77
|
emergencyState: boolean;
|
|
76
78
|
emergencyStatusMessage: string;
|
|
79
|
+
callsign?: string | undefined;
|
|
77
80
|
groupId?: string | undefined;
|
|
78
81
|
emitterCategorySet?: number | undefined;
|
|
79
82
|
emitterCategory?: number | undefined;
|
|
@@ -117,6 +120,21 @@ declare const apiUserSchema: z.ZodObject<{
|
|
|
117
120
|
userName: string;
|
|
118
121
|
userPriority: number;
|
|
119
122
|
}>;
|
|
123
|
+
export declare const USER_PRIORITY_MIN = 1;
|
|
124
|
+
export declare const USER_PRIORITY_MAX = 255;
|
|
125
|
+
export declare const apiUserInputSchema: z.ZodObject<{} & {
|
|
126
|
+
userId: z.ZodString;
|
|
127
|
+
userName: z.ZodString;
|
|
128
|
+
userPriority: z.ZodNumber;
|
|
129
|
+
}, "strip", z.ZodTypeAny, {
|
|
130
|
+
userId: string;
|
|
131
|
+
userName: string;
|
|
132
|
+
userPriority: number;
|
|
133
|
+
}, {
|
|
134
|
+
userId: string;
|
|
135
|
+
userName: string;
|
|
136
|
+
userPriority: number;
|
|
137
|
+
}>;
|
|
120
138
|
export type TEventType = 'CAMERA_POSITION' | 'TRACKING_START' | 'TRACKING_STOP' | 'FLIGHT_LIST' | 'USER_ACTION' | 'CONNECTED_USERS' | 'FORCE_TRACKING_STATUS' | 'API_LOCK_STATUS';
|
|
121
139
|
export declare enum EUserActions {
|
|
122
140
|
TRACK_ICAO = "trackIcao.cgi",
|
|
@@ -188,6 +206,7 @@ declare const eventsDataSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
188
206
|
list: z.ZodArray<z.ZodObject<{
|
|
189
207
|
targetId: z.ZodString;
|
|
190
208
|
icao: z.ZodString;
|
|
209
|
+
callsign: z.ZodOptional<z.ZodString>;
|
|
191
210
|
domain: z.ZodEnum<["adsb", "remoteId"]>;
|
|
192
211
|
categoryId: z.ZodString;
|
|
193
212
|
groupId: z.ZodOptional<z.ZodString>;
|
|
@@ -236,6 +255,7 @@ declare const eventsDataSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
236
255
|
emitterCategory: number;
|
|
237
256
|
emergencyState: boolean;
|
|
238
257
|
emergencyStatusMessage: string;
|
|
258
|
+
callsign?: string | undefined;
|
|
239
259
|
groupId?: string | undefined;
|
|
240
260
|
}, {
|
|
241
261
|
icao: string;
|
|
@@ -260,6 +280,7 @@ declare const eventsDataSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
260
280
|
signalQuality: number;
|
|
261
281
|
emergencyState: boolean;
|
|
262
282
|
emergencyStatusMessage: string;
|
|
283
|
+
callsign?: string | undefined;
|
|
263
284
|
groupId?: string | undefined;
|
|
264
285
|
emitterCategorySet?: number | undefined;
|
|
265
286
|
emitterCategory?: number | undefined;
|
|
@@ -291,6 +312,7 @@ declare const eventsDataSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
291
312
|
emitterCategory: number;
|
|
292
313
|
emergencyState: boolean;
|
|
293
314
|
emergencyStatusMessage: string;
|
|
315
|
+
callsign?: string | undefined;
|
|
294
316
|
groupId?: string | undefined;
|
|
295
317
|
}[];
|
|
296
318
|
}, {
|
|
@@ -318,6 +340,7 @@ declare const eventsDataSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
318
340
|
signalQuality: number;
|
|
319
341
|
emergencyState: boolean;
|
|
320
342
|
emergencyStatusMessage: string;
|
|
343
|
+
callsign?: string | undefined;
|
|
321
344
|
groupId?: string | undefined;
|
|
322
345
|
emitterCategorySet?: number | undefined;
|
|
323
346
|
emitterCategory?: number | undefined;
|
|
@@ -1344,6 +1367,7 @@ export declare const ptrEventsSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
1344
1367
|
list: z.ZodArray<z.ZodObject<{
|
|
1345
1368
|
targetId: z.ZodString;
|
|
1346
1369
|
icao: z.ZodString;
|
|
1370
|
+
callsign: z.ZodOptional<z.ZodString>;
|
|
1347
1371
|
domain: z.ZodEnum<["adsb", "remoteId"]>;
|
|
1348
1372
|
categoryId: z.ZodString;
|
|
1349
1373
|
groupId: z.ZodOptional<z.ZodString>;
|
|
@@ -1392,6 +1416,7 @@ export declare const ptrEventsSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
1392
1416
|
emitterCategory: number;
|
|
1393
1417
|
emergencyState: boolean;
|
|
1394
1418
|
emergencyStatusMessage: string;
|
|
1419
|
+
callsign?: string | undefined;
|
|
1395
1420
|
groupId?: string | undefined;
|
|
1396
1421
|
}, {
|
|
1397
1422
|
icao: string;
|
|
@@ -1416,6 +1441,7 @@ export declare const ptrEventsSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
1416
1441
|
signalQuality: number;
|
|
1417
1442
|
emergencyState: boolean;
|
|
1418
1443
|
emergencyStatusMessage: string;
|
|
1444
|
+
callsign?: string | undefined;
|
|
1419
1445
|
groupId?: string | undefined;
|
|
1420
1446
|
emitterCategorySet?: number | undefined;
|
|
1421
1447
|
emitterCategory?: number | undefined;
|
|
@@ -1447,6 +1473,7 @@ export declare const ptrEventsSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
1447
1473
|
emitterCategory: number;
|
|
1448
1474
|
emergencyState: boolean;
|
|
1449
1475
|
emergencyStatusMessage: string;
|
|
1476
|
+
callsign?: string | undefined;
|
|
1450
1477
|
groupId?: string | undefined;
|
|
1451
1478
|
}[];
|
|
1452
1479
|
}, {
|
|
@@ -1474,6 +1501,7 @@ export declare const ptrEventsSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
1474
1501
|
signalQuality: number;
|
|
1475
1502
|
emergencyState: boolean;
|
|
1476
1503
|
emergencyStatusMessage: string;
|
|
1504
|
+
callsign?: string | undefined;
|
|
1477
1505
|
groupId?: string | undefined;
|
|
1478
1506
|
emitterCategorySet?: number | undefined;
|
|
1479
1507
|
emitterCategory?: number | undefined;
|
|
@@ -2489,6 +2517,7 @@ export declare const ptrEventsSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
2489
2517
|
emitterCategory: number;
|
|
2490
2518
|
emergencyState: boolean;
|
|
2491
2519
|
emergencyStatusMessage: string;
|
|
2520
|
+
callsign?: string | undefined;
|
|
2492
2521
|
groupId?: string | undefined;
|
|
2493
2522
|
}[];
|
|
2494
2523
|
} | {
|
|
@@ -2750,6 +2779,7 @@ export declare const ptrEventsSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
2750
2779
|
signalQuality: number;
|
|
2751
2780
|
emergencyState: boolean;
|
|
2752
2781
|
emergencyStatusMessage: string;
|
|
2782
|
+
callsign?: string | undefined;
|
|
2753
2783
|
groupId?: string | undefined;
|
|
2754
2784
|
emitterCategorySet?: number | undefined;
|
|
2755
2785
|
emitterCategory?: number | undefined;
|
|
@@ -3024,6 +3054,7 @@ export declare const ptrEventsSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
3024
3054
|
list: z.ZodArray<z.ZodObject<{
|
|
3025
3055
|
targetId: z.ZodString;
|
|
3026
3056
|
icao: z.ZodString;
|
|
3057
|
+
callsign: z.ZodOptional<z.ZodString>;
|
|
3027
3058
|
domain: z.ZodEnum<["adsb", "remoteId"]>;
|
|
3028
3059
|
categoryId: z.ZodString;
|
|
3029
3060
|
groupId: z.ZodOptional<z.ZodString>;
|
|
@@ -3072,6 +3103,7 @@ export declare const ptrEventsSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
3072
3103
|
emitterCategory: number;
|
|
3073
3104
|
emergencyState: boolean;
|
|
3074
3105
|
emergencyStatusMessage: string;
|
|
3106
|
+
callsign?: string | undefined;
|
|
3075
3107
|
groupId?: string | undefined;
|
|
3076
3108
|
}, {
|
|
3077
3109
|
icao: string;
|
|
@@ -3096,6 +3128,7 @@ export declare const ptrEventsSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
3096
3128
|
signalQuality: number;
|
|
3097
3129
|
emergencyState: boolean;
|
|
3098
3130
|
emergencyStatusMessage: string;
|
|
3131
|
+
callsign?: string | undefined;
|
|
3099
3132
|
groupId?: string | undefined;
|
|
3100
3133
|
emitterCategorySet?: number | undefined;
|
|
3101
3134
|
emitterCategory?: number | undefined;
|
|
@@ -3127,6 +3160,7 @@ export declare const ptrEventsSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
3127
3160
|
emitterCategory: number;
|
|
3128
3161
|
emergencyState: boolean;
|
|
3129
3162
|
emergencyStatusMessage: string;
|
|
3163
|
+
callsign?: string | undefined;
|
|
3130
3164
|
groupId?: string | undefined;
|
|
3131
3165
|
}[];
|
|
3132
3166
|
}, {
|
|
@@ -3154,6 +3188,7 @@ export declare const ptrEventsSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
3154
3188
|
signalQuality: number;
|
|
3155
3189
|
emergencyState: boolean;
|
|
3156
3190
|
emergencyStatusMessage: string;
|
|
3191
|
+
callsign?: string | undefined;
|
|
3157
3192
|
groupId?: string | undefined;
|
|
3158
3193
|
emitterCategorySet?: number | undefined;
|
|
3159
3194
|
emitterCategory?: number | undefined;
|
|
@@ -4134,4 +4169,5 @@ export type TUserActionDataOfCgi<T extends EUserActions> = Extract<TWsUserAction
|
|
|
4134
4169
|
export type TWsApiFlightData = z.infer<typeof wsApiFlightDataSchema>;
|
|
4135
4170
|
export type TWsApiCameraData = z.infer<typeof wsCameraPositionDataSchema>;
|
|
4136
4171
|
export type TApiUser = z.infer<typeof apiUserSchema>;
|
|
4172
|
+
export type TApiUserInput = z.infer<typeof apiUserInputSchema>;
|
|
4137
4173
|
export {};
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ptrEventsSchema = exports.EUserActions = void 0;
|
|
3
|
+
exports.ptrEventsSchema = exports.EUserActions = exports.apiUserInputSchema = exports.USER_PRIORITY_MAX = exports.USER_PRIORITY_MIN = void 0;
|
|
4
4
|
const zod_1 = require("zod");
|
|
5
5
|
const PlaneTrackerAPI_1 = require("../PlaneTrackerAPI");
|
|
6
6
|
const wsApiFlightDataSchema = zod_1.z.object({
|
|
7
7
|
targetId: zod_1.z.string(),
|
|
8
8
|
icao: zod_1.z.string(),
|
|
9
|
+
callsign: zod_1.z.string().optional(),
|
|
9
10
|
domain: PlaneTrackerAPI_1.domainIdSchema,
|
|
10
11
|
categoryId: zod_1.z.string(),
|
|
11
12
|
groupId: zod_1.z.string().optional(),
|
|
@@ -47,6 +48,18 @@ const apiUserSchema = userSchema.extend({
|
|
|
47
48
|
ip: zod_1.z.string(),
|
|
48
49
|
userPriority: zod_1.z.number(),
|
|
49
50
|
});
|
|
51
|
+
exports.USER_PRIORITY_MIN = 1;
|
|
52
|
+
exports.USER_PRIORITY_MAX = 255;
|
|
53
|
+
const USER_PRIORITY_ERROR = `userPriority must be an integer between ${exports.USER_PRIORITY_MIN} and ${exports.USER_PRIORITY_MAX}, where ${exports.USER_PRIORITY_MIN} is the highest priority`;
|
|
54
|
+
exports.apiUserInputSchema = apiUserSchema.omit({ ip: true }).extend({
|
|
55
|
+
userId: zod_1.z.string().nonempty(),
|
|
56
|
+
userName: zod_1.z.string().nonempty(),
|
|
57
|
+
userPriority: zod_1.z
|
|
58
|
+
.number()
|
|
59
|
+
.int(USER_PRIORITY_ERROR)
|
|
60
|
+
.min(exports.USER_PRIORITY_MIN, USER_PRIORITY_ERROR)
|
|
61
|
+
.max(exports.USER_PRIORITY_MAX, USER_PRIORITY_ERROR),
|
|
62
|
+
});
|
|
50
63
|
var EUserActions;
|
|
51
64
|
(function (EUserActions) {
|
|
52
65
|
EUserActions["TRACK_ICAO"] = "trackIcao.cgi";
|
|
@@ -3,6 +3,6 @@ import { WsEvents } from '../internal/WsEvents';
|
|
|
3
3
|
import { TEventData, TApiUser } from '../types/ws/PlaneTrackerEvents';
|
|
4
4
|
export declare class PlaneTrackerEvents extends WsEvents<TEventData> {
|
|
5
5
|
private _apiUser;
|
|
6
|
-
constructor(ws: IWsClient,
|
|
6
|
+
constructor(ws: IWsClient, apiUser: Omit<TApiUser, 'ip'>);
|
|
7
7
|
private sendInitMsg;
|
|
8
8
|
}
|
|
@@ -5,9 +5,9 @@ const WsEvents_1 = require("../internal/WsEvents");
|
|
|
5
5
|
const PlaneTrackerEvents_1 = require("../types/ws/PlaneTrackerEvents");
|
|
6
6
|
class PlaneTrackerEvents extends WsEvents_1.WsEvents {
|
|
7
7
|
_apiUser;
|
|
8
|
-
constructor(ws,
|
|
8
|
+
constructor(ws, apiUser) {
|
|
9
9
|
super((data) => PlaneTrackerEvents_1.ptrEventsSchema.parse(data), ws);
|
|
10
|
-
this._apiUser =
|
|
10
|
+
this._apiUser = PlaneTrackerEvents_1.apiUserInputSchema.parse(apiUser);
|
|
11
11
|
this.ws.onOpen = this.sendInitMsg;
|
|
12
12
|
}
|
|
13
13
|
sendInitMsg = () => {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const PlaneTrackerEvents_1 = require("./PlaneTrackerEvents");
|
|
4
|
+
const PlaneTrackerEvents_2 = require("../types/ws/PlaneTrackerEvents");
|
|
5
|
+
const createWsClient = () => ({
|
|
6
|
+
send: jest.fn(),
|
|
7
|
+
onOpen: undefined,
|
|
8
|
+
onMessage: undefined,
|
|
9
|
+
});
|
|
10
|
+
const VALID_USER = { userId: 'asd', userName: 'Asd', userPriority: 1 };
|
|
11
|
+
describe('PlaneTrackerEvents', () => {
|
|
12
|
+
it.each([0, -1, PlaneTrackerEvents_2.USER_PRIORITY_MAX + 1, 1.5])('rejects userPriority %p', (userPriority) => {
|
|
13
|
+
expect(() => new PlaneTrackerEvents_1.PlaneTrackerEvents(createWsClient(), { ...VALID_USER, userPriority })).toThrow(/userPriority must be an integer/);
|
|
14
|
+
});
|
|
15
|
+
it.each([PlaneTrackerEvents_2.USER_PRIORITY_MIN, PlaneTrackerEvents_2.USER_PRIORITY_MAX])('accepts userPriority %p', (userPriority) => {
|
|
16
|
+
expect(() => new PlaneTrackerEvents_1.PlaneTrackerEvents(createWsClient(), { ...VALID_USER, userPriority })).not.toThrow();
|
|
17
|
+
});
|
|
18
|
+
it('rejects an empty userId', () => {
|
|
19
|
+
expect(() => new PlaneTrackerEvents_1.PlaneTrackerEvents(createWsClient(), { ...VALID_USER, userId: '' })).toThrow();
|
|
20
|
+
});
|
|
21
|
+
it('sends USER_INFO once the socket opens', () => {
|
|
22
|
+
const ws = createWsClient();
|
|
23
|
+
new PlaneTrackerEvents_1.PlaneTrackerEvents(ws, VALID_USER);
|
|
24
|
+
ws.onOpen();
|
|
25
|
+
expect(ws.send).toHaveBeenCalledWith(JSON.stringify({ type: 'USER_INFO', ...VALID_USER }));
|
|
26
|
+
});
|
|
27
|
+
});
|
package/esm/PlaneTrackerAPI.js
CHANGED
|
@@ -2,12 +2,13 @@ import { z } from 'zod';
|
|
|
2
2
|
import { blackListSchema, cameraSettingsSchema, domainListSchema, flightInfoSchema, getIcaoSchema, mapInfoSchema, milestoneCameraListSchema, priorityListSchema, serverSettingsSchema, trackingModeSchema, whiteListSchema, wsAliasResponseSchema, zonesSchema, } from './types/PlaneTrackerAPI';
|
|
3
3
|
import { CannotSetCoordsInAutoModeError, ImportSettingsError, InvalidAltitudeError, InvalidLatLngError, ResetCalibrationError, ServerError, BadRequestError, } from './errors/errors';
|
|
4
4
|
import { BasicAPI } from './internal/BasicAPI';
|
|
5
|
+
import { apiUserInputSchema } from './types/ws/PlaneTrackerEvents';
|
|
5
6
|
const BASE_PATH = '/local/planetracker';
|
|
6
7
|
export class PlaneTrackerAPI extends BasicAPI {
|
|
7
8
|
apiUser;
|
|
8
9
|
constructor(client, apiUser) {
|
|
9
10
|
super(client);
|
|
10
|
-
this.apiUser = apiUser;
|
|
11
|
+
this.apiUser = apiUserInputSchema.parse(apiUser);
|
|
11
12
|
}
|
|
12
13
|
static getProxyPath = () => `${BASE_PATH}/proxy.cgi`;
|
|
13
14
|
static getWsEventsPath = () => `${BASE_PATH}/package/ws`;
|
|
@@ -3,6 +3,7 @@ import { blackListSchema, friendlyListSchema, priorityListSchema, trackingModeSc
|
|
|
3
3
|
const wsApiFlightDataSchema = z.object({
|
|
4
4
|
targetId: z.string(),
|
|
5
5
|
icao: z.string(),
|
|
6
|
+
callsign: z.string().optional(),
|
|
6
7
|
domain: domainIdSchema,
|
|
7
8
|
categoryId: z.string(),
|
|
8
9
|
groupId: z.string().optional(),
|
|
@@ -44,6 +45,18 @@ const apiUserSchema = userSchema.extend({
|
|
|
44
45
|
ip: z.string(),
|
|
45
46
|
userPriority: z.number(),
|
|
46
47
|
});
|
|
48
|
+
export const USER_PRIORITY_MIN = 1;
|
|
49
|
+
export const USER_PRIORITY_MAX = 255;
|
|
50
|
+
const USER_PRIORITY_ERROR = `userPriority must be an integer between ${USER_PRIORITY_MIN} and ${USER_PRIORITY_MAX}, where ${USER_PRIORITY_MIN} is the highest priority`;
|
|
51
|
+
export const apiUserInputSchema = apiUserSchema.omit({ ip: true }).extend({
|
|
52
|
+
userId: z.string().nonempty(),
|
|
53
|
+
userName: z.string().nonempty(),
|
|
54
|
+
userPriority: z
|
|
55
|
+
.number()
|
|
56
|
+
.int(USER_PRIORITY_ERROR)
|
|
57
|
+
.min(USER_PRIORITY_MIN, USER_PRIORITY_ERROR)
|
|
58
|
+
.max(USER_PRIORITY_MAX, USER_PRIORITY_ERROR),
|
|
59
|
+
});
|
|
47
60
|
export var EUserActions;
|
|
48
61
|
(function (EUserActions) {
|
|
49
62
|
EUserActions["TRACK_ICAO"] = "trackIcao.cgi";
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { WsEvents } from '../internal/WsEvents';
|
|
2
|
-
import { ptrEventsSchema } from '../types/ws/PlaneTrackerEvents';
|
|
2
|
+
import { ptrEventsSchema, apiUserInputSchema, } from '../types/ws/PlaneTrackerEvents';
|
|
3
3
|
export class PlaneTrackerEvents extends WsEvents {
|
|
4
4
|
_apiUser;
|
|
5
|
-
constructor(ws,
|
|
5
|
+
constructor(ws, apiUser) {
|
|
6
6
|
super((data) => ptrEventsSchema.parse(data), ws);
|
|
7
|
-
this._apiUser =
|
|
7
|
+
this._apiUser = apiUserInputSchema.parse(apiUser);
|
|
8
8
|
this.ws.onOpen = this.sendInitMsg;
|
|
9
9
|
}
|
|
10
10
|
sendInitMsg = () => {
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { PlaneTrackerEvents } from './PlaneTrackerEvents';
|
|
2
|
+
import { USER_PRIORITY_MAX, USER_PRIORITY_MIN } from '../types/ws/PlaneTrackerEvents';
|
|
3
|
+
const createWsClient = () => ({
|
|
4
|
+
send: jest.fn(),
|
|
5
|
+
onOpen: undefined,
|
|
6
|
+
onMessage: undefined,
|
|
7
|
+
});
|
|
8
|
+
const VALID_USER = { userId: 'asd', userName: 'Asd', userPriority: 1 };
|
|
9
|
+
describe('PlaneTrackerEvents', () => {
|
|
10
|
+
it.each([0, -1, USER_PRIORITY_MAX + 1, 1.5])('rejects userPriority %p', (userPriority) => {
|
|
11
|
+
expect(() => new PlaneTrackerEvents(createWsClient(), { ...VALID_USER, userPriority })).toThrow(/userPriority must be an integer/);
|
|
12
|
+
});
|
|
13
|
+
it.each([USER_PRIORITY_MIN, USER_PRIORITY_MAX])('accepts userPriority %p', (userPriority) => {
|
|
14
|
+
expect(() => new PlaneTrackerEvents(createWsClient(), { ...VALID_USER, userPriority })).not.toThrow();
|
|
15
|
+
});
|
|
16
|
+
it('rejects an empty userId', () => {
|
|
17
|
+
expect(() => new PlaneTrackerEvents(createWsClient(), { ...VALID_USER, userId: '' })).toThrow();
|
|
18
|
+
});
|
|
19
|
+
it('sends USER_INFO once the socket opens', () => {
|
|
20
|
+
const ws = createWsClient();
|
|
21
|
+
new PlaneTrackerEvents(ws, VALID_USER);
|
|
22
|
+
ws.onOpen();
|
|
23
|
+
expect(ws.send).toHaveBeenCalledWith(JSON.stringify({ type: 'USER_INFO', ...VALID_USER }));
|
|
24
|
+
});
|
|
25
|
+
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "camstreamerlib",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.33-4b63673",
|
|
4
4
|
"description": "Helper library for CamStreamer ACAP applications.",
|
|
5
5
|
"prettier": "@camstreamer/prettier-config",
|
|
6
6
|
"engine": {
|
|
@@ -36,7 +36,8 @@
|
|
|
36
36
|
"typescript": "5.3.3"
|
|
37
37
|
},
|
|
38
38
|
"overrides": {
|
|
39
|
-
"js-yaml": "^4.2
|
|
39
|
+
"js-yaml": "^4.3.2",
|
|
40
|
+
"browserslist": "^4.28.7"
|
|
40
41
|
},
|
|
41
42
|
"scripts": {
|
|
42
43
|
"clean": "rimraf dist/*",
|
|
@@ -2,6 +2,7 @@ import { z } from 'zod';
|
|
|
2
2
|
declare const wsApiFlightDataSchema: z.ZodObject<{
|
|
3
3
|
targetId: z.ZodString;
|
|
4
4
|
icao: z.ZodString;
|
|
5
|
+
callsign: z.ZodOptional<z.ZodString>;
|
|
5
6
|
domain: z.ZodEnum<["adsb", "remoteId"]>;
|
|
6
7
|
categoryId: z.ZodString;
|
|
7
8
|
groupId: z.ZodOptional<z.ZodString>;
|
|
@@ -50,6 +51,7 @@ declare const wsApiFlightDataSchema: z.ZodObject<{
|
|
|
50
51
|
emitterCategory: number;
|
|
51
52
|
emergencyState: boolean;
|
|
52
53
|
emergencyStatusMessage: string;
|
|
54
|
+
callsign?: string | undefined;
|
|
53
55
|
groupId?: string | undefined;
|
|
54
56
|
}, {
|
|
55
57
|
icao: string;
|
|
@@ -74,6 +76,7 @@ declare const wsApiFlightDataSchema: z.ZodObject<{
|
|
|
74
76
|
signalQuality: number;
|
|
75
77
|
emergencyState: boolean;
|
|
76
78
|
emergencyStatusMessage: string;
|
|
79
|
+
callsign?: string | undefined;
|
|
77
80
|
groupId?: string | undefined;
|
|
78
81
|
emitterCategorySet?: number | undefined;
|
|
79
82
|
emitterCategory?: number | undefined;
|
|
@@ -117,6 +120,21 @@ declare const apiUserSchema: z.ZodObject<{
|
|
|
117
120
|
userName: string;
|
|
118
121
|
userPriority: number;
|
|
119
122
|
}>;
|
|
123
|
+
export declare const USER_PRIORITY_MIN = 1;
|
|
124
|
+
export declare const USER_PRIORITY_MAX = 255;
|
|
125
|
+
export declare const apiUserInputSchema: z.ZodObject<{} & {
|
|
126
|
+
userId: z.ZodString;
|
|
127
|
+
userName: z.ZodString;
|
|
128
|
+
userPriority: z.ZodNumber;
|
|
129
|
+
}, "strip", z.ZodTypeAny, {
|
|
130
|
+
userId: string;
|
|
131
|
+
userName: string;
|
|
132
|
+
userPriority: number;
|
|
133
|
+
}, {
|
|
134
|
+
userId: string;
|
|
135
|
+
userName: string;
|
|
136
|
+
userPriority: number;
|
|
137
|
+
}>;
|
|
120
138
|
export type TEventType = 'CAMERA_POSITION' | 'TRACKING_START' | 'TRACKING_STOP' | 'FLIGHT_LIST' | 'USER_ACTION' | 'CONNECTED_USERS' | 'FORCE_TRACKING_STATUS' | 'API_LOCK_STATUS';
|
|
121
139
|
export declare enum EUserActions {
|
|
122
140
|
TRACK_ICAO = "trackIcao.cgi",
|
|
@@ -188,6 +206,7 @@ declare const eventsDataSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
188
206
|
list: z.ZodArray<z.ZodObject<{
|
|
189
207
|
targetId: z.ZodString;
|
|
190
208
|
icao: z.ZodString;
|
|
209
|
+
callsign: z.ZodOptional<z.ZodString>;
|
|
191
210
|
domain: z.ZodEnum<["adsb", "remoteId"]>;
|
|
192
211
|
categoryId: z.ZodString;
|
|
193
212
|
groupId: z.ZodOptional<z.ZodString>;
|
|
@@ -236,6 +255,7 @@ declare const eventsDataSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
236
255
|
emitterCategory: number;
|
|
237
256
|
emergencyState: boolean;
|
|
238
257
|
emergencyStatusMessage: string;
|
|
258
|
+
callsign?: string | undefined;
|
|
239
259
|
groupId?: string | undefined;
|
|
240
260
|
}, {
|
|
241
261
|
icao: string;
|
|
@@ -260,6 +280,7 @@ declare const eventsDataSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
260
280
|
signalQuality: number;
|
|
261
281
|
emergencyState: boolean;
|
|
262
282
|
emergencyStatusMessage: string;
|
|
283
|
+
callsign?: string | undefined;
|
|
263
284
|
groupId?: string | undefined;
|
|
264
285
|
emitterCategorySet?: number | undefined;
|
|
265
286
|
emitterCategory?: number | undefined;
|
|
@@ -291,6 +312,7 @@ declare const eventsDataSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
291
312
|
emitterCategory: number;
|
|
292
313
|
emergencyState: boolean;
|
|
293
314
|
emergencyStatusMessage: string;
|
|
315
|
+
callsign?: string | undefined;
|
|
294
316
|
groupId?: string | undefined;
|
|
295
317
|
}[];
|
|
296
318
|
}, {
|
|
@@ -318,6 +340,7 @@ declare const eventsDataSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
318
340
|
signalQuality: number;
|
|
319
341
|
emergencyState: boolean;
|
|
320
342
|
emergencyStatusMessage: string;
|
|
343
|
+
callsign?: string | undefined;
|
|
321
344
|
groupId?: string | undefined;
|
|
322
345
|
emitterCategorySet?: number | undefined;
|
|
323
346
|
emitterCategory?: number | undefined;
|
|
@@ -1344,6 +1367,7 @@ export declare const ptrEventsSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
1344
1367
|
list: z.ZodArray<z.ZodObject<{
|
|
1345
1368
|
targetId: z.ZodString;
|
|
1346
1369
|
icao: z.ZodString;
|
|
1370
|
+
callsign: z.ZodOptional<z.ZodString>;
|
|
1347
1371
|
domain: z.ZodEnum<["adsb", "remoteId"]>;
|
|
1348
1372
|
categoryId: z.ZodString;
|
|
1349
1373
|
groupId: z.ZodOptional<z.ZodString>;
|
|
@@ -1392,6 +1416,7 @@ export declare const ptrEventsSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
1392
1416
|
emitterCategory: number;
|
|
1393
1417
|
emergencyState: boolean;
|
|
1394
1418
|
emergencyStatusMessage: string;
|
|
1419
|
+
callsign?: string | undefined;
|
|
1395
1420
|
groupId?: string | undefined;
|
|
1396
1421
|
}, {
|
|
1397
1422
|
icao: string;
|
|
@@ -1416,6 +1441,7 @@ export declare const ptrEventsSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
1416
1441
|
signalQuality: number;
|
|
1417
1442
|
emergencyState: boolean;
|
|
1418
1443
|
emergencyStatusMessage: string;
|
|
1444
|
+
callsign?: string | undefined;
|
|
1419
1445
|
groupId?: string | undefined;
|
|
1420
1446
|
emitterCategorySet?: number | undefined;
|
|
1421
1447
|
emitterCategory?: number | undefined;
|
|
@@ -1447,6 +1473,7 @@ export declare const ptrEventsSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
1447
1473
|
emitterCategory: number;
|
|
1448
1474
|
emergencyState: boolean;
|
|
1449
1475
|
emergencyStatusMessage: string;
|
|
1476
|
+
callsign?: string | undefined;
|
|
1450
1477
|
groupId?: string | undefined;
|
|
1451
1478
|
}[];
|
|
1452
1479
|
}, {
|
|
@@ -1474,6 +1501,7 @@ export declare const ptrEventsSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
1474
1501
|
signalQuality: number;
|
|
1475
1502
|
emergencyState: boolean;
|
|
1476
1503
|
emergencyStatusMessage: string;
|
|
1504
|
+
callsign?: string | undefined;
|
|
1477
1505
|
groupId?: string | undefined;
|
|
1478
1506
|
emitterCategorySet?: number | undefined;
|
|
1479
1507
|
emitterCategory?: number | undefined;
|
|
@@ -2489,6 +2517,7 @@ export declare const ptrEventsSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
2489
2517
|
emitterCategory: number;
|
|
2490
2518
|
emergencyState: boolean;
|
|
2491
2519
|
emergencyStatusMessage: string;
|
|
2520
|
+
callsign?: string | undefined;
|
|
2492
2521
|
groupId?: string | undefined;
|
|
2493
2522
|
}[];
|
|
2494
2523
|
} | {
|
|
@@ -2750,6 +2779,7 @@ export declare const ptrEventsSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
2750
2779
|
signalQuality: number;
|
|
2751
2780
|
emergencyState: boolean;
|
|
2752
2781
|
emergencyStatusMessage: string;
|
|
2782
|
+
callsign?: string | undefined;
|
|
2753
2783
|
groupId?: string | undefined;
|
|
2754
2784
|
emitterCategorySet?: number | undefined;
|
|
2755
2785
|
emitterCategory?: number | undefined;
|
|
@@ -3024,6 +3054,7 @@ export declare const ptrEventsSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
3024
3054
|
list: z.ZodArray<z.ZodObject<{
|
|
3025
3055
|
targetId: z.ZodString;
|
|
3026
3056
|
icao: z.ZodString;
|
|
3057
|
+
callsign: z.ZodOptional<z.ZodString>;
|
|
3027
3058
|
domain: z.ZodEnum<["adsb", "remoteId"]>;
|
|
3028
3059
|
categoryId: z.ZodString;
|
|
3029
3060
|
groupId: z.ZodOptional<z.ZodString>;
|
|
@@ -3072,6 +3103,7 @@ export declare const ptrEventsSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
3072
3103
|
emitterCategory: number;
|
|
3073
3104
|
emergencyState: boolean;
|
|
3074
3105
|
emergencyStatusMessage: string;
|
|
3106
|
+
callsign?: string | undefined;
|
|
3075
3107
|
groupId?: string | undefined;
|
|
3076
3108
|
}, {
|
|
3077
3109
|
icao: string;
|
|
@@ -3096,6 +3128,7 @@ export declare const ptrEventsSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
3096
3128
|
signalQuality: number;
|
|
3097
3129
|
emergencyState: boolean;
|
|
3098
3130
|
emergencyStatusMessage: string;
|
|
3131
|
+
callsign?: string | undefined;
|
|
3099
3132
|
groupId?: string | undefined;
|
|
3100
3133
|
emitterCategorySet?: number | undefined;
|
|
3101
3134
|
emitterCategory?: number | undefined;
|
|
@@ -3127,6 +3160,7 @@ export declare const ptrEventsSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
3127
3160
|
emitterCategory: number;
|
|
3128
3161
|
emergencyState: boolean;
|
|
3129
3162
|
emergencyStatusMessage: string;
|
|
3163
|
+
callsign?: string | undefined;
|
|
3130
3164
|
groupId?: string | undefined;
|
|
3131
3165
|
}[];
|
|
3132
3166
|
}, {
|
|
@@ -3154,6 +3188,7 @@ export declare const ptrEventsSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
3154
3188
|
signalQuality: number;
|
|
3155
3189
|
emergencyState: boolean;
|
|
3156
3190
|
emergencyStatusMessage: string;
|
|
3191
|
+
callsign?: string | undefined;
|
|
3157
3192
|
groupId?: string | undefined;
|
|
3158
3193
|
emitterCategorySet?: number | undefined;
|
|
3159
3194
|
emitterCategory?: number | undefined;
|
|
@@ -4134,4 +4169,5 @@ export type TUserActionDataOfCgi<T extends EUserActions> = Extract<TWsUserAction
|
|
|
4134
4169
|
export type TWsApiFlightData = z.infer<typeof wsApiFlightDataSchema>;
|
|
4135
4170
|
export type TWsApiCameraData = z.infer<typeof wsCameraPositionDataSchema>;
|
|
4136
4171
|
export type TApiUser = z.infer<typeof apiUserSchema>;
|
|
4172
|
+
export type TApiUserInput = z.infer<typeof apiUserInputSchema>;
|
|
4137
4173
|
export {};
|
|
@@ -3,6 +3,6 @@ import { WsEvents } from '../internal/WsEvents';
|
|
|
3
3
|
import { TEventData, TApiUser } from '../types/ws/PlaneTrackerEvents';
|
|
4
4
|
export declare class PlaneTrackerEvents extends WsEvents<TEventData> {
|
|
5
5
|
private _apiUser;
|
|
6
|
-
constructor(ws: IWsClient,
|
|
6
|
+
constructor(ws: IWsClient, apiUser: Omit<TApiUser, 'ip'>);
|
|
7
7
|
private sendInitMsg;
|
|
8
8
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|