UNPKG

4.96 kBJavaScriptView Raw
1#!/usr/bin/env node
2
3const execSync = require('child_process').execSync;
4const args = require('minimist')(process.argv.slice(2));
5const chokidar = require('chokidar');
6const RawIPC = require('node-ipc').IPC;
7const ipc = new RawIPC();
8const fakeIpc = new RawIPC();
9const library = require("./src/library");
10const BRACKET_END = "$(B_R-A_C-K_E-T)";
11
12var watcherEnabled = true;
13var readCounter = 0;
14var writeCounter = 0;
15
16ipc.config.id = 'sfLibraryManager';
17ipc.config.retry = 5000;
18ipc.config.encoding = "binary";
19ipc.config.maxConnections = 15;
20fakeIpc.config.port = 8000;
21ipc.config.logger = function(a) { args.verbose && console.log(a) };
22fakeIpc.config.logger = function() {};
23var sockets = [];
24var _libraryFolder;
25
26process.on("uncaughtException", logError);
27process.on('unhandledRejection', logError);
28
29if (args.restart) {
30 try {
31 execSync(`fuser -k ${ipc.config.port}/tcp`);
32 }
33 catch (ex) {
34 // do nothing; process is not running; everything is OK
35 }
36}
37
38function logError(reason) {
39 console.error("├─── ! ☠️ ! ──────── LibraryManager ───── Unhandled Error ─────────────────────────┤\n" +
40 reason.stack ? reason.stack.toString("utf8") : reason.toString("utf8"));
41}
42
43function 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
51function 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
76function 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
89function 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
113ipc.serveNet(); // with port;
114
115ipc.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
172ipc.server.on(
173 'error',
174 function(err) {
175 console.log('Got an ERROR!', err);
176 }
177);
178
179ipc.server.start();
180
181fakeIpc.serveNet();
182fakeIpc.server.start();