@tak-ps/node-cot 4.6.0 → 5.0.0

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/lib/types.ts ADDED
@@ -0,0 +1,157 @@
1
+ export interface EventAttributes {
2
+ version: string,
3
+ uid: string;
4
+ type: string;
5
+ how: string;
6
+ [k: string]: string;
7
+ }
8
+
9
+ export interface GenericAttributes {
10
+ _attributes: {
11
+ [k: string]: string;
12
+ }
13
+ }
14
+
15
+ export interface Track {
16
+ _attributes: TrackAttributes;
17
+ }
18
+
19
+ export interface Chat {
20
+ _attributes: {
21
+ parent: string;
22
+ groupOwner: string;
23
+ messageId: string;
24
+ chatroom: string;
25
+ id: string;
26
+ senderCallsign: string;
27
+ [k: string]: string;
28
+ }
29
+
30
+ chatgrp: GenericAttributes
31
+ }
32
+
33
+ export interface TrackAttributes {
34
+ speed?: string,
35
+ course?: string,
36
+ slope?: string;
37
+ eCourse?: string;
38
+ eSpeed?: string;
39
+ eSlope?: string
40
+ [k: string]: string | undefined
41
+ }
42
+
43
+ export interface TakVersion {
44
+ _attributes: {
45
+ device?: string;
46
+ platform?: string;
47
+ os?: string;
48
+ version?: string;
49
+ [k: string]: string | undefined
50
+ }
51
+ }
52
+
53
+ export interface FlowTags {
54
+ [k: string]: string;
55
+ }
56
+
57
+ export interface Group {
58
+ _attributes: {
59
+ name: string;
60
+ role: string;
61
+ [k: string]: string;
62
+ }
63
+ }
64
+
65
+ export interface Status {
66
+ _attributes: {
67
+ battery: string;
68
+ [k: string]: string;
69
+ }
70
+ }
71
+
72
+ export interface Uid {
73
+ _attributes: {
74
+ Droid: string;
75
+ [k: string]: string;
76
+ }
77
+ }
78
+
79
+ export interface Contact {
80
+ _attributes: {
81
+ phone?: string;
82
+ callsign: string;
83
+ endpoint?: string;
84
+ [k: string]: string | undefined;
85
+ }
86
+ }
87
+
88
+ export interface Remarks {
89
+ _attributes: {
90
+ source?: string;
91
+ to?: string;
92
+ time?: string;
93
+ [k: string]: string | undefined;
94
+ }
95
+ _text: string;
96
+ }
97
+
98
+ export interface PrecisionLocation {
99
+ _attributes: {
100
+ geopointsrc?: string;
101
+ altsrc?: string;
102
+ [k: string]: string | undefined;
103
+ }
104
+ }
105
+
106
+ export interface UserIcon {
107
+ _attributes: {
108
+ iconsetpath: string;
109
+ [k: string]: string;
110
+ }
111
+ }
112
+
113
+ export interface Detail {
114
+ contact?: Contact;
115
+ tog?: GenericAttributes;
116
+ '__group'?: Group;
117
+ '__chat'?: Chat;
118
+ '_flow-tags_'?: FlowTags;
119
+ uid?: Uid;
120
+ status?: Status;
121
+ remarks?: Remarks;
122
+ precisionlocation?: PrecisionLocation;
123
+ strokeColor?: GenericAttributes;
124
+ strokeWeight?: GenericAttributes;
125
+ strokeStyle?: GenericAttributes;
126
+ labels_on?: GenericAttributes;
127
+ fillColor?: GenericAttributes;
128
+ link?: GenericAttributes | GenericAttributes[];
129
+ usericon?: UserIcon;
130
+ track?: Track;
131
+ takv?: TakVersion;
132
+ TakControl?: {
133
+ TakServerVersionInfo?: GenericAttributes
134
+ };
135
+ [k: string]: unknown;
136
+ }
137
+
138
+ export interface Point {
139
+ _attributes: {
140
+ lat: string | number;
141
+ lon: string | number;
142
+ hae: string | number;
143
+ ce: string | number;
144
+ le: string | number;
145
+ [k: string]: string | number
146
+ }
147
+ }
148
+
149
+ export default interface JSONCoT {
150
+ event: {
151
+ _attributes: EventAttributes,
152
+ detail: Detail,
153
+ point: Point,
154
+ [k: string]: unknown
155
+ },
156
+ [k: string]: unknown
157
+ }
package/lib/util.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import { randomUUID } from 'crypto'
2
2
  import type {
3
- Attributes,
3
+ EventAttributes,
4
4
  TrackAttributes,
5
5
  Detail,
6
6
  Point
7
- } from './cot.js';
7
+ } from './types.js';
8
8
 
9
9
  /**
10
10
  * Helper functions for generating CoT data
@@ -26,7 +26,7 @@ export default class Util {
26
26
  time?: Date | string | null,
27
27
  start?: Date | string | null,
28
28
  stale?: Date | string | number | null
29
- ): Attributes {
29
+ ): EventAttributes {
30
30
  if (!type) throw new Error('type param required');
31
31
  if (!how) throw new Error('how param required');
32
32
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tak-ps/node-cot",
3
3
  "type": "module",
4
- "version": "4.6.0",
4
+ "version": "5.0.0",
5
5
  "description": "Lightweight JavaScript library for parsing and manipulating TAK messages",
6
6
  "author": "Nick Ingalls <nick@ingalls.ca>",
7
7
  "main": "dist/index.js",
@@ -10,7 +10,7 @@
10
10
  "test": "ts-node-test test/",
11
11
  "lint": "eslint *.ts lib/*.ts",
12
12
  "doc": "typedoc index.ts",
13
- "build": "tsc --build",
13
+ "build": "typescript-json-schema --required --out ./lib/schema.json ./lib/types.ts JSONCoT && tsc --build",
14
14
  "pretest": "npm run lint"
15
15
  },
16
16
  "dependencies": {
@@ -34,7 +34,8 @@
34
34
  "ts-node": "^10.9.1",
35
35
  "ts-node-test": "^0.4.0",
36
36
  "typedoc": "^0.25.0",
37
- "typescript": "^5.0.0"
37
+ "typescript": "^5.0.0",
38
+ "typescript-json-schema": "^0.62.0"
38
39
  },
39
40
  "repository": {
40
41
  "type": "git",
@@ -0,0 +1,94 @@
1
+ import test from 'tape';
2
+ import { DirectChat } from '../index.js';
3
+
4
+ test('DirectChat - Basic', (t) => {
5
+ const cot = new DirectChat({
6
+ to: {
7
+ uid: '123456',
8
+ callsign: 'Alpha Operator'
9
+ },
10
+ from: {
11
+ uid: '654321',
12
+ callsign: 'Bravo Operator'
13
+ },
14
+ message: 'Direct Message Test'
15
+ });
16
+
17
+ t.equals(cot.is_chat(), true);
18
+
19
+ t.ok(cot.raw.event._attributes.uid);
20
+ cot.raw.event._attributes.uid = '123';
21
+
22
+ t.ok(cot.raw.event.detail['_flow-tags_']);
23
+ delete cot.raw.event.detail['_flow-tags_'];
24
+
25
+ for (const i of ['time', 'start', 'stale']) {
26
+ t.equals(typeof cot.raw.event._attributes[i], 'string');
27
+ delete cot.raw.event._attributes[i];
28
+ }
29
+
30
+ if (!cot.raw.event.detail.__chat) {
31
+ t.fail()
32
+ } else {
33
+ t.equals(typeof cot.raw.event.detail.__chat._attributes.messageId, 'string');
34
+ cot.raw.event.detail.__chat._attributes.messageId = '123';
35
+ }
36
+
37
+ if (!cot.raw.event.detail.remarks) {
38
+ t.fail()
39
+ } else {
40
+ t.equals(typeof cot.raw.event.detail.remarks._attributes.time, 'string');
41
+ cot.raw.event.detail.remarks._attributes.time = '123';
42
+ }
43
+
44
+ console.error(JSON.stringify(cot.raw));
45
+ t.deepEquals(cot.raw, {
46
+ event: {
47
+ _attributes: {
48
+ uid: '123',
49
+ version: '2.0',
50
+ type: 'b-t-f',
51
+ how: 'h-g-i-g-o',
52
+ },
53
+ point: {
54
+ _attributes: { lat: '0.000000', lon: '0.000000', hae: '0.0', ce: '9999999.0', le: '9999999.0' }
55
+ },
56
+ detail: {
57
+ __chat: {
58
+ _attributes: {
59
+ parent: 'RootContactGroup',
60
+ groupOwner: 'false',
61
+ messageId: '123',
62
+ chatroom: 'Alpha Operator',
63
+ id: '123456',
64
+ senderCallsign: 'Bravo Operator'
65
+ },
66
+ chatgrp: {
67
+ _attributes: {
68
+ uid0: "654321",
69
+ uid1:"123456",
70
+ id:"123456"
71
+ }
72
+ }
73
+ },
74
+ link: {
75
+ _attributes: {
76
+ uid: '654321',
77
+ type: 'a-f-G',
78
+ relation: 'p-p'
79
+ }
80
+ },
81
+ remarks: {
82
+ _attributes: {
83
+ source: '654321',
84
+ to: '123456',
85
+ time: '123'
86
+ },
87
+ _text: 'Direct Message Test'
88
+ }
89
+ }
90
+ }
91
+ });
92
+
93
+ t.end();
94
+ });
@@ -4,7 +4,12 @@ import CoT from '../index.js';
4
4
  test('Decode iTAK COT message', (t) => {
5
5
  const packet = '<event version="2.0" uid="C94B9215-9BD4-4DBE-BDE1-83625F09153F" type="a-f-G-E-V-C" time="2023-07-18T15:23:09.00Z" start="2023-07-18T15:23:09.00Z" stale="2023-07-18T15:25:09.00Z" how="m-g"><point lat="41.52309645" lon="-107.72376567" hae="1681.23725821" ce="9999999" le="9999999" /><detail><contact callsign="DFPC-iSchmidt" phone="7204258729" endpoint="*:-1:stcp" /><uid Droid="DFPC-iSchmidt" /><__group name="Yellow" role="Team Member" /><precisionlocation geopointsrc="GPS" altsrc="???" /><status battery="100" /><takv device="iPhone" platform="iTAK" os="16.5.1" version="2.7.0.609" /><track speed="0.00000000" course="137.23542786" /></detail></event>';
6
6
 
7
- t.deepEquals((new CoT(packet)).raw, {
7
+ const cot = new CoT(packet);
8
+
9
+ t.ok(cot.raw.event.detail['_flow-tags_']);
10
+ delete cot.raw.event.detail['_flow-tags_'];
11
+
12
+ t.deepEquals(cot.raw, {
8
13
  'event': {
9
14
  '_attributes': {
10
15
  'version': '2.0',
@@ -42,7 +47,7 @@ test('Decode iTAK COT message', (t) => {
42
47
  }
43
48
  });
44
49
 
45
- t.deepEquals((new CoT(packet)).to_geojson(), {
50
+ t.deepEquals(cot.to_geojson(), {
46
51
  id: 'C94B9215-9BD4-4DBE-BDE1-83625F09153F',
47
52
  type: 'Feature',
48
53
  properties: {
@@ -0,0 +1,21 @@
1
+ import test from 'tape';
2
+ import { DirectChat } from '../index.js';
3
+ import fs from 'node:fs';
4
+
5
+ test('FlowTags - Basic', (t) => {
6
+ const pkg = JSON.parse(String(fs.readFileSync(new URL('../package.json', import.meta.url))));
7
+
8
+ const cot = new DirectChat({
9
+ to: { uid: '123456', callsign: 'Alpha Operator' },
10
+ from: { uid: '654321', callsign: 'Bravo Operator' },
11
+ message: 'Direct Message Test'
12
+ });
13
+
14
+ if (!cot.raw.event.detail['_flow-tags_']) {
15
+ t.fail();
16
+ } else {
17
+ t.equals(typeof cot.raw.event.detail['_flow-tags_'][`NodeCoT-${pkg.version}`], 'string');
18
+ }
19
+
20
+ t.end();
21
+ });
@@ -23,6 +23,9 @@ test('CoT.from_geojson - Point', (t) => {
23
23
  _attributes: { lat: '2.2', lon: '1.1', hae: '0.0', ce: '9999999.0', le: '9999999.0' }
24
24
  });
25
25
 
26
+ t.ok(geo.raw.event.detail['_flow-tags_']);
27
+ delete geo.raw.event.detail['_flow-tags_'];
28
+
26
29
  t.deepEquals(geo.raw.event.detail, {
27
30
  contact: { _attributes: { callsign: 'UNKNOWN' } },
28
31
  remarks: { _attributes: {}, _text: '' }
@@ -59,6 +62,9 @@ test('CoT.from_geojson - Polygon', (t) => {
59
62
  _attributes: { lat: '39.065', lon: '-108.54599999999999', hae: '0.0', ce: '9999999.0', le: '9999999.0' }
60
63
  });
61
64
 
65
+ t.ok(geo.raw.event.detail['_flow-tags_']);
66
+ delete geo.raw.event.detail['_flow-tags_'];
67
+
62
68
  t.deepEquals(geo.raw.event.detail, {
63
69
  contact: { _attributes: { callsign: 'UNKNOWN' } },
64
70
  link: [
@@ -108,6 +114,9 @@ test('CoT.from_geojson - LineString', (t) => {
108
114
  _attributes: { lat: '39.098', lon: '-108.505', hae: '0.0', ce: '9999999.0', le: '9999999.0' }
109
115
  });
110
116
 
117
+ t.ok(geo.raw.event.detail['_flow-tags_']);
118
+ delete geo.raw.event.detail['_flow-tags_'];
119
+
111
120
  t.deepEquals(geo.raw.event.detail, {
112
121
  contact: { _attributes: { callsign: 'UNKNOWN' } },
113
122
  link: [
@@ -197,6 +206,9 @@ test('CoT.from_geojson - Icon', (t) => {
197
206
  }
198
207
  });
199
208
 
209
+ t.ok(geo.raw.event.detail['_flow-tags_']);
210
+ delete geo.raw.event.detail['_flow-tags_'];
211
+
200
212
  t.deepEquals(geo.raw.event.detail, {
201
213
  contact: { _attributes: { callsign: 'UNKNOWN' } },
202
214
  usericon: { _attributes: { iconsetpath: '66f14976-4b62-4023-8edb-d8d2ebeaa336/Public Safety Air/EMS_ROTOR.png' } }, remarks: { _attributes: {}, _text: '' }
@@ -1,232 +0,0 @@
1
- import test from 'tape';
2
- import CoT from '../index.js';
3
- test('Decode COT message', (t) => {
4
- const packet = '<event version="2.0" uid="ANDROID-deadbeef" type="a-f-G-U-C" how="m-g" time="2021-02-27T20:32:24.771Z" start="2021-02-27T20:32:24.771Z" stale="2021-02-27T20:38:39.771Z"><point lat="1.234567" lon="-3.141592" hae="-25.7" ce="9.9" le="9999999.0"/><detail><takv os="29" version="4.0.0.0 (deadbeef).1234567890-CIV" device="Some Android Device" platform="ATAK-CIV"/><contact xmppUsername="xmpp@host.com" endpoint="*:-1:stcp" callsign="JENNY"/><uid Droid="JENNY"/><precisionlocation altsrc="GPS" geopointsrc="GPS"/><__group role="Team Member" name="Cyan"/><status battery="78"/><track course="80.24833892285461" speed="0.0"/></detail></event>';
5
- t.deepEquals((new CoT(packet)).raw, {
6
- 'event': {
7
- '_attributes': {
8
- 'version': '2.0',
9
- 'uid': 'ANDROID-deadbeef',
10
- 'type': 'a-f-G-U-C',
11
- 'how': 'm-g',
12
- 'time': '2021-02-27T20:32:24.771Z',
13
- 'start': '2021-02-27T20:32:24.771Z',
14
- 'stale': '2021-02-27T20:38:39.771Z'
15
- },
16
- 'point': {
17
- '_attributes': {
18
- 'lat': '1.234567',
19
- 'lon': '-3.141592',
20
- 'hae': '-25.7',
21
- 'ce': '9.9',
22
- 'le': '9999999.0'
23
- }
24
- },
25
- 'detail': {
26
- 'takv': {
27
- '_attributes': {
28
- 'os': '29',
29
- 'version': '4.0.0.0 (deadbeef).1234567890-CIV',
30
- 'device': 'Some Android Device',
31
- 'platform': 'ATAK-CIV'
32
- }
33
- },
34
- 'contact': {
35
- '_attributes': {
36
- 'xmppUsername': 'xmpp@host.com',
37
- 'endpoint': '*:-1:stcp',
38
- 'callsign': 'JENNY'
39
- }
40
- },
41
- 'uid': { '_attributes': { 'Droid': 'JENNY' } },
42
- 'precisionlocation': { '_attributes': { 'altsrc': 'GPS', 'geopointsrc': 'GPS' } },
43
- '__group': { '_attributes': { 'role': 'Team Member', 'name': 'Cyan' } },
44
- 'status': { '_attributes': { 'battery': '78' } },
45
- 'track': { '_attributes': { 'course': '80.24833892285461', 'speed': '0.0' } }
46
- }
47
- }
48
- });
49
- t.end();
50
- });
51
- test('Decode COT message', (t) => {
52
- const packet = '<event version="2.0" uid="TEST-deadbeef" type="a" how="m-g" time="2021-03-12T15:49:07.138Z" start="2021-03-12T15:49:07.138Z" stale="2021-03-12T15:49:07.138Z"><point lat="0.000000" lon="0.000000" hae="0.0" ce="9999999.0" le="9999999.0"/><detail><takv os="Android" version="10" device="Some Device" platform="python unittest"/><status battery="83"/><uid Droid="JENNY"/><contact callsign="JENNY" endpoint="*:-1:stcp" phone="800-867-5309"/><__group role="Team Member" name="Cyan"/><track course="90.1" speed="10.3"/></detail></event>';
53
- t.deepEquals((new CoT(packet)).raw, {
54
- 'event': {
55
- '_attributes': {
56
- 'version': '2.0',
57
- 'uid': 'TEST-deadbeef',
58
- 'type': 'a',
59
- 'how': 'm-g',
60
- 'time': '2021-03-12T15:49:07.138Z',
61
- 'start': '2021-03-12T15:49:07.138Z',
62
- 'stale': '2021-03-12T15:49:07.138Z'
63
- },
64
- 'point': {
65
- '_attributes': {
66
- 'lat': '0.000000',
67
- 'lon': '0.000000',
68
- 'hae': '0.0',
69
- 'ce': '9999999.0',
70
- 'le': '9999999.0'
71
- }
72
- },
73
- 'detail': {
74
- 'takv': {
75
- '_attributes': {
76
- 'os': 'Android',
77
- 'version': '10',
78
- 'device': 'Some Device',
79
- 'platform': 'python unittest'
80
- }
81
- },
82
- 'status': {
83
- '_attributes': {
84
- 'battery': '83'
85
- }
86
- },
87
- 'uid': {
88
- '_attributes': {
89
- 'Droid': 'JENNY'
90
- }
91
- },
92
- 'contact': {
93
- '_attributes': {
94
- 'callsign': 'JENNY',
95
- 'endpoint': '*:-1:stcp',
96
- 'phone': '800-867-5309'
97
- }
98
- },
99
- '__group': {
100
- '_attributes': {
101
- 'role': 'Team Member',
102
- 'name': 'Cyan'
103
- }
104
- },
105
- 'track': {
106
- '_attributes': {
107
- 'course': '90.1',
108
- 'speed': '10.3'
109
- }
110
- }
111
- }
112
- }
113
- });
114
- t.end();
115
- });
116
- test('Encode COT message', (t) => {
117
- const packet = {
118
- 'event': {
119
- '_attributes': {
120
- 'version': '2.0',
121
- 'uid': 'ANDROID-deadbeef',
122
- 'type': 'a-f-G-U-C',
123
- 'how': 'm-g',
124
- 'time': '2021-02-27T20:32:24.771Z',
125
- 'start': '2021-02-27T20:32:24.771Z',
126
- 'stale': '2021-02-27T20:38:39.771Z'
127
- },
128
- 'point': {
129
- '_attributes': {
130
- 'lat': '1.234567',
131
- 'lon': '-3.141592',
132
- 'hae': '-25.7',
133
- 'ce': '9.9',
134
- 'le': '9999999'
135
- }
136
- },
137
- 'detail': {
138
- 'takv': {
139
- '_attributes': {
140
- 'os': '29',
141
- 'version': '4.0.0.0 (deadbeef).1234567890-CIV',
142
- 'device': 'Some Android Device',
143
- 'platform': 'ATAK-CIV'
144
- }
145
- },
146
- 'contact': {
147
- '_attributes': {
148
- 'xmppUsername': 'xmpp@host.com',
149
- 'endpoint': '*:-1:stcp',
150
- 'callsign': 'JENNY'
151
- }
152
- },
153
- 'uid': { '_attributes': { 'Droid': 'JENNY' } },
154
- 'precisionlocation': { '_attributes': { 'altsrc': 'GPS', 'geopointsrc': 'GPS' } },
155
- '__group': { '_attributes': { 'role': 'Team Member', 'name': 'Cyan' } },
156
- 'status': { '_attributes': { 'battery': '78' } },
157
- 'track': { '_attributes': { 'course': '80.24833892285461', 'speed': '0.0' } }
158
- }
159
- }
160
- };
161
- t.deepEquals((new CoT(packet)).to_xml(), '<event version="2.0" uid="ANDROID-deadbeef" type="a-f-G-U-C" how="m-g" time="2021-02-27T20:32:24.771Z" start="2021-02-27T20:32:24.771Z" stale="2021-02-27T20:38:39.771Z"><point lat="1.234567" lon="-3.141592" hae="-25.7" ce="9.9" le="9999999"/><detail><takv os="29" version="4.0.0.0 (deadbeef).1234567890-CIV" device="Some Android Device" platform="ATAK-CIV"/><contact xmppUsername="xmpp@host.com" endpoint="*:-1:stcp" callsign="JENNY"/><uid Droid="JENNY"/><precisionlocation altsrc="GPS" geopointsrc="GPS"/><__group role="Team Member" name="Cyan"/><status battery="78"/><track course="80.24833892285461" speed="0.0"/></detail></event>');
162
- t.end();
163
- });
164
- test('Parse GeoChat message', (t) => {
165
- const geochat = '<event version="2.0" uid="GeoChat.ANDROID-deadbeef.JOKER MAN.563040b9-2ac9-4af3-9e01-4cb2b05d98ea" type="b-t-f" how="h-g-i-g-o" time="2021-02-23T22:28:22.191Z" start="2021-02-23T22:28:22.191Z" stale="2021-02-24T22:28:22.191Z">\n' +
166
- ' <point lat="1.234567" lon="-3.141592" hae="-25.8" ce="9.9" le="9999999.0"/>\n' +
167
- ' <detail>\n' +
168
- ' <__chat parent="RootContactGroup" groupOwner="false" chatroom="JOKER MAN" id="ANDROID-cafebabe" senderCallsign="JENNY">\n' +
169
- ' <chatgrp uid0="ANDROID-deadbeef" uid1="ANDROID-cafebabe" id="ANDROID-cafebabe"/>\n' +
170
- ' </__chat>\n' +
171
- ' <link uid="ANDROID-deadbeef" type="a-f-G-U-C" relation="p-p"/>\n' +
172
- ' <remarks source="BAO.F.ATAK.ANDROID-deadbeef" to="ANDROID-cafebabe" time="2021-02-23T22:28:22.191Z">test</remarks>\n' +
173
- ' <__serverdestination destinations="123.45.67.89:4242:tcp:ANDROID-deadbeef"/>\n' +
174
- ' <marti>\n' +
175
- ' <dest callsign="JOKER MAN"/>\n' +
176
- ' </marti>\n' +
177
- ' </detail>\n' +
178
- '</event>';
179
- t.deepEquals((new CoT(geochat)).raw, {
180
- 'event': {
181
- '_attributes': {
182
- 'version': '2.0',
183
- 'uid': 'GeoChat.ANDROID-deadbeef.JOKER MAN.563040b9-2ac9-4af3-9e01-4cb2b05d98ea',
184
- 'type': 'b-t-f',
185
- 'how': 'h-g-i-g-o',
186
- 'time': '2021-02-23T22:28:22.191Z',
187
- 'start': '2021-02-23T22:28:22.191Z',
188
- 'stale': '2021-02-24T22:28:22.191Z'
189
- },
190
- 'point': {
191
- '_attributes': {
192
- 'lat': '1.234567',
193
- 'lon': '-3.141592',
194
- 'hae': '-25.8',
195
- 'ce': '9.9',
196
- 'le': '9999999.0'
197
- }
198
- },
199
- 'detail': {
200
- '__chat': {
201
- '_attributes': {
202
- 'parent': 'RootContactGroup',
203
- 'groupOwner': 'false',
204
- 'chatroom': 'JOKER MAN',
205
- 'id': 'ANDROID-cafebabe',
206
- 'senderCallsign': 'JENNY'
207
- },
208
- 'chatgrp': {
209
- '_attributes': {
210
- 'uid0': 'ANDROID-deadbeef',
211
- 'uid1': 'ANDROID-cafebabe',
212
- 'id': 'ANDROID-cafebabe'
213
- }
214
- }
215
- },
216
- 'link': { '_attributes': { 'uid': 'ANDROID-deadbeef', 'type': 'a-f-G-U-C', 'relation': 'p-p' } },
217
- 'remarks': {
218
- '_attributes': {
219
- 'source': 'BAO.F.ATAK.ANDROID-deadbeef',
220
- 'to': 'ANDROID-cafebabe',
221
- 'time': '2021-02-23T22:28:22.191Z'
222
- },
223
- '_text': 'test'
224
- },
225
- '__serverdestination': { '_attributes': { 'destinations': '123.45.67.89:4242:tcp:ANDROID-deadbeef' } },
226
- 'marti': { 'dest': { '_attributes': { 'callsign': 'JOKER MAN' } } }
227
- }
228
- }
229
- });
230
- t.end();
231
- });
232
- //# sourceMappingURL=cot.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cot.test.js","sourceRoot":"","sources":["../../test/cot.test.ts"],"names":[],"mappings":"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"}