1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const path_1 = require("path");
|
4 | const chokidar_1 = require("chokidar");
|
5 | exports.FSWatcher = chokidar_1.FSWatcher;
|
6 | const startsWith = require("lodash/startsWith");
|
7 | const once = require("lodash/once");
|
8 | const channel_1 = require("./rpc/channel");
|
9 | exports.RpcChannel = channel_1.RpcChannel;
|
10 | const client_1 = require("./rpc/client");
|
11 | exports.RpcClient = client_1.RpcClient;
|
12 | const server_1 = require("./rpc/server");
|
13 | exports.RpcServer = server_1.RpcServer;
|
14 | const proxy_1 = require("./proxy");
|
15 | exports.createModuleProxy = proxy_1.createModuleProxy;
|
16 | const util_1 = require("./util");
|
17 | exports.local = util_1.local;
|
18 | class 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 | }
|
128 | exports.ModuleProxy = ModuleProxy;
|
129 | exports.default = ModuleProxy;
|
130 |
|
\ | No newline at end of file |