ziron-server
Version:
1 lines • 1.47 kB
JavaScript
;Object.defineProperty(exports,"__esModule",{value:!0});const path_1=require("path"),fs_1=require("fs"),MimeLockup_1=require("./MimeLockup");class StaticFilesRouter{constructor(){this.files={},this.customContentTypeResolutionMap={}}file(e,t,i){if(t?"/"!==t[0]&&(t="/"+t):t="/"+(0,path_1.basename)(e),!i&&null!=this.files[t])throw new Error(`Error pattern already used for file: ${this.files[t]}.`);this.files[t]={path:e,contentType:(0,MimeLockup_1.lockupMimeType)(e,this.customContentTypeResolutionMap)}}folder(e,t="",i={}){if(null==i.linkIndex&&(i.linkIndex=!0),!(0,fs_1.statSync)(e).isDirectory())throw Error("Given folder path is not a directory: "+e);"/"!==t[0]&&(t="/"+t),"/"===t[t.length-1]&&(t=t.slice(0,-1)),(0,fs_1.readdirSync)(e).forEach(r=>{const s=(0,path_1.join)(e,r);(0,fs_1.statSync)(s).isDirectory()?this.folder(s,`${t}/${r}`,i):i.filter&&!i.filter(s)||(i.linkIndex&&"index"===r.split(".")[0].toLowerCase()&&this.file(s,t,i.override),this.file(s,`${t}/${r}`,i.override))})}handle(e,t){if("get"===e.getMethod()){const i=decodeURI(e.getUrl()),r=this.files[i];if(null!=r)return null!=r.contentType&&(t.headers["content-type"]=r.contentType),t.writeFile(r.path,{"if-modified-since":e.getHeader("if-modified-since"),range:e.getHeader("range"),"accept-encoding":e.getHeader("accept-encoding")},!0);if(i.endsWith("/")&&null!=this.files[i.slice(0,-1)])return t.redirect(i.slice(0,-1)),Promise.resolve()}return!1}}exports.default=StaticFilesRouter;