Koam
Implement a simple Koa-like http server with zero dependencies from scratch.
THIS FRAMEWORK HAVE NOT BEEN STRICTLY TESTED, PLEASE DO NOT USE IT IN PRODUCTION ! 许多功能未经严格测试,请勿用于生产目的!
Advantage
- Lightweight (0 dependency)
- TypeScript friendly
- Built-in body parser middleware
- Built-in response time middleware
Notes
- Current only support
application/jsontype request and response body ctx.assertmust explicit declareContexttype. See microsoft/Typescript#34523app.use(async (ctx: Context, next) => { // ^^^^^^^ const val: unknown = 1.2345 // ^^^^^^^ ctx.assert(typeof val === 'number', 500) console.log(val.toFixed(2)) // ^^^ now val is number type })
Roadmap
Configuration
-
app.env -
app.proxy -
see https://github.com/mutoe/koam#3-cookieapp.keys -
app.proxyIpHeader -
app.maxIpsCount -
app.onError(error, ctx)
Application properties / methods
-
app.use(middleware) -
app.callback() -
app.listen(...) -
app.context -
app.keys= -
usingapp.on('error', error)app.onErrorinstead -
app.address -
app.port
Context properties
-
ctx.req -
ctx.res -
ctx.request -
ctx.response -
ctx.state -
ctx.app -
usingctx.app.emitctx.throwinstead -
see https://github.com/mutoe/koam#3-cookiectx.cookies -
ctx.throw([status], [message], [detail])ctx.throw(appError) -
ctx.assert(value, [status], [message], [detail]) -
ctx.respond
Context request
-
request.headersctx.headers-
request.headerctx.header
-
-
request.headers=-
request.header=
-
-
request.get(field)ctx.get(field) -
request.methodctx.method -
request.method=ctx.method= -
request.length -
request.protocolctx.protocol -
request.hostctx.host -
request.hostnamectx.hostname -
request.urlctx.url -
request.url=ctx.url= -
request.originalUrlctx.originalUrl -
request.originctx.origin -
request.URL -
request.hrefctx.href -
request.pathctx.path -
request.path=ctx.path= -
request.queryctx.query -
request.query=ctx.query= -
request.querystringctx.querystring-
request.search
-
-
request.querystring=ctx.querystring=-
request.search=
-
-
request.type(getmime-typeinContent-Typeheader) -
request.charset(getcharsetinContent-Typeheader) -
request.freshctx.fresh -
request.socketctx.socket -
request.stalectx.stale -
request.securectx.secure -
request.ipctx.ip -
request.ipsctx.ips -
request.subdomainsctx.subdomains -
request.is()ctx.is() -
request.accepts()ctx.accepts() -
request.acceptsEncodings()ctx.acceptsEncodings() -
request.acceptsCharsets()ctx.acceptsCharsets() -
request.acceptsLanguages()ctx.acceptsLanguages() -
request.idempotent
Context response
-
response.headers-
response.header
-
-
response.headerSentctx.headerSent -
response.flushHeaders() -
response.has(header) -
response.get(header) -
response.set(headers)ctx.set(headers) -
response.append(header, value)ctx.append(header, value) -
response.remove(header)ctx.remove(header) -
response.socket -
response.bodyctx.body -
response.body=ctx.body=(currently only finished json body and stream) -
response.statusctx.status -
response.status=ctx.status= -
response.messagectx.message -
response.message=ctx.message= -
response.lengthctx.length -
response.length=ctx.length= -
response.typectx.type -
response.type=ctx.type= -
response.is(mimeTypes...) -
response.redirect(url, [alt])ctx.redirect(url, [alt]) -
response.attachment([filename])ctx.attachment([filename]) -
response.lastModified=ctx.lastModified= -
response.etag=ctx.etag= -
response.vary(fields)ctx.vary(fields)