Skip to content

Commit 0651ab3

Browse files
authored
Implement deletion (#5)
1 parent 8f02ac6 commit 0651ab3

File tree

4 files changed

+84
-20
lines changed

4 files changed

+84
-20
lines changed

Diff for: bench.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ const st = createFile('benchmark.txt')
44
st.open(tinyWrites)
55

66
function tinyWrites () {
7-
var offset = 0
7+
let offset = 0
88
const buf = Buffer.alloc(1)
99
console.time('10000 tiny writes')
1010
st.write(0, buf, function onwrite (err) {
@@ -19,7 +19,7 @@ function tinyWrites () {
1919
}
2020

2121
function tinyReads () {
22-
var offset = 0
22+
let offset = 0
2323
console.time('10000 tiny reads')
2424
st.read(0, 1, function onread (err) {
2525
if (err) throw err
@@ -33,7 +33,7 @@ function tinyReads () {
3333
}
3434

3535
function benchRead () {
36-
var offset = 0
36+
let offset = 0
3737
console.time('512mb read')
3838
st.read(0, 65536, function onread (err, buf) {
3939
if (err) throw err
@@ -43,7 +43,7 @@ function benchRead () {
4343
}
4444

4545
function benchWrite () {
46-
var offset = 0
46+
let offset = 0
4747
const buf = Buffer.alloc(65536).fill('hi')
4848
console.time('512mb write')
4949
st.write(offset, buf, function onwrite (err) {

Diff for: example.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
const createFile = require('./')
22

33
const st = createFile('/some/folder/hello-world.txt')
4-
var missing = 2
4+
let missing = 2
55

66
st.write(0, Buffer.from('hello '), done)
77
st.write(6, Buffer.from('world'), done)

Diff for: index.js

+78-14
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
const ras = require('random-access-storage')
22

3-
const TYPE = {type: 'octet/stream'}
3+
const TYPE = { type: 'octet/stream' }
44
const requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem
55
const persistentStorage = navigator.persistentStorage || navigator.webkitPersistentStorage
66
const FileReader = window.FileReader
@@ -27,13 +27,14 @@ function createFile (name, opts) {
2727
const maxSize = opts.maxSize || createFile.DEFAULT_MAX_SIZE
2828
const mutex = new Mutex()
2929

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 = []
3536

36-
return ras({read, write, open, stat, close, destroy})
37+
return ras({ read, write, del, open, stat, close, destroy })
3738

3839
function read (req) {
3940
const r = readers.pop() || new ReadRequest(readers, entry, mutex)
@@ -45,8 +46,13 @@ function createFile (name, opts) {
4546
w.run(req)
4647
}
4748

49+
function del (req) {
50+
const d = deleters.pop() || new DeleteRequest(deleters, entry, mutex)
51+
d.run(req)
52+
}
53+
4854
function close (req) {
49-
readers = writers = entry = fs = null
55+
readers = writers = deleters = entry = fs = null
5056
req.callback(null)
5157
}
5258

@@ -76,7 +82,7 @@ function createFile (name, opts) {
7682
requestFileSystem(window.PERSISTENT, granted, function (res) {
7783
fs = res
7884
mkdirp(parentFolder(name), function () {
79-
fs.root.getFile(name, {create: true}, function (e) {
85+
fs.root.getFile(name, { create: true }, function (e) {
8086
entry = toDestroy = e
8187
req.callback(null)
8288
}, onerror)
@@ -86,9 +92,9 @@ function createFile (name, opts) {
8692

8793
function mkdirp (name, ondone) {
8894
if (!name) return ondone()
89-
fs.root.getDirectory(name, {create: true}, ondone, function () {
95+
fs.root.getDirectory(name, { create: true }, ondone, function () {
9096
mkdirp(parentFolder(name), function () {
91-
fs.root.getDirectory(name, {create: true}, ondone, ondone)
97+
fs.root.getDirectory(name, { create: true }, ondone, ondone)
9298
})
9399
})
94100
}
@@ -166,10 +172,10 @@ WriteRequest.prototype.lock = function () {
166172
WriteRequest.prototype.run = function (req) {
167173
this.entry.file(file => {
168174
this.req = req
175+
169176
if (!this.writer || this.writer.length !== file.size) return this.makeWriter()
170177

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
173179

174180
if (req.offset > this.writer.length) {
175181
if (req.offset > file.size) return this.truncate()
@@ -188,7 +194,7 @@ function Mutex () {
188194
Mutex.prototype.release = function () {
189195
const queued = this.queued
190196
this.queued = null
191-
for (var i = 0; i < queued.length; i++) {
197+
for (let i = 0; i < queued.length; i++) {
192198
queued[i].run(queued[i].req)
193199
}
194200
}
@@ -258,3 +264,61 @@ ReadRequest.prototype.run = function (req) {
258264
this.reader.readAsArrayBuffer(file.slice(req.offset, end))
259265
}, err => req.callback(err))
260266
}
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+
}

Diff for: package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
"random-access-storage": "^1.3.0"
88
},
99
"devDependencies": {
10-
"standard": "^11.0.1"
10+
"standard": "^16.0.4"
1111
},
1212
"scripts": {
1313
"test": "standard"

0 commit comments

Comments
 (0)