···33import { prismCommitSchema } from "@/lib/types/prism";
44import type { RouteHandler, WsRouteHandler } from "@/lib/types/routes";
55import { newErrorResponse } from "@/lib/utils/http/responses";
66-import { rawDataToString } from "@/lib/utils/ws";
66+import { rawDataToString } from "@/lib/utils/ws/validate";
77import type { RawData } from "ws";
88import type WebSocket from "ws";
99
-11
src/lib/utils/ws/index.ts
···11-import type { RawData } from "ws";
22-33-export const rawDataToString = (data: RawData): string => {
44- if (Buffer.isBuffer(data)) {
55- return data.toString("utf-8");
66- }
77- if (Array.isArray(data)) {
88- return Buffer.concat(data).toString("utf-8");
99- }
1010- return new TextDecoder().decode(data);
1111-};
+45
src/lib/utils/ws/validate.ts
···11+import type { WebsocketMessage } from "@/lib/types/messages";
22+import { websocketMessageSchema } from "@/lib/types/messages";
33+import type { Result } from "@/lib/utils/result";
44+import { z } from "zod";
55+import type { RawData } from "ws";
66+77+export const rawDataToString = (data: RawData): string => {
88+ if (Buffer.isBuffer(data)) {
99+ return data.toString("utf-8");
1010+ }
1111+ if (Array.isArray(data)) {
1212+ return Buffer.concat(data).toString("utf-8");
1313+ }
1414+ return new TextDecoder().decode(data);
1515+};
1616+1717+export const validateWsMessageString = (
1818+ data: unknown,
1919+): Result<string, unknown> => {
2020+ const { success, error, data: message } = z.string().safeParse(data);
2121+ if (!success) {
2222+ console.error("Error decoding websocket message");
2323+ console.error(error);
2424+ return { ok: false, error: z.treeifyError(error) };
2525+ }
2626+ return { ok: true, data: message };
2727+};
2828+2929+export const validateWsMessageType = (
3030+ data: unknown,
3131+): Result<WebsocketMessage, unknown> => {
3232+ const {
3333+ success: wsMessageSuccess,
3434+ error: wsMessageError,
3535+ data: wsMessage,
3636+ } = websocketMessageSchema.safeParse(data);
3737+ if (!wsMessageSuccess) {
3838+ console.error(
3939+ "Error parsing websocket message. The data might be the wrong shape.",
4040+ );
4141+ console.error(wsMessageError);
4242+ return { ok: false, error: z.treeifyError(wsMessageError) };
4343+ }
4444+ return { ok: true, data: wsMessage };
4545+};