Skip to content

Commit

Permalink
feat(core): enhance typings
Browse files Browse the repository at this point in the history
  • Loading branch information
shigma committed Dec 9, 2023
1 parent c06e429 commit 5eb76b1
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 12 deletions.
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
lib
dist
temp

/external

Expand Down
3 changes: 2 additions & 1 deletion packages/core/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@cordisjs/server",
"description": "Server plugin for cordis",
"version": "0.1.2",
"version": "0.1.3",
"main": "lib/index.js",
"types": "lib/index.d.ts",
"files": [
Expand Down Expand Up @@ -30,6 +30,7 @@
"plugin"
],
"devDependencies": {
"@cordisjs/logger": "^0.1.2",
"@types/parseurl": "^1.3.3"
},
"dependencies": {
Expand Down
29 changes: 19 additions & 10 deletions packages/core/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ import { Context } from 'cordis'
import { MaybeArray, remove, trimSlash } from 'cosmokit'
import { createServer, IncomingMessage, Server } from 'http'
import { pathToRegexp } from 'path-to-regexp'
import type { Logger } from '@cordisjs/logger'
import parseUrl from 'parseurl'
import WebSocket from 'ws'
import Logger from 'reggol'
import Schema from 'schemastery'
import KoaRouter from '@koa/router'
import Koa from 'koa'
Expand All @@ -20,11 +20,13 @@ declare module 'koa' {

declare module 'cordis' {
interface Context {
server: Router
/** @deprecated use `ctx.server` instead */
router: Router
}

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

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

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

Expand All @@ -49,13 +51,15 @@ export class WebSocketLayer {
}

close() {
remove(this.router.wsStack, this)
remove(this.server.wsStack, this)
for (const socket of this.clients) {
socket.close()
}
}
}

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

export class Router extends KoaRouter {
public _http: Server
public _ws: WebSocket.Server
Expand All @@ -68,7 +72,9 @@ export class Router extends KoaRouter {

constructor(protected ctx: Context, public config: Router.Config) {
super()
this.logger = new Logger('router', { [Context.current]: this })
ctx.provide('server')
ctx.alias('server', ['router'])
this.logger = ctx.logger('server')

// create server
const koa = new Koa()
Expand Down Expand Up @@ -107,7 +113,7 @@ export class Router extends KoaRouter {
this.port = await listen(config)
this._http.listen(this.port, host)
this.logger.info('server listening at %c', this.selfUrl)
ctx.emit(this, 'router/ready')
ctx.emit(this, 'server/ready')
}, true)

ctx.on('dispose', () => {
Expand All @@ -118,15 +124,18 @@ export class Router extends KoaRouter {
this._http?.close()
})

ctx.on<any>('event/router/ready', (ctx: Context, listener: Function) => {
if (!this[Context.filter](ctx) || !this.port) return
ctx.scope.ensure(async () => listener())
const self = this
ctx.on('internal/listener', function (name: string, listener: Function) {
if (name !== 'server/ready' || !self[Context.filter](this) || !self.port) return
this.scope.ensure(async () => listener())
return () => false
})

return ctx.server = Context.associate(this, 'server')
}

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

get selfUrl() {
Expand Down

0 comments on commit 5eb76b1

Please sign in to comment.