tera/src/system/messager.ts

126 lines
4.1 KiB
TypeScript

/*
* @project: TERA
* @version: Development (beta)
* @license: MIT (not for evil)
* @copyright: Yuriy Ivanov (Vtools) 2017-2019 [progr76@gmail.com]
* Web: https://terafoundation.org
* Twitter: https://twitter.com/terafoundation
* Telegram: https://t.me/terafoundation
*/
"use strict";
require('../core/crypto-library');
const OPEN_TYPE_TRANSACTION = 11;
const MESSAGE_TYPE_TRANSACTION = 12;
const MAX_MSG_SIZE = 1024;
var TempArrayTr = new Uint8Array(MAX_MSG_SIZE);
const MESSAGE_START = 9;
const MESSAGE_END = MAX_MSG_SIZE - 5;
import './names'
import DApp from './dapp'
export default class MessagerApp extends DApp {
Server
Channels
NamesMap
constructor() {
super()
this.Channels = {}
this.NamesMap = global.NAMES.KeyValueMap
global.MESSAGER = this
}
Decrypt(Body) {
for (var key in this.Channels) {
var Node = this.Channels[key];
global.Decrypt(Body, TempArrayTr, Node.Secret)
if (global.IsZeroArr(TempArrayTr.slice(MESSAGE_END))) {
var Str = global.Utf8ArrayToStr(TempArrayTr.slice(MESSAGE_START));
return Str;
}
}
return undefined;
}
Encrypt(StrMessage, StrTo) {
var NameArr;
if (typeof StrTo === "string") {
NameArr = global.GetArrFromStr(StrTo, 32)
} else {
NameArr = StrTo
}
var arrMessage = global.GetArrFromStr(StrMessage, MESSAGE_END);
var ArrayTr = new Uint8Array(MAX_MSG_SIZE);
ArrayTr[0] = MESSAGE_TYPE_TRANSACTION
for (var i = 5; i < MAX_MSG_SIZE; i++) {
ArrayTr[i] = arrMessage[i - MESSAGE_START]
}
var Body = new Uint8Array(MAX_MSG_SIZE);
var Node = this.OpenChannel(NameArr);
global.Encrypt(ArrayTr, Body, Node.Secret)
return Body;
}
OpenChannel(FromNameArr) {
var FromArr;
var StrKeyFrom = global.GetHexFromAddres(FromNameArr);
if (this.NamesMap[StrKeyFrom]) {
FromArr = this.NamesMap[StrKeyFrom]
}
else {
FromArr = FromNameArr
}
var StrKey = global.GetHexFromAddres(FromArr);
var Node = this.Channels[StrKey];
if (!Node) {
Node = { addrArr: FromArr }
global.CheckContextSecret(this.Server, Node)
this.Channels[StrKey] = Node
}
return Node;
}
OnWriteTransaction(Block, Body, BlockNum, TrNum) {
var Type = Body[0];
if (Type === OPEN_TYPE_TRANSACTION) {
var ToArr = Body.slice(33);
if (global.CompareArr(ToArr, global.NAMES.CurrentNameArr) === 0 || global.CompareArr(ToArr, this.Server.addrArr) === 0) {
var FromNameArr = Body.slice(1, 33);
this.OpenChannel(FromNameArr)
}
}
else
if (Type === MESSAGE_TYPE_TRANSACTION) {
var Str = this.Decrypt(Body);
if (Str !== undefined)
global.ToLog("GET MESSAGE:" + Str)
}
}
OnMessage(Msg) {
global.ToLog("GET MESSAGE:" + Msg.body)
return;
var Body = Msg.body;
var Type = Body[0];
if (Type === MESSAGE_TYPE_TRANSACTION) {
var Str = this.Decrypt(Body);
if (Str !== undefined) {
global.ToLog("GET MESSAGE:" + Str)
}
}
}
};
function TestEncryptDecrypt() {
const CMessager = module.exports;
var Server = { KeyPair: global.GetKeyPairTest("Test"), DApp: { Names: { KeyValueMap: {} } }, };
var Test = new CMessager(Server);
var KeyPair2 = global.GetKeyPairTest("Test2");
var StrTest1 = global.GetArrFromStr("Test2", 32);
var StrKey = global.GetHexFromAddres(StrTest1);
global.MESSAGER.NamesMap[StrKey] = KeyPair2.addrArr;
var Body = global.MESSAGER.Encrypt("This is a test message!", "Test2");
var Str2 = global.MESSAGER.Decrypt(Body);
console.log("Decrypt:");
console.log(Str2);
};
var messager = new MessagerApp();
global.DApps.Messager = messager;
global.DAppByType[OPEN_TYPE_TRANSACTION] = messager;
global.DAppByType[MESSAGE_TYPE_TRANSACTION] = messager;