Add API to retrieve signers on a message
This commit is contained in:
parent
14849fe62f
commit
30e123a418
|
@ -1,4 +1,7 @@
|
||||||
|
import { keccak256 } from "js-sha3";
|
||||||
|
import { utils } from "js-waku";
|
||||||
import { Reader } from "protobufjs";
|
import { Reader } from "protobufjs";
|
||||||
|
import secp256k1 from "secp256k1";
|
||||||
|
|
||||||
import { ChatMessage } from "./chat_message";
|
import { ChatMessage } from "./chat_message";
|
||||||
import { Identity } from "./identity";
|
import { Identity } from "./identity";
|
||||||
|
@ -58,4 +61,14 @@ export class ApplicationMetadataMessage {
|
||||||
|
|
||||||
return ChatMessage.decode(this.payload);
|
return ChatMessage.decode(this.payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public get signer(): Uint8Array | undefined {
|
||||||
|
if (!this.signature || !this.payload) return;
|
||||||
|
|
||||||
|
const signature = this.signature.slice(0, 64);
|
||||||
|
const recid = this.signature.slice(64)[0];
|
||||||
|
const hash = keccak256(this.payload);
|
||||||
|
|
||||||
|
return secp256k1.ecdsaRecover(signature, recid, utils.hexToBuf(hash));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,4 +26,11 @@ export class Identity {
|
||||||
|
|
||||||
return Buffer.concat([signature, Buffer.from([recid])]);
|
return Buffer.concat([signature, Buffer.from([recid])]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the compressed public key.
|
||||||
|
*/
|
||||||
|
public get publicKey(): Uint8Array {
|
||||||
|
return secp256k1.publicKeyCreate(this.privateKey, true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import { expect } from "chai";
|
import { expect } from "chai";
|
||||||
|
import { utils } from "js-waku";
|
||||||
|
|
||||||
import { ApplicationMetadataMessage } from "./application_metadata_message";
|
import { ApplicationMetadataMessage } from "./application_metadata_message";
|
||||||
import { Identity } from "./identity";
|
import { Identity } from "./identity";
|
||||||
|
@ -9,12 +10,14 @@ const testChatId = "test-chat-id";
|
||||||
describe("Messenger", () => {
|
describe("Messenger", () => {
|
||||||
let messengerAlice: Messenger;
|
let messengerAlice: Messenger;
|
||||||
let messengerBob: Messenger;
|
let messengerBob: Messenger;
|
||||||
|
let identityAlice: Identity;
|
||||||
|
let identityBob: Identity;
|
||||||
|
|
||||||
beforeEach(async function () {
|
beforeEach(async function () {
|
||||||
this.timeout(10_000);
|
this.timeout(10_000);
|
||||||
|
|
||||||
const identityAlice = Identity.generate();
|
identityAlice = Identity.generate();
|
||||||
const identityBob = Identity.generate();
|
identityBob = Identity.generate();
|
||||||
|
|
||||||
[messengerAlice, messengerBob] = await Promise.all([
|
[messengerAlice, messengerBob] = await Promise.all([
|
||||||
Messenger.create(identityAlice),
|
Messenger.create(identityAlice),
|
||||||
|
@ -44,7 +47,7 @@ describe("Messenger", () => {
|
||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("Sends & Receive message in public chat", async function () {
|
it("Sends & Receive public chat messages", async function () {
|
||||||
this.timeout(10_000);
|
this.timeout(10_000);
|
||||||
|
|
||||||
await messengerAlice.joinChat(testChatId);
|
await messengerAlice.joinChat(testChatId);
|
||||||
|
@ -66,6 +69,30 @@ describe("Messenger", () => {
|
||||||
expect(receivedMessage.chatMessage?.text).to.eq(text);
|
expect(receivedMessage.chatMessage?.text).to.eq(text);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("public chat messages have signers", async function () {
|
||||||
|
this.timeout(10_000);
|
||||||
|
|
||||||
|
await messengerAlice.joinChat(testChatId);
|
||||||
|
await messengerBob.joinChat(testChatId);
|
||||||
|
|
||||||
|
const text = "This is a message.";
|
||||||
|
|
||||||
|
const receivedMessagePromise: Promise<ApplicationMetadataMessage> =
|
||||||
|
new Promise((resolve) => {
|
||||||
|
messengerBob.addObserver((message) => {
|
||||||
|
resolve(message);
|
||||||
|
}, testChatId);
|
||||||
|
});
|
||||||
|
|
||||||
|
await messengerAlice.sendMessage(text, testChatId);
|
||||||
|
|
||||||
|
const receivedMessage = await receivedMessagePromise;
|
||||||
|
|
||||||
|
expect(utils.bufToHex(receivedMessage.signer!)).to.eq(
|
||||||
|
utils.bufToHex(identityAlice.publicKey)
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
afterEach(async function () {
|
afterEach(async function () {
|
||||||
this.timeout(5000);
|
this.timeout(5000);
|
||||||
await messengerAlice.stop();
|
await messengerAlice.stop();
|
||||||
|
|
Loading…
Reference in New Issue