UNPKG

gnablib

Version:

A lean, zero dependency library to provide a useful base for your project.

2 lines 1.6 kB
/*! Copyright 2023-2025 the gnablib contributors MPL-1.1 */ import{Cidr as t}from"./Cidr.js";import{IpV4 as r}from"./Ip.js";const o=Symbol.for("nodejs.util.inspect.custom"),e="IpTree";class s{constructor(t){this.value=t}contains(t,r){return!0}output(t,r,o){o(t,31-r,this.value)}}class i{constructor(){this.value=void 0}contains(t,r){return!1}output(t,r,o){}}class n{constructor(){this.value=void 0,this._left=new i,this._right=new i}contains(t,r){return t>>r&1?this._right.contains(t,r-1):this._left.contains(t,r-1)}output(t,r,o){if(r<0)throw new Error("C'est impossible");this._left.output(t,r-1,o),this._right.output(t|1<<r,r-1,o)}static add(t,r,o,e,i,u){if(t instanceof s)return t;if(o<=e)return new s(i);const a=t instanceof n?t:new n;return r>>o&1?a._right=n.add(a._right,r,o-1,e,i,u):a._left=n.add(a._left,r,o-1,e,i,u),a._left instanceof s&&a._right instanceof s?new s(u(a._left.value,a._right.value)):a}}function u(t,r){return t}export class IpTree{constructor(t){this._root=new i,this._merge=t||u}addIp(t,r){this._root=n.add(this._root,t.valueOf(),31,-1,r,this._merge)}addRange(t,r,o){let e=t.valueOf();const s=r.valueOf();for(;e<=s;){let t=e-1&~e;for(;e+t>s;)t>>=1;let r=-1,i=t;for(;0!=i;)r++,i>>=1;this._root=n.add(this._root,e,31,r,o,this._merge),e+=t+1}}addCidr(t,r){this._root=n.add(this._root,t.startIp.valueOf(),31,31-t.mask,r,this._merge)}contains(t){return this._root.contains(t.valueOf(),31)}listCidr(){const o=[];return this._root.output(0,31,((e,s,i)=>o.push({cidr:new t(r.fromInt(e),s),value:i}))),o}get[Symbol.toStringTag](){return e}[o](){return`${e}(${this.toString()})`}}