var path = require('path');
var fs = require('fs');
var {createHttpTerminator} = require('http-terminator');
require('./init_core_update.js')
add_action('_nv_init',()=>{
// 每次启动都清理temp
nv_remove_folder('./temp');
})
//钩子创建原生的内容
add_action('_nv_init',()=>{
add_action('init_express',()=>{
//前台(从主题里面去注册)
// register_static_url('/', path.join(process.cwd(),"./nv-frontpage/dist/") );
//后台
// !!!!!!!!!!!!!!!!!!!!!!!!!
// 如果要修改后台地址,那么,后台编译时也要修改 base
// !!!!!!!!!!!!!!!!!!!!!!!!!
register_static_url('/nv-admin', path.join(process.cwd(),"./nv-admin/"));
//上传文件夹
register_static_url('/uploads', path.join(process.cwd(),"./nv-content/uploads/") );
});
add_filter('rewrite_rules_array',arr=>{
arr.push({
from: /\/nv-admin/, to: '/nv-admin/index.html'
})
return arr;
});
require('./init_default_menu.js')
require('./init_default_api.js')
require('./init_default_routes_api.js')
require('./init_default_users_api.js')
require('./init_default_user_invite_api.js')
require('./init_default_options_api.js')
require('./init_default_mail_api.js')
require('./init_default_media_api.js')
require('./init_default_taxonomies_api.js')
require('./init_default_post_api.js')
require('./init_default_comments_api.js')
require('./init_default_theme_api.js')
require('./init_default_plugin_api.js')
require('./init_default_nav_menu_api.js')
require('./init_default_dashboard_api.js')
require('./init_default_theme_module_api.js')
require('./init_default_package_api.js')
require('./init_default_realtime_api.js')
require('./init_frontstage_api.js')
require('./hooks-media.js')
require('./hooks-user.js')
require('./hooks-comments.js')
require('./hooks-theme-module.js')
},0);
// plugins
add_action('_nv_init',()=>{
nv_create_dirs("./nv-plugins")
require('./init-plugins.js');
},5);
// theme
add_action('_nv_init',()=>{
nv_create_dirs("./nv-themes")
require('./init-theme.js');
});
//exoress
add_action('_nv_init',()=>{
do_action('init_express');
var compression = require('compression')
var cookieParser = require('cookie-parser');
var express = require('express');
var expressWs = require('express-ws');
var app = express();
expressWs(app); //将socket服务混入app,为app添加.ws方法
app.use(compression());
app.use(cookieParser());
do_action('register_client_side_render_router', app);
// 解析 application/json
app.use(express.json({limit: apply_filters('nv_express_limit_size','5mb') }));
//处理Static静态资源
const static_urls = require("./methods")._get_static_urls_options();
static_urls.forEach(opt=>{
var {url,dir} = opt;
app.use(url,express.static( dir ))
})
function send_json(res, data, req, methods, namespace, route) {
data = apply_filters(`rest_send_${methods}:/${namespace}${route ? `/${route}`: ''}`, data, req);
res.json( is_nv_error(data) ? {
error: data.message,
error_code: data.code,
} : data);
}
//定义rest api
const rest_routes = require("./methods")._get_rest_routes_options();
rest_routes.forEach(opt=>{
var {namespace,route,methods,callback,permission_callback} = opt;
app[methods](`/${namespace}${route ? `/${route}`: ''}`, (req,res)=>{
// 预过滤处理req,包含header、body等信息
req = apply_filters(`rest_request_${methods}:/${namespace}${route ? `/${route}`: ''}`, req);
/*console.log(req.ip)
console.log(req.headers['user-agent'])*/
if (typeof(permission_callback) == 'function') {
var result = get_user_by_nonce(req.header('nvnonce'));
var user = is_nv_error(result) ? {} : result;
if ( !permission_callback(user.power || 0) ) {
res.status(401);
res.json({message: 'Permission declined!'});
return;
}
}
var data = methods == 'get' ? req.query : req.body;
var result = callback(data, req, res);
if ( result !== null
&& typeof(result) == 'object'
&& typeof(result.then) == 'function'
&& typeof(result.catch) == 'function'
&& typeof(result.finally) == 'function'
) {
// 是 promise, 采用异步回调。
result
.then(promise_data => {
send_json(res, promise_data, req, methods, namespace, route)
})
.catch(promise_err => {
send_json(
res,
new NV_Error(`${promise_err.name ? promise_err.name+": " : ''}${promise_err.message}`, promise_err.code),
req,methods, namespace, route
);
})
}
else if (result !== undefined) {
// 同步
send_json(res, result, req, methods, namespace, route)
return;
}
})
})
//定义socket api
const socket_routes = require("./methods")._get_socket_routes_options();
socket_routes.forEach(opt=>{
var {namespace,route,methods,callback,permission_callback} = opt;
app.ws(`/${namespace}${route ? `/${route}`: ''}`, (ws, req)=>{
if (typeof(permission_callback) == 'function') {
var result = get_user_by_nonce( req.headers['sec-websocket-protocol'] );
var user = is_nv_error(result) ? {} : result;
if ( !permission_callback(user.power || 0) ) {
ws.close(4010,'Permission declined!')
return;
}
}
callback(ws, req);
})
})
do_action('register_server_side_render_router', app);
},20);