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
+10 -3
View File
@@ -3,7 +3,7 @@
"type": "module",
"version": "0.1.1",
"private": false,
"description": "Server runtime and utility implementation for Airi running in different environments",
"description": "Server runtime implementation for Airi running in different environments",
"author": {
"name": "Neko Ayaka",
"email": "neko@ayaka.moe",
@@ -30,9 +30,16 @@
"dist",
"package.json"
],
"scripts": {},
"scripts": {
"dev": "listhen -w --ws --port 6121 ./src/index.ts",
"start": "listhen --ws --port 6121 ./src/index.ts"
},
"dependencies": {
"@guiiai/logg": "^1.0.6",
"@proj-airi/server-shared": "workspace:^",
"crossws": "^0.3.1",
"defu": "^6.1.4",
"h3": "^1.13.1"
"h3": "^1.13.1",
"listhen": "^1.9.0"
}
}
+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')
},
}))