mirror of
https://github.com/logos-messaging/logos-messaging-js.git
synced 2026-02-07 17:53:09 +00:00
Concepts are being mixed up between the global network config (static vs auto sharding), that needs to be the same of all nodes in the network, individual node configuration (eg relay node subscribing to a given shard), and the routing characteristic of a specific message (eg pubsub topic, shard). This stops proper configuration of nwaku post 0.36.0 because we know need to be deliberate on whether nwaku nodes are running with auto or static sharding. It also included various back and forth conversions between shards, pubsub topics, etc. With this change, we tidy up the network configuration, and make it explicit whether it is static or auto sharded. We also introduce the concept of routing info, which is specific to a message, and tied to the overall network configuration. Routing info abstract pubsub topic, shard, and autosharding needs. Which should lead to easier tidy up of the pubsub concept at a later stage. # Conflicts: # packages/core/src/lib/connection_manager/connection_manager.ts # packages/core/src/lib/metadata/metadata.ts # packages/interfaces/src/metadata.ts # packages/interfaces/src/sharding.ts # packages/relay/src/create.ts # packages/sdk/src/filter/filter.ts # packages/sdk/src/filter/types.ts # packages/sdk/src/light_push/light_push.spec.ts # packages/tests/tests/sharding/auto_sharding.spec.ts # packages/tests/tests/sharding/static_sharding.spec.ts # Conflicts: # packages/sdk/src/store/store.ts
135 lines
3.5 KiB
TypeScript
135 lines
3.5 KiB
TypeScript
import type {
|
|
IDecodedMessage,
|
|
IDecoder,
|
|
IEncoder,
|
|
IMessage,
|
|
IProtoMessage,
|
|
IRateLimitProof,
|
|
IRoutingInfo
|
|
} from "@waku/interfaces";
|
|
import { Logger } from "@waku/utils";
|
|
|
|
import type { IdentityCredential } from "./identity.js";
|
|
import { RlnMessage, toRLNSignal } from "./message.js";
|
|
import { RLNInstance } from "./rln.js";
|
|
|
|
const log = new Logger("waku:rln:encoder");
|
|
|
|
export class RLNEncoder implements IEncoder {
|
|
private readonly idSecretHash: Uint8Array;
|
|
|
|
public constructor(
|
|
private readonly encoder: IEncoder,
|
|
private readonly rlnInstance: RLNInstance,
|
|
private readonly index: number,
|
|
identityCredential: IdentityCredential
|
|
) {
|
|
if (index < 0) throw new Error("Invalid membership index");
|
|
this.idSecretHash = identityCredential.IDSecretHash;
|
|
}
|
|
|
|
public async toWire(message: IMessage): Promise<Uint8Array | undefined> {
|
|
message.rateLimitProof = await this.generateProof(message);
|
|
log.info("Proof generated", message.rateLimitProof);
|
|
return this.encoder.toWire(message);
|
|
}
|
|
|
|
public async toProtoObj(
|
|
message: IMessage
|
|
): Promise<IProtoMessage | undefined> {
|
|
const protoMessage = await this.encoder.toProtoObj(message);
|
|
if (!protoMessage) return;
|
|
|
|
protoMessage.contentTopic = this.contentTopic;
|
|
protoMessage.rateLimitProof = await this.generateProof(message);
|
|
log.info("Proof generated", protoMessage.rateLimitProof);
|
|
return protoMessage;
|
|
}
|
|
|
|
private async generateProof(message: IMessage): Promise<IRateLimitProof> {
|
|
const signal = toRLNSignal(this.contentTopic, message);
|
|
return this.rlnInstance.zerokit.generateRLNProof(
|
|
signal,
|
|
this.index,
|
|
message.timestamp,
|
|
this.idSecretHash
|
|
);
|
|
}
|
|
|
|
public get routingInfo(): IRoutingInfo {
|
|
return this.encoder.routingInfo;
|
|
}
|
|
|
|
public get contentTopic(): string {
|
|
return this.encoder.contentTopic;
|
|
}
|
|
|
|
public get ephemeral(): boolean {
|
|
return this.encoder.ephemeral;
|
|
}
|
|
}
|
|
|
|
type RLNEncoderOptions = {
|
|
encoder: IEncoder;
|
|
rlnInstance: RLNInstance;
|
|
index: number;
|
|
credential: IdentityCredential;
|
|
};
|
|
|
|
export const createRLNEncoder = (options: RLNEncoderOptions): RLNEncoder => {
|
|
return new RLNEncoder(
|
|
options.encoder,
|
|
options.rlnInstance,
|
|
options.index,
|
|
options.credential
|
|
);
|
|
};
|
|
|
|
export class RLNDecoder<T extends IDecodedMessage>
|
|
implements IDecoder<RlnMessage<T>>
|
|
{
|
|
public constructor(
|
|
private readonly rlnInstance: RLNInstance,
|
|
private readonly decoder: IDecoder<T>
|
|
) {}
|
|
|
|
public get routingInfo(): IRoutingInfo {
|
|
return this.decoder.routingInfo;
|
|
}
|
|
|
|
public get contentTopic(): string {
|
|
return this.decoder.contentTopic;
|
|
}
|
|
|
|
public fromWireToProtoObj(
|
|
bytes: Uint8Array
|
|
): Promise<IProtoMessage | undefined> {
|
|
const protoMessage = this.decoder.fromWireToProtoObj(bytes);
|
|
log.info("Message decoded", protoMessage);
|
|
return Promise.resolve(protoMessage);
|
|
}
|
|
|
|
public async fromProtoObj(
|
|
pubsubTopic: string,
|
|
proto: IProtoMessage
|
|
): Promise<RlnMessage<T> | undefined> {
|
|
const msg: T | undefined = await this.decoder.fromProtoObj(
|
|
pubsubTopic,
|
|
proto
|
|
);
|
|
if (!msg) return;
|
|
return new RlnMessage(this.rlnInstance, msg, proto.rateLimitProof);
|
|
}
|
|
}
|
|
|
|
type RLNDecoderOptions<T extends IDecodedMessage> = {
|
|
decoder: IDecoder<T>;
|
|
rlnInstance: RLNInstance;
|
|
};
|
|
|
|
export const createRLNDecoder = <T extends IDecodedMessage>(
|
|
options: RLNDecoderOptions<T>
|
|
): RLNDecoder<T> => {
|
|
return new RLNDecoder(options.rlnInstance, options.decoder);
|
|
};
|