OpChan/src/lib/waku/codec.ts
2025-08-29 14:41:51 +05:30

82 lines
2.7 KiB
TypeScript

import { createDecoder, createEncoder } from '@waku/sdk';
import { MessageType } from './types';
import { CellMessage, PostMessage, CommentMessage, VoteMessage } from './types';
import { CONTENT_TOPICS, NETWORK_CONFIG } from './constants';
import { OpchanMessage } from '@/types/forum';
export const encoders = {
[MessageType.CELL]: createEncoder({
contentTopic: CONTENT_TOPICS['cell'],
pubsubTopicShardInfo: {clusterId: NETWORK_CONFIG.clusterId, shard: 0}
}),
[MessageType.POST]: createEncoder({
contentTopic: CONTENT_TOPICS['post'],
pubsubTopicShardInfo: {clusterId: NETWORK_CONFIG.clusterId, shard: 0}
}),
[MessageType.COMMENT]: createEncoder({
contentTopic: CONTENT_TOPICS['comment'],
pubsubTopicShardInfo: {clusterId: NETWORK_CONFIG.clusterId, shard: 0}
}),
[MessageType.VOTE]: createEncoder({
contentTopic: CONTENT_TOPICS['vote'],
pubsubTopicShardInfo: {clusterId: NETWORK_CONFIG.clusterId, shard: 0}
}),
[MessageType.MODERATE]: createEncoder({
contentTopic: CONTENT_TOPICS['moderate'],
pubsubTopicShardInfo: {clusterId: NETWORK_CONFIG.clusterId, shard: 0}
})
}
export const decoders = {
[MessageType.CELL]: createDecoder(CONTENT_TOPICS['cell'], {
clusterId: NETWORK_CONFIG.clusterId,
shard: 0
}),
[MessageType.POST]: createDecoder(CONTENT_TOPICS['post'], {
clusterId: NETWORK_CONFIG.clusterId,
shard: 0
}),
[MessageType.COMMENT]: createDecoder(CONTENT_TOPICS['comment'], {
clusterId: NETWORK_CONFIG.clusterId,
shard: 0
}),
[MessageType.VOTE]: createDecoder(CONTENT_TOPICS['vote'], {
clusterId: NETWORK_CONFIG.clusterId,
shard: 0
}),
[MessageType.MODERATE]: createDecoder(CONTENT_TOPICS['moderate'], {
clusterId: NETWORK_CONFIG.clusterId,
shard: 0
})
}
/**
* Encode a message object into a Uint8Array for transmission
*/
export function encodeMessage(message: OpchanMessage): Uint8Array {
const messageJson = JSON.stringify(message);
return new TextEncoder().encode(messageJson);
}
/**
* Decode a message from a Uint8Array based on its type
*/
export function decodeMessage(payload: Uint8Array): CellMessage | PostMessage | CommentMessage | VoteMessage {
const messageJson = new TextDecoder().decode(payload);
const message = JSON.parse(messageJson) as OpchanMessage;
switch(message.type) {
case MessageType.CELL:
return message as CellMessage;
case MessageType.POST:
return message as PostMessage;
case MessageType.COMMENT:
return message as CommentMessage;
case MessageType.VOTE:
return message as VoteMessage;
default:
throw new Error(`Unknown message type: ${message}`);
}
}