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
|
@@ -720,37 +720,100 @@ function WConverhpClient(opt) {
|
|
|
720
720
|
//fileTotalSize
|
|
721
721
|
let fileTotalSize = n
|
|
722
722
|
|
|
723
|
+
//chunkTotal
|
|
724
|
+
let chunkTotal = Math.ceil(fileTotalSize / sizeSlice)
|
|
725
|
+
// console.log('chunkTotal', chunkTotal)
|
|
726
|
+
|
|
723
727
|
//fileTotalHash
|
|
728
|
+
// console.log(`calc hash for fileTotalSize[${fileTotalSize}]...`)
|
|
724
729
|
let fileTotalHash = await calcHash(bb)
|
|
725
|
-
// console.log(
|
|
726
|
-
|
|
727
|
-
//
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
//
|
|
738
|
-
|
|
739
|
-
//
|
|
730
|
+
// console.log(`calc hash for fileTotalSize[${fileTotalSize}] done`, fileTotalHash)
|
|
731
|
+
|
|
732
|
+
//send upload-check
|
|
733
|
+
// console.log(`send check-total-hash...`)
|
|
734
|
+
let resCk = await send('upload-check', { mode: 'check-total-hash', fileHash: fileTotalHash, fileSize: fileTotalSize }, { dataType: 'json' })
|
|
735
|
+
// console.log('resCk', resCk)
|
|
736
|
+
// resCk {
|
|
737
|
+
// path: 'uploadTemp\\2429b7ef08ce6ba9',
|
|
738
|
+
// bAllExist: false,
|
|
739
|
+
// bAllSize: false,
|
|
740
|
+
// bAllHash: false,
|
|
741
|
+
// bSls: true,
|
|
742
|
+
// slks: [
|
|
743
|
+
// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
|
|
744
|
+
// 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
|
|
745
|
+
// 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
|
|
746
|
+
// 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
|
|
747
|
+
// 48, 49, 50, 51, 52, 53
|
|
748
|
+
// ]
|
|
749
|
+
// }
|
|
740
750
|
|
|
741
751
|
//check
|
|
742
|
-
if (
|
|
752
|
+
if (resCk.bAllHash) {
|
|
743
753
|
// console.log('已有上傳大檔')
|
|
744
754
|
let resMg = {
|
|
745
755
|
filename: fileTotalName,
|
|
746
|
-
path:
|
|
756
|
+
path: resCk.path,
|
|
747
757
|
}
|
|
748
758
|
return resMg
|
|
749
759
|
}
|
|
750
760
|
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
761
|
+
//針對伺服器上已有切片檔案計算hash與比對
|
|
762
|
+
if (resCk.slks.length > 0) {
|
|
763
|
+
// console.log('receive slks...', resCk.slks[0], size(resCk.slks))
|
|
764
|
+
|
|
765
|
+
//fileSliceHashs
|
|
766
|
+
let fileSliceHashs = []
|
|
767
|
+
// let n = Math.max(resCk.slks.length, 1)
|
|
768
|
+
// let nr = Math.floor(n / 200)
|
|
769
|
+
for (let k = 0; k < resCk.slks.length; k++) {
|
|
770
|
+
// if (k % nr === 0) {
|
|
771
|
+
// console.log(`calc hash for slices`, round(k / resCk.slks.length * 100, 1), '%')
|
|
772
|
+
// }
|
|
773
|
+
|
|
774
|
+
//i
|
|
775
|
+
let i = resCk.slks[k]
|
|
776
|
+
|
|
777
|
+
//start
|
|
778
|
+
let start = i * sizeSlice
|
|
779
|
+
|
|
780
|
+
//end
|
|
781
|
+
let end = Math.min(start + sizeSlice, fileTotalSize)
|
|
782
|
+
|
|
783
|
+
//chunk
|
|
784
|
+
let chunk = bb.slice(start, end)
|
|
785
|
+
|
|
786
|
+
//fileSliceHash
|
|
787
|
+
let fileSliceHash = await calcHash(chunk)
|
|
788
|
+
// console.log('fileSliceHash', fileSliceHash)
|
|
789
|
+
|
|
790
|
+
//push
|
|
791
|
+
fileSliceHashs.push({
|
|
792
|
+
i,
|
|
793
|
+
h: fileSliceHash,
|
|
794
|
+
})
|
|
795
|
+
|
|
796
|
+
}
|
|
797
|
+
// console.log('fileSliceHashs', fileSliceHashs)
|
|
798
|
+
|
|
799
|
+
//send upload-check
|
|
800
|
+
// console.log(`send check-slices-hash...`)
|
|
801
|
+
let resCks = await send('upload-check', { mode: 'check-slices-hash', fileHash: fileTotalHash, fileSliceHashs }, { dataType: 'json' })
|
|
802
|
+
// console.log('resCks', resCks)
|
|
803
|
+
// resCks {
|
|
804
|
+
// slks: [
|
|
805
|
+
// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
|
|
806
|
+
// 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
|
|
807
|
+
// 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
|
|
808
|
+
// 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
|
|
809
|
+
// 48, 49, 50, 51, 52, 53
|
|
810
|
+
// ]
|
|
811
|
+
// }
|
|
812
|
+
|
|
813
|
+
//update
|
|
814
|
+
resCk.slks = resCks.slks
|
|
815
|
+
|
|
816
|
+
}
|
|
754
817
|
|
|
755
818
|
//packageId
|
|
756
819
|
let packageId = fileTotalHash
|
|
@@ -769,7 +832,7 @@ function WConverhpClient(opt) {
|
|
|
769
832
|
progCount++
|
|
770
833
|
let r = progCount / chunkTotal
|
|
771
834
|
let prog = r * progWeightSlice * 100
|
|
772
|
-
let psiz = r *
|
|
835
|
+
let psiz = r * fileTotalSize
|
|
773
836
|
cbProgress({ prog, p: psiz, m: 'upload' })
|
|
774
837
|
}
|
|
775
838
|
}
|
|
@@ -779,44 +842,30 @@ function WConverhpClient(opt) {
|
|
|
779
842
|
let perc = msg.prog
|
|
780
843
|
let dir = msg.m
|
|
781
844
|
if (dir === 'download' && perc === 100) {
|
|
782
|
-
cbProgress({ prog: 100, p:
|
|
845
|
+
cbProgress({ prog: 100, p: fileTotalSize, m: 'upload' })
|
|
783
846
|
}
|
|
784
847
|
}
|
|
785
848
|
|
|
786
849
|
//upload slice
|
|
850
|
+
// console.log(`upload slice...`)
|
|
787
851
|
for (let i = 0; i < chunkTotal; i++) {
|
|
788
852
|
|
|
789
|
-
//
|
|
790
|
-
|
|
791
|
-
|
|
853
|
+
//check
|
|
854
|
+
if (resCk.slks.indexOf(i) >= 0) {
|
|
855
|
+
// console.log('已有上傳切片檔')
|
|
856
|
+
cbProgressSlice({ prog: 100, m: 'upload' }) //直接觸發更新進度
|
|
857
|
+
continue
|
|
858
|
+
}
|
|
792
859
|
|
|
793
860
|
//start
|
|
794
861
|
let start = i * sizeSlice
|
|
795
862
|
|
|
796
863
|
//end
|
|
797
|
-
let end = Math.min(start + sizeSlice,
|
|
864
|
+
let end = Math.min(start + sizeSlice, fileTotalSize)
|
|
798
865
|
|
|
799
866
|
//chunk
|
|
800
867
|
let chunk = bb.slice(start, end)
|
|
801
868
|
|
|
802
|
-
//fileSliceHash
|
|
803
|
-
let fileSliceHash = await calcHash(chunk)
|
|
804
|
-
// console.log('fileSliceHash', fileSliceHash)
|
|
805
|
-
|
|
806
|
-
//rChunk
|
|
807
|
-
let rChunk = await ckh({ filename: fileSliceName, fileSize: sizeSlice, fileHash: fileSliceHash })
|
|
808
|
-
// console.log('fileSliceName', fileSliceName)
|
|
809
|
-
// console.log('fileSliceHash', fileSliceHash)
|
|
810
|
-
// console.log('rChunk', rChunk)
|
|
811
|
-
// console.log('')
|
|
812
|
-
|
|
813
|
-
//check
|
|
814
|
-
if (rChunk.existed) {
|
|
815
|
-
// console.log('已有上傳切片檔')
|
|
816
|
-
cbProgressSlice({ prog: 100, m: 'upload' }) //直接觸發更新進度
|
|
817
|
-
continue
|
|
818
|
-
}
|
|
819
|
-
|
|
820
869
|
//send slice
|
|
821
870
|
let hd = {
|
|
822
871
|
'chunk-index': i,
|
|
@@ -836,6 +885,7 @@ function WConverhpClient(opt) {
|
|
|
836
885
|
}
|
|
837
886
|
let resMg = await send('slice-merge', msg, { dataType: 'json', cbProgress: cbProgressMerge })
|
|
838
887
|
|
|
888
|
+
// console.log(`upload slice done`)
|
|
839
889
|
return resMg
|
|
840
890
|
}
|
|
841
891
|
|
|
@@ -996,7 +1046,7 @@ export default WConverhpClient
|
|
|
996
1046
|
<br class="clear">
|
|
997
1047
|
|
|
998
1048
|
<footer>
|
|
999
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on
|
|
1049
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Mon Apr 14 2025 15:05:12 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
1000
1050
|
</footer>
|
|
1001
1051
|
|
|
1002
1052
|
<script>prettyPrint();</script>
|
|
@@ -80,7 +80,7 @@
|
|
|
80
80
|
|
|
81
81
|
<dt class="tag-source">Source:</dt>
|
|
82
82
|
<dd class="tag-source"><ul class="dummy"><li>
|
|
83
|
-
<a href="WConverhpServer.mjs.html">WConverhpServer.mjs</a>, <a href="WConverhpServer.mjs.html#
|
|
83
|
+
<a href="WConverhpServer.mjs.html">WConverhpServer.mjs</a>, <a href="WConverhpServer.mjs.html#line198">line 198</a>
|
|
84
84
|
</li></ul></dd>
|
|
85
85
|
|
|
86
86
|
|
|
@@ -462,6 +462,46 @@
|
|
|
462
462
|
|
|
463
463
|
|
|
464
464
|
|
|
465
|
+
<tr>
|
|
466
|
+
|
|
467
|
+
<td class="name"><code>sizeSlice</code></td>
|
|
468
|
+
|
|
469
|
+
|
|
470
|
+
<td class="type">
|
|
471
|
+
|
|
472
|
+
|
|
473
|
+
<span class="param-type">Integer</span>
|
|
474
|
+
|
|
475
|
+
|
|
476
|
+
|
|
477
|
+
|
|
478
|
+
</td>
|
|
479
|
+
|
|
480
|
+
|
|
481
|
+
<td class="attributes">
|
|
482
|
+
|
|
483
|
+
<optional><br>
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
|
|
487
|
+
|
|
488
|
+
|
|
489
|
+
</td>
|
|
490
|
+
|
|
491
|
+
|
|
492
|
+
|
|
493
|
+
<td class="default">
|
|
494
|
+
|
|
495
|
+
<code>1024*1024</code>
|
|
496
|
+
|
|
497
|
+
</td>
|
|
498
|
+
|
|
499
|
+
|
|
500
|
+
<td class="description last"><p>輸入切片上傳檔案之切片檔案大小整數,單位為Byte,預設為1024*1024</p></td>
|
|
501
|
+
</tr>
|
|
502
|
+
|
|
503
|
+
|
|
504
|
+
|
|
465
505
|
<tr>
|
|
466
506
|
|
|
467
507
|
<td class="name"><code>verifyConn</code></td>
|
|
@@ -749,7 +789,7 @@
|
|
|
749
789
|
<br class="clear">
|
|
750
790
|
|
|
751
791
|
<footer>
|
|
752
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on
|
|
792
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Mon Apr 14 2025 15:05:12 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
753
793
|
</footer>
|
|
754
794
|
|
|
755
795
|
<script>prettyPrint();</script>
|
|
@@ -51,6 +51,8 @@ import stream from 'stream'
|
|
|
51
51
|
import Hapi from '@hapi/hapi'
|
|
52
52
|
import Inert from '@hapi/inert' //提供靜態檔案
|
|
53
53
|
import get from 'lodash-es/get.js'
|
|
54
|
+
import each from 'lodash-es/each.js'
|
|
55
|
+
import size from 'lodash-es/size.js'
|
|
54
56
|
import isNumber from 'lodash-es/isNumber.js'
|
|
55
57
|
import genPm from 'wsemi/src/genPm.mjs'
|
|
56
58
|
import evem from 'wsemi/src/evem.mjs'
|
|
@@ -72,6 +74,8 @@ import u8arr2obj from 'wsemi/src/u8arr2obj.mjs'
|
|
|
72
74
|
import fsIsFile from 'wsemi/src/fsIsFile.mjs'
|
|
73
75
|
import fsIsFolder from 'wsemi/src/fsIsFolder.mjs'
|
|
74
76
|
import fsCreateFolder from 'wsemi/src/fsCreateFolder.mjs'
|
|
77
|
+
import fsGetFilesInFolder from 'wsemi/src/fsGetFilesInFolder.mjs'
|
|
78
|
+
import getFileXxHash from 'wsemi/src/getFileXxHash.mjs'
|
|
75
79
|
// import calcFileHash from './calcFileHash.mjs'
|
|
76
80
|
import calcFileHash from './calcFileHash.wk.umd.js'
|
|
77
81
|
// import mergeFiles from './mergeFiles.mjs'
|
|
@@ -94,6 +98,7 @@ import mergeFiles from './mergeFiles.wk.umd.js'
|
|
|
94
98
|
* @param {String} [opt.apiName='api'] 輸入API名稱字串,預設'api'
|
|
95
99
|
* @param {String} [opt.pathUploadTemp='./uploadTemp'] 輸入暫時存放切片上傳檔案資料夾字串,預設'./uploadTemp'
|
|
96
100
|
* @param {String} [opt.tokenType='Bearer'] 輸入token類型字串,預設'Bearer'
|
|
101
|
+
* @param {Integer} [opt.sizeSlice=1024*1024] 輸入切片上傳檔案之切片檔案大小整數,單位為Byte,預設為1024*1024
|
|
97
102
|
* @param {Function} [opt.verifyConn=()=>{return true}] 輸入呼叫API時檢測函數,預設()=>{return true}
|
|
98
103
|
* @param {Array} [opt.corsOrigins=['*']] 輸入允許跨域網域陣列,若給予['*']代表允許全部,預設['*']
|
|
99
104
|
* @param {Integer} [opt.delayForBasic=0] 輸入基本API用延遲響應時間,單位ms,預設0
|
|
@@ -278,6 +283,12 @@ function WConverhpServer(opt = {}) {
|
|
|
278
283
|
tokenType = 'Bearer'
|
|
279
284
|
}
|
|
280
285
|
|
|
286
|
+
//sizeSlice
|
|
287
|
+
let sizeSlice = get(opt, 'sizeSlice')
|
|
288
|
+
if (!ispint(sizeSlice)) {
|
|
289
|
+
sizeSlice = 1024 * 1024 //1m
|
|
290
|
+
}
|
|
291
|
+
|
|
281
292
|
//verifyConn
|
|
282
293
|
let verifyConn = get(opt, 'verifyConn')
|
|
283
294
|
if (!isfun(verifyConn)) {
|
|
@@ -471,12 +482,6 @@ function WConverhpServer(opt = {}) {
|
|
|
471
482
|
}
|
|
472
483
|
|
|
473
484
|
return r
|
|
474
|
-
// return res.response(smr)
|
|
475
|
-
// .header('Return-Type', returnType)
|
|
476
|
-
// .header('Return-Msg', returnMsg)
|
|
477
|
-
// .header('Cache-Control', 'no-cache, no-store, must-revalidate')
|
|
478
|
-
// .header('Content-Type', 'application/octet-stream')
|
|
479
|
-
// .header('Content-Length', smr.readableLength)
|
|
480
485
|
}
|
|
481
486
|
|
|
482
487
|
//responseU8aStreamWithError
|
|
@@ -707,25 +712,17 @@ function WConverhpServer(opt = {}) {
|
|
|
707
712
|
query,
|
|
708
713
|
})
|
|
709
714
|
|
|
710
|
-
//
|
|
711
|
-
let
|
|
712
|
-
let fileSize = get(req, 'payload.fileSize', '')
|
|
713
|
-
let fileHash = get(req, 'payload.fileHash', '')
|
|
714
|
-
// console.log('filename', filename)
|
|
715
|
-
// console.log('fileSize', fileSize)
|
|
716
|
-
// console.log('fileHash', fileHash)
|
|
715
|
+
//mode, 從payload接收
|
|
716
|
+
let mode = get(req, 'payload.mode', '')
|
|
717
717
|
|
|
718
718
|
//check
|
|
719
|
-
if (
|
|
720
|
-
// console.log('invalid
|
|
721
|
-
return responseU8aStreamWithError(res,
|
|
719
|
+
if (mode !== 'check-total-hash' && mode !== 'check-slices-hash') {
|
|
720
|
+
// console.log('invalid mode in payload')
|
|
721
|
+
return responseU8aStreamWithError(res, `invalid mode[${mode}] in payload`)
|
|
722
722
|
}
|
|
723
723
|
|
|
724
|
-
//
|
|
725
|
-
|
|
726
|
-
// console.log('invalid fileSize in payload')
|
|
727
|
-
return responseU8aStreamWithError(res, 'invalid fileSize in payload')
|
|
728
|
-
}
|
|
724
|
+
//fileHash, 從payload接收
|
|
725
|
+
let fileHash = get(req, 'payload.fileHash', '')
|
|
729
726
|
|
|
730
727
|
//check
|
|
731
728
|
if (!isestr(fileHash)) {
|
|
@@ -733,69 +730,189 @@ function WConverhpServer(opt = {}) {
|
|
|
733
730
|
return responseU8aStreamWithError(res, 'invalid fileHash in payload')
|
|
734
731
|
}
|
|
735
732
|
|
|
736
|
-
//
|
|
737
|
-
let
|
|
738
|
-
// console.log('pathFile', pathFile)
|
|
733
|
+
//checkTotalHash
|
|
734
|
+
let checkTotalHash = async () => {
|
|
739
735
|
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
736
|
+
//pathFile
|
|
737
|
+
let pathFile = path.join(pathUploadTemp, fileHash)
|
|
738
|
+
// console.log('pathFile', pathFile)
|
|
739
|
+
|
|
740
|
+
//bAllExist
|
|
741
|
+
let bAllExist = false
|
|
742
|
+
if (true) {
|
|
743
|
+
// console.log(`check exist for pathFile[${pathFile}]...`)
|
|
744
|
+
|
|
745
|
+
bAllExist = fsIsFile(pathFile)
|
|
746
|
+
|
|
747
|
+
// console.log(`check exist for pathFile[${pathFile}] done`, bAllExist)
|
|
747
748
|
}
|
|
748
|
-
let u8aOut = obj2u8arr(out)
|
|
749
|
-
return responseU8aStream(res, u8aOut, { returnType: 'success', returnMsg: 'need to parse' })
|
|
750
|
-
}
|
|
751
749
|
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
let _fileSize = stats.size
|
|
750
|
+
//fileSize, 從payload接收
|
|
751
|
+
let fileSize = get(req, 'payload.fileSize', '')
|
|
755
752
|
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
753
|
+
//check
|
|
754
|
+
if (!isnum(fileSize)) {
|
|
755
|
+
// console.log('invalid fileSize in payload')
|
|
756
|
+
let r = {
|
|
757
|
+
error: 'invalid fileSize in payload',
|
|
758
|
+
}
|
|
759
|
+
return r
|
|
763
760
|
}
|
|
764
|
-
let u8aOut = obj2u8arr(out)
|
|
765
|
-
return responseU8aStream(res, u8aOut, { returnType: 'success', returnMsg: 'need to parse' })
|
|
766
|
-
}
|
|
767
761
|
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
// console.log('hash(backend)', _fileHash)
|
|
773
|
-
// console.log('')
|
|
762
|
+
//bAllSize
|
|
763
|
+
let bAllSize = false
|
|
764
|
+
if (bAllExist) {
|
|
765
|
+
// console.log(`check size for pathFile[${pathFile}]...`)
|
|
774
766
|
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
767
|
+
//_fileSize
|
|
768
|
+
let stats = fs.statSync(pathFile)
|
|
769
|
+
let _fileSize = stats.size
|
|
770
|
+
|
|
771
|
+
//bAllSize
|
|
772
|
+
bAllSize = fileSize === _fileSize
|
|
773
|
+
|
|
774
|
+
// console.log(`check size for pathFile[${pathFile}] done`, bAllSize)
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
//bAllHash
|
|
778
|
+
let bAllHash = false
|
|
779
|
+
if (bAllExist && bAllSize) {
|
|
780
|
+
// console.log(`check hash for pathFile[${pathFile}]...`)
|
|
781
|
+
|
|
782
|
+
//bAllHash
|
|
783
|
+
await calcFileHash(pathFile)
|
|
784
|
+
.then((_fileHash) => {
|
|
785
|
+
bAllHash = fileHash === _fileHash
|
|
786
|
+
})
|
|
787
|
+
.catch((err) => {
|
|
788
|
+
console.log(err)
|
|
789
|
+
console.log(`fsIsFile(pathFile)`, pathFile, fsIsFile(pathFile))
|
|
790
|
+
bAllHash = false
|
|
791
|
+
})
|
|
792
|
+
|
|
793
|
+
// console.log(`check hash for pathFile[${pathFile}] done`, bAllHash)
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
//vfps
|
|
797
|
+
let vfps = fsGetFilesInFolder(pathUploadTemp)
|
|
798
|
+
// console.log('vfps', vfps)
|
|
799
|
+
|
|
800
|
+
//slks
|
|
801
|
+
let slks = []
|
|
802
|
+
if (true) {
|
|
803
|
+
each(vfps, (v, k) => {
|
|
804
|
+
let b1 = (v.name).indexOf(`${fileHash}_`) >= 0
|
|
805
|
+
let stats = fs.statSync(v.path)
|
|
806
|
+
let b2 = stats.size === sizeSlice
|
|
807
|
+
let b = b1 && b2
|
|
808
|
+
if (b) {
|
|
809
|
+
slks.push(k)
|
|
810
|
+
}
|
|
811
|
+
})
|
|
812
|
+
}
|
|
813
|
+
// console.log('slks', slks)
|
|
814
|
+
|
|
815
|
+
//bSls
|
|
816
|
+
let bSls = size(slks) > 0
|
|
817
|
+
// console.log('bSls', bSls)
|
|
818
|
+
|
|
819
|
+
//r
|
|
820
|
+
let r = {
|
|
778
821
|
success: {
|
|
779
|
-
|
|
780
|
-
|
|
822
|
+
path: pathFile,
|
|
823
|
+
bAllExist,
|
|
824
|
+
bAllSize,
|
|
825
|
+
bAllHash,
|
|
826
|
+
bSls,
|
|
827
|
+
slks,
|
|
781
828
|
},
|
|
782
829
|
}
|
|
783
|
-
|
|
784
|
-
return
|
|
830
|
+
|
|
831
|
+
return r
|
|
785
832
|
}
|
|
786
833
|
|
|
787
|
-
|
|
788
|
-
|
|
834
|
+
//checkSlicesHash
|
|
835
|
+
let checkSlicesHash = async() => {
|
|
836
|
+
|
|
837
|
+
//fileSliceHashs, 從payload接收
|
|
838
|
+
let fileSliceHashs = get(req, 'payload.fileSliceHashs', [])
|
|
839
|
+
// console.log('fileSliceHashs', fileSliceHashs)
|
|
840
|
+
|
|
841
|
+
//check, 前端須檢核, 若之前已回應無切片, 就不能再調用檢測切片hash的API
|
|
842
|
+
if (size(fileSliceHashs) === 0) {
|
|
843
|
+
let r = {
|
|
844
|
+
error: 'no fileSliceHashs',
|
|
845
|
+
}
|
|
846
|
+
return r
|
|
847
|
+
}
|
|
848
|
+
|
|
849
|
+
//slksCfm, 已確定hash值一致的切片
|
|
850
|
+
// console.log(`check hash for slices fileHash[${fileHash}]...`, fileSliceHashs[0], size(fileSliceHashs))
|
|
851
|
+
let slksCfm = []
|
|
852
|
+
// let n = Math.max(fileSliceHashs.length, 1)
|
|
853
|
+
// let nr = Math.floor(n / 200)
|
|
854
|
+
for (let k = 0; k < fileSliceHashs.length; k++) {
|
|
855
|
+
// if (k % nr === 0) {
|
|
856
|
+
// console.log(`calc hash for slices`, round(k / fileSliceHashs.length * 100, 1), '%')
|
|
857
|
+
// }
|
|
858
|
+
|
|
859
|
+
//v
|
|
860
|
+
let v = fileSliceHashs[k]
|
|
861
|
+
|
|
862
|
+
//_pathFile
|
|
863
|
+
let _pathFile = path.join(pathUploadTemp, `${fileHash}_${v.i}`)
|
|
864
|
+
// console.log('_pathFile', _pathFile)
|
|
865
|
+
|
|
866
|
+
//_fileHash
|
|
867
|
+
let _fileHash = ''
|
|
868
|
+
// await calcFileHash(_pathFile)
|
|
869
|
+
await getFileXxHash(new Blob([fs.readFileSync(_pathFile)])) //計算切片因檔案很小, 直接用getFileXxHash速度比較快
|
|
870
|
+
.then((res) => {
|
|
871
|
+
_fileHash = res
|
|
872
|
+
})
|
|
873
|
+
.catch((err) => {
|
|
874
|
+
console.log(err)
|
|
875
|
+
console.log(`fsIsFile(_pathFile)`, _pathFile, fsIsFile(_pathFile))
|
|
876
|
+
})
|
|
877
|
+
// console.log('_fileHash', _fileHash)
|
|
878
|
+
|
|
879
|
+
//check
|
|
880
|
+
if (v.h === _fileHash) {
|
|
881
|
+
slksCfm.push(v.i)
|
|
882
|
+
}
|
|
883
|
+
// else {
|
|
884
|
+
// console.log(`hash is not equal`, `hash(front)`, v.h, `hash(backend)`, _fileHash)
|
|
885
|
+
// }
|
|
886
|
+
|
|
887
|
+
}
|
|
888
|
+
// console.log(`check hash for slices fileHash[${fileHash}] done`, slksCfm[0], size(slksCfm))
|
|
889
|
+
|
|
890
|
+
//r
|
|
891
|
+
let r = {
|
|
789
892
|
success: {
|
|
790
|
-
|
|
791
|
-
msg: 'equal',
|
|
792
|
-
path: pathFile,
|
|
893
|
+
slks: slksCfm,
|
|
793
894
|
},
|
|
794
895
|
}
|
|
896
|
+
|
|
897
|
+
return r
|
|
898
|
+
}
|
|
899
|
+
|
|
900
|
+
//out
|
|
901
|
+
let out = null
|
|
902
|
+
if (mode === 'check-total-hash') {
|
|
903
|
+
out = await checkTotalHash()
|
|
904
|
+
}
|
|
905
|
+
else if (mode === 'check-slices-hash') {
|
|
906
|
+
out = await checkSlicesHash()
|
|
907
|
+
}
|
|
908
|
+
|
|
909
|
+
if (out.error) {
|
|
910
|
+
return responseU8aStreamWithError(res, out.error)
|
|
911
|
+
}
|
|
912
|
+
else {
|
|
795
913
|
let u8aOut = obj2u8arr(out)
|
|
796
914
|
return responseU8aStream(res, u8aOut, { returnType: 'success', returnMsg: 'need to parse' })
|
|
797
915
|
}
|
|
798
|
-
|
|
799
916
|
},
|
|
800
917
|
}
|
|
801
918
|
|
|
@@ -1533,7 +1650,7 @@ export default WConverhpServer
|
|
|
1533
1650
|
<br class="clear">
|
|
1534
1651
|
|
|
1535
1652
|
<footer>
|
|
1536
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on
|
|
1653
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Mon Apr 14 2025 15:05:12 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
1537
1654
|
</footer>
|
|
1538
1655
|
|
|
1539
1656
|
<script>prettyPrint();</script>
|
package/docs/index.html
CHANGED
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
<br class="clear">
|
|
72
72
|
|
|
73
73
|
<footer>
|
|
74
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on
|
|
74
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Mon Apr 14 2025 15:05:12 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
75
75
|
</footer>
|
|
76
76
|
|
|
77
77
|
<script>prettyPrint();</script>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "w-converhp",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.34",
|
|
4
4
|
"main": "dist/w-converhp-server.umd.js",
|
|
5
5
|
"dependencies": {
|
|
6
6
|
"@hapi/hapi": "^21.4.0",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"scripts": {
|
|
17
17
|
"@hapi/hapi": "^20.2.1",
|
|
18
18
|
"@hapi/inert": "^6.0.5",
|
|
19
|
-
"test": "mocha --parallel --timeout 60000
|
|
19
|
+
"test": "mocha --parallel --timeout 60000",
|
|
20
20
|
"deploy": "gh-pages -d docs"
|
|
21
21
|
},
|
|
22
22
|
"repository": {
|
package/scla.mjs
CHANGED
package/sclb.mjs
CHANGED
package/sclc.mjs
CHANGED
package/scld.mjs
CHANGED