UNPKG

@google-cloud/dns

Version:
189 lines 5.74 kB
"use strict"; /*! * Copyright 2014 Google Inc. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ Object.defineProperty(exports, "__esModule", { value: true }); exports.Record = void 0; const promisify_1 = require("@google-cloud/promisify"); const arrify = require("arrify"); // eslint-disable-next-line @typescript-eslint/no-var-requires const format = require('string-format-obj'); /** * Create a Resource Record object. * * @class * * @param {string} type The record type, e.g. `A`, `AAAA`, `MX`. * @param {object} metadata The metadata of this record. * @param {string} metadata.name The name of the record, e.g. * `www.example.com.`. * @param {string[]} metadata.data Defined in * [RFC 1035, section 5](https://goo.gl/9EiM0e) and * [RFC 1034, section 3.6.1](https://goo.gl/Hwhsu9). * @param {number} metadata.ttl Seconds that the resource is cached by * resolvers. * * @example * const {DNS} = require('@google-cloud/dns'); * const dns = new DNS(); * const zone = dns.zone('my-awesome-zone'); * * const record = zone.record('a', { * name: 'example.com.', * ttl: 86400, * data: '1.2.3.4' * }); */ class Record { zone_; type; metadata; rrdatas; data; constructor(zone, type, metadata) { this.zone_ = zone; /** * @name Record#type * @type {string} */ this.type = type; /** * @name Record#metadata * @type {object} * @property {string} name * @property {string[]} data * @property {number} metadata.ttl */ this.metadata = metadata; Object.assign(this, this.toJSON()); if (this.rrdatas) { /** * @name Record#data * @type {?object[]} */ this.data = this.rrdatas; delete this.rrdatas; } } /** * Delete this record by creating a change on your zone. This is a convenience * method for: * * zone.createChange({ * delete: record * }, (err, change, apiResponse) => {}); * * @see [ManagedZones: create API Documentation]{@link https://cloud.google.com/dns/api/v1/managedZones/create} * * @param {DeleteRecordCallback} [callback] Callback function. * @returns {Promise<DeleteRecordResponse>} * * @example * const {DNS} = require('@google-cloud/dns'); * const dns = new DNS(); * const zone = dns.zone('zone-id'); * const record = zone.record('a', { * name: 'example.com.', * ttl: 86400, * data: '1.2.3.4' * }); * * record.delete((err, change, apiResponse) => { * if (!err) { * // Delete change modification was created. * } * }); * * //- * // If the callback is omitted, we'll return a Promise. * //- * record.delete().then((data) => { * const change = data[0]; * const apiResponse = data[1]; * }); */ delete(callback) { this.zone_.deleteRecords(this, callback); } /** * Serialize the record instance to the format the API expects. * * @returns {object} */ toJSON() { const recordObject = Object.assign({}, this.metadata, { type: this.type.toUpperCase(), }); if (recordObject.data) { recordObject.rrdatas = arrify(recordObject.data); delete recordObject.data; } return recordObject; } /** * Convert the record to a string, formatted for a zone file. * * @returns {string} */ toString() { const json = this.toJSON(); return (json.rrdatas || [{}]) .map(data => { json.rrdata = data; return format('{name} {ttl} IN {type} {rrdata}', json); }) .join('\n'); } /** * Create a Record instance from a resource record set in a zone file. * * @private * * @param {Zone} zone The zone. * @param {string} type The record type, e.g. `A`, `AAAA`, `MX`. * @param {object} bindData Metadata parsed from dns-zonefile. Properties vary * based on the type of record. * @returns {Record} */ static fromZoneRecord_(zone, type, bindData) { const typeToZoneFormat = { a: '{ip}', aaaa: '{ip}', cname: '{alias}', mx: '{preference} {host}', ns: '{host}', soa: '{mname} {rname} {serial} {retry} {refresh} {expire} {minimum}', spf: '{data}', srv: '{priority} {weight} {port} {target}', txt: '{txt}', }; const metadata = { data: format(typeToZoneFormat[type.toLowerCase()], bindData), name: bindData.name, ttl: bindData.ttl, }; return new Record(zone, type, metadata); } } exports.Record = Record; /*! Developer Documentation * * All async methods (except for streams) will return a Promise in the event * that a callback is omitted. */ (0, promisify_1.promisifyAll)(Record, { exclude: ['toJSON', 'toString'], }); //# sourceMappingURL=record.js.map