js-waku/src/lib/waku_message.ts

80 lines
2.0 KiB
TypeScript
Raw Normal View History

2021-03-10 16:22:49 +11:00
// Ensure that this class matches the proto interface while
import { Reader } from 'protobufjs/minimal';
2021-03-10 16:22:49 +11:00
// Protecting the user from protobuf oddities
import { WakuMessageProto } from '../proto/waku/v2/waku';
2021-03-10 16:22:49 +11:00
2021-04-08 22:32:36 +10:00
const DEFAULT_CONTENT_TOPIC = '/waku/2/default-content/proto';
const DEFAULT_VERSION = 0;
2021-03-10 16:22:49 +11:00
export class WakuMessage {
private constructor(
public payload?: Uint8Array,
2021-04-08 22:32:36 +10:00
public contentTopic?: string,
public version?: number
) {}
2021-03-10 16:22:49 +11:00
2021-03-12 14:23:21 +11:00
/**
* Create Message with a utf-8 string as payload
* @param payload
* @returns {WakuMessage}
2021-03-12 14:23:21 +11:00
*/
static fromUtf8String(payload: string): WakuMessage {
const buf = Buffer.from(payload, 'utf-8');
return new WakuMessage(buf, DEFAULT_CONTENT_TOPIC, DEFAULT_VERSION);
}
/**
* Create Message with a byte array as payload
* @param payload
* @returns {WakuMessage}
*/
static fromBytes(payload: Uint8Array): WakuMessage {
return new WakuMessage(payload, DEFAULT_CONTENT_TOPIC, DEFAULT_VERSION);
2021-03-10 16:22:49 +11:00
}
static decode(bytes: Uint8Array): WakuMessage {
const wakuMsg = WakuMessageProto.decode(Reader.create(bytes));
return new WakuMessage(
wakuMsg.payload,
wakuMsg.contentTopic,
wakuMsg.version
);
2021-03-10 16:22:49 +11:00
}
toBinary(): Uint8Array {
return WakuMessageProto.encode({
payload: this.payload,
version: this.version,
contentTopic: this.contentTopic,
}).finish();
2021-03-10 16:22:49 +11:00
}
2021-03-24 16:31:54 +11:00
utf8Payload(): string {
if (!this.payload) {
return '';
}
return Array.from(this.payload)
.map((char) => {
return String.fromCharCode(char);
})
.join('');
}
2021-03-10 16:22:49 +11:00
// Purely for tests purposes.
2021-03-12 14:23:21 +11:00
// We do consider protobuf field when checking equality
// As the content is held by the other fields.
isEqualTo(other: WakuMessage) {
const payloadsAreEqual =
this.payload && other.payload
? Buffer.compare(this.payload, other.payload) === 0
: !(this.payload || other.payload);
2021-03-10 16:22:49 +11:00
return (
payloadsAreEqual &&
2021-03-10 16:22:49 +11:00
this.contentTopic === other.contentTopic &&
this.version === other.version
);
}
}