delimiterDecoder.js 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. /** 指定分隔符解码器 */
  2. class delimiterDecoder{
  3. /** 分隔符 */
  4. delimiter;
  5. /** 完整数据包处理 */
  6. completeDataExecute;
  7. /** 传入的数据 buffer */
  8. chunks = [];
  9. /** 记录buffer最大长度 字节数byte */
  10. maxSize = 0;
  11. constructor(delimiter,maxSize,completeDataExecute) {
  12. this.delimiter = delimiter;
  13. this.maxSize = maxSize;
  14. this.completeDataExecute = completeDataExecute;
  15. }
  16. /**
  17. * 接收到数据
  18. * @param data
  19. */
  20. read(data){
  21. if(this.chunks.length === 0){
  22. this.chunks = data;
  23. }else{
  24. this.chunks = Buffer.concat([this.chunks,data]);
  25. }
  26. while (true){
  27. let index = this.chunks.indexOf(this.delimiter);
  28. if(index <= -1){
  29. if(this.chunks.length >= this.maxSize){
  30. console.debug("---> discard message")
  31. this.chunks = [];
  32. }
  33. break;
  34. }else if(index > this.maxSize){
  35. console.debug("---> discard message")
  36. this.chunks = this.chunks.slice(index + this.delimiter.length);
  37. continue;
  38. }
  39. let completeData = this.chunks.slice(0,index);
  40. let removeLength = index + this.delimiter.length;
  41. this.chunks = this.chunks.slice(removeLength);
  42. this.completeDataExecute(completeData);
  43. }
  44. }
  45. }
  46. module.exports = delimiterDecoder;