'use strict'
import ChatBase from "./ChatBase.js"
import nacl from '../../deps/nacl-fast.js'
import ed2curve from '../../deps/ed2curve.js'
import { Sha256 } from 'asmcrypto.js'
import { CHAT _REFERENCE _FEATURE _TRIGGER _TIMESTAMP } from '../../constants.js'
export default class ChatTransaction extends ChatBase {
constructor ( ) {
super ( )
this . type = 18
this . fee = 0
}
set recipientPublicKey ( recipientPublicKey ) {
this . _base58RecipientPublicKey = recipientPublicKey instanceof Uint8Array ? this . constructor . Base58 . encode ( recipientPublicKey ) : recipientPublicKey
this . _recipientPublicKey = this . constructor . Base58 . decode ( this . _base58RecipientPublicKey )
}
set proofOfWorkNonce ( proofOfWorkNonce ) {
this . _proofOfWorkNonce = this . constructor . utils . int32ToBytes ( proofOfWorkNonce )
}
set recipient ( recipient ) {
this . _recipient = recipient instanceof Uint8Array ? recipient : this . constructor . Base58 . decode ( recipient )
this . _hasReceipient = new Uint8Array ( 1 )
this . _hasReceipient [ 0 ] = 1
}
set hasChatReference ( hasChatReference ) {
this . _hasChatReference = new Uint8Array ( 1 )
this . _hasChatReference [ 0 ] = hasChatReference
}
set chatReference ( chatReference ) {
this . _chatReference = chatReference instanceof Uint8Array ? chatReference : this . constructor . Base58 . decode ( chatReference )
}
set message ( message ) {
this . messageText = message ;
this . _message = this . constructor . utils . stringtoUTF8Array ( message )
this . _messageLength = this . constructor . utils . int32ToBytes ( this . _message . length )
}
set isEncrypted ( isEncrypted ) {
this . _isEncrypted = new Uint8Array ( 1 )
this . _isEncrypted [ 0 ] = isEncrypted
if ( isEncrypted === 1 ) {
const convertedPrivateKey = ed2curve . convertSecretKey ( this . _keyPair . privateKey )
const convertedPublicKey = ed2curve . convertPublicKey ( this . _recipientPublicKey )
const sharedSecret = new Uint8Array ( 32 )
nacl . lowlevel . crypto _scalarmult ( sharedSecret , convertedPrivateKey , convertedPublicKey )
this . _chatEncryptionSeed = new Sha256 ( ) . process ( sharedSecret ) . finish ( ) . result
this . _encryptedMessage = nacl . secretbox ( this . _message , this . _lastReference . slice ( 0 , 24 ) , this . _chatEncryptionSeed )
}
this . _myMessage = isEncrypted === 1 ? this . _encryptedMessage : this . _message
this . _myMessageLenth = isEncrypted === 1 ? this . constructor . utils . int32ToBytes ( this . _myMessage . length ) : this . _messageLength
}
set isText ( isText ) {
this . _isText = new Uint8Array ( 1 )
this . _isText [ 0 ] = isText
}
get params ( ) {
const params = super . params ;
params . push (
this . _proofOfWorkNonce ,
this . _hasReceipient ,
this . _recipient ,
this . _myMessageLenth ,
this . _myMessage ,
this . _isEncrypted ,
this . _isText ,
this . _feeBytes
)
// After the feature trigger timestamp we need to include chat reference
if ( new Date ( this . _timestamp ) . getTime ( ) >= CHAT _REFERENCE _FEATURE _TRIGGER _TIMESTAMP ) {
params . push ( this . _hasChatReference )
if ( this . _hasChatReference [ 0 ] == 1 ) {
params . push ( this . _chatReference )
}
}
return params
}
}