UNPKG

@tak-ps/node-cot

Version:

Lightweight JavaScript library for parsing and manipulating TAK messages

185 lines (168 loc) 5.84 kB
import { Type } from '@sinclair/typebox'; import { GroupAttributes, CreatorAttributes, ACKRequestAttributes, ShapeEllipseAttributes, GeofenceAttributes, StatusAttributes, ContactAttributes, PrecisionLocationAttributes, VideoConnectionEntryAttributes, MartiDestAttributes, TakVersionAttributes, FileShareAttributes, TrackAttributes, LinkAttributes, SensorAttributes, VideoAttributes } from './types.js'; export const Position = Type.Array(Type.Number(), { minItems: 2, maxItems: 3 }) export const MilSym = Type.Object({ id: Type.String() }) export const FeaturePropertyMissionLayer = Type.Object({ name: Type.Optional(Type.String()), parentUid: Type.Optional(Type.String()), type: Type.Optional(Type.String()), uid: Type.Optional(Type.String()), }) export const FeaturePropertyMissionChange = Type.Object({ contentUid: Type.String(), creatorUid: Type.String(), isFederatedChange: Type.String(), missionName: Type.String(), timestamp: Type.String(), type: Type.String(), details: Type.Object({ type: Type.String(), callsign: Type.String(), color: Type.String(), lat: Type.String(), lon: Type.String() }) }) export const FeaturePropertyMission = Type.Object({ type: Type.Optional(Type.String()), tool: Type.Optional(Type.String()), guid: Type.Optional(Type.String()), name: Type.Optional(Type.String()), authorUid: Type.Optional(Type.String()), missionLayer: Type.Optional(FeaturePropertyMissionLayer), missionChanges: Type.Optional(Type.Array(FeaturePropertyMissionChange)) }); export const Properties = Type.Object({ callsign: Type.String({ default: 'UNKNOWN' }), type: Type.String({ default: 'a-f-G' }), how: Type.String(), time: Type.String(), start: Type.String(), stale: Type.String(), center: Position, range: Type.Optional(Type.Number()), bearing: Type.Optional(Type.Number()), creator: Type.Optional(CreatorAttributes), course: Type.Optional(Type.Number()), slope: Type.Optional(Type.Number()), speed: Type.Optional(Type.Number()), labels: Type.Optional(Type.Boolean()), 'marker-color': Type.Optional(Type.String()), 'marker-opacity': Type.Optional(Type.Number({ minimum: 0, maximum: 1 })), 'stroke': Type.Optional(Type.String()), 'stroke-opacity': Type.Optional(Type.Number({ minimum: 0, maximum: 1 })), 'stroke-width': Type.Optional(Type.Number()), 'stroke-style': Type.Optional(Type.String()), 'fill': Type.Optional(Type.String()), 'fill-opacity': Type.Optional(Type.Number({ minimum: 0, maximum: 1 })), metadata: Type.Optional(Type.Record(Type.String(), Type.Unknown())), archived: Type.Optional(Type.Boolean()), geofence: Type.Optional(GeofenceAttributes), contact: Type.Optional(ContactAttributes), shape: Type.Optional(Type.Object({ ellipse: Type.Optional(ShapeEllipseAttributes) })), remarks: Type.Optional(Type.String()), milsym: Type.Optional(MilSym), mission: Type.Optional(FeaturePropertyMission), fileshare: Type.Optional(FileShareAttributes), ackrequest: Type.Optional(ACKRequestAttributes), attachments: Type.Optional(Type.Array(Type.String())), sensor: Type.Optional(SensorAttributes), video: Type.Optional(Type.Composite([ VideoAttributes, Type.Optional(Type.Object({ connection: Type.Optional(VideoConnectionEntryAttributes) })) ])), links: Type.Optional(Type.Array(LinkAttributes)), chat: Type.Optional(Type.Object({ parent: Type.Optional(Type.String()), groupOwner: Type.Optional(Type.String()), messageId: Type.Optional(Type.String()), chatroom: Type.String(), id: Type.String(), senderCallsign: Type.String(), chatgrp: Type.Any() })), track: Type.Optional(TrackAttributes), dest: Type.Optional(Type.Union([MartiDestAttributes, Type.Array(MartiDestAttributes)])), icon: Type.Optional(Type.String()), droid: Type.Optional(Type.String()), takv: Type.Optional(TakVersionAttributes), group: Type.Optional(GroupAttributes), status: Type.Optional(StatusAttributes), precisionlocation: Type.Optional(PrecisionLocationAttributes), flow: Type.Optional(Type.Record(Type.String(), Type.String())), }) export const Point = Type.Object({ type: Type.Literal('Point'), coordinates: Position }) export const MultiPoint = Type.Object({ type: Type.Literal('MultiPoint'), coordinates: Type.Array(Position) }) export const LineString = Type.Object({ type: Type.Literal('LineString'), coordinates: Type.Array(Position) }) export const MultiLineString = Type.Object({ type: Type.Literal('MultiLineString'), coordinates: Type.Array(Type.Array(Position)) }) export const Polygon = Type.Object({ type: Type.Literal('Polygon'), coordinates: Type.Array(Type.Array(Position)) }) export const MultiPolygon = Type.Object({ type: Type.Literal('MultiPolygon'), coordinates: Type.Array(Type.Array(Type.Array(Position))) }) export const Geometry = Type.Union([ Point, LineString, Polygon ]); export const Feature = Type.Object({ id: Type.String(), type: Type.Literal('Feature'), properties: Properties, path: Type.Optional(Type.String()), geometry: Geometry }) export const InputProperties = Type.Partial(Type.Composite([ Type.Omit(Properties, ['stale']), Type.Object({ stale: Type.Union([Type.Integer(), Type.String()]) }) ])) export const InputFeature = Type.Object({ id: Type.Optional(Type.String()), type: Type.Literal('Feature'), path: Type.Optional(Type.String()), properties: InputProperties, geometry: Geometry })