onions-node
Version:
onions-node backend
93 lines (86 loc) • 2.37 kB
JavaScript
const express = require('express')
const url = require('url')
const multer = require('multer')
const apiProxy = require('@razor-node/api-proxy')
module.exports = (proxies, config, logger) => {
const storage = multer.memoryStorage()
const upload = multer({
storage,
})
const {appInfo} = config
const createProxyOptions = (options = {}) => {
return {
appInfo,
logger: logger,
logLimit: 50000,
needSign: true,
beforeRequest(config) {
logger.info(`START PROXY REQUEST=> ${JSON.stringify(config)}`)
return config;
},
...options
}
}
const noSignProxyOptions = {
logger: logger,
logLimit: 50000,
needSign: false,
beforeRequest(config) {
logger.info(`START PROXY REQUEST=> ${JSON.stringify(config)}`)
return config;
}
}
const router = new express.Router()
Object.keys(proxies).forEach(key => {
let proxyConfig = proxies[key]
if (typeof proxyConfig === 'string') {
const urlObject = url.parse(proxyConfig)
proxyConfig = {
signType: 'swc',
url: proxyConfig,
domain: `${urlObject.origin}`
}
}
const {options = {}} = proxyConfig
let urlPrefix = `/${key}/*`
switch (proxyConfig.signType) {
case 'swc':
router.use(urlPrefix, upload.any(), apiProxy(proxyConfig.url, {
...createProxyOptions({}),
...options,
}))
break
case 'keeper':
if (!config.keeperAppInfo) {
throw new Error('ProxyError: KeeperAppInfo is required')
}
router.use(urlPrefix, upload.any(), apiProxy(proxyConfig.url, {
...createProxyOptions({
needSign: true,
signType: 'do',
signRemoveEmptyParams: true,
appInfo: config.keeperAppInfo,
}),
...options,
}))
break
case 'uds':
router.use(urlPrefix, upload.any(), apiProxy(proxyConfig.url, {
...createProxyOptions({
needSign: true,
signType: 'uds',
signRemoveEmptyParams: true,
}),
...options,
}))
break
default:
router.use(urlPrefix, upload.any(), apiProxy(proxyConfig.url, {
...noSignProxyOptions,
...options
}))
break
}
})
return router
}