js-rln/src/message.ts

44 lines
1.2 KiB
TypeScript
Raw Normal View History

2022-10-01 08:02:13 -04:00
import { utils } from "js-waku";
2022-09-28 14:23:10 +10:00
import { Message, RateLimitProof } from "js-waku/lib/interfaces";
import { epochBytesToInt } from "./epoch.js";
import { RLNInstance } from "./rln.js";
2022-10-01 08:02:13 -04:00
export function toRLNSignal(msg: Partial<Message>): Uint8Array {
const contentTopicBytes = utils.utf8ToBytes(msg.contentTopic ?? "");
return new Uint8Array([...(msg.payload ?? []), ...contentTopicBytes]);
}
2022-09-28 14:23:10 +10:00
export class RlnMessage<T extends Message> implements Message {
constructor(
public rlnInstance: RLNInstance,
public msg: T,
public rateLimitProof: RateLimitProof | undefined
2022-09-28 14:23:10 +10:00
) {}
public verify(): boolean | undefined {
return this.rateLimitProof
? this.rlnInstance.verifyWithRoots(this.rateLimitProof, toRLNSignal(this)) // this.rlnInstance.verifyRLNProof once issue status-im/nwaku#1248 is fixed
2022-09-28 14:23:10 +10:00
: undefined;
}
get payload(): Uint8Array | undefined {
return this.msg.payload;
}
get contentTopic(): string | undefined {
return this.msg.contentTopic;
}
get timestamp(): Date | undefined {
return this.msg.timestamp;
}
get epoch(): number | undefined {
const bytes = this.msg.rateLimitProof?.epoch;
if (!bytes) return;
return epochBytesToInt(bytes);
}
}