plevinjs 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/reader.js ADDED
@@ -0,0 +1,461 @@
1
+ /** The file format: one address in, the stored rows out, codes as words. */
2
+ import { decompress, loadDictionary } from "./zstd.js";
3
+ const MAGIC = "PLEVIN\0";
4
+ const FORMAT = 1;
5
+ const CACHED = 1 << 14;
6
+ const DEGREES = 10000;
7
+ const UNSEEN = 255;
8
+ const RECORDS = 1 << 14;
9
+ const CARRIED = ["place", "network", "abuse", "prefix", "rpki", "roas"];
10
+ const LINKED = new Set(["place", "network", "abuse"]);
11
+ const SPAN = "network";
12
+ const BOOKS = {
13
+ rpki: "rpki",
14
+ "place.granularity": "granularity",
15
+ "city.timezone": "timezones",
16
+ "city.type": "place_types",
17
+ "operator.category": "categories",
18
+ "abuse.user_type": "categories",
19
+ "abuse.service": "services",
20
+ "abuse.evidence": "evidence",
21
+ };
22
+ const risk = (value) => (value === UNSEEN ? null : value / 100);
23
+ const READS = {
24
+ "abuse.risk": risk,
25
+ "abuse.is_anycast": Boolean,
26
+ "abuse.is_satellite": Boolean,
27
+ };
28
+ const decoder = new TextDecoder();
29
+ const BIG_ENDIAN = new Uint8Array(Uint16Array.of(1).buffer)[0] === 0;
30
+ class Cache {
31
+ held = new Map();
32
+ build;
33
+ limit;
34
+ constructor(build, limit = CACHED) {
35
+ this.build = build;
36
+ this.limit = limit;
37
+ }
38
+ get(key) {
39
+ const found = this.held.get(key);
40
+ if (found !== undefined)
41
+ return found;
42
+ if (this.held.size >= this.limit)
43
+ this.held.clear();
44
+ const built = this.build(key);
45
+ this.held.set(key, built);
46
+ return built;
47
+ }
48
+ clear() {
49
+ this.held.clear();
50
+ }
51
+ }
52
+ const varint = (data, at) => {
53
+ let value = 0;
54
+ let shift = 1;
55
+ for (;;) {
56
+ const byte = data[at];
57
+ at += 1;
58
+ value += (byte & 0x7f) * shift;
59
+ if (byte < 0x80)
60
+ return [value, at];
61
+ shift *= 128;
62
+ }
63
+ };
64
+ const varints = (data, at, count) => {
65
+ const values = [];
66
+ for (let held = 0; held < count; held += 1) {
67
+ const [value, next] = varint(data, at);
68
+ values.push(value);
69
+ at = next;
70
+ }
71
+ return [values, at];
72
+ };
73
+ const bigVarints = (data, at, count) => {
74
+ const values = [];
75
+ for (let held = 0; held < count; held += 1) {
76
+ let value = 0n;
77
+ let shift = 0n;
78
+ for (;;) {
79
+ const byte = data[at];
80
+ at += 1;
81
+ value |= BigInt(byte & 0x7f) << shift;
82
+ if (byte < 0x80)
83
+ break;
84
+ shift += 7n;
85
+ }
86
+ values.push(value);
87
+ }
88
+ return [values, at];
89
+ };
90
+ /** A block is what the codec packed; a group is all of one a lookup decodes. */
91
+ class Section {
92
+ count;
93
+ read;
94
+ perBlock;
95
+ perGroup;
96
+ fanout;
97
+ width;
98
+ blocks;
99
+ keys;
100
+ offsets;
101
+ data;
102
+ dictionary;
103
+ cache;
104
+ groups;
105
+ constructor(view, entry) {
106
+ const held = new DataView(view.buffer, view.byteOffset, view.byteLength);
107
+ this.count = entry.count;
108
+ this.read = entry.read;
109
+ this.perBlock = entry.block;
110
+ this.perGroup = entry.group;
111
+ this.fanout = this.perBlock / this.perGroup;
112
+ this.blocks = held.getUint32(0, true);
113
+ this.width = held.getUint32(4, true);
114
+ const book = held.getUint32(8, true);
115
+ this.offsets = new Uint32Array(this.blocks + 1);
116
+ for (let index = 0; index <= this.blocks; index += 1) {
117
+ this.offsets[index] = held.getUint32(12 + index * 4, true);
118
+ }
119
+ let at = 12 + 4 * (this.blocks + 1);
120
+ this.keys = [];
121
+ for (let index = 0; index < this.blocks; index += 1) {
122
+ let key = 0n;
123
+ for (let step = 0; step < this.width; step += 1) {
124
+ key = (key << 8n) | BigInt(view[at + index * this.width + step]);
125
+ }
126
+ this.keys.push(key);
127
+ }
128
+ at += this.width * this.blocks;
129
+ this.dictionary = book ? loadDictionary(view.subarray(at, at + book)) : null;
130
+ this.data = view.subarray(at + book);
131
+ this.cache = new Cache((index) => this.block(index));
132
+ this.groups = new Cache((group) => this.values(group));
133
+ }
134
+ raw(index) {
135
+ const block = this.data.subarray(this.offsets[index], this.offsets[index + 1]);
136
+ return decompress(block, this.dictionary);
137
+ }
138
+ held(group) {
139
+ return Math.min(this.perGroup, this.count - group * this.perGroup);
140
+ }
141
+ block(index) {
142
+ throw new Error(`no block ${index}`);
143
+ }
144
+ values(group) {
145
+ throw new Error(`no group ${group}`);
146
+ }
147
+ at(row) {
148
+ throw new Error(`no row ${row}`);
149
+ }
150
+ }
151
+ const KINDS = {
152
+ 1: [Uint8Array, Int8Array],
153
+ 2: [Uint16Array, Int16Array],
154
+ 4: [Uint32Array, Int32Array],
155
+ 8: [BigUint64Array, BigInt64Array],
156
+ };
157
+ /** A block is one array: reading a value is a subscript, and never a decode. */
158
+ class Column extends Section {
159
+ signed;
160
+ constructor(view, entry) {
161
+ super(view, entry);
162
+ this.signed = entry.encoding === "signed";
163
+ }
164
+ block(index) {
165
+ const raw = this.raw(index);
166
+ const width = raw[0];
167
+ const bytes = raw.slice(1);
168
+ if (BIG_ENDIAN && width > 1) {
169
+ for (let at = 0; at + width <= bytes.length; at += width) {
170
+ bytes.subarray(at, at + width).reverse();
171
+ }
172
+ }
173
+ return new KINDS[width][this.signed ? 1 : 0](bytes.buffer);
174
+ }
175
+ at(row) {
176
+ const index = Math.floor(row / this.perBlock);
177
+ const value = this.cache.get(index)[row % this.perBlock];
178
+ return typeof value === "bigint" ? Number(value) : value;
179
+ }
180
+ }
181
+ /** One pool, front-coded, restarting every group so a group decodes alone. */
182
+ class Strings extends Section {
183
+ block(index) {
184
+ const raw = this.raw(index);
185
+ const left = this.count - index * this.perBlock;
186
+ const total = Math.min(this.fanout, Math.ceil(left / this.perGroup)) - 1;
187
+ const [lengths, at] = varints(raw, 0, total);
188
+ const starts = [at];
189
+ for (const length of lengths)
190
+ starts.push(starts[starts.length - 1] + length);
191
+ starts.push(raw.length);
192
+ return [raw, starts];
193
+ }
194
+ values(group) {
195
+ const index = Math.floor(group / this.fanout);
196
+ const [raw, starts] = this.cache.get(index);
197
+ let cursor = starts[group % this.fanout];
198
+ const values = [];
199
+ let previous = new Uint8Array(0);
200
+ for (let held = 0; held < this.held(group); held += 1) {
201
+ const shared = raw[cursor];
202
+ let fresh = raw[cursor + 1];
203
+ cursor += 2;
204
+ if (fresh > 0x7f)
205
+ [fresh, cursor] = varint(raw, cursor - 1);
206
+ const value = new Uint8Array(shared + fresh);
207
+ value.set(previous.subarray(0, shared));
208
+ value.set(raw.subarray(cursor, cursor + fresh), shared);
209
+ cursor += fresh;
210
+ previous = value;
211
+ values.push(decoder.decode(value));
212
+ }
213
+ return values;
214
+ }
215
+ at(identifier) {
216
+ if (!identifier)
217
+ return "";
218
+ const group = Math.floor((identifier - 1) / this.perGroup);
219
+ return this.groups.get(group)[(identifier - 1) % this.perGroup];
220
+ }
221
+ }
222
+ /** The one section a lookup bisects: block keys, group heads, then gaps. */
223
+ class Index extends Section {
224
+ hostBits;
225
+ big;
226
+ constructor(view, entry) {
227
+ super(view, entry);
228
+ this.big = this.width !== 4;
229
+ this.hostBits = this.big ? 64 : 0;
230
+ }
231
+ block(index) {
232
+ const raw = this.raw(index);
233
+ const [count, start] = varint(raw, 0);
234
+ const total = Math.ceil(count / this.perGroup);
235
+ const [gaps, at] = bigVarints(raw, start, total - 1);
236
+ const heads = [this.keys[index]];
237
+ for (const gap of gaps)
238
+ heads.push(heads[heads.length - 1] + gap);
239
+ const [lengths, next] = varints(raw, at, total - 1);
240
+ const starts = [next];
241
+ for (const length of lengths)
242
+ starts.push(starts[starts.length - 1] + length);
243
+ return [heads, starts, raw];
244
+ }
245
+ values(group) {
246
+ const index = Math.floor(group / this.fanout);
247
+ const [heads, starts, raw] = this.cache.get(index);
248
+ const size = this.held(group);
249
+ const head = heads[group % this.fanout];
250
+ const [gaps, cursor] = this.big
251
+ ? bigVarints(raw, starts[group % this.fanout], size - 1)
252
+ : varints(raw, starts[group % this.fanout], size - 1);
253
+ if (!this.big) {
254
+ const values = [Number(head)];
255
+ for (const gap of gaps) {
256
+ values.push(values[values.length - 1] + gap);
257
+ }
258
+ return values;
259
+ }
260
+ const networks = [head >> BigInt(this.hostBits)];
261
+ for (const gap of gaps) {
262
+ networks.push(networks[networks.length - 1] + gap);
263
+ }
264
+ const [hosts] = bigVarints(raw, cursor, size);
265
+ return networks.map((network, at) => (network << BigInt(this.hostBits)) | hosts[at]);
266
+ }
267
+ at(row) {
268
+ const group = Math.floor(row / this.perGroup);
269
+ return this.groups.get(group)[row % this.perGroup];
270
+ }
271
+ /** The row whose address covers this one, or null below the first of them. */
272
+ row(address) {
273
+ const held = this.big ? address : address;
274
+ const index = bisect(this.keys, this.big ? held : BigInt(held)) - 1;
275
+ if (index < 0)
276
+ return null;
277
+ const [heads] = this.cache.get(index);
278
+ const group = index * this.fanout + bisect(heads, this.big ? held : BigInt(held)) - 1;
279
+ const spot = bisect(this.groups.get(group), held) - 1;
280
+ return spot < 0 ? null : group * this.perGroup + spot;
281
+ }
282
+ /** The row the address is stored at, or null where the file does not name it. */
283
+ holds(address) {
284
+ const row = this.row(address);
285
+ return row !== null && this.at(row) === address ? row : null;
286
+ }
287
+ }
288
+ const bisect = (values, held) => {
289
+ let low = 0;
290
+ let high = values.length;
291
+ while (low < high) {
292
+ const middle = (low + high) >> 1;
293
+ if (values[middle] <= held)
294
+ low = middle + 1;
295
+ else
296
+ high = middle;
297
+ }
298
+ return low;
299
+ };
300
+ const EMPTY = { plain: [], text: [], degrees: [], coded: [], links: [] };
301
+ /** The database in memory, read a group at a time. */
302
+ export class File {
303
+ head;
304
+ sections = {};
305
+ reads = {};
306
+ tables = {};
307
+ families;
308
+ rows = {};
309
+ located;
310
+ answers = new Cache((key) => this.answer(key));
311
+ constructor(bytes) {
312
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
313
+ const magic = decoder.decode(bytes.subarray(0, MAGIC.length));
314
+ if (magic !== MAGIC || bytes[MAGIC.length] !== FORMAT) {
315
+ throw new Error(`not a plevin ${FORMAT} database`);
316
+ }
317
+ const size = view.getUint32(MAGIC.length + 1, true);
318
+ const head = MAGIC.length + 5;
319
+ this.head = JSON.parse(decoder.decode(bytes.subarray(head, head + size)));
320
+ const body = head + size;
321
+ for (const [name, entry] of Object.entries(this.head.sections)) {
322
+ const at = body + entry.offset;
323
+ const held = bytes.subarray(at, at + entry.bytes);
324
+ const kind = entry.encoding === "index"
325
+ ? Index
326
+ : entry.encoding === "front"
327
+ ? Strings
328
+ : Column;
329
+ this.sections[name] = new kind(held, entry);
330
+ }
331
+ Object.assign(this.reads, READS);
332
+ for (const [field, book] of Object.entries(BOOKS)) {
333
+ const words = this.head.vocabularies[book];
334
+ if (words)
335
+ this.reads[field] = (code) => words[code] ?? "";
336
+ }
337
+ this.plan();
338
+ this.families = { 4: this.family(4), 6: this.family(6) };
339
+ this.located = {
340
+ 4: new Cache((address) => this.locateIn(4, address)),
341
+ 6: new Cache((address) => this.locateIn(6, address)),
342
+ };
343
+ }
344
+ /** A row of a table, kept: a city is read once however many link to it. */
345
+ linked(table, row) {
346
+ this.rows[table] ??= new Cache((held) => this.row(table, held));
347
+ return this.rows[table].get(row);
348
+ }
349
+ get built() {
350
+ return this.head.built;
351
+ }
352
+ get selection() {
353
+ return this.head.selection;
354
+ }
355
+ get fields() {
356
+ return this.head.fields;
357
+ }
358
+ /** Each table's columns split by how they decode, so a read never branches. */
359
+ plan() {
360
+ for (const [name, section] of Object.entries(this.sections)) {
361
+ const parts = name.split(".");
362
+ if (parts.length !== 3 || (parts[0] !== "col" && parts[0] !== "link"))
363
+ continue;
364
+ const [kind, table, field] = parts;
365
+ this.tables[table] ??= { plain: [], text: [], degrees: [], coded: [], links: [] };
366
+ const plan = this.tables[table];
367
+ const read = this.reads[`${table}.${field}`];
368
+ if (kind === "link")
369
+ plan.links.push([field, section]);
370
+ else if (read)
371
+ plan.coded.push([field, section, read]);
372
+ else if (section.read === "text")
373
+ plan.text.push([field, section, this.sections.strings]);
374
+ else if (section.read)
375
+ plan.degrees.push([field, section]);
376
+ else
377
+ plan.plain.push([field, section]);
378
+ }
379
+ }
380
+ /** The index a lookup bisects, the columns read at that row, and the hosts. */
381
+ family(version) {
382
+ const spine = `spine.v${version}`;
383
+ const hosts = `hosts.v${version}`;
384
+ return {
385
+ index: this.sections[spine] ?? null,
386
+ columns: CARRIED.filter((name) => `${spine}.${name}` in this.sections).map((name) => [name, this.sections[`${spine}.${name}`], this.reads[name] ?? null]),
387
+ hosts: this.sections[hosts] ?? null,
388
+ records: this.sections[`${hosts}.abuse`] ?? null,
389
+ };
390
+ }
391
+ row(table, row) {
392
+ const plan = this.tables[table] ?? EMPTY;
393
+ const out = {};
394
+ for (const [field, section] of plan.plain)
395
+ out[field] = section.at(row);
396
+ for (const [field, section, pool] of plan.text) {
397
+ out[field] = pool.at(section.at(row));
398
+ }
399
+ for (const [field, section] of plan.degrees) {
400
+ out[field] = section.at(row) / DEGREES;
401
+ }
402
+ for (const [field, section, read] of plan.coded) {
403
+ out[field] = read(section.at(row));
404
+ }
405
+ for (const [target, section] of plan.links) {
406
+ const linked = section.at(row);
407
+ if (linked)
408
+ out[target] = this.linked(target, linked - 1);
409
+ }
410
+ if ("postal_partial" in out) {
411
+ out.postal_partial = String(out.postal).slice(0, out.postal_partial);
412
+ }
413
+ return out;
414
+ }
415
+ /** The columns the boundary reads, cached by the row rather than its values. */
416
+ answer(key) {
417
+ const version = key % 2 ? 6 : 4;
418
+ const held = (key - (key % 2)) / 2;
419
+ const override = held % RECORDS;
420
+ const row = (held - override) / RECORDS;
421
+ const out = {};
422
+ for (const [name, column, read] of this.families[version].columns) {
423
+ const value = override && name === "abuse" ? override : column.at(row);
424
+ if (LINKED.has(name)) {
425
+ if (value)
426
+ out[name] = this.linked(name, value - 1);
427
+ }
428
+ else {
429
+ out[SPAN] ??= {};
430
+ out[SPAN][name] = read ? read(value) : value;
431
+ }
432
+ }
433
+ return out;
434
+ }
435
+ /** Which boundary answers, and the record a host overrides it with. */
436
+ locateIn(version, address) {
437
+ const { index, hosts, records } = this.families[version];
438
+ const row = index === null ? null : index.row(address);
439
+ if (row === null)
440
+ return null;
441
+ if (hosts === null || records === null)
442
+ return [version, row, 0];
443
+ const at = hosts.holds(address);
444
+ return [version, row, at === null ? 0 : records.at(at) + 1];
445
+ }
446
+ /** Which boundary and host record answer, kept so a repeat never bisects. */
447
+ locate(value, wide) {
448
+ return this.located[wide ? 6 : 4].get(value);
449
+ }
450
+ /** The stored answer, or null where the file covers nothing; do not edit it. */
451
+ rowFor(value, wide) {
452
+ const found = this.locate(value, wide);
453
+ return found === null ? null : this.answerFor(found);
454
+ }
455
+ /** One boundary as the file stores it, shared by every address it covers. */
456
+ answerFor(found) {
457
+ const [version, row, override] = found;
458
+ return this.answers.get((row * RECORDS + override) * 2 + (version === 6 ? 1 : 0));
459
+ }
460
+ }
461
+ //# sourceMappingURL=reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reader.js","sourceRoot":"","sources":["../src/reader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** The abbreviation each zone goes by, standard first and daylight second. */
2
+ export declare const ZONES: string[];
3
+ //# sourceMappingURL=zones.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zones.d.ts","sourceRoot":"","sources":["../src/zones.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAE9E,eAAO,MAAM,KAAK,UAkXJ,CAAC"}