'use strict'; const test = require('node:test'); const assert = require('node:assert/strict'); const { createScanSession } = require('../src/scan-session'); const camera = { alta_key: 'ABH7-C62U-GC3E', hostname: 'avacam-abh7-c62u-gc3e.local', web_ui_url: 'https://avacam-abh7-c62u-gc3e.local', ip_address: '10.0.0.223', port: 443, service: '_vaioncam._tcp.local', }; test('shares one scan, publishes defensive state, and binds camera URLs', async () => { let scanCalls = 0; let releaseScan; const scan = () => { scanCalls += 1; return new Promise((resolve) => { releaseScan = resolve; }); }; const times = [1000, 2345]; const session = createScanSession({ scan, now: () => times.shift() }); const first = session.scanOnce(); const second = session.scanOnce(); assert.strictEqual(first, second); assert.equal(scanCalls, 1); assert.equal(session.allowedCameraUrl(camera.web_ui_url), null); assert.deepEqual(session.getLatestCameras(), []); releaseScan([camera]); assert.deepEqual(await first, { ok: true, count: 1, duration_seconds: 1.3, cameras: [camera], }); assert.equal(session.allowedCameraUrl(camera.web_ui_url), camera.web_ui_url); assert.equal(session.allowedCameraUrl(`${camera.web_ui_url}/?secret=value`), null); assert.equal(session.allowedCameraUrl('https://avacam-ahg2-z4nd-fvrn.local'), null); const exposed = session.getLatestCameras(); exposed[0].alta_key = 'MUTATED'; assert.equal(session.getLatestCameras()[0].alta_key, camera.alta_key); }); test('revokes prior state at rescan and permits retry after failure', async () => { let call = 0; let releaseSecondScan; const scan = () => { call += 1; if (call === 1) return Promise.resolve([camera]); if (call === 2) return new Promise((_resolve, reject) => { releaseSecondScan = reject; }); return Promise.resolve([camera]); }; const session = createScanSession({ scan, now: () => 0 }); await session.scanOnce(); assert.equal(session.allowedCameraUrl(camera.web_ui_url), camera.web_ui_url); const failed = session.scanOnce(); assert.equal(session.allowedCameraUrl(camera.web_ui_url), null); assert.deepEqual(session.getLatestCameras(), []); releaseSecondScan(new Error('network failed')); await assert.rejects(failed, /network failed/); const retried = await session.scanOnce(); assert.equal(call, 3); assert.equal(retried.count, 1); });