/
shareStore.js
119 lines (97 loc) · 3.04 KB
/
shareStore.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import path from 'path'
import fs from 'fs'
import mkdirp from 'mkdirp'
import { writeFileToDisk } from './util'
import { DIR } from './const'
class ShareStore {
constructor(rootdir, arcdir, tmpdir, docstore) {
this.rootdir = rootdir
this.arcdir = arcdir
this.tmpdir = tmpdir
this.docstore = docstore
}
store(doc, callback) {
let uuid = doc.uuid
this.docstore.store(doc, (err, digest) => {
if (err) return callback(err)
let tmppath = path.join(this.tmpdir, uuid)
let dstpath = path.join(this.rootdir, uuid)
writeFileToDisk(tmppath, digest, err => {
if (err) return callback(err)
fs.rename(tmppath, dstpath, err => {
if (err) return callback(err)
callback(null, digest)
})
})
})
}
// async storeAsync(doc) {
// // return new Promise((resolve, reject) =>
// // this.store(doc, (err, digest) =>
// // err ? reject(err) : resolve(digest)))
// // await Promise.promisify(this.store, { context: this })
// // or
// return Promise.promisify(this.store).bind(this)(doc)
// }
archive(uuid, callback) {
let srcpath = path.join(this.rootdir, uuid)
let dstpath = path.join(this.arcdir, uuid)
fs.rename(srcpath, dstpath, err => callback(err))
}
// async archiveAsync(uuid) {
// Promise.promisify(this.archive).bind(this)(uuid)
// }
retrieve(uuid, callback) {
let srcpath = path.join(this.rootdir, uuid)
fs.readFile(srcpath, (err, data) => {
if (err) return callback(err)
let digest = data.toString()
this.docstore.retrieve(digest, (err, doc) => {
if (err) return callback(err)
callback(null, { digest , doc })
})
})
}
retrieveAll(callback) {
fs.readdir(this.rootdir, (err, entries) => {
if (err) return callback(err)
let count = entries.length
if (!count) return callback(null, [])
let result = []
entries.forEach(entry => {
this.retrieve(entry, (err, obj) => {
if (!err) result.push(obj)
if (!--count) callback(null, result)
})
})
})
}
}
const createShareStore = (rootdir, arcdir, tmpdir, docstore, callback) => {
mkdirp(rootdir, err => {
if(err) return callback(err)
mkdirp(arcdir, err => {
if(err) return callback(err)
mkdirp(tmpdir, err => {
if(err) return callback(err)
callback(null, new ShareStore(rootdir, arcdir, tmpdir, docstore))
})
})
})
}
const createMediaShareStore = (froot, docstore, callback) => {
let rootdir = path.join(froot, DIR.MSHARE)
let arcdir = path.join(froot, DIR.MSHAREARC)
let tmpdir = path.join(froot, DIR.TMP)
createShareStore(rootdir, arcdir, tmpdir, docstore, callback)
}
const createFileShareStore = (froot, docstore, callback) => {
let rootdir = path.join(froot, DIR.FSHARE)
let arcdir = path.join(froot, DIR.FSHAREARC)
let tmpdir = path.join(froot, DIR.TMP)
createShareStore(rootdir, arcdir, tmpdir, docstore, callback)
}
export {
createMediaShareStore,
createFileShareStore,
}