2017-06-24 20:06:28 +02:00
|
|
|
import { time } from 'lib/time-utils.js';
|
2017-06-18 01:49:52 +02:00
|
|
|
|
2017-06-13 22:12:08 +02:00
|
|
|
class FileApiDriverMemory {
|
|
|
|
|
|
|
|
constructor(baseDir) {
|
|
|
|
this.items_ = [];
|
|
|
|
}
|
|
|
|
|
|
|
|
itemIndexByPath(path) {
|
|
|
|
for (let i = 0; i < this.items_.length; i++) {
|
|
|
|
if (this.items_[i].path == path) return i;
|
|
|
|
}
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
itemByPath(path) {
|
|
|
|
let index = this.itemIndexByPath(path);
|
|
|
|
return index < 0 ? null : this.items_[index];
|
|
|
|
}
|
|
|
|
|
|
|
|
newItem(path, isDir = false) {
|
2017-06-19 00:06:10 +02:00
|
|
|
let now = time.unixMs();
|
2017-06-13 22:12:08 +02:00
|
|
|
return {
|
|
|
|
path: path,
|
|
|
|
isDir: isDir,
|
2017-06-19 00:06:10 +02:00
|
|
|
updated_time: now, // In milliseconds!!
|
|
|
|
created_time: now, // In milliseconds!!
|
2017-06-13 22:12:08 +02:00
|
|
|
content: '',
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
stat(path) {
|
2017-06-18 01:49:52 +02:00
|
|
|
let item = this.itemByPath(path);
|
|
|
|
return Promise.resolve(item ? Object.assign({}, item) : null);
|
2017-06-13 22:12:08 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
setTimestamp(path, timestamp) {
|
2017-06-18 01:49:52 +02:00
|
|
|
let item = this.itemByPath(path);
|
2017-06-13 22:12:08 +02:00
|
|
|
if (!item) return Promise.reject(new Error('File not found: ' + path));
|
2017-06-19 00:06:10 +02:00
|
|
|
item.updated_time = timestamp;
|
2017-06-13 22:12:08 +02:00
|
|
|
return Promise.resolve();
|
|
|
|
}
|
|
|
|
|
|
|
|
list(path) {
|
|
|
|
let output = [];
|
|
|
|
|
|
|
|
for (let i = 0; i < this.items_.length; i++) {
|
|
|
|
let item = this.items_[i];
|
|
|
|
if (item.path == path) continue;
|
|
|
|
if (item.path.indexOf(path + '/') === 0) {
|
|
|
|
let s = item.path.substr(path.length + 1);
|
|
|
|
if (s.split('/').length === 1) {
|
|
|
|
let it = Object.assign({}, item);
|
2017-06-23 21:09:49 +02:00
|
|
|
it.path = it.path.substr(path.length + 1);
|
2017-06-13 22:12:08 +02:00
|
|
|
output.push(it);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return Promise.resolve(output);
|
|
|
|
}
|
|
|
|
|
|
|
|
get(path) {
|
|
|
|
let item = this.itemByPath(path);
|
2017-06-18 01:49:52 +02:00
|
|
|
if (!item) return Promise.resolve(null);
|
2017-06-13 22:12:08 +02:00
|
|
|
if (item.isDir) return Promise.reject(new Error(path + ' is a directory, not a file'));
|
|
|
|
return Promise.resolve(item.content);
|
|
|
|
}
|
|
|
|
|
|
|
|
mkdir(path) {
|
|
|
|
let index = this.itemIndexByPath(path);
|
|
|
|
if (index >= 0) return Promise.resolve();
|
|
|
|
this.items_.push(this.newItem(path, true));
|
|
|
|
return Promise.resolve();
|
|
|
|
}
|
|
|
|
|
|
|
|
put(path, content) {
|
|
|
|
let index = this.itemIndexByPath(path);
|
|
|
|
if (index < 0) {
|
|
|
|
let item = this.newItem(path, false);
|
|
|
|
item.content = content;
|
|
|
|
this.items_.push(item);
|
|
|
|
} else {
|
|
|
|
this.items_[index].content = content;
|
2017-06-19 00:06:10 +02:00
|
|
|
this.items_[index].updated_time = time.unix();
|
2017-06-13 22:12:08 +02:00
|
|
|
}
|
|
|
|
return Promise.resolve();
|
|
|
|
}
|
|
|
|
|
|
|
|
delete(path) {
|
|
|
|
let index = this.itemIndexByPath(path);
|
|
|
|
if (index >= 0) {
|
|
|
|
this.items_.splice(index, 1);
|
|
|
|
}
|
|
|
|
return Promise.resolve();
|
|
|
|
}
|
|
|
|
|
|
|
|
move(oldPath, newPath) {
|
|
|
|
let sourceItem = this.itemByPath(oldPath);
|
|
|
|
if (!sourceItem) return Promise.reject(new Error('Path not found: ' + oldPath));
|
|
|
|
this.delete(newPath); // Overwrite if newPath already exists
|
|
|
|
sourceItem.path = newPath;
|
|
|
|
return Promise.resolve();
|
|
|
|
}
|
|
|
|
|
2017-06-13 22:58:17 +02:00
|
|
|
format() {
|
|
|
|
this.items_ = [];
|
|
|
|
return Promise.resolve();
|
|
|
|
}
|
|
|
|
|
2017-06-13 22:12:08 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
export { FileApiDriverMemory };
|