1 | #!/usr/bin/env node
|
2 |
|
3 | const execSync = require('child_process').execSync;
|
4 | const args = require('minimist')(process.argv.slice(2));
|
5 | const chokidar = require('chokidar');
|
6 | const RawIPC = require('node-ipc').IPC;
|
7 | const ipc = new RawIPC();
|
8 | const fakeIpc = new RawIPC();
|
9 | const library = require("./src/library");
|
10 | const BRACKET_END = "$(B_R-A_C-K_E-T)";
|
11 |
|
12 | var watcherEnabled = true;
|
13 | var readCounter = 0;
|
14 | var writeCounter = 0;
|
15 |
|
16 | ipc.config.id = 'sfLibraryManager';
|
17 | ipc.config.retry = 5000;
|
18 | ipc.config.encoding = "binary";
|
19 | ipc.config.maxConnections = 15;
|
20 | fakeIpc.config.port = 8000;
|
21 | ipc.config.logger = function(a) { args.verbose && console.log(a) };
|
22 | fakeIpc.config.logger = function() {};
|
23 | var sockets = [];
|
24 | var _libraryFolder;
|
25 |
|
26 | process.on("uncaughtException", logError);
|
27 | process.on('unhandledRejection', logError);
|
28 |
|
29 | if (args.restart) {
|
30 | try {
|
31 | execSync(`fuser -k ${ipc.config.port}/tcp`);
|
32 | }
|
33 | catch (ex) {
|
34 |
|
35 | }
|
36 | }
|
37 |
|
38 | function logError(reason) {
|
39 | console.error("├─── ! ☠️ ! ──────── LibraryManager ───── Unhandled Error ─────────────────────────┤\n" +
|
40 | reason.stack ? reason.stack.toString("utf8") : reason.toString("utf8"));
|
41 | }
|
42 |
|
43 | function initLibraryTask(data, cb) {
|
44 | library.createLibDirFile(_libraryFolder, data.initialLibraryData, e => {
|
45 | e && console.error(e);
|
46 | cb && cb(e);
|
47 | watch(_libraryFolder);
|
48 | });
|
49 | }
|
50 |
|
51 | function watch(libraryFolder) {
|
52 | var watcher = chokidar.watch(`${libraryFolder}/*.!(pgx)cpx`, {
|
53 | ignoreInitial: true
|
54 | });
|
55 | watcher.on("all", (e, filename) => {
|
56 | if (!watcherEnabled)
|
57 | return;
|
58 | ++readCounter;
|
59 | setTimeout(_ => {
|
60 | if (--readCounter !== 0)
|
61 | return;
|
62 | console.log("Watcher ..> ", e, " . ", filename);
|
63 | readTask((e, res) => {
|
64 | sockets.forEach(s => {
|
65 | ipc.server.emit(
|
66 | s,
|
67 | e ? 'error' : 'read',
|
68 | e ? e.toString() : res
|
69 | );
|
70 | });
|
71 | });
|
72 | }, 300);
|
73 | });
|
74 | }
|
75 |
|
76 | function readTask(cb) {
|
77 | cb = typeof cb === "function" ? cb : function() {};
|
78 | library.read(_libraryFolder, function(err, comps) {
|
79 | if (err) {
|
80 | console.error(err);
|
81 | cb(err);
|
82 | }
|
83 | else {
|
84 | return cb(null, JSON.stringify(comps));
|
85 | }
|
86 | });
|
87 | }
|
88 |
|
89 | function writeTask(data, cb) {
|
90 | cb = typeof cb === "function" ? cb : function() {};
|
91 | try {
|
92 | var componentsWithChildren = JSON.parse(data);
|
93 | }
|
94 | catch (e) {
|
95 | console.error(e);
|
96 | return cb(e);
|
97 | }
|
98 | ++writeCounter;
|
99 | watcherEnabled = false;
|
100 | library.saveComponents(_libraryFolder, componentsWithChildren, err => {
|
101 | setTimeout(_ => {
|
102 | --writeCounter;
|
103 | if (writeCounter === 0)
|
104 | watcherEnabled = true;
|
105 | }, 1000);
|
106 | if (err) {
|
107 | console.error(err);
|
108 | cb(err);
|
109 | }
|
110 | });
|
111 | }
|
112 |
|
113 | ipc.serveNet();
|
114 |
|
115 | ipc.serve(
|
116 | "/tmp/app.sfLibraryManager",
|
117 | function() {
|
118 | console.log("Server initializon...");
|
119 | ipc.server.on(
|
120 | 'writeTask',
|
121 | function(data, socket) {
|
122 | console.log("WriteTask", data.length);
|
123 | writeTask(data);
|
124 | }
|
125 | );
|
126 |
|
127 | ipc.server.on(
|
128 | 'readTask',
|
129 | function(data, socket) {
|
130 | console.log("ReadTask ", data.name);
|
131 | _libraryFolder = _libraryFolder || data.libraryFolder;
|
132 | socket.name = data && data.name;
|
133 | readTask((e, res) => {
|
134 | ipc.server.emit(
|
135 | socket,
|
136 | 'read',
|
137 | res
|
138 | );
|
139 | });
|
140 | }
|
141 | );
|
142 |
|
143 | ipc.server.on(
|
144 | 'init',
|
145 | function(data, socket) {
|
146 | console.log("Init ", data.name);
|
147 | socket.name = data && data.name;
|
148 | _libraryFolder = data.libraryFolder;
|
149 | sockets.push(socket);
|
150 | initLibraryTask(data, e => {
|
151 | readTask((e, res) => {
|
152 | ipc.server.emit(
|
153 | socket,
|
154 | 'read',
|
155 | res
|
156 | );
|
157 | });
|
158 | });
|
159 | }
|
160 | );
|
161 |
|
162 | ipc.server.on(
|
163 | 'socket.disconnected',
|
164 | function(socket) {
|
165 | sockets = sockets.filter(s => s !== socket);
|
166 | console.log('DISCONNECTED ', socket.name);
|
167 | }
|
168 | );
|
169 | }
|
170 | );
|
171 |
|
172 | ipc.server.on(
|
173 | 'error',
|
174 | function(err) {
|
175 | console.log('Got an ERROR!', err);
|
176 | }
|
177 | );
|
178 |
|
179 | ipc.server.start();
|
180 |
|
181 | fakeIpc.serveNet();
|
182 | fakeIpc.server.start();
|