w-converhp 2.0.32 → 2.0.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/w-converhp-client.umd.js +2 -2
- package/dist/w-converhp-client.umd.js.map +1 -1
- package/dist/w-converhp-server.umd.js +2 -2
- package/dist/w-converhp-server.umd.js.map +1 -1
- package/docs/WConverhpClient.html +1 -1
- package/docs/WConverhpClient.mjs.html +95 -45
- package/docs/WConverhpServer.html +42 -2
- package/docs/WConverhpServer.mjs.html +184 -67
- package/docs/index.html +1 -1
- package/package.json +2 -2
- package/scla.mjs +1 -1
- package/sclb.mjs +1 -1
- package/sclc.mjs +1 -1
- package/scld.mjs +1 -1
- package/src/WConverhpClient.mjs +94 -44
- package/src/WConverhpServer.mjs +183 -66
- package/srv.mjs +1 -2
package/src/WConverhpClient.mjs
CHANGED
|
@@ -673,37 +673,100 @@ function WConverhpClient(opt) {
|
|
|
673
673
|
//fileTotalSize
|
|
674
674
|
let fileTotalSize = n
|
|
675
675
|
|
|
676
|
+
//chunkTotal
|
|
677
|
+
let chunkTotal = Math.ceil(fileTotalSize / sizeSlice)
|
|
678
|
+
// console.log('chunkTotal', chunkTotal)
|
|
679
|
+
|
|
676
680
|
//fileTotalHash
|
|
681
|
+
// console.log(`calc hash for fileTotalSize[${fileTotalSize}]...`)
|
|
677
682
|
let fileTotalHash = await calcHash(bb)
|
|
678
|
-
// console.log(
|
|
679
|
-
|
|
680
|
-
//
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
//
|
|
691
|
-
|
|
692
|
-
//
|
|
683
|
+
// console.log(`calc hash for fileTotalSize[${fileTotalSize}] done`, fileTotalHash)
|
|
684
|
+
|
|
685
|
+
//send upload-check
|
|
686
|
+
// console.log(`send check-total-hash...`)
|
|
687
|
+
let resCk = await send('upload-check', { mode: 'check-total-hash', fileHash: fileTotalHash, fileSize: fileTotalSize }, { dataType: 'json' })
|
|
688
|
+
// console.log('resCk', resCk)
|
|
689
|
+
// resCk {
|
|
690
|
+
// path: 'uploadTemp\\2429b7ef08ce6ba9',
|
|
691
|
+
// bAllExist: false,
|
|
692
|
+
// bAllSize: false,
|
|
693
|
+
// bAllHash: false,
|
|
694
|
+
// bSls: true,
|
|
695
|
+
// slks: [
|
|
696
|
+
// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
|
|
697
|
+
// 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
|
|
698
|
+
// 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
|
|
699
|
+
// 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
|
|
700
|
+
// 48, 49, 50, 51, 52, 53
|
|
701
|
+
// ]
|
|
702
|
+
// }
|
|
693
703
|
|
|
694
704
|
//check
|
|
695
|
-
if (
|
|
705
|
+
if (resCk.bAllHash) {
|
|
696
706
|
// console.log('已有上傳大檔')
|
|
697
707
|
let resMg = {
|
|
698
708
|
filename: fileTotalName,
|
|
699
|
-
path:
|
|
709
|
+
path: resCk.path,
|
|
700
710
|
}
|
|
701
711
|
return resMg
|
|
702
712
|
}
|
|
703
713
|
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
714
|
+
//針對伺服器上已有切片檔案計算hash與比對
|
|
715
|
+
if (resCk.slks.length > 0) {
|
|
716
|
+
// console.log('receive slks...', resCk.slks[0], size(resCk.slks))
|
|
717
|
+
|
|
718
|
+
//fileSliceHashs
|
|
719
|
+
let fileSliceHashs = []
|
|
720
|
+
// let n = Math.max(resCk.slks.length, 1)
|
|
721
|
+
// let nr = Math.floor(n / 200)
|
|
722
|
+
for (let k = 0; k < resCk.slks.length; k++) {
|
|
723
|
+
// if (k % nr === 0) {
|
|
724
|
+
// console.log(`calc hash for slices`, round(k / resCk.slks.length * 100, 1), '%')
|
|
725
|
+
// }
|
|
726
|
+
|
|
727
|
+
//i
|
|
728
|
+
let i = resCk.slks[k]
|
|
729
|
+
|
|
730
|
+
//start
|
|
731
|
+
let start = i * sizeSlice
|
|
732
|
+
|
|
733
|
+
//end
|
|
734
|
+
let end = Math.min(start + sizeSlice, fileTotalSize)
|
|
735
|
+
|
|
736
|
+
//chunk
|
|
737
|
+
let chunk = bb.slice(start, end)
|
|
738
|
+
|
|
739
|
+
//fileSliceHash
|
|
740
|
+
let fileSliceHash = await calcHash(chunk)
|
|
741
|
+
// console.log('fileSliceHash', fileSliceHash)
|
|
742
|
+
|
|
743
|
+
//push
|
|
744
|
+
fileSliceHashs.push({
|
|
745
|
+
i,
|
|
746
|
+
h: fileSliceHash,
|
|
747
|
+
})
|
|
748
|
+
|
|
749
|
+
}
|
|
750
|
+
// console.log('fileSliceHashs', fileSliceHashs)
|
|
751
|
+
|
|
752
|
+
//send upload-check
|
|
753
|
+
// console.log(`send check-slices-hash...`)
|
|
754
|
+
let resCks = await send('upload-check', { mode: 'check-slices-hash', fileHash: fileTotalHash, fileSliceHashs }, { dataType: 'json' })
|
|
755
|
+
// console.log('resCks', resCks)
|
|
756
|
+
// resCks {
|
|
757
|
+
// slks: [
|
|
758
|
+
// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
|
|
759
|
+
// 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
|
|
760
|
+
// 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
|
|
761
|
+
// 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
|
|
762
|
+
// 48, 49, 50, 51, 52, 53
|
|
763
|
+
// ]
|
|
764
|
+
// }
|
|
765
|
+
|
|
766
|
+
//update
|
|
767
|
+
resCk.slks = resCks.slks
|
|
768
|
+
|
|
769
|
+
}
|
|
707
770
|
|
|
708
771
|
//packageId
|
|
709
772
|
let packageId = fileTotalHash
|
|
@@ -722,7 +785,7 @@ function WConverhpClient(opt) {
|
|
|
722
785
|
progCount++
|
|
723
786
|
let r = progCount / chunkTotal
|
|
724
787
|
let prog = r * progWeightSlice * 100
|
|
725
|
-
let psiz = r *
|
|
788
|
+
let psiz = r * fileTotalSize
|
|
726
789
|
cbProgress({ prog, p: psiz, m: 'upload' })
|
|
727
790
|
}
|
|
728
791
|
}
|
|
@@ -732,44 +795,30 @@ function WConverhpClient(opt) {
|
|
|
732
795
|
let perc = msg.prog
|
|
733
796
|
let dir = msg.m
|
|
734
797
|
if (dir === 'download' && perc === 100) {
|
|
735
|
-
cbProgress({ prog: 100, p:
|
|
798
|
+
cbProgress({ prog: 100, p: fileTotalSize, m: 'upload' })
|
|
736
799
|
}
|
|
737
800
|
}
|
|
738
801
|
|
|
739
802
|
//upload slice
|
|
803
|
+
// console.log(`upload slice...`)
|
|
740
804
|
for (let i = 0; i < chunkTotal; i++) {
|
|
741
805
|
|
|
742
|
-
//
|
|
743
|
-
|
|
744
|
-
|
|
806
|
+
//check
|
|
807
|
+
if (resCk.slks.indexOf(i) >= 0) {
|
|
808
|
+
// console.log('已有上傳切片檔')
|
|
809
|
+
cbProgressSlice({ prog: 100, m: 'upload' }) //直接觸發更新進度
|
|
810
|
+
continue
|
|
811
|
+
}
|
|
745
812
|
|
|
746
813
|
//start
|
|
747
814
|
let start = i * sizeSlice
|
|
748
815
|
|
|
749
816
|
//end
|
|
750
|
-
let end = Math.min(start + sizeSlice,
|
|
817
|
+
let end = Math.min(start + sizeSlice, fileTotalSize)
|
|
751
818
|
|
|
752
819
|
//chunk
|
|
753
820
|
let chunk = bb.slice(start, end)
|
|
754
821
|
|
|
755
|
-
//fileSliceHash
|
|
756
|
-
let fileSliceHash = await calcHash(chunk)
|
|
757
|
-
// console.log('fileSliceHash', fileSliceHash)
|
|
758
|
-
|
|
759
|
-
//rChunk
|
|
760
|
-
let rChunk = await ckh({ filename: fileSliceName, fileSize: sizeSlice, fileHash: fileSliceHash })
|
|
761
|
-
// console.log('fileSliceName', fileSliceName)
|
|
762
|
-
// console.log('fileSliceHash', fileSliceHash)
|
|
763
|
-
// console.log('rChunk', rChunk)
|
|
764
|
-
// console.log('')
|
|
765
|
-
|
|
766
|
-
//check
|
|
767
|
-
if (rChunk.existed) {
|
|
768
|
-
// console.log('已有上傳切片檔')
|
|
769
|
-
cbProgressSlice({ prog: 100, m: 'upload' }) //直接觸發更新進度
|
|
770
|
-
continue
|
|
771
|
-
}
|
|
772
|
-
|
|
773
822
|
//send slice
|
|
774
823
|
let hd = {
|
|
775
824
|
'chunk-index': i,
|
|
@@ -789,6 +838,7 @@ function WConverhpClient(opt) {
|
|
|
789
838
|
}
|
|
790
839
|
let resMg = await send('slice-merge', msg, { dataType: 'json', cbProgress: cbProgressMerge })
|
|
791
840
|
|
|
841
|
+
// console.log(`upload slice done`)
|
|
792
842
|
return resMg
|
|
793
843
|
}
|
|
794
844
|
|
package/src/WConverhpServer.mjs
CHANGED
|
@@ -4,6 +4,8 @@ import stream from 'stream'
|
|
|
4
4
|
import Hapi from '@hapi/hapi'
|
|
5
5
|
import Inert from '@hapi/inert' //提供靜態檔案
|
|
6
6
|
import get from 'lodash-es/get.js'
|
|
7
|
+
import each from 'lodash-es/each.js'
|
|
8
|
+
import size from 'lodash-es/size.js'
|
|
7
9
|
import isNumber from 'lodash-es/isNumber.js'
|
|
8
10
|
import genPm from 'wsemi/src/genPm.mjs'
|
|
9
11
|
import evem from 'wsemi/src/evem.mjs'
|
|
@@ -25,6 +27,8 @@ import u8arr2obj from 'wsemi/src/u8arr2obj.mjs'
|
|
|
25
27
|
import fsIsFile from 'wsemi/src/fsIsFile.mjs'
|
|
26
28
|
import fsIsFolder from 'wsemi/src/fsIsFolder.mjs'
|
|
27
29
|
import fsCreateFolder from 'wsemi/src/fsCreateFolder.mjs'
|
|
30
|
+
import fsGetFilesInFolder from 'wsemi/src/fsGetFilesInFolder.mjs'
|
|
31
|
+
import getFileXxHash from 'wsemi/src/getFileXxHash.mjs'
|
|
28
32
|
// import calcFileHash from './calcFileHash.mjs'
|
|
29
33
|
import calcFileHash from './calcFileHash.wk.umd.js'
|
|
30
34
|
// import mergeFiles from './mergeFiles.mjs'
|
|
@@ -47,6 +51,7 @@ import mergeFiles from './mergeFiles.wk.umd.js'
|
|
|
47
51
|
* @param {String} [opt.apiName='api'] 輸入API名稱字串,預設'api'
|
|
48
52
|
* @param {String} [opt.pathUploadTemp='./uploadTemp'] 輸入暫時存放切片上傳檔案資料夾字串,預設'./uploadTemp'
|
|
49
53
|
* @param {String} [opt.tokenType='Bearer'] 輸入token類型字串,預設'Bearer'
|
|
54
|
+
* @param {Integer} [opt.sizeSlice=1024*1024] 輸入切片上傳檔案之切片檔案大小整數,單位為Byte,預設為1024*1024
|
|
50
55
|
* @param {Function} [opt.verifyConn=()=>{return true}] 輸入呼叫API時檢測函數,預設()=>{return true}
|
|
51
56
|
* @param {Array} [opt.corsOrigins=['*']] 輸入允許跨域網域陣列,若給予['*']代表允許全部,預設['*']
|
|
52
57
|
* @param {Integer} [opt.delayForBasic=0] 輸入基本API用延遲響應時間,單位ms,預設0
|
|
@@ -231,6 +236,12 @@ function WConverhpServer(opt = {}) {
|
|
|
231
236
|
tokenType = 'Bearer'
|
|
232
237
|
}
|
|
233
238
|
|
|
239
|
+
//sizeSlice
|
|
240
|
+
let sizeSlice = get(opt, 'sizeSlice')
|
|
241
|
+
if (!ispint(sizeSlice)) {
|
|
242
|
+
sizeSlice = 1024 * 1024 //1m
|
|
243
|
+
}
|
|
244
|
+
|
|
234
245
|
//verifyConn
|
|
235
246
|
let verifyConn = get(opt, 'verifyConn')
|
|
236
247
|
if (!isfun(verifyConn)) {
|
|
@@ -424,12 +435,6 @@ function WConverhpServer(opt = {}) {
|
|
|
424
435
|
}
|
|
425
436
|
|
|
426
437
|
return r
|
|
427
|
-
// return res.response(smr)
|
|
428
|
-
// .header('Return-Type', returnType)
|
|
429
|
-
// .header('Return-Msg', returnMsg)
|
|
430
|
-
// .header('Cache-Control', 'no-cache, no-store, must-revalidate')
|
|
431
|
-
// .header('Content-Type', 'application/octet-stream')
|
|
432
|
-
// .header('Content-Length', smr.readableLength)
|
|
433
438
|
}
|
|
434
439
|
|
|
435
440
|
//responseU8aStreamWithError
|
|
@@ -660,25 +665,17 @@ function WConverhpServer(opt = {}) {
|
|
|
660
665
|
query,
|
|
661
666
|
})
|
|
662
667
|
|
|
663
|
-
//
|
|
664
|
-
let
|
|
665
|
-
let fileSize = get(req, 'payload.fileSize', '')
|
|
666
|
-
let fileHash = get(req, 'payload.fileHash', '')
|
|
667
|
-
// console.log('filename', filename)
|
|
668
|
-
// console.log('fileSize', fileSize)
|
|
669
|
-
// console.log('fileHash', fileHash)
|
|
668
|
+
//mode, 從payload接收
|
|
669
|
+
let mode = get(req, 'payload.mode', '')
|
|
670
670
|
|
|
671
671
|
//check
|
|
672
|
-
if (
|
|
673
|
-
// console.log('invalid
|
|
674
|
-
return responseU8aStreamWithError(res,
|
|
672
|
+
if (mode !== 'check-total-hash' && mode !== 'check-slices-hash') {
|
|
673
|
+
// console.log('invalid mode in payload')
|
|
674
|
+
return responseU8aStreamWithError(res, `invalid mode[${mode}] in payload`)
|
|
675
675
|
}
|
|
676
676
|
|
|
677
|
-
//
|
|
678
|
-
|
|
679
|
-
// console.log('invalid fileSize in payload')
|
|
680
|
-
return responseU8aStreamWithError(res, 'invalid fileSize in payload')
|
|
681
|
-
}
|
|
677
|
+
//fileHash, 從payload接收
|
|
678
|
+
let fileHash = get(req, 'payload.fileHash', '')
|
|
682
679
|
|
|
683
680
|
//check
|
|
684
681
|
if (!isestr(fileHash)) {
|
|
@@ -686,69 +683,189 @@ function WConverhpServer(opt = {}) {
|
|
|
686
683
|
return responseU8aStreamWithError(res, 'invalid fileHash in payload')
|
|
687
684
|
}
|
|
688
685
|
|
|
689
|
-
//
|
|
690
|
-
let
|
|
691
|
-
// console.log('pathFile', pathFile)
|
|
686
|
+
//checkTotalHash
|
|
687
|
+
let checkTotalHash = async () => {
|
|
692
688
|
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
689
|
+
//pathFile
|
|
690
|
+
let pathFile = path.join(pathUploadTemp, fileHash)
|
|
691
|
+
// console.log('pathFile', pathFile)
|
|
692
|
+
|
|
693
|
+
//bAllExist
|
|
694
|
+
let bAllExist = false
|
|
695
|
+
if (true) {
|
|
696
|
+
// console.log(`check exist for pathFile[${pathFile}]...`)
|
|
697
|
+
|
|
698
|
+
bAllExist = fsIsFile(pathFile)
|
|
699
|
+
|
|
700
|
+
// console.log(`check exist for pathFile[${pathFile}] done`, bAllExist)
|
|
700
701
|
}
|
|
701
|
-
let u8aOut = obj2u8arr(out)
|
|
702
|
-
return responseU8aStream(res, u8aOut, { returnType: 'success', returnMsg: 'need to parse' })
|
|
703
|
-
}
|
|
704
702
|
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
let _fileSize = stats.size
|
|
703
|
+
//fileSize, 從payload接收
|
|
704
|
+
let fileSize = get(req, 'payload.fileSize', '')
|
|
708
705
|
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
706
|
+
//check
|
|
707
|
+
if (!isnum(fileSize)) {
|
|
708
|
+
// console.log('invalid fileSize in payload')
|
|
709
|
+
let r = {
|
|
710
|
+
error: 'invalid fileSize in payload',
|
|
711
|
+
}
|
|
712
|
+
return r
|
|
716
713
|
}
|
|
717
|
-
let u8aOut = obj2u8arr(out)
|
|
718
|
-
return responseU8aStream(res, u8aOut, { returnType: 'success', returnMsg: 'need to parse' })
|
|
719
|
-
}
|
|
720
714
|
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
// console.log('hash(backend)', _fileHash)
|
|
726
|
-
// console.log('')
|
|
715
|
+
//bAllSize
|
|
716
|
+
let bAllSize = false
|
|
717
|
+
if (bAllExist) {
|
|
718
|
+
// console.log(`check size for pathFile[${pathFile}]...`)
|
|
727
719
|
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
720
|
+
//_fileSize
|
|
721
|
+
let stats = fs.statSync(pathFile)
|
|
722
|
+
let _fileSize = stats.size
|
|
723
|
+
|
|
724
|
+
//bAllSize
|
|
725
|
+
bAllSize = fileSize === _fileSize
|
|
726
|
+
|
|
727
|
+
// console.log(`check size for pathFile[${pathFile}] done`, bAllSize)
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
//bAllHash
|
|
731
|
+
let bAllHash = false
|
|
732
|
+
if (bAllExist && bAllSize) {
|
|
733
|
+
// console.log(`check hash for pathFile[${pathFile}]...`)
|
|
734
|
+
|
|
735
|
+
//bAllHash
|
|
736
|
+
await calcFileHash(pathFile)
|
|
737
|
+
.then((_fileHash) => {
|
|
738
|
+
bAllHash = fileHash === _fileHash
|
|
739
|
+
})
|
|
740
|
+
.catch((err) => {
|
|
741
|
+
console.log(err)
|
|
742
|
+
console.log(`fsIsFile(pathFile)`, pathFile, fsIsFile(pathFile))
|
|
743
|
+
bAllHash = false
|
|
744
|
+
})
|
|
745
|
+
|
|
746
|
+
// console.log(`check hash for pathFile[${pathFile}] done`, bAllHash)
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
//vfps
|
|
750
|
+
let vfps = fsGetFilesInFolder(pathUploadTemp)
|
|
751
|
+
// console.log('vfps', vfps)
|
|
752
|
+
|
|
753
|
+
//slks
|
|
754
|
+
let slks = []
|
|
755
|
+
if (true) {
|
|
756
|
+
each(vfps, (v, k) => {
|
|
757
|
+
let b1 = (v.name).indexOf(`${fileHash}_`) >= 0
|
|
758
|
+
let stats = fs.statSync(v.path)
|
|
759
|
+
let b2 = stats.size === sizeSlice
|
|
760
|
+
let b = b1 && b2
|
|
761
|
+
if (b) {
|
|
762
|
+
slks.push(k)
|
|
763
|
+
}
|
|
764
|
+
})
|
|
765
|
+
}
|
|
766
|
+
// console.log('slks', slks)
|
|
767
|
+
|
|
768
|
+
//bSls
|
|
769
|
+
let bSls = size(slks) > 0
|
|
770
|
+
// console.log('bSls', bSls)
|
|
771
|
+
|
|
772
|
+
//r
|
|
773
|
+
let r = {
|
|
731
774
|
success: {
|
|
732
|
-
|
|
733
|
-
|
|
775
|
+
path: pathFile,
|
|
776
|
+
bAllExist,
|
|
777
|
+
bAllSize,
|
|
778
|
+
bAllHash,
|
|
779
|
+
bSls,
|
|
780
|
+
slks,
|
|
734
781
|
},
|
|
735
782
|
}
|
|
736
|
-
|
|
737
|
-
return
|
|
783
|
+
|
|
784
|
+
return r
|
|
738
785
|
}
|
|
739
786
|
|
|
740
|
-
|
|
741
|
-
|
|
787
|
+
//checkSlicesHash
|
|
788
|
+
let checkSlicesHash = async() => {
|
|
789
|
+
|
|
790
|
+
//fileSliceHashs, 從payload接收
|
|
791
|
+
let fileSliceHashs = get(req, 'payload.fileSliceHashs', [])
|
|
792
|
+
// console.log('fileSliceHashs', fileSliceHashs)
|
|
793
|
+
|
|
794
|
+
//check, 前端須檢核, 若之前已回應無切片, 就不能再調用檢測切片hash的API
|
|
795
|
+
if (size(fileSliceHashs) === 0) {
|
|
796
|
+
let r = {
|
|
797
|
+
error: 'no fileSliceHashs',
|
|
798
|
+
}
|
|
799
|
+
return r
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
//slksCfm, 已確定hash值一致的切片
|
|
803
|
+
// console.log(`check hash for slices fileHash[${fileHash}]...`, fileSliceHashs[0], size(fileSliceHashs))
|
|
804
|
+
let slksCfm = []
|
|
805
|
+
// let n = Math.max(fileSliceHashs.length, 1)
|
|
806
|
+
// let nr = Math.floor(n / 200)
|
|
807
|
+
for (let k = 0; k < fileSliceHashs.length; k++) {
|
|
808
|
+
// if (k % nr === 0) {
|
|
809
|
+
// console.log(`calc hash for slices`, round(k / fileSliceHashs.length * 100, 1), '%')
|
|
810
|
+
// }
|
|
811
|
+
|
|
812
|
+
//v
|
|
813
|
+
let v = fileSliceHashs[k]
|
|
814
|
+
|
|
815
|
+
//_pathFile
|
|
816
|
+
let _pathFile = path.join(pathUploadTemp, `${fileHash}_${v.i}`)
|
|
817
|
+
// console.log('_pathFile', _pathFile)
|
|
818
|
+
|
|
819
|
+
//_fileHash
|
|
820
|
+
let _fileHash = ''
|
|
821
|
+
// await calcFileHash(_pathFile)
|
|
822
|
+
await getFileXxHash(new Blob([fs.readFileSync(_pathFile)])) //計算切片因檔案很小, 直接用getFileXxHash速度比較快
|
|
823
|
+
.then((res) => {
|
|
824
|
+
_fileHash = res
|
|
825
|
+
})
|
|
826
|
+
.catch((err) => {
|
|
827
|
+
console.log(err)
|
|
828
|
+
console.log(`fsIsFile(_pathFile)`, _pathFile, fsIsFile(_pathFile))
|
|
829
|
+
})
|
|
830
|
+
// console.log('_fileHash', _fileHash)
|
|
831
|
+
|
|
832
|
+
//check
|
|
833
|
+
if (v.h === _fileHash) {
|
|
834
|
+
slksCfm.push(v.i)
|
|
835
|
+
}
|
|
836
|
+
// else {
|
|
837
|
+
// console.log(`hash is not equal`, `hash(front)`, v.h, `hash(backend)`, _fileHash)
|
|
838
|
+
// }
|
|
839
|
+
|
|
840
|
+
}
|
|
841
|
+
// console.log(`check hash for slices fileHash[${fileHash}] done`, slksCfm[0], size(slksCfm))
|
|
842
|
+
|
|
843
|
+
//r
|
|
844
|
+
let r = {
|
|
742
845
|
success: {
|
|
743
|
-
|
|
744
|
-
msg: 'equal',
|
|
745
|
-
path: pathFile,
|
|
846
|
+
slks: slksCfm,
|
|
746
847
|
},
|
|
747
848
|
}
|
|
849
|
+
|
|
850
|
+
return r
|
|
851
|
+
}
|
|
852
|
+
|
|
853
|
+
//out
|
|
854
|
+
let out = null
|
|
855
|
+
if (mode === 'check-total-hash') {
|
|
856
|
+
out = await checkTotalHash()
|
|
857
|
+
}
|
|
858
|
+
else if (mode === 'check-slices-hash') {
|
|
859
|
+
out = await checkSlicesHash()
|
|
860
|
+
}
|
|
861
|
+
|
|
862
|
+
if (out.error) {
|
|
863
|
+
return responseU8aStreamWithError(res, out.error)
|
|
864
|
+
}
|
|
865
|
+
else {
|
|
748
866
|
let u8aOut = obj2u8arr(out)
|
|
749
867
|
return responseU8aStream(res, u8aOut, { returnType: 'success', returnMsg: 'need to parse' })
|
|
750
868
|
}
|
|
751
|
-
|
|
752
869
|
},
|
|
753
870
|
}
|
|
754
871
|
|
package/srv.mjs
CHANGED