buffer-list.ts 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. export default class BufferList {
  2. constructor(public buffers: Buffer[] = []) {}
  3. public add(buffer: Buffer, front?: boolean) {
  4. this.buffers[front ? 'unshift' : 'push'](buffer)
  5. return this
  6. }
  7. public addInt16(val: number, front?: boolean) {
  8. return this.add(Buffer.from([val >>> 8, val >>> 0]), front)
  9. }
  10. public getByteLength(initial?: number) {
  11. return this.buffers.reduce(function (previous, current) {
  12. return previous + current.length
  13. }, initial || 0)
  14. }
  15. public addInt32(val: number, first?: boolean) {
  16. return this.add(
  17. Buffer.from([(val >>> 24) & 0xff, (val >>> 16) & 0xff, (val >>> 8) & 0xff, (val >>> 0) & 0xff]),
  18. first
  19. )
  20. }
  21. public addCString(val: string, front?: boolean) {
  22. var len = Buffer.byteLength(val)
  23. var buffer = Buffer.alloc(len + 1)
  24. buffer.write(val)
  25. buffer[len] = 0
  26. return this.add(buffer, front)
  27. }
  28. public addString(val: string, front?: boolean) {
  29. var len = Buffer.byteLength(val)
  30. var buffer = Buffer.alloc(len)
  31. buffer.write(val)
  32. return this.add(buffer, front)
  33. }
  34. public addChar(char: string, first?: boolean) {
  35. return this.add(Buffer.from(char, 'utf8'), first)
  36. }
  37. public addByte(byte: number) {
  38. return this.add(Buffer.from([byte]))
  39. }
  40. public join(appendLength?: boolean, char?: string): Buffer {
  41. var length = this.getByteLength()
  42. if (appendLength) {
  43. this.addInt32(length + 4, true)
  44. return this.join(false, char)
  45. }
  46. if (char) {
  47. this.addChar(char, true)
  48. length++
  49. }
  50. var result = Buffer.alloc(length)
  51. var index = 0
  52. this.buffers.forEach(function (buffer) {
  53. buffer.copy(result, index, 0)
  54. index += buffer.length
  55. })
  56. return result
  57. }
  58. public static concat(): Buffer {
  59. var total = new BufferList()
  60. for (var i = 0; i < arguments.length; i++) {
  61. total.add(arguments[i])
  62. }
  63. return total.join()
  64. }
  65. }