;(function (exports) {
'use strict';

var Parser = (exports.DNS_PARSER || require('./dns.parser.js').DNS_PARSER);
var Packer = (exports.DNS_PACKER || require('./dns.packer.js').DNS_PACKER);
//var classes = exports.DNS_CLASSES || require('./dns.classes.js').DNS_CLASSES;
//var types = exports.DNS_TYPES || require('./dns.types.js').DNS_TYPES;
var logged = {};

exports.DNSPacket = {
  parse: function (nb) {
    // backwards compat with node buffer
    var ab = nb;
    if (nb.buffer) {
      // TODO pass byteOffsets to unpacker
      ab = nb.buffer.slice(nb.byteOffset, nb.byteOffset + nb.byteLength);
    }
    var packet = Parser.unpack(ab);

    function tryParseRdata(record) {

      try {

        record = Parser.unpackRdata(ab, packet, record);
      } catch (e) {
        record.error = e;
        if (!/^support for dns/i.test(e.message)) {
          console.error('[Error] unpackRdata: ' + e.message);
        }
        else if (!logged[e.message]) {
          console.error('[Error] unpackRdata: ' + e.message);
          logged[e.message] = true;
        }
      }
    }

    packet.answer.forEach(tryParseRdata);
    packet.authority.forEach(tryParseRdata);
    packet.additional.forEach(tryParseRdata);

    return packet;
  }
  // Backwards compat
, write: function (json) {
    return Buffer.from(Packer.pack(json));
  }
, pack: function (json) {
    return Packer.pack(json);
  }
};

if ('undefined' !== typeof module) {
  // backwards compat node dns.js
  exports.Parser = exports.DNS_PARSER;
  exports.Packer = exports.DNS_PACKER;
}

}('undefined' !== typeof window ? window : exports));