Skip to content

Commit

Permalink
chore: refactor createRoom to allow dependency injection
Browse files Browse the repository at this point in the history
  • Loading branch information
ggazzo committed Dec 6, 2024
1 parent 5ec0268 commit fc1bac2
Show file tree
Hide file tree
Showing 3 changed files with 132 additions and 118 deletions.
17 changes: 11 additions & 6 deletions packages/main/src/events/m.room.create.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,19 @@
import { createEventBase } from "./eventBase";
import { generateId } from "../authentication";
import type { SigningKey } from "../keys";
import { signEvent } from "../signEvent";
import { createEventBase, type EventBase } from "./eventBase";

type RoomCreateEvent = {
roomId: string;
sender: string;
ts?: number;
};

export const roomCreateEvent = ({
roomId,
sender,
ts = Date.now(),
}: {
roomId: string;
sender: string;
ts?: number;
}) => {
}: RoomCreateEvent) => {
return createEventBase<
{ room_version: string; creator: string },
{ age_ts: number }
Expand Down
26 changes: 26 additions & 0 deletions packages/main/src/events/utils/createSignedEvent.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { generateId } from "../../authentication";
import type { SigningKey } from "../../keys";
import { signEvent } from "../../signEvent";

export const createSignedEvent = (signature: SigningKey) => {
return <F extends (...args: any) => any>(fn: F) => {
return async (...args: Parameters<F>): Promise<ReturnType<F>> => {
return signEvent(await fn(...args), signature) as Promise<ReturnType<F>>;
};
};
};

export const createEventWithId = <F extends (...args: any) => any>(fn: F) => {
return <S extends ReturnType<typeof createSignedEvent>>(sign: S) => {
return async (
...args: Parameters<F>
): Promise<{ event: ReturnType<F>; _id: string }> => {
const event = await sign(fn)(...args);
const id = generateId(event);
return {
event,
_id: id,
};
};
};
};
207 changes: 95 additions & 112 deletions packages/main/src/routes/fake/room.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ import { pruneEventDict } from "../../pruneEventDict";
import { signEvent } from "../../signEvent";
import { signJson } from "../../signJson";
import type { EventBase } from "../../events/eventBase";
import {
createEventWithId,
createSignedEvent,
} from "../../events/utils/createSignedEvent";

// TODO: Move this to an appropriate file
function createMediaId(length: number) {
Expand All @@ -29,143 +33,117 @@ function createMediaId(length: number) {
}

// TODO: Move this to an appropriate file
const createRoom = async (sender: string, username: string) => {
// const roomId = `!${generateId({
// ts: Date.now(), // TEMP
// })}:${config.name}`;

const createRoom = async (
sender: string,
username: string,
makeSignedEvent: ReturnType<typeof createSignedEvent>,
): Promise<{
roomId: string;
events: {
event: EventBase;
_id: string;
}[];
}> => {
const roomId = `!${createMediaId(18)}:${config.name}`;
// Create

const events = [];
const createRoomSigned = createEventWithId(roomCreateEvent)(makeSignedEvent);

// Create
const createEvent = await signEvent(
roomCreateEvent({
roomId,
sender,
}),
config.signingKey[0],
);
const createMemberRoomSigned =
createEventWithId(roomMemberEvent)(makeSignedEvent);

const createEventId = generateId(createEvent);
const createPowerLevelsRoomSigned =
createEventWithId(roomPowerLevelsEvent)(makeSignedEvent);

events.push({
_id: createEventId,
event: createEvent,
const createJoinRulesRoomSigned =
createEventWithId(roomJoinRulesEvent)(makeSignedEvent);
const createHistoryVisibilityRoomSigned = createEventWithId(
roomHistoryVisibilityEvent,
)(makeSignedEvent);

const createGuestAccessRoomSigned =
createEventWithId(roomGuestAccessEvent)(makeSignedEvent);

const createEvent = await createRoomSigned({
roomId,
sender,
});

// Member
const memberEvent = await signEvent(
roomMemberEvent({
roomId,
sender,
depth: 2,
membership: "join",
content: {
displayname: sender,
},
state_key: sender,
auth_events: [createEventId],
prev_events: [createEventId],
}),
config.signingKey[0],
);

const memberEventId = generateId(memberEvent);

events.push({
_id: memberEventId,
event: memberEvent,
const memberEvent = await createMemberRoomSigned({
roomId,
sender,
depth: 2,
membership: "join",
content: {
displayname: sender,
},
state_key: sender,
auth_events: [createEvent._id],
prev_events: [createEvent._id],
});

// PowerLevels
const powerLevelsEvent = await signEvent(
roomPowerLevelsEvent({
roomId,
sender,
member: username,
auth_events: [createEventId, memberEventId],
prev_events: [memberEventId],
depth: 3,
}),
config.signingKey[0],
);

const powerLevelsEventId = generateId(powerLevelsEvent);

events.push({
_id: powerLevelsEventId,
event: powerLevelsEvent,
const powerLevelsEvent = await createPowerLevelsRoomSigned({
roomId,
sender,
member: username,
auth_events: [createEvent._id, memberEvent._id],
prev_events: [memberEvent._id],
depth: 3,
});

// Join Rules
const joinRulesEvent = await signEvent(
roomJoinRulesEvent({
roomId,
sender,
auth_events: [createEventId, memberEventId, powerLevelsEventId],
prev_events: [powerLevelsEventId],
depth: 4,
}),
config.signingKey[0],
);

const joinRulesEventId = generateId(joinRulesEvent);

events.push({
_id: joinRulesEventId,
event: joinRulesEvent,
const joinRulesEvent = await createJoinRulesRoomSigned({
roomId,
sender,
auth_events: [createEvent._id, memberEvent._id, powerLevelsEvent._id],
prev_events: [powerLevelsEvent._id],
depth: 4,
});

// History Visibility
const historyVisibilityEvent = await signEvent(
roomHistoryVisibilityEvent({
roomId,
sender,
auth_events: [
createEventId,
memberEventId,
powerLevelsEventId,
// joinRulesEventId,
],
prev_events: [joinRulesEventId],
depth: 5,
}),
config.signingKey[0],
);

const historyVisibilityEventId = generateId(historyVisibilityEvent);

events.push({
_id: historyVisibilityEventId,
event: historyVisibilityEvent,
const historyVisibilityEvent = await createHistoryVisibilityRoomSigned({
roomId,
sender,
auth_events: [
createEvent._id,
memberEvent._id,
powerLevelsEvent._id,
// joinRulesEvent._id,
],
prev_events: [joinRulesEvent._id],
depth: 5,
});

// Guest Access
const guestAccessEvent = await signEvent(
roomGuestAccessEvent({
roomId,
sender,
auth_events: [
createEventId,
memberEventId,
powerLevelsEventId,
// joinRulesEventId,
// historyVisibilityEventId,
],
prev_events: [historyVisibilityEventId],
depth: 6,
}),
config.signingKey[0],
);

const guestAccessEventId = generateId(guestAccessEvent);

events.push({
_id: guestAccessEventId,
event: guestAccessEvent,
const guestAccessEvent = await createGuestAccessRoomSigned({
roomId,
sender,
auth_events: [
createEvent._id,
memberEvent._id,
powerLevelsEvent._id,
// joinRulesEvent._id,
// historyVisibilityEvent._id,
],
prev_events: [historyVisibilityEvent._id],
depth: 6,
});

const events = [
createEvent,
memberEvent,
powerLevelsEvent,
joinRulesEvent,
historyVisibilityEvent,
guestAccessEvent,
];

return {
roomId,
events,
Expand All @@ -182,7 +160,11 @@ export const fakeEndpoints = new Elysia({ prefix: "/fake" })
return error(400, "Invalid sender");
}

const { roomId, events } = await createRoom(sender, username);
const { roomId, events } = await createRoom(
sender,
username,
createSignedEvent(config.signingKey[0]),
);

if (events.length === 0) {
return error(500, "Error creating room");
Expand Down Expand Up @@ -239,6 +221,7 @@ export const fakeEndpoints = new Elysia({ prefix: "/fake" })
const { roomId: newRoomId, events } = await createRoom(
sender,
username,
createSignedEvent(config.signingKey[0]),
);
roomId = newRoomId;

Expand Down

0 comments on commit fc1bac2

Please sign in to comment.