Pure, WASM-ready behavioral firewall engine for the napplet protocol — zero dependencies, zero side effects.
Alpha status: Kehto is an early runtime implementation for a draft NIP-5D protocol. The firewall engine API is not yet final; treat this package as current implementation guidance, not as a stable protocol guarantee.
pnpm add @kehto/firewall
@kehto/firewall is Kehto's behavioral abuse-detection engine. It is the temporal complement to @kehto/acl: where ACL asks "is this napplet statically allowed to perform this operation?", the firewall asks "is this napplet abusing an operation over time?".
Every function is pure: config + state + observation in, decision + next state out. No I/O, no timers, no globals — the module is trivially compilable to WASM and is the single source of truth for behavioral-firewall decisions.
The core evaluate(config, state, observation) function implements:
(napplet dTag, opClass) pair with O(1) lazy refill.import {
evaluate,
defaultConfig,
createState,
} from '@kehto/firewall';
const config = defaultConfig();
let state = createState();
const obs = {
napplet: 'chat',
opClass: 'relay:write',
focused: true,
now: Date.now(),
};
const result = evaluate(config, state, obs);
// result.decision: 'pass' | 'reject' | 'prompt'
// result.newState: updated counter state (original unchanged)
state = result.newState;
Observation — normalized engine input (never a raw protocol envelope)FirewallConfig — immutable configuration container (rules + defaults)FirewallState — immutable counter state (token buckets + burst counters)EvaluateResult — { decision, action, ruleId, reason, newState }Decision — 'pass' | 'reject' | 'prompt'Action — 'flag' | 'block' | 'ignore'NappletPolicy — 'allow' | 'deny' | 'ask'RateLimit, BurstGuard, ContentMatcher, NappletRulesBucket, BurstCounterDEFAULT_RATE_LIMIT, DEFAULT_BURST_GUARDDEFAULT_EXCEED_ACTION, DEFAULT_BURST_ACTIONDEFAULT_UNFOCUSED_MULTIPLIERevaluate — pure decision function (config + state + observation → result)toKey — derive the napplet:opClass bucket keydefaultConfig — built-in conservative configcreateState — empty counter statesetPolicy, setRateLimit, addMatcher — immutable config mutationsserialize, deserialize — JSON round-trip for persistenceMIT
@kehto/firewall — Pure, WASM-ready behavioral firewall engine for the napplet protocol.
Zero dependencies. Zero side effects. All functions are pure: config + state + observation in, decision + next-state out. Designed for deterministic rate-limiting decisions that could be compiled to WASM without modification (the WASM-ready boundary).
Example