feat(server): basic implementation of server runtime and SDK (#13)

* feat(server): basic implementation of server runtime and SDK
* refactor: better typing
This commit is contained in:
Neko
2025-01-15 20:54:46 +08:00
committed by GitHub
parent 61614775bd
commit 790189f1eb
19 changed files with 558 additions and 267 deletions
+33 -12
View File
@@ -1,17 +1,38 @@
// Import h3 as npm dependency
import { createApp, createRouter, defineEventHandler } from 'h3'
import type { WebSocketEvent } from '@proj-airi/server-shared/types'
import { Format, LogLevel, setGlobalFormat, setGlobalLogLevel, useLogg } from '@guiiai/logg'
import { createApp, createRouter, defineWebSocketHandler } from 'h3'
// Create an app instance
export const app = createApp()
setGlobalFormat(Format.Pretty)
setGlobalLogLevel(LogLevel.Log)
const appLogger = useLogg('App').useGlobalConfig()
const websocketLogger = useLogg('WebSocket').useGlobalConfig()
export const app = createApp({
onError: error => appLogger.withError(error).error('an error occurred'),
})
// Create a new router and register it in app
const router = createRouter()
app.use(router)
// Add a new route that matches GET requests to / path
router.get(
'/',
defineEventHandler(() => {
return { message: '⚡️ Tadaa!' }
}),
)
router.get('/ws', defineWebSocketHandler({
open: (peer) => {
websocketLogger.withFields({ peer: peer.id }).log('connected')
},
message: (peer, message) => {
const event = message.json() as WebSocketEvent
websocketLogger.withFields({ peer: peer.id, message: event }).log('received message')
switch (event.type) {
case 'input:text:voice':
websocketLogger.withFields({ message: event }).log('transcribed')
break
}
},
error: (peer, error) => {
websocketLogger.withFields({ peer: peer.id }).withError(error).error('an error occurred')
},
close: (peer, details) => {
websocketLogger.withFields({ peer: peer.id, details }).log('closed')
},
}))