diff --git a/lib/app.js b/lib/app.js new file mode 100644 index 000000000..112045167 --- /dev/null +++ b/lib/app.js @@ -0,0 +1,80 @@ +require('dotenv').config(); +require('module-alias/register'); +require('./utils/request-wrapper'); + +const Koa = require('koa'); +const logger = require('./utils/logger'); + +const onerror = require('./middleware/onerror'); +const header = require('./middleware/header'); +const utf8 = require('./middleware/utf8'); +const cache = require('./middleware/cache'); +const parameter = require('./middleware/parameter'); +const template = require('./middleware/template'); +const favicon = require('koa-favicon'); +const debug = require('./middleware/debug'); +const accessControl = require('./middleware/access-control'); + +const router = require('./router'); +const protected_router = require('./protected_router'); +const mount = require('koa-mount'); + +// API related +const apiTemplate = require('./middleware/api-template'); +const api_router = require('./api_router'); +const apiResponseHandler = require('./middleware/api-response-handler'); + +process.on('uncaughtException', (e) => { + logger.error('uncaughtException: ' + e); +}); + +const app = new Koa(); +app.proxy = true; + +// favicon +app.use(favicon(__dirname + '/favicon.png')); + +// global error handing +app.use(onerror); + +// 1 set header +app.use(header); + +app.use(accessControl); + +// 6 debug +app.context.debug = { + hitCache: 0, + request: 0, + paths: [], + routes: [], + ips: [], + errorPaths: [], + errorRoutes: [], +}; +app.use(debug); + +// 5 fix incorrect `utf-8` characters +app.use(utf8); + +app.use(apiTemplate); +app.use(apiResponseHandler()); + +// 4 generate body +app.use(template); +// 3 filter content +app.use(parameter); + +// 2 cache +app.use(cache(app)); + +// router +app.use(mount('/', router.routes())).use(router.allowedMethods()); + +// routes the require authentication +app.use(mount('/protected', protected_router.routes())).use(protected_router.allowedMethods()); + +// API router +app.use(mount('/api', api_router.routes())).use(api_router.allowedMethods()); + +module.exports = app; diff --git a/lib/index.js b/lib/index.js index 90a3088f4..d2421bc18 100644 --- a/lib/index.js +++ b/lib/index.js @@ -1,95 +1,16 @@ -require('dotenv').config(); -require('module-alias/register'); +const app = require('./app'); const config = require('./config'); -const Koa = require('koa'); const fs = require('fs'); const logger = require('./utils/logger'); -require('./utils/request-wrapper'); - -const onerror = require('./middleware/onerror'); -const header = require('./middleware/header'); -const utf8 = require('./middleware/utf8'); -const cache = require('./middleware/cache'); -const parameter = require('./middleware/parameter'); -const template = require('./middleware/template'); -const favicon = require('koa-favicon'); -const debug = require('./middleware/debug'); -const accessControl = require('./middleware/access-control'); - -const router = require('./router'); -const protected_router = require('./protected_router'); -const mount = require('koa-mount'); - -// API related - -const apiTemplate = require('./middleware/api-template'); -const api_router = require('./api_router'); -const apiResponseHandler = require('./middleware/api-response-handler'); const cluster = require('cluster'); const numCPUs = require('os').cpus().length; -if (cluster.isMaster && config.enableCluster && process.env.NODE_ENV !== 'test' && process.env.NODE_ENV !== 'dev') { +if (config.enableCluster && cluster.isMaster && process.env.NODE_ENV !== 'test' && process.env.NODE_ENV !== 'dev') { for (let i = 0; i < numCPUs; i++) { cluster.fork(); } } else { - process.on('uncaughtException', (e) => { - logger.error('uncaughtException: ' + e); - }); - - logger.info('🎉 RSSHub start! Cheers!'); - - const app = new Koa(); - app.proxy = true; - - // favicon - app.use(favicon(__dirname + '/favicon.png')); - - // global error handing - app.use(onerror); - - // 1 set header - app.use(header); - - app.use(accessControl); - - // 6 debug - app.context.debug = { - hitCache: 0, - request: 0, - paths: [], - routes: [], - ips: [], - errorPaths: [], - errorRoutes: [], - }; - app.use(debug); - - // 5 fix incorrect `utf-8` characters - app.use(utf8); - - app.use(apiTemplate); - app.use(apiResponseHandler()); - - // 4 generate body - app.use(template); - // 3 filter content - app.use(parameter); - - // 2 cache - app.use(cache(app)); - - // router - app.use(mount('/', router.routes())).use(router.allowedMethods()); - - // routes the require authentication - app.use(mount('/protected', protected_router.routes())).use(protected_router.allowedMethods()); - - // API router - app.use(mount('/api', api_router.routes())).use(api_router.allowedMethods()); - - // connect let server; if (config.connect.socket) { if (fs.existsSync(config.connect.socket)) { @@ -107,9 +28,7 @@ if (cluster.isMaster && config.enableCluster && process.env.NODE_ENV !== 'test' logger.info('Listening Port ' + config.connect.port); } - module.exports = { - server: server, - app: app, - cache: app.context.cache.client, - }; + logger.info('🎉 RSSHub start! Cheers!'); + + module.exports = server; } diff --git a/lib/pkg.js b/lib/pkg.js new file mode 100644 index 000000000..c2f316342 --- /dev/null +++ b/lib/pkg.js @@ -0,0 +1,21 @@ +const app = require('./app'); + +const pkg = (path) => + new Promise((resolve) => { + app.callback()( + { + url: path, + method: 'GET', + headers: {}, + socket: {}, + }, + { + setHeader: () => {}, + end: (data) => { + resolve(data); + }, + } + ); + }); + +module.exports = pkg; diff --git a/package.json b/package.json index fecd3d9c2..373da57a8 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "rsshub", - "version": "0.0.1", + "version": "1.0.0", "description": "Make RSS Great Again!", - "main": "lib/index.js", + "main": "lib/pkg.js", "scripts": { "start": "node lib/index.js", "dev": "cross-env NODE_ENV=dev nodemon --inspect lib/index.js", diff --git a/test/middleware/access-control.js b/test/middleware/access-control.js index a99b68908..a193aee70 100644 --- a/test/middleware/access-control.js +++ b/test/middleware/access-control.js @@ -21,7 +21,7 @@ afterEach(() => { describe('access-control', () => { it(`blacklist`, async () => { process.env.BLACKLIST = '/test/1,233.233.233.233'; - server = require('../../lib/index').server; + server = require('../../lib/index'); const request = supertest(server); const response11 = await request.get('/test/1'); @@ -39,7 +39,7 @@ describe('access-control', () => { it(`whitelist`, async () => { process.env.WHITELIST = '/test/1,233.233.233.233'; - server = require('../../lib/index').server; + server = require('../../lib/index'); const request = supertest(server); const response11 = await request.get('/test/1'); diff --git a/test/middleware/cache.js b/test/middleware/cache.js index 55be95491..c16f70138 100644 --- a/test/middleware/cache.js +++ b/test/middleware/cache.js @@ -22,7 +22,7 @@ afterAll(() => { describe('cache', () => { it('memory', async () => { process.env.CACHE_TYPE = 'memory'; - server = require('../../lib/index').server; + server = require('../../lib/index'); const request = supertest(server); const response1 = await request.get('/test/cache'); @@ -54,7 +54,7 @@ describe('cache', () => { expect(parsed3.items[0].content).toBe('Cache1'); expect(parsed4.items[0].content).toBe('Cache2'); - const app = require('../../lib/index').app; + const app = require('../../lib/app'); await app.context.cache.set('mock', undefined); expect(await app.context.cache.get('mock')).toBe(''); @@ -68,7 +68,7 @@ describe('cache', () => { it('redis', async () => { process.env.CACHE_TYPE = 'redis'; - server = require('../../lib/index').server; + server = require('../../lib/index'); const request = supertest(server); const response1 = await request.get('/test/cache'); @@ -100,7 +100,7 @@ describe('cache', () => { expect(parsed3.items[0].content).toBe('Cache1'); expect(parsed4.items[0].content).toBe('Cache2'); - const app = require('../../lib/index').app; + const app = require('../../lib/app'); await app.context.cache.set('mock1', undefined); expect(await app.context.cache.get('mock1')).toBe(''); await app.context.cache.set('mock2', '2'); @@ -110,8 +110,8 @@ describe('cache', () => { it('redis with quit', async () => { process.env.CACHE_TYPE = 'redis'; - server = require('../../lib/index').server; - const client = require('../../lib/index').cache; + server = require('../../lib/index'); + const client = require('../../lib/app').context.cache.client; await client.quit(); const request = supertest(server); @@ -132,7 +132,7 @@ describe('cache', () => { it('redis with error', async () => { process.env.CACHE_TYPE = 'redis'; process.env.REDIS_URL = 'redis://wrongpath:6379'; - server = require('../../lib/index').server; + server = require('../../lib/index'); const request = supertest(server); const response1 = await request.get('/test/cache'); @@ -151,7 +151,7 @@ describe('cache', () => { it('no cache', async () => { process.env.CACHE_TYPE = ''; - server = require('../../lib/index').server; + server = require('../../lib/index'); const request = supertest(server); const response1 = await request.get('/test/cache');