20 lines
1.6 KiB
TypeScript
20 lines
1.6 KiB
TypeScript
import assert from "node:assert/strict"
|
|
import { ensureTrafficFlowHostKeys } from "./traffic-flow-key-execution.js"
|
|
let pair = {publicKey:"",privateKey:""},generated=0,writes=0
|
|
let release!:()=>void
|
|
const bothRead = new Promise<void>(resolve=>{release=resolve})
|
|
let initialReads=0
|
|
const deps = {
|
|
read:async()=>{const snapshot={...pair}; if(initialReads<2){initialReads++;if(initialReads===2)release();await bothRead} return snapshot},
|
|
generate:()=>{generated++;return {publicKey:"public-"+generated,privateKey:"private-"+generated}},
|
|
installIfMissing:async(keys:typeof pair)=>{writes++;if(pair.publicKey&&pair.privateKey)return false;pair=keys;return true},
|
|
}
|
|
const results=await Promise.all([ensureTrafficFlowHostKeys(deps),ensureTrafficFlowHostKeys(deps)])
|
|
assert.equal(generated,2);assert.equal(writes,2);assert.equal(results.filter(r=>r.created).length,1)
|
|
assert.equal(results[0].publicKey,results[1].publicKey);assert.equal(results[0].publicKey,pair.publicKey)
|
|
const before={...pair};assert.equal((await ensureTrafficFlowHostKeys(deps)).created,false);assert.deepEqual(pair,before);assert.equal(writes,2)
|
|
await assert.rejects(ensureTrafficFlowHostKeys({read:async()=>({publicKey:"",privateKey:""}),generate:deps.generate,installIfMissing:async()=>true}),/не подтверждено/)
|
|
let called=0
|
|
await assert.rejects(ensureTrafficFlowHostKeys({read:async()=>({publicKey:"",privateKey:""}),generate:deps.generate,installIfMissing:async()=>{called++;throw Error("DB failure")}}),/DB failure/)
|
|
assert.equal(called,1);console.log("NetFlow key execution: concurrent callers share winner, existing pair unchanged, unknown/failure never retried")
|