decentralised message store
1import { didSchema } from "@/lib/types/atproto";
2import { z } from "zod";
3
4export const websocketMessageSchema = z
5 .object({
6 type: z.union([
7 z.literal("shard/message"),
8 z.literal("shard/history"),
9 z.literal("shard/requestHistory"),
10 ]),
11 })
12 .loose();
13export type WebsocketMessage = z.infer<typeof websocketMessageSchema>;
14
15export const shardMessageSchema = websocketMessageSchema
16 .safeExtend({
17 type: z.literal("shard/message"),
18 channel: z.string(),
19 content: z.string(),
20 sentBy: didSchema,
21 routedThrough: didSchema,
22 sentAt: z.coerce.date(),
23 })
24 .strict();
25export type ShardMessage = z.infer<typeof shardMessageSchema>;
26
27export const historyMessageSchema = websocketMessageSchema
28 .safeExtend({
29 type: z.literal("shard/history"),
30 messages: z.optional(z.array(shardMessageSchema)),
31 channel: z.string(),
32 forClient: didSchema,
33 })
34 .strict();
35export type HistoryMessage = z.infer<typeof historyMessageSchema>;
36
37export const requestHistoryMessageSchema = websocketMessageSchema
38 .safeExtend({
39 type: z.literal("shard/requestHistory"),
40 channel: z.string(),
41 requestedBy: didSchema,
42 })
43 .strict();
44export type RequestHistoryMessage = z.infer<typeof requestHistoryMessageSchema>;