UNPKG

@aiot-toolkit/server

Version:

aiot server

3 lines (2 loc) 5.05 kB
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=createRouter;var _fs=_interopRequireDefault(require("fs")),_path=_interopRequireDefault(require("path")),_stream=require("stream"),_util=_interopRequireDefault(require("util")),_koaRouter=_interopRequireDefault(require("koa-router")),_koaSend=_interopRequireDefault(require("koa-send")),_jszip=_interopRequireDefault(require("jszip")),_sharedUtils=require("@aiot-toolkit/shared-utils"),_eventBus=_interopRequireDefault(require("@aiot-toolkit/shared-utils/event-bus")),_shared=require("./shared");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}const{PACKAGER_BUILD_DONE:PACKAGER_BUILD_DONE,PACKAGER_WATCH_START:PACKAGER_WATCH_START,PACKAGER_BUILD_PROGRESS:PACKAGER_BUILD_PROGRESS}=_eventBus.default,allowFiles=["sitemap.json","app-chunks.json","page-chunks.json"];function genWebJsUrl(e){return`https://statres.quickapp.cn/quickapp/ide/web${e=e?"-"+e:""}.js`}function jsonParse(e){try{return JSON.parse(e)}catch(e){console.error("Json Parse Error :",e)}}async function createRouter(e){const t=_util.default.debuglog("server.render"),r=new _koaRouter.default;let n=!1;t("preview target",e);_fs.default.existsSync(e)&&(n=_fs.default.lstatSync(e).isFile());const s=_util.default.promisify(_fs.default.readFile),a=_path.default.resolve(__dirname,"./views/page.html"),i=_path.default.resolve(__dirname,"./views/404.html"),o=new Map;let u,l,f;if(n){const t=await s(e);f=await _jszip.default.loadAsync(t),u=async function(){const t=f.file("manifest.json");if(!t)throw new _sharedUtils.KnownError(`Failed to read manifest.json from ${e}!`);return t.async("string").then(jsonParse)},l=function(e){return null!==f.file(e)}}else{const t=_path.default.resolve(e,"manifest.json");u=async function(){let r,n=o.get(t);if(n&&Date.now()-n.timestamp<2e3)r=n.payload;else{if(!_fs.default.existsSync(e))throw new _sharedUtils.KnownError("Can't find build directory");if(!_fs.default.existsSync(t))throw new _sharedUtils.KnownError("Cannot find manifest.json in the build directory");r=jsonParse(await s(t)),o.set(t,{timestamp:Date.now(),payload:r})}return r},l=function(t){return _fs.default.existsSync(_path.default.resolve(e,t))}}return r.get("/__stream",(async function(e){const t=new _stream.PassThrough;function r(){e.req.destroyed||(t.write("event: watch\n"),t.write("data: ''\n\n"))}function n(r){e.req.destroyed||(t.write("event: progress\n"),t.write(`data: ${JSON.stringify(r)}\n\n`))}function s(){if(!e.req.destroyed){const e=_sharedUtils.logger.get(),r=(0,_sharedUtils.getLaunchPage)(),n={error:escape((0,_shared.removeAnsiColor)(e)),page:r};t.write("event: reload\n"),t.write(`data: ${JSON.stringify(n)}\n\n`)}}function a(){e.res.end(),t.end(),_eventBus.default.off&&(_eventBus.default.off(PACKAGER_WATCH_START,r),_eventBus.default.off(PACKAGER_BUILD_PROGRESS,n),_eventBus.default.off(PACKAGER_BUILD_DONE,s))}_eventBus.default.on(PACKAGER_WATCH_START,r),_eventBus.default.on(PACKAGER_BUILD_PROGRESS,n),_eventBus.default.on(PACKAGER_BUILD_DONE,s),e.req.on("close",a),e.req.on("finish",a),e.req.on("error",a),e.type="text/event-stream",e.res.connection.setTimeout(0),t.write("event: start\n"),t.write("data: waing for signal\n\n"),e.body=t})),r.get("/",(async function(e,r){const n=await u();if(n&&n.router&&n.router.entry){t("preview home","entry",n.router.entry);const r=(0,_sharedUtils.getLaunchPage)()||n.router.entry;e.redirect(`/preview/${r}`)}else await r()})),r.get("/*",(async function(e,r){const n=await u(),s=await async function(e){let t={};if(e&&e.router&&e.router.pages){const r=e.router.pages;Object.keys(r).forEach((e=>{const n=(0,_shared.trimSlash)(e),s=(0,_shared.trimSlash)(r[e].component);t[n]=`${e}/${s}.js`}))}else new _sharedUtils.KnownError("Page routing information is not configured").__KNOWN=!0;return t}(n),o=Object.keys(s);let f=(0,_shared.trimSlash)(e.path);if(t("requestRoute",f,e.appRoutes),o.indexOf(f)>-1){const t=s[f],r=await(0,_shared.renderPage)(a,{title:n.name,routeName:f,routes:JSON.stringify(s),script:t,scriptNotFound:!l(t),webJsUrl:genWebJsUrl(e.conf.options.webVersion)});e.type="text/html",e.body=r}else if(await r(),404===e.status){if(f.endsWith(".js"))e.type="text/javascript",e.body=`/* 404 */console.log(new Error('Can't find ${f}'))`;else{const t=await(0,_shared.renderPage)(i,{message:`Can't find /preview/${f}`});e.type="text/html",e.body=t}e.status=404}})),n?r.get("/*",(async function(e,t){let r=(0,_shared.trimSlash)(e.path);const n=f.file(r);if(allowFiles.includes(r))return e.status=200,void(n&&(e.body=await n.nodeStream()));n?e.body=await n.nodeStream():(e.status=404,await t())})):r.get("/*",(async function(t,r){let n=(0,_shared.trimSlash)(t.path);if(allowFiles.includes(n)){const r=_path.default.join(e,n);if(_fs.default.existsSync(r))try{const e=require(r);t.type="json",t.body=e}catch(e){}t.status=200}else try{await(0,_koaSend.default)(t,n,{root:e})}catch(e){if(404!==e.status)throw console.error("Build Static File Error",e),e;await r()}})),r} //# sourceMappingURL=create-router.js.map