From 87b691762f0324834ba2059dd1a587c63da36039 Mon Sep 17 00:00:00 2001
From: igorwork <markin.io210@gmail.com>
Date: Fri, 11 Sep 2020 18:09:22 +0300
Subject: [PATCH] Implement sender status object encoding

---
 __tests__/ObfuscationService.test.js          |  1 +
 __tests__/StatusesService.test.js             | 15 ++++++++--
 jest.config.js                                |  7 ++---
 .../StatusesService/StatusesService.ts        | 29 ++++++++++++++-----
 src/utils.ts                                  | 14 ++++-----
 5 files changed, 43 insertions(+), 23 deletions(-)

diff --git a/__tests__/ObfuscationService.test.js b/__tests__/ObfuscationService.test.js
index 1f6374c..115402f 100644
--- a/__tests__/ObfuscationService.test.js
+++ b/__tests__/ObfuscationService.test.js
@@ -8,6 +8,7 @@ const encodeObject = (object) => {
 
 const decodeObject = (arrayBuffer) => {
   const decoder = new TextDecoder();
+  // console.log(decoder.decode(arrayBuffer));
   return JSON.parse(decoder.decode(arrayBuffer));
 };
 
diff --git a/__tests__/StatusesService.test.js b/__tests__/StatusesService.test.js
index 785d747..9684f08 100644
--- a/__tests__/StatusesService.test.js
+++ b/__tests__/StatusesService.test.js
@@ -2,8 +2,19 @@ import { describe, test } from "@jest/globals";
 import StatusesService from "../src/services/StatusesService";
 
 describe("StatusesService", () => {
-  test("test", async () => {
+  test("encodes and decodes sender status object", async () => {
     const statusesService = new StatusesService();
-    statusesService.test();
+
+    const textEncoder = new TextEncoder(); // always utf-8
+    const stringBytes = textEncoder.encode("test bytes");
+
+    const statusObjectBytes = statusesService.encodeSenderStatusObject(
+      1,
+      stringBytes,
+      stringBytes,
+      {
+        attachment_1: stringBytes,
+      }
+    );
   });
 });
diff --git a/jest.config.js b/jest.config.js
index 65f67c9..9914c02 100644
--- a/jest.config.js
+++ b/jest.config.js
@@ -135,7 +135,7 @@ module.exports = {
   // snapshotSerializers: [],
 
   // The test environment that will be used for testing
-  // testEnvironment: "jest-environment-jsdom",
+  testEnvironment: "jest-environment-node",
 
   // Options that will be passed to the testEnvironment
   // testEnvironmentOptions: {},
@@ -150,10 +150,7 @@ module.exports = {
   // ],
 
   // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped
-  testPathIgnorePatterns: [
-    "/node_modules/",
-    "setupFiles.js"
-  ],
+  testPathIgnorePatterns: ["/node_modules/", "setupFiles.js"],
 
   // The regexp pattern or array of patterns that Jest uses to detect test files
   // testRegex: [],
diff --git a/src/services/StatusesService/StatusesService.ts b/src/services/StatusesService/StatusesService.ts
index 7d67db9..4c07e49 100644
--- a/src/services/StatusesService/StatusesService.ts
+++ b/src/services/StatusesService/StatusesService.ts
@@ -1,4 +1,4 @@
-// const statuses = require("./objects/statuses_pb");
+const statuses = require("./objects/statuses_pb");
 // const { arrayBufferToBase64 } = require("../../../dist/utils");
 
 // var message = new messages.MyMessage();
@@ -41,12 +41,27 @@ class StatusesService {
    * @param messageSignature
    * @param attachmentsSignature
    */
-  // createSenderStatusObject(
-  //   signatureTime: number,
-  //   signatureTimeSignature: string,
-  //   messageSignature: string,
-  //   attachmentsSignature: { [key: string]: string }
-  // ): string {}
+  encodeSenderStatusObject(
+    signatureTime: number,
+    signatureTimeSignature: Uint8Array,
+    messageSignature: Uint8Array,
+    attachmentsSignature: { [key: string]: Uint8Array }
+  ): Uint8Array {
+    const senderStatusObject = new statuses.SenderStatusObject();
+    senderStatusObject.setSignaturetime(signatureTime);
+    senderStatusObject.setSignaturetimesignature(signatureTimeSignature);
+    senderStatusObject.setMessagesignature(messageSignature);
+
+    Object.keys(attachmentsSignature).forEach((key) => {
+      senderStatusObject
+        .getAttachmentssignatureMap()
+        .set(key, attachmentsSignature[key]);
+    });
+
+    console.log(senderStatusObject.toObject());
+
+    return senderStatusObject.serializeBinary();
+  }
 }
 
 export default StatusesService;
diff --git a/src/utils.ts b/src/utils.ts
index 2526cf7..37af78b 100644
--- a/src/utils.ts
+++ b/src/utils.ts
@@ -1,19 +1,15 @@
 export const arrayBufferToBase64 = (buffer: ArrayBuffer): string => {
-  let binary = "";
-  const bytes = new Uint8Array(buffer);
-  const len = bytes.byteLength;
-  for (let i = 0; i < len; i++) {
-    binary += String.fromCharCode(bytes[i]);
-  }
-  return window.btoa(binary);
+  return Buffer.from(buffer).toString("base64");
 };
 
 export const base64ToArrayBuffer = (base64: string): ArrayBuffer => {
-  const binaryString = window.atob(base64);
+  const binaryString = new Buffer(base64, "base64").toString();
   const len = binaryString.length;
   const bytes = new Uint8Array(len);
+
   for (let i = 0; i < len; i++) {
     bytes[i] = binaryString.charCodeAt(i);
   }
-  return bytes.buffer;
+
+  return bytes;
 };
-- 
GitLab