Skip to content

Commit

Permalink
create core package
Browse files Browse the repository at this point in the history
  • Loading branch information
ggazzo committed Dec 9, 2024
1 parent c7db17f commit c99a79e
Show file tree
Hide file tree
Showing 39 changed files with 414 additions and 51 deletions.
Binary file modified bun.lockb
Binary file not shown.
24 changes: 24 additions & 0 deletions packages/core/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
{
"name": "@hs/core",
"version": "1.0.50",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "bun run --watch src/index.ts",
"prepare": "ts-patch install && typia patch",
"build": "tsc"
},
"main": "./src/index.ts",
"types": "./src/index.ts",
"files": ["./src"],
"dependencies": {
"elysia": "latest",
"typia": "^5.5.7"
},
"devDependencies": {
"bun-types": "latest",
"ts-node": "^10.9.2",
"ts-patch": "^3.1.2",
"typescript": "^5.4.2"
},
"module": "src/index.js"
}
79 changes: 79 additions & 0 deletions packages/core/src/endpoints.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
export interface Endpoints {}

export interface EndpointDefinition {
auth: boolean;
rateLimit: boolean;
query: any;
response: any;
}

export interface Endpoint {
GET?: EndpointDefinition;
POST?: EndpointDefinition;
PUT?: EndpointDefinition;
DELETE?: EndpointDefinition;
}

export type Method =
| "GET"
| "POST"
| "DELETE"
| "PUT"
| "OPTIONS"
| "HEAD"
| "PATCH";

export type EndpointsPath = keyof Endpoints;

// gets the endpoints for a given Method, if is never does not exist
export type EndpointsByMethod = {
[TMethod in Method]: {
[TPathPattern in keyof Endpoints]: TMethod extends keyof Endpoints[TPathPattern]
? Endpoints[TPathPattern][TMethod] extends infer TConfig
? TConfig extends EndpointDefinition
? TPathPattern
: never
: never
: never;
}[keyof Endpoints];
};

export type GetPropertyPath<
TMethod extends Method,
TPath extends EndpointsByMethod[TMethod],
TProp extends keyof EndpointDefinition,
> = TMethod extends keyof Endpoints[TPath]
? TProp extends keyof Endpoints[TPath][TMethod]
? Endpoints[TPath][TMethod][TProp]
: never
: never;

export type ParametersByMethod<
TMethod extends Method,
TPath extends EndpointsByMethod[TMethod],
> = GetPropertyPath<TMethod, TPath, "query">;

export type ResponseByMethod<
TMethod extends Method,
TPath extends EndpointsByMethod[TMethod],
> = GetPropertyPath<TMethod, TPath, "response">;

export type FilterEndpointsByVersion<V extends "v1" | "v2" | "v3"> =
EndpointsByMethod[keyof EndpointsByMethod] extends `/${infer U}/${string}`
? U extends V
? EndpointsByMethod[keyof EndpointsByMethod]
: never
: never;

type UrlParams<T extends string> = string extends T
? Record<string, string>
: T extends `${string}:${infer Param}/${infer Rest}`
? { [k in Param | keyof UrlParams<Rest>]: string }
: T extends `${string}:${infer Param}`
? { [k in Param]: string }
: undefined | Record<string, never>;

export type GetUrlParams<
TMethod extends Method,
TPath extends EndpointsByMethod[TMethod],
> = UrlParams<TPath>;
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { expect, test } from "bun:test";

import { generateId } from "../authentication";
import { generateKeyPairsFromString } from "../keys";
import { signEvent } from "../signEvent";
import { generateId } from "../../../homeserver/src/authentication";
import { generateKeyPairsFromString } from "../../../homeserver/src/keys";
import { signEvent } from "../../../homeserver/src/signEvent";
import { roomCreateEvent } from "./m.room.create";

const finalEventId = "$0AQU5dG_mtjH6qavAxYrQsDC0a_-6T3DHs1yoxf5fz4";
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { expect, test } from "bun:test";

import { generateId } from "../authentication";
import { generateKeyPairsFromString } from "../keys";
import { signEvent } from "../signEvent";
import { generateId } from "../../../homeserver/src/authentication";
import { generateKeyPairsFromString } from "../../../homeserver/src/keys";
import { signEvent } from "../../../homeserver/src/signEvent";
import { roomGuestAccessEvent } from "./m.room.guest_access";

const finalEventId = "$gdAY3-3DdjuG-uyFkDn8q5wPS4fbymH__fch9BQmOas";
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { expect, test } from "bun:test";

import { generateId } from "../authentication";
import { generateKeyPairsFromString } from "../keys";
import { signEvent } from "../signEvent";
import { generateId } from "../../../homeserver/src/authentication";
import { generateKeyPairsFromString } from "../../../homeserver/src/keys";
import { signEvent } from "../../../homeserver/src/signEvent";
import { roomHistoryVisibilityEvent } from "./m.room.history_visibility";

const finalEventId = "$a4hYydlvVc738DgFJA4hDHaIl_umBkHSV_efweAO5PE";
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { expect, test } from "bun:test";

import { generateId } from "../authentication";
import { generateKeyPairsFromString } from "../keys";
import { signEvent } from "../signEvent";
import { generateId } from "../../../homeserver/src/authentication";
import { generateKeyPairsFromString } from "../../../homeserver/src/keys";
import { signEvent } from "../../../homeserver/src/signEvent";
import { roomJoinRulesEvent } from "./m.room.join_rules";

const finalEventId = "$Uxo9MgF-4HQNEZdkkQDzgh9wlZ1yJbDXTMXCh6aZBi4";
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { expect, test } from "bun:test";

import { generateId } from "../authentication";
import { generateKeyPairsFromString } from "../keys";
import { signEvent } from "../signEvent";
import { generateId } from "../../../homeserver/src/authentication";
import { generateKeyPairsFromString } from "../../../homeserver/src/keys";
import { signEvent } from "../../../homeserver/src/signEvent";
import { roomMemberEvent } from "./m.room.member";

const finalEventId = "$GAcbc4lUMhfCAWFZxoVZ6Pmzhcea1zKoY92ji4LjMqk";
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { expect, test } from "bun:test";

import { generateId } from "../authentication";
import { generateKeyPairsFromString } from "../keys";
import { signEvent } from "../signEvent";
import { generateId } from "../../../homeserver/src/authentication";
import { generateKeyPairsFromString } from "../../../homeserver/src/keys";
import { signEvent } from "../../../homeserver/src/signEvent";
import { roomCreateEvent } from "./m.room.create";
import { roomMemberEvent } from "./m.room.member";

Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { expect, test } from "bun:test";

import { generateId } from "../authentication";
import { generateKeyPairsFromString } from "../keys";
import { signEvent } from "../signEvent";
import { generateId } from "../../../homeserver/src/authentication";
import { generateKeyPairsFromString } from "../../../homeserver/src/keys";
import { signEvent } from "../../../homeserver/src/signEvent";
import { roomPowerLevelsEvent } from "./m.room.power_levels";

const finalEventId = "$T20EETjD2OuaC1OVyg8iIbJGTNeGBsMiWoAagBOVRNE";
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { expect, test, describe } from "bun:test";
import { createRoomCreateEvent, roomCreateEvent } from "../m.room.create";
import { signEvent } from "../../signEvent";
import { generateId } from "../../authentication";
import { signEvent } from "../../../../homeserver/src/signEvent";
import { generateId } from "../../../../homeserver/src/authentication";
import { createSignedEvent } from "./createSignedEvent";
import { generateKeyPairsFromString } from "../../keys";
import { generateKeyPairsFromString } from "../../../../homeserver/src/keys";

describe("makeSignedEvent", () => {
test("it should return the same payload, following create event > sign > generate id", async () => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { generateId } from "../../authentication";
import type { SigningKey } from "../../keys";
import { signEvent } from "../../signEvent";
import { generateId } from "../../../../homeserver/src/authentication";
import type { SigningKey } from "../../../../homeserver/src/keys";
import { signEvent } from "../../../../homeserver/src/signEvent";

export const createSignedEvent = (
signature: SigningKey,
Expand Down
Empty file added packages/core/src/index.ts
Empty file.
57 changes: 57 additions & 0 deletions packages/core/src/query.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import typia, { tags } from "typia";

// https://spec.matrix.org/v1.10/server-server-api/#post_matrixkeyv2query

interface Body {
server_keys: Record<
string,
{
minimum_valid_until_ts: number;
}
>;
}

interface Response {
server_keys: {
old_verify_keys: Record<
string,
{
expired_ts: number;
key: string;
}
>;
server_name: string;
signatures: Record<string, Record<string, string>>;
valid_until_ts: number;
verify_keys: Record<
string,
{
key: string;
}
>;
}[];
}
declare module "./endpoints" {
interface Endpoints {
"/v2/query": {
POST: {
description: "Query for keys from multiple servers in a batch format. The receiving (notary) server must sign the keys returned by the queried servers.";
auth: false;
rateLimit: false;
body: Body;
response: Response;
};
};
"/v2/query/:serverName": {
GET: {
description: "Query for keys from a single server. The receiving (notary) server must sign the keys returned by the queried server.";
auth: false;
rateLimit: false;
query: {
minimum_valid_until_ts: number;
};
response: Response;
};
};
}
}
56 changes: 56 additions & 0 deletions packages/core/src/server.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import typia, { tags } from "typia";

// // https://spec.matrix.org/v1.9/server-server-api/#get_matrixkeyv2server

interface Response {
old_verify_keys: Record<
string,
{
expired_ts: number;
key: string;
}
>;
server_name: string;
signatures: Record<string, Record<string, string>>;
valid_until_ts: number;
verify_keys: Record<
string,
{
key: string;
}
>;
}

type Query = object;

declare module "./endpoints" {
interface Endpoints {
"/v2/server": {
GET: {
description: "Gets the homeserver’s published signing keys. The homeserver may have any number of active keys and may have a number of old keys.";
auth: false;
rateLimit: false;
query: Query;
response: Response;
};
};
"/v2/server/": {
GET: {
description: "Gets the homeserver’s published signing keys. The homeserver may have any number of active keys and may have a number of old keys.";
auth: false;
rateLimit: false;
query: Query;
response: Response;
};
};
"/v2/server/{keyID}": {
GET: {
description: "Gets the homeserver’s published signing keys. The homeserver may have any number of active keys and may have a number of old keys.";
auth: false;
rateLimit: false;
query: Query;
response: Response;
};
};
}
}
29 changes: 29 additions & 0 deletions packages/core/src/transactions.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
// https://spec.matrix.org/v1.10/server-server-api/#transactions

interface PDU {
pdu_type: string;
content: unknown;
}

interface EDU {
edu_type: string;
content: unknown;
}

interface Body {
edus?: EDU[];
pdus: PDU[];

room_id: string;
origin: string;
origin_server_ts: number;
}

interface Response {
pdus: Record<
`${string}:${string}`,
{
error: string;
}
>;
}
23 changes: 23 additions & 0 deletions packages/core/src/wellknown.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
// https://spec.matrix.org/v1.9/server-server-api/#getwell-knownmatrixserver

interface Response {
server: {
name: string;
version: string;
};
}

type Query = object;

declare module "./endpoints" {
interface Endpoints {
"/.well-known/matrix/server": {
GET: {
auth: false;
rateLimit: false;
query: Query;
response: Response;
};
};
}
}
Loading

0 comments on commit c99a79e

Please sign in to comment.