mirror of
https://github.com/lone-cloud/prism
synced 2026-06-03 08:43:10 -07:00
68 lines
1.9 KiB
TypeScript
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,
|
|
},
|
|
};
|