mirror of
https://github.com/titanscouting/tra-analysis.git
synced 2025-09-06 15:07:21 +00:00
Add files via upload
This commit is contained in:
19
website/functions/node_modules/@google-cloud/common/CONTRIBUTORS
generated
vendored
Normal file
19
website/functions/node_modules/@google-cloud/common/CONTRIBUTORS
generated
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
# The names of individuals who have contributed to this project.
|
||||
#
|
||||
# Names are formatted as:
|
||||
# name <email>
|
||||
#
|
||||
Ali Ijaz Sheikh <ofrobots@google.com>
|
||||
Austin Peterson <austin@akpwebdesign.com>
|
||||
Dave Gramlich <callmehiphop@gmail.com>
|
||||
Eric Uldall <ericuldall@gmail.com>
|
||||
Ernest Landrito <landrito@google.com>
|
||||
Jason Dobry <jdobry@google.com>
|
||||
Justin King <jcking@mtu.edu>
|
||||
Karolis Narkevicius <karolis.n@gmail.com>
|
||||
Kelvin Jin <kelvinjin@google.com>
|
||||
Luke Sneeringer <lukesneeringer@google.com>
|
||||
Matthew Loring <matthewloring@users.noreply.github.com>
|
||||
Michael Prentice <splaktar@gmail.com>
|
||||
Stephen Sawchuk <sawchuk@gmail.com>
|
||||
Tim Swast <swast@google.com>
|
202
website/functions/node_modules/@google-cloud/common/LICENSE
generated
vendored
Normal file
202
website/functions/node_modules/@google-cloud/common/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,202 @@
|
||||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
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.
|
79
website/functions/node_modules/@google-cloud/common/README.md
generated
vendored
Normal file
79
website/functions/node_modules/@google-cloud/common/README.md
generated
vendored
Normal file
@@ -0,0 +1,79 @@
|
||||
<img src="https://avatars2.githubusercontent.com/u/2810941?v=3&s=96" alt="Google Cloud Platform logo" title="Google Cloud Platform" align="right" height="96" width="96"/>
|
||||
|
||||
# [Google Cloud Common Module: Node.js Client](https://github.com/googlecloudplatform/google-cloud-node)
|
||||
|
||||
[](https://cloud.google.com/terms/launch-stages)
|
||||
[](https://circleci.com/gh/googleapis/nodejs-common)
|
||||
[](https://ci.appveyor.com/project/googleapis/nodejs-common)
|
||||
[](https://codecov.io/gh/googleapis/nodejs-common)
|
||||
|
||||
> Node.js Common package
|
||||
|
||||
Google Cloud Common node.js module contains stuff used by other Cloud API modules.
|
||||
|
||||
* [github.com/googlecloudplatform/google-cloud-node](https://github.com/googlecloudplatform/google-cloud-node)
|
||||
|
||||
Read more about the client libraries for Cloud APIs, including the older
|
||||
Google APIs Client Libraries, in [Client Libraries Explained][explained].
|
||||
|
||||
[explained]: https://cloud.google.com/apis/docs/client-libraries-explained
|
||||
|
||||
**Table of contents:**
|
||||
|
||||
* [Quickstart](#quickstart)
|
||||
* [Before you begin](#before-you-begin)
|
||||
* [Installing the client library](#installing-the-client-library)
|
||||
* [Using the client library](#using-the-client-library)
|
||||
* [Versioning](#versioning)
|
||||
* [Contributing](#contributing)
|
||||
* [License](#license)
|
||||
|
||||
## Quickstart
|
||||
|
||||
### Before you begin
|
||||
|
||||
1. Select or create a Cloud Platform project.
|
||||
|
||||
[Go to the projects page][projects]
|
||||
|
||||
1. Enable billing for your project.
|
||||
|
||||
[Enable billing][billing]
|
||||
|
||||
1. [Set up authentication with a service account][auth] so you can access the
|
||||
API from your local workstation.
|
||||
|
||||
[projects]: https://console.cloud.google.com/project
|
||||
[billing]: https://support.google.com/cloud/answer/6293499#enable-billing
|
||||
[auth]: https://cloud.google.com/docs/authentication/getting-started
|
||||
|
||||
### Installing the package
|
||||
|
||||
npm install --save @google-cloud/common
|
||||
|
||||
It's unlikely you will need to install this package directly, as it will be
|
||||
installed as a dependency when you install other `@google-cloud` packages.
|
||||
|
||||
## Versioning
|
||||
|
||||
This library follows [Semantic Versioning](http://semver.org/).
|
||||
|
||||
This library is considered to be in **alpha**. This means it is still a
|
||||
work-in-progress and under active development. Any release is subject to
|
||||
backwards-incompatible changes at any time.
|
||||
|
||||
More Information: [Google Cloud Platform Launch Stages][launch_stages]
|
||||
|
||||
[launch_stages]: https://cloud.google.com/terms/launch-stages
|
||||
|
||||
## Contributing
|
||||
|
||||
Contributions welcome! See the [Contributing Guide](https://github.com/googlecloudplatform/google-cloud-node/blob/master/.github/CONTRIBUTING.md).
|
||||
|
||||
## License
|
||||
|
||||
Apache Version 2.0
|
||||
|
||||
See [LICENSE](https://github.com/googlecloudplatform/google-cloud-node/blob/master/LICENSE)
|
||||
|
||||
[shell_img]: http://gstatic.com/cloudssh/images/open-btn.png
|
22
website/functions/node_modules/@google-cloud/common/node_modules/retry-request/index.d.ts
generated
vendored
Normal file
22
website/functions/node_modules/@google-cloud/common/node_modules/retry-request/index.d.ts
generated
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
declare module 'retry-request' {
|
||||
import * as request from 'request';
|
||||
|
||||
namespace retryRequest {
|
||||
function getNextRetryDelay(retryNumber: number): void;
|
||||
interface Options {
|
||||
objectMode?: boolean,
|
||||
request?: typeof request,
|
||||
retries?: number,
|
||||
noResponseRetries?: number,
|
||||
currentRetryAttempt?: number,
|
||||
shouldRetryFn?: (response: request.RequestResponse) => boolean
|
||||
}
|
||||
}
|
||||
|
||||
function retryRequest(requestOpts: request.Options, opts: retryRequest.Options, callback?: request.RequestCallback)
|
||||
: { abort: () => void };
|
||||
function retryRequest(requestOpts: request.Options, callback?: request.RequestCallback)
|
||||
: { abort: () => void };
|
||||
|
||||
export = retryRequest;
|
||||
}
|
209
website/functions/node_modules/@google-cloud/common/node_modules/retry-request/index.js
generated
vendored
Normal file
209
website/functions/node_modules/@google-cloud/common/node_modules/retry-request/index.js
generated
vendored
Normal file
@@ -0,0 +1,209 @@
|
||||
'use strict';
|
||||
|
||||
var request = require('request');
|
||||
var through = require('through2');
|
||||
|
||||
var DEFAULTS = {
|
||||
objectMode: false,
|
||||
request: request,
|
||||
retries: 2,
|
||||
noResponseRetries: 2,
|
||||
currentRetryAttempt: 0,
|
||||
shouldRetryFn: function (response) {
|
||||
var retryRanges = [
|
||||
// https://en.wikipedia.org/wiki/List_of_HTTP_status_codes
|
||||
// 1xx - Retry (Informational, request still processing)
|
||||
// 2xx - Do not retry (Success)
|
||||
// 3xx - Do not retry (Redirect)
|
||||
// 4xx - Do not retry (Client errors)
|
||||
// 429 - Retry ("Too Many Requests")
|
||||
// 5xx - Retry (Server errors)
|
||||
[100, 199],
|
||||
[429, 429],
|
||||
[500, 599]
|
||||
];
|
||||
|
||||
var statusCode = response.statusCode;
|
||||
|
||||
var range;
|
||||
while ((range = retryRanges.shift())) {
|
||||
if (statusCode >= range[0] && statusCode <= range[1]) {
|
||||
// Not a successful status or redirect.
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function retryRequest(requestOpts, opts, callback) {
|
||||
var streamMode = typeof arguments[arguments.length - 1] !== 'function';
|
||||
|
||||
if (typeof opts === 'function') {
|
||||
callback = opts;
|
||||
}
|
||||
|
||||
opts = opts || DEFAULTS;
|
||||
|
||||
if (typeof opts.objectMode === 'undefined') {
|
||||
opts.objectMode = DEFAULTS.objectMode;
|
||||
}
|
||||
if (typeof opts.request === 'undefined') {
|
||||
opts.request = DEFAULTS.request;
|
||||
}
|
||||
if (typeof opts.retries !== 'number') {
|
||||
opts.retries = DEFAULTS.retries;
|
||||
}
|
||||
if (typeof opts.currentRetryAttempt !== 'number') {
|
||||
opts.currentRetryAttempt = DEFAULTS.currentRetryAttempt;
|
||||
}
|
||||
if (typeof opts.noResponseRetries !== 'number') {
|
||||
opts.noResponseRetries = DEFAULTS.noResponseRetries;
|
||||
}
|
||||
if (typeof opts.shouldRetryFn !== 'function') {
|
||||
opts.shouldRetryFn = DEFAULTS.shouldRetryFn;
|
||||
}
|
||||
|
||||
var currentRetryAttempt = opts.currentRetryAttempt;
|
||||
|
||||
var numNoResponseAttempts = 0;
|
||||
var streamResponseHandled = false;
|
||||
|
||||
var retryStream;
|
||||
var requestStream;
|
||||
var delayStream;
|
||||
|
||||
var activeRequest;
|
||||
var retryRequest = {
|
||||
abort: function () {
|
||||
if (activeRequest && activeRequest.abort) {
|
||||
activeRequest.abort();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
if (streamMode) {
|
||||
retryStream = through({ objectMode: opts.objectMode });
|
||||
retryStream.abort = resetStreams;
|
||||
}
|
||||
|
||||
if (currentRetryAttempt > 0) {
|
||||
retryAfterDelay(currentRetryAttempt);
|
||||
} else {
|
||||
makeRequest();
|
||||
}
|
||||
|
||||
if (streamMode) {
|
||||
return retryStream;
|
||||
} else {
|
||||
return retryRequest;
|
||||
}
|
||||
|
||||
function resetStreams() {
|
||||
delayStream = null;
|
||||
|
||||
if (requestStream) {
|
||||
requestStream.abort && requestStream.abort();
|
||||
requestStream.cancel && requestStream.cancel();
|
||||
|
||||
if (requestStream.destroy) {
|
||||
requestStream.destroy();
|
||||
} else if (requestStream.end) {
|
||||
requestStream.end();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function makeRequest() {
|
||||
currentRetryAttempt++;
|
||||
|
||||
if (streamMode) {
|
||||
streamResponseHandled = false;
|
||||
|
||||
delayStream = through({ objectMode: opts.objectMode });
|
||||
requestStream = opts.request(requestOpts);
|
||||
|
||||
setImmediate(function () {
|
||||
retryStream.emit('request');
|
||||
});
|
||||
|
||||
requestStream
|
||||
// gRPC via google-cloud-node can emit an `error` as well as a `response`
|
||||
// Whichever it emits, we run with-- we can't run with both. That's what
|
||||
// is up with the `streamResponseHandled` tracking.
|
||||
.on('error', function (err) {
|
||||
if (streamResponseHandled) {
|
||||
return;
|
||||
}
|
||||
|
||||
streamResponseHandled = true;
|
||||
onResponse(err);
|
||||
})
|
||||
.on('response', function (resp, body) {
|
||||
if (streamResponseHandled) {
|
||||
return;
|
||||
}
|
||||
|
||||
streamResponseHandled = true;
|
||||
onResponse(null, resp, body);
|
||||
})
|
||||
.on('complete', retryStream.emit.bind(retryStream, 'complete'));
|
||||
|
||||
requestStream.pipe(delayStream);
|
||||
} else {
|
||||
activeRequest = opts.request(requestOpts, onResponse);
|
||||
}
|
||||
}
|
||||
|
||||
function retryAfterDelay(currentRetryAttempt) {
|
||||
if (streamMode) {
|
||||
resetStreams();
|
||||
}
|
||||
|
||||
setTimeout(makeRequest, getNextRetryDelay(currentRetryAttempt));
|
||||
}
|
||||
|
||||
function onResponse(err, response, body) {
|
||||
// An error such as DNS resolution.
|
||||
if (err) {
|
||||
numNoResponseAttempts++;
|
||||
|
||||
if (numNoResponseAttempts <= opts.noResponseRetries) {
|
||||
retryAfterDelay(numNoResponseAttempts);
|
||||
} else {
|
||||
if (streamMode) {
|
||||
retryStream.emit('error', err);
|
||||
retryStream.end();
|
||||
} else {
|
||||
callback(err, response, body);
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Send the response to see if we should try again.
|
||||
if (currentRetryAttempt <= opts.retries && opts.shouldRetryFn(response)) {
|
||||
retryAfterDelay(currentRetryAttempt);
|
||||
return;
|
||||
}
|
||||
|
||||
// No more attempts need to be made, just continue on.
|
||||
if (streamMode) {
|
||||
retryStream.emit('response', response);
|
||||
delayStream.pipe(retryStream);
|
||||
requestStream.on('error', function (err) {
|
||||
retryStream.destroy(err);
|
||||
});
|
||||
} else {
|
||||
callback(err, response, body);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = retryRequest;
|
||||
|
||||
function getNextRetryDelay(retryNumber) {
|
||||
return (Math.pow(2, retryNumber) * 1000) + Math.floor(Math.random() * 1000);
|
||||
}
|
||||
|
||||
module.exports.getNextRetryDelay = getNextRetryDelay;
|
20
website/functions/node_modules/@google-cloud/common/node_modules/retry-request/license
generated
vendored
Normal file
20
website/functions/node_modules/@google-cloud/common/node_modules/retry-request/license
generated
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2015 Stephen Sawchuk
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
70
website/functions/node_modules/@google-cloud/common/node_modules/retry-request/package.json
generated
vendored
Normal file
70
website/functions/node_modules/@google-cloud/common/node_modules/retry-request/package.json
generated
vendored
Normal file
@@ -0,0 +1,70 @@
|
||||
{
|
||||
"_from": "retry-request@^3.0.0",
|
||||
"_id": "retry-request@3.3.2",
|
||||
"_inBundle": false,
|
||||
"_integrity": "sha512-WIiGp37XXDC6e7ku3LFoi7LCL/Gs9luGeeqvbPRb+Zl6OQMw4RCRfSaW+aLfE6lhz1R941UavE6Svl3Dm5xGIQ==",
|
||||
"_location": "/@google-cloud/common/retry-request",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"type": "range",
|
||||
"registry": true,
|
||||
"raw": "retry-request@^3.0.0",
|
||||
"name": "retry-request",
|
||||
"escapedName": "retry-request",
|
||||
"rawSpec": "^3.0.0",
|
||||
"saveSpec": null,
|
||||
"fetchSpec": "^3.0.0"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"/@google-cloud/common"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/retry-request/-/retry-request-3.3.2.tgz",
|
||||
"_shasum": "fd8e0079e7b0dfc7056e500b6f089437db0da4df",
|
||||
"_spec": "retry-request@^3.0.0",
|
||||
"_where": "C:\\Users\\jlevi\\Downloads\\tr2022-strategy-master\\tr2022-strategy-master\\data analysis\\functions\\node_modules\\@google-cloud\\common",
|
||||
"author": {
|
||||
"name": "Stephen Sawchuk",
|
||||
"email": "sawchuk@gmail.com"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/stephenplusplus/retry-request/issues"
|
||||
},
|
||||
"bundleDependencies": false,
|
||||
"dependencies": {
|
||||
"request": "^2.81.0",
|
||||
"through2": "^2.0.0"
|
||||
},
|
||||
"deprecated": false,
|
||||
"description": "Retry a request.",
|
||||
"devDependencies": {
|
||||
"async": "^2.5.0",
|
||||
"lodash.range": "^3.2.0",
|
||||
"mocha": "^2.2.5"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=4"
|
||||
},
|
||||
"files": [
|
||||
"index.js",
|
||||
"index.d.ts",
|
||||
"license"
|
||||
],
|
||||
"homepage": "https://github.com/stephenplusplus/retry-request#readme",
|
||||
"keywords": [
|
||||
"request",
|
||||
"retry",
|
||||
"stream"
|
||||
],
|
||||
"license": "MIT",
|
||||
"main": "index.js",
|
||||
"name": "retry-request",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/stephenplusplus/retry-request.git"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "mocha --timeout 0"
|
||||
},
|
||||
"types": "index.d.ts",
|
||||
"version": "3.3.2"
|
||||
}
|
152
website/functions/node_modules/@google-cloud/common/node_modules/retry-request/readme.md
generated
vendored
Normal file
152
website/functions/node_modules/@google-cloud/common/node_modules/retry-request/readme.md
generated
vendored
Normal file
@@ -0,0 +1,152 @@
|
||||
|
|
||||
|:-:
|
||||
|Retry a [request][request] with built-in [exponential backoff](https://developers.google.com/analytics/devguides/reporting/core/v3/coreErrors#backoff).
|
||||
|
||||
```sh
|
||||
$ npm install --save retry-request
|
||||
```
|
||||
```js
|
||||
var request = require('retry-request');
|
||||
```
|
||||
|
||||
It should work the same as `request` in both callback mode and stream mode.
|
||||
|
||||
Note: This module only works when used as a readable stream, i.e. POST requests aren't supported ([#3](https://github.com/stephenplusplus/retry-request/issues/3)).
|
||||
|
||||
#### Callback
|
||||
|
||||
`urlThatReturns503` will be requested 3 total times before giving up and executing the callback.
|
||||
|
||||
```js
|
||||
request(urlThatReturns503, function (err, resp, body) {});
|
||||
```
|
||||
|
||||
#### Stream
|
||||
|
||||
`urlThatReturns503` will be requested 3 total times before giving up and emitting the `response` and `complete` event as usual.
|
||||
|
||||
```js
|
||||
request(urlThatReturns503)
|
||||
.on('error', function () {})
|
||||
.on('response', function () {})
|
||||
.on('complete', function () {});
|
||||
```
|
||||
|
||||
## request(requestOptions, [opts], [cb])
|
||||
|
||||
### requestOptions
|
||||
|
||||
Passed directly to `request`. See the list of options supported: https://github.com/request/request/#requestoptions-callback.
|
||||
|
||||
### opts *(optional)*
|
||||
|
||||
#### `opts.noResponseRetries`
|
||||
|
||||
Type: `Number`
|
||||
|
||||
Default: `2`
|
||||
|
||||
The number of times to retry after a response fails to come through, such as a DNS resolution error or a socket hangup.
|
||||
|
||||
```js
|
||||
var opts = {
|
||||
noResponseRetries: 0
|
||||
};
|
||||
|
||||
request(url, opts, function (err, resp, body) {
|
||||
// url was requested 1 time before giving up and
|
||||
// executing this callback.
|
||||
});
|
||||
```
|
||||
|
||||
#### `opts.objectMode`
|
||||
|
||||
Type: `Boolean`
|
||||
|
||||
Default: `false`
|
||||
|
||||
Set to `true` if your custom `opts.request` function returns a stream in object mode.
|
||||
|
||||
#### `opts.retries`
|
||||
|
||||
Type: `Number`
|
||||
|
||||
Default: `2`
|
||||
|
||||
```js
|
||||
var opts = {
|
||||
retries: 4
|
||||
};
|
||||
|
||||
request(urlThatReturns503, opts, function (err, resp, body) {
|
||||
// urlThatReturns503 was requested a total of 5 times
|
||||
// before giving up and executing this callback.
|
||||
});
|
||||
```
|
||||
|
||||
#### `opts.currentRetryAttempt`
|
||||
|
||||
Type: `Number`
|
||||
|
||||
Default: `0`
|
||||
|
||||
```js
|
||||
var opts = {
|
||||
currentRetryAttempt: 1
|
||||
};
|
||||
|
||||
request(urlThatReturns503, opts, function (err, resp, body) {
|
||||
// urlThatReturns503 was requested as if it already failed once.
|
||||
});
|
||||
```
|
||||
|
||||
#### `opts.shouldRetryFn`
|
||||
|
||||
Type: `Function`
|
||||
|
||||
Default: Returns `true` if [http.incomingMessage](https://nodejs.org/api/http.html#http_http_incomingmessage).statusCode is < 200 or >= 400.
|
||||
|
||||
```js
|
||||
var opts = {
|
||||
shouldRetryFn: function (incomingHttpMessage) {
|
||||
return incomingHttpMessage.statusMessage !== 'OK';
|
||||
}
|
||||
};
|
||||
|
||||
request(urlThatReturnsNonOKStatusMessage, opts, function (err, resp, body) {
|
||||
// urlThatReturnsNonOKStatusMessage was requested a
|
||||
// total of 3 times, each time using `opts.shouldRetryFn`
|
||||
// to decide if it should continue before giving up and
|
||||
// executing this callback.
|
||||
});
|
||||
```
|
||||
|
||||
#### `opts.request`
|
||||
|
||||
Type: `Function`
|
||||
|
||||
Default: [`request`][request]
|
||||
|
||||
*NOTE: If you override the request function, and it returns a stream in object mode, be sure to set `opts.objectMode` to `true`.*
|
||||
|
||||
```js
|
||||
var originalRequest = require('request').defaults({
|
||||
pool: {
|
||||
maxSockets: Infinity
|
||||
}
|
||||
});
|
||||
|
||||
var opts = {
|
||||
request: originalRequest
|
||||
};
|
||||
|
||||
request(urlThatReturns503, opts, function (err, resp, body) {
|
||||
// Your provided `originalRequest` instance was used.
|
||||
});
|
||||
```
|
||||
|
||||
### cb *(optional)*
|
||||
|
||||
Passed directly to `request`. See the callback section: https://github.com/request/request/#requestoptions-callback.
|
||||
|
||||
[request]: https://github.com/request/request
|
166
website/functions/node_modules/@google-cloud/common/package.json
generated
vendored
Normal file
166
website/functions/node_modules/@google-cloud/common/package.json
generated
vendored
Normal file
@@ -0,0 +1,166 @@
|
||||
{
|
||||
"_from": "@google-cloud/common@^0.17.0",
|
||||
"_id": "@google-cloud/common@0.17.0",
|
||||
"_inBundle": false,
|
||||
"_integrity": "sha512-HRZLSU762E6HaKoGfJGa8W95yRjb9rY7LePhjaHK9ILAnFacMuUGVamDbTHu1csZomm1g3tZTtXfX/aAhtie/Q==",
|
||||
"_location": "/@google-cloud/common",
|
||||
"_phantomChildren": {
|
||||
"request": "2.88.0",
|
||||
"through2": "2.0.5"
|
||||
},
|
||||
"_requested": {
|
||||
"type": "range",
|
||||
"registry": true,
|
||||
"raw": "@google-cloud/common@^0.17.0",
|
||||
"name": "@google-cloud/common",
|
||||
"escapedName": "@google-cloud%2fcommon",
|
||||
"scope": "@google-cloud",
|
||||
"rawSpec": "^0.17.0",
|
||||
"saveSpec": null,
|
||||
"fetchSpec": "^0.17.0"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"/@google-cloud/storage"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.17.0.tgz",
|
||||
"_shasum": "8ef558750db481fc10a13757a49479ab9a1c8c07",
|
||||
"_spec": "@google-cloud/common@^0.17.0",
|
||||
"_where": "C:\\Users\\jlevi\\Downloads\\tr2022-strategy-master\\tr2022-strategy-master\\data analysis\\functions\\node_modules\\@google-cloud\\storage",
|
||||
"author": {
|
||||
"name": "Google Inc."
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/googleapis/nodejs-common/issues"
|
||||
},
|
||||
"bundleDependencies": false,
|
||||
"contributors": [
|
||||
{
|
||||
"name": "Ali Ijaz Sheikh",
|
||||
"email": "ofrobots@google.com"
|
||||
},
|
||||
{
|
||||
"name": "Austin Peterson",
|
||||
"email": "austin@akpwebdesign.com"
|
||||
},
|
||||
{
|
||||
"name": "Dave Gramlich",
|
||||
"email": "callmehiphop@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Eric Uldall",
|
||||
"email": "ericuldall@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Ernest Landrito",
|
||||
"email": "landrito@google.com"
|
||||
},
|
||||
{
|
||||
"name": "Jason Dobry",
|
||||
"email": "jdobry@google.com"
|
||||
},
|
||||
{
|
||||
"name": "Justin King",
|
||||
"email": "jcking@mtu.edu"
|
||||
},
|
||||
{
|
||||
"name": "Karolis Narkevicius",
|
||||
"email": "karolis.n@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Kelvin Jin",
|
||||
"email": "kelvinjin@google.com"
|
||||
},
|
||||
{
|
||||
"name": "Luke Sneeringer",
|
||||
"email": "lukesneeringer@google.com"
|
||||
},
|
||||
{
|
||||
"name": "Matthew Loring",
|
||||
"email": "matthewloring@users.noreply.github.com"
|
||||
},
|
||||
{
|
||||
"name": "Michael Prentice",
|
||||
"email": "splaktar@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Stephen Sawchuk",
|
||||
"email": "sawchuk@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Tim Swast",
|
||||
"email": "swast@google.com"
|
||||
}
|
||||
],
|
||||
"dependencies": {
|
||||
"array-uniq": "^1.0.3",
|
||||
"arrify": "^1.0.1",
|
||||
"concat-stream": "^1.6.0",
|
||||
"create-error-class": "^3.0.2",
|
||||
"duplexify": "^3.5.0",
|
||||
"ent": "^2.2.0",
|
||||
"extend": "^3.0.1",
|
||||
"google-auto-auth": "^0.10.0",
|
||||
"is": "^3.2.0",
|
||||
"log-driver": "1.2.7",
|
||||
"methmeth": "^1.1.0",
|
||||
"modelo": "^4.2.0",
|
||||
"request": "^2.79.0",
|
||||
"retry-request": "^3.0.0",
|
||||
"split-array-stream": "^1.0.0",
|
||||
"stream-events": "^1.0.1",
|
||||
"string-format-obj": "^1.1.0",
|
||||
"through2": "^2.0.3"
|
||||
},
|
||||
"deprecated": false,
|
||||
"description": "Common components for Cloud APIs Node.js Client Libraries",
|
||||
"devDependencies": {
|
||||
"@google-cloud/nodejs-repo-tools": "^2.1.1",
|
||||
"async": "^2.6.0",
|
||||
"codecov": "^3.0.0",
|
||||
"eslint": "^4.10.0",
|
||||
"eslint-config-prettier": "^2.7.0",
|
||||
"eslint-plugin-node": "^6.0.0",
|
||||
"eslint-plugin-prettier": "^2.3.1",
|
||||
"ink-docstrap": "^1.3.0",
|
||||
"intelli-espower-loader": "^1.0.1",
|
||||
"js-green-licenses": "^0.5.0",
|
||||
"jsdoc": "^3.5.5",
|
||||
"mocha": "^5.0.0",
|
||||
"nyc": "^11.3.0",
|
||||
"power-assert": "^1.4.4",
|
||||
"prettier": "^1.11.1",
|
||||
"proxyquire": "^2.0.0",
|
||||
"uuid": "^3.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=4.0.0"
|
||||
},
|
||||
"files": [
|
||||
"src",
|
||||
"AUTHORS",
|
||||
"CONTRIBUTORS",
|
||||
"LICENSE"
|
||||
],
|
||||
"homepage": "https://github.com/googleapis/nodejs-common#readme",
|
||||
"license": "Apache-2.0",
|
||||
"main": "./src/index.js",
|
||||
"name": "@google-cloud/common",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/googleapis/nodejs-common.git"
|
||||
},
|
||||
"scripts": {
|
||||
"cover": "nyc --reporter=lcov mocha --require intelli-espower-loader test/*.js && nyc report",
|
||||
"docs": "repo-tools exec -- jsdoc -c .jsdoc.js",
|
||||
"generate-scaffolding": "repo-tools generate all",
|
||||
"license-check": "jsgl --local .",
|
||||
"lint": "repo-tools lint --cmd eslint -- src/ samples/ system-test/ test/",
|
||||
"posttest": "npm run license-check",
|
||||
"prettier": "repo-tools exec -- prettier --write src/*.js src/*/*.js samples/*.js samples/*/*.js test/*.js test/*/*.js system-test/*.js system-test/*/*.js",
|
||||
"publish-module": "node ../../scripts/publish.js common",
|
||||
"samples-test": "cd samples/ && npm link ../ && npm test && cd ../",
|
||||
"test": "repo-tools test run --cmd npm -- run cover",
|
||||
"test-no-cover": "repo-tools test run --cmd mocha -- test/*.js --no-timeouts"
|
||||
},
|
||||
"version": "0.17.0"
|
||||
}
|
51
website/functions/node_modules/@google-cloud/common/src/index.js
generated
vendored
Normal file
51
website/functions/node_modules/@google-cloud/common/src/index.js
generated
vendored
Normal file
@@ -0,0 +1,51 @@
|
||||
/*!
|
||||
* Copyright 2016 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.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @type {module:common/logger}
|
||||
* @private
|
||||
*/
|
||||
exports.logger = require('./logger.js');
|
||||
|
||||
/**
|
||||
* @type {module:common/operation}
|
||||
* @private
|
||||
*/
|
||||
exports.Operation = require('./operation.js');
|
||||
|
||||
/**
|
||||
* @type {module:common/paginator}
|
||||
* @private
|
||||
*/
|
||||
exports.paginator = require('./paginator.js');
|
||||
|
||||
/**
|
||||
* @type {module:common/service}
|
||||
* @private
|
||||
*/
|
||||
exports.Service = require('./service.js');
|
||||
|
||||
/**
|
||||
* @type {module:common/serviceObject}
|
||||
* @private
|
||||
*/
|
||||
exports.ServiceObject = require('./service-object.js');
|
||||
|
||||
/**
|
||||
* @type {module:common/util}
|
||||
* @private
|
||||
*/
|
||||
exports.util = require('./util.js');
|
71
website/functions/node_modules/@google-cloud/common/src/logger.js
generated
vendored
Normal file
71
website/functions/node_modules/@google-cloud/common/src/logger.js
generated
vendored
Normal file
@@ -0,0 +1,71 @@
|
||||
/*!
|
||||
* Copyright 2016 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.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
/*!
|
||||
* @module common/logger
|
||||
*/
|
||||
|
||||
const format = require('string-format-obj');
|
||||
const is = require('is');
|
||||
const logDriver = require('log-driver');
|
||||
|
||||
/**
|
||||
* The default list of log levels.
|
||||
* @type {string[]}
|
||||
*/
|
||||
const LEVELS = ['silent', 'error', 'warn', 'info', 'debug', 'silly'];
|
||||
|
||||
/**
|
||||
* Create a logger to print output to the console.
|
||||
*
|
||||
* @param {string=|object=} options - Configuration object. If a string, it is
|
||||
* treated as `options.level`.
|
||||
* @param {string=} options.level - The minimum log level that will print to the
|
||||
* console. (Default: `error`)
|
||||
* @param {Array.<string>=} options.levels - The list of levels to use. (Default:
|
||||
* logger.LEVELS)
|
||||
* @param {string=} options.tag - A tag to use in log messages.
|
||||
*/
|
||||
function logger(options) {
|
||||
if (is.string(options)) {
|
||||
options = {
|
||||
level: options,
|
||||
};
|
||||
}
|
||||
|
||||
options = options || {};
|
||||
|
||||
return logDriver({
|
||||
levels: options.levels || LEVELS,
|
||||
|
||||
level: options.level || 'error',
|
||||
|
||||
format: function() {
|
||||
const args = [].slice.call(arguments);
|
||||
|
||||
return format('{level}{tag} {message}', {
|
||||
level: args.shift().toUpperCase(),
|
||||
tag: options.tag ? ':' + options.tag + ':' : '',
|
||||
message: args.join(' '),
|
||||
});
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = logger;
|
||||
module.exports.LEVELS = LEVELS;
|
193
website/functions/node_modules/@google-cloud/common/src/operation.js
generated
vendored
Normal file
193
website/functions/node_modules/@google-cloud/common/src/operation.js
generated
vendored
Normal file
@@ -0,0 +1,193 @@
|
||||
/*!
|
||||
* Copyright 2016 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.
|
||||
*/
|
||||
|
||||
/*!
|
||||
* @module common/operation
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const events = require('events');
|
||||
const extend = require('extend');
|
||||
const modelo = require('modelo');
|
||||
|
||||
/**
|
||||
* @type {module:common/serviceObject}
|
||||
* @private
|
||||
*/
|
||||
const ServiceObject = require('./service-object.js');
|
||||
|
||||
// jscs:disable maximumLineLength
|
||||
/**
|
||||
* An Operation object allows you to interact with APIs that take longer to
|
||||
* process things.
|
||||
*
|
||||
* @constructor
|
||||
* @alias module:common/operation
|
||||
*
|
||||
* @param {object} config - Configuration object.
|
||||
* @param {module:common/service|module:common/serviceObject|module:common/grpcService|module:common/grpcServiceObject} config.parent - The
|
||||
* parent object.
|
||||
* @param {string} id - The operation ID.
|
||||
*/
|
||||
// jscs:enable maximumLineLength
|
||||
function Operation(config) {
|
||||
const methods = {
|
||||
/**
|
||||
* Checks to see if an operation exists.
|
||||
*/
|
||||
exists: true,
|
||||
|
||||
/**
|
||||
* Retrieves the operation.
|
||||
*/
|
||||
get: true,
|
||||
|
||||
/**
|
||||
* Retrieves metadata for the operation.
|
||||
*/
|
||||
getMetadata: {
|
||||
reqOpts: {
|
||||
name: config.id,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
config = extend(
|
||||
{
|
||||
baseUrl: '',
|
||||
},
|
||||
config
|
||||
);
|
||||
|
||||
config.methods = config.methods || methods;
|
||||
|
||||
ServiceObject.call(this, config);
|
||||
events.EventEmitter.call(this);
|
||||
|
||||
this.completeListeners = 0;
|
||||
this.hasActiveListeners = false;
|
||||
|
||||
this.listenForEvents_();
|
||||
}
|
||||
|
||||
modelo.inherits(Operation, ServiceObject, events.EventEmitter);
|
||||
|
||||
/**
|
||||
* Wraps the `complete` and `error` events in a Promise.
|
||||
*
|
||||
* @return {promise}
|
||||
*/
|
||||
Operation.prototype.promise = function() {
|
||||
const self = this;
|
||||
|
||||
return new self.Promise(function(resolve, reject) {
|
||||
self.on('error', reject).on('complete', function(metadata) {
|
||||
resolve([metadata]);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Begin listening for events on the operation. This method keeps track of how
|
||||
* many "complete" listeners are registered and removed, making sure polling is
|
||||
* handled automatically.
|
||||
*
|
||||
* As long as there is one active "complete" listener, the connection is open.
|
||||
* When there are no more listeners, the polling stops.
|
||||
*
|
||||
* @private
|
||||
*/
|
||||
Operation.prototype.listenForEvents_ = function() {
|
||||
const self = this;
|
||||
|
||||
this.on('newListener', function(event) {
|
||||
if (event === 'complete') {
|
||||
self.completeListeners++;
|
||||
|
||||
if (!self.hasActiveListeners) {
|
||||
self.hasActiveListeners = true;
|
||||
self.startPolling_();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
this.on('removeListener', function(event) {
|
||||
if (event === 'complete' && --self.completeListeners === 0) {
|
||||
self.hasActiveListeners = false;
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Poll for a status update. Execute the callback:
|
||||
*
|
||||
* - callback(err): Operation failed
|
||||
* - callback(): Operation incomplete
|
||||
* - callback(null, metadata): Operation complete
|
||||
*
|
||||
* @private
|
||||
*
|
||||
* @param {function} callback
|
||||
*/
|
||||
Operation.prototype.poll_ = function(callback) {
|
||||
this.getMetadata(function(err, resp) {
|
||||
if (err || resp.error) {
|
||||
callback(err || resp.error);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!resp.done) {
|
||||
callback();
|
||||
return;
|
||||
}
|
||||
|
||||
callback(null, resp);
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Poll `getMetadata` to check the operation's status. This runs a loop to ping
|
||||
* the API on an interval.
|
||||
*
|
||||
* Note: This method is automatically called once a "complete" event handler is
|
||||
* registered on the operation.
|
||||
*
|
||||
* @private
|
||||
*/
|
||||
Operation.prototype.startPolling_ = function() {
|
||||
const self = this;
|
||||
|
||||
if (!this.hasActiveListeners) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.poll_(function(err, metadata) {
|
||||
if (err) {
|
||||
self.emit('error', err);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!metadata) {
|
||||
setTimeout(self.startPolling_.bind(self), 500);
|
||||
return;
|
||||
}
|
||||
|
||||
self.emit('complete', metadata);
|
||||
});
|
||||
};
|
||||
|
||||
module.exports = Operation;
|
267
website/functions/node_modules/@google-cloud/common/src/paginator.js
generated
vendored
Normal file
267
website/functions/node_modules/@google-cloud/common/src/paginator.js
generated
vendored
Normal file
@@ -0,0 +1,267 @@
|
||||
/*!
|
||||
* Copyright 2015 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.
|
||||
*/
|
||||
|
||||
/*!
|
||||
* @module common/paginator
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const arrify = require('arrify');
|
||||
const concat = require('concat-stream');
|
||||
const extend = require('extend');
|
||||
const is = require('is');
|
||||
const split = require('split-array-stream');
|
||||
|
||||
/**
|
||||
* @type {module:common/util}
|
||||
* @private
|
||||
*/
|
||||
const util = require('./util.js');
|
||||
|
||||
/*! Developer Documentation
|
||||
*
|
||||
* paginator is used to auto-paginate `nextQuery` methods as well as
|
||||
* streamifying them.
|
||||
*
|
||||
* Before:
|
||||
*
|
||||
* search.query('done=true', function(err, results, nextQuery) {
|
||||
* search.query(nextQuery, function(err, results, nextQuery) {});
|
||||
* });
|
||||
*
|
||||
* After:
|
||||
*
|
||||
* search.query('done=true', function(err, results) {});
|
||||
*
|
||||
* Methods to extend should be written to accept callbacks and return a
|
||||
* `nextQuery`.
|
||||
*/
|
||||
const paginator = {};
|
||||
|
||||
/**
|
||||
* Cache the original method, then overwrite it on the Class's prototype.
|
||||
*
|
||||
* @param {function} Class - The parent class of the methods to extend.
|
||||
* @param {string|string[]} methodNames - Name(s) of the methods to extend.
|
||||
*/
|
||||
paginator.extend = function(Class, methodNames) {
|
||||
methodNames = arrify(methodNames);
|
||||
|
||||
methodNames.forEach(function(methodName) {
|
||||
const originalMethod = Class.prototype[methodName];
|
||||
|
||||
// map the original method to a private member
|
||||
Class.prototype[methodName + '_'] = originalMethod;
|
||||
|
||||
// overwrite the original to auto-paginate
|
||||
Class.prototype[methodName] = function() {
|
||||
const parsedArguments = paginator.parseArguments_(arguments);
|
||||
return paginator.run_(parsedArguments, originalMethod.bind(this));
|
||||
};
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Wraps paginated API calls in a readable object stream.
|
||||
*
|
||||
* This method simply calls the nextQuery recursively, emitting results to a
|
||||
* stream. The stream ends when `nextQuery` is null.
|
||||
*
|
||||
* `maxResults` will act as a cap for how many results are fetched and emitted
|
||||
* to the stream.
|
||||
*
|
||||
* @param {string} methodName - Name of the method to streamify.
|
||||
* @return {function} - Wrapped function.
|
||||
*/
|
||||
paginator.streamify = function(methodName) {
|
||||
return function() {
|
||||
const parsedArguments = paginator.parseArguments_(arguments);
|
||||
const originalMethod = this[methodName + '_'] || this[methodName];
|
||||
|
||||
return paginator.runAsStream_(parsedArguments, originalMethod.bind(this));
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* Parse a pseudo-array `arguments` for a query and callback.
|
||||
*
|
||||
* @param {array} args - The original `arguments` pseduo-array that the original
|
||||
* method received.
|
||||
*/
|
||||
paginator.parseArguments_ = function(args) {
|
||||
let query;
|
||||
let autoPaginate = true;
|
||||
let maxApiCalls = -1;
|
||||
let maxResults = -1;
|
||||
let callback;
|
||||
|
||||
const firstArgument = args[0];
|
||||
const lastArgument = args[args.length - 1];
|
||||
|
||||
if (is.fn(firstArgument)) {
|
||||
callback = firstArgument;
|
||||
} else {
|
||||
query = firstArgument;
|
||||
}
|
||||
|
||||
if (is.fn(lastArgument)) {
|
||||
callback = lastArgument;
|
||||
}
|
||||
|
||||
if (is.object(query)) {
|
||||
query = extend(true, {}, query);
|
||||
|
||||
// Check if the user only asked for a certain amount of results.
|
||||
if (is.number(query.maxResults)) {
|
||||
// `maxResults` is used API-wide.
|
||||
maxResults = query.maxResults;
|
||||
} else if (is.number(query.pageSize)) {
|
||||
// `pageSize` is Pub/Sub's `maxResults`.
|
||||
maxResults = query.pageSize;
|
||||
}
|
||||
|
||||
if (is.number(query.maxApiCalls)) {
|
||||
maxApiCalls = query.maxApiCalls;
|
||||
delete query.maxApiCalls;
|
||||
}
|
||||
|
||||
if (
|
||||
callback &&
|
||||
(maxResults !== -1 || // The user specified a limit.
|
||||
query.autoPaginate === false)
|
||||
) {
|
||||
autoPaginate = false;
|
||||
}
|
||||
}
|
||||
|
||||
const parsedArguments = {
|
||||
query: query || {},
|
||||
autoPaginate: autoPaginate,
|
||||
maxApiCalls: maxApiCalls,
|
||||
maxResults: maxResults,
|
||||
callback: callback,
|
||||
};
|
||||
|
||||
parsedArguments.streamOptions = extend(true, {}, parsedArguments.query);
|
||||
delete parsedArguments.streamOptions.autoPaginate;
|
||||
delete parsedArguments.streamOptions.maxResults;
|
||||
delete parsedArguments.streamOptions.pageSize;
|
||||
|
||||
return parsedArguments;
|
||||
};
|
||||
|
||||
/**
|
||||
* This simply checks to see if `autoPaginate` is set or not, if it's true
|
||||
* then we buffer all results, otherwise simply call the original method.
|
||||
*
|
||||
* @param {array} parsedArguments - Parsed arguments from the original method
|
||||
* call.
|
||||
* @param {object=|string=} parsedArguments.query - Query object. This is most
|
||||
* commonly an object, but to make the API more simple, it can also be a
|
||||
* string in some places.
|
||||
* @param {function=} parsedArguments.callback - Callback function.
|
||||
* @param {boolean} parsedArguments.autoPaginate - Auto-pagination enabled.
|
||||
* @param {boolean} parsedArguments.maxApiCalls - Maximum API calls to make.
|
||||
* @param {number} parsedArguments.maxResults - Maximum results to return.
|
||||
* @param {function} originalMethod - The cached method that accepts a callback
|
||||
* and returns `nextQuery` to receive more results.
|
||||
*/
|
||||
paginator.run_ = function(parsedArguments, originalMethod) {
|
||||
const query = parsedArguments.query;
|
||||
const callback = parsedArguments.callback;
|
||||
const autoPaginate = parsedArguments.autoPaginate;
|
||||
|
||||
if (autoPaginate) {
|
||||
this.runAsStream_(parsedArguments, originalMethod)
|
||||
.on('error', callback)
|
||||
.pipe(
|
||||
concat(function(results) {
|
||||
callback(null, results);
|
||||
})
|
||||
);
|
||||
} else {
|
||||
originalMethod(query, callback);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* This method simply calls the nextQuery recursively, emitting results to a
|
||||
* stream. The stream ends when `nextQuery` is null.
|
||||
*
|
||||
* `maxResults` will act as a cap for how many results are fetched and emitted
|
||||
* to the stream.
|
||||
*
|
||||
* @param {object=|string=} parsedArguments.query - Query object. This is most
|
||||
* commonly an object, but to make the API more simple, it can also be a
|
||||
* string in some places.
|
||||
* @param {function=} parsedArguments.callback - Callback function.
|
||||
* @param {boolean} parsedArguments.autoPaginate - Auto-pagination enabled.
|
||||
* @param {boolean} parsedArguments.maxApiCalls - Maximum API calls to make.
|
||||
* @param {number} parsedArguments.maxResults - Maximum results to return.
|
||||
* @param {function} originalMethod - The cached method that accepts a callback
|
||||
* and returns `nextQuery` to receive more results.
|
||||
* @return {stream} - Readable object stream.
|
||||
*/
|
||||
paginator.runAsStream_ = function(parsedArguments, originalMethod) {
|
||||
let query = parsedArguments.query;
|
||||
let resultsToSend = parsedArguments.maxResults;
|
||||
|
||||
const limiter = util.createLimiter(makeRequest, {
|
||||
maxApiCalls: parsedArguments.maxApiCalls,
|
||||
streamOptions: parsedArguments.streamOptions,
|
||||
});
|
||||
|
||||
const stream = limiter.stream;
|
||||
|
||||
stream.once('reading', function() {
|
||||
makeRequest(query);
|
||||
});
|
||||
|
||||
function makeRequest(query) {
|
||||
originalMethod(query, onResultSet);
|
||||
}
|
||||
|
||||
function onResultSet(err, results, nextQuery) {
|
||||
if (err) {
|
||||
stream.destroy(err);
|
||||
return;
|
||||
}
|
||||
|
||||
if (resultsToSend >= 0 && results.length > resultsToSend) {
|
||||
results = results.splice(0, resultsToSend);
|
||||
}
|
||||
|
||||
resultsToSend -= results.length;
|
||||
|
||||
split(results, stream, function(streamEnded) {
|
||||
if (streamEnded) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (nextQuery && resultsToSend !== 0) {
|
||||
limiter.makeRequest(nextQuery);
|
||||
return;
|
||||
}
|
||||
|
||||
stream.push(null);
|
||||
});
|
||||
}
|
||||
|
||||
return limiter.stream;
|
||||
};
|
||||
|
||||
module.exports = paginator;
|
392
website/functions/node_modules/@google-cloud/common/src/service-object.js
generated
vendored
Normal file
392
website/functions/node_modules/@google-cloud/common/src/service-object.js
generated
vendored
Normal file
@@ -0,0 +1,392 @@
|
||||
/*!
|
||||
* Copyright 2015 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.
|
||||
*/
|
||||
|
||||
/*!
|
||||
* @module common/service-object
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const arrify = require('arrify');
|
||||
const exec = require('methmeth');
|
||||
const extend = require('extend');
|
||||
const is = require('is');
|
||||
|
||||
/**
|
||||
* @type {module:common/util}
|
||||
* @private
|
||||
*/
|
||||
const util = require('./util.js');
|
||||
|
||||
/**
|
||||
* ServiceObject is a base class, meant to be inherited from by a "service
|
||||
* object," like a BigQuery dataset or Storage bucket.
|
||||
*
|
||||
* Most of the time, these objects share common functionality; they can be
|
||||
* created or deleted, and you can get or set their metadata.
|
||||
*
|
||||
* By inheriting from this class, a service object will be extended with these
|
||||
* shared behaviors. Note that any method can be overridden when the service
|
||||
* object requires specific behavior.
|
||||
*
|
||||
* @constructor
|
||||
* @alias module:common/service-object
|
||||
*
|
||||
* @private
|
||||
*
|
||||
* @param {object} config - Configuration object.
|
||||
* @param {string} config.baseUrl - The base URL to make API requests to.
|
||||
* @param {string} config.createMethod - The method which creates this object.
|
||||
* @param {string=} config.id - The identifier of the object. For example, the
|
||||
* name of a Storage bucket or Pub/Sub topic.
|
||||
* @param {object=} config.methods - A map of each method name that should be
|
||||
* inherited.
|
||||
* @param {object} config.methods[].reqOpts - Default request options for this
|
||||
* particular method. A common use case is when `setMetadata` requires a
|
||||
* `PUT` method to override the default `PATCH`.
|
||||
* @param {object} config.parent - The parent service instance. For example, an
|
||||
* instance of Storage if the object is Bucket.
|
||||
*/
|
||||
function ServiceObject(config) {
|
||||
const self = this;
|
||||
|
||||
util.privatize(this, 'metadata', {});
|
||||
|
||||
util.privatize(this, 'baseUrl', config.baseUrl);
|
||||
util.privatize(this, 'parent', config.parent); // Parent class.
|
||||
util.privatize(this, 'id', config.id); // Name or ID (e.g. dataset ID, bucket name, etc.)
|
||||
util.privatize(this, 'createMethod', config.createMethod);
|
||||
util.privatize(this, 'methods', config.methods || {});
|
||||
util.privatize(this, 'interceptors', []);
|
||||
util.privatize(this, 'Promise', this.parent.Promise);
|
||||
|
||||
if (config.methods) {
|
||||
const allMethodNames = Object.keys(ServiceObject.prototype);
|
||||
allMethodNames
|
||||
.filter(function(methodName) {
|
||||
return (
|
||||
// All ServiceObjects need `request`.
|
||||
!/^request/.test(methodName) &&
|
||||
// The ServiceObject didn't redefine the method.
|
||||
self[methodName] === ServiceObject.prototype[methodName] &&
|
||||
// This method isn't wanted.
|
||||
!config.methods[methodName]
|
||||
);
|
||||
})
|
||||
.forEach(function(methodName) {
|
||||
self[methodName] = undefined;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create the object.
|
||||
*
|
||||
* @param {object=} options - Configuration object.
|
||||
* @param {function} callback - The callback function.
|
||||
* @param {?error} callback.err - An error returned while making this request.
|
||||
* @param {object} callback.instance - The instance.
|
||||
* @param {object} callback.apiResponse - The full API response.
|
||||
*/
|
||||
ServiceObject.prototype.create = function(options, callback) {
|
||||
const self = this;
|
||||
const args = [this.id];
|
||||
|
||||
if (is.fn(options)) {
|
||||
callback = options;
|
||||
}
|
||||
|
||||
if (is.object(options)) {
|
||||
args.push(options);
|
||||
}
|
||||
|
||||
// Wrap the callback to return *this* instance of the object, not the newly-
|
||||
// created one.
|
||||
function onCreate(err, instance) {
|
||||
const args = [].slice.call(arguments);
|
||||
|
||||
if (!err) {
|
||||
self.metadata = instance.metadata;
|
||||
args[1] = self; // replace the created `instance` with this one.
|
||||
}
|
||||
|
||||
callback.apply(null, args);
|
||||
}
|
||||
|
||||
args.push(onCreate);
|
||||
|
||||
this.createMethod.apply(null, args);
|
||||
};
|
||||
|
||||
/**
|
||||
* Delete the object.
|
||||
*
|
||||
* @param {function=} callback - The callback function.
|
||||
* @param {?error} callback.err - An error returned while making this request.
|
||||
* @param {object} callback.apiResponse - The full API response.
|
||||
*/
|
||||
ServiceObject.prototype.delete = function(callback) {
|
||||
const methodConfig = this.methods.delete || {};
|
||||
callback = callback || util.noop;
|
||||
|
||||
const reqOpts = extend(
|
||||
{
|
||||
method: 'DELETE',
|
||||
uri: '',
|
||||
},
|
||||
methodConfig.reqOpts
|
||||
);
|
||||
|
||||
// The `request` method may have been overridden to hold any special behavior.
|
||||
// Ensure we call the original `request` method.
|
||||
ServiceObject.prototype.request.call(this, reqOpts, function(err, resp) {
|
||||
callback(err, resp);
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Check if the object exists.
|
||||
*
|
||||
* @param {function} callback - The callback function.
|
||||
* @param {?error} callback.err - An error returned while making this request.
|
||||
* @param {boolean} callback.exists - Whether the object exists or not.
|
||||
*/
|
||||
ServiceObject.prototype.exists = function(callback) {
|
||||
this.get(function(err) {
|
||||
if (err) {
|
||||
if (err.code === 404) {
|
||||
callback(null, false);
|
||||
} else {
|
||||
callback(err);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
callback(null, true);
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Get the object if it exists. Optionally have the object created if an options
|
||||
* object is provided with `autoCreate: true`.
|
||||
*
|
||||
* @param {object=} config - The configuration object that will be used to
|
||||
* create the object if necessary.
|
||||
* @param {boolean} config.autoCreate - Create the object if it doesn't already
|
||||
* exist.
|
||||
* @param {function} callback - The callback function.
|
||||
* @param {?error} callback.err - An error returned while making this request.
|
||||
* @param {object} callback.instance - The instance.
|
||||
* @param {object} callback.apiResponse - The full API response.
|
||||
*/
|
||||
ServiceObject.prototype.get = function(config, callback) {
|
||||
const self = this;
|
||||
|
||||
if (is.fn(config)) {
|
||||
callback = config;
|
||||
config = {};
|
||||
}
|
||||
|
||||
config = config || {};
|
||||
|
||||
const autoCreate = config.autoCreate && is.fn(this.create);
|
||||
delete config.autoCreate;
|
||||
|
||||
function onCreate(err, instance, apiResponse) {
|
||||
if (err) {
|
||||
if (err.code === 409) {
|
||||
self.get(config, callback);
|
||||
return;
|
||||
}
|
||||
|
||||
callback(err, null, apiResponse);
|
||||
return;
|
||||
}
|
||||
|
||||
callback(null, instance, apiResponse);
|
||||
}
|
||||
|
||||
this.getMetadata(function(err, metadata) {
|
||||
if (err) {
|
||||
if (err.code === 404 && autoCreate) {
|
||||
const args = [];
|
||||
|
||||
if (!is.empty(config)) {
|
||||
args.push(config);
|
||||
}
|
||||
|
||||
args.push(onCreate);
|
||||
|
||||
self.create.apply(self, args);
|
||||
return;
|
||||
}
|
||||
|
||||
callback(err, null, metadata);
|
||||
return;
|
||||
}
|
||||
|
||||
callback(null, self, metadata);
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Get the metadata of this object.
|
||||
*
|
||||
* @param {function} callback - The callback function.
|
||||
* @param {?error} callback.err - An error returned while making this request.
|
||||
* @param {object} callback.metadata - The metadata for this object.
|
||||
* @param {object} callback.apiResponse - The full API response.
|
||||
*/
|
||||
ServiceObject.prototype.getMetadata = function(callback) {
|
||||
const self = this;
|
||||
|
||||
const methodConfig = this.methods.getMetadata || {};
|
||||
|
||||
const reqOpts = extend(
|
||||
{
|
||||
uri: '',
|
||||
},
|
||||
methodConfig.reqOpts
|
||||
);
|
||||
|
||||
// The `request` method may have been overridden to hold any special behavior.
|
||||
// Ensure we call the original `request` method.
|
||||
ServiceObject.prototype.request.call(this, reqOpts, function(err, resp) {
|
||||
if (err) {
|
||||
callback(err, null, resp);
|
||||
return;
|
||||
}
|
||||
|
||||
self.metadata = resp;
|
||||
|
||||
callback(null, self.metadata, resp);
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Set the metadata for this object.
|
||||
*
|
||||
* @param {object} metadata - The metadata to set on this object.
|
||||
* @param {function=} callback - The callback function.
|
||||
* @param {?error} callback.err - An error returned while making this request.
|
||||
* @param {object} callback.instance - The instance.
|
||||
* @param {object} callback.apiResponse - The full API response.
|
||||
*/
|
||||
ServiceObject.prototype.setMetadata = function(metadata, callback) {
|
||||
const self = this;
|
||||
|
||||
callback = callback || util.noop;
|
||||
|
||||
const methodConfig = this.methods.setMetadata || {};
|
||||
|
||||
const reqOpts = extend(
|
||||
true,
|
||||
{
|
||||
method: 'PATCH',
|
||||
uri: '',
|
||||
json: metadata,
|
||||
},
|
||||
methodConfig.reqOpts
|
||||
);
|
||||
|
||||
// The `request` method may have been overridden to hold any special behavior.
|
||||
// Ensure we call the original `request` method.
|
||||
ServiceObject.prototype.request.call(this, reqOpts, function(err, resp) {
|
||||
if (err) {
|
||||
callback(err, resp);
|
||||
return;
|
||||
}
|
||||
|
||||
self.metadata = resp;
|
||||
|
||||
callback(null, resp);
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Make an authenticated API request.
|
||||
*
|
||||
* @private
|
||||
*
|
||||
* @param {object} reqOpts - Request options that are passed to `request`.
|
||||
* @param {string} reqOpts.uri - A URI relative to the baseUrl.
|
||||
* @param {function} callback - The callback function passed to `request`.
|
||||
*/
|
||||
ServiceObject.prototype.request_ = function(reqOpts, callback) {
|
||||
reqOpts = extend(true, {}, reqOpts);
|
||||
|
||||
const isAbsoluteUrl = reqOpts.uri.indexOf('http') === 0;
|
||||
|
||||
const uriComponents = [this.baseUrl, this.id || '', reqOpts.uri];
|
||||
|
||||
if (isAbsoluteUrl) {
|
||||
uriComponents.splice(0, uriComponents.indexOf(reqOpts.uri));
|
||||
}
|
||||
|
||||
reqOpts.uri = uriComponents
|
||||
.filter(exec('trim')) // Limit to non-empty strings.
|
||||
.map(function(uriComponent) {
|
||||
const trimSlashesRegex = /^\/*|\/*$/g;
|
||||
return uriComponent.replace(trimSlashesRegex, '');
|
||||
})
|
||||
.join('/');
|
||||
|
||||
const childInterceptors = arrify(reqOpts.interceptors_);
|
||||
const localInterceptors = [].slice.call(this.interceptors);
|
||||
|
||||
reqOpts.interceptors_ = childInterceptors.concat(localInterceptors);
|
||||
|
||||
if (!callback) {
|
||||
return this.parent.requestStream(reqOpts);
|
||||
}
|
||||
|
||||
this.parent.request(reqOpts, callback);
|
||||
};
|
||||
|
||||
/**
|
||||
* Make an authenticated API request.
|
||||
*
|
||||
* @private
|
||||
*
|
||||
* @param {object} reqOpts - Request options that are passed to `request`.
|
||||
* @param {string} reqOpts.uri - A URI relative to the baseUrl.
|
||||
* @param {function} callback - The callback function passed to `request`.
|
||||
*/
|
||||
ServiceObject.prototype.request = function(reqOpts, callback) {
|
||||
ServiceObject.prototype.request_.call(this, reqOpts, callback);
|
||||
};
|
||||
|
||||
/**
|
||||
* Make an authenticated API request.
|
||||
*
|
||||
* @private
|
||||
*
|
||||
* @param {object} reqOpts - Request options that are passed to `request`.
|
||||
* @param {string} reqOpts.uri - A URI relative to the baseUrl.
|
||||
*/
|
||||
ServiceObject.prototype.requestStream = function(reqOpts) {
|
||||
return ServiceObject.prototype.request_.call(this, reqOpts);
|
||||
};
|
||||
|
||||
/*! Developer Documentation
|
||||
*
|
||||
* All async methods (except for streams) will return a Promise in the event
|
||||
* that a callback is omitted.
|
||||
*/
|
||||
util.promisifyAll(ServiceObject);
|
||||
|
||||
module.exports = ServiceObject;
|
200
website/functions/node_modules/@google-cloud/common/src/service.js
generated
vendored
Normal file
200
website/functions/node_modules/@google-cloud/common/src/service.js
generated
vendored
Normal file
@@ -0,0 +1,200 @@
|
||||
/*!
|
||||
* Copyright 2015 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.
|
||||
*/
|
||||
|
||||
/*!
|
||||
* @module common/service
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const arrify = require('arrify');
|
||||
const extend = require('extend');
|
||||
|
||||
/**
|
||||
* @type {module:common/util}
|
||||
* @private
|
||||
*/
|
||||
const util = require('./util.js');
|
||||
|
||||
const PROJECT_ID_TOKEN = '{{projectId}}';
|
||||
|
||||
/**
|
||||
* Service is a base class, meant to be inherited from by a "service," like
|
||||
* BigQuery or Storage.
|
||||
*
|
||||
* This handles making authenticated requests by exposing a `makeReq_` function.
|
||||
*
|
||||
* @constructor
|
||||
* @alias module:common/service
|
||||
*
|
||||
* @param {object} config - Configuration object.
|
||||
* @param {string} config.baseUrl - The base URL to make API requests to.
|
||||
* @param {string[]} config.scopes - The scopes required for the request.
|
||||
* @param {object=} options - [Configuration object](#/docs).
|
||||
*/
|
||||
function Service(config, options) {
|
||||
options = options || {};
|
||||
|
||||
util.privatize(this, 'baseUrl', config.baseUrl);
|
||||
util.privatize(this, 'globalInterceptors', arrify(options.interceptors_));
|
||||
util.privatize(this, 'interceptors', []);
|
||||
util.privatize(this, 'packageJson', config.packageJson);
|
||||
util.privatize(this, 'projectId', options.projectId || PROJECT_ID_TOKEN);
|
||||
util.privatize(this, 'projectIdRequired', config.projectIdRequired !== false);
|
||||
util.privatize(this, 'Promise', options.promise || Promise);
|
||||
|
||||
const reqCfg = extend({}, config, {
|
||||
projectIdRequired: this.projectIdRequired,
|
||||
projectId: this.projectId,
|
||||
credentials: options.credentials,
|
||||
keyFile: options.keyFilename,
|
||||
email: options.email,
|
||||
token: options.token,
|
||||
});
|
||||
|
||||
util.privatize(
|
||||
this,
|
||||
'makeAuthenticatedRequest',
|
||||
util.makeAuthenticatedRequestFactory(reqCfg)
|
||||
);
|
||||
util.privatize(this, 'authClient', this.makeAuthenticatedRequest.authClient);
|
||||
util.privatize(
|
||||
this,
|
||||
'getCredentials',
|
||||
this.makeAuthenticatedRequest.getCredentials
|
||||
);
|
||||
|
||||
const isCloudFunctionEnv = !!process.env.FUNCTION_NAME;
|
||||
|
||||
if (isCloudFunctionEnv) {
|
||||
this.interceptors.push({
|
||||
request: function(reqOpts) {
|
||||
reqOpts.forever = false;
|
||||
return reqOpts;
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get and update the Service's project ID.
|
||||
*
|
||||
* @param {function} callback - The callback function.
|
||||
*/
|
||||
Service.prototype.getProjectId = function(callback) {
|
||||
const self = this;
|
||||
|
||||
this.authClient.getProjectId(function(err, projectId) {
|
||||
if (err) {
|
||||
callback(err);
|
||||
return;
|
||||
}
|
||||
|
||||
if (self.projectId === PROJECT_ID_TOKEN && projectId) {
|
||||
self.projectId = projectId;
|
||||
}
|
||||
|
||||
callback(null, self.projectId);
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Make an authenticated API request.
|
||||
*
|
||||
* @private
|
||||
*
|
||||
* @param {object} reqOpts - Request options that are passed to `request`.
|
||||
* @param {string} reqOpts.uri - A URI relative to the baseUrl.
|
||||
* @param {function} callback - The callback function passed to `request`.
|
||||
*/
|
||||
Service.prototype.request_ = function(reqOpts, callback) {
|
||||
reqOpts = extend(true, {}, reqOpts);
|
||||
|
||||
const isAbsoluteUrl = reqOpts.uri.indexOf('http') === 0;
|
||||
|
||||
const uriComponents = [this.baseUrl];
|
||||
|
||||
if (this.projectIdRequired) {
|
||||
uriComponents.push('projects');
|
||||
uriComponents.push(this.projectId);
|
||||
}
|
||||
|
||||
uriComponents.push(reqOpts.uri);
|
||||
|
||||
if (isAbsoluteUrl) {
|
||||
uriComponents.splice(0, uriComponents.indexOf(reqOpts.uri));
|
||||
}
|
||||
|
||||
reqOpts.uri = uriComponents
|
||||
.map(function(uriComponent) {
|
||||
const trimSlashesRegex = /^\/*|\/*$/g;
|
||||
return uriComponent.replace(trimSlashesRegex, '');
|
||||
})
|
||||
.join('/')
|
||||
// Some URIs have colon separators.
|
||||
// Bad: https://.../projects/:list
|
||||
// Good: https://.../projects:list
|
||||
.replace(/\/:/g, ':');
|
||||
|
||||
// Interceptors should be called in the order they were assigned.
|
||||
const combinedInterceptors = [].slice
|
||||
.call(this.globalInterceptors)
|
||||
.concat(this.interceptors)
|
||||
.concat(arrify(reqOpts.interceptors_));
|
||||
|
||||
let interceptor;
|
||||
|
||||
while ((interceptor = combinedInterceptors.shift()) && interceptor.request) {
|
||||
reqOpts = interceptor.request(reqOpts);
|
||||
}
|
||||
|
||||
delete reqOpts.interceptors_;
|
||||
|
||||
const pkg = this.packageJson;
|
||||
reqOpts.headers = extend({}, reqOpts.headers, {
|
||||
'User-Agent': util.getUserAgentFromPackageJson(pkg),
|
||||
'x-goog-api-client': `gl-node/${process.versions.node} gccl/${pkg.version}`,
|
||||
});
|
||||
|
||||
return this.makeAuthenticatedRequest(reqOpts, callback);
|
||||
};
|
||||
|
||||
/**
|
||||
* Make an authenticated API request.
|
||||
*
|
||||
* @private
|
||||
*
|
||||
* @param {object} reqOpts - Request options that are passed to `request`.
|
||||
* @param {string} reqOpts.uri - A URI relative to the baseUrl.
|
||||
* @param {function} callback - The callback function passed to `request`.
|
||||
*/
|
||||
Service.prototype.request = function(reqOpts, callback) {
|
||||
Service.prototype.request_.call(this, reqOpts, callback);
|
||||
};
|
||||
|
||||
/**
|
||||
* Make an authenticated API request.
|
||||
*
|
||||
* @private
|
||||
*
|
||||
* @param {object} reqOpts - Request options that are passed to `request`.
|
||||
* @param {string} reqOpts.uri - A URI relative to the baseUrl.
|
||||
*/
|
||||
Service.prototype.requestStream = function(reqOpts) {
|
||||
return Service.prototype.request_.call(this, reqOpts);
|
||||
};
|
||||
|
||||
module.exports = Service;
|
830
website/functions/node_modules/@google-cloud/common/src/util.js
generated
vendored
Normal file
830
website/functions/node_modules/@google-cloud/common/src/util.js
generated
vendored
Normal file
@@ -0,0 +1,830 @@
|
||||
/**
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/*!
|
||||
* @module common/util
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const createErrorClass = require('create-error-class');
|
||||
const duplexify = require('duplexify');
|
||||
const ent = require('ent');
|
||||
const extend = require('extend');
|
||||
const googleAuth = require('google-auto-auth');
|
||||
const is = require('is');
|
||||
const request = require('request').defaults({
|
||||
timeout: 60000,
|
||||
gzip: true,
|
||||
forever: true,
|
||||
pool: {
|
||||
maxSockets: Infinity,
|
||||
},
|
||||
});
|
||||
const retryRequest = require('retry-request');
|
||||
const streamEvents = require('stream-events');
|
||||
const through = require('through2');
|
||||
const uniq = require('array-uniq');
|
||||
|
||||
const util = module.exports;
|
||||
|
||||
/**
|
||||
* Custom error type for missing project ID errors.
|
||||
*/
|
||||
util.MissingProjectIdError = createErrorClass(
|
||||
'MissingProjectIdError',
|
||||
function() {
|
||||
this.message = `Sorry, we cannot connect to Cloud Services without a project
|
||||
ID. You may specify one with an environment variable named
|
||||
"GOOGLE_CLOUD_PROJECT".`.replace(/ +/g, ' ');
|
||||
}
|
||||
);
|
||||
|
||||
/**
|
||||
* No op.
|
||||
*
|
||||
* @example
|
||||
* function doSomething(callback) {
|
||||
* callback = callback || noop;
|
||||
* }
|
||||
*/
|
||||
function noop() {}
|
||||
|
||||
util.noop = noop;
|
||||
|
||||
/**
|
||||
* Custom error type for API errors.
|
||||
*
|
||||
* @param {object} errorBody - Error object.
|
||||
*/
|
||||
util.ApiError = createErrorClass('ApiError', function(errorBody) {
|
||||
this.code = errorBody.code;
|
||||
this.errors = errorBody.errors;
|
||||
this.response = errorBody.response;
|
||||
|
||||
try {
|
||||
this.errors = JSON.parse(this.response.body).error.errors;
|
||||
} catch (e) {
|
||||
this.errors = errorBody.errors;
|
||||
}
|
||||
|
||||
const messages = [];
|
||||
|
||||
if (errorBody.message) {
|
||||
messages.push(errorBody.message);
|
||||
}
|
||||
|
||||
if (this.errors && this.errors.length === 1) {
|
||||
messages.push(this.errors[0].message);
|
||||
} else if (this.response && this.response.body) {
|
||||
messages.push(ent.decode(errorBody.response.body.toString()));
|
||||
} else if (!errorBody.message) {
|
||||
messages.push('Error during request.');
|
||||
}
|
||||
|
||||
this.message = uniq(messages).join(' - ');
|
||||
});
|
||||
|
||||
/**
|
||||
* Custom error type for partial errors returned from the API.
|
||||
*
|
||||
* @param {object} b - Error object.
|
||||
*/
|
||||
util.PartialFailureError = createErrorClass('PartialFailureError', function(b) {
|
||||
const errorObject = b;
|
||||
|
||||
this.errors = errorObject.errors;
|
||||
this.response = errorObject.response;
|
||||
|
||||
const defaultErrorMessage = 'A failure occurred during this request.';
|
||||
this.message = errorObject.message || defaultErrorMessage;
|
||||
});
|
||||
|
||||
/**
|
||||
* Uniformly process an API response.
|
||||
*
|
||||
* @param {*} err - Error value.
|
||||
* @param {*} resp - Response value.
|
||||
* @param {*} body - Body value.
|
||||
* @param {function} callback - The callback function.
|
||||
*/
|
||||
function handleResp(err, resp, body, callback) {
|
||||
callback = callback || util.noop;
|
||||
|
||||
const parsedResp = extend(
|
||||
true,
|
||||
{err: err || null},
|
||||
resp && util.parseHttpRespMessage(resp),
|
||||
body && util.parseHttpRespBody(body)
|
||||
);
|
||||
|
||||
callback(parsedResp.err, parsedResp.body, parsedResp.resp);
|
||||
}
|
||||
|
||||
util.handleResp = handleResp;
|
||||
|
||||
/**
|
||||
* Sniff an incoming HTTP response message for errors.
|
||||
*
|
||||
* @param {object} httpRespMessage - An incoming HTTP response message from
|
||||
* `request`.
|
||||
* @return {object} parsedHttpRespMessage - The parsed response.
|
||||
* @param {?error} parsedHttpRespMessage.err - An error detected.
|
||||
* @param {object} parsedHttpRespMessage.resp - The original response object.
|
||||
*/
|
||||
function parseHttpRespMessage(httpRespMessage) {
|
||||
const parsedHttpRespMessage = {
|
||||
resp: httpRespMessage,
|
||||
};
|
||||
|
||||
if (httpRespMessage.statusCode < 200 || httpRespMessage.statusCode > 299) {
|
||||
// Unknown error. Format according to ApiError standard.
|
||||
parsedHttpRespMessage.err = new util.ApiError({
|
||||
errors: [],
|
||||
code: httpRespMessage.statusCode,
|
||||
message: httpRespMessage.statusMessage,
|
||||
response: httpRespMessage,
|
||||
});
|
||||
}
|
||||
|
||||
return parsedHttpRespMessage;
|
||||
}
|
||||
|
||||
util.parseHttpRespMessage = parseHttpRespMessage;
|
||||
|
||||
/**
|
||||
* Parse the response body from an HTTP request.
|
||||
*
|
||||
* @param {object} body - The response body.
|
||||
* @return {object} parsedHttpRespMessage - The parsed response.
|
||||
* @param {?error} parsedHttpRespMessage.err - An error detected.
|
||||
* @param {object} parsedHttpRespMessage.body - The original body value provided
|
||||
* will try to be JSON.parse'd. If it's successful, the parsed value will be
|
||||
* returned here, otherwise the original value.
|
||||
*/
|
||||
function parseHttpRespBody(body) {
|
||||
const parsedHttpRespBody = {
|
||||
body: body,
|
||||
};
|
||||
|
||||
if (is.string(body)) {
|
||||
try {
|
||||
parsedHttpRespBody.body = JSON.parse(body);
|
||||
} catch (err) {
|
||||
parsedHttpRespBody.err = new util.ApiError('Cannot parse JSON response');
|
||||
}
|
||||
}
|
||||
|
||||
if (parsedHttpRespBody.body && parsedHttpRespBody.body.error) {
|
||||
// Error from JSON API.
|
||||
parsedHttpRespBody.err = new util.ApiError(parsedHttpRespBody.body.error);
|
||||
}
|
||||
|
||||
return parsedHttpRespBody;
|
||||
}
|
||||
|
||||
util.parseHttpRespBody = parseHttpRespBody;
|
||||
|
||||
/**
|
||||
* Take a Duplexify stream, fetch an authenticated connection header, and create
|
||||
* an outgoing writable stream.
|
||||
*
|
||||
* @param {Duplexify} dup - Duplexify stream.
|
||||
* @param {object} options - Configuration object.
|
||||
* @param {module:common/connection} options.connection - A connection instance,
|
||||
* used to get a token with and send the request through.
|
||||
* @param {object} options.metadata - Metadata to send at the head of the
|
||||
* request.
|
||||
* @param {object} options.request - Request object, in the format of a standard
|
||||
* Node.js http.request() object.
|
||||
* @param {string=} options.request.method - Default: "POST".
|
||||
* @param {string=} options.request.qs.uploadType - Default: "multipart".
|
||||
* @param {string=} options.streamContentType - Default:
|
||||
* "application/octet-stream".
|
||||
* @param {function} onComplete - Callback, executed after the writable Request
|
||||
* stream has completed.
|
||||
*/
|
||||
function makeWritableStream(dup, options, onComplete) {
|
||||
onComplete = onComplete || util.noop;
|
||||
|
||||
const writeStream = through();
|
||||
dup.setWritable(writeStream);
|
||||
|
||||
const defaultReqOpts = {
|
||||
method: 'POST',
|
||||
qs: {
|
||||
uploadType: 'multipart',
|
||||
},
|
||||
};
|
||||
|
||||
const metadata = options.metadata || {};
|
||||
|
||||
const reqOpts = extend(true, defaultReqOpts, options.request, {
|
||||
multipart: [
|
||||
{
|
||||
'Content-Type': 'application/json',
|
||||
body: JSON.stringify(metadata),
|
||||
},
|
||||
{
|
||||
'Content-Type': metadata.contentType || 'application/octet-stream',
|
||||
body: writeStream,
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
options.makeAuthenticatedRequest(reqOpts, {
|
||||
onAuthenticated: function(err, authenticatedReqOpts) {
|
||||
if (err) {
|
||||
dup.destroy(err);
|
||||
return;
|
||||
}
|
||||
|
||||
request(authenticatedReqOpts, function(err, resp, body) {
|
||||
util.handleResp(err, resp, body, function(err, data) {
|
||||
if (err) {
|
||||
dup.destroy(err);
|
||||
return;
|
||||
}
|
||||
|
||||
dup.emit('response', resp);
|
||||
onComplete(data);
|
||||
});
|
||||
});
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
util.makeWritableStream = makeWritableStream;
|
||||
|
||||
/**
|
||||
* Returns true if the API request should be retried, given the error that was
|
||||
* given the first time the request was attempted. This is used for rate limit
|
||||
* related errors as well as intermittent server errors.
|
||||
*
|
||||
* @param {error} err - The API error to check if it is appropriate to retry.
|
||||
* @return {boolean} True if the API request should be retried, false otherwise.
|
||||
*/
|
||||
function shouldRetryRequest(err) {
|
||||
if (err) {
|
||||
if ([429, 500, 502, 503].indexOf(err.code) !== -1) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (err.errors) {
|
||||
for (const i in err.errors) {
|
||||
const reason = err.errors[i].reason;
|
||||
if (reason === 'rateLimitExceeded') {
|
||||
return true;
|
||||
}
|
||||
if (reason === 'userRateLimitExceeded') {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
util.shouldRetryRequest = shouldRetryRequest;
|
||||
|
||||
/**
|
||||
* Get a function for making authenticated requests.
|
||||
*
|
||||
* @throws {Error} If a projectId is requested, but not able to be detected.
|
||||
*
|
||||
* @param {object} config - Configuration object.
|
||||
* @param {boolean=} config.autoRetry - Automatically retry requests if the
|
||||
* response is related to rate limits or certain intermittent server errors.
|
||||
* We will exponentially backoff subsequent requests by default. (default:
|
||||
* true)
|
||||
* @param {object=} config.credentials - Credentials object.
|
||||
* @param {boolean=} config.customEndpoint - If true, just return the provided
|
||||
* request options. Default: false.
|
||||
* @param {string=} config.email - Account email address, required for PEM/P12
|
||||
* usage.
|
||||
* @param {number=} config.maxRetries - Maximum number of automatic retries
|
||||
* attempted before returning the error. (default: 3)
|
||||
* @param {string=} config.keyFile - Path to a .json, .pem, or .p12 keyfile.
|
||||
* @param {array} config.scopes - Array of scopes required for the API.
|
||||
*/
|
||||
function makeAuthenticatedRequestFactory(config) {
|
||||
config = config || {};
|
||||
|
||||
const googleAutoAuthConfig = extend({}, config);
|
||||
|
||||
if (googleAutoAuthConfig.projectId === '{{projectId}}') {
|
||||
delete googleAutoAuthConfig.projectId;
|
||||
}
|
||||
|
||||
const authClient = googleAuth(googleAutoAuthConfig);
|
||||
|
||||
/**
|
||||
* The returned function that will make an authenticated request.
|
||||
*
|
||||
* @param {type} reqOpts - Request options in the format `request` expects.
|
||||
* @param {object|function} options - Configuration object or callback
|
||||
* function.
|
||||
* @param {function=} options.onAuthenticated - If provided, a request will
|
||||
* not be made. Instead, this function is passed the error & authenticated
|
||||
* request options.
|
||||
*/
|
||||
function makeAuthenticatedRequest(reqOpts, options) {
|
||||
let stream;
|
||||
const reqConfig = extend({}, config);
|
||||
let activeRequest_;
|
||||
|
||||
if (!options) {
|
||||
stream = duplexify();
|
||||
reqConfig.stream = stream;
|
||||
}
|
||||
|
||||
function onAuthenticated(err, authenticatedReqOpts) {
|
||||
const autoAuthFailed =
|
||||
err &&
|
||||
err.message.indexOf('Could not load the default credentials') > -1;
|
||||
|
||||
if (autoAuthFailed) {
|
||||
// Even though authentication failed, the API might not actually care.
|
||||
authenticatedReqOpts = reqOpts;
|
||||
}
|
||||
|
||||
if (!err || autoAuthFailed) {
|
||||
let projectId = authClient.projectId;
|
||||
|
||||
if (config.projectId && config.projectId !== '{{projectId}}') {
|
||||
projectId = config.projectId;
|
||||
}
|
||||
|
||||
try {
|
||||
authenticatedReqOpts = util.decorateRequest(
|
||||
authenticatedReqOpts,
|
||||
projectId
|
||||
);
|
||||
err = null;
|
||||
} catch (e) {
|
||||
// A projectId was required, but we don't have one.
|
||||
// Re-use the "Could not load the default credentials error" if auto
|
||||
// auth failed.
|
||||
err = err || e;
|
||||
}
|
||||
}
|
||||
|
||||
if (err) {
|
||||
if (stream) {
|
||||
stream.destroy(err);
|
||||
} else {
|
||||
(options.onAuthenticated || options)(err);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (options && options.onAuthenticated) {
|
||||
options.onAuthenticated(null, authenticatedReqOpts);
|
||||
} else {
|
||||
activeRequest_ = util.makeRequest(
|
||||
authenticatedReqOpts,
|
||||
reqConfig,
|
||||
options
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (reqConfig.customEndpoint) {
|
||||
// Using a custom API override. Do not use `google-auto-auth` for
|
||||
// authentication. (ex: connecting to a local Datastore server)
|
||||
onAuthenticated(null, reqOpts);
|
||||
} else {
|
||||
authClient.authorizeRequest(reqOpts, onAuthenticated);
|
||||
}
|
||||
|
||||
if (stream) {
|
||||
return stream;
|
||||
}
|
||||
|
||||
return {
|
||||
abort: function() {
|
||||
if (activeRequest_) {
|
||||
activeRequest_.abort();
|
||||
activeRequest_ = null;
|
||||
}
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
makeAuthenticatedRequest.getCredentials = authClient.getCredentials.bind(
|
||||
authClient
|
||||
);
|
||||
|
||||
makeAuthenticatedRequest.authClient = authClient;
|
||||
|
||||
return makeAuthenticatedRequest;
|
||||
}
|
||||
|
||||
util.makeAuthenticatedRequestFactory = makeAuthenticatedRequestFactory;
|
||||
|
||||
/**
|
||||
* Make a request through the `retryRequest` module with built-in error handling
|
||||
* and exponential back off.
|
||||
*
|
||||
* @param {object} reqOpts - Request options in the format `request` expects.
|
||||
* @param {object=} config - Configuration object.
|
||||
* @param {boolean=} config.autoRetry - Automatically retry requests if the
|
||||
* response is related to rate limits or certain intermittent server errors.
|
||||
* We will exponentially backoff subsequent requests by default. (default:
|
||||
* true)
|
||||
* @param {number=} config.maxRetries - Maximum number of automatic retries
|
||||
* attempted before returning the error. (default: 3)
|
||||
* @param {function} callback - The callback function.
|
||||
*/
|
||||
function makeRequest(reqOpts, config, callback) {
|
||||
if (is.fn(config)) {
|
||||
callback = config;
|
||||
config = {};
|
||||
}
|
||||
|
||||
config = config || {};
|
||||
|
||||
const options = {
|
||||
request: request,
|
||||
|
||||
retries: config.autoRetry !== false ? config.maxRetries || 3 : 0,
|
||||
|
||||
shouldRetryFn: function(httpRespMessage) {
|
||||
const err = util.parseHttpRespMessage(httpRespMessage).err;
|
||||
return err && util.shouldRetryRequest(err);
|
||||
},
|
||||
};
|
||||
|
||||
if (config.stream) {
|
||||
const dup = config.stream;
|
||||
let requestStream;
|
||||
const isGetRequest = (reqOpts.method || 'GET').toUpperCase() === 'GET';
|
||||
|
||||
if (isGetRequest) {
|
||||
requestStream = retryRequest(reqOpts, options);
|
||||
dup.setReadable(requestStream);
|
||||
} else {
|
||||
// Streaming writable HTTP requests cannot be retried.
|
||||
requestStream = request(reqOpts);
|
||||
dup.setWritable(requestStream);
|
||||
}
|
||||
|
||||
// Replay the Request events back to the stream.
|
||||
requestStream
|
||||
.on('error', dup.destroy.bind(dup))
|
||||
.on('response', dup.emit.bind(dup, 'response'))
|
||||
.on('complete', dup.emit.bind(dup, 'complete'));
|
||||
|
||||
dup.abort = requestStream.abort;
|
||||
} else {
|
||||
return retryRequest(reqOpts, options, function(err, response, body) {
|
||||
util.handleResp(err, response, body, callback);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
util.makeRequest = makeRequest;
|
||||
|
||||
/**
|
||||
* Decorate the options about to be made in a request.
|
||||
*
|
||||
* @param {object} reqOpts - The options to be passed to `request`.
|
||||
* @param {string} projectId - The project ID.
|
||||
* @return {object} reqOpts - The decorated reqOpts.
|
||||
*/
|
||||
function decorateRequest(reqOpts, projectId) {
|
||||
delete reqOpts.autoPaginate;
|
||||
delete reqOpts.autoPaginateVal;
|
||||
delete reqOpts.objectMode;
|
||||
|
||||
if (is.object(reqOpts.qs)) {
|
||||
delete reqOpts.qs.autoPaginate;
|
||||
delete reqOpts.qs.autoPaginateVal;
|
||||
reqOpts.qs = util.replaceProjectIdToken(reqOpts.qs, projectId);
|
||||
}
|
||||
|
||||
if (is.object(reqOpts.json)) {
|
||||
delete reqOpts.json.autoPaginate;
|
||||
delete reqOpts.json.autoPaginateVal;
|
||||
reqOpts.json = util.replaceProjectIdToken(reqOpts.json, projectId);
|
||||
}
|
||||
|
||||
reqOpts.uri = util.replaceProjectIdToken(reqOpts.uri, projectId);
|
||||
|
||||
return reqOpts;
|
||||
}
|
||||
|
||||
util.decorateRequest = decorateRequest;
|
||||
|
||||
/**
|
||||
* Populate the `{{projectId}}` placeholder.
|
||||
*
|
||||
* @throws {Error} If a projectId is required, but one is not provided.
|
||||
*
|
||||
* @param {*} - Any input value that may contain a placeholder. Arrays and
|
||||
* objects will be looped.
|
||||
* @param {string} projectId - A projectId. If not provided
|
||||
* @return {*} - The original argument with all placeholders populated.
|
||||
*/
|
||||
function replaceProjectIdToken(value, projectId) {
|
||||
if (is.array(value)) {
|
||||
value = value.map(function(val) {
|
||||
return replaceProjectIdToken(val, projectId);
|
||||
});
|
||||
}
|
||||
|
||||
if (is.object(value) && is.fn(value.hasOwnProperty)) {
|
||||
for (const opt in value) {
|
||||
if (value.hasOwnProperty(opt)) {
|
||||
value[opt] = replaceProjectIdToken(value[opt], projectId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (is.string(value) && value.indexOf('{{projectId}}') > -1) {
|
||||
if (!projectId || projectId === '{{projectId}}') {
|
||||
throw new util.MissingProjectIdError();
|
||||
}
|
||||
value = value.replace(/{{projectId}}/g, projectId);
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
util.replaceProjectIdToken = replaceProjectIdToken;
|
||||
|
||||
/**
|
||||
* Extend a global configuration object with user options provided at the time
|
||||
* of sub-module instantiation.
|
||||
*
|
||||
* Connection details currently come in two ways: `credentials` or
|
||||
* `keyFilename`. Because of this, we have a special exception when overriding a
|
||||
* global configuration object. If a user provides either to the global
|
||||
* configuration, then provides another at submodule instantiation-time, the
|
||||
* latter is preferred.
|
||||
*
|
||||
* @param {object} globalConfig - The global configuration object.
|
||||
* @param {object=} overrides - The instantiation-time configuration object.
|
||||
* @return {object}
|
||||
*/
|
||||
function extendGlobalConfig(globalConfig, overrides) {
|
||||
globalConfig = globalConfig || {};
|
||||
overrides = overrides || {};
|
||||
|
||||
const defaultConfig = {};
|
||||
|
||||
if (process.env.GCLOUD_PROJECT) {
|
||||
defaultConfig.projectId = process.env.GCLOUD_PROJECT;
|
||||
}
|
||||
|
||||
const options = extend({}, globalConfig);
|
||||
|
||||
const hasGlobalConnection = options.credentials || options.keyFilename;
|
||||
const isOverridingConnection = overrides.credentials || overrides.keyFilename;
|
||||
|
||||
if (hasGlobalConnection && isOverridingConnection) {
|
||||
delete options.credentials;
|
||||
delete options.keyFilename;
|
||||
}
|
||||
|
||||
const extendedConfig = extend(true, defaultConfig, options, overrides);
|
||||
|
||||
// Preserve the original (not cloned) interceptors.
|
||||
extendedConfig.interceptors_ = globalConfig.interceptors_;
|
||||
|
||||
return extendedConfig;
|
||||
}
|
||||
|
||||
util.extendGlobalConfig = extendGlobalConfig;
|
||||
|
||||
/**
|
||||
* Merge and validate API configurations.
|
||||
*
|
||||
* @param {object} globalContext - gcloud-level context.
|
||||
* @param {object} globalContext.config_ - gcloud-level configuration.
|
||||
* @param {object} localConfig - Service-level configurations.
|
||||
* @return {object} config - Merged and validated configuration.
|
||||
*/
|
||||
function normalizeArguments(globalContext, localConfig) {
|
||||
const globalConfig = globalContext && globalContext.config_;
|
||||
|
||||
return util.extendGlobalConfig(globalConfig, localConfig);
|
||||
}
|
||||
|
||||
util.normalizeArguments = normalizeArguments;
|
||||
|
||||
/**
|
||||
* Limit requests according to a `maxApiCalls` limit.
|
||||
*
|
||||
* @param {function} makeRequestFn - The function that will be called.
|
||||
* @param {object=} options - Configuration object.
|
||||
* @param {number} options.maxApiCalls - The maximum number of API calls to
|
||||
* make.
|
||||
* @param {object} options.streamOptions - Options to pass to the Stream
|
||||
* constructor.
|
||||
*/
|
||||
function createLimiter(makeRequestFn, options) {
|
||||
options = options || {};
|
||||
|
||||
const stream = streamEvents(through.obj(options.streamOptions));
|
||||
|
||||
let requestsMade = 0;
|
||||
let requestsToMake = -1;
|
||||
|
||||
if (is.number(options.maxApiCalls)) {
|
||||
requestsToMake = options.maxApiCalls;
|
||||
}
|
||||
|
||||
return {
|
||||
makeRequest: function() {
|
||||
requestsMade++;
|
||||
|
||||
if (requestsToMake >= 0 && requestsMade > requestsToMake) {
|
||||
stream.push(null);
|
||||
return;
|
||||
}
|
||||
|
||||
makeRequestFn.apply(null, arguments);
|
||||
|
||||
return stream;
|
||||
},
|
||||
|
||||
stream: stream,
|
||||
};
|
||||
}
|
||||
|
||||
util.createLimiter = createLimiter;
|
||||
|
||||
function isCustomType(unknown, module) {
|
||||
function getConstructorName(obj) {
|
||||
return obj.constructor && obj.constructor.name.toLowerCase();
|
||||
}
|
||||
|
||||
const moduleNameParts = module.split('/');
|
||||
|
||||
const parentModuleName =
|
||||
moduleNameParts[0] && moduleNameParts[0].toLowerCase();
|
||||
const subModuleName = moduleNameParts[1] && moduleNameParts[1].toLowerCase();
|
||||
|
||||
if (subModuleName && getConstructorName(unknown) !== subModuleName) {
|
||||
return false;
|
||||
}
|
||||
|
||||
let walkingModule = unknown;
|
||||
do {
|
||||
if (getConstructorName(walkingModule) === parentModuleName) {
|
||||
return true;
|
||||
}
|
||||
} while ((walkingModule = walkingModule.parent));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
util.isCustomType = isCustomType;
|
||||
|
||||
/**
|
||||
* Create a properly-formatted User-Agent string from a package.json file.
|
||||
*
|
||||
* @param {object} packageJson - A module's package.json file.
|
||||
* @return {string} userAgent - The formatted User-Agent string.
|
||||
*/
|
||||
function getUserAgentFromPackageJson(packageJson) {
|
||||
const hyphenatedPackageName = packageJson.name
|
||||
.replace('@google-cloud', 'gcloud-node') // For legacy purposes.
|
||||
.replace('/', '-'); // For UA spec-compliance purposes.
|
||||
|
||||
return hyphenatedPackageName + '/' + packageJson.version;
|
||||
}
|
||||
|
||||
util.getUserAgentFromPackageJson = getUserAgentFromPackageJson;
|
||||
|
||||
/**
|
||||
* Wraps a callback style function to conditionally return a promise.
|
||||
*
|
||||
* @param {function} originalMethod - The method to promisify.
|
||||
* @param {object=} options - Promise options.
|
||||
* @param {boolean} options.singular - Resolve the promise with single arg
|
||||
* instead of an array.
|
||||
* @return {function} wrapped
|
||||
*/
|
||||
function promisify(originalMethod, options) {
|
||||
if (originalMethod.promisified_) {
|
||||
return originalMethod;
|
||||
}
|
||||
|
||||
options = options || {};
|
||||
|
||||
const slice = Array.prototype.slice;
|
||||
|
||||
const wrapper = function() {
|
||||
const context = this;
|
||||
let last;
|
||||
|
||||
for (last = arguments.length - 1; last >= 0; last--) {
|
||||
const arg = arguments[last];
|
||||
|
||||
if (is.undefined(arg)) {
|
||||
continue; // skip trailing undefined.
|
||||
}
|
||||
|
||||
if (!is.fn(arg)) {
|
||||
break; // non-callback last argument found.
|
||||
}
|
||||
|
||||
return originalMethod.apply(context, arguments);
|
||||
}
|
||||
|
||||
// peel trailing undefined.
|
||||
const args = slice.call(arguments, 0, last + 1);
|
||||
|
||||
let PromiseCtor = Promise;
|
||||
|
||||
// Because dedupe will likely create a single install of
|
||||
// @google-cloud/common to be shared amongst all modules, we need to
|
||||
// localize it at the Service level.
|
||||
if (context && context.Promise) {
|
||||
PromiseCtor = context.Promise;
|
||||
}
|
||||
|
||||
return new PromiseCtor(function(resolve, reject) {
|
||||
args.push(function() {
|
||||
const callbackArgs = slice.call(arguments);
|
||||
const err = callbackArgs.shift();
|
||||
|
||||
if (err) {
|
||||
return reject(err);
|
||||
}
|
||||
|
||||
if (options.singular && callbackArgs.length === 1) {
|
||||
resolve(callbackArgs[0]);
|
||||
} else {
|
||||
resolve(callbackArgs);
|
||||
}
|
||||
});
|
||||
|
||||
originalMethod.apply(context, args);
|
||||
});
|
||||
};
|
||||
|
||||
wrapper.promisified_ = true;
|
||||
return wrapper;
|
||||
}
|
||||
|
||||
util.promisify = promisify;
|
||||
|
||||
/**
|
||||
* Promisifies certain Class methods. This will not promisify private or
|
||||
* streaming methods.
|
||||
*
|
||||
* @param {module:common/service} Class - Service class.
|
||||
* @param {object=} options - Configuration object.
|
||||
*/
|
||||
function promisifyAll(Class, options) {
|
||||
const exclude = (options && options.exclude) || [];
|
||||
|
||||
const methods = Object.keys(Class.prototype).filter(function(methodName) {
|
||||
return (
|
||||
is.fn(Class.prototype[methodName]) && // is it a function?
|
||||
!/(^_|(Stream|_)|promise$)/.test(methodName) && // is it promisable?
|
||||
exclude.indexOf(methodName) === -1
|
||||
); // is it blacklisted?
|
||||
});
|
||||
|
||||
methods.forEach(function(methodName) {
|
||||
const originalMethod = Class.prototype[methodName];
|
||||
|
||||
if (!originalMethod.promisified_) {
|
||||
Class.prototype[methodName] = util.promisify(originalMethod, options);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
util.promisifyAll = promisifyAll;
|
||||
|
||||
/**
|
||||
* This will mask properties of an object from console.log.
|
||||
*
|
||||
* @param {object} object - The object to assign the property to.
|
||||
* @param {string} propName - Property name.
|
||||
* @param {*} value - Value.
|
||||
*/
|
||||
function privatize(object, propName, value) {
|
||||
Object.defineProperty(object, propName, {value, writable: true});
|
||||
}
|
||||
|
||||
util.privatize = privatize;
|
Reference in New Issue
Block a user