feat(p2p): folder transfer feature

This commit is contained in:
Alexey Kasyanchuk 2018-09-02 00:57:56 +03:00
parent 39e2dd71dc
commit 8ee277e764
3 changed files with 38 additions and 25 deletions

30
package-lock.json generated
View File

@ -8536,14 +8536,12 @@
"balanced-match": { "balanced-match": {
"version": "1.0.0", "version": "1.0.0",
"bundled": true, "bundled": true,
"dev": true, "dev": true
"optional": true
}, },
"brace-expansion": { "brace-expansion": {
"version": "1.1.11", "version": "1.1.11",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"balanced-match": "^1.0.0", "balanced-match": "^1.0.0",
"concat-map": "0.0.1" "concat-map": "0.0.1"
@ -8558,20 +8556,17 @@
"code-point-at": { "code-point-at": {
"version": "1.1.0", "version": "1.1.0",
"bundled": true, "bundled": true,
"dev": true, "dev": true
"optional": true
}, },
"concat-map": { "concat-map": {
"version": "0.0.1", "version": "0.0.1",
"bundled": true, "bundled": true,
"dev": true, "dev": true
"optional": true
}, },
"console-control-strings": { "console-control-strings": {
"version": "1.1.0", "version": "1.1.0",
"bundled": true, "bundled": true,
"dev": true, "dev": true
"optional": true
}, },
"core-util-is": { "core-util-is": {
"version": "1.0.2", "version": "1.0.2",
@ -8688,8 +8683,7 @@
"inherits": { "inherits": {
"version": "2.0.3", "version": "2.0.3",
"bundled": true, "bundled": true,
"dev": true, "dev": true
"optional": true
}, },
"ini": { "ini": {
"version": "1.3.5", "version": "1.3.5",
@ -8701,7 +8695,6 @@
"version": "1.0.0", "version": "1.0.0",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"number-is-nan": "^1.0.0" "number-is-nan": "^1.0.0"
} }
@ -8716,7 +8709,6 @@
"version": "3.0.4", "version": "3.0.4",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"brace-expansion": "^1.1.7" "brace-expansion": "^1.1.7"
} }
@ -8724,14 +8716,12 @@
"minimist": { "minimist": {
"version": "0.0.8", "version": "0.0.8",
"bundled": true, "bundled": true,
"dev": true, "dev": true
"optional": true
}, },
"minipass": { "minipass": {
"version": "2.2.4", "version": "2.2.4",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"safe-buffer": "^5.1.1", "safe-buffer": "^5.1.1",
"yallist": "^3.0.0" "yallist": "^3.0.0"
@ -8750,7 +8740,6 @@
"version": "0.5.1", "version": "0.5.1",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"minimist": "0.0.8" "minimist": "0.0.8"
} }
@ -8831,8 +8820,7 @@
"number-is-nan": { "number-is-nan": {
"version": "1.0.1", "version": "1.0.1",
"bundled": true, "bundled": true,
"dev": true, "dev": true
"optional": true
}, },
"object-assign": { "object-assign": {
"version": "4.1.1", "version": "4.1.1",
@ -8844,7 +8832,6 @@
"version": "1.4.0", "version": "1.4.0",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"wrappy": "1" "wrappy": "1"
} }
@ -8966,7 +8953,6 @@
"version": "1.0.2", "version": "1.0.2",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"code-point-at": "^1.0.0", "code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0", "is-fullwidth-code-point": "^1.0.0",
@ -11962,7 +11948,7 @@
}, },
"mkdirp": { "mkdirp": {
"version": "0.5.1", "version": "0.5.1",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
"requires": { "requires": {
"minimist": "0.0.8" "minimist": "0.0.8"

View File

@ -130,6 +130,7 @@
"lodash": "^4.17.5", "lodash": "^4.17.5",
"material-ui": "^0.20.2", "material-ui": "^0.20.2",
"mime": "^2.3.1", "mime": "^2.3.1",
"mkdirp": "^0.5.1",
"moment": "^2.20.1", "moment": "^2.20.1",
"mysql": "^2.15.0", "mysql": "^2.15.0",
"nat-upnp": "^1.1.1", "nat-upnp": "^1.1.1",

View File

@ -9,6 +9,9 @@ const EventEmitter = require('events');
const _ = require('lodash') const _ = require('lodash')
const fs = require('fs') const fs = require('fs')
const ph = require('path') const ph = require('path')
const directoryFilesRecursive = require('./directoryFilesRecursive')
const {promisify} = require('util');
const mkdirp = promisify(require('mkdirp'))
class p2p { class p2p {
constructor(send = () => {}) constructor(send = () => {})
@ -153,6 +156,13 @@ class p2p {
return return
} }
if(fs.lstatSync(filePath).isDirectory())
{
const filesList = directoryFilesRecursive(filePath)
callback({filesList})
return
}
let readable = new fs.ReadStream(filePath) let readable = new fs.ReadStream(filePath)
logT('transfer', 'server transfer file', path) logT('transfer', 'server transfer file', path)
readable.on('data', (chunk) => { readable.on('data', (chunk) => {
@ -411,9 +421,12 @@ class p2p {
} }
logT('transfer', 'get file request', path) logT('transfer', 'get file request', path)
return new Promise((resolve) => return new Promise(async (resolve) =>
{ {
const fileStream = fs.createWriteStream(this.dataDirectory + '/' + (targetPath || ph.basename(path))) const filePath = this.dataDirectory + '/' + (targetPath || ph.basename(path))
// recreate directory to file if not exist
await mkdirp(ph.dirname(filePath))
const fileStream = fs.createWriteStream(filePath)
let peer = null let peer = null
let firstTransfer = false let firstTransfer = false
let deleteCallback = (remotePeer || this).emit('file', {path}, (chunk, nil, addr) => { let deleteCallback = (remotePeer || this).emit('file', {path}, (chunk, nil, addr) => {
@ -435,7 +448,20 @@ class p2p {
return return
} }
const {data} = chunk const {data, filesList} = chunk
if(filesList)
{
logT('transfer', 'get folder content', filesList)
deleteCallback()
fileStream.end()
Promise.all(filesList.map(file => this.file(file, null, addr))).then(() => {
logT('transfer', 'finish transfer all files from folder')
resolve()
})
return
}
if(!data || data.type !== 'Buffer') if(!data || data.type !== 'Buffer')
{ {
logTE('transfer', 'error on file transfer', path) logTE('transfer', 'error on file transfer', path)