UNPKG

@tak-ps/node-tak

Version:

Lightweight JavaScript library for communicating with TAK Server

78 lines (58 loc) 2.52 kB
import Err from '@openaddresses/batch-error'; import xmljs from 'xml-js'; import { Type, Static } from '@sinclair/typebox'; import CoT, { CoTParser } from '@tak-ps/node-cot'; import type { Feature } from '@tak-ps/node-cot'; import Commands from '../commands.js'; export const HistoryOptions = Type.Object({ start: Type.Optional(Type.String()), end: Type.Optional(Type.String()), secago: Type.Optional(Type.String()), }) export default class QueryCommands extends Commands { schema = {} async cli(): Promise<object | string> { throw new Error('Unsupported Subcommand'); } async singleFeat(uid: string): Promise<Static<typeof Feature.Feature>> { const cotstr = await this.single(uid); return CoTParser.to_geojson(CoTParser.from_xml(cotstr)) } async single(uid: string): Promise<string> { const url = new URL(`/Marti/api/cot/xml/${encodeURIComponent(uid)}`, this.api.url); const res = await this.api.fetch(url, { method: 'GET' }, true); const body = await res.text(); if (body.trim().length === 0) { throw new Err(404, null, 'CoT by that UID Not Found'); } return body; } async historyFeats(uid: string, opts?: Static<typeof HistoryOptions>): Promise<Array<Static<typeof Feature.Feature>>> { const feats: Static<typeof Feature.Feature>[] = []; const res: any = xmljs.xml2js(await this.history(uid, opts), { compact: true }); if (!Object.keys(res).length || !Object.keys(res.events).length) return feats; if (!res.events.event || (Array.isArray(res.events.event) && !res.events.event.length)) return feats; for (const event of Array.isArray(res.events.event) ? res.events.event : [res.events.event] ) { feats.push(await CoTParser.to_geojson(new CoT({ event }))); } return feats; } async history(uid: string, opts?: Static<typeof HistoryOptions>): Promise<string> { const url = new URL(`/Marti/api/cot/xml/${encodeURIComponent(uid)}/all`, this.api.url); if (opts) { let q: keyof Static<typeof HistoryOptions>; for (q in opts) { if (opts[q] !== undefined) { url.searchParams.append(q, String(opts[q])); } } } const res = await this.api.fetch(url, { method: 'GET' }, true); const body = await res.text(); return body; } }