@tak-ps/node-cot 8.1.0 → 8.2.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/CHANGELOG.md +4 -0
- package/README.md +21 -17
- package/dist/package.json +1 -1
- package/dist/test/newlines.test.js +78 -0
- package/dist/test/newlines.test.js.map +1 -0
- package/package.json +1 -1
- package/test/newlines.test.ts +82 -0
package/CHANGELOG.md
CHANGED
package/README.md
CHANGED
|
@@ -19,6 +19,27 @@ To install `node-cot` with npm run
|
|
|
19
19
|
npm install @tak-ps/node-cot
|
|
20
20
|
```
|
|
21
21
|
|
|
22
|
+
## Usage Examples
|
|
23
|
+
|
|
24
|
+
### Cursor-On-Target
|
|
25
|
+
|
|
26
|
+
```js
|
|
27
|
+
import CoT from '@tak-ps/node-cot';
|
|
28
|
+
|
|
29
|
+
const cot = new CoT(`
|
|
30
|
+
<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">
|
|
31
|
+
<point lat="1.234567" lon="-3.141592" hae="-25.7" ce="9.9" le="9999999.0"/>
|
|
32
|
+
</event>
|
|
33
|
+
`);
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
// Export Formats
|
|
37
|
+
cot.to_geojson(); // Output GeoJSON Representation
|
|
38
|
+
cot.to_xml(); // Output String XML Representation
|
|
39
|
+
|
|
40
|
+
cot.raw; // JSON XML Representation
|
|
41
|
+
```
|
|
42
|
+
|
|
22
43
|
## CoT Spec
|
|
23
44
|
|
|
24
45
|
The CoT Spec is very informally developed by rough internal concensus
|
|
@@ -92,23 +113,6 @@ These are less common properties that can be used:
|
|
|
92
113
|
| `.properties.dest` | Marti API Instructions for sending CoTs to a specific location |
|
|
93
114
|
| `.properties.fileshare` | Push Data Packages via CoT |
|
|
94
115
|
|
|
95
|
-
## Usage Examples
|
|
96
|
-
|
|
97
|
-
### Basic Usage
|
|
98
|
-
|
|
99
|
-
```
|
|
100
|
-
import CoT from '@tak-ps/node-cot';
|
|
101
|
-
|
|
102
|
-
const message = '<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>'
|
|
103
|
-
|
|
104
|
-
const cot = new CoT(message);
|
|
105
|
-
|
|
106
|
-
// Export Formats
|
|
107
|
-
cot.to_geojson(); // Output GeoJSON Representation
|
|
108
|
-
cot.to_xml(); // Output String XML Representation
|
|
109
|
-
|
|
110
|
-
cot.raw; // JSON XML Representation
|
|
111
|
-
```
|
|
112
116
|
|
|
113
117
|
## Known Special CoT Types
|
|
114
118
|
|
package/dist/package.json
CHANGED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import test from 'tape';
|
|
2
|
+
import CoT from '../index.js';
|
|
3
|
+
test('Decode iTAK COT message', (t) => {
|
|
4
|
+
const packet = `<event version="2.0" uid="layer-35-4707" type="a-f-G" how="m-g" time="2024-06-07T15:28:48Z" start="2024-06-07T15:28:48.669Z" stale="2024-06-07T15:33:48.669Z"><point lat="39.1" lon="-105.1" hae="0.0" ce="9999999.0" le="9999999.0"/><detail><contact callsign="9T20"/><usericon iconsetpath="f7f71666-8b28-4b57-9fbb-e38e61d33b79/Google/police.png"/><remarks>Incident ID: 6841390
|
|
5
|
+
Master Incident Number: 05242024-0253042
|
|
6
|
+
Unit Name: 9F20
|
|
7
|
+
Unit ID: 3412
|
|
8
|
+
Status: Dispatched
|
|
9
|
+
Jurisdiction: Golden PD
|
|
10
|
+
Speed: 1</remarks><_flow-tags_ TAK-Server-e87a0e02420b44a08f6032bcf1877745="2024-06-07T15:28:48Z"><NodeCoT-8.1.0>2024-06-07T15:28:48.669Z</NodeCoT-8.1.0></_flow-tags_></detail></event>`;
|
|
11
|
+
const cot = new CoT(packet);
|
|
12
|
+
if (!cot.raw.event.detail) {
|
|
13
|
+
t.fail('No Detail Section');
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
t.ok(cot.raw.event.detail['_flow-tags_']);
|
|
17
|
+
delete cot.raw.event.detail['_flow-tags_'];
|
|
18
|
+
t.deepEquals({
|
|
19
|
+
'event': {
|
|
20
|
+
'_attributes': {
|
|
21
|
+
'version': '2.0',
|
|
22
|
+
'uid': 'layer-35-4707',
|
|
23
|
+
'type': 'a-f-G',
|
|
24
|
+
'time': '2024-06-07T15:28:48Z',
|
|
25
|
+
'start': '2024-06-07T15:28:48.669Z',
|
|
26
|
+
'stale': '2024-06-07T15:33:48.669Z',
|
|
27
|
+
'how': 'm-g',
|
|
28
|
+
},
|
|
29
|
+
'point': {
|
|
30
|
+
'_attributes': {
|
|
31
|
+
'lat': '39.1',
|
|
32
|
+
'lon': '-105.1',
|
|
33
|
+
'hae': '0.0',
|
|
34
|
+
'ce': '9999999.0',
|
|
35
|
+
'le': '9999999.0'
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
detail: {
|
|
39
|
+
usericon: {
|
|
40
|
+
_attributes: {
|
|
41
|
+
"iconsetpath": "f7f71666-8b28-4b57-9fbb-e38e61d33b79/Google/police.png"
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
contact: {
|
|
45
|
+
_attributes: {
|
|
46
|
+
callsign: '9T20',
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
remarks: {
|
|
50
|
+
"_text": "Incident ID: 6841390\nMaster Incident Number: 05242024-0253042\nUnit Name: 9F20\nUnit ID: 3412\nStatus: Dispatched\nJurisdiction: Golden PD\nSpeed: 1"
|
|
51
|
+
},
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}, cot.raw);
|
|
55
|
+
t.deepEquals(cot.to_geojson(), {
|
|
56
|
+
id: 'layer-35-4707',
|
|
57
|
+
type: 'Feature',
|
|
58
|
+
properties: {
|
|
59
|
+
callsign: '9T20',
|
|
60
|
+
type: 'a-f-G',
|
|
61
|
+
how: 'm-g',
|
|
62
|
+
center: [-105.1, 39.1, 0],
|
|
63
|
+
remarks: "Incident ID: 6841390\nMaster Incident Number: 05242024-0253042\nUnit Name: 9F20\nUnit ID: 3412\nStatus: Dispatched\nJurisdiction: Golden PD\nSpeed: 1",
|
|
64
|
+
time: '2024-06-07T15:28:48Z',
|
|
65
|
+
start: '2024-06-07T15:28:48.669Z',
|
|
66
|
+
stale: '2024-06-07T15:33:48.669Z',
|
|
67
|
+
icon: "f7f71666-8b28-4b57-9fbb-e38e61d33b79/Google/police.png",
|
|
68
|
+
metadata: {},
|
|
69
|
+
},
|
|
70
|
+
geometry: {
|
|
71
|
+
type: 'Point',
|
|
72
|
+
coordinates: [-105.1, 39.1, 0]
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
t.end();
|
|
77
|
+
});
|
|
78
|
+
//# sourceMappingURL=newlines.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"newlines.test.js","sourceRoot":"","sources":["../../test/newlines.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,GAAG,MAAM,aAAa,CAAC;AAE9B,IAAI,CAAC,yBAAyB,EAAE,CAAC,CAAC,EAAE,EAAE;IAClC,MAAM,MAAM,GAAG;;;;;;yLAMsK,CAAA;IAErL,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IAE5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QACxB,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;IAC/B,CAAC;SAAM,CAAC;QACJ,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;QAC1C,OAAO,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAE3C,CAAC,CAAC,UAAU,CAAC;YACT,OAAO,EAAE;gBACL,aAAa,EAAE;oBACX,SAAS,EAAE,KAAK;oBAChB,KAAK,EAAE,eAAe;oBACtB,MAAM,EAAE,OAAO;oBACf,MAAM,EAAE,sBAAsB;oBAC9B,OAAO,EAAE,0BAA0B;oBACnC,OAAO,EAAE,0BAA0B;oBACnC,KAAK,EAAE,KAAK;iBACf;gBACD,OAAO,EAAE;oBACL,aAAa,EAAE;wBACX,KAAK,EAAE,MAAM;wBACb,KAAK,EAAE,QAAQ;wBACf,KAAK,EAAE,KAAK;wBACZ,IAAI,EAAE,WAAW;wBACjB,IAAI,EAAE,WAAW;qBACpB;iBACJ;gBACD,MAAM,EAAE;oBACJ,QAAQ,EAAE;wBACN,WAAW,EAAE;4BACT,aAAa,EAAE,wDAAwD;yBAC1E;qBACJ;oBACD,OAAO,EAAE;wBACL,WAAW,EAAE;4BACT,QAAQ,EAAE,MAAM;yBACnB;qBACJ;oBACD,OAAO,EAAE;wBACL,OAAO,EAAE,uJAAuJ;qBACnK;iBACJ;aACJ;SACJ,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;QAEZ,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE;YAC3B,EAAE,EAAE,eAAe;YACnB,IAAI,EAAE,SAAS;YACf,UAAU,EAAE;gBACR,QAAQ,EAAE,MAAM;gBAChB,IAAI,EAAE,OAAO;gBACb,GAAG,EAAE,KAAK;gBACV,MAAM,EAAE,CAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC1B,OAAO,EAAE,uJAAuJ;gBAChK,IAAI,EAAE,sBAAsB;gBAC5B,KAAK,EAAE,0BAA0B;gBACjC,KAAK,EAAE,0BAA0B;gBACjC,IAAI,EAAE,wDAAwD;gBAC9D,QAAQ,EAAE,EAAE;aACf;YACD,QAAQ,EAAE;gBACN,IAAI,EAAE,OAAO;gBACb,WAAW,EAAE,CAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAE;aACnC;SACJ,CAAC,CAAC;IACP,CAAC;IAED,CAAC,CAAC,GAAG,EAAE,CAAC;AACZ,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import test from 'tape';
|
|
2
|
+
import CoT from '../index.js';
|
|
3
|
+
|
|
4
|
+
test('Decode iTAK COT message', (t) => {
|
|
5
|
+
const packet = `<event version="2.0" uid="layer-35-4707" type="a-f-G" how="m-g" time="2024-06-07T15:28:48Z" start="2024-06-07T15:28:48.669Z" stale="2024-06-07T15:33:48.669Z"><point lat="39.1" lon="-105.1" hae="0.0" ce="9999999.0" le="9999999.0"/><detail><contact callsign="9T20"/><usericon iconsetpath="f7f71666-8b28-4b57-9fbb-e38e61d33b79/Google/police.png"/><remarks>Incident ID: 6841390
|
|
6
|
+
Master Incident Number: 05242024-0253042
|
|
7
|
+
Unit Name: 9F20
|
|
8
|
+
Unit ID: 3412
|
|
9
|
+
Status: Dispatched
|
|
10
|
+
Jurisdiction: Golden PD
|
|
11
|
+
Speed: 1</remarks><_flow-tags_ TAK-Server-e87a0e02420b44a08f6032bcf1877745="2024-06-07T15:28:48Z"><NodeCoT-8.1.0>2024-06-07T15:28:48.669Z</NodeCoT-8.1.0></_flow-tags_></detail></event>`
|
|
12
|
+
|
|
13
|
+
const cot = new CoT(packet);
|
|
14
|
+
|
|
15
|
+
if (!cot.raw.event.detail) {
|
|
16
|
+
t.fail('No Detail Section')
|
|
17
|
+
} else {
|
|
18
|
+
t.ok(cot.raw.event.detail['_flow-tags_']);
|
|
19
|
+
delete cot.raw.event.detail['_flow-tags_'];
|
|
20
|
+
|
|
21
|
+
t.deepEquals({
|
|
22
|
+
'event': {
|
|
23
|
+
'_attributes': {
|
|
24
|
+
'version': '2.0',
|
|
25
|
+
'uid': 'layer-35-4707',
|
|
26
|
+
'type': 'a-f-G',
|
|
27
|
+
'time': '2024-06-07T15:28:48Z',
|
|
28
|
+
'start': '2024-06-07T15:28:48.669Z',
|
|
29
|
+
'stale': '2024-06-07T15:33:48.669Z',
|
|
30
|
+
'how': 'm-g',
|
|
31
|
+
},
|
|
32
|
+
'point': {
|
|
33
|
+
'_attributes': {
|
|
34
|
+
'lat': '39.1',
|
|
35
|
+
'lon': '-105.1',
|
|
36
|
+
'hae': '0.0',
|
|
37
|
+
'ce': '9999999.0',
|
|
38
|
+
'le': '9999999.0'
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
detail: {
|
|
42
|
+
usericon: {
|
|
43
|
+
_attributes: {
|
|
44
|
+
"iconsetpath": "f7f71666-8b28-4b57-9fbb-e38e61d33b79/Google/police.png"
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
contact: {
|
|
48
|
+
_attributes: {
|
|
49
|
+
callsign: '9T20',
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
remarks: {
|
|
53
|
+
"_text": "Incident ID: 6841390\nMaster Incident Number: 05242024-0253042\nUnit Name: 9F20\nUnit ID: 3412\nStatus: Dispatched\nJurisdiction: Golden PD\nSpeed: 1"
|
|
54
|
+
},
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}, cot.raw);
|
|
58
|
+
|
|
59
|
+
t.deepEquals(cot.to_geojson(), {
|
|
60
|
+
id: 'layer-35-4707',
|
|
61
|
+
type: 'Feature',
|
|
62
|
+
properties: {
|
|
63
|
+
callsign: '9T20',
|
|
64
|
+
type: 'a-f-G',
|
|
65
|
+
how: 'm-g',
|
|
66
|
+
center: [ -105.1, 39.1, 0],
|
|
67
|
+
remarks: "Incident ID: 6841390\nMaster Incident Number: 05242024-0253042\nUnit Name: 9F20\nUnit ID: 3412\nStatus: Dispatched\nJurisdiction: Golden PD\nSpeed: 1",
|
|
68
|
+
time: '2024-06-07T15:28:48Z',
|
|
69
|
+
start: '2024-06-07T15:28:48.669Z',
|
|
70
|
+
stale: '2024-06-07T15:33:48.669Z',
|
|
71
|
+
icon: "f7f71666-8b28-4b57-9fbb-e38e61d33b79/Google/police.png",
|
|
72
|
+
metadata: {},
|
|
73
|
+
},
|
|
74
|
+
geometry: {
|
|
75
|
+
type: 'Point',
|
|
76
|
+
coordinates: [ -105.1, 39.1, 0 ]
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
t.end();
|
|
82
|
+
});
|