status-web/packages/status-js/src/utils.ts

62 lines
1.6 KiB
TypeScript
Raw Normal View History

import { ec } from 'elliptic'
import { PageDirection, utils } from 'js-waku'
import { idToContactCodeTopic } from './contentTopic'
import { ChatIdentity } from './proto/communities/v1/chat_identity'
import type { Waku } from 'js-waku'
const EC = new ec('secp256k1')
2022-05-25 12:42:47 +00:00
// TODO: rename
const hexToBuf = utils.hexToBytes
export { hexToBuf }
2022-05-25 12:42:47 +00:00
// TODO: rename
/**
* Return hex string with 0x prefix (commonly used for string format of a community id/public key.
*/
export function bufToHex(buf: Uint8Array): string {
2022-05-25 12:42:47 +00:00
return '0x' + utils.bytesToHex(buf)
}
export function compressPublicKey(key: Uint8Array): string {
const PubKey = EC.keyFromPublic(key)
return '0x' + PubKey.getPublic(true, 'hex')
}
export function genPrivateKeyWithEntropy(key: string): Uint8Array {
const pair = EC.genKeyPair({ entropy: key })
return hexToBuf('0x' + pair.getPrivate('hex'))
}
export async function getLatestUserNickname(
key: Uint8Array,
waku: Waku
): Promise<{ clock: number; nickname: string }> {
const publicKey = bufToHex(key)
let nickname = ''
let clock = 0
await waku.store.queryHistory([idToContactCodeTopic(publicKey)], {
callback: msgs =>
msgs.some(e => {
try {
if (e.payload) {
const chatIdentity = ChatIdentity.decode(e?.payload)
if (chatIdentity) {
if (chatIdentity?.displayName) {
clock = chatIdentity?.clock ?? 0
nickname = chatIdentity?.displayName
}
}
return true
}
} catch {
return false
}
}),
pageDirection: PageDirection.BACKWARD,
})
return { clock, nickname }
}