UNPKG

1.79 kBPlain TextView Raw
1import express = require("express");
2import { createReadStream } from "fs";
3import { IPackInfoModule } from "neweb-pack";
4export interface IModuleServerConfig {
5 modulesPath: string;
6}
7class ModuleServer {
8 constructor(protected config: IModuleServerConfig) {
9
10 }
11 public handle = async (req: express.Request, res: express.Response) => {
12 // app.get("/modules/:type/:name/:version.js", async (req, res) => {
13 const { type, name: xName, version } = req.params;
14 const name = xName.replace(/~/gi, "/");
15 try {
16 const mod = {
17 name,
18 type,
19 version: version === "*" ? undefined : version,
20 };
21 const moduleStream = await this.getModuleContentStream(mod);
22 moduleStream.on("error", (e) => {
23 if (e.toString().indexOf("ENOENT") > -1) {
24 res.status(404).send("Not found module::" + JSON.stringify(mod));
25 return;
26 }
27 res.status(500).send(e.toString());
28 });
29 moduleStream.on("open", () => {
30 res.writeHead(200, {
31 "Content-Type": "application/json",
32 });
33 moduleStream.pipe(res);
34 });
35 moduleStream.on("close", () => {
36 res.end();
37 });
38 } catch (e) {
39 res.status(500).send(e.toString());
40 }
41 // });
42 }
43 protected async getModuleContentStream(moduleInfo: IPackInfoModule) {
44 return createReadStream(this.config.modulesPath + "/" + moduleInfo.type + "/" + moduleInfo.name +
45 "/" + moduleInfo.version + "/index.js");
46 }
47}
48export default ModuleServer;