@trillboards/edge-sdk 0.2.42 → 0.2.49

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.
Files changed (51) hide show
  1. package/README.md +18 -0
  2. package/deploy/docker/connector-entrypoint.sh +1 -1
  3. package/dist/CloudSensingManager.d.ts +18 -0
  4. package/dist/CloudSensingManager.d.ts.map +1 -1
  5. package/dist/CloudSensingManager.js +101 -16
  6. package/dist/CloudSensingManager.js.map +1 -1
  7. package/dist/DurableVlmCandidateSpool.d.ts +99 -0
  8. package/dist/DurableVlmCandidateSpool.d.ts.map +1 -0
  9. package/dist/DurableVlmCandidateSpool.js +522 -0
  10. package/dist/DurableVlmCandidateSpool.js.map +1 -0
  11. package/dist/EdgeAgent.js +1 -1
  12. package/dist/LiteRtVlmProvider.d.ts +12 -1
  13. package/dist/LiteRtVlmProvider.d.ts.map +1 -1
  14. package/dist/LiteRtVlmProvider.js.map +1 -1
  15. package/dist/SceneChangeDetector.d.ts +35 -5
  16. package/dist/SceneChangeDetector.d.ts.map +1 -1
  17. package/dist/SceneChangeDetector.js +19 -5
  18. package/dist/SceneChangeDetector.js.map +1 -1
  19. package/dist/VlmAdmissionGate.d.ts +63 -0
  20. package/dist/VlmAdmissionGate.d.ts.map +1 -1
  21. package/dist/VlmAdmissionGate.js +64 -0
  22. package/dist/VlmAdmissionGate.js.map +1 -1
  23. package/dist/VlmCandidateBuffer.d.ts +17 -0
  24. package/dist/VlmCandidateBuffer.d.ts.map +1 -1
  25. package/dist/VlmCandidateBuffer.js +6 -0
  26. package/dist/VlmCandidateBuffer.js.map +1 -1
  27. package/dist/config.d.ts +37 -4
  28. package/dist/config.d.ts.map +1 -1
  29. package/dist/config.js.map +1 -1
  30. package/dist/connectorCadence.d.ts +193 -8
  31. package/dist/connectorCadence.d.ts.map +1 -1
  32. package/dist/connectorCadence.js +225 -10
  33. package/dist/connectorCadence.js.map +1 -1
  34. package/dist/deployedCadence.d.ts +18 -5
  35. package/dist/deployedCadence.d.ts.map +1 -1
  36. package/dist/deployedCadence.js +50 -13
  37. package/dist/deployedCadence.js.map +1 -1
  38. package/dist/diagnose.d.ts +1 -1
  39. package/dist/diagnose.js +1 -1
  40. package/dist/index.d.ts +2 -0
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +3 -1
  43. package/dist/index.js.map +1 -1
  44. package/dist/sensingCatchRate.d.ts +105 -3
  45. package/dist/sensingCatchRate.d.ts.map +1 -1
  46. package/dist/sensingCatchRate.js +98 -10
  47. package/dist/sensingCatchRate.js.map +1 -1
  48. package/dist/sensingRunMode.d.ts.map +1 -1
  49. package/dist/sensingRunMode.js +95 -4
  50. package/dist/sensingRunMode.js.map +1 -1
  51. package/package.json +1 -1
@@ -0,0 +1,99 @@
1
+ import type { VlmCandidate, VlmCandidateBufferStats, VlmCandidateOfferResult } from './VlmCandidateBuffer';
2
+ export interface DurableVlmCandidateSpoolOptions {
3
+ directory: string;
4
+ maxFrames?: number;
5
+ maxPerFeed?: number;
6
+ maxBytes?: number;
7
+ retentionMs?: number;
8
+ retryInitialMs?: number;
9
+ retryMaxMs?: number;
10
+ now?: () => number;
11
+ }
12
+ export interface DurableVlmCandidateSpoolStats extends VlmCandidateBufferStats {
13
+ storage: 'disk';
14
+ recovered: number;
15
+ completed: number;
16
+ retried: number;
17
+ inFlight: number;
18
+ writeFailed: number;
19
+ readFailed: number;
20
+ deleteFailed: number;
21
+ }
22
+ /**
23
+ * Disk-backed hold for motion-positive frames waiting on the local VLM.
24
+ *
25
+ * A metadata record and JPEG are written before the frame becomes visible to
26
+ * the pump. `take()` only marks the pair in-flight; `complete()` removes it
27
+ * after the server accepts the analyzed observation. A model/API failure calls
28
+ * `retry()`, which retains the same files and requeues them with bounded
29
+ * exponential backoff. Process death needs no special path: every complete
30
+ * metadata/JPEG pair is discovered again on the next `startRun()`.
31
+ */
32
+ export declare class DurableVlmCandidateSpool {
33
+ private readonly directory;
34
+ private readonly maxFrames;
35
+ private readonly maxPerFeed;
36
+ private readonly maxBytes;
37
+ private readonly retentionMs;
38
+ private readonly retryInitialMs;
39
+ private readonly retryMaxMs;
40
+ private readonly now;
41
+ private readonly feeds;
42
+ private readonly inFlight;
43
+ private readonly serveOrder;
44
+ private serveTick;
45
+ private queued;
46
+ private persisted;
47
+ private persistedBytes;
48
+ private enqueued;
49
+ private served;
50
+ private evicted;
51
+ private expired;
52
+ private recovered;
53
+ private completed;
54
+ private retried;
55
+ private writeFailed;
56
+ private readFailed;
57
+ private deleteFailed;
58
+ constructor(options: DurableVlmCandidateSpoolOptions);
59
+ getMaxFrames(): number;
60
+ getMaxPerFeed(): number;
61
+ getTtlMs(): number;
62
+ size(): number;
63
+ bytes(): number;
64
+ bufferedFor(name: string): number;
65
+ /** Start a manager run without deleting evidence left by an earlier run. */
66
+ startRun(): void;
67
+ /** Stopping the connector must not become an evidence-deletion event. */
68
+ stopRun(): void;
69
+ offer(candidate: Omit<VlmCandidate, 'enqueuedAtMs'> & {
70
+ enqueuedAtMs?: number;
71
+ }, nowMs?: number): VlmCandidateOfferResult;
72
+ peek(nowMs?: number): VlmCandidate | null;
73
+ take(nowMs?: number): VlmCandidate | null;
74
+ /** Delete evidence only after analysis and server ingest were accepted. */
75
+ complete(candidate: VlmCandidate): void;
76
+ /** Keep the same evidence and retry it after bounded exponential backoff. */
77
+ retry(candidate: VlmCandidate, nowMs?: number): void;
78
+ expire(nowMs?: number): number;
79
+ oldestAgeMs(nowMs?: number): number | null;
80
+ getStats(nowMs?: number): DurableVlmCandidateSpoolStats;
81
+ private clearQueuedState;
82
+ private ensureDirectory;
83
+ private recover;
84
+ private validRecord;
85
+ private writePair;
86
+ private writeMetadata;
87
+ private asCandidate;
88
+ private feedQueue;
89
+ private sortFeed;
90
+ private nextEligible;
91
+ private evictFromFullestFeed;
92
+ private evictOldestOf;
93
+ private removePersisted;
94
+ private deletePair;
95
+ private deletePairById;
96
+ private jpegPath;
97
+ private metadataPath;
98
+ }
99
+ //# sourceMappingURL=DurableVlmCandidateSpool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DurableVlmCandidateSpool.d.ts","sourceRoot":"","sources":["../src/DurableVlmCandidateSpool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,522 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.DurableVlmCandidateSpool = void 0;
37
+ const crypto = __importStar(require("crypto"));
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const RECORD_VERSION = 1;
41
+ const DEFAULT_MAX_FRAMES = 4096;
42
+ const DEFAULT_MAX_PER_FEED = 128;
43
+ const DEFAULT_MAX_BYTES = 512 * 1024 * 1024;
44
+ const DEFAULT_RETENTION_MS = 24 * 60 * 60 * 1000;
45
+ const DEFAULT_RETRY_INITIAL_MS = 5000;
46
+ const DEFAULT_RETRY_MAX_MS = 5 * 60 * 1000;
47
+ /**
48
+ * Disk-backed hold for motion-positive frames waiting on the local VLM.
49
+ *
50
+ * A metadata record and JPEG are written before the frame becomes visible to
51
+ * the pump. `take()` only marks the pair in-flight; `complete()` removes it
52
+ * after the server accepts the analyzed observation. A model/API failure calls
53
+ * `retry()`, which retains the same files and requeues them with bounded
54
+ * exponential backoff. Process death needs no special path: every complete
55
+ * metadata/JPEG pair is discovered again on the next `startRun()`.
56
+ */
57
+ class DurableVlmCandidateSpool {
58
+ constructor(options) {
59
+ this.feeds = new Map();
60
+ this.inFlight = new Map();
61
+ this.serveOrder = new Map();
62
+ this.serveTick = 0;
63
+ this.queued = 0;
64
+ this.persisted = 0;
65
+ this.persistedBytes = 0;
66
+ this.enqueued = 0;
67
+ this.served = 0;
68
+ this.evicted = 0;
69
+ this.expired = 0;
70
+ this.recovered = 0;
71
+ this.completed = 0;
72
+ this.retried = 0;
73
+ this.writeFailed = 0;
74
+ this.readFailed = 0;
75
+ this.deleteFailed = 0;
76
+ this.directory = path.resolve(options.directory);
77
+ this.maxFrames = Math.max(1, Math.trunc(options.maxFrames ?? DEFAULT_MAX_FRAMES));
78
+ this.maxPerFeed = Math.min(this.maxFrames, Math.max(1, Math.trunc(options.maxPerFeed ?? DEFAULT_MAX_PER_FEED)));
79
+ this.maxBytes = Math.max(1, Math.trunc(options.maxBytes ?? DEFAULT_MAX_BYTES));
80
+ this.retentionMs = Math.max(1, Math.trunc(options.retentionMs ?? DEFAULT_RETENTION_MS));
81
+ this.retryInitialMs = Math.max(1, Math.trunc(options.retryInitialMs ?? DEFAULT_RETRY_INITIAL_MS));
82
+ this.retryMaxMs = Math.max(this.retryInitialMs, Math.trunc(options.retryMaxMs ?? DEFAULT_RETRY_MAX_MS));
83
+ this.now = options.now ?? Date.now;
84
+ }
85
+ getMaxFrames() { return this.maxFrames; }
86
+ getMaxPerFeed() { return this.maxPerFeed; }
87
+ getTtlMs() { return this.retentionMs; }
88
+ size() { return this.queued; }
89
+ bytes() { return this.persistedBytes; }
90
+ bufferedFor(name) { return this.feeds.get(name)?.items.length ?? 0; }
91
+ /** Start a manager run without deleting evidence left by an earlier run. */
92
+ startRun() {
93
+ this.ensureDirectory();
94
+ this.clearQueuedState();
95
+ this.recover();
96
+ }
97
+ /** Stopping the connector must not become an evidence-deletion event. */
98
+ stopRun() {
99
+ // Files and queue metadata deliberately remain intact. An in-process
100
+ // completion may still settle after stop(); a process exit is recovered.
101
+ }
102
+ offer(candidate, nowMs) {
103
+ const now = nowMs ?? this.now();
104
+ this.expire(now);
105
+ const byteLength = candidate.jpeg.length;
106
+ const feed = this.feedQueue(candidate.name);
107
+ if (byteLength > this.maxBytes) {
108
+ feed.evicted++;
109
+ this.evicted++;
110
+ return 'rejected';
111
+ }
112
+ const entry = {
113
+ version: RECORD_VERSION,
114
+ id: crypto.randomUUID().replace(/-/g, ''),
115
+ name: candidate.name,
116
+ enqueuedAtMs: candidate.enqueuedAtMs ?? now,
117
+ availableAtMs: now,
118
+ captureMode: candidate.captureMode,
119
+ reason: candidate.reason,
120
+ signature: candidate.signature,
121
+ imageWidth: candidate.imageWidth,
122
+ imageHeight: candidate.imageHeight,
123
+ byteLength,
124
+ attempts: 0,
125
+ };
126
+ // Persist first. If the disk is unavailable, existing evidence remains
127
+ // untouched and the caller gets a counted rejection instead of a false
128
+ // claim that the event is durable.
129
+ if (!this.writePair(entry, candidate.jpeg)) {
130
+ feed.evicted++;
131
+ this.evicted++;
132
+ return 'rejected';
133
+ }
134
+ this.persisted++;
135
+ this.persistedBytes += byteLength;
136
+ // A busy camera pays its own pressure first. Global pressure then evicts
137
+ // from the fullest queued feed; in-flight evidence is never deleted.
138
+ while (feed.items.length >= this.maxPerFeed)
139
+ this.evictOldestOf(feed);
140
+ while (this.persisted > this.maxFrames ||
141
+ this.persistedBytes > this.maxBytes) {
142
+ if (!this.evictFromFullestFeed())
143
+ break;
144
+ }
145
+ if (this.persisted > this.maxFrames || this.persistedBytes > this.maxBytes) {
146
+ this.deletePair(entry);
147
+ this.persisted--;
148
+ this.persistedBytes -= byteLength;
149
+ feed.evicted++;
150
+ this.evicted++;
151
+ return 'rejected';
152
+ }
153
+ feed.items.push(entry);
154
+ this.sortFeed(feed);
155
+ this.queued++;
156
+ this.enqueued++;
157
+ feed.enqueued++;
158
+ return 'buffered';
159
+ }
160
+ peek(nowMs) {
161
+ const now = nowMs ?? this.now();
162
+ this.expire(now);
163
+ const selected = this.nextEligible(now);
164
+ return selected ? this.asCandidate(selected.entry, Buffer.alloc(0)) : null;
165
+ }
166
+ take(nowMs) {
167
+ const now = nowMs ?? this.now();
168
+ this.expire(now);
169
+ for (;;) {
170
+ const selected = this.nextEligible(now);
171
+ if (!selected)
172
+ return null;
173
+ const { feed, index, entry } = selected;
174
+ feed.items.splice(index, 1);
175
+ this.queued--;
176
+ let jpeg;
177
+ try {
178
+ jpeg = fs.readFileSync(this.jpegPath(entry.id));
179
+ if (jpeg.length !== entry.byteLength)
180
+ throw new Error('length mismatch');
181
+ }
182
+ catch {
183
+ this.readFailed++;
184
+ feed.evicted++;
185
+ this.evicted++;
186
+ this.removePersisted(entry);
187
+ continue;
188
+ }
189
+ this.inFlight.set(entry.id, entry);
190
+ feed.served++;
191
+ this.served++;
192
+ this.serveOrder.set(feed.name, ++this.serveTick);
193
+ return this.asCandidate(entry, jpeg);
194
+ }
195
+ }
196
+ /** Delete evidence only after analysis and server ingest were accepted. */
197
+ complete(candidate) {
198
+ const id = candidate.spoolId;
199
+ if (!id)
200
+ return;
201
+ const entry = this.inFlight.get(id);
202
+ if (!entry)
203
+ return;
204
+ this.inFlight.delete(id);
205
+ this.removePersisted(entry);
206
+ this.completed++;
207
+ }
208
+ /** Keep the same evidence and retry it after bounded exponential backoff. */
209
+ retry(candidate, nowMs) {
210
+ const id = candidate.spoolId;
211
+ if (!id)
212
+ return;
213
+ const entry = this.inFlight.get(id);
214
+ if (!entry)
215
+ return;
216
+ this.inFlight.delete(id);
217
+ entry.attempts += 1;
218
+ const delay = Math.min(this.retryMaxMs, this.retryInitialMs * Math.pow(2, Math.min(16, entry.attempts - 1)));
219
+ entry.availableAtMs = (nowMs ?? this.now()) + delay;
220
+ this.writeMetadata(entry);
221
+ const feed = this.feedQueue(entry.name);
222
+ feed.items.push(entry);
223
+ this.sortFeed(feed);
224
+ this.queued++;
225
+ this.retried++;
226
+ }
227
+ expire(nowMs) {
228
+ const now = nowMs ?? this.now();
229
+ let dropped = 0;
230
+ for (const feed of this.feeds.values()) {
231
+ for (let i = feed.items.length - 1; i >= 0; i--) {
232
+ const entry = feed.items[i];
233
+ if (now - entry.enqueuedAtMs <= this.retentionMs)
234
+ continue;
235
+ feed.items.splice(i, 1);
236
+ this.queued--;
237
+ feed.expired++;
238
+ this.expired++;
239
+ this.removePersisted(entry);
240
+ dropped++;
241
+ }
242
+ }
243
+ return dropped;
244
+ }
245
+ oldestAgeMs(nowMs) {
246
+ const now = nowMs ?? this.now();
247
+ let oldest = null;
248
+ for (const feed of this.feeds.values()) {
249
+ for (const entry of feed.items) {
250
+ const age = Math.max(0, now - entry.enqueuedAtMs);
251
+ if (oldest === null || age > oldest)
252
+ oldest = age;
253
+ }
254
+ }
255
+ return oldest;
256
+ }
257
+ getStats(nowMs) {
258
+ const now = nowMs ?? this.now();
259
+ this.expire(now);
260
+ return {
261
+ storage: 'disk',
262
+ buffered: this.queued,
263
+ bytes: this.persistedBytes,
264
+ maxFrames: this.maxFrames,
265
+ maxPerFeed: this.maxPerFeed,
266
+ maxBytes: this.maxBytes,
267
+ ttlMs: this.retentionMs,
268
+ enqueued: this.enqueued,
269
+ served: this.served,
270
+ evicted: this.evicted,
271
+ expired: this.expired,
272
+ oldestAgeMs: this.oldestAgeMs(now),
273
+ perFeed: [...this.feeds.values()].map((feed) => ({
274
+ name: feed.name,
275
+ buffered: feed.items.length,
276
+ enqueued: feed.enqueued,
277
+ served: feed.served,
278
+ evicted: feed.evicted,
279
+ expired: feed.expired,
280
+ })),
281
+ recovered: this.recovered,
282
+ completed: this.completed,
283
+ retried: this.retried,
284
+ inFlight: this.inFlight.size,
285
+ writeFailed: this.writeFailed,
286
+ readFailed: this.readFailed,
287
+ deleteFailed: this.deleteFailed,
288
+ };
289
+ }
290
+ clearQueuedState() {
291
+ this.feeds.clear();
292
+ this.serveOrder.clear();
293
+ this.serveTick = 0;
294
+ this.queued = 0;
295
+ this.persisted = this.inFlight.size;
296
+ this.persistedBytes = [...this.inFlight.values()].reduce((n, e) => n + e.byteLength, 0);
297
+ this.enqueued = 0;
298
+ this.served = 0;
299
+ this.evicted = 0;
300
+ this.expired = 0;
301
+ this.recovered = 0;
302
+ this.completed = 0;
303
+ this.retried = 0;
304
+ this.writeFailed = 0;
305
+ this.readFailed = 0;
306
+ this.deleteFailed = 0;
307
+ }
308
+ ensureDirectory() {
309
+ fs.mkdirSync(this.directory, { recursive: true, mode: 0o700 });
310
+ try {
311
+ fs.chmodSync(this.directory, 0o700);
312
+ }
313
+ catch { /* Windows ignores POSIX modes. */ }
314
+ }
315
+ recover() {
316
+ let names = [];
317
+ try {
318
+ names = fs.readdirSync(this.directory);
319
+ }
320
+ catch {
321
+ return;
322
+ }
323
+ for (const name of names) {
324
+ if (name.endsWith('.tmp')) {
325
+ try {
326
+ fs.unlinkSync(path.join(this.directory, name));
327
+ }
328
+ catch { /* best-effort */ }
329
+ }
330
+ }
331
+ for (const name of names.filter((n) => /^[a-f0-9]+\.json$/.test(n))) {
332
+ const metadataPath = path.join(this.directory, name);
333
+ let entry = null;
334
+ try {
335
+ const raw = JSON.parse(fs.readFileSync(metadataPath, 'utf8'));
336
+ if (!this.validRecord(raw))
337
+ throw new Error('invalid record');
338
+ const jpegStat = fs.statSync(this.jpegPath(raw.id));
339
+ if (!jpegStat.isFile() || jpegStat.size !== raw.byteLength)
340
+ throw new Error('missing JPEG');
341
+ entry = raw;
342
+ }
343
+ catch {
344
+ const id = name.slice(0, -5);
345
+ this.deletePairById(id);
346
+ continue;
347
+ }
348
+ if (this.inFlight.has(entry.id))
349
+ continue;
350
+ const feed = this.feedQueue(entry.name);
351
+ feed.items.push(entry);
352
+ feed.enqueued++;
353
+ this.queued++;
354
+ this.persisted++;
355
+ this.persistedBytes += entry.byteLength;
356
+ this.enqueued++;
357
+ this.recovered++;
358
+ }
359
+ for (const feed of this.feeds.values()) {
360
+ this.sortFeed(feed);
361
+ while (feed.items.length > this.maxPerFeed)
362
+ this.evictOldestOf(feed);
363
+ }
364
+ this.expire(this.now());
365
+ while (this.persisted > this.maxFrames || this.persistedBytes > this.maxBytes) {
366
+ if (!this.evictFromFullestFeed())
367
+ break;
368
+ }
369
+ // Remove JPEGs that have no committed metadata record. Metadata is written
370
+ // last, so an orphan JPEG is an interrupted offer, never recoverable work.
371
+ const known = new Set([
372
+ ...[...this.feeds.values()].flatMap((f) => f.items.map((e) => e.id)),
373
+ ...this.inFlight.keys(),
374
+ ]);
375
+ for (const name of names.filter((n) => /^[a-f0-9]+\.jpg$/.test(n))) {
376
+ const id = name.slice(0, -4);
377
+ if (!known.has(id))
378
+ this.deletePairById(id);
379
+ }
380
+ }
381
+ validRecord(value) {
382
+ return Boolean(value &&
383
+ value.version === RECORD_VERSION &&
384
+ /^[a-f0-9]+$/.test(value.id) &&
385
+ typeof value.name === 'string' && value.name.length > 0 &&
386
+ Number.isFinite(value.enqueuedAtMs) &&
387
+ Number.isFinite(value.availableAtMs) &&
388
+ typeof value.captureMode === 'string' &&
389
+ typeof value.reason === 'string' &&
390
+ Number.isFinite(value.byteLength) && value.byteLength > 0 &&
391
+ Number.isFinite(value.attempts) && value.attempts >= 0);
392
+ }
393
+ writePair(entry, jpeg) {
394
+ const jpegPath = this.jpegPath(entry.id);
395
+ const metadataPath = this.metadataPath(entry.id);
396
+ try {
397
+ fs.writeFileSync(`${jpegPath}.tmp`, jpeg, { flag: 'wx', mode: 0o600 });
398
+ fs.renameSync(`${jpegPath}.tmp`, jpegPath);
399
+ fs.writeFileSync(`${metadataPath}.tmp`, JSON.stringify(entry), { flag: 'wx', mode: 0o600 });
400
+ fs.renameSync(`${metadataPath}.tmp`, metadataPath);
401
+ return true;
402
+ }
403
+ catch {
404
+ this.writeFailed++;
405
+ this.deletePairById(entry.id);
406
+ return false;
407
+ }
408
+ }
409
+ writeMetadata(entry) {
410
+ const metadataPath = this.metadataPath(entry.id);
411
+ const tmp = `${metadataPath}.tmp`;
412
+ try {
413
+ try {
414
+ fs.unlinkSync(tmp);
415
+ }
416
+ catch { /* absent is normal */ }
417
+ fs.writeFileSync(tmp, JSON.stringify(entry), { mode: 0o600 });
418
+ fs.renameSync(tmp, metadataPath);
419
+ }
420
+ catch {
421
+ this.writeFailed++;
422
+ try {
423
+ fs.unlinkSync(tmp);
424
+ }
425
+ catch { /* best-effort */ }
426
+ }
427
+ }
428
+ asCandidate(entry, jpeg) {
429
+ return {
430
+ name: entry.name,
431
+ jpeg,
432
+ enqueuedAtMs: entry.enqueuedAtMs,
433
+ captureMode: entry.captureMode,
434
+ reason: entry.reason,
435
+ signature: entry.signature,
436
+ imageWidth: entry.imageWidth,
437
+ imageHeight: entry.imageHeight,
438
+ spoolId: entry.id,
439
+ };
440
+ }
441
+ feedQueue(name) {
442
+ let feed = this.feeds.get(name);
443
+ if (!feed) {
444
+ feed = { name, items: [], enqueued: 0, served: 0, evicted: 0, expired: 0 };
445
+ this.feeds.set(name, feed);
446
+ }
447
+ return feed;
448
+ }
449
+ sortFeed(feed) {
450
+ feed.items.sort((a, b) => a.enqueuedAtMs - b.enqueuedAtMs || a.id.localeCompare(b.id));
451
+ }
452
+ nextEligible(now) {
453
+ let best = null;
454
+ let bestOrder = Infinity;
455
+ for (const feed of this.feeds.values()) {
456
+ const index = feed.items.findIndex((entry) => entry.availableAtMs <= now);
457
+ if (index < 0)
458
+ continue;
459
+ const entry = feed.items[index];
460
+ const order = this.serveOrder.get(feed.name) ?? 0;
461
+ if (best === null ||
462
+ order < bestOrder ||
463
+ (order === bestOrder && entry.enqueuedAtMs < best.entry.enqueuedAtMs)) {
464
+ best = { feed, index, entry };
465
+ bestOrder = order;
466
+ }
467
+ }
468
+ return best;
469
+ }
470
+ evictFromFullestFeed() {
471
+ let victim = null;
472
+ for (const feed of this.feeds.values()) {
473
+ if (feed.items.length === 0)
474
+ continue;
475
+ if (victim === null ||
476
+ feed.items.length > victim.items.length ||
477
+ (feed.items.length === victim.items.length &&
478
+ feed.items[0].enqueuedAtMs < victim.items[0].enqueuedAtMs))
479
+ victim = feed;
480
+ }
481
+ if (!victim)
482
+ return false;
483
+ this.evictOldestOf(victim);
484
+ return true;
485
+ }
486
+ evictOldestOf(feed) {
487
+ const entry = feed.items.shift();
488
+ if (!entry)
489
+ return;
490
+ this.queued--;
491
+ feed.evicted++;
492
+ this.evicted++;
493
+ this.removePersisted(entry);
494
+ }
495
+ removePersisted(entry) {
496
+ this.deletePair(entry);
497
+ this.persisted = Math.max(0, this.persisted - 1);
498
+ this.persistedBytes = Math.max(0, this.persistedBytes - entry.byteLength);
499
+ }
500
+ deletePair(entry) {
501
+ this.deletePairById(entry.id);
502
+ }
503
+ deletePairById(id) {
504
+ // Metadata is queue visibility. Remove it before the JPEG so an accepted
505
+ // frame cannot be recovered and posted twice if Windows temporarily holds
506
+ // the image file open. A leftover JPEG is an inert orphan that recover()
507
+ // cleans; a leftover metadata record could otherwise become live work.
508
+ for (const file of [this.metadataPath(id), `${this.metadataPath(id)}.tmp`, this.jpegPath(id), `${this.jpegPath(id)}.tmp`]) {
509
+ try {
510
+ fs.unlinkSync(file);
511
+ }
512
+ catch (err) {
513
+ if (err.code !== 'ENOENT')
514
+ this.deleteFailed++;
515
+ }
516
+ }
517
+ }
518
+ jpegPath(id) { return path.join(this.directory, `${id}.jpg`); }
519
+ metadataPath(id) { return path.join(this.directory, `${id}.json`); }
520
+ }
521
+ exports.DurableVlmCandidateSpool = DurableVlmCandidateSpool;
522
+ //# sourceMappingURL=DurableVlmCandidateSpool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DurableVlmCandidateSpool.js","sourceRoot":"","sources":["../src/DurableVlmCandidateSpool.ts"],"names":[],"mappings":"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"}
package/dist/EdgeAgent.js CHANGED
@@ -44,7 +44,7 @@ const edge_ads_1 = require("@trillboards/edge-ads");
44
44
  const CommandRouter_1 = require("./CommandRouter");
45
45
  const config_1 = require("./config");
46
46
  const dataDir_1 = require("./dataDir");
47
- const SDK_VERSION = '0.2.42';
47
+ const SDK_VERSION = '0.2.49';
48
48
  class EdgeAgent extends events_1.EventEmitter {
49
49
  constructor(config, deps) {
50
50
  super();