feat(federation): Implement Instance Messaging Extension

This commit is contained in:
Jesse Wierzbinski 2024-11-25 16:54:46 +01:00
parent 4594c69808
commit 756f67c0f3
No known key found for this signature in database
5 changed files with 67 additions and 1 deletions

View file

@ -9,6 +9,7 @@ Versia Server `0.8.0` is fully backwards compatible with `0.7.0`.
- Outbound federation and inbox processing are now handled by a queue system (like most federated software). - Outbound federation and inbox processing are now handled by a queue system (like most federated software).
- Added an administration UI for managing the queue. - Added an administration UI for managing the queue.
- Upgraded Bun to `1.1.36`. - Upgraded Bun to `1.1.36`.
- Implemented support for the [Instance Messaging Extension](https://versia.pub/extensions/instance-messaging)
- Allowed `<div>` and `<span>` tags in Markdown. - Allowed `<div>` and `<span>` tags in Markdown.
- Added `--password` flag to the user creation CLI. - Added `--password` flag to the user creation CLI.

View file

@ -70,6 +70,7 @@ Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) fil
The following extensions are currently supported or being worked on: The following extensions are currently supported or being worked on:
- `pub.versia:custom_emojis`: Custom emojis - `pub.versia:custom_emojis`: Custom emojis
- `pub.versia:instance_messaging`: Instance Messaging
- `pub.versia:polls`: Polls - `pub.versia:polls`: Polls
- `pub.versia:share`: Share - `pub.versia:share`: Share

48
api/messaging/index.ts Normal file
View file

@ -0,0 +1,48 @@
import { apiRoute, applyConfig } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { getLogger } from "@logtape/logtape";
import chalk from "chalk";
import { z } from "zod";
export const meta = applyConfig({
auth: {
required: false,
},
ratelimits: {
duration: 60,
max: 500,
},
route: "/messaging",
});
const route = createRoute({
method: "post",
path: "/messaging",
summary: "Endpoint for the Instance Messaging Versia Extension.",
description: "https://versia.pub/extensions/instance-messaging.",
request: {
body: {
content: {
"text/plain": {
schema: z.string(),
},
},
},
},
responses: {
200: {
description: "Message saved",
},
},
});
export default apiRoute((app) =>
app.openapi(route, async (context) => {
const content = await context.req.text();
getLogger(["federation", "messaging"])
.info`Received message via ${chalk.bold("Instance Messaging")}:\n${content}`;
return context.newResponse(null, 200);
}),
);

View file

@ -44,7 +44,10 @@ export default apiRoute((app) =>
{ {
type: "InstanceMetadata" as const, type: "InstanceMetadata" as const,
compatibility: { compatibility: {
extensions: ["pub.versia:custom_emojis"], extensions: [
"pub.versia:custom_emojis",
"pub.versia:instance_messaging",
],
versions: ["0.4.0"], versions: ["0.4.0"],
}, },
host: new URL(config.http.base_url).host, host: new URL(config.http.base_url).host,
@ -63,6 +66,14 @@ export default apiRoute((app) =>
created_at: new Date( created_at: new Date(
firstUser?.data.createdAt ?? 0, firstUser?.data.createdAt ?? 0,
).toISOString(), ).toISOString(),
extensions: {
"pub.versia:instance_messaging": {
endpoint: new URL(
"/messaging",
config.http.base_url,
).toString(),
},
},
}, },
200, 200,
); );

View file

@ -194,6 +194,11 @@ export const configureLoggers = (silent = false): Promise<void> =>
sinks: ["console", "file"], sinks: ["console", "file"],
filters: ["configFilter"], filters: ["configFilter"],
}, },
{
category: ["federation", "messaging"],
sinks: ["console", "file"],
filters: ["configFilter"],
},
{ {
category: "database", category: "database",
sinks: ["console", "file"], sinks: ["console", "file"],