w-converhp 2.0.35 → 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 +84 -34
- package/docs/WConverhpServer.html +2 -2
- package/docs/WConverhpServer.mjs.html +131 -304
- 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/script.txt +4 -4
- package/src/WConverhpClient.mjs +83 -33
- package/src/WConverhpServer.mjs +130 -303
- package/src/checkSlicesHash.mjs +68 -0
- package/src/checkSlicesHash.wk.umd.js +1 -0
- package/src/checkTotalHash.mjs +107 -0
- package/src/checkTotalHash.wk.umd.js +1 -0
- 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 +48 -4
- package/src/calcFileHash.mjs +0 -10
- package/src/calcFileHash.wk.umd.js +0 -1
- package/src/mergeFiles.mjs +0 -27
- package/src/mergeFiles.wk.umd.js +0 -1
|
@@ -51,8 +51,6 @@ 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'
|
|
56
54
|
import isNumber from 'lodash-es/isNumber.js'
|
|
57
55
|
import genPm from 'wsemi/src/genPm.mjs'
|
|
58
56
|
import evem from 'wsemi/src/evem.mjs'
|
|
@@ -62,7 +60,6 @@ import isp0int from 'wsemi/src/isp0int.mjs'
|
|
|
62
60
|
import ispint from 'wsemi/src/ispint.mjs'
|
|
63
61
|
import isearr from 'wsemi/src/isearr.mjs'
|
|
64
62
|
import isbol from 'wsemi/src/isbol.mjs'
|
|
65
|
-
import isnum from 'wsemi/src/isnum.mjs'
|
|
66
63
|
import isfun from 'wsemi/src/isfun.mjs'
|
|
67
64
|
import ispm from 'wsemi/src/ispm.mjs'
|
|
68
65
|
import cint from 'wsemi/src/cint.mjs'
|
|
@@ -71,15 +68,13 @@ import str2b64 from 'wsemi/src/str2b64.mjs'
|
|
|
71
68
|
import haskey from 'wsemi/src/haskey.mjs'
|
|
72
69
|
import obj2u8arr from 'wsemi/src/obj2u8arr.mjs'
|
|
73
70
|
import u8arr2obj from 'wsemi/src/u8arr2obj.mjs'
|
|
74
|
-
import fsIsFile from 'wsemi/src/fsIsFile.mjs'
|
|
75
71
|
import fsIsFolder from 'wsemi/src/fsIsFolder.mjs'
|
|
76
72
|
import fsCreateFolder from 'wsemi/src/fsCreateFolder.mjs'
|
|
77
|
-
import
|
|
78
|
-
import
|
|
79
|
-
|
|
80
|
-
import
|
|
81
|
-
|
|
82
|
-
import mergeFiles from './mergeFiles.wk.umd.js'
|
|
73
|
+
import managerMergeSlices from './managerMergeSlices.mjs'
|
|
74
|
+
// import checkTotalHash from './checkTotalHash.mjs'
|
|
75
|
+
import checkTotalHash from './checkTotalHash.wk.umd.js'
|
|
76
|
+
// import checkSlicesHash from './checkSlicesHash.mjs'
|
|
77
|
+
import checkSlicesHash from './checkSlicesHash.wk.umd.js'
|
|
83
78
|
|
|
84
79
|
|
|
85
80
|
//回傳前端stream時(POST或GET皆可), 前端會須等stream傳完才能判斷是否為大檔或錯誤訊息, 此會導致若回傳超大檔, 會需要對超大檔進行解析會有記憶體上限問題, 故需要通過header提供基本成功或失敗訊息, 讓前端能進行解析判斷
|
|
@@ -87,6 +82,10 @@ import mergeFiles from './mergeFiles.wk.umd.js'
|
|
|
87
82
|
//回傳前端(browser)時, 針對超大檔, 可用POST並用stream回傳但還要處理進度條, 若要交由瀏覽器下載器處理, 只能用GET並用stream回傳, 且前端只能用window.location.href或a.href+a.click()下載
|
|
88
83
|
|
|
89
84
|
|
|
85
|
+
//mmg
|
|
86
|
+
let mmg = managerMergeSlices()
|
|
87
|
+
|
|
88
|
+
|
|
90
89
|
/**
|
|
91
90
|
* 建立Hapi伺服器
|
|
92
91
|
*
|
|
@@ -656,7 +655,7 @@ function WConverhpServer(opt = {}) {
|
|
|
656
655
|
|
|
657
656
|
//apiUploadCheck
|
|
658
657
|
let apiUploadCheck = {
|
|
659
|
-
path: `/${apiName}
|
|
658
|
+
path: `/${apiName}ulctr`,
|
|
660
659
|
method: 'POST',
|
|
661
660
|
options: {
|
|
662
661
|
payload: {
|
|
@@ -693,7 +692,7 @@ function WConverhpServer(opt = {}) {
|
|
|
693
692
|
if (true) {
|
|
694
693
|
|
|
695
694
|
//verifyConn
|
|
696
|
-
let m = verifyConn({ apiType: 'upload-
|
|
695
|
+
let m = verifyConn({ apiType: 'upload-controller', authorization, headers, query })
|
|
697
696
|
if (ispm(m)) {
|
|
698
697
|
m = await m
|
|
699
698
|
}
|
|
@@ -716,13 +715,14 @@ function WConverhpServer(opt = {}) {
|
|
|
716
715
|
let mode = get(req, 'payload.mode', '')
|
|
717
716
|
|
|
718
717
|
//check
|
|
719
|
-
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') {
|
|
720
719
|
// console.log('invalid mode in payload')
|
|
721
720
|
return responseU8aStreamWithError(res, `invalid mode[${mode}] in payload`)
|
|
722
721
|
}
|
|
723
722
|
|
|
724
723
|
//fileHash, 從payload接收
|
|
725
724
|
let fileHash = get(req, 'payload.fileHash', '')
|
|
725
|
+
// console.log(mode, 'fileHash', fileHash)
|
|
726
726
|
|
|
727
727
|
//check
|
|
728
728
|
if (!isestr(fileHash)) {
|
|
@@ -730,189 +730,143 @@ function WConverhpServer(opt = {}) {
|
|
|
730
730
|
return responseU8aStreamWithError(res, 'invalid fileHash in payload')
|
|
731
731
|
}
|
|
732
732
|
|
|
733
|
-
//
|
|
734
|
-
let
|
|
733
|
+
//procCore
|
|
734
|
+
let procCore = async() => {
|
|
735
|
+
let out = null
|
|
736
|
+
if (mode === 'check-total-hash') {
|
|
735
737
|
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
738
|
+
//filename, 從payload接收
|
|
739
|
+
let filename = get(req, 'payload.filename', '')
|
|
740
|
+
// console.log(mode, 'filename', filename)
|
|
739
741
|
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
// console.log(`check exist for pathFile[${pathFile}]...`)
|
|
742
|
+
//fileSize, 從payload接收
|
|
743
|
+
let fileSize = get(req, 'payload.fileSize', '')
|
|
744
|
+
// console.log(mode, 'fileSize', fileSize)
|
|
744
745
|
|
|
745
|
-
|
|
746
|
+
//checkTotalHash
|
|
747
|
+
out = await checkTotalHash(fileSize, sizeSlice, fileHash, pathUploadTemp)
|
|
748
|
+
// console.log(mode, 'out', out)
|
|
746
749
|
|
|
747
|
-
//
|
|
748
|
-
|
|
750
|
+
//check, 因合併大檔後可能非預期中斷而重傳, 每次偵測有合併完成大檔, 就得調用procUpload讓伺服器攔截函數處理
|
|
751
|
+
if (out.bAllHash) {
|
|
749
752
|
|
|
750
|
-
|
|
751
|
-
|
|
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
|
+
}
|
|
752
769
|
|
|
753
|
-
//check
|
|
754
|
-
if (!isnum(fileSize)) {
|
|
755
|
-
// console.log('invalid fileSize in payload')
|
|
756
|
-
let r = {
|
|
757
|
-
error: 'invalid fileSize in payload',
|
|
758
770
|
}
|
|
759
|
-
return r
|
|
760
|
-
}
|
|
761
771
|
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
if (bAllExist) {
|
|
765
|
-
// console.log(`check size for pathFile[${pathFile}]...`)
|
|
772
|
+
}
|
|
773
|
+
else if (mode === 'check-slices-hash') {
|
|
766
774
|
|
|
767
|
-
//
|
|
768
|
-
let
|
|
769
|
-
|
|
775
|
+
//fileSliceHashs, 從payload接收
|
|
776
|
+
let fileSliceHashs = get(req, 'payload.fileSliceHashs', [])
|
|
777
|
+
// console.log(mode, 'fileSliceHashs', fileSliceHashs)
|
|
770
778
|
|
|
771
|
-
//
|
|
772
|
-
|
|
779
|
+
//checkSlicesHash
|
|
780
|
+
out = await checkSlicesHash(fileSliceHashs, fileHash, pathUploadTemp)
|
|
781
|
+
// console.log(mode, 'out', out)
|
|
773
782
|
|
|
774
|
-
// console.log(`check size for pathFile[${pathFile}] done`, bAllSize)
|
|
775
783
|
}
|
|
784
|
+
else if (mode === 'merge-slices-push') {
|
|
776
785
|
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
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
|
-
}
|
|
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
|
+
}
|
|
795
797
|
|
|
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 = {
|
|
821
|
-
success: {
|
|
822
|
-
path: pathFile,
|
|
823
|
-
bAllExist,
|
|
824
|
-
bAllSize,
|
|
825
|
-
bAllHash,
|
|
826
|
-
bSls,
|
|
827
|
-
slks,
|
|
828
|
-
},
|
|
829
798
|
}
|
|
799
|
+
else if (mode === 'merge-slices-get') {
|
|
830
800
|
|
|
831
|
-
|
|
832
|
-
|
|
801
|
+
//filename, 從payload接收
|
|
802
|
+
let filename = get(req, 'payload.filename', '')
|
|
803
|
+
// console.log(mode, 'filename', filename)
|
|
833
804
|
|
|
834
|
-
|
|
835
|
-
|
|
805
|
+
//queueId, 從payload接收
|
|
806
|
+
let queueId = get(req, 'payload.queueId', '')
|
|
807
|
+
// console.log(mode, 'queueId', queueId)
|
|
836
808
|
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
// console.log('fileSliceHashs', fileSliceHashs)
|
|
809
|
+
//mmg.get
|
|
810
|
+
let r = mmg.get(queueId, pathUploadTemp)
|
|
840
811
|
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
812
|
+
//out
|
|
813
|
+
out = {
|
|
814
|
+
queueId,
|
|
815
|
+
state: r.state,
|
|
816
|
+
filename,
|
|
817
|
+
path: r.path,
|
|
845
818
|
}
|
|
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
819
|
|
|
879
820
|
//check
|
|
880
|
-
if (
|
|
881
|
-
slksCfm.push(v.i)
|
|
882
|
-
}
|
|
883
|
-
// else {
|
|
884
|
-
// console.log(`hash is not equal`, `hash(front)`, v.h, `hash(backend)`, _fileHash)
|
|
885
|
-
// }
|
|
821
|
+
if (r.state === 'done') {
|
|
886
822
|
|
|
887
|
-
|
|
888
|
-
|
|
823
|
+
//ri
|
|
824
|
+
let ri = {
|
|
825
|
+
filename,
|
|
826
|
+
path: r.path,
|
|
827
|
+
}
|
|
828
|
+
|
|
829
|
+
//procUpload, 偵測有合併完成大檔, 得調用procUpload讓伺服器攔截函數處理
|
|
830
|
+
// console.log('procUpload start')
|
|
831
|
+
let ro = await procUpload(ri)
|
|
832
|
+
// console.log('procUpload done', ro)
|
|
833
|
+
|
|
834
|
+
//out merge, ro須附加至msg, 才供前端偵測state為'done'時提取msg顯示
|
|
835
|
+
out = {
|
|
836
|
+
...out,
|
|
837
|
+
msg: ro,
|
|
838
|
+
}
|
|
839
|
+
|
|
840
|
+
}
|
|
889
841
|
|
|
890
|
-
//r
|
|
891
|
-
let r = {
|
|
892
|
-
success: {
|
|
893
|
-
slks: slksCfm,
|
|
894
|
-
},
|
|
895
842
|
}
|
|
843
|
+
// console.log('out', out)
|
|
896
844
|
|
|
897
|
-
return
|
|
845
|
+
return out
|
|
898
846
|
}
|
|
899
847
|
|
|
900
|
-
//
|
|
901
|
-
let out =
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
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
|
+
})
|
|
863
|
+
// console.log('out', out)
|
|
908
864
|
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
return responseU8aStream(res, u8aOut, { returnType: 'success', returnMsg: 'need to parse' })
|
|
915
|
-
}
|
|
865
|
+
//u8aOut
|
|
866
|
+
let u8aOut = obj2u8arr(out)
|
|
867
|
+
// console.log('u8aOut', u8aOut)
|
|
868
|
+
|
|
869
|
+
return responseU8aStream(res, u8aOut, { returnType, returnMsg })
|
|
916
870
|
},
|
|
917
871
|
}
|
|
918
872
|
|
|
@@ -981,18 +935,18 @@ function WConverhpServer(opt = {}) {
|
|
|
981
935
|
|
|
982
936
|
//check
|
|
983
937
|
if (!isp0int(chunkIndex)) {
|
|
984
|
-
console.log('invalid chunkIndex in headers')
|
|
985
|
-
return res
|
|
938
|
+
// console.log('invalid chunkIndex in headers')
|
|
939
|
+
return responseU8aStreamWithError(res, 'invalid chunkIndex in headers')
|
|
986
940
|
}
|
|
987
941
|
chunkIndex = cint(chunkIndex)
|
|
988
942
|
if (!isp0int(chunkTotal)) {
|
|
989
|
-
console.log('invalid chunkTotal in headers')
|
|
990
|
-
return res
|
|
943
|
+
// console.log('invalid chunkTotal in headers')
|
|
944
|
+
return responseU8aStreamWithError(res, 'invalid chunkTotal in headers')
|
|
991
945
|
}
|
|
992
946
|
chunkTotal = cint(chunkTotal)
|
|
993
947
|
if (!isestr(packageId)) {
|
|
994
|
-
console.log('invalid packageId in headers')
|
|
995
|
-
return res
|
|
948
|
+
// console.log('invalid packageId in headers')
|
|
949
|
+
return responseU8aStreamWithError(res, 'invalid packageId in headers')
|
|
996
950
|
}
|
|
997
951
|
|
|
998
952
|
//pathFileChunk
|
|
@@ -1059,126 +1013,6 @@ function WConverhpServer(opt = {}) {
|
|
|
1059
1013
|
},
|
|
1060
1014
|
}
|
|
1061
1015
|
|
|
1062
|
-
//apiUploadSliceMerge
|
|
1063
|
-
let apiUploadSliceMerge = {
|
|
1064
|
-
path: `/${apiName}slcm`,
|
|
1065
|
-
method: 'POST',
|
|
1066
|
-
options: {
|
|
1067
|
-
payload: {
|
|
1068
|
-
maxBytes: 1024 * 1024 * 1024 * 1024, //預設為1mb, 調整至1tb, 也就是給予3次方
|
|
1069
|
-
maxParts: 1000 * 1000 * 1000, //預設為1000, 給予3次方
|
|
1070
|
-
timeout: false, //避免請求未完成時中斷
|
|
1071
|
-
// output: 'stream',
|
|
1072
|
-
parse: true, //前端送obj過來須自動解析
|
|
1073
|
-
},
|
|
1074
|
-
timeout: {
|
|
1075
|
-
server: false, //關閉伺服器超時
|
|
1076
|
-
socket: false, //關閉socket超時
|
|
1077
|
-
},
|
|
1078
|
-
},
|
|
1079
|
-
handler: async function (req, res) {
|
|
1080
|
-
// console.log(req, res)
|
|
1081
|
-
// console.log('payload', req.payload)
|
|
1082
|
-
|
|
1083
|
-
//headers
|
|
1084
|
-
let headers = get(req, 'headers')
|
|
1085
|
-
headers = iseobj(headers) ? headers : ''
|
|
1086
|
-
// console.log('headers', headers)
|
|
1087
|
-
|
|
1088
|
-
//query
|
|
1089
|
-
let query = get(req, 'query')
|
|
1090
|
-
query = iseobj(query) ? query : ''
|
|
1091
|
-
// console.log('query', query)
|
|
1092
|
-
|
|
1093
|
-
//authorization
|
|
1094
|
-
let authorization = get(headers, 'authorization', '')
|
|
1095
|
-
authorization = isestr(authorization) ? authorization : ''
|
|
1096
|
-
|
|
1097
|
-
//check
|
|
1098
|
-
if (true) {
|
|
1099
|
-
|
|
1100
|
-
//verifyConn
|
|
1101
|
-
let m = verifyConn({ apiType: 'upload-slice-merge', authorization, headers, query })
|
|
1102
|
-
if (ispm(m)) {
|
|
1103
|
-
m = await m
|
|
1104
|
-
}
|
|
1105
|
-
|
|
1106
|
-
//check
|
|
1107
|
-
if (m !== true) {
|
|
1108
|
-
return responseU8aStreamWithError(res, 'permission denied')
|
|
1109
|
-
}
|
|
1110
|
-
|
|
1111
|
-
}
|
|
1112
|
-
|
|
1113
|
-
//eeEmit
|
|
1114
|
-
eeEmit('handler', {
|
|
1115
|
-
api: 'apiUploadSliceMerge',
|
|
1116
|
-
headers,
|
|
1117
|
-
query,
|
|
1118
|
-
})
|
|
1119
|
-
|
|
1120
|
-
//filename, chunkTotal, packageId, 從payload接收
|
|
1121
|
-
let filename = get(req, 'payload.filename', '')
|
|
1122
|
-
let chunkTotal = get(req, 'payload.chunk-total', '')
|
|
1123
|
-
let packageId = get(req, 'payload.package-id', '')
|
|
1124
|
-
|
|
1125
|
-
//check
|
|
1126
|
-
if (!isestr(filename)) {
|
|
1127
|
-
console.log('invalid filename in payload')
|
|
1128
|
-
return res.response({ error: 'invalid filename in payload' }).code(400)
|
|
1129
|
-
}
|
|
1130
|
-
if (!isp0int(chunkTotal)) {
|
|
1131
|
-
console.log('invalid chunkTotal in payload')
|
|
1132
|
-
return res.response({ error: 'invalid chunkTotal in payload' }).code(400)
|
|
1133
|
-
}
|
|
1134
|
-
chunkTotal = cint(chunkTotal)
|
|
1135
|
-
if (!isestr(packageId)) {
|
|
1136
|
-
console.log('invalid packageId in payload')
|
|
1137
|
-
return res.response({ error: 'invalid packageId in payload' }).code(400)
|
|
1138
|
-
}
|
|
1139
|
-
|
|
1140
|
-
//mergeAndPorc
|
|
1141
|
-
let mergeAndPorc = async() => {
|
|
1142
|
-
|
|
1143
|
-
//merge
|
|
1144
|
-
// console.log('merge start')
|
|
1145
|
-
let r = await mergeFiles(pathUploadTemp, packageId, chunkTotal, filename)
|
|
1146
|
-
// console.log('merge done', r)
|
|
1147
|
-
|
|
1148
|
-
//procUpload
|
|
1149
|
-
// console.log('procUpload start')
|
|
1150
|
-
let rr = await procUpload(r)
|
|
1151
|
-
// console.log('procUpload done', rr)
|
|
1152
|
-
|
|
1153
|
-
return rr
|
|
1154
|
-
}
|
|
1155
|
-
|
|
1156
|
-
//mergeAndPorc
|
|
1157
|
-
let out = {}
|
|
1158
|
-
let returnType = ''
|
|
1159
|
-
let returnMsg = ''
|
|
1160
|
-
await mergeAndPorc()
|
|
1161
|
-
.then((res) => {
|
|
1162
|
-
out.success = res
|
|
1163
|
-
returnType = 'success'
|
|
1164
|
-
returnMsg = 'need to parse'
|
|
1165
|
-
})
|
|
1166
|
-
.catch((err) => {
|
|
1167
|
-
out.error = err
|
|
1168
|
-
returnType = 'error'
|
|
1169
|
-
returnMsg = 'need to parse'
|
|
1170
|
-
eeEmit('error', `${err.message}`)
|
|
1171
|
-
})
|
|
1172
|
-
// console.log('out', out)
|
|
1173
|
-
|
|
1174
|
-
//u8aOut
|
|
1175
|
-
let u8aOut = obj2u8arr(out)
|
|
1176
|
-
// console.log('u8aOut', u8aOut)
|
|
1177
|
-
|
|
1178
|
-
return responseU8aStream(res, u8aOut, { returnType, returnMsg })
|
|
1179
|
-
},
|
|
1180
|
-
}
|
|
1181
|
-
|
|
1182
1016
|
//apiDownloadGetFilename
|
|
1183
1017
|
let apiDownloadGetFilename = {
|
|
1184
1018
|
path: `/${apiName}dwgfn`,
|
|
@@ -1396,14 +1230,6 @@ function WConverhpServer(opt = {}) {
|
|
|
1396
1230
|
//streamRead
|
|
1397
1231
|
let streamRead = get(r, 'streamRead')
|
|
1398
1232
|
|
|
1399
|
-
// //filename
|
|
1400
|
-
// let filename = get(r, 'filename')
|
|
1401
|
-
// if (!isestr(filename)) {
|
|
1402
|
-
// return responseU8aStreamWithError(res, 'invalid filename')
|
|
1403
|
-
// }
|
|
1404
|
-
// filename = str2b64(filename) //headers內對中文支援度不佳須用base64傳
|
|
1405
|
-
// console.log('filename', filename)
|
|
1406
|
-
|
|
1407
1233
|
//fileSize
|
|
1408
1234
|
let fileSize = get(r, 'fileSize')
|
|
1409
1235
|
if (!isNumber(fileSize)) {
|
|
@@ -1598,7 +1424,7 @@ function WConverhpServer(opt = {}) {
|
|
|
1598
1424
|
apiMain,
|
|
1599
1425
|
apiUploadCheck,
|
|
1600
1426
|
apiUploadSlice,
|
|
1601
|
-
apiUploadSliceMerge,
|
|
1427
|
+
// apiUploadSliceMerge,
|
|
1602
1428
|
apiDownloadGetFilename,
|
|
1603
1429
|
apiDownloadGetFile,
|
|
1604
1430
|
apiDownload,
|
|
@@ -1617,7 +1443,8 @@ function WConverhpServer(opt = {}) {
|
|
|
1617
1443
|
|
|
1618
1444
|
//start
|
|
1619
1445
|
if (get(opt, 'serverHapi')) {
|
|
1620
|
-
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])
|
|
1621
1448
|
}
|
|
1622
1449
|
else {
|
|
1623
1450
|
startServer()
|
|
@@ -1650,7 +1477,7 @@ export default WConverhpServer
|
|
|
1650
1477
|
<br class="clear">
|
|
1651
1478
|
|
|
1652
1479
|
<footer>
|
|
1653
|
-
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.
|
|
1654
1481
|
</footer>
|
|
1655
1482
|
|
|
1656
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
package/sclb.mjs
CHANGED
package/sclc.mjs
CHANGED
|
@@ -27,7 +27,7 @@ wo.on('error', (err) => {
|
|
|
27
27
|
function uploadLargeFile() {
|
|
28
28
|
let core = async() => {
|
|
29
29
|
|
|
30
|
-
let fsz = '
|
|
30
|
+
let fsz = '10mb' //0mb 10mb 100mb 1000mb
|
|
31
31
|
|
|
32
32
|
//u8a
|
|
33
33
|
let u8a = fs.readFileSync(`../_data/${fsz}.7z`) //用fs讀有檔案大小上限
|
|
@@ -54,6 +54,9 @@ function uploadLargeFile() {
|
|
|
54
54
|
|
|
55
55
|
}
|
|
56
56
|
core()
|
|
57
|
+
.catch((err) => {
|
|
58
|
+
console.log(err)
|
|
59
|
+
})
|
|
57
60
|
}
|
|
58
61
|
|
|
59
62
|
uploadLargeFile()
|
package/scld.mjs
CHANGED
package/script.txt
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
#node
|
|
2
|
-
node
|
|
1
|
+
#node toolg/addVersion.mjs
|
|
2
|
+
node toolg/modifyReadme.mjs
|
|
3
3
|
|
|
4
|
-
node
|
|
4
|
+
node toolg/cleanFolder.mjs
|
|
5
5
|
./node_modules/.bin/jsdoc -c .jsdoc
|
|
6
6
|
|
|
7
|
-
node
|
|
7
|
+
node toolg/gDistRollup.mjs
|
|
8
8
|
|
|
9
9
|
git add . -A
|
|
10
10
|
git commit -m 'modify: '
|