1
1
const ras = require ( 'random-access-storage' )
2
2
3
- const TYPE = { type : 'octet/stream' }
3
+ const TYPE = { type : 'octet/stream' }
4
4
const requestFileSystem = window . requestFileSystem || window . webkitRequestFileSystem
5
5
const persistentStorage = navigator . persistentStorage || navigator . webkitPersistentStorage
6
6
const FileReader = window . FileReader
@@ -27,13 +27,14 @@ function createFile (name, opts) {
27
27
const maxSize = opts . maxSize || createFile . DEFAULT_MAX_SIZE
28
28
const mutex = new Mutex ( )
29
29
30
- var fs = null
31
- var entry = null
32
- var toDestroy = null
33
- var readers = [ ]
34
- var writers = [ ]
30
+ let fs = null
31
+ let entry = null
32
+ let toDestroy = null
33
+ let readers = [ ]
34
+ let writers = [ ]
35
+ let deleters = [ ]
35
36
36
- return ras ( { read, write, open, stat, close, destroy} )
37
+ return ras ( { read, write, del , open, stat, close, destroy } )
37
38
38
39
function read ( req ) {
39
40
const r = readers . pop ( ) || new ReadRequest ( readers , entry , mutex )
@@ -45,8 +46,13 @@ function createFile (name, opts) {
45
46
w . run ( req )
46
47
}
47
48
49
+ function del ( req ) {
50
+ const d = deleters . pop ( ) || new DeleteRequest ( deleters , entry , mutex )
51
+ d . run ( req )
52
+ }
53
+
48
54
function close ( req ) {
49
- readers = writers = entry = fs = null
55
+ readers = writers = deleters = entry = fs = null
50
56
req . callback ( null )
51
57
}
52
58
@@ -76,7 +82,7 @@ function createFile (name, opts) {
76
82
requestFileSystem ( window . PERSISTENT , granted , function ( res ) {
77
83
fs = res
78
84
mkdirp ( parentFolder ( name ) , function ( ) {
79
- fs . root . getFile ( name , { create : true } , function ( e ) {
85
+ fs . root . getFile ( name , { create : true } , function ( e ) {
80
86
entry = toDestroy = e
81
87
req . callback ( null )
82
88
} , onerror )
@@ -86,9 +92,9 @@ function createFile (name, opts) {
86
92
87
93
function mkdirp ( name , ondone ) {
88
94
if ( ! name ) return ondone ( )
89
- fs . root . getDirectory ( name , { create : true } , ondone , function ( ) {
95
+ fs . root . getDirectory ( name , { create : true } , ondone , function ( ) {
90
96
mkdirp ( parentFolder ( name ) , function ( ) {
91
- fs . root . getDirectory ( name , { create : true } , ondone , ondone )
97
+ fs . root . getDirectory ( name , { create : true } , ondone , ondone )
92
98
} )
93
99
} )
94
100
}
@@ -166,10 +172,10 @@ WriteRequest.prototype.lock = function () {
166
172
WriteRequest . prototype . run = function ( req ) {
167
173
this . entry . file ( file => {
168
174
this . req = req
175
+
169
176
if ( ! this . writer || this . writer . length !== file . size ) return this . makeWriter ( )
170
177
171
- const end = req . offset + req . size
172
- if ( end > file . size && ! this . lock ( ) ) return
178
+ if ( req . offset + req . size > file . size && ! this . lock ( ) ) return
173
179
174
180
if ( req . offset > this . writer . length ) {
175
181
if ( req . offset > file . size ) return this . truncate ( )
@@ -188,7 +194,7 @@ function Mutex () {
188
194
Mutex . prototype . release = function ( ) {
189
195
const queued = this . queued
190
196
this . queued = null
191
- for ( var i = 0 ; i < queued . length ; i ++ ) {
197
+ for ( let i = 0 ; i < queued . length ; i ++ ) {
192
198
queued [ i ] . run ( queued [ i ] . req )
193
199
}
194
200
}
@@ -258,3 +264,61 @@ ReadRequest.prototype.run = function (req) {
258
264
this . reader . readAsArrayBuffer ( file . slice ( req . offset , end ) )
259
265
} , err => req . callback ( err ) )
260
266
}
267
+
268
+ function DeleteRequest ( pool , entry , mutex ) {
269
+ this . pool = pool
270
+ this . entry = entry
271
+ this . mutex = mutex
272
+ this . writer = null
273
+ this . req = null
274
+ this . locked = false
275
+ }
276
+
277
+ DeleteRequest . prototype . makeWriter = function ( ) {
278
+ const self = this
279
+ this . entry . createWriter ( function ( writer ) {
280
+ self . writer = writer
281
+
282
+ writer . onwriteend = function ( ) {
283
+ self . onwrite ( null )
284
+ }
285
+
286
+ writer . onerror = function ( err ) {
287
+ self . onwrite ( err )
288
+ }
289
+
290
+ self . run ( self . req )
291
+ } )
292
+ }
293
+
294
+ DeleteRequest . prototype . onwrite = function ( err ) {
295
+ const req = this . req
296
+ this . req = null
297
+
298
+ if ( this . locked ) {
299
+ this . locked = false
300
+ this . mutex . release ( )
301
+ }
302
+
303
+ this . pool . push ( this )
304
+ req . callback ( err , null )
305
+ }
306
+
307
+ DeleteRequest . prototype . lock = function ( ) {
308
+ if ( this . locked ) return true
309
+ this . locked = this . mutex . lock ( this )
310
+ return this . locked
311
+ }
312
+
313
+ DeleteRequest . prototype . run = function ( req ) {
314
+ this . entry . file ( file => {
315
+ this . req = req
316
+
317
+ if ( req . offset + req . size < file . size ) return req . callback ( null )
318
+
319
+ if ( ! this . writer ) return this . makeWriter ( )
320
+ if ( ! this . lock ( ) ) return
321
+
322
+ this . writer . truncate ( req . offset )
323
+ } , err => req . callback ( err ) )
324
+ }
0 commit comments