mirror of https://github.com/waku-org/js-waku.git
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:
parent
0e4ceb6ac9
commit
6bad4ea7d1
|
@ -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 };
|
||||||
}
|
}
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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) => {
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue