UNPKG

@google-cloud/dns

Version:
320 lines 12 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.DNS = exports.Zone = exports.Record = void 0; const common_1 = require("@google-cloud/common"); const paginator_1 = require("@google-cloud/paginator"); const promisify_1 = require("@google-cloud/promisify"); const arrify = require("arrify"); const zone_1 = require("./zone"); Object.defineProperty(exports, "Zone", { enumerable: true, get: function () { return zone_1.Zone; } }); var record_1 = require("./record"); Object.defineProperty(exports, "Record", { enumerable: true, get: function () { return record_1.Record; } }); /** * @typedef {object} ClientConfig * @property {string} [projectId] The project ID from the Google Developer's * Console, e.g. 'grape-spaceship-123'. We will also check the environment * variable `GCLOUD_PROJECT` for your project ID. If your app is running in * an environment which supports {@link * https://cloud.google.com/docs/authentication/production#providing_credentials_to_your_application * Application Default Credentials}, your project ID will be detected * automatically. * @property {string} [keyFilename] Full path to the a .json, .pem, or .p12 key * downloaded from the Google Developers Console. If you provide a path to a * JSON file, the `projectId` option above is not necessary. NOTE: .pem and * .p12 require you to specify the `email` option as well. * @property {string} [email] Account email address. Required when using a .pem * or .p12 keyFilename. * @property {object} [credentials] Credentials object. * @property {string} [credentials.client_email] * @property {string} [credentials.private_key] * @property {boolean} [autoRetry=true] Automatically retry requests if the * response is related to rate limits or certain intermittent server errors. * We will exponentially backoff subsequent requests by default. * @property {number} [maxRetries=3] Maximum number of automatic retries * attempted before returning the error. * @property {Constructor} [promise] Custom promise module to use instead of * native Promises. */ /** * [Cloud DNS](https://cloud.google.com/dns/what-is-cloud-dns) is a * high-performance, resilient, global DNS service that provides a * cost-effective way to make your applications and services available to your * users. This programmable, authoritative DNS service can be used to easily * publish and manage DNS records using the same infrastructure relied upon by * Google. * * @class * * @see [What is Cloud DNS?]{@link https://cloud.google.com/dns/what-is-cloud-dns} * * @param {ClientConfig} [options] Configuration options. * * @example <caption>Import the client library</caption> * const {DNS} = require('@google-cloud/dns'); * * @example <caption>Create a client that uses <a * href="https://cloud.google.com/docs/authentication/production#providing_credentials_to_your_application">Application * Default Credentials (ADC)</a>:</caption> const dns = new DNS(); * * @example <caption>Create a client with <a * href="https://cloud.google.com/docs/authentication/production#obtaining_and_providing_service_account_credentials_manually">explicit * credentials</a>:</caption> const dns = new DNS({ projectId: * 'your-project-id', keyFilename: '/path/to/keyfile.json' * }); * * @example <caption>include:samples/quickstart.js</caption> * region_tag:dns_quickstart * Full quickstart example: */ class DNS extends common_1.Service { getZonesStream; constructor(options = {}) { options.apiEndpoint = options.apiEndpoint || 'dns.googleapis.com'; const config = { apiEndpoint: options.apiEndpoint, baseUrl: `https://${options.apiEndpoint}/dns/v1`, scopes: [ 'https://www.googleapis.com/auth/ndev.clouddns.readwrite', 'https://www.googleapis.com/auth/cloud-platform', ], packageJson: require('../../package.json'), }; super(config, options); /** * Get {@link Zone} objects for all of the zones in your project as * a readable object stream. * * @method DNS#getZonesStream * @param {GetZonesRequest} [query] Query object for listing zones. * @returns {ReadableStream} A readable stream that emits {@link Zone} instances. * * @example * const {DNS} = require('@google-cloud/dns'); * const dns = new DNS(); * * dns.getZonesStream() * .on('error', console.error) * .on('data', function(zone) { * // zone is a Zone object. * }) * .on('end', () => { * // All zones retrieved. * }); * * //- * // If you anticipate many results, you can end a stream early to prevent * // unnecessary processing and API requests. * //- * dns.getZonesStream() * .on('data', function(zone) { * this.end(); * }); */ this.getZonesStream = paginator_1.paginator.streamify('getZones'); } /** * Config to set for the zone. * * @typedef {object} CreateZoneRequest * @property {string} dnsName DNS name for the zone. E.g. "example.com." * @property {string} [description] Description text for the zone. */ /** * @typedef {array} CreateZoneResponse * @property {Zone} 0 The new {@link Zone}. * @property {object} 1 The full API response. */ /** * @callback CreateZoneCallback * @param {?Error} err Request error, if any. * @param {Zone} zone The new {@link Zone}. * @param {object} apiResponse The full API response. */ /** * Create a managed zone. * * @method DNS#createZone * @see [ManagedZones: create API Documentation]{@link https://cloud.google.com/dns/api/v1/managedZones/create} * * @throws {error} If a zone name is not provided. * @throws {error} If a zone dnsName is not provided. * * @param {string} name Name of the zone to create, e.g. "my-zone". * @param {CreateZoneRequest} config Config to set for the zone. * @param {CreateZoneCallback} [callback] Callback function. * @returns {Promise<CreateZoneResponse>} * @throws {Error} If a name is not provided. * @see Zone#create * * @example * const {DNS} = require('@google-cloud/dns'); * const dns = new DNS(); * * const config = { * dnsName: 'example.com.', // note the period at the end of the domain. * description: 'This zone is awesome!' * }; * * dns.createZone('my-awesome-zone', config, (err, zone, apiResponse) => { * if (!err) { * // The zone was created successfully. * } * }); * * //- * // If the callback is omitted, we'll return a Promise. * //- * dns.createZone('my-awesome-zone', config).then((data) => { * const zone = data[0]; * const apiResponse = data[1]; * }); */ createZone(name, config, callback) { if (!name) { throw new Error('A zone name is required.'); } if (!config || !config.dnsName) { throw new Error('A zone dnsName is required.'); } config.name = name; // Required by the API. config.description = config.description || ''; this.request({ method: 'POST', uri: '/managedZones', json: config, }, (err, resp) => { if (err) { callback(err, null, resp); return; } const zone = this.zone(resp.name); zone.metadata = resp; callback(null, zone, resp); }); } /** * Query object for listing zones. * * @typedef {object} GetZonesRequest * @property {boolean} [autoPaginate=true] Have pagination handled * automatically. * @property {number} [maxApiCalls] Maximum number of API calls to make. * @property {number} [maxResults] Maximum number of items plus prefixes to * return. * @property {string} [pageToken] A previously-returned page token * representing part of the larger set of results to view. */ /** * @typedef {array} GetZonesResponse * @property {Zone[]} 0 Array of {@link Zone} instances. * @property {object} 1 The full API response. */ /** * @callback GetZonesCallback * @param {?Error} err Request error, if any. * @param {Zone[]} zones Array of {@link Zone} instances. * @param {object} apiResponse The full API response. */ /** * Gets a list of managed zones for the project. * * @method DNS#getZones * @see [ManagedZones: list API Documentation]{@link https://cloud.google.com/dns/api/v1/managedZones/list} * * @param {GetZonesRequest} [query] Query object for listing zones. * @param {GetZonesCallback} [callback] Callback function. * @returns {Promise<GetZonesResponse>} * * @example * const {DNS} = require('@google-cloud/dns'); * const dns = new DNS(); * * dns.getZones((err, zones, apiResponse) {}); * * //- * // If the callback is omitted, we'll return a Promise. * //- * dns.getZones().then(data => { * const zones = data[0]; * }); */ getZones(queryOrCallback, callback) { const query = typeof queryOrCallback === 'object' ? queryOrCallback : {}; callback = typeof queryOrCallback === 'function' ? queryOrCallback : callback; this.request({ uri: '/managedZones', qs: query, }, (err, resp) => { if (err) { callback(err, null, null, resp); return; } // eslint-disable-next-line @typescript-eslint/no-explicit-any const zones = arrify(resp.managedZones).map((zone) => { const zoneInstance = this.zone(zone.name); zoneInstance.metadata = zone; return zoneInstance; }); let nextQuery = null; if (resp.nextPageToken) { nextQuery = Object.assign({}, query, { pageToken: resp.nextPageToken, }); } callback(null, zones, nextQuery, resp); }); } /** * Get a reference to a Zone. * * @param {string} name The unique name of the zone. * @returns {Zone} * @see Zone * * @throws {error} If a zone name is not provided. * * @example * const {DNS} = require('@google-cloud/dns'); * const dns = new DNS(); * * const zone = dns.zone('my-zone'); */ zone(name) { if (!name) { throw new Error('A zone name is required.'); } return new zone_1.Zone(this, name); } } exports.DNS = DNS; /*! Developer Documentation * * These methods can be auto-paginated. */ paginator_1.paginator.extend(DNS, 'getZones'); /*! Developer Documentation * * All async methods (except for streams) will return a Promise in the event * that a callback is omitted. */ (0, promisify_1.promisifyAll)(DNS, { exclude: ['zone'], }); //# sourceMappingURL=index.js.map