@saltcorn/server 0.6.1-beta.1 → 0.6.2-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/serve.js CHANGED
@@ -33,11 +33,14 @@ const { setTenant, getSessionStore } = require("./routes/utils");
33
33
  const passport = require("passport");
34
34
  const { authenticate } = require("passport");
35
35
  const View = require("@saltcorn/data/models/view");
36
+ const {
37
+ listenForChanges,
38
+ getRelevantPackages,
39
+ getPluginDirectories,
40
+ } = require("./restart_watcher");
36
41
 
37
42
  // helpful https://gist.github.com/jpoehls/2232358
38
-
39
43
  /**
40
- * @param {object} opts
41
44
  * @param {object} opts
42
45
  * @param {boolean} opts.disableMigrate
43
46
  * @param {boolean} [useClusterAdaptor = true]
@@ -74,9 +77,9 @@ const initMaster = async ({ disableMigrate }, useClusterAdaptor = true) => {
74
77
  };
75
78
 
76
79
  /**
77
- * @param {object} opts
78
- * @param {object} opts.tenant
79
- * @param {...*} opts.msg
80
+ * @param {object} opts
81
+ * @param {object} opts.tenant
82
+ * @param {...*} opts.msg
80
83
  * @returns {void}
81
84
  */
82
85
  const workerDispatchMsg = ({ tenant, ...msg }) => {
@@ -90,8 +93,12 @@ const workerDispatchMsg = ({ tenant, ...msg }) => {
90
93
  });
91
94
  }
92
95
  if (msg.refresh) getState()[`refresh_${msg.refresh}`](true);
93
- if (msg.createTenant)
96
+ if (msg.createTenant) {
94
97
  create_tenant(msg.createTenant, loadAllPlugins, "", true);
98
+ db.runWithTenant(msg.createTenant, async () => {
99
+ getState().refresh(true);
100
+ });
101
+ }
95
102
  if (msg.installPlugin) {
96
103
  loadAndSaveNewPlugin(msg.installPlugin, msg.force, true);
97
104
  }
@@ -100,11 +107,11 @@ const workerDispatchMsg = ({ tenant, ...msg }) => {
100
107
  };
101
108
 
102
109
  /**
103
- *
104
- * @param {*} masterState
105
- * @param {object} opts
106
- * @param {string} opts.port
107
- * @param {boolean} opts.watchReaper
110
+ *
111
+ * @param {*} masterState
112
+ * @param {object} opts
113
+ * @param {string} opts.port
114
+ * @param {boolean} opts.watchReaper
108
115
  * @param {boolean} opts.disableScheduler
109
116
  * @param {number} opts.pid
110
117
  * @returns {function}
@@ -133,120 +140,125 @@ const onMessageFromWorker = (
133
140
  }
134
141
  };
135
142
 
136
- module.exports =
137
- /**
138
- * @function
139
- * @name "module.exports function"
140
- * @param {object} [opts = {}]
141
- * @param {number} [opts.port = 3000]
142
- * @param {boolean} opts.watchReaper
143
- * @param {boolean} opts.disableScheduler
144
- * @param {number} opts.defaultNCPUs
145
- * @param {...*} opts.appargs
146
- * @returns {Promise<void>}
147
- */
148
- async ({
149
- port = 3000,
150
- watchReaper,
151
- disableScheduler,
152
- defaultNCPUs,
153
- ...appargs
154
- } = {}) => {
155
- const useNCpus = process.env.SALTCORN_NWORKERS
156
- ? +process.env.SALTCORN_NWORKERS
157
- : defaultNCPUs;
143
+ module.exports =
144
+ /**
145
+ * @function
146
+ * @name "module.exports function"
147
+ * @param {object} [opts = {}]
148
+ * @param {number} [opts.port = 3000]
149
+ * @param {boolean} opts.watchReaper
150
+ * @param {boolean} opts.disableScheduler
151
+ * @param {number} opts.defaultNCPUs
152
+ * @param {boolean} opts.dev
153
+ * @param {...*} opts.appargs
154
+ * @returns {Promise<void>}
155
+ */
156
+ async ({
157
+ port = 3000,
158
+ watchReaper,
159
+ disableScheduler,
160
+ defaultNCPUs,
161
+ dev,
162
+ ...appargs
163
+ } = {}) => {
164
+ if (dev && cluster.isMaster) {
165
+ listenForChanges(getRelevantPackages(), await getPluginDirectories());
166
+ }
167
+ const useNCpus = process.env.SALTCORN_NWORKERS
168
+ ? +process.env.SALTCORN_NWORKERS
169
+ : defaultNCPUs;
158
170
 
159
- const letsEncrypt = await getConfig("letsencrypt", false);
160
- const masterState = {
161
- started: false,
162
- listeningTo: new Set([]),
163
- };
171
+ const letsEncrypt = await getConfig("letsencrypt", false);
172
+ const masterState = {
173
+ started: false,
174
+ listeningTo: new Set([]),
175
+ };
164
176
 
165
- const addWorker = (worker) => {
166
- worker.on(
167
- "message",
168
- onMessageFromWorker(masterState, {
169
- port,
170
- watchReaper,
171
- disableScheduler,
172
- pid: worker.process.pid,
173
- })
174
- );
175
- };
177
+ const addWorker = (worker) => {
178
+ worker.on(
179
+ "message",
180
+ onMessageFromWorker(masterState, {
181
+ port,
182
+ watchReaper,
183
+ disableScheduler,
184
+ pid: worker.process.pid,
185
+ })
186
+ );
187
+ };
176
188
 
177
- if (port === 80 && letsEncrypt) {
178
- const admin_users = await User.find({ role_id: 1 }, { orderBy: "id" });
179
- const file_store = db.connectObj.file_store;
180
- const Greenlock = require("greenlock");
181
- const greenlock = Greenlock.create({
182
- packageRoot: __dirname,
183
- configDir: path.join(file_store, "greenlock.d"),
184
- maintainerEmail: admin_users[0].email,
185
- });
186
- const certs = await greenlock._find({});
187
- console.log("Certificates:", certs);
189
+ if (port === 80 && letsEncrypt) {
190
+ const admin_users = await User.find({ role_id: 1 }, { orderBy: "id" });
191
+ const file_store = db.connectObj.file_store;
192
+ const Greenlock = require("greenlock");
193
+ const greenlock = Greenlock.create({
194
+ packageRoot: __dirname,
195
+ configDir: path.join(file_store, "greenlock.d"),
196
+ maintainerEmail: admin_users[0].email,
197
+ });
198
+ const certs = await greenlock._find({});
199
+ console.log("Certificates:", certs);
188
200
 
189
- if (certs && certs.length > 0) {
190
- const app = await getApp(appargs);
191
- const timeout = +getState().getConfig("timeout", 120);
192
- const initMasterListeners = () => {
193
- Object.entries(cluster.workers).forEach(([id, w]) => {
194
- if (!masterState.listeningTo.has(id)) {
195
- addWorker(w);
196
- masterState.listeningTo.add(id);
197
- }
198
- });
199
- if (masterState.listeningTo.size < useNCpus)
200
- setTimeout(initMasterListeners, 250);
201
- };
202
- require("greenlock-express")
203
- .init({
204
- packageRoot: __dirname,
205
- configDir: path.join(file_store, "greenlock.d"),
206
- maintainerEmail: admin_users[0].email,
207
- cluster: true,
208
- workers: useNCpus,
209
- })
210
- .ready((glx) => {
211
- const httpsServer = glx.httpsServer();
212
- setupSocket(httpsServer);
213
- httpsServer.setTimeout(timeout * 1000);
214
- process.on("message", workerDispatchMsg);
215
- glx.serveApp(app);
216
- process.send && process.send("Start");
217
- })
218
- .master(() => {
219
- initMaster(appargs).then(initMasterListeners);
220
- });
201
+ if (certs && certs.length > 0) {
202
+ const app = await getApp(appargs);
203
+ const timeout = +getState().getConfig("timeout", 120);
204
+ const initMasterListeners = () => {
205
+ Object.entries(cluster.workers).forEach(([id, w]) => {
206
+ if (!masterState.listeningTo.has(id)) {
207
+ addWorker(w);
208
+ masterState.listeningTo.add(id);
209
+ }
210
+ });
211
+ if (masterState.listeningTo.size < useNCpus)
212
+ setTimeout(initMasterListeners, 250);
213
+ };
214
+ require("greenlock-express")
215
+ .init({
216
+ packageRoot: __dirname,
217
+ configDir: path.join(file_store, "greenlock.d"),
218
+ maintainerEmail: admin_users[0].email,
219
+ cluster: true,
220
+ workers: useNCpus,
221
+ })
222
+ .ready((glx) => {
223
+ const httpsServer = glx.httpsServer();
224
+ setupSocket(httpsServer);
225
+ httpsServer.setTimeout(timeout * 1000);
226
+ process.on("message", workerDispatchMsg);
227
+ glx.serveApp(app);
228
+ process.send && process.send("Start");
229
+ })
230
+ .master(() => {
231
+ initMaster(appargs).then(initMasterListeners);
232
+ });
221
233
 
222
- return; // none of stuff below will execute
234
+ return; // none of stuff below will execute
235
+ }
223
236
  }
224
- }
225
- // No greenlock!
237
+ // No greenlock!
226
238
 
227
- if (cluster.isMaster) {
228
- const forkAnyWorkers = useNCpus > 1 && process.platform !== "win32";
229
- await initMaster(appargs, forkAnyWorkers);
239
+ if (cluster.isMaster) {
240
+ const forkAnyWorkers = useNCpus > 1 && process.platform !== "win32";
241
+ await initMaster(appargs, forkAnyWorkers);
230
242
 
231
- if (forkAnyWorkers) {
232
- for (let i = 0; i < useNCpus; i++) addWorker(cluster.fork());
243
+ if (forkAnyWorkers) {
244
+ for (let i = 0; i < useNCpus; i++) addWorker(cluster.fork());
233
245
 
234
- cluster.on("exit", (worker, code, signal) => {
235
- console.log(`worker ${worker.process.pid} died`);
236
- addWorker(cluster.fork());
237
- });
246
+ cluster.on("exit", (worker, code, signal) => {
247
+ console.log(`worker ${worker.process.pid} died`);
248
+ addWorker(cluster.fork());
249
+ });
250
+ } else {
251
+ await nonGreenlockWorkerSetup(appargs, port);
252
+ }
253
+ Trigger.emitEvent("Startup");
238
254
  } else {
239
255
  await nonGreenlockWorkerSetup(appargs, port);
240
256
  }
241
- Trigger.emitEvent("Startup");
242
- } else {
243
- await nonGreenlockWorkerSetup(appargs, port);
244
- }
245
- };
257
+ };
246
258
 
247
259
  /**
248
- * @param {*} appargs
249
- * @param {*} port
260
+ * @param {*} appargs
261
+ * @param {*} port
250
262
  * @returns {Promise<void>}
251
263
  */
252
264
  const nonGreenlockWorkerSetup = async (appargs, port) => {
@@ -294,8 +306,8 @@ const nonGreenlockWorkerSetup = async (appargs, port) => {
294
306
  };
295
307
 
296
308
  /**
297
- *
298
- * @param {...*} servers
309
+ *
310
+ * @param {...*} servers
299
311
  */
300
312
  const setupSocket = (...servers) => {
301
313
  // https://socket.io/docs/v4/middlewares/