GZIPPacked.ts 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import {serializeBytes} from '../index';
  2. import {inflate} from 'pako';
  3. import {BinaryReader} from "../../extensions/BinaryReader";
  4. export class GZIPPacked {
  5. static CONSTRUCTOR_ID = 0x3072cfa1;
  6. static classType = 'constructor';
  7. data: Buffer;
  8. private CONSTRUCTOR_ID: number;
  9. private classType: string;
  10. constructor(data: Buffer) {
  11. this.data = data;
  12. this.CONSTRUCTOR_ID = 0x3072cfa1;
  13. this.classType = 'constructor'
  14. }
  15. static async gzipIfSmaller(contentRelated: boolean, data: Buffer) {
  16. if (contentRelated && data.length > 512) {
  17. const gzipped = await (new GZIPPacked(data)).toBytes();
  18. if (gzipped.length < data.length) {
  19. return gzipped
  20. }
  21. }
  22. return data
  23. }
  24. static gzip(input: Buffer) {
  25. return Buffer.from(input)
  26. // TODO this usually makes it faster for large requests
  27. //return Buffer.from(deflate(input, { level: 9, gzip: true }))
  28. }
  29. static ungzip(input: Buffer) {
  30. return Buffer.from(inflate(input))
  31. }
  32. async toBytes() {
  33. const g = Buffer.alloc(4);
  34. g.writeUInt32LE(GZIPPacked.CONSTRUCTOR_ID, 0);
  35. return Buffer.concat([
  36. g,
  37. serializeBytes(await GZIPPacked.gzip(this.data)),
  38. ])
  39. }
  40. static async read(reader: BinaryReader) {
  41. const constructor = reader.readInt(false);
  42. if (constructor !== GZIPPacked.CONSTRUCTOR_ID) {
  43. throw new Error('not equal')
  44. }
  45. return await GZIPPacked.gzip(reader.tgReadBytes())
  46. }
  47. static async fromReader(reader: BinaryReader) {
  48. const data = reader.tgReadBytes();
  49. return new GZIPPacked(await GZIPPacked.ungzip(data))
  50. }
  51. }