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.
 
 
 
 
 

160 lines
5.9 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
// const { id } = request.auth.credentials;
// loggerSite.debug(`${isLogin?'当前登录ID:'+id:'未登录用户'}, 请求路径:${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>