w-converhp 2.0.36 → 2.0.37
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 +83 -33
- package/docs/WConverhpServer.html +2 -2
- package/docs/WConverhpServer.mjs.html +147 -155
- package/docs/index.html +1 -1
- package/package.json +1 -1
- package/scla.mjs +3 -0
- package/sclb.mjs +3 -0
- package/sclc.mjs +4 -1
- package/scld.mjs +3 -0
- package/src/WConverhpClient.mjs +82 -32
- package/src/WConverhpServer.mjs +146 -154
- package/src/checkSlicesHash.mjs +1 -3
- package/src/checkSlicesHash.wk.umd.js +1 -1
- package/src/checkTotalHash.mjs +6 -8
- package/src/checkTotalHash.wk.umd.js +1 -1
- package/src/managerMergeSlices.mjs +82 -0
- package/src/mergeSlices.mjs +31 -0
- package/src/mergeSlices.wk.umd.js +1 -0
- package/test/downloadLargeFile.test.mjs +3 -0
- package/test/executeWithFile.test.mjs +3 -0
- package/test/executeWithU8a.test.mjs +3 -0
- package/test/uploadLargeFile.test.mjs +9 -5
- package/toolg/gDistRollup.mjs +22 -0
- package/src/mergeFiles.mjs +0 -27
- package/src/mergeFiles.wk.umd.js +0 -1
|
@@ -529,7 +529,7 @@
|
|
|
529
529
|
<br class="clear">
|
|
530
530
|
|
|
531
531
|
<footer>
|
|
532
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on
|
|
532
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Tue Apr 15 2025 14:44:02 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
533
533
|
</footer>
|
|
534
534
|
|
|
535
535
|
<script>prettyPrint();</script>
|
|
@@ -211,12 +211,12 @@ function WConverhpClient(opt) {
|
|
|
211
211
|
else if (type === 'slice') {
|
|
212
212
|
urlUse = `${url}slc`
|
|
213
213
|
}
|
|
214
|
-
else if (type === 'upload-
|
|
215
|
-
urlUse = `${url}
|
|
216
|
-
}
|
|
217
|
-
else if (type === 'slice-merge') {
|
|
218
|
-
urlUse = `${url}slcm`
|
|
214
|
+
else if (type === 'upload-controller') {
|
|
215
|
+
urlUse = `${url}ulctr`
|
|
219
216
|
}
|
|
217
|
+
// else if (type === 'slice-merge') {
|
|
218
|
+
// urlUse = `${url}slcm`
|
|
219
|
+
// }
|
|
220
220
|
else if (type === 'download-get-filename') {
|
|
221
221
|
urlUse = `${url}dwgfn`
|
|
222
222
|
}
|
|
@@ -729,11 +729,11 @@ function WConverhpClient(opt) {
|
|
|
729
729
|
let fileTotalHash = await calcHash(bb)
|
|
730
730
|
// console.log(`calc hash for fileTotalSize[${fileTotalSize}] done`, fileTotalHash)
|
|
731
731
|
|
|
732
|
-
//send
|
|
732
|
+
//send check-total-hash
|
|
733
733
|
// console.log(`send check-total-hash...`)
|
|
734
|
-
let
|
|
735
|
-
// console.log('
|
|
736
|
-
//
|
|
734
|
+
let resUpCkt = await send('upload-controller', { mode: 'check-total-hash', fileHash: fileTotalHash, filename: fileTotalName, fileSize: fileTotalSize }, { dataType: 'json' })
|
|
735
|
+
// console.log('resUpCkt', resUpCkt)
|
|
736
|
+
// resUpCkt {
|
|
737
737
|
// path: 'uploadTemp\\2429b7ef08ce6ba9',
|
|
738
738
|
// bAllExist: false,
|
|
739
739
|
// bAllSize: false,
|
|
@@ -749,30 +749,30 @@ function WConverhpClient(opt) {
|
|
|
749
749
|
// }
|
|
750
750
|
|
|
751
751
|
//check
|
|
752
|
-
if (
|
|
752
|
+
if (resUpCkt.bAllHash) {
|
|
753
753
|
// console.log('已有上傳大檔')
|
|
754
754
|
let resMg = {
|
|
755
755
|
filename: fileTotalName,
|
|
756
|
-
path:
|
|
756
|
+
path: resUpCkt.path,
|
|
757
757
|
}
|
|
758
758
|
return resMg
|
|
759
759
|
}
|
|
760
760
|
|
|
761
761
|
//針對伺服器上已有切片檔案計算hash與比對
|
|
762
|
-
if (
|
|
763
|
-
// console.log('receive slks...',
|
|
762
|
+
if (resUpCkt.slks.length > 0) {
|
|
763
|
+
// console.log('receive slks...', resUpCkt.slks[0], size(resUpCkt.slks))
|
|
764
764
|
|
|
765
765
|
//fileSliceHashs
|
|
766
766
|
let fileSliceHashs = []
|
|
767
|
-
// let n = Math.max(
|
|
767
|
+
// let n = Math.max(resUpCkt.slks.length, 1)
|
|
768
768
|
// let nr = Math.floor(n / 100)
|
|
769
|
-
for (let k = 0; k <
|
|
769
|
+
for (let k = 0; k < resUpCkt.slks.length; k++) {
|
|
770
770
|
// if (k % nr === 0) {
|
|
771
|
-
// console.log(`calc hash for slices`, round(k /
|
|
771
|
+
// console.log(`calc hash for slices`, round(k / resUpCkt.slks.length * 100, 1), '%')
|
|
772
772
|
// }
|
|
773
773
|
|
|
774
774
|
//i
|
|
775
|
-
let i =
|
|
775
|
+
let i = resUpCkt.slks[k]
|
|
776
776
|
|
|
777
777
|
//start
|
|
778
778
|
let start = i * sizeSlice
|
|
@@ -796,11 +796,11 @@ function WConverhpClient(opt) {
|
|
|
796
796
|
}
|
|
797
797
|
// console.log('fileSliceHashs', fileSliceHashs)
|
|
798
798
|
|
|
799
|
-
//send
|
|
799
|
+
//send check-slices-hash
|
|
800
800
|
// console.log(`send check-slices-hash...`)
|
|
801
|
-
let
|
|
802
|
-
// console.log('
|
|
803
|
-
//
|
|
801
|
+
let resUpCks = await send('upload-controller', { mode: 'check-slices-hash', fileHash: fileTotalHash, fileSliceHashs }, { dataType: 'json' })
|
|
802
|
+
// console.log('resUpCks', resUpCks)
|
|
803
|
+
// resUpCks {
|
|
804
804
|
// slks: [
|
|
805
805
|
// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
|
|
806
806
|
// 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
|
|
@@ -810,8 +810,8 @@ function WConverhpClient(opt) {
|
|
|
810
810
|
// ]
|
|
811
811
|
// }
|
|
812
812
|
|
|
813
|
-
//update
|
|
814
|
-
|
|
813
|
+
//update, 伺服器針對各切片計算hash與比對, 回傳resUpCks.slks代表hash一致的切片編號, 非一致hash的切片則須重傳, 尚未傳切片亦須繼續傳
|
|
814
|
+
resUpCkt.slks = resUpCks.slks
|
|
815
815
|
|
|
816
816
|
}
|
|
817
817
|
|
|
@@ -851,7 +851,7 @@ function WConverhpClient(opt) {
|
|
|
851
851
|
for (let i = 0; i < chunkTotal; i++) {
|
|
852
852
|
|
|
853
853
|
//check
|
|
854
|
-
if (
|
|
854
|
+
if (resUpCkt.slks.indexOf(i) >= 0) {
|
|
855
855
|
// console.log('已有上傳切片檔')
|
|
856
856
|
cbProgressSlice({ prog: 100, m: 'upload' }) //直接觸發更新進度
|
|
857
857
|
continue
|
|
@@ -867,7 +867,7 @@ function WConverhpClient(opt) {
|
|
|
867
867
|
let chunk = bb.slice(start, end)
|
|
868
868
|
|
|
869
869
|
//send slice
|
|
870
|
-
let hd = {
|
|
870
|
+
let hd = { //用header傳key與value時, key不分大小寫, 故使用kebabCase
|
|
871
871
|
'chunk-index': i,
|
|
872
872
|
'chunk-total': chunkTotal,
|
|
873
873
|
'package-id': packageId,
|
|
@@ -877,16 +877,66 @@ function WConverhpClient(opt) {
|
|
|
877
877
|
|
|
878
878
|
}
|
|
879
879
|
|
|
880
|
-
//send
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
880
|
+
//send merge-slices-push
|
|
881
|
+
// console.log(`send merge-slices-push...`)
|
|
882
|
+
let resUpMgp = await send('upload-controller', { mode: 'merge-slices-push', fileHash: fileTotalHash, chunkTotal }, { dataType: 'json' })
|
|
883
|
+
// console.log('resUpMgp', resUpMgp)
|
|
884
|
+
|
|
885
|
+
//checkMerging
|
|
886
|
+
let checkMerging = () => {
|
|
887
|
+
let pm = genPm()
|
|
888
|
+
|
|
889
|
+
//queueId
|
|
890
|
+
let queueId = resUpMgp.queueId
|
|
891
|
+
// console.log('queueId', queueId)
|
|
892
|
+
|
|
893
|
+
let t = setInterval(() => {
|
|
894
|
+
|
|
895
|
+
//send merge-slices-get
|
|
896
|
+
// console.log(`send merge-slices-get...`)
|
|
897
|
+
send('upload-controller', { mode: 'merge-slices-get', fileHash: fileTotalHash, filename: fileTotalName, queueId }, { dataType: 'json' })
|
|
898
|
+
.then((res) => {
|
|
899
|
+
// console.log('res', res)
|
|
900
|
+
// res => {
|
|
901
|
+
// queueId,
|
|
902
|
+
// state,
|
|
903
|
+
// filename,
|
|
904
|
+
// path,
|
|
905
|
+
// msg: ...
|
|
906
|
+
// }
|
|
907
|
+
|
|
908
|
+
//check
|
|
909
|
+
if (res.state === 'done') {
|
|
910
|
+
|
|
911
|
+
//cbProgressMerge
|
|
912
|
+
cbProgressMerge({ prog: 100, m: 'download' })
|
|
913
|
+
|
|
914
|
+
//resUpMgr
|
|
915
|
+
let resUpMgr = {
|
|
916
|
+
...res.msg,
|
|
917
|
+
}
|
|
918
|
+
|
|
919
|
+
pm.resolve(resUpMgr)
|
|
920
|
+
}
|
|
921
|
+
|
|
922
|
+
})
|
|
923
|
+
.catch((err) => {
|
|
924
|
+
console.log(err)
|
|
925
|
+
})
|
|
926
|
+
.finally(() => {
|
|
927
|
+
clearInterval(t)
|
|
928
|
+
})
|
|
929
|
+
|
|
930
|
+
}, 2000)
|
|
931
|
+
|
|
932
|
+
return pm
|
|
885
933
|
}
|
|
886
|
-
|
|
934
|
+
|
|
935
|
+
//checkMerging
|
|
936
|
+
let resUpMgr = await checkMerging()
|
|
887
937
|
|
|
888
938
|
// console.log(`upload slice done`)
|
|
889
|
-
return
|
|
939
|
+
return resUpMgr
|
|
890
940
|
}
|
|
891
941
|
|
|
892
942
|
//execute
|
|
@@ -1046,7 +1096,7 @@ export default WConverhpClient
|
|
|
1046
1096
|
<br class="clear">
|
|
1047
1097
|
|
|
1048
1098
|
<footer>
|
|
1049
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on
|
|
1099
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Tue Apr 15 2025 14:44:02 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
1050
1100
|
</footer>
|
|
1051
1101
|
|
|
1052
1102
|
<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#line197">line 197</a>
|
|
84
84
|
</li></ul></dd>
|
|
85
85
|
|
|
86
86
|
|
|
@@ -789,7 +789,7 @@
|
|
|
789
789
|
<br class="clear">
|
|
790
790
|
|
|
791
791
|
<footer>
|
|
792
|
-
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 Tue Apr 15 2025 14:44:02 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
793
793
|
</footer>
|
|
794
794
|
|
|
795
795
|
<script>prettyPrint();</script>
|
|
@@ -70,8 +70,7 @@ import obj2u8arr from 'wsemi/src/obj2u8arr.mjs'
|
|
|
70
70
|
import u8arr2obj from 'wsemi/src/u8arr2obj.mjs'
|
|
71
71
|
import fsIsFolder from 'wsemi/src/fsIsFolder.mjs'
|
|
72
72
|
import fsCreateFolder from 'wsemi/src/fsCreateFolder.mjs'
|
|
73
|
-
|
|
74
|
-
import mergeFiles from './mergeFiles.wk.umd.js'
|
|
73
|
+
import managerMergeSlices from './managerMergeSlices.mjs'
|
|
75
74
|
// import checkTotalHash from './checkTotalHash.mjs'
|
|
76
75
|
import checkTotalHash from './checkTotalHash.wk.umd.js'
|
|
77
76
|
// import checkSlicesHash from './checkSlicesHash.mjs'
|
|
@@ -83,6 +82,10 @@ import checkSlicesHash from './checkSlicesHash.wk.umd.js'
|
|
|
83
82
|
//回傳前端(browser)時, 針對超大檔, 可用POST並用stream回傳但還要處理進度條, 若要交由瀏覽器下載器處理, 只能用GET並用stream回傳, 且前端只能用window.location.href或a.href+a.click()下載
|
|
84
83
|
|
|
85
84
|
|
|
85
|
+
//mmg
|
|
86
|
+
let mmg = managerMergeSlices()
|
|
87
|
+
|
|
88
|
+
|
|
86
89
|
/**
|
|
87
90
|
* 建立Hapi伺服器
|
|
88
91
|
*
|
|
@@ -652,7 +655,7 @@ function WConverhpServer(opt = {}) {
|
|
|
652
655
|
|
|
653
656
|
//apiUploadCheck
|
|
654
657
|
let apiUploadCheck = {
|
|
655
|
-
path: `/${apiName}
|
|
658
|
+
path: `/${apiName}ulctr`,
|
|
656
659
|
method: 'POST',
|
|
657
660
|
options: {
|
|
658
661
|
payload: {
|
|
@@ -689,7 +692,7 @@ function WConverhpServer(opt = {}) {
|
|
|
689
692
|
if (true) {
|
|
690
693
|
|
|
691
694
|
//verifyConn
|
|
692
|
-
let m = verifyConn({ apiType: 'upload-
|
|
695
|
+
let m = verifyConn({ apiType: 'upload-controller', authorization, headers, query })
|
|
693
696
|
if (ispm(m)) {
|
|
694
697
|
m = await m
|
|
695
698
|
}
|
|
@@ -712,13 +715,14 @@ function WConverhpServer(opt = {}) {
|
|
|
712
715
|
let mode = get(req, 'payload.mode', '')
|
|
713
716
|
|
|
714
717
|
//check
|
|
715
|
-
if (mode !== 'check-total-hash' && mode !== 'check-slices-hash') {
|
|
718
|
+
if (mode !== 'check-total-hash' && mode !== 'check-slices-hash' && mode !== 'merge-slices-push' && mode !== 'merge-slices-get') {
|
|
716
719
|
// console.log('invalid mode in payload')
|
|
717
720
|
return responseU8aStreamWithError(res, `invalid mode[${mode}] in payload`)
|
|
718
721
|
}
|
|
719
722
|
|
|
720
723
|
//fileHash, 從payload接收
|
|
721
724
|
let fileHash = get(req, 'payload.fileHash', '')
|
|
725
|
+
// console.log(mode, 'fileHash', fileHash)
|
|
722
726
|
|
|
723
727
|
//check
|
|
724
728
|
if (!isestr(fileHash)) {
|
|
@@ -726,36 +730,143 @@ function WConverhpServer(opt = {}) {
|
|
|
726
730
|
return responseU8aStreamWithError(res, 'invalid fileHash in payload')
|
|
727
731
|
}
|
|
728
732
|
|
|
729
|
-
//
|
|
730
|
-
let
|
|
731
|
-
|
|
733
|
+
//procCore
|
|
734
|
+
let procCore = async() => {
|
|
735
|
+
let out = null
|
|
736
|
+
if (mode === 'check-total-hash') {
|
|
732
737
|
|
|
733
|
-
|
|
734
|
-
|
|
738
|
+
//filename, 從payload接收
|
|
739
|
+
let filename = get(req, 'payload.filename', '')
|
|
740
|
+
// console.log(mode, 'filename', filename)
|
|
735
741
|
|
|
736
|
-
|
|
737
|
-
|
|
742
|
+
//fileSize, 從payload接收
|
|
743
|
+
let fileSize = get(req, 'payload.fileSize', '')
|
|
744
|
+
// console.log(mode, 'fileSize', fileSize)
|
|
738
745
|
|
|
739
|
-
|
|
740
|
-
|
|
746
|
+
//checkTotalHash
|
|
747
|
+
out = await checkTotalHash(fileSize, sizeSlice, fileHash, pathUploadTemp)
|
|
748
|
+
// console.log(mode, 'out', out)
|
|
749
|
+
|
|
750
|
+
//check, 因合併大檔後可能非預期中斷而重傳, 每次偵測有合併完成大檔, 就得調用procUpload讓伺服器攔截函數處理
|
|
751
|
+
if (out.bAllHash) {
|
|
752
|
+
|
|
753
|
+
//ri
|
|
754
|
+
let ri = {
|
|
755
|
+
filename,
|
|
756
|
+
path: out.path,
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
//procUpload
|
|
760
|
+
// console.log('procUpload start')
|
|
761
|
+
let ro = await procUpload(ri)
|
|
762
|
+
// console.log('procUpload done', ro)
|
|
763
|
+
|
|
764
|
+
//out merge, 直接添加ro就回傳, 此處不使用msg儲存
|
|
765
|
+
out = {
|
|
766
|
+
...out,
|
|
767
|
+
...ro,
|
|
768
|
+
}
|
|
769
|
+
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
}
|
|
773
|
+
else if (mode === 'check-slices-hash') {
|
|
774
|
+
|
|
775
|
+
//fileSliceHashs, 從payload接收
|
|
776
|
+
let fileSliceHashs = get(req, 'payload.fileSliceHashs', [])
|
|
777
|
+
// console.log(mode, 'fileSliceHashs', fileSliceHashs)
|
|
778
|
+
|
|
779
|
+
//checkSlicesHash
|
|
780
|
+
out = await checkSlicesHash(fileSliceHashs, fileHash, pathUploadTemp)
|
|
781
|
+
// console.log(mode, 'out', out)
|
|
782
|
+
|
|
783
|
+
}
|
|
784
|
+
else if (mode === 'merge-slices-push') {
|
|
785
|
+
|
|
786
|
+
//chunkTotal, 從payload接收
|
|
787
|
+
let chunkTotal = get(req, 'payload.chunkTotal', '')
|
|
788
|
+
// console.log(mode, 'chunkTotal', chunkTotal)
|
|
789
|
+
|
|
790
|
+
//mmg.push
|
|
791
|
+
let queueId = mmg.push(fileHash, chunkTotal, pathUploadTemp)
|
|
792
|
+
|
|
793
|
+
//out
|
|
794
|
+
out = {
|
|
795
|
+
queueId,
|
|
796
|
+
}
|
|
797
|
+
|
|
798
|
+
}
|
|
799
|
+
else if (mode === 'merge-slices-get') {
|
|
800
|
+
|
|
801
|
+
//filename, 從payload接收
|
|
802
|
+
let filename = get(req, 'payload.filename', '')
|
|
803
|
+
// console.log(mode, 'filename', filename)
|
|
804
|
+
|
|
805
|
+
//queueId, 從payload接收
|
|
806
|
+
let queueId = get(req, 'payload.queueId', '')
|
|
807
|
+
// console.log(mode, 'queueId', queueId)
|
|
808
|
+
|
|
809
|
+
//mmg.get
|
|
810
|
+
let r = mmg.get(queueId, pathUploadTemp)
|
|
811
|
+
|
|
812
|
+
//out
|
|
813
|
+
out = {
|
|
814
|
+
queueId,
|
|
815
|
+
state: r.state,
|
|
816
|
+
filename,
|
|
817
|
+
path: r.path,
|
|
818
|
+
}
|
|
819
|
+
|
|
820
|
+
//check
|
|
821
|
+
if (r.state === 'done') {
|
|
741
822
|
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
823
|
+
//ri
|
|
824
|
+
let ri = {
|
|
825
|
+
filename,
|
|
826
|
+
path: r.path,
|
|
827
|
+
}
|
|
745
828
|
|
|
746
|
-
|
|
747
|
-
|
|
829
|
+
//procUpload, 偵測有合併完成大檔, 得調用procUpload讓伺服器攔截函數處理
|
|
830
|
+
// console.log('procUpload start')
|
|
831
|
+
let ro = await procUpload(ri)
|
|
832
|
+
// console.log('procUpload done', ro)
|
|
748
833
|
|
|
834
|
+
//out merge, ro須附加至msg, 才供前端偵測state為'done'時提取msg顯示
|
|
835
|
+
out = {
|
|
836
|
+
...out,
|
|
837
|
+
msg: ro,
|
|
838
|
+
}
|
|
839
|
+
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
}
|
|
843
|
+
// console.log('out', out)
|
|
844
|
+
|
|
845
|
+
return out
|
|
749
846
|
}
|
|
847
|
+
|
|
848
|
+
//procCore
|
|
849
|
+
let out = {}
|
|
850
|
+
let returnType = ''
|
|
851
|
+
let returnMsg = ''
|
|
852
|
+
await procCore()
|
|
853
|
+
.then((res) => {
|
|
854
|
+
out.success = res
|
|
855
|
+
returnType = 'success'
|
|
856
|
+
returnMsg = 'need to parse'
|
|
857
|
+
})
|
|
858
|
+
.catch((err) => {
|
|
859
|
+
out.error = err
|
|
860
|
+
returnType = 'error'
|
|
861
|
+
returnMsg = 'need to parse'
|
|
862
|
+
})
|
|
750
863
|
// console.log('out', out)
|
|
751
864
|
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
return responseU8aStream(res, u8aOut, { returnType: 'success', returnMsg: 'need to parse' })
|
|
758
|
-
}
|
|
865
|
+
//u8aOut
|
|
866
|
+
let u8aOut = obj2u8arr(out)
|
|
867
|
+
// console.log('u8aOut', u8aOut)
|
|
868
|
+
|
|
869
|
+
return responseU8aStream(res, u8aOut, { returnType, returnMsg })
|
|
759
870
|
},
|
|
760
871
|
}
|
|
761
872
|
|
|
@@ -824,18 +935,18 @@ function WConverhpServer(opt = {}) {
|
|
|
824
935
|
|
|
825
936
|
//check
|
|
826
937
|
if (!isp0int(chunkIndex)) {
|
|
827
|
-
console.log('invalid chunkIndex in headers')
|
|
828
|
-
return res
|
|
938
|
+
// console.log('invalid chunkIndex in headers')
|
|
939
|
+
return responseU8aStreamWithError(res, 'invalid chunkIndex in headers')
|
|
829
940
|
}
|
|
830
941
|
chunkIndex = cint(chunkIndex)
|
|
831
942
|
if (!isp0int(chunkTotal)) {
|
|
832
|
-
console.log('invalid chunkTotal in headers')
|
|
833
|
-
return res
|
|
943
|
+
// console.log('invalid chunkTotal in headers')
|
|
944
|
+
return responseU8aStreamWithError(res, 'invalid chunkTotal in headers')
|
|
834
945
|
}
|
|
835
946
|
chunkTotal = cint(chunkTotal)
|
|
836
947
|
if (!isestr(packageId)) {
|
|
837
|
-
console.log('invalid packageId in headers')
|
|
838
|
-
return res
|
|
948
|
+
// console.log('invalid packageId in headers')
|
|
949
|
+
return responseU8aStreamWithError(res, 'invalid packageId in headers')
|
|
839
950
|
}
|
|
840
951
|
|
|
841
952
|
//pathFileChunk
|
|
@@ -902,126 +1013,6 @@ function WConverhpServer(opt = {}) {
|
|
|
902
1013
|
},
|
|
903
1014
|
}
|
|
904
1015
|
|
|
905
|
-
//apiUploadSliceMerge
|
|
906
|
-
let apiUploadSliceMerge = {
|
|
907
|
-
path: `/${apiName}slcm`,
|
|
908
|
-
method: 'POST',
|
|
909
|
-
options: {
|
|
910
|
-
payload: {
|
|
911
|
-
maxBytes: 1024 * 1024 * 1024 * 1024, //預設為1mb, 調整至1tb, 也就是給予3次方
|
|
912
|
-
maxParts: 1000 * 1000 * 1000, //預設為1000, 給予3次方
|
|
913
|
-
timeout: false, //避免請求未完成時中斷
|
|
914
|
-
// output: 'stream',
|
|
915
|
-
parse: true, //前端送obj過來須自動解析
|
|
916
|
-
},
|
|
917
|
-
timeout: {
|
|
918
|
-
server: false, //關閉伺服器超時
|
|
919
|
-
socket: false, //關閉socket超時
|
|
920
|
-
},
|
|
921
|
-
},
|
|
922
|
-
handler: async function (req, res) {
|
|
923
|
-
// console.log(req, res)
|
|
924
|
-
// console.log('payload', req.payload)
|
|
925
|
-
|
|
926
|
-
//headers
|
|
927
|
-
let headers = get(req, 'headers')
|
|
928
|
-
headers = iseobj(headers) ? headers : ''
|
|
929
|
-
// console.log('headers', headers)
|
|
930
|
-
|
|
931
|
-
//query
|
|
932
|
-
let query = get(req, 'query')
|
|
933
|
-
query = iseobj(query) ? query : ''
|
|
934
|
-
// console.log('query', query)
|
|
935
|
-
|
|
936
|
-
//authorization
|
|
937
|
-
let authorization = get(headers, 'authorization', '')
|
|
938
|
-
authorization = isestr(authorization) ? authorization : ''
|
|
939
|
-
|
|
940
|
-
//check
|
|
941
|
-
if (true) {
|
|
942
|
-
|
|
943
|
-
//verifyConn
|
|
944
|
-
let m = verifyConn({ apiType: 'upload-slice-merge', authorization, headers, query })
|
|
945
|
-
if (ispm(m)) {
|
|
946
|
-
m = await m
|
|
947
|
-
}
|
|
948
|
-
|
|
949
|
-
//check
|
|
950
|
-
if (m !== true) {
|
|
951
|
-
return responseU8aStreamWithError(res, 'permission denied')
|
|
952
|
-
}
|
|
953
|
-
|
|
954
|
-
}
|
|
955
|
-
|
|
956
|
-
//eeEmit
|
|
957
|
-
eeEmit('handler', {
|
|
958
|
-
api: 'apiUploadSliceMerge',
|
|
959
|
-
headers,
|
|
960
|
-
query,
|
|
961
|
-
})
|
|
962
|
-
|
|
963
|
-
//filename, chunkTotal, packageId, 從payload接收
|
|
964
|
-
let filename = get(req, 'payload.filename', '')
|
|
965
|
-
let chunkTotal = get(req, 'payload.chunk-total', '')
|
|
966
|
-
let packageId = get(req, 'payload.package-id', '')
|
|
967
|
-
|
|
968
|
-
//check
|
|
969
|
-
if (!isestr(filename)) {
|
|
970
|
-
console.log('invalid filename in payload')
|
|
971
|
-
return res.response({ error: 'invalid filename in payload' }).code(400)
|
|
972
|
-
}
|
|
973
|
-
if (!isp0int(chunkTotal)) {
|
|
974
|
-
console.log('invalid chunkTotal in payload')
|
|
975
|
-
return res.response({ error: 'invalid chunkTotal in payload' }).code(400)
|
|
976
|
-
}
|
|
977
|
-
chunkTotal = cint(chunkTotal)
|
|
978
|
-
if (!isestr(packageId)) {
|
|
979
|
-
console.log('invalid packageId in payload')
|
|
980
|
-
return res.response({ error: 'invalid packageId in payload' }).code(400)
|
|
981
|
-
}
|
|
982
|
-
|
|
983
|
-
//mergeAndPorc
|
|
984
|
-
let mergeAndPorc = async() => {
|
|
985
|
-
|
|
986
|
-
//merge
|
|
987
|
-
// console.log('merge start')
|
|
988
|
-
let rMerg = await mergeFiles(pathUploadTemp, packageId, chunkTotal, filename)
|
|
989
|
-
// console.log('merge done', rMerg)
|
|
990
|
-
|
|
991
|
-
//procUpload
|
|
992
|
-
// console.log('procUpload start')
|
|
993
|
-
let rProc = await procUpload(rMerg)
|
|
994
|
-
// console.log('procUpload done', rProc)
|
|
995
|
-
|
|
996
|
-
return rProc
|
|
997
|
-
}
|
|
998
|
-
|
|
999
|
-
//mergeAndPorc
|
|
1000
|
-
let out = {}
|
|
1001
|
-
let returnType = ''
|
|
1002
|
-
let returnMsg = ''
|
|
1003
|
-
await mergeAndPorc()
|
|
1004
|
-
.then((res) => {
|
|
1005
|
-
out.success = res
|
|
1006
|
-
returnType = 'success'
|
|
1007
|
-
returnMsg = 'need to parse'
|
|
1008
|
-
})
|
|
1009
|
-
.catch((err) => {
|
|
1010
|
-
out.error = err
|
|
1011
|
-
returnType = 'error'
|
|
1012
|
-
returnMsg = 'need to parse'
|
|
1013
|
-
eeEmit('error', `${err.message}`)
|
|
1014
|
-
})
|
|
1015
|
-
// console.log('out', out)
|
|
1016
|
-
|
|
1017
|
-
//u8aOut
|
|
1018
|
-
let u8aOut = obj2u8arr(out)
|
|
1019
|
-
// console.log('u8aOut', u8aOut)
|
|
1020
|
-
|
|
1021
|
-
return responseU8aStream(res, u8aOut, { returnType, returnMsg })
|
|
1022
|
-
},
|
|
1023
|
-
}
|
|
1024
|
-
|
|
1025
1016
|
//apiDownloadGetFilename
|
|
1026
1017
|
let apiDownloadGetFilename = {
|
|
1027
1018
|
path: `/${apiName}dwgfn`,
|
|
@@ -1433,7 +1424,7 @@ function WConverhpServer(opt = {}) {
|
|
|
1433
1424
|
apiMain,
|
|
1434
1425
|
apiUploadCheck,
|
|
1435
1426
|
apiUploadSlice,
|
|
1436
|
-
apiUploadSliceMerge,
|
|
1427
|
+
// apiUploadSliceMerge,
|
|
1437
1428
|
apiDownloadGetFilename,
|
|
1438
1429
|
apiDownloadGetFile,
|
|
1439
1430
|
apiDownload,
|
|
@@ -1452,7 +1443,8 @@ function WConverhpServer(opt = {}) {
|
|
|
1452
1443
|
|
|
1453
1444
|
//start
|
|
1454
1445
|
if (get(opt, 'serverHapi')) {
|
|
1455
|
-
server.route([apiMain, apiUploadCheck, apiUploadSlice, apiUploadSliceMerge, apiDownloadGetFilename, apiDownloadGetFile, apiDownload])
|
|
1446
|
+
// server.route([apiMain, apiUploadCheck, apiUploadSlice, apiUploadSliceMerge, apiDownloadGetFilename, apiDownloadGetFile, apiDownload])
|
|
1447
|
+
server.route([apiMain, apiUploadCheck, apiUploadSlice, apiDownloadGetFilename, apiDownloadGetFile, apiDownload])
|
|
1456
1448
|
}
|
|
1457
1449
|
else {
|
|
1458
1450
|
startServer()
|
|
@@ -1485,7 +1477,7 @@ export default WConverhpServer
|
|
|
1485
1477
|
<br class="clear">
|
|
1486
1478
|
|
|
1487
1479
|
<footer>
|
|
1488
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on
|
|
1480
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Tue Apr 15 2025 14:44:02 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
1489
1481
|
</footer>
|
|
1490
1482
|
|
|
1491
1483
|
<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 Tue Apr 15 2025 14:44:02 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
package/scla.mjs
CHANGED