@@ -14,7 +14,7 @@ const waterfall = require('async/waterfall')
14
14
const isStream = require ( 'is-stream' )
15
15
const isSource = require ( 'is-pull-stream' ) . isSource
16
16
const Duplex = require ( 'readable-stream' ) . Duplex
17
- const OtherBuffer = require ( 'buffer' ) . Buffer
17
+ const isString = require ( 'lodash/isString' )
18
18
const CID = require ( 'cids' )
19
19
const toB58String = require ( 'multihashes' ) . toB58String
20
20
const errCode = require ( 'err-code' )
@@ -270,15 +270,23 @@ module.exports = function files (self) {
270
270
271
271
options = options || { }
272
272
273
- const ok = Buffer . isBuffer ( data ) ||
274
- isStream . readable ( data ) ||
275
- Array . isArray ( data ) ||
276
- OtherBuffer . isBuffer ( data ) ||
277
- typeof data === 'object' ||
278
- isSource ( data )
273
+ // Buffer, pull stream or Node.js stream
274
+ const isBufferOrStream = obj => Buffer . isBuffer ( obj ) || isStream . readable ( obj ) || isSource ( obj )
275
+ // An object like { content?, path? }, where content isBufferOrStream and path isString
276
+ const isContentObject = obj => {
277
+ if ( typeof obj !== 'object' ) return false
278
+ // path is optional if content is present
279
+ if ( obj . content ) return isBufferOrStream ( obj . content )
280
+ // path must be a non-empty string if no content
281
+ return Boolean ( obj . path ) && isString ( obj . path )
282
+ }
283
+ // An input atom: a buffer, stream or content object
284
+ const isInput = obj => isBufferOrStream ( obj ) || isContentObject ( obj )
285
+ // All is ok if data isInput or data is an array of isInput
286
+ const ok = isInput ( data ) || ( Array . isArray ( data ) && data . every ( isInput ) )
279
287
280
288
if ( ! ok ) {
281
- return callback ( new Error ( 'first arg must be a buffer, readable stream, pull stream, an object or array of objects' ) )
289
+ return callback ( new Error ( 'invalid input: expected buffer, readable stream, pull stream, object or array of objects' ) )
282
290
}
283
291
284
292
// CID v0 is for multihashes encoded with sha2-256
0 commit comments