@tak-ps/node-cot
Version:
Lightweight JavaScript library for parsing and manipulating TAK messages
687 lines (577 loc) • 19.1 kB
text/typescript
import { Type } from '@sinclair/typebox';
export const EventAttributes = Type.Object({
version: Type.String({
description: 'The CoT message version - typically 2'
}),
uid: Type.String({
description: 'The Unique ID for the CoT - using the same UID will replace an existing CoT'
}),
type: Type.String({
description: 'The CoT type - for "things" on the ground will start with a- for digital things b- etc'
}),
how: Type.Optional(Type.String({
description: 'An optional hint as to how the CoT was generated'
})),
access: Type.Optional(Type.String()),
qos: Type.Optional(Type.String()),
opex: Type.Optional(Type.String()),
time: Type.String({
description: 'Time at which the CoT was generated'
}),
stale: Type.String({
description: 'Time at which the CoT is no longer current'
}),
start: Type.String({
description: 'Time at which the CoT starts'
}),
});
export const TogAttributes = Type.Object({
_attributes: Type.Optional(Type.Object({
enabled: Type.Optional(Type.String())
}))
})
export const LinkAttributes = Type.Object({
// Common to all Link Types
uid: Type.Optional(Type.String()),
relation: Type.Optional(Type.String()),
// Polgon/Linestring or Author
type: Type.Optional(Type.String()),
// Polygon/LineString
point: Type.Optional(Type.String()),
// Used in Routes
callsign: Type.Optional(Type.String()),
// URL Style Links
url: Type.Optional(Type.String()),
mime: Type.Optional(Type.String()),
remarks: Type.Optional(Type.String()),
// Author Details
production_time: Type.Optional(Type.String()),
parent_callsign: Type.Optional(Type.String())
})
export const RouteInfoNavCueTrigger = Type.Object({
_attributes: Type.Object({
mode: Type.String(),
value: Type.String()
}),
});
export const RouteInfoNavCue = Type.Object({
_attributes: Type.Object({
id: Type.String(),
voice: Type.String(),
text: Type.String(),
}),
trigger: RouteInfoNavCueTrigger
})
export const RouteInfo = Type.Object({
__navcues: Type.Object({
__navcue: Type.Union([Type.Array(RouteInfoNavCue), RouteInfoNavCue])
})
})
export const Emergency = Type.Object({
_attributes: Type.Object({
cancel: Type.Optional(Type.Boolean()),
type: Type.Optional(Type.String())
}),
_text: Type.String()
});
export const Link = Type.Object({
_attributes: LinkAttributes
})
// Ref: https://git.tak.gov/standards/takcot/-/blob/master/xsd/Route.xsd
export const LinkAttrRouteFil = Type.Enum({
Infil: 'Infil',
Exfil: 'Exfil'
});
export const LinkAttrRouteMethod = Type.Enum({
Driving: 'Driving',
Walking: 'Walking',
Flying: 'Flying',
Swimming: 'Swimming',
Watercraft: 'Watercraft'
});
export const LinkAttrRouteType = Type.Enum({
Primary: 'Primary',
Secondary: 'Secondary',
});
export const LinkAttrRouteOrder = Type.Enum({
Ascending: 'Ascending Check Points',
Descending: 'Descending Check Points',
});
export const LinkAttrAttributes = Type.Object({
planningmethod: Type.Optional(LinkAttrRouteFil),
color: Type.Optional(Type.Integer()),
method: LinkAttrRouteMethod,
prefix: Type.String(),
style: Type.Optional(Type.String()),
stroke: Type.Optional(Type.String()),
type: Type.Optional(Type.String()),
routetype: LinkAttrRouteType,
direction: Type.Optional(LinkAttrRouteFil),
order: LinkAttrRouteOrder
})
export const LinkAttr = Type.Object({
_attributes: LinkAttrAttributes
})
export const ProtocolSupportAttributes = Type.Object({
_attributes: Type.Optional(Type.Object({
version: Type.Optional(Type.String())
}))
});
export const ServerVersionAttributes = Type.Object({
_attributes: Type.Optional(Type.Object({
serverVersion: Type.Optional(Type.String())
}))
})
export const ColorAttributes = Type.Object({
_attributes: Type.Optional(Type.Object({
argb: Type.Optional(Type.Integer()),
// Have seen this used in range and bearing
value: Type.Optional(Type.Integer())
}))
})
export const GenericStringAttributes = Type.Object({
_attributes: Type.Optional(Type.Object({
value: Type.Optional(Type.String())
}))
})
export const GenericBooleanAttributes = Type.Object({
_attributes: Type.Optional(Type.Object({
value: Type.Optional(Type.Boolean())
}))
})
export const GenericIntegerAttributes = Type.Object({
_attributes: Type.Optional(Type.Object({
value: Type.Optional(Type.Integer())
}))
})
export const GenericNumberAttributes = Type.Object({
_attributes: Type.Optional(Type.Object({
value: Type.Optional(Type.Number())
}))
})
export const GenericOptionalText = Type.Object({
_text: Type.Optional(Type.String())
})
export const GenericText = Type.Object({
_text: Type.String()
})
export const TrackAttributes = Type.Object({
speed: Type.Optional(Type.String()),
course: Type.Optional(Type.String()),
slope: Type.Optional(Type.String()),
eCourse: Type.Optional(Type.String()),
eSpeed: Type.Optional(Type.String()),
eSlope: Type.Optional(Type.String())
});
export const Track = Type.Object({
_attributes: Type.Optional(TrackAttributes)
})
export const ShapePolyLineAttributes = Type.Object({
closed: Type.Optional(Type.Boolean()),
fillColor: Type.Optional(Type.String()),
color: Type.Optional(Type.String()),
})
export const VertexAttribute = Type.Object({
lat: Type.Number(),
lon: Type.Number(),
})
export const ShapePolyLine = Type.Object({
_attributes: Type.Optional(ShapePolyLineAttributes),
vertex: Type.Optional(Type.Union([
Type.Object({
_attributes: VertexAttribute
}),
Type.Array(Type.Object({
_attributes: VertexAttribute
}))
]))
})
export const ShapeEllipseAttributes = Type.Object({
major: Type.Number(),
minor: Type.Number(),
angle: Type.Number(),
})
export const ShapeEllipse = Type.Object({
_attributes: ShapeEllipseAttributes,
})
export const ShapeLink = Type.Object({
_attributes: Type.Object({
uid: Type.Optional(Type.String()),
type: Type.Optional(Type.String()),
relation: Type.Optional(Type.String()),
}),
Style: Type.Optional(Type.Object({
LineStyle: Type.Optional(Type.Object({
color: Type.Optional(Type.Object({
_text: Type.String()
})),
width: Type.Optional(Type.Object({
_text: Type.Number()
}))
})),
PolyStyle: Type.Optional(Type.Object({
color: Type.Optional(Type.Object({
_text: Type.String()
})),
width: Type.Optional(Type.Object({
_text: Type.Number()
}))
}))
}))
});
export const Shape = Type.Object({
polyline: Type.Optional(ShapePolyLine),
ellipse: Type.Optional(ShapeEllipse),
link: Type.Optional(Type.Union([Type.Array(ShapeLink), ShapeLink]))
})
export const MissionAttributes = Type.Object({
type: Type.Optional(Type.String()),
tool: Type.Optional(Type.String()),
name: Type.Optional(Type.String()),
guid: Type.Optional(Type.String()),
authorUid: Type.Optional(Type.String()),
});
export const MissionLayer = Type.Object({
name: Type.Optional(GenericText),
parentUid: Type.Optional(GenericText),
type: Type.Optional(GenericText),
uid: Type.Optional(GenericText),
})
export const MissionChangeDetails = Type.Object({
_attributes: Type.Object({
type: Type.String(),
callsign: Type.Optional(Type.String()),
color: Type.Optional(Type.String())
}),
location: Type.Optional(Type.Object({
_attributes: Type.Object({
lat: Type.String(),
lon: Type.String()
})
}))
})
export const MissionChange = Type.Object({
contentUid: GenericText,
creatorUid: GenericOptionalText,
isFederatedChange: GenericText,
missionName: GenericText,
timestamp: GenericText,
type: GenericText,
details: MissionChangeDetails
})
export const MissionChanges = Type.Object({
MissionChange: Type.Union([MissionChange, Type.Array(MissionChange)])
})
export const Mission = Type.Object({
_attributes: Type.Optional(MissionAttributes),
missionLayer: Type.Optional(MissionLayer),
MissionChanges: Type.Optional(MissionChanges),
})
export const SensorAttributes = Type.Object({
elevation: Type.Optional(Type.Number()),
vfov: Type.Optional(Type.Number()),
fov: Type.Optional(Type.Number()),
roll: Type.Optional(Type.Number()),
range: Type.Optional(Type.Number()),
azimuth: Type.Optional(Type.Number()),
north: Type.Optional(Type.Number()),
fovBlue: Type.Optional(Type.Number()),
fovAlpha: Type.Optional(Type.Number()),
fovGreen: Type.Optional(Type.Number()),
fovRed: Type.Optional(Type.Number()),
strokeWeight: Type.Optional(Type.Number()),
strokeColor: Type.Optional(Type.Number()),
rangeLines: Type.Optional(Type.Number()),
rangeLineStrokeWeight: Type.Optional(Type.Number()),
rangeLineStrokeColor: Type.Optional(Type.Number()),
displayMagneticReference: Type.Optional(Type.Number()),
hideFov: Type.Optional(Type.Boolean()),
type: Type.Optional(Type.String()),
version: Type.Optional(Type.String()),
model: Type.Optional(Type.String())
});
export const Sensor = Type.Object({
_attributes: SensorAttributes
})
export const VideoAttributes = Type.Object({
uid: Type.Optional(Type.String()),
sensor: Type.Optional(Type.String()),
spi: Type.Optional(Type.String()),
url: Type.Optional(Type.String())
});
export const VideoConnectionEntryAttributes = Type.Object({
uid: Type.String(),
address: Type.String(),
networkTimeout: Type.Optional(Type.Integer()),
path: Type.Optional(Type.String()),
protocol: Type.Optional(Type.String()),
bufferTime: Type.Optional(Type.Integer()),
port: Type.Optional(Type.Integer()),
roverPort: Type.Optional(Type.Integer()),
rtspReliable: Type.Optional(Type.Integer()),
ignoreEmbeddedKLV: Type.Optional(Type.Boolean()),
alias: Type.Optional(Type.String())
})
export const VideoConnectionEntry = Type.Object({
_attributes: VideoConnectionEntryAttributes
})
export const Video = Type.Object({
_attributes: Type.Optional(VideoAttributes),
ConnectionEntry: Type.Optional(VideoConnectionEntry)
})
export const GeofenceAttributes = Type.Object({
elevationMonitored: Type.Optional(Type.String()),
minElevation: Type.Optional(Type.String()),
maxElevation: Type.Optional(Type.String()),
monitor: Type.Optional(Type.String()),
trigger: Type.Optional(Type.String()),
tracking: Type.Optional(Type.String()),
boundingSphere: Type.Optional(Type.Number()),
});
export const Geofence = Type.Object({
_attributes: GeofenceAttributes
})
export const MilsymUnitModifier = Type.Object({
_attributes: Type.Object({
code: Type.String()
}),
_text: Type.Optional(Type.String())
});
export const MilsymAttributes = Type.Object({
id: Type.String(),
});
export const Milsym = Type.Object({
_attributes: MilsymAttributes,
unitmodifier: Type.Optional(Type.Union([MilsymUnitModifier, Type.Array(MilsymUnitModifier)]))
})
export const Chat = Type.Object({
_attributes: 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()
})
export const TakVersionAttributes = Type.Object({
device: Type.Optional(Type.String()),
platform: Type.Optional(Type.String()),
os: Type.Optional(Type.String()),
version: Type.Optional(Type.String())
})
export const TakVersion = Type.Object({
_attributes: TakVersionAttributes
})
export const FlowTags = Type.Any();
export const GroupAttributes = Type.Object({
name: Type.String(),
role: Type.String()
})
export const Group = Type.Object({
_attributes: Type.Optional(GroupAttributes)
})
export const ACKRequestAttributes = Type.Object({
uid: Type.String(),
ackrequested: Type.Boolean(),
tag: Type.String()
})
export const ACKRequest = Type.Object({
_attributes: ACKRequestAttributes
})
export const FileShareAttributes = Type.Object({
filename: Type.String(),
name: Type.String(),
senderCallsign: Type.String(),
senderUid: Type.String(),
senderUrl: Type.String(),
sha256: Type.String(),
sizeInBytes: Type.Integer()
})
export const FileShare = Type.Object({
_attributes: FileShareAttributes
})
export const StatusAttributes = Type.Object({
battery: Type.Optional(Type.String()),
readiness: Type.Optional(Type.String())
})
export const Status = Type.Object({
_attributes: StatusAttributes
})
export const Uid = Type.Object({
_attributes: Type.Object({
Droid: Type.String()
})
})
export const CreatorAttributes = Type.Object({
uid: Type.String(),
callsign: Type.String(),
time: Type.String(),
type: Type.String()
})
export const Creator = Type.Object({
_attributes: CreatorAttributes
})
export const ContactAttributes = Type.Object({
phone: Type.Optional(Type.String()),
name: Type.Optional(Type.String()),
callsign: Type.Optional(Type.String()),
endpoint: Type.Optional(Type.String())
})
export const Contact = Type.Object({
_attributes: ContactAttributes
})
export const MartiDestAttributes = Type.Object({
uid: Type.Optional(Type.String()),
callsign: Type.Optional(Type.String()),
group: Type.Optional(Type.String()),
mission: Type.Optional(Type.String()),
'mission-guid': Type.Optional(Type.String()),
after: Type.Optional(Type.String()),
path: Type.Optional(Type.String())
})
export const MartiDest = Type.Object({
_attributes: MartiDestAttributes
})
export const Marti = Type.Object({
_attributes: Type.Optional(Type.Object({})),
dest: Type.Optional(Type.Union([MartiDest, Type.Array(MartiDest)]))
});
export const AttachmentAttributes = Type.Object({
hashes: Type.String({
description: 'A JSON Stringified array of Content Hashes that exist on the TAK Server'
})
});
export const Attachment = Type.Object({
_attributes: AttachmentAttributes,
});
export const RangeAttributes = Type.Object({
value: Type.Number()
});
export const Range = Type.Object({
_attributes: RangeAttributes,
});
export const RangeUnitsAttributes = Type.Object({
value: Type.Integer()
});
export const RangeUnits = Type.Object({
_attributes: RangeUnitsAttributes,
});
export const BearingAttributes = Type.Object({
value: Type.Number()
});
export const Bearing = Type.Object({
_attributes: BearingAttributes,
});
export const BearingUnitsAttributes = Type.Object({
value: Type.Integer()
});
export const BearingUnits = Type.Object({
_attributes: BearingUnitsAttributes,
});
export const InclinationAttributes = Type.Object({
value: Type.Number()
});
export const Inclination = Type.Object({
_attributes: InclinationAttributes,
});
export const NorthRefAttributes = Type.Object({
value: Type.Number()
});
export const NorthRef = Type.Object({
_attributes: NorthRefAttributes,
});
export const Remarks = Type.Object({
_attributes: Type.Optional(Type.Object({
source: Type.Optional(Type.String()),
to: Type.Optional(Type.String()),
time: Type.Optional(Type.String())
})),
_text: Type.Optional(Type.String())
})
export const PrecisionLocationAttributes = Type.Object({
geopointsrc: Type.Optional(Type.String()),
altsrc: Type.Optional(Type.String())
})
export const PrecisionLocation = Type.Object({
_attributes: PrecisionLocationAttributes
})
export const UserIcon = Type.Object({
_attributes: Type.Object({
iconsetpath: Type.String()
})
})
export const ForceDelete = Type.Object({})
export const ShapeExtras = Type.Object({
_attributes: Type.Object({
cpvis: Type.Optional(Type.Boolean()),
editable: Type.Optional(Type.Boolean()),
})
});
export const Detail = Type.Object({
contact: Type.Optional(Contact),
tog: Type.Optional(TogAttributes),
'__group': Type.Optional(Group),
'__chat': Type.Optional(Chat),
'__video': Type.Optional(Video),
'__geofence': Type.Optional(Geofence),
'__milsym': Type.Optional(Milsym),
'__routeinfo': Type.Optional(RouteInfo),
'__forcedelete': Type.Optional(ForceDelete),
'__shapeExtras': Type.Optional(ShapeExtras),
'_flow-tags_': Type.Optional(FlowTags),
uid: Type.Optional(Uid),
emergency: Type.Optional(Emergency),
status: Type.Optional(Status),
creator: Type.Optional(Creator),
fileshare: Type.Optional(FileShare),
ackrequest: Type.Optional(ACKRequest),
remarks: Type.Optional(Remarks),
precisionlocation: Type.Optional(PrecisionLocation),
color: Type.Optional(Type.Union([Type.Array(ColorAttributes), ColorAttributes])),
strokeColor: Type.Optional(GenericIntegerAttributes),
archive: Type.Optional(Type.Union([GenericStringAttributes, Type.Array(GenericStringAttributes)])),
strokeWeight: Type.Optional(GenericNumberAttributes),
strokeStyle: Type.Optional(GenericStringAttributes),
labels_on: Type.Optional(GenericBooleanAttributes),
fillColor: Type.Optional(GenericIntegerAttributes),
mission: Type.Optional(Mission),
shape: Type.Optional(Shape),
link: Type.Optional(Type.Union([Link, Type.Array(Link)])),
link_attr: Type.Optional(LinkAttr),
usericon: Type.Optional(UserIcon),
track: Type.Optional(Track),
sensor: Type.Optional(Sensor),
takv: Type.Optional(TakVersion),
marti: Type.Optional(Marti),
attachment_list: Type.Optional(Attachment),
// Range & Bearing
range: Type.Optional(Range),
rangeUnits: Type.Optional(RangeUnits),
bearing: Type.Optional(Bearing),
bearingUnits: Type.Optional(BearingUnits),
inclination: Type.Optional(Inclination),
northRef: Type.Optional(NorthRef),
TakControl: Type.Optional(Type.Object({
TakProtocolSupport: Type.Optional(ProtocolSupportAttributes),
TakServerVersionInfo: Type.Optional(ServerVersionAttributes)
}))
})
export const Point = Type.Object({
_attributes: Type.Object({
lat: Type.Number(),
lon: Type.Number(),
hae: Type.Number(),
// Are Occasionally seen as "NaN"
ce: Type.Union([Type.Number(), Type.String()]),
le: Type.Union([Type.Number(), Type.String()])
})
})
export default Type.Object({
event: Type.Object({
_attributes: EventAttributes,
detail: Type.Optional(Detail),
point: Point,
}),
})