prism/server/routes/unifiedpush.ts

68 lines
1.9 KiB
TypeScript

import { ROUTES } from '@/constants/server';
import { createGroup, sendGroupMessage } from '@/modules/signal';
import { getGroupId, register, remove } from '@/modules/store';
import { formatAsSignalMessage, parseUnifiedPushRequest } from '@/modules/unifiedpush';
const handleMatrixNotify = async (req: Request) => {
const message = await parseUnifiedPushRequest(req);
const groupId = getGroupId(message.endpoint);
if (!groupId) {
return new Response('Endpoint not registered', { status: 404 });
}
const signalMessage = formatAsSignalMessage(message);
await sendGroupMessage(groupId, signalMessage);
return Response.json({ success: true });
};
const handleRegister = async (req: Request) => {
const url = new URL(req.url);
const endpointId = url.pathname.split('/')[2] ?? '';
const { appName } = (await req.json()) as {
appName: string;
token?: string;
};
const groupId: string = getGroupId(endpointId) ?? (await createGroup(appName));
if (!getGroupId(endpointId)) {
register(endpointId, groupId, appName);
}
const proto = req.headers.get('x-forwarded-proto') || 'http';
const host = req.headers.get('host') || 'localhost:8080';
const baseUrl = `${proto}://${host}`;
const endpoint = `${baseUrl}${ROUTES.MATRIX_NOTIFY}/${endpointId}`;
return Response.json({ endpoint, gateway: 'matrix' });
};
const handleUnregister = async (req: Request) => {
const url = new URL(req.url);
const endpointId = url.pathname.split('/')[2] ?? '';
remove(endpointId);
return new Response(null, { status: 204 });
};
const handleDiscovery = () =>
Response.json({
unifiedpush: { version: 1 },
gateway: 'matrix',
});
export const unifiedPushRoutes = {
[ROUTES.UP]: {
GET: handleDiscovery,
},
[ROUTES.MATRIX_NOTIFY]: {
POST: handleMatrixNotify,
},
[ROUTES.UP_INSTANCE]: {
POST: handleRegister,
DELETE: handleUnregister,
},
};