decentralised sync engine

refactor: validation

serenity 4bedde9c 848b4af9

Changed files
+46 -12
src
+1 -1
src/lib/utils/registration.ts
···
import { prismCommitSchema } from "@/lib/types/prism";
import type { RouteHandler, WsRouteHandler } from "@/lib/types/routes";
import { newErrorResponse } from "@/lib/utils/http/responses";
-
import { rawDataToString } from "@/lib/utils/ws";
+
import { rawDataToString } from "@/lib/utils/ws/validate";
import type { RawData } from "ws";
import type WebSocket from "ws";
-11
src/lib/utils/ws/index.ts
···
-
import type { RawData } from "ws";
-
-
export const rawDataToString = (data: RawData): string => {
-
if (Buffer.isBuffer(data)) {
-
return data.toString("utf-8");
-
}
-
if (Array.isArray(data)) {
-
return Buffer.concat(data).toString("utf-8");
-
}
-
return new TextDecoder().decode(data);
-
};
+45
src/lib/utils/ws/validate.ts
···
+
import type { WebsocketMessage } from "@/lib/types/messages";
+
import { websocketMessageSchema } from "@/lib/types/messages";
+
import type { Result } from "@/lib/utils/result";
+
import { z } from "zod";
+
import type { RawData } from "ws";
+
+
export const rawDataToString = (data: RawData): string => {
+
if (Buffer.isBuffer(data)) {
+
return data.toString("utf-8");
+
}
+
if (Array.isArray(data)) {
+
return Buffer.concat(data).toString("utf-8");
+
}
+
return new TextDecoder().decode(data);
+
};
+
+
export const validateWsMessageString = (
+
data: unknown,
+
): Result<string, unknown> => {
+
const { success, error, data: message } = z.string().safeParse(data);
+
if (!success) {
+
console.error("Error decoding websocket message");
+
console.error(error);
+
return { ok: false, error: z.treeifyError(error) };
+
}
+
return { ok: true, data: message };
+
};
+
+
export const validateWsMessageType = (
+
data: unknown,
+
): Result<WebsocketMessage, unknown> => {
+
const {
+
success: wsMessageSuccess,
+
error: wsMessageError,
+
data: wsMessage,
+
} = websocketMessageSchema.safeParse(data);
+
if (!wsMessageSuccess) {
+
console.error(
+
"Error parsing websocket message. The data might be the wrong shape.",
+
);
+
console.error(wsMessageError);
+
return { ok: false, error: z.treeifyError(wsMessageError) };
+
}
+
return { ok: true, data: wsMessage };
+
};