You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

155 lines
5.2 KiB

import filePlugin from "./file-plugin";
import path from "path";
import { baseDir, sourceDir } from "@/util";
import { plugin as routePlugin } from "@noderun/hapi-router";
import {ServerRegisterPluginObject, Plugin, Server, Request, ResponseObject} from "@hapi/hapi"
import Hoek from "@hapi/hoek"
import HapiYar from "@hapi/yar";
import HapiCrumb from "@hapi/crumb"
import { Stream } from "stream";
import HapiPino from "hapi-pino";
const pino = require('pino')
const transport = pino.transport({
targets: [
// process.env.NODE_ENV !== 'production' ? {
// target: 'pino-pretty',
// options: {
// colorize: true,
// translateTime: 'HH:MM:ss.l mmmm dS yyyy "UTC"'
// },
// level: 'info' } : { target: 'pino/file', level: 'info' },
{ target: 'pino-pretty', level: 'trace', options: {
destination: path.resolve(baseDir, "./log/pino.log"),
colorize: true,
translateTime: 'HH:MM:ss.l mmmm dS yyyy "UTC"',
mkdir: true,
// append: false
}}
// { target: 'pino/file', level: 'trace', options: {
// destination: path.resolve(baseDir, "./log/pino.log"),
// mkdir: true,
// // append: false
// }}
]
})
export default [
{
plugin: HapiPino,
options: {
logPayload: true,
logQueryParams: true,
logPathParams: true,
logRouteTags: true,
// logRequestStart: true,
instance: pino(transport),
ignoreFunc: (options, request) => {
return request.path.startsWith('/public') || request.path.startsWith('/404')
},
// stream: fs.createWriteStream(path.resolve(baseDir, "./log/pino.log"), { encoding: "utf-8" })
// prettyPrint: process.env.NODE_ENV !== 'production',
// Redact Authorization headers, see https://getpino.io/#/docs/redaction
// redact: ['req.headers.cookie']
}
},
{
plugin: filePlugin as unknown as Plugin<any>,
},
{
plugin: routePlugin as Plugin<any>,
options: {
auth: ['/api'],
sourceDir: [
// {
// dir: path.resolve(sourceDir, "route/api"),
// prefix: "api"
// },
{
dir: path.resolve(sourceDir, "route/htmx"),
prefix: "htmx"
},
{
dir: path.resolve(sourceDir, "route/views"),
prefix: ""
},
],
type: "session"
},
},
{
plugin: {
name: "flash",
version: "0.0.1",
// https://github.com/hks-epod/paydash/blob/master/lib/flash.js
register: function (server: Server, options) {
server.ext('onPreResponse', async function(request: Request, h) {
// @ts-ignore
if(request.response.variety === "file") return h.continue; // 返回文件时不处理
if(request.path.startsWith("/api") || request.path.startsWith("/htmx")) return h.continue;
// 需要设置auth是try或者true才行
const isLogin = request.auth.isAuthenticated;
loggerSite.debug(`是否登录:${isLogin}, 请求路径:${request.path}, 请求方法:${request.method}`)
// @ts-ignore
// console.log(isLogin, request.path, request.response.variety);
// let user;
// if(isLogin){
// const { id } = request.auth.credentials;
// const User = request.getModel("User")
// user = <any>await User.findOne({ where: { id: id } });
// user = user.toJSON();
// delete user.password;
// }
// @ts-ignore
if (request.yar && request.yar.flash && request.response.variety === 'view') {
var flash = request.yar.flash();
request.yar.set('_flash', {});
// @ts-ignore
request.response.source.context = Hoek.applyToDefaults(
{
flash: !!Object.keys(flash).length?flash:false,
isLogin: isLogin,
user: isLogin?request.auth.credentials:false,
},
// @ts-ignore
request.response.source.context
);
// @ts-ignore
}
return h.continue;
});
}
} as Plugin<any>
},
{
plugin: HapiYar,
options: {
name: "yar",
storeBlank: false,
cookieOptions: {
password: "dsRhw1Y5UZqB8SjfClbkrX9PF7yuDMV3JItcW0G4vgpaxONo6mzenHLQET2AiKyPUjjdgjo10amjfghy",
path: '/',
isSecure: false
}
}
},
{
plugin: HapiCrumb,
options: {
autoGenerate: true,
logUnauthorized: true,
skip: function(request, reply) {
// 流的话直接通过,不需要验证,主要用于传递form-data数据时这里通不过
if(request.payload instanceof Stream){
return true
}
return false;
},
cookieOptions: {
path: '/',
isSecure: false
}
}
},
] as unknown as ServerRegisterPluginObject<any>;