@tak-ps/node-tak 11.26.2 → 12.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/CHANGELOG.md +4 -0
- package/dist/index.d.ts +96 -8
- package/dist/index.js +157 -44
- package/dist/index.js.map +1 -1
- package/dist/lib/api/groups.d.ts +1 -0
- package/dist/lib/api/groups.js +3 -2
- package/dist/lib/api/groups.js.map +1 -1
- package/dist/lib/utils/queue.d.ts +13 -0
- package/dist/lib/utils/queue.js +47 -0
- package/dist/lib/utils/queue.js.map +1 -0
- package/dist/test/pipeline.test.d.ts +1 -0
- package/dist/test/pipeline.test.js +223 -0
- package/dist/test/pipeline.test.js.map +1 -0
- package/dist/test/queue.test.d.ts +1 -0
- package/dist/test/queue.test.js +46 -0
- package/dist/test/queue.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/index.ts +278 -93
- package/lib/api/groups.ts +3 -2
- package/lib/utils/queue.ts +53 -0
- package/package.json +1 -1
- package/test/pipeline.test.ts +269 -0
- package/test/queue.test.ts +49 -0
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import test from 'tape';
|
|
2
|
+
import { EventEmitter } from 'node:events';
|
|
3
|
+
import TAK, { CoT } from '../index.js';
|
|
4
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
5
|
+
function createTAK(opts = {}) {
|
|
6
|
+
return new TAK(new URL('ssl://localhost:8089'), { cert: 'test', key: 'test' }, opts);
|
|
7
|
+
}
|
|
8
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
9
|
+
function createFakeSocket(opts = {}) {
|
|
10
|
+
return Object.assign(new EventEmitter(), {
|
|
11
|
+
write: opts.write ?? (() => true),
|
|
12
|
+
destroyed: false,
|
|
13
|
+
writable: true,
|
|
14
|
+
writableNeedDrain: false,
|
|
15
|
+
writableLength: 0,
|
|
16
|
+
destroy() { this.destroyed = true; },
|
|
17
|
+
setNoDelay: () => { },
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
test('write - resolves when all CoTs are queued and sent', async (t) => {
|
|
21
|
+
const tak = createTAK();
|
|
22
|
+
tak.client = createFakeSocket();
|
|
23
|
+
const cots = [CoT.ping(), CoT.ping()];
|
|
24
|
+
await tak.write(cots);
|
|
25
|
+
t.equals(tak.queue.length, 0, 'queue empty after write + pull');
|
|
26
|
+
t.end();
|
|
27
|
+
});
|
|
28
|
+
test('write - returns early when destroyed', async (t) => {
|
|
29
|
+
const tak = createTAK();
|
|
30
|
+
tak.destroyed = true;
|
|
31
|
+
await tak.write([CoT.ping()]);
|
|
32
|
+
t.equals(tak.queue.length, 0, 'nothing queued');
|
|
33
|
+
t.end();
|
|
34
|
+
});
|
|
35
|
+
test('write - multiple concurrent writes', async (t) => {
|
|
36
|
+
const tak = createTAK();
|
|
37
|
+
tak.client = createFakeSocket();
|
|
38
|
+
const order = [];
|
|
39
|
+
const p1 = tak.write([CoT.ping()]).then(() => order.push(1));
|
|
40
|
+
const p2 = tak.write([CoT.ping()]).then(() => order.push(2));
|
|
41
|
+
await Promise.all([p1, p2]);
|
|
42
|
+
t.deepEquals(order, [1, 2], 'writes resolve in order');
|
|
43
|
+
t.equals(tak.queue.length, 0, 'queue drained');
|
|
44
|
+
t.end();
|
|
45
|
+
});
|
|
46
|
+
test('pull - batches CoTs into single socket.write call', async (t) => {
|
|
47
|
+
const tak = createTAK({ socketBatchSize: 64 });
|
|
48
|
+
const writeCalls = [];
|
|
49
|
+
tak.client = createFakeSocket({
|
|
50
|
+
write(...args) {
|
|
51
|
+
writeCalls.push(args[0]);
|
|
52
|
+
return true;
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
await tak.write([CoT.ping(), CoT.ping()]);
|
|
56
|
+
t.equals(writeCalls.length, 1, 'socket.write called once for batch');
|
|
57
|
+
t.ok(writeCalls[0].includes('<event'), 'batch contains XML events');
|
|
58
|
+
t.equals(tak.queue.length, 0, 'queue drained');
|
|
59
|
+
t.end();
|
|
60
|
+
});
|
|
61
|
+
test('pull - respects backpressure and resumes on process()', async (t) => {
|
|
62
|
+
const tak = createTAK({ socketBatchSize: 1 });
|
|
63
|
+
let callCount = 0;
|
|
64
|
+
const socket = createFakeSocket({
|
|
65
|
+
write() {
|
|
66
|
+
callCount++;
|
|
67
|
+
if (callCount === 1) {
|
|
68
|
+
socket.writableNeedDrain = true;
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
return true;
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
tak.client = socket;
|
|
75
|
+
// Both CoTs get queued immediately, pull() sends 1 and hits backpressure
|
|
76
|
+
await tak.write([CoT.ping(), CoT.ping()]);
|
|
77
|
+
t.equals(callCount, 1, 'one write before backpressure');
|
|
78
|
+
t.equals(tak.queue.length, 1, 'one item still in queue');
|
|
79
|
+
// Simulate backpressure clearing (equivalent to drain event)
|
|
80
|
+
socket.writableNeedDrain = false;
|
|
81
|
+
tak.process();
|
|
82
|
+
t.equals(callCount, 2, 'second write after backpressure cleared');
|
|
83
|
+
t.equals(tak.queue.length, 0, 'queue drained');
|
|
84
|
+
t.end();
|
|
85
|
+
});
|
|
86
|
+
test('pull - error in socket.write triggers destroy + error event', async (t) => {
|
|
87
|
+
const tak = createTAK();
|
|
88
|
+
tak.client = createFakeSocket({
|
|
89
|
+
write() { throw new Error('write failed'); },
|
|
90
|
+
});
|
|
91
|
+
let errorFired = false;
|
|
92
|
+
let errorMsg = '';
|
|
93
|
+
tak.on('error', (err) => { errorFired = true; errorMsg = err.message; });
|
|
94
|
+
// write() enqueues, pull() throws internally, catches → destroy + emit error
|
|
95
|
+
// write() sees destroyed=true on next check and returns
|
|
96
|
+
await tak.write([CoT.ping()]);
|
|
97
|
+
t.equals(tak.destroyed, true, 'destroyed after write error');
|
|
98
|
+
t.ok(errorFired, 'error event fired');
|
|
99
|
+
t.equals(errorMsg, 'write failed', 'error message matches');
|
|
100
|
+
t.end();
|
|
101
|
+
});
|
|
102
|
+
test('pull - noop when already writing', (t) => {
|
|
103
|
+
const tak = createTAK();
|
|
104
|
+
tak.client = createFakeSocket();
|
|
105
|
+
tak.writing = true;
|
|
106
|
+
tak.queue.push('<event/>');
|
|
107
|
+
// pull() should return immediately since writing=true
|
|
108
|
+
tak.process();
|
|
109
|
+
t.equals(tak.queue.length, 1, 'queue unchanged');
|
|
110
|
+
t.end();
|
|
111
|
+
});
|
|
112
|
+
test('flush - resolves immediately when nothing queued', async (t) => {
|
|
113
|
+
const tak = createTAK();
|
|
114
|
+
await tak.flush();
|
|
115
|
+
t.pass('flush resolved immediately');
|
|
116
|
+
t.end();
|
|
117
|
+
});
|
|
118
|
+
test('flush - rejects when destroyed mid-flush', async (t) => {
|
|
119
|
+
const tak = createTAK();
|
|
120
|
+
tak.client = createFakeSocket();
|
|
121
|
+
// Simulate an in-progress write so flush enters the wait path
|
|
122
|
+
tak.writing = true;
|
|
123
|
+
tak.queue.push('<event/>');
|
|
124
|
+
const p = tak.flush();
|
|
125
|
+
tak.destroy();
|
|
126
|
+
try {
|
|
127
|
+
await p;
|
|
128
|
+
t.fail('should have rejected');
|
|
129
|
+
}
|
|
130
|
+
catch (err) {
|
|
131
|
+
t.ok(err instanceof Error, 'error is an Error');
|
|
132
|
+
t.ok(err.message.includes('destroyed'), 'error mentions destroyed');
|
|
133
|
+
}
|
|
134
|
+
t.end();
|
|
135
|
+
});
|
|
136
|
+
test('flush - waits for queue to drain via process()', async (t) => {
|
|
137
|
+
const tak = createTAK({ socketBatchSize: 1 });
|
|
138
|
+
let callCount = 0;
|
|
139
|
+
const socket = createFakeSocket({
|
|
140
|
+
write() {
|
|
141
|
+
callCount++;
|
|
142
|
+
if (callCount === 1) {
|
|
143
|
+
socket.writableNeedDrain = true;
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
return true;
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
tak.client = socket;
|
|
150
|
+
await tak.write([CoT.ping(), CoT.ping()]);
|
|
151
|
+
t.equals(tak.queue.length, 1, 'one item in queue after backpressure');
|
|
152
|
+
// Clear backpressure and drain
|
|
153
|
+
socket.writableNeedDrain = false;
|
|
154
|
+
const flushP = tak.flush();
|
|
155
|
+
tak.process();
|
|
156
|
+
await flushP;
|
|
157
|
+
t.equals(tak.queue.length, 0, 'queue empty after flush');
|
|
158
|
+
t.equals(callCount, 2, 'both items sent');
|
|
159
|
+
t.end();
|
|
160
|
+
});
|
|
161
|
+
test('write - yields when queue is full and resumes after destroy', async (t) => {
|
|
162
|
+
// writeQueueSize=4 → queue capacity = 4
|
|
163
|
+
const tak = createTAK({ writeQueueSize: 4 });
|
|
164
|
+
// No client, so pull() is a no-op → queue fills up and write() yields
|
|
165
|
+
let writeResolved = false;
|
|
166
|
+
const p = tak.write([CoT.ping(), CoT.ping(), CoT.ping(), CoT.ping(), CoT.ping()])
|
|
167
|
+
.then(() => { writeResolved = true; });
|
|
168
|
+
await new Promise(r => setImmediate(r));
|
|
169
|
+
t.equals(tak.queue.length, 4, 'queue at capacity');
|
|
170
|
+
t.equals(writeResolved, false, 'write blocked waiting for space');
|
|
171
|
+
// Destroy unblocks write (destroyed check in loop)
|
|
172
|
+
tak.destroy();
|
|
173
|
+
await p;
|
|
174
|
+
t.ok(writeResolved, 'write resolved after destroy');
|
|
175
|
+
t.end();
|
|
176
|
+
});
|
|
177
|
+
test('write - resumes after queue drains', async (t) => {
|
|
178
|
+
// writeQueueSize=8 → queue capacity = 8, socketBatchSize=4
|
|
179
|
+
const tak = createTAK({ writeQueueSize: 8, socketBatchSize: 4 });
|
|
180
|
+
let callCount = 0;
|
|
181
|
+
const socket = createFakeSocket({
|
|
182
|
+
write() {
|
|
183
|
+
callCount++;
|
|
184
|
+
return true;
|
|
185
|
+
},
|
|
186
|
+
});
|
|
187
|
+
tak.client = socket;
|
|
188
|
+
// Write 10 items — queue capacity is 8, write() must yield once queue fills
|
|
189
|
+
await tak.write([
|
|
190
|
+
CoT.ping(), CoT.ping(), CoT.ping(), CoT.ping(), CoT.ping(),
|
|
191
|
+
CoT.ping(), CoT.ping(), CoT.ping(), CoT.ping(), CoT.ping(),
|
|
192
|
+
]);
|
|
193
|
+
t.equals(tak.queue.length, 0, 'all drained');
|
|
194
|
+
t.ok(callCount >= 2, 'multiple socket.write calls needed');
|
|
195
|
+
t.end();
|
|
196
|
+
});
|
|
197
|
+
test('write - caller can safely modify array after write returns', async (t) => {
|
|
198
|
+
const tak = createTAK();
|
|
199
|
+
const writeCalls = [];
|
|
200
|
+
tak.client = createFakeSocket({
|
|
201
|
+
write(...args) {
|
|
202
|
+
writeCalls.push(args[0]);
|
|
203
|
+
return true;
|
|
204
|
+
},
|
|
205
|
+
});
|
|
206
|
+
const cots = [CoT.ping()];
|
|
207
|
+
await tak.write(cots);
|
|
208
|
+
// Modify the array after write — should not affect what was sent
|
|
209
|
+
cots.length = 0;
|
|
210
|
+
t.equals(writeCalls.length, 1, 'socket.write was called');
|
|
211
|
+
t.ok(writeCalls[0].includes('<event'), 'CoT was sent before array was cleared');
|
|
212
|
+
t.equals(tak.queue.length, 0, 'queue empty');
|
|
213
|
+
t.end();
|
|
214
|
+
});
|
|
215
|
+
test('destroy - sets destroyed and clears ping interval', (t) => {
|
|
216
|
+
const tak = createTAK();
|
|
217
|
+
tak.pingInterval = setInterval(() => { }, 60000);
|
|
218
|
+
tak.destroy();
|
|
219
|
+
t.equals(tak.destroyed, true, 'destroyed is true');
|
|
220
|
+
t.equals(tak.pingInterval, undefined, 'pingInterval cleared');
|
|
221
|
+
t.end();
|
|
222
|
+
});
|
|
223
|
+
//# sourceMappingURL=pipeline.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.test.js","sourceRoot":"","sources":["../../test/pipeline.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import test from 'tape';
|
|
2
|
+
import { Queue } from '../lib/utils/queue.js';
|
|
3
|
+
test('Queue - push/pop FIFO order', (t) => {
|
|
4
|
+
const q = new Queue(4);
|
|
5
|
+
q.push(1);
|
|
6
|
+
q.push(2);
|
|
7
|
+
q.push(3);
|
|
8
|
+
t.equals(q.pop(), 1);
|
|
9
|
+
t.equals(q.pop(), 2);
|
|
10
|
+
t.equals(q.pop(), 3);
|
|
11
|
+
t.end();
|
|
12
|
+
});
|
|
13
|
+
test('Queue - capacity enforced', (t) => {
|
|
14
|
+
const q = new Queue(2);
|
|
15
|
+
t.equals(q.push(1), true);
|
|
16
|
+
t.equals(q.push(2), true);
|
|
17
|
+
t.equals(q.isFull, true);
|
|
18
|
+
t.equals(q.push(3), false);
|
|
19
|
+
t.equals(q.length, 2);
|
|
20
|
+
t.end();
|
|
21
|
+
});
|
|
22
|
+
test('Queue - pop from empty', (t) => {
|
|
23
|
+
const q = new Queue(2);
|
|
24
|
+
t.equals(q.pop(), undefined);
|
|
25
|
+
t.equals(q.length, 0);
|
|
26
|
+
t.end();
|
|
27
|
+
});
|
|
28
|
+
test('Queue - ring buffer wraparound', (t) => {
|
|
29
|
+
const q = new Queue(3);
|
|
30
|
+
q.push(1);
|
|
31
|
+
q.push(2);
|
|
32
|
+
q.push(3);
|
|
33
|
+
// Pop two — head advances past midpoint
|
|
34
|
+
t.equals(q.pop(), 1);
|
|
35
|
+
t.equals(q.pop(), 2);
|
|
36
|
+
// Push two more — tail wraps around
|
|
37
|
+
q.push(4);
|
|
38
|
+
q.push(5);
|
|
39
|
+
// Remaining items come out in FIFO order
|
|
40
|
+
t.equals(q.pop(), 3);
|
|
41
|
+
t.equals(q.pop(), 4);
|
|
42
|
+
t.equals(q.pop(), 5);
|
|
43
|
+
t.equals(q.length, 0);
|
|
44
|
+
t.end();
|
|
45
|
+
});
|
|
46
|
+
//# sourceMappingURL=queue.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.test.js","sourceRoot":"","sources":["../../test/queue.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../cli.ts","../index.ts","../test/default.test.ts","../test/findCoT.test.ts","../lib/api.ts","../lib/auth.ts","../lib/commands.ts","../lib/fetch.ts","../lib/stream.ts","../lib/api/certificate.ts","../lib/api/client.ts","../lib/api/contacts.ts","../lib/api/credentials.ts","../lib/api/export.ts","../lib/api/files.ts","../lib/api/groups.ts","../lib/api/iconsets.ts","../lib/api/injectors.ts","../lib/api/locate.ts","../lib/api/mission-invite.ts","../lib/api/mission-layer.ts","../lib/api/mission-log.ts","../lib/api/mission.ts","../lib/api/oauth.ts","../lib/api/package.ts","../lib/api/profile.ts","../lib/api/query.ts","../lib/api/repeater.ts","../lib/api/security.ts","../lib/api/subscriptions.ts","../lib/api/types.ts","../lib/api/video.ts"],"version":"5.9.3"}
|
|
1
|
+
{"root":["../cli.ts","../index.ts","../test/default.test.ts","../test/findCoT.test.ts","../test/pipeline.test.ts","../test/queue.test.ts","../lib/api.ts","../lib/auth.ts","../lib/commands.ts","../lib/fetch.ts","../lib/stream.ts","../lib/api/certificate.ts","../lib/api/client.ts","../lib/api/contacts.ts","../lib/api/credentials.ts","../lib/api/export.ts","../lib/api/files.ts","../lib/api/groups.ts","../lib/api/iconsets.ts","../lib/api/injectors.ts","../lib/api/locate.ts","../lib/api/mission-invite.ts","../lib/api/mission-layer.ts","../lib/api/mission-log.ts","../lib/api/mission.ts","../lib/api/oauth.ts","../lib/api/package.ts","../lib/api/profile.ts","../lib/api/query.ts","../lib/api/repeater.ts","../lib/api/security.ts","../lib/api/subscriptions.ts","../lib/api/types.ts","../lib/api/video.ts","../lib/utils/queue.ts"],"version":"5.9.3"}
|