Browse Source

优化项目结构,优化构建脚本,优化README.MD

master
Qumolama.d 2 months ago
parent
commit
bd8b866f07
Signed by: Lama3L9R
GPG Key ID: 1762AFC05157CE18
  1. 16
      .drone.yml
  2. 56
      README.MD
  3. 18
      build.js
  4. 37
      src/config.js
  5. 22
      src/index.js
  6. 33
      src/routes/authenticate.js

16
.drone.yml

@ -7,12 +7,12 @@ kind: pipeline
name: test
steps:
- name: installgit p
- name: test
image: node:16
commands:
- yarn install
- yarn test
- name: telgram_notify
- name: notify
image: appleboy/drone-telegram
when:
status:
@ -25,19 +25,19 @@ steps:
format: markdown
message: >
{{#success build.status}}
✅ `{{repo.name}}` #{{build.number}} 号构建测试已通过 .
📝 {{commit.author}} 在 `{{commit.branch}}` 的提交:
✅ `{{repo.name}}` #{{build.number}} 号构建测试已通过\n
📝 {{commit.author}} 在 `{{commit.branch}}` 的提交:\n
```
{{commit.message}}
```
🌐 {{ build.link }}
\n🌐 {{ build.link }}
{{else}}
❌ `{{repo.name}}` #{{build.number}} 号构建测试已失败 .
📝 {{commit.author}} 在 `{{commit.branch}}` 的提交:
❌ `{{repo.name}}` #{{build.number}} 号构建测试已失败\n
📝 {{commit.author}} 在 `{{commit.branch}}` 的提交:\n
```
{{commit.message}}
```
🌐 {{ build.link }}
\n🌐 {{ build.link }}
{{/success}}

56
README.MD

@ -2,26 +2,31 @@
老色批世界树 —— 一个高性能麻将、奥苏力不-印寨克托接口的实现。使用fastify来把处理速度加速到老色批的速度(
具体有多快呢?登录处理从数据包发出到接收到服务端响应仅需要 __***6ms***__(根据机器不同可能会有浮动,以实际情况为准)!
[![996.icu](https://img.shields.io/badge/link-996.icu-red.svg)](https://996.icu)
[![LICENSE](https://img.shields.io/badge/license-Anti%20996-blue.svg)](https://github.com/996icu/996.ICU/blob/master/LICENSE)
[![Build Status](https://ci.186526.xyz/api/badges/Lama3L9R/lsp-yggdrasil/status.svg)](https://ci.186526.xyz/Lama3L9R/lsp-yggdrasil)
---
TODO:
## 开发计划:
- [ ] Basic API
#### Beta 1.0:
- [ ] 基础世界树 API
+ [x] /authserver
+ [ ] /sessionserver
+ [ ] /api
- [ ] Advanced API
- [ ] Skin uploading & security checks for texture
+ [ ] Texture RSAsigning
- [ ] S3 Storage backend
- [ ] Server status
- [ ] Authlib meta
- [ ] Telegram Bot
- [ ] Unit test
- [ ] 进阶 API
- [ ] 皮肤上传和安全检查
+ [ ] 皮肤数据的RSA签名
- [ ] 兼容S3后端
- [ ] 服务器状态接口
- [ ] authlib-injector 元数据接口
#### Release 1.0
- [ ] TGbot前端
- [ ] 单元测试
+ [ ] API
- [ ] /authserver
- [ ] /sessionserver
@ -29,16 +34,29 @@ TODO:
- [ ] Advanced API
+ [ ] Utils
## WIP
#### 未来的版本:
- [ ] 完整 web 管理
---
## 使用方法
1. 安装Node.js、yarn、并下载源代码
+ 推荐 Node.js 版本:`16.15.0 LTS (Latest LTS)`,最低兼容 `14 LTS`
+ 使用 `$ npm install -g yarn` 来安装yarn
+ 使用 `$ git clone https://git.186526.xyz/Lama3L9R/lsp-yggdrasil.git` 下载源代码
2. 使用 `$ yarn install` 安装依赖库
3. 配置 `src/config.js`
4. 使用 `$ node build.js` 创建运行时构建
5. 使用 `$ node path/to/lsp-yggdrasil.full.cjs` 起飞
推荐 Node.js 版本:`16.15.0 LTS (Latest LTS)`
## 常见问题
*因为魔法,在 Node14 也能跑*
- Q:支持 `https` 嘛?
- A:不支持,请使用反代来使用`https`,或者您也可以修改 `index.js` 中初始化代码。
构建方法
```
$ yarn install && node ./build.js
```
## 内置的 yarn 指令
**记得手动复制`config.js`!放在和主程序一个目录就行,构建完了看`./production`**
**因为我设置了项目为`module`,构建出来的是`cjs`因此不能直接在项目目录下跑,扔到别的地方跑**
+ `dev` —— 启动开发环境服务器
+ `test` —— 单元测试

18
build.js

@ -3,9 +3,11 @@ import exec from 'shelljs.exec'
const productionVersion = "1.0"
const build = exec('git log -n 1 --pretty=format:"%h on %as with key %GK"', { async: false }).stdout
const build = exec('git log -n 1 --pretty=format:"%h-%GK"', { async: false }).stdout
const type = exec('git log -n 1 --pretty=format:"%D"', { async: false }).stdout
const buildDate = new Date().toTimeString()
const banner = `
==========================================================================
__ _____ ______ __ __ _ __
@ -24,18 +26,22 @@ const banner = `
`
console.log(banner)
console.log("Creating a production build...")
if(type.indexOf('stable') === -1) {
console.warn("⚠ 警告: 此版本不是正式版,运行可能会存在性能、安全、稳定度等严重风险,请谨慎使用!\n")
}
console.log("正在创建运行时文件...")
esbuild.build({
entryPoints: ['./src/index.js'],
outfile: './production/lsp-yggdrasil.full.js',
outfile: './production/lsp-yggdrasil.full.cjs',
bundle: true,
platform: 'node',
target: 'es2018',
external: ['./config.js'],
banner: {
js: `/*\n${banner}\n*/`
js: `/*\n${banner}\n*/;const PROGRAM_PRODUCTION = true;`
},
}).then(() => {
console.log("Done! Enjoy the yggdrasil server as FAST as LSP")
console.log("一份运行时文件已保存在 production/lsp-yggdrasil.full.js,您可以尽情的体验和LSP一样快的世界树服务器了!")
})

37
src/config.js

@ -1,23 +1,38 @@
const defaultPrehandler = async function (req, rep) { }
export const config = {
database: {
database: { // MONGODB IS THE BEST DATABASE
url: 'mongodb://localhost:27017/yggdrasil?readPreference=primary&appname=MongoDB%20Compass&directConnection=true&ssl=false',
},
server: {
port: 3000,
url: '',
port: 3000
},
signing: {
signing: { // 签名材质信息使用
public: '/path/to/public.pem',
private: '/path/to/private.key'
},
custom: {
overridePrehandler: (url) => {
return defaultPrehandler
override: {
preHandler: {
/*
"/example/route": async function(req, rep) {}
*/
},
handler: {
/*
"/example/route": async function(req, rep) {}
*/
}
},
preHooks: (fastify) => {},
preRouting: (fastify) => {},
postRouting: (fastify) => {},
preHooks: (fastify) => {}, // 在这里添加自定义hook
preRouting: (fastify) => {}, // 在这里添加自定义路由
postRouting: (fastify) => {}, // IDK what u want to do at here
}
}
export function getOverrideHandler(route) {
return config.custom.override.handler[route]
}
export function getOverridePreHandler(route) {
return config.custom.override.preHandler[route]
}

22
src/index.js

@ -3,6 +3,21 @@ import { mongoose } from 'mongoose'
import { registerModels } from './models/index.js';
import * as Hooks from './hooks.js'
import * as AuthenticateRoutings from './routes/authenticate.js'
import { config } from './config.js'
console.log(`
================================================================
__ _____ ______ __ __ _ __
/ / / ___// __ \\ \\/ /___ _____ _____/ /________ ______(_) /
/ / \\__ \\/ /_/ /\\ / __ \`/ __ \`/ __ / ___/ __ \`/ ___/ / /
/ /______/ / ____/ / / /_/ / /_/ / /_/ / / / /_/ (__ ) / /
/_____/____/_/ /_/\\__, /\\__, /\\__,_/_/ \\__,_/____/_/_/
/____//____/
================================================================\n`)
if(typeof PROGRAM_PRODUCTION === 'undefined') {
console.warn("⚠ 警告: 您运行的不是正式版本,可能会不稳定,仅限开发环境运行!\n")
}
export const server = fastify({
logger: {
@ -14,10 +29,6 @@ export const server = fastify({
//export const logger = server.log
;(async () => {
const { config } = await import('./config.js')
server.decorate('conf', config)
const mongooseClient = await mongoose.connect(config.database.url)
const models = registerModels(mongooseClient)
@ -28,11 +39,14 @@ export const server = fastify({
server.addHook('preHandler', Hooks.headerValidation)
config.custom.preRouting(server)
// Authserver routings
server.route(AuthenticateRoutings.authenticate)
server.route(AuthenticateRoutings.refresh)
server.route(AuthenticateRoutings.validate)
server.route(AuthenticateRoutings.invalidate)
server.route(AuthenticateRoutings.signout)
config.custom.postRouting(server)
/*

33
src/routes/authenticate.js

@ -1,6 +1,7 @@
import * as PlayerModel from '../models/player.js'
import { createHash } from 'crypto'
import { generateToken, uuidToNoSymboUUID } from '../generator.js'
import { getOverrideHandler, getOverridePreHandler } from '../config.js'
export const authenticate = {
method: 'POST',
@ -46,7 +47,7 @@ export const authenticate = {
},
"availableProfiles": {
"type": "array",
"items": [{...PlayerModel.PlayerSeriliazationSchema}]
"items": [PlayerModel.PlayerSeriliazationSchema]
},
"selectedProfile": PlayerModel.PlayerSeriliazationSchema,
"user": PlayerModel.PlayerAccountSerializationSchema
@ -54,10 +55,8 @@ export const authenticate = {
}
}
},
preHandler: async function(req, rep) {
this.conf.custom.overridePrehandler('/authserver/authenticate', req, rep)
},
handler: async function (req, rep) {
preHandler: getOverridePreHandler("/authserver/authenticate"),
handler: getOverrideHandler("/authserver/authenticate") ?? async function (req, rep) {
let { username, password, clientToken, requestUser, agent } = req.body
if(!username || !password || !agent || agent.name.toLowerCase() !== 'minecraft') {
@ -185,10 +184,8 @@ export const refresh = {
}
}
},
preHandler: async function(req, rep) {
this.conf.custom.overridePrehandler('/authserver/refresh', req, rep)
},
handler: async function (req, rep) {
preHandler: getOverridePreHandler("/authserver/refresh"),
handler: getOverrideHandler("/authserver/authenticate") ?? async function (req, rep) {
const { accessToken, clientToken, requestUser, selectedProfile } = req.body
const query = {
@ -320,10 +317,8 @@ export const validate = {
}
}
},
preHandler: async function(req, rep) {
this.conf.custom.overridePrehandler('/authserver/validate', req, rep)
},
handler: async function (req, rep) {
preHandler: getOverridePreHandler("/authserver/validate"),
handler: getOverrideHandler("/authserver/validate") ?? async function (req, rep) {
const { accessToken, clientToken } = req.body
const query = {
@ -380,10 +375,8 @@ export const invalidate = {
}
}
,
preHandler: async function(req, rep) {
this.conf.custom.overridePrehandler('/authserver/invalidate', req, rep)
},
handler: async function (req, rep) {
preHandler: getOverridePreHandler("/authserver/invalidate"),
handler: getOverrideHandler("/authserver/authenticate") ?? async function (req, rep) {
const { accessToken } = req.body
const { modifiedCount } = await this.models.Token.updateOne({
@ -428,10 +421,8 @@ export const signout = {
}
}
},
preHandler: async function(req, rep) {
this.conf.custom.overridePrehandler('/authserver/logout', req, rep)
},
handler: async function (req, rep) {
preHandler: getOverridePreHandler("/authserver/signout"),
handler: getOverrideHandler("/authserver/signout") ?? async function (req, rep) {
const { username, password } = req.body
const player = await this.models.Player.findOne({ email: username, password: createHash('sha256').update(password).digest().toString('hex').toLowerCase() })

Loading…
Cancel
Save