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:
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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')
|
||||
},
|
||||
}))
|
||||
|
||||
Reference in New Issue
Block a user