Skip to content

Commit 0a905e1

Browse files
committed
Merge pull request #852 from stephenplusplus/spp--storage-allow-starting-resumable-uploads
storage: support creating resumable upload uris
2 parents e77ab5f + bc87687 commit 0a905e1

3 files changed

Lines changed: 97 additions & 2 deletions

File tree

lib/storage/file.js

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ function File(bucket, name, options) {
112112
*
113113
* var myFile = gcs.bucket('my-bucket').file('my-file');
114114
*
115-
* myFile.acl.add({
115+
* myFile.acl.add({
116116
* entity: 'allUsers',
117117
* role: gcs.acl.READER_ROLE
118118
* }, function(err, aclObject) {});
@@ -563,6 +563,51 @@ File.prototype.createReadStream = function(options) {
563563
return throughStream;
564564
};
565565

566+
/**
567+
* Create a unique resumable upload session URI. This is the first step when
568+
* performing a resumable upload.
569+
*
570+
* See the [Resumable upload guide](https://cloud.google.com/storage/docs/json_api/v1/how-tos/upload#resumable)
571+
* for more on how the entire process works.
572+
*
573+
* <h4>Note</h4>
574+
*
575+
* If you are just looking to perform a resumable upload without worrying about
576+
* any of the details, see {module:storage/createWriteStream}. Resumable uploads
577+
* are performed by default.
578+
*
579+
* @resource [Resumable upload guide]{@link https://cloud.google.com/storage/docs/json_api/v1/how-tos/upload#resumable}
580+
*
581+
* @param {object=} metadata - Optional metadata to set on the file.
582+
* @param {function} callback - The callback function.
583+
* @param {?error} callback.err - An error returned while making this request
584+
* @param {string} callback.uri - The resumable upload's unique session URI.
585+
*
586+
* @example
587+
* var bucket = gcs.bucket('my-bucket');
588+
* var file = bucket.file('large-file.zip');
589+
*
590+
* file.createResumableUpload(function(err, uri) {
591+
* if (!err) {
592+
* // `uri` can be used to PUT data to.
593+
* }
594+
* });
595+
*/
596+
File.prototype.createResumableUpload = function(metadata, callback) {
597+
if (is.fn(metadata)) {
598+
callback = metadata;
599+
metadata = {};
600+
}
601+
602+
resumableUpload.createURI({
603+
authClient: this.bucket.storage.makeAuthorizedRequest_.authClient,
604+
bucket: this.bucket.name,
605+
file: this.name,
606+
generation: this.generation,
607+
metadata: metadata || {}
608+
}, callback);
609+
};
610+
566611
/**
567612
* Create a writable stream to overwrite the contents of the file in your
568613
* bucket.
@@ -1318,6 +1363,8 @@ File.prototype.makePublic = function(callback) {
13181363
/**
13191364
* This creates a gcs-resumable-upload upload stream.
13201365
*
1366+
* @resource [gcs-resumable-upload]{@link https://github.com/stephenplusplus/gcs-resumable-upload}
1367+
*
13211368
* @param {Duplexify} stream - Duplexify stream of data to pipe to the file.
13221369
* @param {object=} metadata - Optional metadata to set on the file.
13231370
*

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@
5555
"duplexify": "^3.2.0",
5656
"extend": "^2.0.0",
5757
"gce-images": "^0.1.0",
58-
"gcs-resumable-upload": "^0.1.0",
58+
"gcs-resumable-upload": "^0.2.1",
5959
"google-auto-auth": "^0.2.0",
6060
"hash-stream-validation": "^0.1.0",
6161
"is": "^3.0.1",

test/storage/file.js

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,15 @@ var resumableUpload = require('gcs-resumable-upload');
6262
function fakeResumableUpload() {
6363
return (resumableUploadOverride || resumableUpload).apply(null, arguments);
6464
}
65+
fakeResumableUpload.createURI = function() {
66+
var createURI = resumableUpload.createURI;
67+
68+
if (resumableUploadOverride && resumableUploadOverride.createURI) {
69+
createURI = resumableUploadOverride.createURI;
70+
}
71+
72+
return createURI.apply(null, arguments);
73+
};
6574

6675
describe('File', function() {
6776
var File;
@@ -833,6 +842,45 @@ describe('File', function() {
833842
});
834843
});
835844

845+
describe('createResumableUpload', function() {
846+
it('should not require metadata', function(done) {
847+
resumableUploadOverride = {
848+
createURI: function(opts, callback) {
849+
assert.deepEqual(opts.metadata, {});
850+
callback();
851+
}
852+
};
853+
854+
file.createResumableUpload(done);
855+
});
856+
857+
it('should create a resumable upload URI', function(done) {
858+
var metadata = {
859+
contentType: 'application/json'
860+
};
861+
862+
file.generation = 3;
863+
864+
resumableUploadOverride = {
865+
createURI: function(opts, callback) {
866+
var bucket = file.bucket;
867+
var storage = bucket.storage;
868+
var authClient = storage.makeAuthorizedRequest_.authClient;
869+
870+
assert.strictEqual(opts.authClient, authClient);
871+
assert.strictEqual(opts.bucket, bucket.name);
872+
assert.strictEqual(opts.file, file.name);
873+
assert.strictEqual(opts.generation, file.generation);
874+
assert.strictEqual(opts.metadata, metadata);
875+
876+
callback();
877+
}
878+
};
879+
880+
file.createResumableUpload(metadata, done);
881+
});
882+
});
883+
836884
describe('createWriteStream', function() {
837885
var METADATA = { a: 'b', c: 'd' };
838886

0 commit comments

Comments
 (0)