not-node 5.1.40 → 5.1.43

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.
Files changed (36) hide show
  1. package/package.json +2 -1
  2. package/src/core/index.js +3 -3
  3. package/src/form/form.js +1 -1
  4. package/src/init/index.js +1 -0
  5. package/src/init/{app.js → lib/app.js} +13 -15
  6. package/src/init/{bodyparser.js → lib/bodyparser.js} +0 -0
  7. package/src/init/{compression.js → lib/compression.js} +0 -0
  8. package/src/init/{core.js → lib/core.js} +1 -1
  9. package/src/init/{cors.js → lib/cors.js} +4 -5
  10. package/src/init/{db → lib/db}/index.js +3 -2
  11. package/src/init/{db → lib/db}/ioredis.js +4 -5
  12. package/src/init/{db → lib/db}/mongoose.js +5 -6
  13. package/src/init/{db → lib/db}/redis.js +4 -5
  14. package/src/init/{env.js → lib/env.js} +4 -5
  15. package/src/init/{express.js → lib/express.js} +2 -3
  16. package/src/init/{fileupload.js → lib/fileupload.js} +0 -0
  17. package/src/init/{http.js → lib/http.js} +4 -5
  18. package/src/init/{informer.js → lib/informer.js} +1 -1
  19. package/src/init/{methodoverride.js → lib/methodoverride.js} +0 -0
  20. package/src/init/{middleware.js → lib/middleware.js} +4 -5
  21. package/src/init/{modules.js → lib/modules.js} +0 -0
  22. package/src/init/{monitoring.js → lib/monitoring.js} +1 -1
  23. package/src/init/{rateLimiter.js → lib/rateLimiter.js} +2 -3
  24. package/src/init/lib/redlock.js +44 -0
  25. package/src/init/{routes.js → lib/routes.js} +1 -1
  26. package/src/init/{security.js → lib/security.js} +1 -1
  27. package/src/init/{sessions → lib/sessions}/index.js +2 -2
  28. package/src/init/{sessions → lib/sessions}/mongoose.js +4 -5
  29. package/src/init/{sessions → lib/sessions}/redis.js +4 -5
  30. package/src/init/{static.js → lib/static.js} +3 -5
  31. package/src/init/{template.js → lib/template.js} +4 -5
  32. package/src/init/sequence.standart.js +23 -20
  33. package/src/model/default.js +1 -1
  34. package/src/model/exceptions.js +3 -3
  35. package/src/model/routine.js +109 -55
  36. package/src/model/versioning.js +35 -33
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "not-node",
3
- "version": "5.1.40",
3
+ "version": "5.1.43",
4
4
  "description": "node complimentary part for client side notFramework.",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -64,6 +64,7 @@
64
64
  "not-validation": "^0.0.8",
65
65
  "rate-limiter-flexible": "^2.3.7",
66
66
  "redis": "^4.1.1",
67
+ "redlock": "^5.0.0-beta.2",
67
68
  "rfdc": "^1.3.0",
68
69
  "rmdir": "^1.2.0",
69
70
  "serve-static": "*",
package/src/core/index.js CHANGED
@@ -1,6 +1,6 @@
1
- const {generatePaths} = require('../common');
1
+ const { generatePaths } = require("../common");
2
2
 
3
3
  module.exports = {
4
- name: 'not-node',
5
- paths: generatePaths(['fields', 'locales'], __dirname)
4
+ name: "not-node",
5
+ paths: generatePaths(["fields", "locales"], __dirname),
6
6
  };
package/src/form/form.js CHANGED
@@ -108,7 +108,7 @@ class Form {
108
108
 
109
109
  extractRequestEnvs(req) {
110
110
  const result = {};
111
- Array.values(this.#ENV_EXTRACTORS).forEach((extractor) => {
111
+ Object.values(this.#ENV_EXTRACTORS).forEach((extractor) => {
112
112
  const extracted = extractor(this, req);
113
113
  if (
114
114
  extracted &&
package/src/init/index.js CHANGED
@@ -141,6 +141,7 @@ class Init {
141
141
  config: Init.getConfig(), //access to config
142
142
  options, //options
143
143
  master: Init, //this class
144
+ emit: ADDS.run.bind(ADDS),
144
145
  };
145
146
  //running all prepared initalizers with current context
146
147
  await initSequence.run(context);
@@ -1,17 +1,15 @@
1
- const notAppConstructor = require("../app.js");
1
+ const notAppConstructor = require("../../app.js");
2
2
  const ENV = process.env.NODE_ENV || "development";
3
3
  const path = require("path");
4
4
  const logger = require("not-log");
5
- const log = logger(module, "not-node//init");
5
+ const log = logger(module, "not-node//init//app");
6
6
  const { notErrorReporter } = require("not-error");
7
7
 
8
- const emit = require("./additional").run;
9
-
10
8
  module.exports = class InitApp {
11
9
  static AppConstructor = notAppConstructor;
12
10
  static ReporterConstructor = notErrorReporter;
13
11
 
14
- static async createApp({ config, options, master }) {
12
+ static async createApp({ config, options, master, emit }) {
15
13
  await emit("app.create.pre", { config, options, master });
16
14
  master.setApp(
17
15
  new InitApp.AppConstructor({ mongoose: master.getMongoose() })
@@ -19,7 +17,7 @@ module.exports = class InitApp {
19
17
  await emit("app.create.post", { config, options, master });
20
18
  }
21
19
 
22
- static async setAppEnvs({ config, options, master }) {
20
+ static async setAppEnvs({ config, options, master, emit }) {
23
21
  await emit("app.setEnv.pre", { config, options, master });
24
22
  master.setEnv("hostname", config.get("hostname"));
25
23
  master.setEnv("server", `https://` + config.get("host"));
@@ -35,13 +33,13 @@ module.exports = class InitApp {
35
33
  await emit("app.setEnv.post", { config, options, master });
36
34
  }
37
35
 
38
- static async initCore({ config, options, master }) {
36
+ static async initCore({ config, options, master, emit }) {
39
37
  await emit("app.initCore.pre", { config, options, master });
40
- master.getApp().importModuleFrom(path.join(__dirname, "../core"));
38
+ master.getApp().importModuleFrom(path.join(__dirname, "../../core"));
41
39
  await emit("app.initCore.post", { config, options, master });
42
40
  }
43
41
 
44
- static async importModules({ config, options, master }) {
42
+ static async importModules({ config, options, master, emit }) {
45
43
  await emit("app.importModules.pre", { config, options, master });
46
44
  master.getApp().importModulesFrom(config.get("modulesPath"));
47
45
  if (Array.isArray(config.get("importModulesFromNPM"))) {
@@ -70,15 +68,15 @@ module.exports = class InitApp {
70
68
  }
71
69
  }
72
70
 
73
- async run({ config, options, master }) {
71
+ async run({ config, options, master, emit }) {
74
72
  try {
75
73
  log.info("Init not-app...");
76
74
  await emit("app.pre", { config, options, master });
77
- await InitApp.createApp({ config, options, master });
78
- await InitApp.setAppEnvs({ config, options, master });
79
- await InitApp.initCore({ config, options, master });
80
- await InitApp.importModules({ config, options, master });
81
- await InitApp.createReporter({ config, options, master });
75
+ await InitApp.createApp({ config, options, master, emit });
76
+ await InitApp.setAppEnvs({ config, options, master, emit });
77
+ await InitApp.initCore({ config, options, master, emit });
78
+ await InitApp.importModules({ config, options, master, emit });
79
+ await InitApp.createReporter({ config, options, master, emit });
82
80
  await emit("app.post", { config, options, master });
83
81
  } catch (e) {
84
82
  master.throwError(e.message, 1);
File without changes
File without changes
@@ -1,5 +1,5 @@
1
1
  const path = require("path");
2
- const Fields = require("../fields");
2
+ const Fields = require("../../fields");
3
3
  const notLocale = require("not-locale");
4
4
 
5
5
  module.exports = class InitCore {
@@ -1,5 +1,4 @@
1
- const log = require("not-log")(module, "not-node//init");
2
- const ADDS = require("./additional");
1
+ const log = require("not-log")(module, "not-node//init//cors");
3
2
 
4
3
  module.exports = class InitCORS {
5
4
  static getOriginFilter(whitelist) {
@@ -8,8 +7,8 @@ module.exports = class InitCORS {
8
7
  };
9
8
  }
10
9
 
11
- async run({ config, options, master }) {
12
- await ADDS.run("cors.pre", { config, options, master });
10
+ async run({ config, options, master, emit }) {
11
+ await emit("cors.pre", { config, options, master });
13
12
  const cors = require("cors");
14
13
  log.info("Setting up CORS rules...");
15
14
  const whitelist = config.get("cors");
@@ -20,6 +19,6 @@ module.exports = class InitCORS {
20
19
  };
21
20
  log.info("CORS options", corsOptions);
22
21
  master.getServer().use(cors(corsOptions));
23
- await ADDS.run("cors.post", { config, options, master });
22
+ await emit("cors.post", { config, options, master });
24
23
  }
25
24
  };
@@ -1,5 +1,5 @@
1
1
  const path = require("path");
2
- const { objHas } = require("../../common");
2
+ const { objHas } = require("../../../common");
3
3
 
4
4
  module.exports = class InitDB {
5
5
  static default = path.resolve(__dirname, "./mongoose.js");
@@ -32,7 +32,7 @@ module.exports = class InitDB {
32
32
  * require('not-node').getEnv('mongoose')
33
33
  * require('not-node').getEnv('redis')
34
34
  **/
35
- async run({ master, config, options }) {
35
+ async run({ master, config, options, emit }) {
36
36
  const conf = config.get("db");
37
37
  for (let driver in conf) {
38
38
  const Constructor = InitDB.getConstructor(driver);
@@ -42,6 +42,7 @@ module.exports = class InitDB {
42
42
  options,
43
43
  conf: conf[driver],
44
44
  alias: driver,
45
+ emit,
45
46
  });
46
47
  }
47
48
  }
@@ -1,5 +1,4 @@
1
- const log = require("not-log")(module, "not-node//init");
2
- const ADDS = require("../additional");
1
+ const log = require("not-log")(module, "not-node//init//db//ioredis");
3
2
 
4
3
  module.exports = class InitDBRedisIO {
5
4
  static async initRedis({ conf, master, alias }) {
@@ -11,8 +10,8 @@ module.exports = class InitDBRedisIO {
11
10
  log.log("redis client");
12
11
  }
13
12
 
14
- async run({ config, options, master, conf, alias }) {
15
- await ADDS.run(`db.${alias}.pre`, {
13
+ async run({ config, options, master, conf, alias, emit }) {
14
+ await emit(`db.${alias}.pre`, {
16
15
  config,
17
16
  options,
18
17
  master,
@@ -20,7 +19,7 @@ module.exports = class InitDBRedisIO {
20
19
  alias,
21
20
  });
22
21
  await InitDBRedisIO.initRedis({ conf, master, alias });
23
- await ADDS.run(`db.${alias}.post`, {
22
+ await emit(`db.${alias}.post`, {
24
23
  config,
25
24
  options,
26
25
  master,
@@ -1,5 +1,4 @@
1
- const log = require("not-log")(module, "not-node//init");
2
- const ADDS = require("../additional");
1
+ const log = require("not-log")(module, "not-node//init//db//mongoose");
3
2
 
4
3
  module.exports = class InitDBMongoose {
5
4
  static fixMongooseOptions(opts) {
@@ -10,7 +9,7 @@ module.exports = class InitDBMongoose {
10
9
  }
11
10
 
12
11
  static async initMongoose({ conf, master, alias }) {
13
- const Increment = require("../../model/increment.js");
12
+ const Increment = require("../../../model/increment.js");
14
13
  log.info("Setting up mongoose connection...");
15
14
  const mongoose = require("mongoose");
16
15
  mongoose.Promise = global.Promise;
@@ -26,9 +25,9 @@ module.exports = class InitDBMongoose {
26
25
  master.setEnv(`db.${alias}`, mongoose);
27
26
  }
28
27
 
29
- async run({ config, options, master, conf, alias }) {
28
+ async run({ config, options, master, conf, alias, emit }) {
30
29
  log.info(`db.${alias}.pre`);
31
- await ADDS.run(`db.${alias}.pre`, {
30
+ await emit(`db.${alias}.pre`, {
32
31
  config,
33
32
  options,
34
33
  master,
@@ -36,7 +35,7 @@ module.exports = class InitDBMongoose {
36
35
  alias,
37
36
  });
38
37
  await InitDBMongoose.initMongoose({ conf, master, alias });
39
- await ADDS.run(`db.${alias}.post`, {
38
+ await emit(`db.${alias}.post`, {
40
39
  config,
41
40
  options,
42
41
  master,
@@ -1,6 +1,5 @@
1
1
  const { notError } = require("not-error");
2
- const log = require("not-log")(module, "not-node//init");
3
- const ADDS = require("../additional");
2
+ const log = require("not-log")(module, "not-node//init//db//redis");
4
3
 
5
4
  module.exports = class InitDBRedis {
6
5
  static async initRedis({ conf, master, alias }) {
@@ -11,8 +10,8 @@ module.exports = class InitDBRedis {
11
10
  master.setEnv(`db.${alias}`, redisClient);
12
11
  }
13
12
 
14
- async run({ config, options, master, conf, alias }) {
15
- await ADDS.run(`db.${alias}.pre`, {
13
+ async run({ config, options, master, conf, alias, emit }) {
14
+ await emit(`db.${alias}.pre`, {
16
15
  config,
17
16
  options,
18
17
  master,
@@ -20,7 +19,7 @@ module.exports = class InitDBRedis {
20
19
  alias,
21
20
  });
22
21
  await InitDBRedis.initRedis({ conf, master, alias });
23
- await ADDS.run(`db.${alias}.post`, {
22
+ await emit(`db.${alias}.post`, {
24
23
  config,
25
24
  options,
26
25
  master,
@@ -1,5 +1,4 @@
1
- const log = require("not-log")(module, "not-node//init");
2
- const ADDS = require("./additional");
1
+ const log = require("not-log")(module, "not-node//init//env");
3
2
 
4
3
  module.exports = class InitENV {
5
4
  static getProxyPort(config) {
@@ -21,9 +20,9 @@ module.exports = class InitENV {
21
20
  return name;
22
21
  }
23
22
 
24
- async run({ config, options, master }) {
23
+ async run({ config, options, master, emit }) {
25
24
  log.info("Setting up server environment variables...");
26
- await ADDS.run("env.pre", { config, options, master });
25
+ await emit("env.pre", { config, options, master });
27
26
  config.set(
28
27
  "staticPath",
29
28
  master.getAbsolutePath(config.get("path:static") || "static")
@@ -45,6 +44,6 @@ module.exports = class InitENV {
45
44
  log.log("wsPath", master.getAbsolutePath(config.get("path:ws")));
46
45
  config.set("wsPath", master.getAbsolutePath(config.get("path:ws")));
47
46
  }
48
- await ADDS.run("env.post", { config, options, master });
47
+ await emit("env.post", { config, options, master });
49
48
  }
50
49
  };
@@ -1,5 +1,4 @@
1
- const emit = require("./additional").run;
2
- const Log = require("not-log")(module, "not-node//init");
1
+ const Log = require("not-log")(module, "not-node//init//express");
3
2
 
4
3
  module.exports = class InitExpress {
5
4
  static requestLogging({ /*config, options, */ master }) {
@@ -9,7 +8,7 @@ module.exports = class InitExpress {
9
8
  });
10
9
  }
11
10
 
12
- async run({ options, config, master }) {
11
+ async run({ options, config, master, emit }) {
13
12
  Log.info("Init express app...");
14
13
  await emit("express.pre", { options, config, master });
15
14
  //express
File without changes
@@ -1,6 +1,5 @@
1
- const log = require("not-log")(module, "not-node//init");
1
+ const log = require("not-log")(module, "not-node//init//http");
2
2
  const fs = require("fs");
3
- const ADDS = require("./additional");
4
3
 
5
4
  module.exports = class InitHTTP {
6
5
  listenPromise({ config, master }) {
@@ -61,13 +60,13 @@ module.exports = class InitHTTP {
61
60
  return config.get("ssl:enabled") === true;
62
61
  }
63
62
 
64
- async run({ options, config, master }) {
65
- await ADDS.run("http.pre", { options, config, master });
63
+ async run({ options, config, master, emit }) {
64
+ await emit("http.pre", { options, config, master });
66
65
  if (InitHTTP.isSecure({ config })) {
67
66
  await this.runHTTPS({ options, config, master });
68
67
  } else {
69
68
  await this.runHTTP({ options, config, master });
70
69
  }
71
- await ADDS.run("http.post", { options, config, master });
70
+ await emit("http.post", { options, config, master });
72
71
  }
73
72
  };
@@ -1,4 +1,4 @@
1
- const log = require("not-log")(module, "not-node//init");
1
+ const log = require("not-log")(module, "not-node//init//informer");
2
2
 
3
3
  module.exports = class InitInformer {
4
4
  async run({ master }) {
@@ -1,10 +1,9 @@
1
- const log = require("not-log")(module, "not-node//init");
2
- const ADDS = require("./additional");
1
+ const log = require("not-log")(module, "not-node//init//middleware");
3
2
 
4
3
  module.exports = class InitMiddleware {
5
- async run({ config, options, master }) {
4
+ async run({ config, options, master, emit }) {
6
5
  log.info("Setting up middlewares...");
7
- await ADDS.run("middleware.pre", { config, options, master });
6
+ await emit("middleware.pre", { config, options, master });
8
7
  const input = config.get("middleware");
9
8
  if (input) {
10
9
  for (let ware in input) {
@@ -22,6 +21,6 @@ module.exports = class InitMiddleware {
22
21
  }
23
22
  }
24
23
  }
25
- await ADDS.run("middleware.post", { config, options, master });
24
+ await emit("middleware.post", { config, options, master });
26
25
  }
27
26
  };
File without changes
@@ -1,4 +1,4 @@
1
- const Log = require("not-log")(module, "not-node//init");
1
+ const Log = require("not-log")(module, "not-node//init//monitoring");
2
2
 
3
3
  module.exports = class InitMonitoring {
4
4
  async run() {
@@ -1,6 +1,5 @@
1
- const emit = require("./additional").run;
2
1
  const log = require("not-log")(module, "RateLimiter");
3
- const { partCopyObj } = require("../common");
2
+ const { partCopyObj } = require("../../common");
4
3
 
5
4
  const DEFAULT_OPTIONS = {
6
5
  keyPrefix: "rateLimiterMiddleware",
@@ -23,7 +22,7 @@ module.exports = class InitRateLimiter {
23
22
  };
24
23
  }
25
24
 
26
- async run({ config, master }) {
25
+ async run({ config, master, emit }) {
27
26
  await emit("rateLimiter.pre", { config, master });
28
27
  const rateLimiter = InitRateLimiter.createRateLimiter({
29
28
  config,
@@ -0,0 +1,44 @@
1
+ const log = require("not-log")(module, "not-node//init//redlock");
2
+ const { default: Redlock, ResourceLockedError } = require("redlock");
3
+ const { notError } = require("not-error");
4
+
5
+ const DEFAULT_CONFIG = {
6
+ driftFactor: 0.01, // multiplied by lock ttl to determine drift time
7
+ retryCount: 10,
8
+ retryDelay: 200, // time in ms
9
+ retryJitter: 200, // time in ms
10
+ automaticExtensionThreshold: 500, // time in ms
11
+ };
12
+
13
+ module.exports = class InitDBRedlock {
14
+ static async initLocker({ master, alias, redisClientAlias, config }) {
15
+ log.info("Setting up ioredis locker...");
16
+ const redisClient = master.getEnv(`db.${redisClientAlias}`);
17
+ const redlockConfig = config.get(`db.${alias}`);
18
+ const redlock = new Redlock(
19
+ [redisClient],
20
+ redlockConfig || DEFAULT_CONFIG
21
+ );
22
+ redlock.on("error", (error) => {
23
+ // Ignore cases where a resource is explicitly marked as locked on a client.
24
+ if (error instanceof ResourceLockedError) {
25
+ return;
26
+ }
27
+ // Log all other errors.
28
+ log.error(error);
29
+ master.getApp().report(new notError("Redlock failed", {}, error));
30
+ });
31
+ master.setEnv(`db.${alias}`, redlock);
32
+ }
33
+
34
+ async run({ master, config, emit, options }) {
35
+ await emit("redlock.pre", { config, options, master });
36
+ await InitDBRedlock.initLocker({
37
+ config,
38
+ master,
39
+ alias: "redlock",
40
+ redisClientAlias: "ioredis",
41
+ });
42
+ await emit("redlock.post", { config, options, master });
43
+ }
44
+ };
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  const serveStatic = require("serve-static");
4
- const log = require("not-log")(module, "not-node//init");
4
+ const log = require("not-log")(module, "not-node//init//routes");
5
5
  const { notError, notValidationError, notRequestError } = require("not-error");
6
6
 
7
7
  module.exports = class InitRoutes {
@@ -1,4 +1,4 @@
1
- const Log = require("not-log")(module, "not-node//init");
1
+ const Log = require("not-log")(module, "not-node//init//security");
2
2
 
3
3
  module.exports = class InitSecurity {
4
4
  getCSPDirectives({ config }) {
@@ -16,9 +16,9 @@ module.exports = class InitSessions {
16
16
  }
17
17
  }
18
18
 
19
- async run({ master, config, options }) {
19
+ async run({ master, config, options, emit }) {
20
20
  const conf = config.get("session");
21
21
  const Constructor = InitSessions.getConstructor(conf);
22
- await new Constructor().run({ master, config, options, conf });
22
+ await new Constructor().run({ master, config, options, conf, emit });
23
23
  }
24
24
  };
@@ -1,6 +1,5 @@
1
1
  const { notError } = require("not-error");
2
- const log = require("not-log")(module, "not-node//init");
3
- const ADDS = require("../additional");
2
+ const log = require("not-log")(module, "not-node//init//sessions//mongoose");
4
3
 
5
4
  module.exports = class InitSessionsMongo {
6
5
  static createStore({ config, master, expressSession }) {
@@ -29,10 +28,10 @@ module.exports = class InitSessionsMongo {
29
28
  return store;
30
29
  }
31
30
 
32
- async run({ config, options, master }) {
31
+ async run({ config, options, master, emit }) {
33
32
  const expressSession = require("express-session");
34
33
  log.info("Setting up user sessions handler(mongoose)...");
35
- await ADDS.run("sessions.pre", { config, options, master });
34
+ await emit("sessions.pre", { config, options, master });
36
35
  master.getServer().use(
37
36
  expressSession({
38
37
  secret: config.get("session:secret"),
@@ -47,6 +46,6 @@ module.exports = class InitSessionsMongo {
47
46
  }),
48
47
  })
49
48
  );
50
- await ADDS.run("sessions.post", { config, options, master });
49
+ await emit("sessions.post", { config, options, master });
51
50
  }
52
51
  };
@@ -1,12 +1,11 @@
1
- const log = require("not-log")(module, "not-node//init");
2
- const ADDS = require("../additional");
1
+ const log = require("not-log")(module, "not-node//init//sessions//ioredis");
3
2
 
4
3
  const DEFAULT_CLIENT = "ioredis";
5
4
 
6
5
  module.exports = class InitSessionsRedis {
7
- async run({ config, options, master }) {
6
+ async run({ config, options, master, emit }) {
8
7
  log.info("Setting up user sessions handler(redis)...");
9
- await ADDS.run("sessions.pre", { config, options, master });
8
+ await emit("sessions.pre", { config, options, master });
10
9
  const expressSession = require("express-session");
11
10
  const storeClient = config.get("session.client", DEFAULT_CLIENT);
12
11
  const redisClient = master.getEnv(`db.${storeClient}`);
@@ -26,6 +25,6 @@ module.exports = class InitSessionsRedis {
26
25
  }),
27
26
  })
28
27
  );
29
- await ADDS.run("sessions.post", { config, options, master });
28
+ await emit("sessions.post", { config, options, master });
30
29
  }
31
30
  };
@@ -1,7 +1,5 @@
1
1
  const path = require("path");
2
2
 
3
- const ADDS = require("./additional");
4
-
5
3
  const DEFAULT_ROLES = ["root", "admin", "client", "user", "guest"];
6
4
 
7
5
  module.exports = class InitStatic {
@@ -40,8 +38,8 @@ module.exports = class InitStatic {
40
38
  };
41
39
  }
42
40
 
43
- async run({ config, options, master }) {
44
- await ADDS.run("static.pre", { config, options, master });
41
+ async run({ config, options, master, emit }) {
42
+ await emit("static.pre", { config, options, master });
45
43
  master.getServer().use(
46
44
  "/front/(:role).js",
47
45
  InitStatic.createStaticFrontServer("js", {
@@ -58,6 +56,6 @@ module.exports = class InitStatic {
58
56
  master,
59
57
  })
60
58
  );
61
- await ADDS.run("static.post", { config, options, master });
59
+ await emit("static.post", { config, options, master });
62
60
  }
63
61
  };
@@ -1,5 +1,4 @@
1
- const log = require("not-log")(module, "not-node//init");
2
- const ADDS = require("./additional");
1
+ const log = require("not-log")(module, "not-node//init//template");
3
2
 
4
3
  const DEFAULT = {
5
4
  views: "views",
@@ -12,12 +11,12 @@ module.exports = class InitTemplate {
12
11
  return val || DEFAULT;
13
12
  }
14
13
 
15
- async run({ config, options, master }) {
14
+ async run({ config, options, master, emit }) {
16
15
  const input = InitTemplate.loadConfig({ config });
17
16
  log.info("Setting up template (" + input.engine + ") engine...");
18
- await ADDS.run("template.pre", { config, options, master, input });
17
+ await emit("template.pre", { config, options, master, input });
19
18
  master.getServer().set("views", master.getAbsolutePath(input.views));
20
19
  master.getServer().set("view engine", input.engine);
21
- await ADDS.run("template.post", { config, options, master });
20
+ await emit("template.post", { config, options, master });
22
21
  }
23
22
  };
@@ -1,24 +1,25 @@
1
- const initEnv = require("./env");
2
- const initDB = require("./db");
3
- const initExpress = require("./express");
4
- const initCompression = require("./compression");
5
- const initSecurity = require("./security");
6
- const initBodyparser = require("./bodyparser");
7
- const initMethodOverride = require("./methodoverride");
8
- const initFileupload = require("./fileupload");
9
- const initNotApp = require("./app");
10
- const initSessions = require("./sessions");
11
- const initTemplate = require("./template");
12
- const initCORS = require("./cors");
1
+ const initEnv = require("./lib/env");
2
+ const initDB = require("./lib/db");
3
+ const InitDBRedlock = require("./lib/redlock");
4
+ const initExpress = require("./lib/express");
5
+ const initCompression = require("./lib/compression");
6
+ const initSecurity = require("./lib/security");
7
+ const initBodyparser = require("./lib/bodyparser");
8
+ const initMethodOverride = require("./lib/methodoverride");
9
+ const initFileupload = require("./lib/fileupload");
10
+ const initNotApp = require("./lib/app");
11
+ const initSessions = require("./lib/sessions");
12
+ const initTemplate = require("./lib/template");
13
+ const initCORS = require("./lib/cors");
13
14
  //const initCore = require('./core');
14
- const initMiddleware = require("./middleware");
15
- const initStatic = require("./static");
16
- const initRoutes = require("./routes");
17
- const initRateLimiter = require("./rateLimiter");
18
- const initModules = require("./modules");
19
- const initInformer = require("./informer");
20
- const initHTTP = require("./http");
21
- const initMonitoring = require("./monitoring");
15
+ const initMiddleware = require("./lib/middleware");
16
+ const initStatic = require("./lib/static");
17
+ const initRoutes = require("./lib/routes");
18
+ const initRateLimiter = require("./lib/rateLimiter");
19
+ const initModules = require("./lib/modules");
20
+ const initInformer = require("./lib/informer");
21
+ const initHTTP = require("./lib/http");
22
+ const initMonitoring = require("./lib/monitoring");
22
23
 
23
24
  module.exports = [
24
25
  //creating set of variables derived from basic ones,
@@ -26,6 +27,8 @@ module.exports = [
26
27
  initEnv,
27
28
  //DB access drivers
28
29
  initDB,
30
+ //locking mech based upon ioredis
31
+ InitDBRedlock,
29
32
  //http(s) server
30
33
  initExpress,
31
34
  initRateLimiter,
@@ -386,7 +386,7 @@ function close() {
386
386
  }
387
387
 
388
388
  function saveNewVersion() {
389
- return routine.update(this, { _id: this._id }, this.toObject());
389
+ return routine.update(this.constructor, { _id: this._id }, this.toObject());
390
390
  }
391
391
 
392
392
  module.exports.thisMethods = {
@@ -7,13 +7,13 @@ class VersioningExceptionSameOldData extends notError {
7
7
  }
8
8
  module.exports.VersioningExceptionSameOldData = VersioningExceptionSameOldData;
9
9
 
10
- class VersioningExceptioNoPreviousVersions extends notError {
10
+ class VersioningExceptionNoPpreviousVersions extends notError {
11
11
  constructor() {
12
12
  super("not-node:versioning_error_no_previous_versions");
13
13
  }
14
14
  }
15
- module.exports.VersioningExceptioNoPreviousVersions =
16
- VersioningExceptioNoPreviousVersions;
15
+ module.exports.VersioningExceptionNoPpreviousVersions =
16
+ VersioningExceptionNoPpreviousVersions;
17
17
 
18
18
  class IncrementExceptionIDGeneratorRebaseFailed extends notError {
19
19
  constructor() {
@@ -2,99 +2,153 @@
2
2
 
3
3
  const incrementNext = require("./increment");
4
4
  const { DBExceptionUpdateOneWasNotSuccessful } = require("../exceptions/db");
5
+
5
6
  //const { updateResponseSuccess } = require("./utils");
6
7
  class ModelRoutine {
7
- static incremental(model) {
8
- return model.schema.statics.__incField;
8
+ static incremental(ModelConstructor) {
9
+ return ModelConstructor.schema.statics.__incField;
9
10
  }
10
11
 
11
- static versioning(model) {
12
- return model.schema.statics.__versioning;
12
+ static versioning(ModelConstructor) {
13
+ return ModelConstructor.schema.statics.__versioning;
13
14
  }
14
15
 
15
- static addWithoutVersion(model, data) {
16
- return new model(data).save();
16
+ static addWithoutVersion(ModelConstructor, data) {
17
+ return new ModelConstructor(data).save();
17
18
  }
18
19
 
19
- static async addWithVersion(model, data) {
20
+ static async addWithVersion(ModelConstructor, data) {
20
21
  data.__latest = true;
21
- const item = await new model(data).save();
22
- return await model.saveVersion(item._id);
22
+ const item = await new ModelConstructor(data).save();
23
+ return await ModelConstructor.saveVersion(item._id);
23
24
  }
24
25
 
25
- static async add(model, data) {
26
- if (ModelRoutine.incremental(model)) {
26
+ static async add(ModelConstructor, data) {
27
+ if (ModelRoutine.incremental(ModelConstructor)) {
27
28
  const modelID = await incrementNext.next(
28
- model.__incModel,
29
- model.__incFilter,
29
+ ModelConstructor.__incModel,
30
+ ModelConstructor.__incFilter,
30
31
  data
31
32
  );
32
- data[model.__incField] = modelID;
33
- if (ModelRoutine.versioning(model)) {
34
- return await ModelRoutine.addWithVersion(model, data);
33
+ data[ModelConstructor.__incField] = modelID;
34
+ if (ModelRoutine.versioning(ModelConstructor)) {
35
+ return await ModelRoutine.addWithVersion(
36
+ ModelConstructor,
37
+ data
38
+ );
35
39
  } else {
36
- return await ModelRoutine.addWithoutVersion(model, data);
40
+ return await ModelRoutine.addWithoutVersion(
41
+ ModelConstructor,
42
+ data
43
+ );
37
44
  }
38
45
  } else {
39
- if (ModelRoutine.versioning(model)) {
40
- return await ModelRoutine.addWithVersion(model, data);
46
+ if (ModelRoutine.versioning(ModelConstructor)) {
47
+ return await ModelRoutine.addWithVersion(
48
+ ModelConstructor,
49
+ data
50
+ );
41
51
  } else {
42
- return await ModelRoutine.addWithoutVersion(model, data);
52
+ return await ModelRoutine.addWithoutVersion(
53
+ ModelConstructor,
54
+ data
55
+ );
43
56
  }
44
57
  }
45
58
  }
46
59
 
47
- static async update(model, filter, data) {
48
- if ("_id" in data) delete data._id;
49
- if (ModelRoutine.versioning(model)) {
50
- return ModelRoutine.updateWithVersion(model, filter, data);
60
+ static async update(ModelConstructor, filter, data) {
61
+ if (data && "_id" in data) delete data._id;
62
+ if (ModelRoutine.versioning(ModelConstructor)) {
63
+ return ModelRoutine.updateWithVersion(
64
+ ModelConstructor,
65
+ filter,
66
+ data
67
+ );
51
68
  } else {
52
- return ModelRoutine.updateWithoutVersion(model, filter, data);
69
+ return ModelRoutine.updateWithoutVersion(
70
+ ModelConstructor,
71
+ filter,
72
+ data
73
+ );
53
74
  }
54
75
  }
55
76
 
56
- static updateWithoutVersion(model, filter, data) {
57
- return model
58
- .findOneAndUpdate(filter, data, {
77
+ static updateWithoutVersion(ModelConstructor, filter, data) {
78
+ return ModelConstructor.findOneAndUpdate(
79
+ filter,
80
+ { $set: data },
81
+ {
59
82
  returnOriginal: false,
60
- returnDocument: "fater",
83
+ returnDocument: "after",
61
84
  new: true,
62
- })
63
- .exec();
85
+ }
86
+ )
87
+ .exec()
88
+ .then((result) => {
89
+ if (result) {
90
+ return result;
91
+ } else {
92
+ throw new Error("updateWithoutVersion FAILED");
93
+ }
94
+ });
64
95
  }
65
96
 
66
- static async updateWithVersion(model, filter, data) {
67
- filter.__latest = true;
68
- filter.__closed = false;
69
- const result = await model
70
- .findOneAndUpdate(filter, data, {
71
- returnOriginal: false,
72
- returnDocument: "fater",
73
- new: true,
74
- })
75
- .exec();
76
- if (result) {
77
- return model.saveVersion(result._id);
78
- } else {
79
- throw new DBExceptionUpdateOneWasNotSuccessful();
80
- }
97
+ static async updateWithVersion(ModelConstructor, filter, data) {
98
+ let result;
99
+ const session = await ModelConstructor.startSession();
100
+ await session.withTransaction(async () => {
101
+ filter.__latest = true;
102
+ filter.__closed = false;
103
+ if (ModelConstructor.findOneAndUpdate) {
104
+ const updateResult = await ModelConstructor.findOneAndUpdate(
105
+ filter,
106
+ { $set: data },
107
+ {
108
+ returnOriginal: false,
109
+ returnDocument: "after",
110
+ new: true,
111
+ }
112
+ );
113
+ if (updateResult) {
114
+ result = await ModelConstructor.saveVersion(
115
+ ModelConstructor,
116
+ updateResult._id
117
+ );
118
+ } else {
119
+ throw new DBExceptionUpdateOneWasNotSuccessful();
120
+ }
121
+ } else {
122
+ throw new DBExceptionUpdateOneWasNotSuccessful();
123
+ }
124
+ });
125
+ session.endSession();
126
+ return result;
81
127
  }
82
128
 
83
- static async updateMany(model, filter, data) {
129
+ static async updateMany(ModelConstructor, filter, data) {
84
130
  if ("_id" in data) delete data._id;
85
- if (ModelRoutine.versioning(model)) {
86
- return ModelRoutine.updateManyWithVersion(model, filter, data);
131
+ if (ModelRoutine.versioning(ModelConstructor)) {
132
+ return ModelRoutine.updateManyWithVersion(
133
+ ModelConstructor,
134
+ filter,
135
+ data
136
+ );
87
137
  } else {
88
- return ModelRoutine.updateManyWithoutVersion(model, filter, data);
138
+ return ModelRoutine.updateManyWithoutVersion(
139
+ ModelConstructor,
140
+ filter,
141
+ data
142
+ );
89
143
  }
90
144
  }
91
145
 
92
- static updateManyWithoutVersion(model, filter, data) {
93
- return model.updateMany(filter, data);
146
+ static updateManyWithoutVersion(ModelConstructor, filter, data) {
147
+ return ModelConstructor.updateMany(filter, data);
94
148
  }
95
149
 
96
- static async updateManyWithVersion(model, filter, data) {
97
- const list = await model.find({
150
+ static async updateManyWithVersion(ModelConstructor, filter, data) {
151
+ const list = await ModelConstructor.find({
98
152
  __closed: false,
99
153
  __latest: true,
100
154
  ...filter,
@@ -102,7 +156,7 @@ class ModelRoutine {
102
156
  return await Promise.allSettled(
103
157
  list.map((item) => {
104
158
  return ModelRoutine.updateWithVersion(
105
- model,
159
+ ModelConstructor,
106
160
  { _id: item._id },
107
161
  data
108
162
  );
@@ -11,8 +11,12 @@ const TECH_FIELDS = [
11
11
  "__closed",
12
12
  ];
13
13
 
14
+ function toObject(obj) {
15
+ return obj.toObject ? obj.toObject() : obj;
16
+ }
17
+
14
18
  const {
15
- VersioningExceptioNoPreviousVersions,
19
+ VersioningExceptioNoPpreviousVersions,
16
20
  VersioningExceptionSameOldData,
17
21
  } = require("./exceptions.js");
18
22
 
@@ -36,7 +40,7 @@ class ModelVersioning {
36
40
  doc.__versions = [];
37
41
  }
38
42
  doc.__versions.unshift(version._id); //первая в массиве последняя [3,2,1,0]
39
- return doc.save();
43
+ doc.markModified("__versions");
40
44
  }
41
45
 
42
46
  static stripTechData(a) {
@@ -47,7 +51,7 @@ class ModelVersioning {
47
51
  }
48
52
 
49
53
  static jsonCopy(a) {
50
- return JSON.parse(JSON.stringify(a));
54
+ return JSON.parse(JSON.stringify(toObject(a)));
51
55
  }
52
56
 
53
57
  static isThisDocsDifferent(a, b) {
@@ -61,20 +65,20 @@ class ModelVersioning {
61
65
 
62
66
  /**
63
67
  * Compares latest version in __versions list in data with data
64
- * @param {MongooseModel} thisModel model of data
68
+ * @param {MongooseModel} ModelConstructor model of data
65
69
  * @param {Object} data data to save
66
70
  * @return {boolean} if data differs from latest version
67
71
  */
68
- static async isNew(thisModel, data) {
72
+ static async isNew(ModelConstructor, data) {
69
73
  let latestId = ModelVersioning.getLatestVersionId(data);
70
- let previous = await thisModel.findById(latestId);
74
+ let previous = await ModelConstructor.findOne({ _id: latestId });
71
75
  if (typeof previous !== "undefined" && previous !== null) {
72
76
  return ModelVersioning.isThisDocsDifferent(
73
77
  data,
74
- previous.toObject()
78
+ toObject(previous)
75
79
  );
76
80
  } else {
77
- throw new VersioningExceptioNoPreviousVersions();
81
+ throw new VersioningExceptioNoPpreviousVersions();
78
82
  }
79
83
  }
80
84
 
@@ -82,28 +86,26 @@ class ModelVersioning {
82
86
  * Saves current version to versions archive, updates current version versioning tags
83
87
  * @param {ObjectId} id current version _id (just saved version)
84
88
  * @param {Object} data data to save
85
- * @param {MongooseModel} thisModel model to use
89
+ * @param {MongooseModel} ModelConstructor model to use
86
90
  * @return {Promise<MongooseDocument>} current version with updated versioning tags
87
91
  */
88
- static async saveVersion(id, data, model) {
92
+ static async saveVersion(id, data, ModelConstructor) {
89
93
  let preservedVersionNumber = ModelVersioning.extractVersionNumber(data),
90
94
  preservedVersionsList = [...data.__versions]; //making copy
91
- let different = await ModelVersioning.isNew(model, data);
95
+ let different = await ModelVersioning.isNew(ModelConstructor, data);
92
96
  if (different) {
93
97
  //it's not latest version, it's archived copy
94
98
  delete data.__latest;
95
99
  //saves to archive with preserved data
96
- let versionDoc = new model(data);
100
+ let versionDoc = new ModelConstructor(data);
97
101
  versionDoc.__version = preservedVersionNumber;
98
102
  versionDoc.__versions = preservedVersionsList;
99
103
  await versionDoc.save();
100
104
  //updating history
101
- let originalDoc = await model.findById(id).exec();
105
+ let originalDoc = await ModelConstructor.findOne({ _id: id });
102
106
  originalDoc.__version = preservedVersionNumber + 1;
103
- return await ModelVersioning.addVersionToHistory(
104
- originalDoc,
105
- versionDoc
106
- );
107
+ ModelVersioning.addVersionToHistory(originalDoc, versionDoc);
108
+ return await originalDoc.save();
107
109
  }
108
110
  throw new VersioningExceptionSameOldData();
109
111
  }
@@ -112,24 +114,24 @@ class ModelVersioning {
112
114
  * Saves first version. Run AFTER doing .save() on document.
113
115
  * @param {ObjectId} id current version _id (just saved version)
114
116
  * @param {Object} data data to save
115
- * @param {MongooseModel} thisModel model to use
117
+ * @param {MongooseModel} ModelConstructor model to use
116
118
  * @return {Promise<MongooseDocument>} current version with updated versions tags
117
119
  */
118
- static async saveFirstVersion(id, data, thisModel) {
120
+ static async saveFirstVersion(id, data, ModelConstructor) {
119
121
  //it's not latest version, it's archived copy
120
122
  delete data.__latest;
121
123
  //saves to archive
122
- let versionDoc = new thisModel(data);
124
+ let versionDoc = new ModelConstructor(data);
123
125
  await versionDoc.save();
124
126
  //retrieving original
125
- let originalDoc = await thisModel.findById(id).exec();
127
+
128
+ //const findById = getFunc(thisModel,'findById');
129
+ let originalDoc = await ModelConstructor.findOne({ _id: id });
126
130
  //first version
127
131
  originalDoc.__version = 1;
128
132
  //adding to history
129
- return await ModelVersioning.addVersionToHistory(
130
- originalDoc,
131
- versionDoc
132
- );
133
+ ModelVersioning.addVersionToHistory(originalDoc, versionDoc);
134
+ return await originalDoc.save();
133
135
  }
134
136
 
135
137
  /**
@@ -139,14 +141,14 @@ class ModelVersioning {
139
141
  * @param {MongooseModel} doc document to save
140
142
  * @return {Promise<MongooseDocument>} current version with updated versions tags
141
143
  */
142
- static saveDiff(doc) {
143
- let data = doc.toObject(),
144
+ static saveDiff(ModelConstructor, doc) {
145
+ let data = toObject(doc),
144
146
  id = data._id;
145
147
  delete data._id;
146
148
  if (ModelVersioning.versionsHistoryExists(data)) {
147
- return ModelVersioning.saveVersion(id, data, this);
149
+ return ModelVersioning.saveVersion(id, data, ModelConstructor);
148
150
  } else {
149
- return ModelVersioning.saveFirstVersion(id, data, this);
151
+ return ModelVersioning.saveFirstVersion(id, data, ModelConstructor);
150
152
  }
151
153
  }
152
154
 
@@ -157,10 +159,10 @@ class ModelVersioning {
157
159
  * add _id of copy to list of document.__versions
158
160
  * and increment __version number
159
161
  **/
160
- static version(id) {
161
- return this.findById(id)
162
- .exec()
163
- .then(ModelVersioning.saveDiff.bind(this));
162
+ static async version(id) {
163
+ const ModelConstructor = this;
164
+ const original = await ModelConstructor.findOne({ _id: id });
165
+ return await ModelVersioning.saveDiff(ModelConstructor, original);
164
166
  }
165
167
  }
166
168