123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718 |
- "use strict";
- // Copyright 2019 Google LLC
- //
- // 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.AclRoleAccessorMethods = exports.Acl = void 0;
- const promisify_1 = require("@google-cloud/promisify");
- /**
- * Attach functionality to a {@link Storage.acl} instance. This will add an
- * object for each role group (owners, readers, and writers), with each object
- * containing methods to add or delete a type of entity.
- *
- * As an example, here are a few methods that are created.
- *
- * myBucket.acl.readers.deleteGroup('groupId', function(err) {});
- *
- * myBucket.acl.owners.addUser('email@example.com', function(err, acl) {});
- *
- * myBucket.acl.writers.addDomain('example.com', function(err, acl) {});
- *
- * @private
- */
- class AclRoleAccessorMethods {
- constructor() {
- this.owners = {};
- this.readers = {};
- this.writers = {};
- /**
- * An object of convenience methods to add or delete owner ACL permissions
- * for a given entity.
- *
- * The supported methods include:
- *
- * - `myFile.acl.owners.addAllAuthenticatedUsers`
- * - `myFile.acl.owners.deleteAllAuthenticatedUsers`
- * - `myFile.acl.owners.addAllUsers`
- * - `myFile.acl.owners.deleteAllUsers`
- * - `myFile.acl.owners.addDomain`
- * - `myFile.acl.owners.deleteDomain`
- * - `myFile.acl.owners.addGroup`
- * - `myFile.acl.owners.deleteGroup`
- * - `myFile.acl.owners.addProject`
- * - `myFile.acl.owners.deleteProject`
- * - `myFile.acl.owners.addUser`
- * - `myFile.acl.owners.deleteUser`
- *
- * @name Acl#owners
- *
- * @example
- * ```
- * const storage = require('@google-cloud/storage')();
- * const myBucket = storage.bucket('my-bucket');
- * const myFile = myBucket.file('my-file');
- *
- * //-
- * // Add a user as an owner of a file.
- * //-
- * const myBucket = gcs.bucket('my-bucket');
- * const myFile = myBucket.file('my-file');
- * myFile.acl.owners.addUser('email@example.com', function(err, aclObject)
- * {});
- *
- * //-
- * // For reference, the above command is the same as running the following.
- * //-
- * myFile.acl.add({
- * entity: 'user-email@example.com',
- * role: gcs.acl.OWNER_ROLE
- * }, function(err, aclObject) {});
- *
- * //-
- * // If the callback is omitted, we'll return a Promise.
- * //-
- * myFile.acl.owners.addUser('email@example.com').then(function(data) {
- * const aclObject = data[0];
- * const apiResponse = data[1];
- * });
- * ```
- */
- this.owners = {};
- /**
- * An object of convenience methods to add or delete reader ACL permissions
- * for a given entity.
- *
- * The supported methods include:
- *
- * - `myFile.acl.readers.addAllAuthenticatedUsers`
- * - `myFile.acl.readers.deleteAllAuthenticatedUsers`
- * - `myFile.acl.readers.addAllUsers`
- * - `myFile.acl.readers.deleteAllUsers`
- * - `myFile.acl.readers.addDomain`
- * - `myFile.acl.readers.deleteDomain`
- * - `myFile.acl.readers.addGroup`
- * - `myFile.acl.readers.deleteGroup`
- * - `myFile.acl.readers.addProject`
- * - `myFile.acl.readers.deleteProject`
- * - `myFile.acl.readers.addUser`
- * - `myFile.acl.readers.deleteUser`
- *
- * @name Acl#readers
- *
- * @example
- * ```
- * const storage = require('@google-cloud/storage')();
- * const myBucket = storage.bucket('my-bucket');
- * const myFile = myBucket.file('my-file');
- *
- * //-
- * // Add a user as a reader of a file.
- * //-
- * myFile.acl.readers.addUser('email@example.com', function(err, aclObject)
- * {});
- *
- * //-
- * // For reference, the above command is the same as running the following.
- * //-
- * myFile.acl.add({
- * entity: 'user-email@example.com',
- * role: gcs.acl.READER_ROLE
- * }, function(err, aclObject) {});
- *
- * //-
- * // If the callback is omitted, we'll return a Promise.
- * //-
- * myFile.acl.readers.addUser('email@example.com').then(function(data) {
- * const aclObject = data[0];
- * const apiResponse = data[1];
- * });
- * ```
- */
- this.readers = {};
- /**
- * An object of convenience methods to add or delete writer ACL permissions
- * for a given entity.
- *
- * The supported methods include:
- *
- * - `myFile.acl.writers.addAllAuthenticatedUsers`
- * - `myFile.acl.writers.deleteAllAuthenticatedUsers`
- * - `myFile.acl.writers.addAllUsers`
- * - `myFile.acl.writers.deleteAllUsers`
- * - `myFile.acl.writers.addDomain`
- * - `myFile.acl.writers.deleteDomain`
- * - `myFile.acl.writers.addGroup`
- * - `myFile.acl.writers.deleteGroup`
- * - `myFile.acl.writers.addProject`
- * - `myFile.acl.writers.deleteProject`
- * - `myFile.acl.writers.addUser`
- * - `myFile.acl.writers.deleteUser`
- *
- * @name Acl#writers
- *
- * @example
- * ```
- * const storage = require('@google-cloud/storage')();
- * const myBucket = storage.bucket('my-bucket');
- * const myFile = myBucket.file('my-file');
- *
- * //-
- * // Add a user as a writer of a file.
- * //-
- * myFile.acl.writers.addUser('email@example.com', function(err, aclObject)
- * {});
- *
- * //-
- * // For reference, the above command is the same as running the following.
- * //-
- * myFile.acl.add({
- * entity: 'user-email@example.com',
- * role: gcs.acl.WRITER_ROLE
- * }, function(err, aclObject) {});
- *
- * //-
- * // If the callback is omitted, we'll return a Promise.
- * //-
- * myFile.acl.writers.addUser('email@example.com').then(function(data) {
- * const aclObject = data[0];
- * const apiResponse = data[1];
- * });
- * ```
- */
- this.writers = {};
- AclRoleAccessorMethods.roles.forEach(this._assignAccessMethods.bind(this));
- }
- _assignAccessMethods(role) {
- const accessMethods = AclRoleAccessorMethods.accessMethods;
- const entities = AclRoleAccessorMethods.entities;
- const roleGroup = role.toLowerCase() + 's';
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
- this[roleGroup] = entities.reduce((acc, entity) => {
- const isPrefix = entity.charAt(entity.length - 1) === '-';
- accessMethods.forEach(accessMethod => {
- let method = accessMethod + entity[0].toUpperCase() + entity.substring(1);
- if (isPrefix) {
- method = method.replace('-', '');
- }
- // Wrap the parent accessor method (e.g. `add` or `delete`) to avoid the
- // more complex API of specifying an `entity` and `role`.
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
- acc[method] = (entityId, options, callback) => {
- let apiEntity;
- if (typeof options === 'function') {
- callback = options;
- options = {};
- }
- if (isPrefix) {
- apiEntity = entity + entityId;
- }
- else {
- // If the entity is not a prefix, it is a special entity group
- // that does not require further details. The accessor methods
- // only accept a callback.
- apiEntity = entity;
- callback = entityId;
- }
- options = Object.assign({
- entity: apiEntity,
- role,
- }, options);
- const args = [options];
- if (typeof callback === 'function') {
- args.push(callback);
- }
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
- return this[accessMethod].apply(this, args);
- };
- });
- return acc;
- }, {});
- }
- }
- exports.AclRoleAccessorMethods = AclRoleAccessorMethods;
- AclRoleAccessorMethods.accessMethods = ['add', 'delete'];
- AclRoleAccessorMethods.entities = [
- // Special entity groups that do not require further specification.
- 'allAuthenticatedUsers',
- 'allUsers',
- // Entity groups that require specification, e.g. `user-email@example.com`.
- 'domain-',
- 'group-',
- 'project-',
- 'user-',
- ];
- AclRoleAccessorMethods.roles = ['OWNER', 'READER', 'WRITER'];
- /**
- * Cloud Storage uses access control lists (ACLs) to manage object and
- * bucket access. ACLs are the mechanism you use to share objects with other
- * users and allow other users to access your buckets and objects.
- *
- * An ACL consists of one or more entries, where each entry grants permissions
- * to an entity. Permissions define the actions that can be performed against an
- * object or bucket (for example, `READ` or `WRITE`); the entity defines who the
- * permission applies to (for example, a specific user or group of users).
- *
- * Where an `entity` value is accepted, we follow the format the Cloud Storage
- * API expects.
- *
- * Refer to
- * https://cloud.google.com/storage/docs/json_api/v1/defaultObjectAccessControls
- * for the most up-to-date values.
- *
- * - `user-userId`
- * - `user-email`
- * - `group-groupId`
- * - `group-email`
- * - `domain-domain`
- * - `project-team-projectId`
- * - `allUsers`
- * - `allAuthenticatedUsers`
- *
- * Examples:
- *
- * - The user "liz@example.com" would be `user-liz@example.com`.
- * - The group "example@googlegroups.com" would be
- * `group-example@googlegroups.com`.
- * - To refer to all members of the Google Apps for Business domain
- * "example.com", the entity would be `domain-example.com`.
- *
- * For more detailed information, see
- * {@link http://goo.gl/6qBBPO| About Access Control Lists}.
- *
- * @constructor Acl
- * @mixin
- * @param {object} options Configuration options.
- */
- class Acl extends AclRoleAccessorMethods {
- constructor(options) {
- super();
- this.pathPrefix = options.pathPrefix;
- this.request_ = options.request;
- }
- /**
- * @typedef {array} AddAclResponse
- * @property {object} 0 The Acl Objects.
- * @property {object} 1 The full API response.
- */
- /**
- * @callback AddAclCallback
- * @param {?Error} err Request error, if any.
- * @param {object} acl The Acl Objects.
- * @param {object} apiResponse The full API response.
- */
- /**
- * Add access controls on a {@link Bucket} or {@link File}.
- *
- * See {@link https://cloud.google.com/storage/docs/json_api/v1/bucketAccessControls/insert| BucketAccessControls: insert API Documentation}
- * See {@link https://cloud.google.com/storage/docs/json_api/v1/objectAccessControls/insert| ObjectAccessControls: insert API Documentation}
- *
- * @param {object} options Configuration options.
- * @param {string} options.entity Whose permissions will be added.
- * @param {string} options.role Permissions allowed for the defined entity.
- * See {@link https://cloud.google.com/storage/docs/access-control Access
- * Control}.
- * @param {number} [options.generation] **File Objects Only** Select a specific
- * revision of this file (as opposed to the latest version, the default).
- * @param {string} [options.userProject] The ID of the project which will be
- * billed for the request.
- * @param {AddAclCallback} [callback] Callback function.
- * @returns {Promise<AddAclResponse>}
- *
- * @example
- * ```
- * const storage = require('@google-cloud/storage')();
- * const myBucket = storage.bucket('my-bucket');
- * const myFile = myBucket.file('my-file');
- *
- * const options = {
- * entity: 'user-useremail@example.com',
- * role: gcs.acl.OWNER_ROLE
- * };
- *
- * myBucket.acl.add(options, function(err, aclObject, apiResponse) {});
- *
- * //-
- * // For file ACL operations, you can also specify a `generation` property.
- * // Here is how you would grant ownership permissions to a user on a
- * specific
- * // revision of a file.
- * //-
- * myFile.acl.add({
- * entity: 'user-useremail@example.com',
- * role: gcs.acl.OWNER_ROLE,
- * generation: 1
- * }, function(err, aclObject, apiResponse) {});
- *
- * //-
- * // If the callback is omitted, we'll return a Promise.
- * //-
- * myBucket.acl.add(options).then(function(data) {
- * const aclObject = data[0];
- * const apiResponse = data[1];
- * });
- *
- * ```
- * @example <caption>include:samples/acl.js</caption>
- * region_tag:storage_add_file_owner
- * Example of adding an owner to a file:
- *
- * @example <caption>include:samples/acl.js</caption>
- * region_tag:storage_add_bucket_owner
- * Example of adding an owner to a bucket:
- *
- * @example <caption>include:samples/acl.js</caption>
- * region_tag:storage_add_bucket_default_owner
- * Example of adding a default owner to a bucket:
- */
- add(options, callback) {
- const query = {};
- if (options.generation) {
- query.generation = options.generation;
- }
- if (options.userProject) {
- query.userProject = options.userProject;
- }
- this.request({
- method: 'POST',
- uri: '',
- qs: query,
- maxRetries: 0, //explicitly set this value since this is a non-idempotent function
- json: {
- entity: options.entity,
- role: options.role.toUpperCase(),
- },
- }, (err, resp) => {
- if (err) {
- callback(err, null, resp);
- return;
- }
- callback(null, this.makeAclObject_(resp), resp);
- });
- }
- /**
- * @typedef {array} RemoveAclResponse
- * @property {object} 0 The full API response.
- */
- /**
- * @callback RemoveAclCallback
- * @param {?Error} err Request error, if any.
- * @param {object} apiResponse The full API response.
- */
- /**
- * Delete access controls on a {@link Bucket} or {@link File}.
- *
- * See {@link https://cloud.google.com/storage/docs/json_api/v1/bucketAccessControls/delete| BucketAccessControls: delete API Documentation}
- * See {@link https://cloud.google.com/storage/docs/json_api/v1/objectAccessControls/delete| ObjectAccessControls: delete API Documentation}
- *
- * @param {object} options Configuration object.
- * @param {string} options.entity Whose permissions will be revoked.
- * @param {int} [options.generation] **File Objects Only** Select a specific
- * revision of this file (as opposed to the latest version, the default).
- * @param {string} [options.userProject] The ID of the project which will be
- * billed for the request.
- * @param {RemoveAclCallback} callback The callback function.
- * @returns {Promise<RemoveAclResponse>}
- *
- * @example
- * ```
- * const storage = require('@google-cloud/storage')();
- * const myBucket = storage.bucket('my-bucket');
- * const myFile = myBucket.file('my-file');
- *
- * myBucket.acl.delete({
- * entity: 'user-useremail@example.com'
- * }, function(err, apiResponse) {});
- *
- * //-
- * // For file ACL operations, you can also specify a `generation` property.
- * //-
- * myFile.acl.delete({
- * entity: 'user-useremail@example.com',
- * generation: 1
- * }, function(err, apiResponse) {});
- *
- * //-
- * // If the callback is omitted, we'll return a Promise.
- * //-
- * myFile.acl.delete().then(function(data) {
- * const apiResponse = data[0];
- * });
- *
- * ```
- * @example <caption>include:samples/acl.js</caption>
- * region_tag:storage_remove_bucket_owner
- * Example of removing an owner from a bucket:
- *
- * @example <caption>include:samples/acl.js</caption>
- * region_tag:storage_remove_bucket_default_owner
- * Example of removing a default owner from a bucket:
- *
- * @example <caption>include:samples/acl.js</caption>
- * region_tag:storage_remove_file_owner
- * Example of removing an owner from a bucket:
- */
- delete(options, callback) {
- const query = {};
- if (options.generation) {
- query.generation = options.generation;
- }
- if (options.userProject) {
- query.userProject = options.userProject;
- }
- this.request({
- method: 'DELETE',
- uri: '/' + encodeURIComponent(options.entity),
- qs: query,
- }, (err, resp) => {
- callback(err, resp);
- });
- }
- /**
- * @typedef {array} GetAclResponse
- * @property {object|object[]} 0 Single or array of Acl Objects.
- * @property {object} 1 The full API response.
- */
- /**
- * @callback GetAclCallback
- * @param {?Error} err Request error, if any.
- * @param {object|object[]} acl Single or array of Acl Objects.
- * @param {object} apiResponse The full API response.
- */
- /**
- * Get access controls on a {@link Bucket} or {@link File}. If
- * an entity is omitted, you will receive an array of all applicable access
- * controls.
- *
- * See {@link https://cloud.google.com/storage/docs/json_api/v1/bucketAccessControls/get| BucketAccessControls: get API Documentation}
- * See {@link https://cloud.google.com/storage/docs/json_api/v1/objectAccessControls/get| ObjectAccessControls: get API Documentation}
- *
- * @param {object|function} [options] Configuration options. If you want to
- * receive a list of all access controls, pass the callback function as
- * the only argument.
- * @param {string} options.entity Whose permissions will be fetched.
- * @param {number} [options.generation] **File Objects Only** Select a specific
- * revision of this file (as opposed to the latest version, the default).
- * @param {string} [options.userProject] The ID of the project which will be
- * billed for the request.
- * @param {GetAclCallback} [callback] Callback function.
- * @returns {Promise<GetAclResponse>}
- *
- * @example
- * ```
- * const storage = require('@google-cloud/storage')();
- * const myBucket = storage.bucket('my-bucket');
- * const myFile = myBucket.file('my-file');
- *
- * myBucket.acl.get({
- * entity: 'user-useremail@example.com'
- * }, function(err, aclObject, apiResponse) {});
- *
- * //-
- * // Get all access controls.
- * //-
- * myBucket.acl.get(function(err, aclObjects, apiResponse) {
- * // aclObjects = [
- * // {
- * // entity: 'user-useremail@example.com',
- * // role: 'owner'
- * // }
- * // ]
- * });
- *
- * //-
- * // For file ACL operations, you can also specify a `generation` property.
- * //-
- * myFile.acl.get({
- * entity: 'user-useremail@example.com',
- * generation: 1
- * }, function(err, aclObject, apiResponse) {});
- *
- * //-
- * // If the callback is omitted, we'll return a Promise.
- * //-
- * myBucket.acl.get().then(function(data) {
- * const aclObject = data[0];
- * const apiResponse = data[1];
- * });
- *
- * ```
- * @example <caption>include:samples/acl.js</caption>
- * region_tag:storage_print_file_acl
- * Example of printing a file's ACL:
- *
- * @example <caption>include:samples/acl.js</caption>
- * region_tag:storage_print_file_acl_for_user
- * Example of printing a file's ACL for a specific user:
- *
- * @example <caption>include:samples/acl.js</caption>
- * region_tag:storage_print_bucket_acl
- * Example of printing a bucket's ACL:
- *
- * @example <caption>include:samples/acl.js</caption>
- * region_tag:storage_print_bucket_acl_for_user
- * Example of printing a bucket's ACL for a specific user:
- */
- get(optionsOrCallback, cb) {
- const options = typeof optionsOrCallback === 'object' ? optionsOrCallback : null;
- const callback = typeof optionsOrCallback === 'function' ? optionsOrCallback : cb;
- let path = '';
- const query = {};
- if (options) {
- path = '/' + encodeURIComponent(options.entity);
- if (options.generation) {
- query.generation = options.generation;
- }
- if (options.userProject) {
- query.userProject = options.userProject;
- }
- }
- this.request({
- uri: path,
- qs: query,
- }, (err, resp) => {
- if (err) {
- callback(err, null, resp);
- return;
- }
- let results;
- if (resp.items) {
- results = resp.items.map(this.makeAclObject_);
- }
- else {
- results = this.makeAclObject_(resp);
- }
- callback(null, results, resp);
- });
- }
- /**
- * @typedef {array} UpdateAclResponse
- * @property {object} 0 The updated Acl Objects.
- * @property {object} 1 The full API response.
- */
- /**
- * @callback UpdateAclCallback
- * @param {?Error} err Request error, if any.
- * @param {object} acl The updated Acl Objects.
- * @param {object} apiResponse The full API response.
- */
- /**
- * Update access controls on a {@link Bucket} or {@link File}.
- *
- * See {@link https://cloud.google.com/storage/docs/json_api/v1/bucketAccessControls/update| BucketAccessControls: update API Documentation}
- * See {@link https://cloud.google.com/storage/docs/json_api/v1/objectAccessControls/update| ObjectAccessControls: update API Documentation}
- *
- * @param {object} options Configuration options.
- * @param {string} options.entity Whose permissions will be updated.
- * @param {string} options.role Permissions allowed for the defined entity.
- * See {@link Storage.acl}.
- * @param {number} [options.generation] **File Objects Only** Select a specific
- * revision of this file (as opposed to the latest version, the default).
- * @param {string} [options.userProject] The ID of the project which will be
- * billed for the request.
- * @param {UpdateAclCallback} [callback] Callback function.
- * @returns {Promise<UpdateAclResponse>}
- *
- * @example
- * ```
- * const storage = require('@google-cloud/storage')();
- * const myBucket = storage.bucket('my-bucket');
- * const myFile = myBucket.file('my-file');
- *
- * const options = {
- * entity: 'user-useremail@example.com',
- * role: gcs.acl.WRITER_ROLE
- * };
- *
- * myBucket.acl.update(options, function(err, aclObject, apiResponse) {});
- *
- * //-
- * // For file ACL operations, you can also specify a `generation` property.
- * //-
- * myFile.acl.update({
- * entity: 'user-useremail@example.com',
- * role: gcs.acl.WRITER_ROLE,
- * generation: 1
- * }, function(err, aclObject, apiResponse) {});
- *
- * //-
- * // If the callback is omitted, we'll return a Promise.
- * //-
- * myFile.acl.update(options).then(function(data) {
- * const aclObject = data[0];
- * const apiResponse = data[1];
- * });
- * ```
- */
- update(options, callback) {
- const query = {};
- if (options.generation) {
- query.generation = options.generation;
- }
- if (options.userProject) {
- query.userProject = options.userProject;
- }
- this.request({
- method: 'PUT',
- uri: '/' + encodeURIComponent(options.entity),
- qs: query,
- json: {
- role: options.role.toUpperCase(),
- },
- }, (err, resp) => {
- if (err) {
- callback(err, null, resp);
- return;
- }
- callback(null, this.makeAclObject_(resp), resp);
- });
- }
- /**
- * Transform API responses to a consistent object format.
- *
- * @private
- */
- makeAclObject_(accessControlObject) {
- const obj = {
- entity: accessControlObject.entity,
- role: accessControlObject.role,
- };
- if (accessControlObject.projectTeam) {
- obj.projectTeam = accessControlObject.projectTeam;
- }
- return obj;
- }
- /**
- * Patch requests up to the bucket's request object.
- *
- * @private
- *
- * @param {string} method Action.
- * @param {string} path Request path.
- * @param {*} query Request query object.
- * @param {*} body Request body contents.
- * @param {function} callback Callback function.
- */
- request(reqOpts, callback) {
- reqOpts.uri = this.pathPrefix + reqOpts.uri;
- this.request_(reqOpts, callback);
- }
- }
- exports.Acl = Acl;
- /*! Developer Documentation
- *
- * All async methods (except for streams) will return a Promise in the event
- * that a callback is omitted.
- */
- (0, promisify_1.promisifyAll)(Acl, {
- exclude: ['request'],
- });
|