feat: fail early when trying to send empty payload (#1642)

* refactor: rename as this method does not check empty payloads

* feat: fail early when trying to send empty payload

---------

Co-authored-by: Sasha <oleksandr@status.im>
This commit is contained in:
fryorcraken 2023-10-17 09:14:45 +11:00 committed by GitHub
parent 0e4ceb6ac9
commit 6bad4ea7d1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 29 additions and 25 deletions

View File

@ -11,7 +11,7 @@ import {
SendResult SendResult
} from "@waku/interfaces"; } from "@waku/interfaces";
import { PushResponse } from "@waku/proto"; import { PushResponse } from "@waku/proto";
import { ensurePubsubTopicIsConfigured, isSizeValid } from "@waku/utils"; import { ensurePubsubTopicIsConfigured, isSizeUnderCap } from "@waku/utils";
import debug from "debug"; import debug from "debug";
import all from "it-all"; import all from "it-all";
import * as lp from "it-length-prefixed"; import * as lp from "it-length-prefixed";
@ -56,7 +56,12 @@ class LightPush extends BaseProtocol implements ILightPush {
pubsubTopic: string pubsubTopic: string
): Promise<PreparePushMessageResult> { ): Promise<PreparePushMessageResult> {
try { try {
if (!isSizeValid(message.payload)) { if (!message.payload || message.payload.length === 0) {
log("Failed to send waku light push: payload is empty");
return { query: null, error: SendError.EMPTY_PAYLOAD };
}
if (!isSizeUnderCap(message.payload)) {
log("Failed to send waku light push: message is bigger than 1MB"); log("Failed to send waku light push: message is bigger than 1MB");
return { query: null, error: SendError.SIZE_TOO_BIG }; return { query: null, error: SendError.SIZE_TOO_BIG };
} }

View File

@ -67,13 +67,23 @@ export type Callback<T extends IDecodedMessage> = (
export enum SendError { export enum SendError {
/** Could not determine the origin of the fault. Best to check connectivity and try again */ /** Could not determine the origin of the fault. Best to check connectivity and try again */
GENERIC_FAIL = "Generic error", GENERIC_FAIL = "Generic error",
/** Failure to protobuf encode the message. This is not recoverable and needs /**
* further investigation. */ * Failure to protobuf encode the message. This is not recoverable and needs
* further investigation.
*/
ENCODE_FAILED = "Failed to encode", ENCODE_FAILED = "Failed to encode",
/** Failure to protobuf decode the message. May be due to a remote peer issue, /**
* ensuring that messages are sent via several peer enable mitigation of this error.. */ * Failure to protobuf decode the message. May be due to a remote peer issue,
* ensuring that messages are sent via several peer enable mitigation of this error.
*/
DECODE_FAILED = "Failed to decode", DECODE_FAILED = "Failed to decode",
/** The message size is above the maximum message size allowed on the Waku Network. /**
* The message payload is empty, making the message invalid. Ensure that a non-empty
* payload is set on the outgoing message.
*/
EMPTY_PAYLOAD = "Payload is empty",
/**
* The message size is above the maximum message size allowed on the Waku Network.
* Compressing the message or using an alternative strategy for large messages is recommended. * Compressing the message or using an alternative strategy for large messages is recommended.
*/ */
SIZE_TOO_BIG = "Size is too big", SIZE_TOO_BIG = "Size is too big",

View File

@ -25,7 +25,7 @@ import {
SendError, SendError,
SendResult SendResult
} from "@waku/interfaces"; } from "@waku/interfaces";
import { isSizeValid, toAsyncIterator } from "@waku/utils"; import { isSizeUnderCap, toAsyncIterator } from "@waku/utils";
import { pushOrInitMapSet } from "@waku/utils"; import { pushOrInitMapSet } from "@waku/utils";
import debug from "debug"; import debug from "debug";
@ -112,7 +112,7 @@ class Relay implements IRelay {
}; };
} }
if (!isSizeValid(message.payload)) { if (!isSizeUnderCap(message.payload)) {
log("Failed to send waku relay: message is bigger that 1MB"); log("Failed to send waku relay: message is bigger that 1MB");
return { return {
recipients, recipients,

View File

@ -74,24 +74,13 @@ describe("Waku Light Push", function () {
} }
}); });
it("Fails to push message with empty payload", async function () { it("Throws when trying to push message with empty payload", async function () {
const pushResponse = await waku.lightPush.send(TestEncoder, { const pushResponse = await waku.lightPush.send(TestEncoder, {
payload: utf8ToBytes("") payload: new Uint8Array()
}); });
if (nwaku.type() == "go-waku") { expect(pushResponse.errors).to.include(SendError.EMPTY_PAYLOAD);
expect(pushResponse.recipients.length).to.eq(1); expect(await messageCollector.waitForMessages(1)).to.eq(false);
expect(await messageCollector.waitForMessages(1)).to.eq(true);
messageCollector.verifyReceivedMessage(0, {
expectedMessageText: undefined,
expectedContentTopic: TestContentTopic
});
} else {
expect(pushResponse.recipients.length).to.eq(0);
// This should be `REMOTE_PEER_REJECTED`, tracked with https://github.com/waku-org/nwaku/issues/1641
expect(pushResponse.errors).to.include(SendError.REMOTE_PEER_FAULT);
expect(await messageCollector.waitForMessages(1)).to.eq(false);
}
}); });
TEST_STRING.forEach((testItem) => { TEST_STRING.forEach((testItem) => {

View File

@ -1,7 +1,7 @@
const MB = 1024 ** 2; const MB = 1024 ** 2;
const SIZE_CAP = 1; // 1 MB const SIZE_CAP = 1; // 1 MB
export const isSizeValid = (payload: Uint8Array): boolean => { export const isSizeUnderCap = (payload: Uint8Array): boolean => {
if (payload.length / MB > SIZE_CAP) { if (payload.length / MB > SIZE_CAP) {
return false; return false;
} }