Skip to content
This repository was archived by the owner on Mar 16, 2019. It is now read-only.

Commit e42498e

Browse files
committed
Correct Blob.slice behavior #89
- Fix Blob constructor when mixed array contains undefined element - Fix onCreate event invoke issue when Blob is created by Blob.slice
1 parent 9c2687a commit e42498e

File tree

1 file changed

+35
-38
lines changed

1 file changed

+35
-38
lines changed

src/polyfill/Blob.js

Lines changed: 35 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -94,21 +94,26 @@ export default class Blob extends EventTarget {
9494
this.multipartBoundary = boundary
9595
let parts = data.getParts()
9696
let formArray = []
97-
for(let i in parts) {
98-
formArray.push('\r\n--'+boundary+'\r\n')
99-
let part = parts[i]
100-
for(let j in part.headers) {
101-
formArray.push(j + ': ' +part.headers[j] + ';\r\n')
97+
if(!parts) {
98+
p = fs.writeFile(this._ref, '', 'utf8')
99+
}
100+
else {
101+
for(let i in parts) {
102+
formArray.push('\r\n--'+boundary+'\r\n')
103+
let part = parts[i]
104+
for(let j in part.headers) {
105+
formArray.push(j + ': ' +part.headers[j] + ';\r\n')
106+
}
107+
formArray.push('\r\n')
108+
if(part.isRNFetchBlobPolyfill)
109+
formArray.push(part)
110+
else
111+
formArray.push(part.string)
102112
}
103-
formArray.push('\r\n')
104-
if(part.isRNFetchBlobPolyfill)
105-
formArray.push(part)
106-
else
107-
formArray.push(part.string)
113+
log.verbose('FormData array', formArray)
114+
formArray.push('\r\n--'+boundary+'--\r\n')
115+
p = createMixedBlobData(this._ref, formArray)
108116
}
109-
log.verbose('FormData array', formArray)
110-
formArray.push('\r\n--'+boundary+'--\r\n')
111-
p = createMixedBlobData(this._ref, formArray)
112117
}
113118
// if the data is a string starts with `RNFetchBlob-file://`, append the
114119
// Blob data from file path
@@ -205,22 +210,25 @@ export default class Blob extends EventTarget {
205210
* @param {string} contentType Optional, content type of new Blob object
206211
* @return {Blob}
207212
*/
208-
slice(start:?number, end:?number, contentType:?string):Blob {
213+
slice(start:?number, end:?number, contentType='':?string):Blob {
209214
if(this._closed)
210215
throw 'Blob has been released.'
211216
log.verbose('slice called', start, end, contentType)
212217
let resPath = blobCacheDir + getBlobName()
213218
let pass = false
214219
log.debug('fs.slice new blob will at', resPath)
220+
let result = new Blob(RNFetchBlob.wrap(resPath), { type : contentType })
215221
fs.slice(this._ref, resPath, start, end).then((dest) => {
216222
log.debug('fs.slice done', dest)
223+
result._invokeOnCreateEvent()
217224
pass = true
218225
})
219226
.catch((err) => {
220227
pass = true
221228
})
222229
log.debug('slice returning new Blob')
223-
return new Blob(RNFetchBlob.wrap(resPath))
230+
231+
return result
224232
}
225233

226234
/**
@@ -283,6 +291,8 @@ function createMixedBlobData(ref, dataArray) {
283291
let size = 0
284292
for(let i in dataArray) {
285293
let part = dataArray[i]
294+
if(!part)
295+
continue
286296
if(part.isRNFetchBlobPolyfill) {
287297
args.push([ref, part._ref, 'uri'])
288298
}
@@ -296,27 +306,14 @@ function createMixedBlobData(ref, dataArray) {
296306
args.push([ref, part, 'ascii'])
297307
}
298308
// start write blob data
299-
// return p.then(() => {
300-
for(let i in args) {
301-
p = p.then(function(written){
302-
let arg = this
303-
if(written)
304-
size += written
305-
log.verbose('mixed blob write', args[i], written)
306-
return fs.appendFile(...arg)
307-
}.bind(args[i]))
308-
}
309-
return p.then(() => Promise.resolve(size))
310-
// let promises = args.map((p) => {
311-
// log.verbose('mixed blob write', ...p)
312-
// return fs.appendFile.call(this, ...p)
313-
// })
314-
// return Promise.all(promises).then((sizes) => {
315-
// log.verbose('blob write size', sizes)
316-
// for(let i in sizes) {
317-
// size += sizes[i]
318-
// }
319-
// return Promise.resolve(size)
320-
// })
321-
// })
309+
for(let i in args) {
310+
p = p.then(function(written){
311+
let arg = this
312+
if(written)
313+
size += written
314+
log.verbose('mixed blob write', args[i], written)
315+
return fs.appendFile(...arg)
316+
}.bind(args[i]))
317+
}
318+
return p.then(() => Promise.resolve(size))
322319
}

0 commit comments

Comments
 (0)