Skip to content

Commit

Permalink
refactor: event typings
Browse files Browse the repository at this point in the history
  • Loading branch information
ggazzo committed Dec 6, 2024
1 parent fc1bac2 commit 0800189
Show file tree
Hide file tree
Showing 13 changed files with 215 additions and 58 deletions.
16 changes: 8 additions & 8 deletions packages/main/src/events/eventBase.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@ import { createEventBase } from "./eventBase";

test("eventBase - invalid sender (without ':' )", async () => {
expect(() =>
createEventBase({
createEventBase("m.room.member", {
roomId: "",
sender: "invalid",
depth: 1,
type: "m.room.member",
state_key: "sender",
content: { membership: "join" },
origin_server_ts: 12,
unsigned: { age_ts: 12 },
}),
Expand All @@ -18,11 +18,11 @@ test("eventBase - invalid sender (without ':' )", async () => {

test("eventBase - invalid sender (without '@' )", async () => {
expect(() =>
createEventBase({
createEventBase("m.room.member", {
roomId: "",
sender: "invalid:invalid",
depth: 1,
type: "m.room.member",
content: { membership: "join" },
state_key: "sender",
origin_server_ts: 12,
unsigned: { age_ts: 12 },
Expand All @@ -32,11 +32,11 @@ test("eventBase - invalid sender (without '@' )", async () => {

test("eventBase - invalid roomId (without '!' )", async () => {
expect(() =>
createEventBase({
createEventBase("m.room.member", {
roomId: "invalid",
sender: "@valid:valid",
depth: 1,
type: "m.room.member",
content: { membership: "join" },
state_key: "sender",
origin_server_ts: 12,
unsigned: { age_ts: 12 },
Expand All @@ -46,11 +46,11 @@ test("eventBase - invalid roomId (without '!' )", async () => {

test("eventBase - invalid roomId (without '!' )", async () => {
expect(() =>
createEventBase({
createEventBase("m.room.member", {
roomId: "invalid:invalid",
sender: "@valid:valid",
content: { membership: "join" },
depth: 1,
type: "m.room.member",
state_key: "sender",
origin_server_ts: 12,
unsigned: { age_ts: 12 },
Expand Down
60 changes: 47 additions & 13 deletions packages/main/src/events/eventBase.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
export type EventBase<
C extends Record<string, unknown> = Record<string, unknown>,
U extends Record<string, unknown> = Record<string, unknown>,
> = {
export type EventBase = {
auth_events: string[];
prev_events: string[];
type:
Expand All @@ -15,15 +12,47 @@ export type EventBase<
| string;
room_id: string;
sender: string;
content: C;
depth: number;
state_key?: string;
origin: string;
origin_server_ts: number;
unsigned: U;

content?: object;
unsigned?: Record<string, any> | undefined;
};

export interface Events {}

type KeyEvent = keyof Events;

export const createEventBase = <T extends KeyEvent>(
type: T,
props: {
roomId: string;
sender: string;
auth_events?: string[];
prev_events?: string[];
depth: number;
content: Events[T]["content"];
state_key?: string;
origin_server_ts: number;
unsigned?: Events[T]["unsigned"];
origin?: string;
ts?: number;
},
): Events[T] extends EventBase ? Events[T] : never => {
return _createEventBase<
Events[T] extends EventBase ? Events[T] : never,
Events[T]["content"],
Events[T]["unsigned"]
>({
type,
...props,
});
};

export const createEventBase = <
const _createEventBase = <
E extends EventBase,
TContent extends EventBase["content"],
TUnsigned extends EventBase["unsigned"],
>({
Expand Down Expand Up @@ -52,26 +81,31 @@ export const createEventBase = <
unsigned?: TUnsigned;
origin?: string;
ts?: number;
}): EventBase => {
}): E & {
unsigned: E["unsigned"] extends void
? { age_ts: number }
: E["unsigned"] & { age_ts: number };
} => {
if (!sender.includes(":") || !sender.includes("@")) {
throw new Error("Invalid sender");
}
if (!roomId.includes(":") || !roomId.includes("!")) {
throw new Error("Invalid room Id");
}

const { age_ts = ts, ..._unsigned } = unsigned || {};
return {
auth_events,
prev_events,
type,
room_id: roomId,
sender,
content: {
...content,
},
depth,
state_key,
origin: origin || (sender.split(":").pop() as string),
origin_server_ts,
unsigned: { age_ts: ts, ...unsigned },
};

...(content && { content }),
unsigned: { age_ts: ts, ..._unsigned },
} as any;
};
31 changes: 20 additions & 11 deletions packages/main/src/events/m.room.create.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,22 @@
import { generateId } from "../authentication";
import type { SigningKey } from "../keys";
import { signEvent } from "../signEvent";
import { createEventBase, type EventBase } from "./eventBase";

type RoomCreateEvent = {
interface RoomCreateEvent extends EventBase {
content: {
room_version: string;
creator: string;
};
unsigned: {
age_ts: number;
};
}

declare module "./eventBase" {
interface Events {
"m.room.create": RoomCreateEvent;
}
}

type RoomCreateEventProps = {
roomId: string;
sender: string;
ts?: number;
Expand All @@ -13,15 +26,12 @@ export const roomCreateEvent = ({
roomId,
sender,
ts = Date.now(),
}: RoomCreateEvent) => {
return createEventBase<
{ room_version: string; creator: string },
{ age_ts: number }
>({
}: RoomCreateEventProps): RoomCreateEvent =>
createEventBase("m.room.create", {
roomId,
sender,
depth: 1,
type: "m.room.create",
ts,
content: {
room_version: "10",
creator: sender,
Expand All @@ -30,4 +40,3 @@ export const roomCreateEvent = ({
origin_server_ts: ts,
unsigned: { age_ts: ts },
});
};
4 changes: 2 additions & 2 deletions packages/main/src/events/m.room.guest_access.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ const finalEvent = {
},
},
unsigned: { age_ts: 1733107418721 },
};
} as const;

test("roomGuestAccessEvent", async () => {
const signature = await generateKeyPairsFromString(
Expand All @@ -50,7 +50,7 @@ test("roomGuestAccessEvent", async () => {
});

const signed = await signEvent(event, signature, "hs1");

// @ts-ignore
expect(signed).toStrictEqual(finalEvent);
expect(signed).toHaveProperty(
"signatures.hs1.ed25519:a_HDhg",
Expand Down
19 changes: 16 additions & 3 deletions packages/main/src/events/m.room.guest_access.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,17 @@
import { createEventBase } from "./eventBase";
import { createEventBase, type EventBase } from "./eventBase";

declare module "./eventBase" {
interface Events {
"m.room.guest_access": RoomGuestAccessEvent;
}
}

interface RoomGuestAccessEvent extends EventBase {
content: {
guest_access: "can_join" | "forbidden";
};
unsigned?: object;
}

export const roomGuestAccessEvent = ({
roomId,
Expand All @@ -15,16 +28,16 @@ export const roomGuestAccessEvent = ({
depth: number;
ts?: number;
}) => {
return createEventBase({
return createEventBase("m.room.guest_access", {
roomId,
sender,
auth_events,
prev_events,
depth,
type: "m.room.guest_access",
content: { guest_access: "can_join" },
state_key: "",
origin_server_ts: ts,
ts,
unsigned: { age_ts: ts },
});
};
4 changes: 3 additions & 1 deletion packages/main/src/events/m.room.history_visibility.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,9 @@ test("roomHistoryVisibilityEvent", async () => {
});

const signed = await signEvent(event, signature, "hs1");

event.content.history_visibility;
signed.content.history_visibility;
// @ts-ignore
expect(signed).toStrictEqual(finalEvent);
expect(signed).toHaveProperty(
"signatures.hs1.ed25519:a_HDhg",
Expand Down
21 changes: 18 additions & 3 deletions packages/main/src/events/m.room.history_visibility.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,19 @@
import { createEventBase } from "./eventBase";
import { createEventBase, type EventBase } from "./eventBase";

declare module "./eventBase" {
interface Events {
"m.room.history_visibility": RoomHistoryVisibilityEvent;
}
}

interface RoomHistoryVisibilityEvent extends EventBase {
content: {
history_visibility: "shared" | "invited" | "joined";
};
unsigned: {
age_ts: number;
};
}

export const roomHistoryVisibilityEvent = ({
roomId,
Expand All @@ -15,16 +30,16 @@ export const roomHistoryVisibilityEvent = ({
depth: number;
ts?: number;
}) => {
return createEventBase({
return createEventBase("m.room.history_visibility", {
roomId,
sender,
auth_events,
prev_events,
depth,
type: "m.room.history_visibility",
content: { history_visibility: "shared" },
state_key: "",
origin_server_ts: ts,
ts,
unsigned: { age_ts: ts },
});
};
2 changes: 1 addition & 1 deletion packages/main/src/events/m.room.join_rules.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ test("roomJoinRulesEvent", async () => {
});

const signed = await signEvent(event, signature, "hs1");

// @ts-ignore
expect(signed).toStrictEqual(finalEvent);
expect(signed).toHaveProperty(
"signatures.hs1.ed25519:a_HDhg",
Expand Down
21 changes: 18 additions & 3 deletions packages/main/src/events/m.room.join_rules.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,19 @@
import { createEventBase } from "./eventBase";
import { createEventBase, type EventBase } from "./eventBase";

declare module "./eventBase" {
interface Events {
"m.room.join_rules": RoomJoinRulesEvent;
}
}

interface RoomJoinRulesEvent extends EventBase {
content: {
join_rule: "invite" | "knock" | "public";
};
unsigned?: {
age_ts: number;
};
}

export const roomJoinRulesEvent = ({
roomId,
Expand All @@ -15,15 +30,15 @@ export const roomJoinRulesEvent = ({
depth: number;
ts?: number;
}) => {
return createEventBase({
return createEventBase("m.room.join_rules", {
roomId,
sender,
auth_events,
prev_events,
depth,
type: "m.room.join_rules",
content: { join_rule: "invite" },
state_key: "",
ts,
origin_server_ts: ts,
unsigned: { age_ts: ts },
});
Expand Down
5 changes: 3 additions & 2 deletions packages/main/src/events/m.room.member-invite.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ test("roomMemberInviteEvent", async () => {
membership: "invite",
},
unsigned: {
age_ts: 1733107418773,
invite_room_state: [
{
type: "m.room.join_rules",
Expand All @@ -106,9 +107,9 @@ test("roomMemberInviteEvent", async () => {
},
],
},
});
} as const);
const signed = await signEvent(memberEvent, signature, "hs1");

// @ts-ignore
expect(signed).toStrictEqual(finalEvent);
expect(signed).toHaveProperty(
"signatures.hs1.ed25519:a_HDhg",
Expand Down
1 change: 1 addition & 0 deletions packages/main/src/events/m.room.member.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ test("roomMemberEvent", async () => {
});
const signed = await signEvent(memberEvent, signature, "hs1");

// @ts-ignore
expect(signed).toStrictEqual(finalEvent);
expect(signed).toHaveProperty(
"signatures.hs1.ed25519:a_HDhg",
Expand Down
Loading

0 comments on commit 0800189

Please sign in to comment.