Skip to content

Commit cc093cb

Browse files
streamrouter: implement across storage
1 parent 0cd7f1c commit cc093cb

File tree

5 files changed

+144
-6
lines changed

5 files changed

+144
-6
lines changed

lib/storage/bucket.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,12 @@ var Acl = require('./acl.js');
3838
*/
3939
var File = require('./file.js');
4040

41+
/**
42+
* @type {module:common/streamrouter}
43+
* @private
44+
*/
45+
var streamRouter = require('../common/stream-router.js');
46+
4147
/**
4248
* @type {module:common/util}
4349
* @private
@@ -378,6 +384,18 @@ Bucket.prototype.file = function(name, options) {
378384
* }, function(err, files, nextQuery, apiResponse) {
379385
* // Each file is scoped to its generation.
380386
* });
387+
*
388+
* //-
389+
* // Get the files from your bucket as a readable object stream.
390+
* //-
391+
* bucket.getFiles()
392+
* .on('error', console.error)
393+
* .on('data', function(file) {
394+
* // file is a File object.
395+
* })
396+
* .on('end', function() {
397+
* // All files retrieved.
398+
* });
381399
*/
382400
Bucket.prototype.getFiles = function(query, callback) {
383401
var self = this;
@@ -933,4 +951,11 @@ Bucket.prototype.makeReq_ = function(method, path, query, body, callback) {
933951
this.storage.makeAuthorizedRequest_(reqOpts, callback);
934952
};
935953

954+
/*! Developer Documentation
955+
*
956+
* This method can be used with either a callback or as a readable object
957+
* stream. `streamRouter` is used to add this dual behavior.
958+
*/
959+
streamRouter.extend(Bucket, 'getFiles');
960+
936961
module.exports = Bucket;

lib/storage/index.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,12 @@ var extend = require('extend');
2828
*/
2929
var Bucket = require('./bucket.js');
3030

31+
/**
32+
* @type {module:common/streamrouter}
33+
* @private
34+
*/
35+
var streamRouter = require('../common/stream-router.js');
36+
3137
/**
3238
* @type {module:common/util}
3339
* @private
@@ -272,6 +278,18 @@ Storage.prototype.createBucket = function(name, metadata, callback) {
272278
* gcs.getBuckets({
273279
* maxResults: 5
274280
* }, function(err, buckets, nextQuery, apiResponse) {});
281+
*
282+
* //-
283+
* // Get the buckets from your project as a readable object stream.
284+
* //-
285+
* gcs.getBuckets()
286+
* .on('error', console.error)
287+
* .on('data', function(bucket) {
288+
* // bucket is a Bucket object.
289+
* })
290+
* .on('end', function() {
291+
* // All buckets retrieved.
292+
* });
275293
*/
276294
Storage.prototype.getBuckets = function(query, callback) {
277295
var that = this;
@@ -324,4 +342,11 @@ Storage.prototype.makeReq_ = function(method, path, query, body, callback) {
324342
this.makeAuthorizedRequest_(reqOpts, callback);
325343
};
326344

345+
/*! Developer Documentation
346+
*
347+
* This method can be used with either a callback or as a readable object
348+
* stream. `streamRouter` is used to add this dual behavior.
349+
*/
350+
streamRouter.extend(Storage, 'getBuckets');
351+
327352
module.exports = Storage;

system-test/storage.js

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,14 @@
1818

1919
var assert = require('assert');
2020
var async = require('async');
21+
var Bucket = require('../lib/storage/bucket.js');
2122
var crypto = require('crypto');
23+
var File = require('../lib/storage/file.js');
2224
var fs = require('fs');
2325
var request = require('request');
2426
var through = require('through2');
2527
var tmp = require('tmp');
26-
var util = require('../lib/common/util');
28+
var util = require('../lib/common/util.js');
2729
var uuid = require('node-uuid');
2830

2931
var prop = util.prop;
@@ -440,6 +442,20 @@ describe('storage', function() {
440442
done();
441443
}
442444
});
445+
446+
it('should get buckets as a stream', function(done) {
447+
var bucketEmitted = false;
448+
449+
storage.getBuckets()
450+
.on('error', done)
451+
.on('data', function(bucket) {
452+
bucketEmitted = bucket instanceof Bucket;
453+
})
454+
.on('end', function() {
455+
assert.strictEqual(bucketEmitted, true);
456+
done();
457+
});
458+
});
443459
});
444460

445461
describe('bucket metadata', function() {
@@ -720,6 +736,20 @@ describe('storage', function() {
720736
});
721737
});
722738

739+
it('should get files as a stream', function(done) {
740+
var fileEmitted = false;
741+
742+
bucket.getFiles()
743+
.on('error', done)
744+
.on('data', function(file) {
745+
fileEmitted = file instanceof File;
746+
})
747+
.on('end', function() {
748+
assert.strictEqual(fileEmitted, true);
749+
done();
750+
});
751+
});
752+
723753
it('should paginate the list', function(done) {
724754
var query = { maxResults: filenames.length - 1 };
725755
bucket.getFiles(query, function(err, files, nextQuery) {

test/storage/bucket.js

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,20 @@ fakeAsync.eachLimit = function() {
6363
(eachLimit_Override || async.eachLimit).apply(null, arguments);
6464
};
6565

66+
var extended = false;
67+
var fakeStreamRouter = {
68+
extend: function(Class, methods) {
69+
if (Class.name !== 'Bucket') {
70+
return;
71+
}
72+
73+
methods = util.arrayize(methods);
74+
assert.equal(Class.name, 'Bucket');
75+
assert.deepEqual(methods, ['getFiles']);
76+
extended = true;
77+
}
78+
};
79+
6680
describe('Bucket', function() {
6781
var Bucket;
6882
var BUCKET_NAME = 'test-bucket';
@@ -75,6 +89,7 @@ describe('Bucket', function() {
7589

7690
before(function() {
7791
mockery.registerMock('./file.js', FakeFile);
92+
mockery.registerMock('../common/stream-router.js', fakeStreamRouter);
7893
mockery.registerMock('async', fakeAsync);
7994
mockery.registerMock('request', fakeRequest);
8095
mockery.enable({
@@ -95,7 +110,11 @@ describe('Bucket', function() {
95110
bucket = new Bucket(options, BUCKET_NAME);
96111
});
97112

98-
describe('initialization', function() {
113+
describe('instantiation', function() {
114+
it('should extend the correct methods', function() {
115+
assert(extended); // See `fakeStreamRouter.extend`
116+
});
117+
99118
it('should re-use provided connection', function() {
100119
assert.deepEqual(bucket.authorizeReq_, options.authorizeReq_);
101120
});

test/storage/index.js

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,24 +14,63 @@
1414
* limitations under the License.
1515
*/
1616

17-
/*global describe, it, beforeEach */
18-
1917
'use strict';
2018

19+
// If we don't stub see4_crc32 and use mockery, we get "Module did not self-
20+
// register".
21+
var crc = require('sse4_crc32');
22+
2123
var assert = require('assert');
22-
var Bucket = require('../../lib/storage/bucket.js');
2324
var extend = require('extend');
24-
var Storage = require('../../lib/storage');
25+
var mockery = require('mockery');
26+
2527
var util = require('../../lib/common/util.js');
2628

29+
var extended = false;
30+
var fakeStreamRouter = {
31+
extend: function(Class, methods) {
32+
if (Class.name !== 'Storage') {
33+
return;
34+
}
35+
36+
methods = util.arrayize(methods);
37+
assert.equal(Class.name, 'Storage');
38+
assert.deepEqual(methods, ['getBuckets']);
39+
extended = true;
40+
}
41+
};
42+
2743
describe('Storage', function() {
44+
var Storage;
2845
var storage;
46+
var Bucket;
47+
48+
before(function() {
49+
mockery.registerMock('sse4_crc32', crc);
50+
mockery.registerMock('../common/stream-router.js', fakeStreamRouter);
51+
mockery.enable({
52+
useCleanCache: true,
53+
warnOnUnregistered: false
54+
});
55+
56+
Bucket = require('../../lib/storage/bucket.js');
57+
Storage = require('../../lib/storage');
58+
});
59+
60+
after(function() {
61+
mockery.deregisterAll();
62+
mockery.disable();
63+
});
2964

3065
beforeEach(function() {
3166
storage = new Storage({ projectId: 'project-id' });
3267
});
3368

3469
describe('instantiation', function() {
70+
it('should extend the correct methods', function() {
71+
assert(extended); // See `fakeStreamRouter.extend`
72+
});
73+
3574
it('should throw if a projectId is not specified', function() {
3675
assert.throws(function() {
3776
new Storage();

0 commit comments

Comments
 (0)