dns-message 1.0.4 → 1.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/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # dns-message
2
2
 
3
+ ## 1.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Add `compareAnswers` utility for lexicographic sorting
8
+ Submitted by [@kitten](https://github.com/kitten) (See [#15](https://github.com/kitten/dns-message/pull/15))
9
+
3
10
  ## 1.0.4
4
11
 
5
12
  ### Patch Changes
@@ -423,6 +423,7 @@ type Answer =
423
423
  | HttpsAnswer
424
424
  | NullAnswer
425
425
  | UnknownAnswer;
426
+ declare const compareAnswers: (a: Answer, b: Answer) => number;
426
427
 
427
428
  interface Packet {
428
429
  id?: number;
@@ -449,6 +450,7 @@ export {
449
450
  RecordClass,
450
451
  RecordType,
451
452
  SvcParamCode,
453
+ compareAnswers,
452
454
  decode,
453
455
  encode,
454
456
  encodingLength,
@@ -329,7 +329,7 @@ const y = {
329
329
  }
330
330
  };
331
331
 
332
- const U = {
332
+ const h = {
333
333
  bytes: () => 16,
334
334
  write(t, e, r) {
335
335
  const n = r.indexOf("::");
@@ -419,20 +419,26 @@ const advance = (t, e) => {
419
419
  t.length &= ~(t.length >> 31);
420
420
  };
421
421
 
422
+ const encodeIntoBuffer = (t, e) => {
423
+ const r = new ArrayBuffer(t.bytes(e));
424
+ const n = t.write(new DataView(r), 0, e);
425
+ return new Uint8Array(r, 0, n);
426
+ };
427
+
422
428
  const sliceView = (t, e, r = e.length) => {
423
429
  const n = new Uint8Array(t.buffer, t.byteOffset + e.offset, r);
424
430
  advance(e, r);
425
431
  return n;
426
432
  };
427
433
 
428
- const h = 32768;
434
+ const U = 32768;
429
435
 
430
- const w = {
436
+ const b = {
431
437
  bytes: t => c.bytes(t.name) + 4,
432
438
  write(t, e, n) {
433
439
  let s = n.class || r.IN;
434
440
  if (n.qu) {
435
- s |= h;
441
+ s |= U;
436
442
  }
437
443
  e = c.write(t, e, n.name);
438
444
  t.setUint16(e, n.type);
@@ -444,7 +450,7 @@ const w = {
444
450
  const s = t.getUint16(e.offset);
445
451
  let a = t.getUint16(e.offset + 2) || r.ANY;
446
452
  let i = !1;
447
- if (a !== r.ANY && a & h) {
453
+ if (a !== r.ANY && a & U) {
448
454
  a &= -32769;
449
455
  i = !0;
450
456
  }
@@ -458,7 +464,7 @@ const w = {
458
464
  }
459
465
  };
460
466
 
461
- let b = function(t) {
467
+ let w = function(t) {
462
468
  t[t.v4 = 1] = "v4";
463
469
  t[t.v6 = 2] = "v6";
464
470
  return t;
@@ -473,26 +479,22 @@ const p = withRDLength({
473
479
  })
474
480
  });
475
481
 
476
- const E = "(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])";
482
+ const A = "(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])";
477
483
 
478
- const A = new RegExp(`^${`(?:${E}\\.){3}${E}`}$`);
484
+ const E = new RegExp(`^${`(?:${A}\\.){3}${A}`}$`);
479
485
 
480
486
  const N = withRDLength({
481
487
  bytes: t => Math.ceil((t.sourcePrefixLength || 0) / 8) + 4,
482
488
  write(t, e, r) {
483
489
  const n = r.sourcePrefixLength || 0;
484
490
  const s = r.scopePrefixLength || 0;
485
- const a = r.family || (A.test(r.ip) ? b.v4 : b.v6);
491
+ const a = r.family || (E.test(r.ip) ? w.v4 : w.v6);
486
492
  const i = Math.ceil(n / 8);
487
493
  t.setUint16(e, a);
488
494
  t.setUint8(e + 2, n);
489
495
  t.setUint8(e + 3, s);
490
496
  e += 4;
491
- const o = ((t, e) => {
492
- const r = new ArrayBuffer(t.bytes(e));
493
- const n = t.write(new DataView(r), 0, e);
494
- return new Uint8Array(r, 0, n);
495
- })(a === b.v4 ? g : U, r.ip);
497
+ const o = encodeIntoBuffer(a === w.v4 ? g : h, r.ip);
496
498
  for (let r = 0; r < i; r++) {
497
499
  t.setUint8(e++, o[r]);
498
500
  }
@@ -508,7 +510,7 @@ const N = withRDLength({
508
510
  family: r,
509
511
  sourcePrefixLength: n,
510
512
  scopePrefixLength: a,
511
- ip: r === b.v4 ? g.read(t, e) : U.read(t, e)
513
+ ip: r === w.v4 ? g.read(t, e) : h.read(t, e)
512
514
  };
513
515
  }
514
516
  });
@@ -657,11 +659,11 @@ const D = withRDLength(array(y));
657
659
 
658
660
  const C = withRDLength(array(u));
659
661
 
660
- const m = withRDLength(y);
662
+ const O = withRDLength(y);
661
663
 
662
- const O = withRDLength(array(g));
664
+ const m = withRDLength(array(g));
663
665
 
664
- const L = withRDLength(array(U));
666
+ const L = withRDLength(array(h));
665
667
 
666
668
  const v = withRDLength(f);
667
669
 
@@ -678,10 +680,10 @@ const x = {
678
680
  e += 4;
679
681
  }
680
682
  if (null != t.port) {
681
- e += m.bytes(t.port) + 2;
683
+ e += O.bytes(t.port) + 2;
682
684
  }
683
685
  if (t.ipv4hint) {
684
- e += O.bytes(t.ipv4hint) + 2;
686
+ e += m.bytes(t.ipv4hint) + 2;
685
687
  }
686
688
  if (t.ipv6hint) {
687
689
  e += L.bytes(t.ipv6hint) + 2;
@@ -713,11 +715,11 @@ const x = {
713
715
  }
714
716
  if (null != r.port) {
715
717
  t.setUint16(e, R.Port);
716
- e = m.write(t, e + 2, r.port);
718
+ e = O.write(t, e + 2, r.port);
717
719
  }
718
720
  if (r.ipv4hint) {
719
721
  t.setUint16(e, R.Ipv4Hint);
720
- e = O.write(t, e + 2, r.ipv4hint);
722
+ e = m.write(t, e + 2, r.ipv4hint);
721
723
  }
722
724
  if (r.ipv6hint) {
723
725
  t.setUint16(e, R.Ipv6Hint);
@@ -768,11 +770,11 @@ const x = {
768
770
  break;
769
771
 
770
772
  case R.Port:
771
- s.port = m.read(t, e);
773
+ s.port = O.read(t, e);
772
774
  break;
773
775
 
774
776
  case R.Ipv4Hint:
775
- s.ipv4hint = O.read(t, e);
777
+ s.ipv4hint = m.read(t, e);
776
778
  break;
777
779
 
778
780
  case R.Ipv6Hint:
@@ -801,15 +803,15 @@ const x = {
801
803
 
802
804
  const H = withRDLength(f);
803
805
 
804
- const _ = withRDLength(c);
806
+ const k = withRDLength(c);
805
807
 
806
808
  const M = withRDLength(g);
807
809
 
808
- const V = withRDLength(U);
810
+ const _ = withRDLength(h);
809
811
 
810
- const Y = withRDLength(array(u));
812
+ const V = withRDLength(array(u));
811
813
 
812
- const K = withRDLength({
814
+ const Y = withRDLength({
813
815
  bytes: t => c.bytes(t.target) + 6,
814
816
  write(t, e, r) {
815
817
  t.setUint16(e, r.priority || 0);
@@ -833,7 +835,7 @@ const K = withRDLength({
833
835
  }
834
836
  });
835
837
 
836
- const X = withRDLength({
838
+ const K = withRDLength({
837
839
  bytes: t => u.bytes(t.cpu) + u.bytes(t.os),
838
840
  write(t, e, r) {
839
841
  e = u.write(t, e, r.cpu);
@@ -857,7 +859,7 @@ const toCaaTag = t => {
857
859
  }
858
860
  };
859
861
 
860
- const F = withRDLength({
862
+ const X = withRDLength({
861
863
  bytes: t => u.bytes(t.tag) + f.bytes(t.value) + 1,
862
864
  write(t, e, r) {
863
865
  let n = r.flags || 0;
@@ -880,7 +882,7 @@ const F = withRDLength({
880
882
  }
881
883
  });
882
884
 
883
- const G = withRDLength({
885
+ const F = withRDLength({
884
886
  bytes: t => c.bytes(t.mname) + c.bytes(t.rname) + 20,
885
887
  write(t, e, r) {
886
888
  e = c.write(t, e, r.mname);
@@ -908,7 +910,7 @@ const G = withRDLength({
908
910
  }
909
911
  });
910
912
 
911
- const B = withRDLength({
913
+ const G = withRDLength({
912
914
  bytes: t => c.bytes(t.exchange) + 2,
913
915
  write(t, e, r) {
914
916
  t.setUint16(e, r.preference || 0);
@@ -925,7 +927,7 @@ const B = withRDLength({
925
927
  }
926
928
  });
927
929
 
928
- const k = withRDLength({
930
+ const B = withRDLength({
929
931
  bytes: t => f.bytes(t.key) + 4,
930
932
  write(t, e, r) {
931
933
  t.setUint16(e, r.flags);
@@ -1149,28 +1151,28 @@ const nt = {
1149
1151
  return r + M.bytes(t.data);
1150
1152
 
1151
1153
  case e.NS:
1152
- return r + _.bytes(t.data);
1154
+ return r + k.bytes(t.data);
1153
1155
 
1154
1156
  case e.SOA:
1155
- return r + G.bytes(t.data);
1157
+ return r + F.bytes(t.data);
1156
1158
 
1157
1159
  case e.HINFO:
1158
- return r + X.bytes(t.data);
1160
+ return r + K.bytes(t.data);
1159
1161
 
1160
1162
  case e.MX:
1161
- return r + B.bytes(t.data);
1163
+ return r + G.bytes(t.data);
1162
1164
 
1163
1165
  case e.TXT:
1164
- return r + Y.bytes(t.data);
1166
+ return r + V.bytes(t.data);
1165
1167
 
1166
1168
  case e.RP:
1167
1169
  return r + q.bytes(t.data);
1168
1170
 
1169
1171
  case e.AAAA:
1170
- return r + V.bytes(t.data);
1172
+ return r + _.bytes(t.data);
1171
1173
 
1172
1174
  case e.SRV:
1173
- return r + K.bytes(t.data);
1175
+ return r + Y.bytes(t.data);
1174
1176
 
1175
1177
  case e.NAPTR:
1176
1178
  return r + Z.bytes(t.data);
@@ -1191,7 +1193,7 @@ const nt = {
1191
1193
  return r + Q.bytes(t.data);
1192
1194
 
1193
1195
  case e.DNSKEY:
1194
- return r + k.bytes(t.data);
1196
+ return r + B.bytes(t.data);
1195
1197
 
1196
1198
  case e.NSEC3:
1197
1199
  return r + j.bytes(t.data);
@@ -1204,12 +1206,12 @@ const nt = {
1204
1206
  return r + tt.bytes(t.data);
1205
1207
 
1206
1208
  case e.CAA:
1207
- return r + F.bytes(t.data);
1209
+ return r + X.bytes(t.data);
1208
1210
 
1209
1211
  case e.PTR:
1210
1212
  case e.CNAME:
1211
1213
  case e.DNAME:
1212
- return r + _.bytes(t.data);
1214
+ return r + k.bytes(t.data);
1213
1215
 
1214
1216
  default:
1215
1217
  return r + H.bytes(t.data);
@@ -1235,28 +1237,28 @@ const nt = {
1235
1237
  return M.write(t, r, n.data);
1236
1238
 
1237
1239
  case e.NS:
1238
- return _.write(t, r, n.data);
1240
+ return k.write(t, r, n.data);
1239
1241
 
1240
1242
  case e.SOA:
1241
- return G.write(t, r, n.data);
1243
+ return F.write(t, r, n.data);
1242
1244
 
1243
1245
  case e.HINFO:
1244
- return X.write(t, r, n.data);
1246
+ return K.write(t, r, n.data);
1245
1247
 
1246
1248
  case e.MX:
1247
- return B.write(t, r, n.data);
1249
+ return G.write(t, r, n.data);
1248
1250
 
1249
1251
  case e.TXT:
1250
- return Y.write(t, r, n.data);
1252
+ return V.write(t, r, n.data);
1251
1253
 
1252
1254
  case e.RP:
1253
1255
  return q.write(t, r, n.data);
1254
1256
 
1255
1257
  case e.AAAA:
1256
- return V.write(t, r, n.data);
1258
+ return _.write(t, r, n.data);
1257
1259
 
1258
1260
  case e.SRV:
1259
- return K.write(t, r, n.data);
1261
+ return Y.write(t, r, n.data);
1260
1262
 
1261
1263
  case e.NAPTR:
1262
1264
  return Z.write(t, r, n.data);
@@ -1274,7 +1276,7 @@ const nt = {
1274
1276
  return Q.write(t, r, n.data);
1275
1277
 
1276
1278
  case e.DNSKEY:
1277
- return k.write(t, r, n.data);
1279
+ return B.write(t, r, n.data);
1278
1280
 
1279
1281
  case e.NSEC3:
1280
1282
  return j.write(t, r, n.data);
@@ -1287,12 +1289,12 @@ const nt = {
1287
1289
  return tt.write(t, r, n.data);
1288
1290
 
1289
1291
  case e.CAA:
1290
- return F.write(t, r, n.data);
1292
+ return X.write(t, r, n.data);
1291
1293
 
1292
1294
  case e.PTR:
1293
1295
  case e.CNAME:
1294
1296
  case e.DNAME:
1295
- return _.write(t, r, n.data);
1297
+ return k.write(t, r, n.data);
1296
1298
 
1297
1299
  default:
1298
1300
  return H.write(t, r, n.data);
@@ -1333,23 +1335,23 @@ const nt = {
1333
1335
  return o;
1334
1336
 
1335
1337
  case e.NS:
1336
- o.data = _.read(t, r);
1338
+ o.data = k.read(t, r);
1337
1339
  return o;
1338
1340
 
1339
1341
  case e.SOA:
1340
- o.data = G.read(t, r);
1342
+ o.data = F.read(t, r);
1341
1343
  return o;
1342
1344
 
1343
1345
  case e.HINFO:
1344
- o.data = X.read(t, r);
1346
+ o.data = K.read(t, r);
1345
1347
  return o;
1346
1348
 
1347
1349
  case e.MX:
1348
- o.data = B.read(t, r);
1350
+ o.data = G.read(t, r);
1349
1351
  return o;
1350
1352
 
1351
1353
  case e.TXT:
1352
- o.data = Y.read(t, r);
1354
+ o.data = V.read(t, r);
1353
1355
  return o;
1354
1356
 
1355
1357
  case e.RP:
@@ -1357,11 +1359,11 @@ const nt = {
1357
1359
  return o;
1358
1360
 
1359
1361
  case e.AAAA:
1360
- o.data = V.read(t, r);
1362
+ o.data = _.read(t, r);
1361
1363
  return o;
1362
1364
 
1363
1365
  case e.SRV:
1364
- o.data = K.read(t, r);
1366
+ o.data = Y.read(t, r);
1365
1367
  return o;
1366
1368
 
1367
1369
  case e.NAPTR:
@@ -1385,7 +1387,7 @@ const nt = {
1385
1387
  return o;
1386
1388
 
1387
1389
  case e.DNSKEY:
1388
- o.data = k.read(t, r);
1390
+ o.data = B.read(t, r);
1389
1391
  return o;
1390
1392
 
1391
1393
  case e.NSEC3:
@@ -1402,13 +1404,13 @@ const nt = {
1402
1404
  return o;
1403
1405
 
1404
1406
  case e.CAA:
1405
- o.data = F.read(t, r);
1407
+ o.data = X.read(t, r);
1406
1408
  return o;
1407
1409
 
1408
1410
  case e.PTR:
1409
1411
  case e.CNAME:
1410
1412
  case e.DNAME:
1411
- o.data = _.read(t, r);
1413
+ o.data = k.read(t, r);
1412
1414
  return o;
1413
1415
 
1414
1416
  default:
@@ -1436,7 +1438,7 @@ const st = {
1436
1438
  let a = 12;
1437
1439
  let i = 0;
1438
1440
  for (i = 0; e && i < e.length; i++) {
1439
- a += w.bytes(e[i]);
1441
+ a += b.bytes(e[i]);
1440
1442
  }
1441
1443
  for (i = 0; r && i < r.length; i++) {
1442
1444
  a += nt.bytes(r[i]);
@@ -1461,7 +1463,7 @@ const st = {
1461
1463
  r += 12;
1462
1464
  let f = 0;
1463
1465
  for (f = 0; s && f < s.length; f++) {
1464
- r = w.write(e, r, s[f]);
1466
+ r = b.write(e, r, s[f]);
1465
1467
  }
1466
1468
  for (f = 0; a && f < a.length; f++) {
1467
1469
  r = nt.write(e, r, a[f]);
@@ -1487,7 +1489,7 @@ const st = {
1487
1489
  flags: s,
1488
1490
  rtype: 15 & s,
1489
1491
  type: s & t.RESPONSE ? t.RESPONSE : t.QUERY,
1490
- questions: readList(w, e, r, a),
1492
+ questions: readList(b, e, r, a),
1491
1493
  answers: readList(nt, e, r, i),
1492
1494
  authorities: readList(nt, e, r, o),
1493
1495
  additionals: readList(nt, e, r, c)
@@ -1505,6 +1507,117 @@ exports.RecordClass = r;
1505
1507
 
1506
1508
  exports.RecordType = e;
1507
1509
 
1510
+ exports.compareAnswers = (t, n) => {
1511
+ if (t.type === e.OPT || n.type === e.OPT) {
1512
+ return 0;
1513
+ }
1514
+ const s = t.class || r.IN;
1515
+ const a = n.class || r.IN;
1516
+ if (s !== a) {
1517
+ return s - a;
1518
+ } else if (t.type !== n.type) {
1519
+ return t.type - n.type;
1520
+ }
1521
+ let i;
1522
+ switch (t.type) {
1523
+ case e.A:
1524
+ i = M;
1525
+ break;
1526
+
1527
+ case e.NS:
1528
+ i = k;
1529
+ break;
1530
+
1531
+ case e.SOA:
1532
+ i = F;
1533
+ break;
1534
+
1535
+ case e.HINFO:
1536
+ i = K;
1537
+ break;
1538
+
1539
+ case e.MX:
1540
+ i = G;
1541
+ break;
1542
+
1543
+ case e.TXT:
1544
+ i = V;
1545
+ break;
1546
+
1547
+ case e.RP:
1548
+ i = q;
1549
+ break;
1550
+
1551
+ case e.AAAA:
1552
+ i = _;
1553
+ break;
1554
+
1555
+ case e.SRV:
1556
+ i = Y;
1557
+ break;
1558
+
1559
+ case e.NAPTR:
1560
+ i = Z;
1561
+ break;
1562
+
1563
+ case e.DS:
1564
+ i = W;
1565
+ break;
1566
+
1567
+ case e.SSHFP:
1568
+ i = z;
1569
+ break;
1570
+
1571
+ case e.RRSIG:
1572
+ i = $;
1573
+ break;
1574
+
1575
+ case e.NSEC:
1576
+ i = Q;
1577
+ break;
1578
+
1579
+ case e.DNSKEY:
1580
+ i = B;
1581
+ break;
1582
+
1583
+ case e.NSEC3:
1584
+ i = j;
1585
+ break;
1586
+
1587
+ case e.TLSA:
1588
+ i = J;
1589
+ break;
1590
+
1591
+ case e.SVCB:
1592
+ case e.HTTPS:
1593
+ i = tt;
1594
+ break;
1595
+
1596
+ case e.CAA:
1597
+ i = X;
1598
+ break;
1599
+
1600
+ case e.PTR:
1601
+ case e.CNAME:
1602
+ case e.DNAME:
1603
+ i = k;
1604
+ break;
1605
+
1606
+ default:
1607
+ i = H;
1608
+ }
1609
+ const o = encodeIntoBuffer(i, t.data);
1610
+ const c = encodeIntoBuffer(i, n.data);
1611
+ const f = o.byteLength < c.byteLength ? o.byteLength : c.byteLength;
1612
+ for (let t = 2; t < f; t++) {
1613
+ const e = o[t] - c[t];
1614
+ if (0 !== e) {
1615
+ return e < 0 ? -1 : 1;
1616
+ }
1617
+ }
1618
+ return o.byteLength !== c.byteLength ? o.byteLength < c.byteLength ? -1 : 1 : 0;
1619
+ };
1620
+
1508
1621
  exports.decode = function decode(t) {
1509
1622
  const e = "buffer" in t ? new DataView(t.buffer, t.byteOffset, t.byteLength) : new DataView(t);
1510
1623
  return st.read(e, {