core: add server-loader (#816)

This commit is contained in:
undefined authored and GitHub committed 2024-06-03 19:29:41 +08:00
1 parent 3302480348
commit 97720efb65
57 files changed
+1328 -1131

No files matched your search

+6 -41
View File
@@ -1,11 +1,10 @@
import { PassThrough } from 'stream';
import type { Next } from 'koa';
import { cloneDeep, omit, pick } from 'lodash';
import { cloneDeep, omit } from 'lodash';
import type { KoaContext } from '@hydrooj/framework';
import { randomPick } from '@hydrooj/utils';
import { PERM } from '../../model/builtin';
import * as system from '../../model/system';
import token from '../../model/token';
import type { HydroRequest, HydroResponse, KoaContext } from '../server';
export interface UiContextBase {
cdn_prefix: string;
@@ -21,41 +20,6 @@ export const UiContextBase: UiContextBase = {
export default async (ctx: KoaContext, next: Next) => {
// Base Layer
const { domainId, domainInfo } = ctx;
const [xff, xhost] = system.getMany(['server.xff', 'server.xhost']);
const request: HydroRequest = {
method: ctx.request.method.toLowerCase(),
host: ctx.request.headers[xhost?.toLowerCase() || ''] as string || ctx.request.host,
hostname: ctx.request.hostname,
ip: ctx.request.headers[xff?.toLowerCase() || ''] as string || ctx.request.ip,
headers: ctx.request.headers,
cookies: ctx.cookies,
...pick(ctx, ['query', 'path', 'params', 'originalPath', 'querystring']),
body: ctx.request.body,
files: ctx.request.files as any,
referer: ctx.request.headers.referer || '',
json: (ctx.request.headers.accept || '').includes('application/json'),
websocket: ctx.request.headers.upgrade === 'websocket',
};
request.ip = request.ip.split(',')[0].trim();
const response: HydroResponse = {
body: {},
type: '',
status: null,
template: null,
redirect: null,
attachment: (name, streamOrBuffer) => {
ctx.attachment(name);
if (streamOrBuffer instanceof Buffer) {
response.body = null;
ctx.body = streamOrBuffer;
} else {
response.body = null;
ctx.body = streamOrBuffer.pipe(new PassThrough());
}
},
addHeader: (name: string, value: string) => ctx.set(name, value),
disposition: null,
};
const args = {
domainId, ...ctx.params, ...ctx.query, ...ctx.request.body, __start: Date.now(),
};
@@ -68,9 +32,9 @@ export default async (ctx: KoaContext, next: Next) => {
}
UiContext.domainId = domainId;
UiContext.domain = domainInfo;
ctx.HydroContext = {
request, response, UiContext, domain: domainInfo, user: null, args,
};
ctx.HydroContext.UiContext = UiContext;
ctx.HydroContext.domain = domainInfo;
ctx.HydroContext.args = args;
const header = ctx.request.headers.authorization;
const sid = header
? header.split(' ')[1] // Accept bearer token
@@ -78,6 +42,7 @@ export default async (ctx: KoaContext, next: Next) => {
const session = sid ? await token.get(sid instanceof Array ? sid[0] : sid, token.TYPE_SESSION) : null;
ctx.session = Object.create(session || { uid: 0, scope: PERM.PERM_ALL.toString() });
await next();
const request = ctx.HydroContext.request;
const ua = request.headers['user-agent'] || '';
if (!ctx.session.uid && system.get('server.ignoreUA').replace(/\r/g, '').split('\n').filter((i) => i && ua.includes(i)).length) return;
const expireSeconds = ctx.session.save