11import type { User } from '@/user'
2+ import SJSON from 'secure-json-parse'
23import { getCapabilities } from '@/router/get-capabilities'
34import { getRoomsRoute } from '@/router/get-rooms'
45import { getRoom } from '@/router/get-room'
@@ -31,7 +32,7 @@ import { match } from 'path-to-regexp'
3132export type SogsRequest = {
3233 endpoint : string
3334 method : string
34- body : Buffer | null
35+ body : Buffer | any | null
3536 params ?: Partial < Record < string , string | string [ ] > >
3637 headers ?: { [ key : string ] : string }
3738 searchParams ?: { [ k : string ] : string }
@@ -45,7 +46,7 @@ export type SogsResponse = {
4546 headers ?: Record < string , string >
4647}
4748
48- type Route = { method : string , route : string , handler : ( req : SogsRequest ) => SogsResponse | Promise < SogsResponse > }
49+ type Route = { method : string , route : string , handler : ( req : SogsRequest ) => SogsResponse | Promise < SogsResponse > , bodyType ?: 'buffer' | 'json' | 'any' }
4950const router : Route [ ] = [ ]
5051
5152router . push ( { method : 'GET' , route : '/capabilities' , handler : getCapabilities } )
@@ -55,22 +56,22 @@ router.push({ method: 'GET', route: '/room/:token/pollInfo/:info_updates', handl
5556router . push ( { method : 'DELETE' , route : '/room/:token/all/:session_id' , handler : deleteAllFromUser } )
5657router . push ( { method : 'GET' , route : '/room/:token/messages/recent' , handler : getRoomRecentMessages } )
5758router . push ( { method : 'GET' , route : '/room/:token/messages/since/:since_seqno' , handler : getRoomMessagesSince } )
58- router . push ( { method : 'POST' , route : '/room/:token/message' , handler : postRoomMessage } )
59+ router . push ( { method : 'POST' , route : '/room/:token/message' , handler : postRoomMessage , bodyType : 'json' } )
5960router . push ( { method : 'DELETE' , route : '/room/:token/message/:message_id' , handler : deleteRoomMessage } )
60- router . push ( { method : 'POST' , route : '/room/:token/file' , handler : uploadFileToRoom } )
61+ router . push ( { method : 'POST' , route : '/room/:token/file' , handler : uploadFileToRoom , bodyType : 'buffer' } )
6162router . push ( { method : 'GET' , route : '/room/:token/file/:file_id' , handler : retrieveFileInRoom } )
6263router . push ( { method : 'GET' , route : '/room/:token/file/:file_id/:filename' , handler : retrieveFileInRoom } )
63- router . push ( { method : 'POST' , route : '/user/:session_id/ban' , handler : banUser } )
64- router . push ( { method : 'POST' , route : '/user/:session_id/unban' , handler : unbanUser } )
65- router . push ( { method : 'POST' , route : '/user/:session_id/moderator' , handler : appointModerator } )
66- router . push ( { method : 'POST' , route : '/room/:token/pin/:message_id' , handler : pinMessage } )
67- router . push ( { method : 'POST' , route : '/room/:token/unpin/all' , handler : unpinAllMessages } )
68- router . push ( { method : 'POST' , route : '/room/:token/unpin/:message_id' , handler : unpinMessage } )
64+ router . push ( { method : 'POST' , route : '/user/:session_id/ban' , handler : banUser , bodyType : 'json' } )
65+ router . push ( { method : 'POST' , route : '/user/:session_id/unban' , handler : unbanUser , bodyType : 'json' } )
66+ router . push ( { method : 'POST' , route : '/user/:session_id/moderator' , handler : appointModerator , bodyType : 'json' } )
67+ router . push ( { method : 'POST' , route : '/room/:token/pin/:message_id' , handler : pinMessage , bodyType : 'json' } )
68+ router . push ( { method : 'POST' , route : '/room/:token/unpin/all' , handler : unpinAllMessages , bodyType : 'json' } )
69+ router . push ( { method : 'POST' , route : '/room/:token/unpin/:message_id' , handler : unpinMessage , bodyType : 'json' } )
6970router . push ( { method : 'GET' , route : '/inbox' , handler : getDmInbox } )
7071router . push ( { method : 'GET' , route : '/inbox/since/:message_id' , handler : getDmInboxSince } )
7172router . push ( { method : 'GET' , route : '/outbox' , handler : getDmOutbox } )
7273router . push ( { method : 'GET' , route : '/outbox/since/:message_id' , handler : getDmOutboxSince } )
73- router . push ( { method : 'POST' , route : '/inbox/:session_id' , handler : sendDmMessage } )
74+ router . push ( { method : 'POST' , route : '/inbox/:session_id' , handler : sendDmMessage , bodyType : 'json' } )
7475router . push ( { method : 'DELETE' , route : '/inbox' , handler : deleteDmInbox } )
7576router . push ( { method : 'PUT' , route : '/room/:token/reaction/:message_id/:reaction' , handler : addReaction } )
7677router . push ( { method : 'DELETE' , route : '/room/:token/reaction/:message_id/:reaction' , handler : deleteReaction } )
@@ -98,7 +99,28 @@ export async function handleIncomingRequest(req: SogsRequest): Promise<SogsRespo
9899
99100 const request = findRoute ( req . method , req . endpoint )
100101 if ( request ) {
101- return await request . route . handler ( { ...req , params : request . params , searchParams : request . searchParams } )
102+ let parsedBody : any
103+ if ( request . route . bodyType === 'json' ) {
104+ if ( typeof req . body === 'string' ) {
105+ parsedBody = SJSON . parse ( req . body )
106+ } else if ( Buffer . isBuffer ( req . body ) ) {
107+ parsedBody = SJSON . parse ( req . body . toString ( 'utf-8' ) )
108+ } else {
109+ parsedBody = req . body
110+ }
111+ } else if ( request . route . bodyType === 'buffer' ) {
112+ if ( Buffer . isBuffer ( req . body ) ) {
113+ parsedBody = req . body
114+ } else {
115+ return {
116+ response : null ,
117+ status : 400
118+ }
119+ }
120+ } else {
121+ parsedBody = req . body
122+ }
123+ return await request . route . handler ( { ...req , body : parsedBody , params : request . params , searchParams : request . searchParams } )
102124 } else {
103125 if ( process . env . BUNSOGS_DEV === 'true' ) {
104126 console . warn ( 'Unknown route' , req . method , req . endpoint )
0 commit comments