cloudcms-server 0.9.257 → 0.9.260

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 (66) hide show
  1. package/README.md +1 -1
  2. package/broadcast/providers/redis.js +1 -1
  3. package/clients/redis.js +18 -2
  4. package/launchpad/index.js +161 -11
  5. package/launchpad/launchers/cluster.js +87 -109
  6. package/launchpad/launchers/redis.js +53 -0
  7. package/launchpad/launchers/single.js +30 -22
  8. package/locks/locks.js +4 -3
  9. package/locks/providers/cluster.js +1 -1
  10. package/locks/providers/memory.js +1 -1
  11. package/locks/providers/redis.js +57 -48
  12. package/middleware/authentication/providers/saml.js +2 -1
  13. package/middleware/awareness/awareness.js +12 -2
  14. package/middleware/cache/providers/redis.js +17 -21
  15. package/middleware/cloudcms/cloudcms.js +5 -1
  16. package/middleware/proxy/proxy.js +2 -1
  17. package/middleware/stores/stores.js +2 -2
  18. package/middleware/virtual-config/virtual-config.js +4 -4
  19. package/middleware/wcm/wcm.js +4 -4
  20. package/package.json +10 -5
  21. package/server/index.js +609 -573
  22. package/temp/clusterlock/index.js +2 -0
  23. package/temp/passport-saml/LICENSE +23 -0
  24. package/temp/passport-saml/README.md +406 -0
  25. package/temp/passport-saml/lib/node-saml/algorithms.d.ts +5 -0
  26. package/temp/passport-saml/lib/node-saml/algorithms.js +41 -0
  27. package/temp/passport-saml/lib/node-saml/algorithms.js.map +1 -0
  28. package/temp/passport-saml/lib/node-saml/index.d.ts +3 -0
  29. package/temp/passport-saml/lib/node-saml/index.js +6 -0
  30. package/temp/passport-saml/lib/node-saml/index.js.map +1 -0
  31. package/temp/passport-saml/lib/node-saml/inmemory-cache-provider.d.ts +45 -0
  32. package/temp/passport-saml/lib/node-saml/inmemory-cache-provider.js +86 -0
  33. package/temp/passport-saml/lib/node-saml/inmemory-cache-provider.js.map +1 -0
  34. package/temp/passport-saml/lib/node-saml/saml-post-signing.d.ts +3 -0
  35. package/temp/passport-saml/lib/node-saml/saml-post-signing.js +15 -0
  36. package/temp/passport-saml/lib/node-saml/saml-post-signing.js.map +1 -0
  37. package/temp/passport-saml/lib/node-saml/saml.d.ts +77 -0
  38. package/temp/passport-saml/lib/node-saml/saml.js +1170 -0
  39. package/temp/passport-saml/lib/node-saml/saml.js.map +1 -0
  40. package/temp/passport-saml/lib/node-saml/types.d.ts +95 -0
  41. package/temp/passport-saml/lib/node-saml/types.js +8 -0
  42. package/temp/passport-saml/lib/node-saml/types.js.map +1 -0
  43. package/temp/passport-saml/lib/node-saml/utility.d.ts +3 -0
  44. package/temp/passport-saml/lib/node-saml/utility.js +19 -0
  45. package/temp/passport-saml/lib/node-saml/utility.js.map +1 -0
  46. package/temp/passport-saml/lib/node-saml/xml.d.ts +21 -0
  47. package/temp/passport-saml/lib/node-saml/xml.js +140 -0
  48. package/temp/passport-saml/lib/node-saml/xml.js.map +1 -0
  49. package/temp/passport-saml/lib/passport-saml/index.d.ts +6 -0
  50. package/temp/passport-saml/lib/passport-saml/index.js +11 -0
  51. package/temp/passport-saml/lib/passport-saml/index.js.map +1 -0
  52. package/temp/passport-saml/lib/passport-saml/multiSamlStrategy.d.ts +13 -0
  53. package/temp/passport-saml/lib/passport-saml/multiSamlStrategy.js +63 -0
  54. package/temp/passport-saml/lib/passport-saml/multiSamlStrategy.js.map +1 -0
  55. package/temp/passport-saml/lib/passport-saml/strategy.d.ts +20 -0
  56. package/temp/passport-saml/lib/passport-saml/strategy.js +167 -0
  57. package/temp/passport-saml/lib/passport-saml/strategy.js.map +1 -0
  58. package/temp/passport-saml/lib/passport-saml/types.d.ts +51 -0
  59. package/temp/passport-saml/lib/passport-saml/types.js +11 -0
  60. package/temp/passport-saml/lib/passport-saml/types.js.map +1 -0
  61. package/temp/passport-saml/package.json +96 -0
  62. package/util/auth.js +1 -1
  63. package/util/cloudcms.js +6 -6
  64. package/util/proxy-factory.js +22 -7
  65. package/util/util.js +1 -1
  66. package/launchpad/launchers/sticky-cluster.js +0 -43
package/README.md CHANGED
@@ -13,7 +13,7 @@ This looks like:
13
13
 
14
14
  ````
15
15
  {
16
- "setup": "single", // single, cluster, sticky-cluster
16
+ "setup": "single", // single, cluster, redis
17
17
  "name": "Cloud CMS Application Server",
18
18
  "socketFunctions": [],
19
19
  "routeFunctions": [],
@@ -29,7 +29,7 @@ exports = module.exports = function(broadcastConfig)
29
29
  "scope": "broadcast_cache"
30
30
  };
31
31
 
32
- logger.info("using config = " + nrpConfig);
32
+ //logger.info("using config = " + nrpConfig);
33
33
 
34
34
  nrp = new NRP(nrpConfig);
35
35
  nrp.connect(function(err) {
package/clients/redis.js CHANGED
@@ -1,4 +1,4 @@
1
- var redis = require("redis");
1
+ //var redis = require("redis");
2
2
  var redisHelper = require("../util/redis");
3
3
 
4
4
  var clients = {};
@@ -10,18 +10,34 @@ var clients = {};
10
10
  */
11
11
  exports = module.exports = {};
12
12
 
13
- var create = exports.create = function(config, callback)
13
+ var create = exports.create = function(config, baseOptions, callback)
14
14
  {
15
15
  if (typeof(config) === "function") {
16
16
  callback = config;
17
17
  config = {};
18
+ baseOptions = {};
19
+ }
20
+
21
+ if (typeof(baseOptions) === "function") {
22
+ callback = baseOptions;
23
+ baseOptions = {};
18
24
  }
19
25
 
20
26
  if (!config) {
21
27
  config = {};
22
28
  }
23
29
 
30
+ if (!baseOptions) {
31
+ baseOptions = {};
32
+ }
33
+
24
34
  var redisOptions = redisHelper.redisOptions(config);
35
+ if (baseOptions) {
36
+ for (var k in baseOptions) {
37
+ redisOptions[k] = baseOptions[k];
38
+ }
39
+ }
40
+
25
41
  var url = redisOptions.url;
26
42
 
27
43
  // cached client?
@@ -1,17 +1,167 @@
1
- module.exports = function(options)
1
+ const cluster = require("cluster");
2
+
3
+ module.exports = function(type, config, options)
2
4
  {
3
- // allow for override
4
- if (process.env.CLOUDCMS_LAUNCHPAD_SETUP) {
5
- options.setup = process.env.CLOUDCMS_LAUNCHPAD_SETUP;
5
+ if (!type) {
6
+ type = process.env.CLOUDCMS_LAUNCHPAD_SETUP;
6
7
  }
7
-
8
- // default to single mode
9
- if (!options.setup) {
10
- options.setup = "single";
8
+ if (!type) {
9
+ type = "single";
10
+ }
11
+
12
+ process.env.CLOUDCMS_LAUNCHPAD_SETUP = type
13
+
14
+ var launcherFactory = require("./launchers/" + type);
15
+ if (!launcherFactory)
16
+ {
17
+ throw new Error("Cannot find launcher factory: " + type);
18
+ }
19
+
20
+ var launcher = launcherFactory(config);
21
+
22
+ var reportFn = options.report;
23
+ if (!reportFn) {
24
+ options.report = reportFn = function () {};
25
+ }
26
+
27
+ var completionFn = options.complete;
28
+ if (!completionFn) {
29
+ options.complete = completionFn = function(err) {
30
+ throw new Error(err);
31
+ };
32
+ }
33
+
34
+ var fork = true;
35
+ if (type === "single") {
36
+ fork = false;
11
37
  }
38
+
39
+ if (!fork)
40
+ {
41
+ return launchWorker(launcher, config, options, function(err, app, httpServer) {
42
+
43
+ if (err) {
44
+ return completionFn(config, err);
45
+ }
46
+
47
+ var httpServerPort = -1;
48
+ // if (app) {
49
+ // httpServerPort = app.get("port");
50
+ // }
51
+ if (httpServerPort === -1) {
52
+ httpServerPort = process.env.PORT;
53
+ }
54
+ if (httpServerPort === -1) {
55
+ httpServerPort = 3000;
56
+ }
57
+
58
+ httpServer.listen(httpServerPort);
59
+
60
+ reportFn(config);
61
+ completionFn(config);
62
+ });
63
+ }
64
+ else
65
+ {
66
+ if (cluster.isMaster)
67
+ {
68
+ return launchMaster(launcher, config, options, function(err, workers) {
69
+
70
+ if (err) {
71
+ return completionFn(config, err);
72
+ }
73
+
74
+ //reportFn(config);
75
+ completionFn(config);
76
+ });
77
+ }
78
+ else
79
+ {
80
+ return launchWorker(launcher, config, options, function(err) {
81
+ completionFn(config, err);
82
+ });
83
+ }
84
+ }
85
+ };
86
+
87
+ var launchMaster = function(launcher, config, options, done)
88
+ {
89
+ var createHttpServer = options.createHttpServer;
90
+
91
+ createHttpServer(null, function(err, httpServer) {
92
+
93
+ if (err) {
94
+ return done(err);
95
+ }
96
+
97
+ launcher.startCluster(httpServer, function(err) {
98
+
99
+ if (err) {
100
+ return done(err);
101
+ }
102
+
103
+ var httpServerPort = -1;
104
+ // if (app) {
105
+ // httpServerPort = app.get("port");
106
+ // }
107
+ if (httpServerPort === -1) {
108
+ httpServerPort = process.env.PORT;
109
+ }
110
+ if (httpServerPort === -1) {
111
+ httpServerPort = 3000;
112
+ }
113
+
114
+ httpServer.listen(httpServerPort);
115
+
116
+ launcher.afterStartCluster(httpServer, function(err, workers) {
117
+ done(err, workers);
118
+ });
119
+ });
120
+ });
121
+ };
12
122
 
13
- process.env.CLOUDCMS_LAUNCHPAD_SETUP = options.setup;
123
+ var launchWorker = function(launcher, config, options, done)
124
+ {
125
+ var startServer = options.startServer;
126
+
127
+ var configureServer = options.configureServer;
128
+ if (!configureServer) {
129
+ options.configureServer = configureServer = function(config, app, httpServer, done) {
130
+ done();
131
+ }
132
+ }
133
+
134
+ startServer(config, function(err, app, httpServer) {
135
+
136
+ if (err) {
137
+ return done(err);
138
+ }
139
+
140
+ launcher.afterStartServer(app, httpServer, function(err) {
141
+
142
+ if (err) {
143
+ return done(err);
144
+ }
145
+
146
+ configureServer(config, app, httpServer, function(err) {
147
+
148
+ if (err) {
149
+ return done(err);
150
+ }
151
+
152
+ // if we are on a worker process, then inform the master that we completed
153
+ if (process.send) {
154
+ process.send("worker-startup");
155
+ }
156
+
157
+ if (process.env["CLUSTER_REPORT"])
158
+ {
159
+ var reportFn = options.report;
160
+ reportFn(config);
161
+ }
14
162
 
15
- var launch = require("./launchers/" + options.setup);
16
- launch(options);
163
+ done(null, app, httpServer);
164
+ });
165
+ });
166
+ });
17
167
  };
@@ -1,121 +1,99 @@
1
- var cluster = require("cluster");
2
- var async = require("async");
3
-
4
1
  var clusterlock = require("../../temp/clusterlock");
5
2
 
6
- var workers = [];
3
+ const cluster = require("cluster");
4
+ const { Server } = require("socket.io");
5
+ const numCPUs = require("os").cpus().length;
6
+ const { setupMaster, setupWorker } = require("@socket.io/sticky");
7
+ const { createAdapter, setupPrimary } = require("@socket.io/cluster-adapter");
8
+
9
+ module.exports = function(config) {
10
+
11
+ var r = {};
12
+
13
+ r.startCluster = function(httpServer, callback)
14
+ {
15
+ // setup sticky sessions
16
+ setupMaster(httpServer, {
17
+ loadBalancingMethod: "least-connection",
18
+ });
7
19
 
8
- module.exports = function(options)
9
- {
10
- // always take up the max # of CPU's
11
- var cpuCount = require("os").cpus().length;
20
+ // setup connections between the workers
21
+ setupPrimary();
12
22
 
13
- var factoryCallback = options.factory;
14
- var reportCallback = options.report;
15
- if (!reportCallback) {
16
- reportCallback = function() { };
17
- }
18
- var completionCallback = options.complete;
19
- if (!completionCallback) {
20
- completionCallback = function() { };
21
- }
23
+ // needed for packets containing buffers
24
+ cluster.setupPrimary({
25
+ serialization: "advanced"
26
+ });
22
27
 
23
- if (cluster.isMaster)
28
+ return callback();
29
+ };
30
+
31
+ r.afterStartCluster = function(httpServer, callback)
24
32
  {
25
- // master
26
-
27
- var fns = [];
28
- for (var i = 0; i < cpuCount; i++)
33
+ // start up cluster locks
34
+ clusterlock.setup();
35
+
36
+ var startupCount = 0;
37
+
38
+ var workers = [];
39
+ for (let i = 0; i < numCPUs; i++)
29
40
  {
30
- var fn = function (i, workers) {
31
- return function (done) {
32
-
33
- var spawn = function (i, afterSpawnFn) {
34
-
35
- if (!afterSpawnFn) {
36
- afterSpawnFn = function () { };
37
- }
38
-
39
- workers[i] = cluster.fork();
40
-
41
- workers[i].on('exit', function (worker, workers, i) {
42
- return function() {
43
- console.error("launchpad: worker " + i + " exited");
44
- worker.exited = true;
45
-
46
- // are all workers exited?
47
- var all = true;
48
- for (var z = 0; z < workers.length; z++)
49
- {
50
- if (!workers[z].exited) {
51
- all = false;
52
- }
53
- }
54
-
55
- if (all)
56
- {
57
- console.log("launchpad: all workers exited, terminating process");
58
- return process.exit(-1);
59
- }
60
-
61
- // set a timeout to otherwise restart worker in 5 seconds
62
- setTimeout(function() {
63
- console.log("launchpad: restarting worker: " + i);
64
- spawn(i);
65
- worker.exited = false;
66
- }, 5000);
67
- }
68
- }(workers[i], workers, i));
69
-
70
- workers[i].on('message', function (msg, c) {
71
-
72
- if (msg === "server-startup")
73
- {
74
- afterSpawnFn();
75
- }
76
- });
77
- };
78
- spawn(i, function () {
79
- done();
80
- });
81
- };
82
- }(i, workers);
83
- fns.push(fn);
84
- }
85
-
86
- async.parallel(fns, function (err) {
87
-
88
- // start up cluster locks
89
- clusterlock.setup();
90
-
91
- // tell the first worker to report
92
- if (workers.length > 0)
93
- {
94
- workers[0].send("server-report");
41
+ var workerEnv = {};
42
+ if (i === 0) {
43
+ workerEnv["CLUSTER_REPORT"] = true;
95
44
  }
96
-
97
- setTimeout(function() {
98
- completionCallback();
99
- }, 250);
45
+
46
+ var worker = cluster.fork(workerEnv);
47
+
48
+ worker.on('message', function (msg, c) {
49
+ if (msg === "worker-startup") {
50
+ startupCount++;
51
+ }
52
+ });
53
+
54
+ workers.push(worker);
55
+ }
56
+
57
+ cluster.on("exit", (worker) => {
58
+ console.log(`Worker ${worker.process.pid} died`);
59
+ cluster.fork();
100
60
  });
101
- }
102
- else
103
- {
104
- // slave
105
-
106
- factoryCallback(function(server) {
107
-
108
- server.listen(server._listenPort);
109
-
110
- // listen for the "server-report" message and fire the callback
111
- process.on('message', function (msg, msgData) {
112
-
113
- if (msg === "server-report")
61
+
62
+ // wait for workers to start
63
+ var waitFn = function() {
64
+ setTimeout(function() {
65
+ if (startupCount >= numCPUs) {
66
+ return callback(null, workers);
67
+ }
68
+ else
114
69
  {
115
- reportCallback();
70
+ waitFn();
116
71
  }
117
-
118
- });
72
+ }, 25);
73
+ };
74
+ waitFn();
75
+ };
76
+
77
+ r.afterStartServer = function(app, httpServer, callback)
78
+ {
79
+ // worker
80
+
81
+ const io = new Server(httpServer);
82
+
83
+ // use the cluster adapter
84
+ io.adapter(createAdapter());
85
+
86
+ // setup connection with the primary process
87
+ setupWorker(io);
88
+
89
+ io.on("connection", (socket) => {
90
+ // TODO
119
91
  });
120
- }
121
- };
92
+
93
+ httpServer.io = io;
94
+
95
+ return callback();
96
+ };
97
+
98
+ return r;
99
+ }
@@ -0,0 +1,53 @@
1
+ const { Server } = require("socket.io");
2
+ const { setupWorker } = require("@socket.io/sticky");
3
+ const { createAdapter } = require("@socket.io/cluster-adapter");
4
+ const redisHelper = require("../../util/redis");
5
+
6
+ const clusterLauncherFactory = require("./cluster");
7
+
8
+ module.exports = function(config) {
9
+
10
+ var clusterLauncher = clusterLauncherFactory(config);
11
+
12
+ var r = {};
13
+
14
+ r.startCluster = function(httpServer, callback)
15
+ {
16
+ clusterLauncher.startCluster(httpServer, callback);
17
+ };
18
+
19
+ r.afterStartCluster = function(httpServer, callback)
20
+ {
21
+ clusterLauncher.afterStartCluster(httpServer, callback);
22
+ };
23
+
24
+ r.afterStartServer = function(app, httpServer, callback)
25
+ {
26
+ const io = new Server(httpServer);
27
+
28
+ (async function() {
29
+ var redisOptions = redisHelper.redisOptions({}, "CLOUDCMS_CLUSTER");
30
+ await redisHelper.createAndConnect(redisOptions, function(err, _client) {
31
+
32
+ const pubClient = _client;
33
+ const subClient = pubClient.duplicate();
34
+
35
+ io.adapter(createAdapter(pubClient, subClient));
36
+ //io.listen(httpServerPort);
37
+
38
+ io.on("connection", (socket) => {
39
+ // TODO
40
+ });
41
+
42
+ // setup connection with the primary process
43
+ setupWorker(io);
44
+
45
+ httpServer.io = io;
46
+
47
+ return callback();
48
+ });
49
+ })();
50
+ };
51
+
52
+ return r;
53
+ }
@@ -1,23 +1,31 @@
1
- module.exports = function(options) {
1
+ const { Server } = require("socket.io");
2
2
 
3
- var factoryCallback = options.factory;
4
- var reportCallback = options.report;
5
- if (!reportCallback) {
6
- reportCallback = function () {
7
- };
8
- }
9
- var completionCallback = options.complete;
10
- if (!completionCallback) {
11
- completionCallback = function () {
12
- };
13
- }
14
-
15
- factoryCallback(function (server) {
16
-
17
- reportCallback();
18
-
19
- server.listen(server._listenPort);
20
-
21
- completionCallback();
22
- });
23
- };
3
+ module.exports = function(config) {
4
+
5
+ var r = {};
6
+
7
+ r.startCluster = function(httpServer, callback)
8
+ {
9
+ callback();
10
+ };
11
+
12
+ r.afterStartCluster = function(httpServer, callback)
13
+ {
14
+ callback();
15
+ };
16
+
17
+ r.afterStartServer = function(app, httpServer, callback)
18
+ {
19
+ var io = new Server(httpServer);
20
+
21
+ io.on("connection", (socket) => {
22
+ // TODO
23
+ });
24
+
25
+ httpServer.io = io;
26
+
27
+ callback();
28
+ };
29
+
30
+ return r;
31
+ }
package/locks/locks.js CHANGED
@@ -34,7 +34,8 @@ exports = module.exports = function()
34
34
  var self = this;
35
35
 
36
36
  // set up defaults
37
- if (!process.env.CLOUDCMS_LOCKS_TYPE) {
37
+ if (!process.env.CLOUDCMS_LOCKS_TYPE)
38
+ {
38
39
  process.env.CLOUDCMS_LOCKS_TYPE = "memory";
39
40
 
40
41
  if (process.configuration.setup !== "single") {
@@ -71,8 +72,8 @@ exports = module.exports = function()
71
72
  */
72
73
  var lock = r.lock = function(key, fn)
73
74
  {
74
- provider.lock(key, function(releaseFn) {
75
- fn(function(afterReleaseCallback) {
75
+ provider.lock(key, function(err, releaseFn) {
76
+ fn(err, function(afterReleaseCallback) {
76
77
 
77
78
  releaseFn();
78
79
 
@@ -19,7 +19,7 @@ exports = module.exports = function(lockConfig)
19
19
  r.lock = function(key, fn)
20
20
  {
21
21
  ClusterLock.lock(key, function(releaseCallbackFn) {
22
- fn(releaseCallbackFn);
22
+ fn(null, releaseCallbackFn);
23
23
  });
24
24
  };
25
25
 
@@ -23,7 +23,7 @@ exports = module.exports = function(lockConfig)
23
23
  r.lock = function(key, fn)
24
24
  {
25
25
  locker.writeLock(key, function(releaseCallbackFn) {
26
- fn(releaseCallbackFn);
26
+ fn(null, releaseCallbackFn);
27
27
  });
28
28
  };
29
29