@tak-ps/node-tak
Version:
Lightweight JavaScript library for communicating with TAK Server
86 lines (75 loc) • 2.4 kB
text/typescript
import { Type, Static } from '@sinclair/typebox';
import type { ParsedArgs } from 'minimist'
import Commands, { CommandOutputFormat } from '../commands.js';
export const Package = Type.Object({
EXPIRATION: Type.String(),
UID: Type.String(),
SubmissionDateTime: Type.String(),
Keywords: Type.Array(Type.String()),
MIMEType: Type.String(),
Size: Type.String(),
SubmissionUser: Type.String(),
PrimaryKey: Type.String(),
Hash: Type.String(),
CreatorUid: Type.Optional(Type.Union([Type.Null(), Type.String()])),
Name: Type.String(),
Tool: Type.String()
});
export const ListInput = Type.Object({
tool: Type.Optional(Type.String()),
uid: Type.Optional(Type.String())
});
/**
* @class
*/
export default class PackageCommands extends Commands {
schema = {
list: {
description: 'List Data Packages',
params: Type.Object({}),
query: Type.Object({}),
formats: [ CommandOutputFormat.JSON ]
}
}
async cli(args: ParsedArgs): Promise<object | string> {
if (args._[3] === 'list') {
const list = await this.list({});
if (args.format === 'json') {
return list;
} else {
return list.results.map((data) => {
return data.Name;
}).join('\n');
}
} else {
throw new Error('Unsupported Subcommand');
}
}
async list(query: Static<typeof ListInput>): Promise<{
resultCount: number;
results: Array<Static<typeof Package>>
}> {
const url = new URL(`/Marti/sync/search`, this.api.url);
let q: keyof Static<typeof ListInput>;
for (q in query) {
if (query[q] !== undefined) {
url.searchParams.append(q, String(query[q]));
}
}
const res = await this.api.fetch(url, {
method: 'GET'
});
if (typeof res === 'string') {
// The TAK Server API doesn't return application/json
return JSON.parse(res) as {
resultCount: number;
results: Array<Static<typeof Package>>
};
} else {
return res as {
resultCount: number;
results: Array<Static<typeof Package>>
};
}
}
}