Skip to content

Commit

Permalink
feat(server): support association api
Browse files Browse the repository at this point in the history
  • Loading branch information
shigma committed Apr 24, 2024
1 parent 93536a0 commit 7c61fb2
Show file tree
Hide file tree
Showing 7 changed files with 59 additions and 52 deletions.
3 changes: 2 additions & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,8 @@ jobs:
- name: Unit Test
run: yarn test:json
- name: Report Coverage
uses: codecov/codecov-action@v3
uses: codecov/codecov-action@v4
with:
token: ${{ secrets.CODECOV_TOKEN }}
file: ./coverage/coverage-final.json
name: codecov
16 changes: 8 additions & 8 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,19 +19,19 @@
"test:html": "shx rm -rf coverage && c8 -r html yarn test"
},
"devDependencies": {
"@types/chai": "^4.3.11",
"@types/chai": "^4.3.14",
"@types/mocha": "^9.1.1",
"@types/node": "^20.10.2",
"@types/node": "^20.11.30",
"c8": "^7.14.0",
"chai": "^4.3.10",
"chai": "^4.4.1",
"esbuild": "^0.18.20",
"esbuild-register": "^3.5.0",
"mocha": "^9.2.2",
"shx": "^0.3.4",
"typescript": "^5.3.2",
"yakumo": "^1.0.0-beta.2",
"yakumo-esbuild": "^1.0.0-beta.1",
"yakumo-mocha": "^1.0.0-beta.1",
"yakumo-tsc": "^1.0.0-beta.0"
"typescript": "^5.4.3",
"yakumo": "^1.0.0-beta.13",
"yakumo-esbuild": "^1.0.0-beta.5",
"yakumo-mocha": "^1.0.0-beta.2",
"yakumo-tsc": "^1.0.0-beta.3"
}
}
21 changes: 12 additions & 9 deletions packages/core/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@cordisjs/server",
"name": "@cordisjs/plugin-server",
"description": "Server plugin for cordis",
"version": "0.1.5",
"version": "0.1.8",
"type": "module",
"main": "lib/index.cjs",
"module": "lib/index.mjs",
Expand All @@ -22,13 +22,13 @@
"license": "MIT",
"repository": {
"type": "git",
"url": "git+https://github.com/cordisjs/server.git",
"url": "git+https://github.com/cordiverse/server.git",
"directory": "packages/core"
},
"bugs": {
"url": "https://github.com/cordisjs/server/issues"
"url": "https://github.com/cordiverse/server/issues"
},
"homepage": "https://github.com/cordisjs/server",
"homepage": "https://github.com/cordiverse/server",
"keywords": [
"cordis",
"router",
Expand All @@ -39,21 +39,24 @@
"service",
"plugin"
],
"peerDependencies": {
"cordis": "^3.13.6"
},
"devDependencies": {
"@cordisjs/logger": "^0.1.3",
"@types/parseurl": "^1.3.3"
},
"dependencies": {
"@koa/router": "^10.1.1",
"@types/koa": "*",
"@types/koa__router": "*",
"@types/ws": "^8.5.10",
"koa": "^2.14.2",
"cosmokit": "^1.6.2",
"koa": "^2.15.2",
"koa-bodyparser": "^4.4.1",
"parseurl": "^1.3.3",
"path-to-regexp": "^6.2.1",
"reggol": "^1.6.3",
"schemastery": "^3.14.3",
"ws": "^8.14.2"
"schemastery": "^3.14.5",
"ws": "^8.16.0"
}
}
49 changes: 25 additions & 24 deletions packages/core/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import { Context } from 'cordis'
import { MaybeArray, remove, trimSlash } from 'cosmokit'
import { createServer, IncomingMessage, Server } from 'http'
import { createServer, IncomingMessage, Server as HTTPServer } from 'http'
import { pathToRegexp } from 'path-to-regexp'
import bodyParser from 'koa-bodyparser'
import type { Logger } from '@cordisjs/logger'
import parseUrl from 'parseurl'
import { WebSocket, WebSocketServer } from 'ws'
import Schema from 'schemastery'
Expand All @@ -21,13 +20,19 @@ declare module 'koa' {

declare module 'cordis' {
interface Context {
server: Router
[Context.Server]: Context.Server<this>
server: Server & this[typeof Context.Server]
/** @deprecated use `ctx.server` instead */
router: Router
router: Server
}

interface Events {
'server/ready'(this: Router): void
'server/ready'(this: Server): void
}

namespace Context {
const Server: unique symbol
interface Server<C extends Context> {}
}
}

Expand All @@ -37,7 +42,7 @@ export class WebSocketLayer {
clients = new Set<WebSocket>()
regexp: RegExp

constructor(private server: Router, path: MaybeArray<string | RegExp>, public callback?: WebSocketCallback) {
constructor(private server: Server, path: MaybeArray<string | RegExp>, public callback?: WebSocketCallback) {
this.regexp = pathToRegexp(path)
}

Expand All @@ -59,37 +64,33 @@ export class WebSocketLayer {
}
}

export interface Router extends Context.Associate<'server'> {}

export class Router extends KoaRouter {
public _http: Server
export class Server extends KoaRouter {
public _http: HTTPServer
public _ws: WebSocketServer
public wsStack: WebSocketLayer[] = []
public _koa = new Koa()

public host!: string
public port!: number

private logger: Logger

constructor(protected ctx: Context, public config: Router.Config) {
constructor(protected ctx: Context, public config: Server.Config) {
super()
ctx.runtime.name = 'server'
ctx.provide('server')
ctx.alias('server', ['router'])
this.logger = ctx.logger('server')

// create server
const koa = new Koa()
koa.use(bodyParser({
this._koa.use(bodyParser({
enableTypes: ['json', 'form', 'xml'],
jsonLimit: '10mb',
formLimit: '10mb',
textLimit: '10mb',
xmlLimit: '10mb',
}))
koa.use(this.routes())
koa.use(this.allowedMethods())
this._koa.use(this.routes())
this._koa.use(this.allowedMethods())

this._http = createServer(koa.callback())
this._http = createServer(this._koa.callback())
this._ws = new WebSocketServer({
server: this._http,
})
Expand All @@ -113,13 +114,13 @@ export class Router extends KoaRouter {
this.host = host
this.port = await listen(config)
this._http.listen(this.port, host)
this.logger.info('server listening at %c', `http://${host}:${this.port}`)
this.ctx.logger.info('server listening at %c', `http://${host}:${this.port}`)
ctx.emit(this, 'server/ready')
}, true)

ctx.on('dispose', () => {
if (config.port) {
this.logger.info('http server closing')
this.ctx.logger.info('http server closing')
}
this._ws?.close()
this._http?.close()
Expand All @@ -136,7 +137,7 @@ export class Router extends KoaRouter {
}

[Context.filter](ctx: Context) {
return ctx[Context.shadow].server === this.ctx[Context.shadow].server
return ctx[Context.isolate].server === this.ctx[Context.isolate].server
}

get selfUrl() {
Expand Down Expand Up @@ -166,7 +167,7 @@ export class Router extends KoaRouter {
}
}

export namespace Router {
export namespace Server {
export interface Config {
host: string
port: number
Expand All @@ -182,4 +183,4 @@ export namespace Router {
})
}

export default Router
export default Server
6 changes: 3 additions & 3 deletions packages/temp/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@cordisjs/server-temp",
"name": "@cordisjs/plugin-server-temp",
"description": "Temp server plugin for cordis",
"version": "0.3.0",
"version": "0.3.1",
"main": "lib/index.js",
"types": "lib/index.d.ts",
"files": [
Expand Down Expand Up @@ -29,6 +29,6 @@
"plugin"
],
"devDependencies": {
"undios": "^0.3.2"
"undios": "^0.3.3"
}
}
12 changes: 7 additions & 5 deletions packages/temp/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,12 @@ declare module 'cordis' {
interface Context {
'server.temp': TempServer
}

namespace Context {
interface Server<C> {
temp: TempServer
}
}
}

export interface Entry {
Expand All @@ -29,7 +35,7 @@ class TempServer extends Service {
public entries: Dict<Entry> = Object.create(null)

constructor(protected ctx: Context, public config: TempServer.Config) {
super(ctx, 'server.temp', true)
super(ctx, 'server.temp')
const logger = ctx.logger('temp')

this.path = sanitize(config.path)
Expand All @@ -44,15 +50,11 @@ class TempServer extends Service {
if (!entry) return koa.status = 404
koa.body = createReadStream(entry.path)
})

ctx.on('ready', () => this.start())
ctx.on('dispose', () => this.stop())
}

async start() {
this.baseDir = this.ctx.baseDir + '/temp/' + Math.random().toString(36).slice(2) + '/'
await mkdir(this.baseDir, { recursive: true })
this.ctx.server.temp = this
}

async stop() {
Expand Down
4 changes: 2 additions & 2 deletions tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@cordisjs/server": ["packages/core/src"],
"@cordisjs/server-*": ["packages/*/src"],
"@cordisjs/plugin-server": ["packages/core/src"],
"@cordisjs/plugin-server-*": ["packages/*/src"],
},
},
"files": [],
Expand Down

0 comments on commit 7c61fb2

Please sign in to comment.