summaryrefslogtreecommitdiffstats
path: root/net/shunt/src/dedupe.uc
blob: 5b515baeb2ceed3e516cb7815f3d20dd969492a4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// shunt - write suppression
//
// Remembers which (set, address) pairs were written recently so a repeated
// DNS answer does not rewrite an element that is still fresh.
//
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright (c) 2026 Dirk Brenken <dev@brenken.org>

export function create(entry_ttl) {
	let last = {};

	function due(set, addr, now) {
		let k = `${set}/${addr}`;
		let t = last[k];

		if (t != null && (now - t) * 2 < entry_ttl)
			return false;

		last[k] = now;
		return true;
	}

	function prune(now) {
		let n = 0;

		for (let k in last) {
			if (now - last[k] >= entry_ttl) {
				delete last[k];
				n++;
			}
		}

		return n;
	}

	function size() {
		return length(keys(last));
	}

	return { due, prune, size };
};