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.
@@ -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('fileTotalHash', fileTotalHash)
679
-
680
- //ckh
681
- let ckh = async({ filename, fileSize, fileHash }) => {
682
-
683
- //send upload-check
684
- let resCk = await send('upload-check', { filename, fileSize, fileHash }, { dataType: 'json' })
685
- // console.log('resCk', resCk)
686
-
687
- return resCk
688
- }
689
-
690
- //rAll
691
- let rAll = await ckh({ filename: fileTotalHash, fileSize: fileTotalSize, fileHash: fileTotalHash })
692
- // console.log('rAll', rAll)
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 (rAll.existed) {
705
+ if (resCk.bAllHash) {
696
706
  // console.log('已有上傳大檔')
697
707
  let resMg = {
698
708
  filename: fileTotalName,
699
- path: rAll.path,
709
+ path: resCk.path,
700
710
  }
701
711
  return resMg
702
712
  }
703
713
 
704
- //chunkTotal
705
- let chunkTotal = Math.ceil(n / sizeSlice)
706
- // console.log('chunkTotal', chunkTotal)
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 * n
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: n, m: 'upload' })
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
- //fileSliceName
743
- let fileSliceName = `${fileTotalHash}_${i}`
744
- // console.log('fileSliceName', fileSliceName)
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, n)
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
 
@@ -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
- //filename, fileSize, fileHash, 從payload接收
664
- let filename = get(req, 'payload.filename', '')
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 (!isestr(filename)) {
673
- // console.log('invalid filename in payload')
674
- return responseU8aStreamWithError(res, 'invalid filename in payload')
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
- //check
678
- if (!isnum(fileSize)) {
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
- //pathFile
690
- let pathFile = path.join(pathUploadTemp, filename)
691
- // console.log('pathFile', pathFile)
686
+ //checkTotalHash
687
+ let checkTotalHash = async () => {
692
688
 
693
- //check
694
- if (!fsIsFile(pathFile)) {
695
- let out = {
696
- success: {
697
- existed: false,
698
- msg: 'not exist',
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
- //_fileSize
706
- let stats = fs.statSync(pathFile)
707
- let _fileSize = stats.size
703
+ //fileSize, 從payload接收
704
+ let fileSize = get(req, 'payload.fileSize', '')
708
705
 
709
- //check
710
- if (fileSize !== _fileSize) {
711
- let out = {
712
- success: {
713
- existed: false,
714
- msg: 'not equal size',
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
- //_fileHash
722
- let _fileHash = await calcFileHash(pathFile)
723
- // console.log('path', pathFile)
724
- // console.log('hash(front)', fileHash)
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
- //check
729
- if (fileHash !== _fileHash) {
730
- let out = {
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
- existed: false,
733
- msg: 'not equal hash',
775
+ path: pathFile,
776
+ bAllExist,
777
+ bAllSize,
778
+ bAllHash,
779
+ bSls,
780
+ slks,
734
781
  },
735
782
  }
736
- let u8aOut = obj2u8arr(out)
737
- return responseU8aStream(res, u8aOut, { returnType: 'success', returnMsg: 'need to parse' })
783
+
784
+ return r
738
785
  }
739
786
 
740
- if (true) {
741
- let out = {
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
- existed: true,
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
@@ -137,5 +137,4 @@ setTimeout(() => {
137
137
  wo.stop()
138
138
  }, 3000)
139
139
 
140
-
141
- //node --experimental-modules srv.mjs
140
+ //node --max-old-space-size=120000 srv.mjs