UNPKG

4.71 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const path_1 = require("path");
4const chokidar_1 = require("chokidar");
5exports.FSWatcher = chokidar_1.FSWatcher;
6const startsWith = require("lodash/startsWith");
7const once = require("lodash/once");
8const channel_1 = require("./rpc/channel");
9exports.RpcChannel = channel_1.RpcChannel;
10const client_1 = require("./rpc/client");
11exports.RpcClient = client_1.RpcClient;
12const server_1 = require("./rpc/server");
13exports.RpcServer = server_1.RpcServer;
14const proxy_1 = require("./proxy");
15exports.createModuleProxy = proxy_1.createModuleProxy;
16const util_1 = require("./util");
17exports.local = util_1.local;
18class ModuleProxy extends proxy_1.ModuleProxy {
19 constructor(name, path, loader) {
20 super();
21 this.name = name;
22 this.server = null;
23 util_1.patchProperties(this, path, loader || proxy_1.defaultLoader, util_1.dict());
24 this.local = util_1.local;
25 }
26 async serve(config, immediate = true) {
27 this.server = new server_1.RpcServer(config);
28 this.server["proxyRoot"] = this;
29 immediate && (await this.server.open(false));
30 return this.server;
31 }
32 async connect(config, immediate = true) {
33 let client = new client_1.RpcClient(config);
34 immediate && (await client.open());
35 return client;
36 }
37 resolve(path) {
38 let dir = this.path + path_1.sep;
39 if (startsWith(path, dir)) {
40 let modPath = path.slice(dir.length), ext = path_1.extname(modPath);
41 if (Array.isArray(this.loader.extension)) {
42 if (this.loader.extension.includes(ext)) {
43 modPath = modPath.slice(0, -ext.length);
44 }
45 else {
46 return;
47 }
48 }
49 else if (ext === this.loader.extension) {
50 modPath = modPath.slice(0, -ext.length);
51 }
52 else if (ext) {
53 return;
54 }
55 return this.name + "." + modPath.replace(/\\|\//g, ".");
56 }
57 else {
58 return;
59 }
60 }
61 watch(listener) {
62 let { path } = this;
63 let clearCache = async (event, filename, cb) => {
64 let name = this.resolve(filename);
65 if (name && this.singletons[name]) {
66 let tryUnload = once(() => {
67 delete this.singletons[name];
68 this.loader.unload(filename);
69 });
70 try {
71 if (this.server &&
72 this.server["enableLifeCycle"] &&
73 this.server["registry"][name]) {
74 let mod = this.server["registry"][name];
75 let handleError = this.server["errorHandler"];
76 await util_1.tryLifeCycleFunction(mod, "destroy", handleError);
77 tryUnload();
78 await util_1.tryLifeCycleFunction(mod, "init", handleError);
79 }
80 else {
81 tryUnload();
82 }
83 }
84 catch (err) {
85 console.error(err);
86 tryUnload();
87 }
88 }
89 else {
90 this.loader.unload(filename);
91 }
92 cb && cb(event, filename);
93 };
94 return chokidar_1.watch(path, {
95 awaitWriteFinish: true,
96 followSymlinks: false,
97 ignored: (file) => {
98 let ext = path_1.extname(file);
99 if (!ext) {
100 return false;
101 }
102 else if (typeof this.loader.extension === "string") {
103 return this.loader.extension !== ext;
104 }
105 else {
106 return !this.loader.extension.includes(ext);
107 }
108 }
109 }).on("change", (filename) => {
110 clearCache("change", filename, listener);
111 }).on("unlink", (filename) => {
112 clearCache("unlink", filename, listener);
113 }).on("unlinkDir", dirname => {
114 dirname = dirname + path_1.sep;
115 if (this.loader.cache) {
116 for (let filename in this.loader.cache) {
117 if (startsWith(filename, dirname)) {
118 clearCache("unlink", filename, listener);
119 }
120 }
121 }
122 });
123 }
124 setLoader(loader) {
125 util_1.set(this, "loader", loader);
126 }
127}
128exports.ModuleProxy = ModuleProxy;
129exports.default = ModuleProxy;
130//# sourceMappingURL=index.js.map
\No newline at end of file