cloudcms-server 3.3.1-beta.9 → 4.0.0-beta.2

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 (108) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +1 -1
  3. package/broadcast/broadcast.js +6 -3
  4. package/broadcast/providers/redis.js +24 -49
  5. package/clients/nrp.js +117 -0
  6. package/clients/redis.js +64 -0
  7. package/d1/index.js +629 -0
  8. package/d1/index.js.works +203 -0
  9. package/d1/package.json +86 -0
  10. package/d1/package.json.works +14 -0
  11. package/duster/helpers/sample/nyt.js +2 -1
  12. package/framework/controllers.js +4 -4
  13. package/index.js +21 -14
  14. package/insight/insight.js +1 -1
  15. package/launchpad/index.js +203 -11
  16. package/launchpad/launchers/cluster.js +103 -110
  17. package/launchpad/launchers/redis.js +70 -0
  18. package/launchpad/launchers/single.js +36 -22
  19. package/locks/locks.js +63 -9
  20. package/locks/providers/cluster.js +3 -1
  21. package/locks/providers/memory.js +10 -7
  22. package/locks/providers/redis.js +62 -82
  23. package/middleware/admin/admin.js +3 -3
  24. package/middleware/authentication/adapters/session.js +11 -8
  25. package/middleware/authentication/authentication.js +28 -16
  26. package/middleware/authentication/authenticators/default.js +5 -2
  27. package/middleware/authentication/authenticators/session.js +5 -2
  28. package/middleware/authentication/providers/saml.js +1 -1
  29. package/middleware/authorization/authorization.js +11 -8
  30. package/middleware/awareness/awareness.js +55 -31
  31. package/middleware/awareness/plugins/editorial.js +4 -4
  32. package/middleware/awareness/providers/abstract-async.js +107 -84
  33. package/middleware/awareness/providers/abstract.js +1 -1
  34. package/middleware/awareness/providers/memory.js +0 -14
  35. package/middleware/awareness/providers/redis.js +186 -279
  36. package/middleware/cache/cache.js +4 -2
  37. package/middleware/cache/providers/redis.js +127 -89
  38. package/middleware/cache/providers/shared-memory.js +3 -3
  39. package/middleware/cloudcms/cloudcms.js +22 -16
  40. package/middleware/form/form.js +3 -3
  41. package/middleware/modules/modules.js +6 -3
  42. package/middleware/proxy/proxy.js +8 -21
  43. package/middleware/stores/stores.js +2 -2
  44. package/middleware/virtual-config/virtual-config.js +11 -8
  45. package/middleware/wcm/wcm.js +4 -4
  46. package/notifications/notifications.js +2 -2
  47. package/package.json +29 -25
  48. package/server/index.js +504 -415
  49. package/server/standalone.js +9 -0
  50. package/temp/clusterlock/index.js +3 -3
  51. package/temp/clusterlock/package.json +1 -1
  52. package/temp/passport-saml/LICENSE +23 -0
  53. package/temp/passport-saml/README.md +406 -0
  54. package/temp/passport-saml/lib/node-saml/algorithms.d.ts +5 -0
  55. package/temp/passport-saml/lib/node-saml/algorithms.js +41 -0
  56. package/temp/passport-saml/lib/node-saml/algorithms.js.map +1 -0
  57. package/temp/passport-saml/lib/node-saml/index.d.ts +3 -0
  58. package/temp/passport-saml/lib/node-saml/index.js +6 -0
  59. package/temp/passport-saml/lib/node-saml/index.js.map +1 -0
  60. package/temp/passport-saml/lib/node-saml/inmemory-cache-provider.d.ts +45 -0
  61. package/temp/passport-saml/lib/node-saml/inmemory-cache-provider.js +86 -0
  62. package/temp/passport-saml/lib/node-saml/inmemory-cache-provider.js.map +1 -0
  63. package/temp/passport-saml/lib/node-saml/saml-post-signing.d.ts +3 -0
  64. package/temp/passport-saml/lib/node-saml/saml-post-signing.js +15 -0
  65. package/temp/passport-saml/lib/node-saml/saml-post-signing.js.map +1 -0
  66. package/temp/passport-saml/lib/node-saml/saml.d.ts +77 -0
  67. package/temp/passport-saml/lib/node-saml/saml.js +1170 -0
  68. package/temp/passport-saml/lib/node-saml/saml.js.map +1 -0
  69. package/temp/passport-saml/lib/node-saml/types.d.ts +95 -0
  70. package/temp/passport-saml/lib/node-saml/types.js +8 -0
  71. package/temp/passport-saml/lib/node-saml/types.js.map +1 -0
  72. package/temp/passport-saml/lib/node-saml/utility.d.ts +3 -0
  73. package/temp/passport-saml/lib/node-saml/utility.js +19 -0
  74. package/temp/passport-saml/lib/node-saml/utility.js.map +1 -0
  75. package/temp/passport-saml/lib/node-saml/xml.d.ts +21 -0
  76. package/temp/passport-saml/lib/node-saml/xml.js +140 -0
  77. package/temp/passport-saml/lib/node-saml/xml.js.map +1 -0
  78. package/temp/passport-saml/lib/passport-saml/index.d.ts +6 -0
  79. package/temp/passport-saml/lib/passport-saml/index.js +11 -0
  80. package/temp/passport-saml/lib/passport-saml/index.js.map +1 -0
  81. package/temp/passport-saml/lib/passport-saml/multiSamlStrategy.d.ts +13 -0
  82. package/temp/passport-saml/lib/passport-saml/multiSamlStrategy.js +63 -0
  83. package/temp/passport-saml/lib/passport-saml/multiSamlStrategy.js.map +1 -0
  84. package/temp/passport-saml/lib/passport-saml/strategy.d.ts +20 -0
  85. package/temp/passport-saml/lib/passport-saml/strategy.js +167 -0
  86. package/temp/passport-saml/lib/passport-saml/strategy.js.map +1 -0
  87. package/temp/passport-saml/lib/passport-saml/types.d.ts +51 -0
  88. package/temp/passport-saml/lib/passport-saml/types.js +11 -0
  89. package/temp/passport-saml/lib/passport-saml/types.js.map +1 -0
  90. package/temp/passport-saml/package.json +96 -0
  91. package/util/auth.js +6 -6
  92. package/util/cloudcms.js +106 -118
  93. package/util/proxy-factory.js +159 -268
  94. package/util/redis.js +113 -0
  95. package/util/renditions.js +12 -6
  96. package/util/request.js +12 -6
  97. package/util/util.js +16 -2
  98. package/launchpad/launchers/sticky-cluster.js +0 -43
  99. package/temp/memored/.jshintrc +0 -4
  100. package/temp/memored/README.md +0 -240
  101. package/temp/memored/demo/demo1.js +0 -37
  102. package/temp/memored/demo/demo2.js +0 -32
  103. package/temp/memored/gulpfile.js +0 -8
  104. package/temp/memored/index.js +0 -343
  105. package/temp/memored/package.json +0 -54
  106. package/temp/memored/spec/memored.spec.js +0 -265
  107. package/web/cms/ice.js +0 -109
  108. package/web/cms/preview.js +0 -106
@@ -0,0 +1,203 @@
1
+ var createProxyHandler = function(protocol, hostname, port, pathPrefix)
2
+ {
3
+ const proxy = require("http2-proxy");
4
+ const finalhandler = require('finalhandler')
5
+
6
+ const defaultWebHandler = function(err, req, res) {
7
+ if (err)
8
+ {
9
+ console.log("A web proxy error was caught, path: " + req.path + ", err: ", err);
10
+ try { res.status(500); } catch (e) { }
11
+ try { res.end('Something went wrong while proxying the request.'); } catch (e) { }
12
+ }
13
+
14
+ finalhandler(req, res)(err);
15
+ };
16
+
17
+ // web
18
+ var webConfig = {};
19
+ webConfig.hostname = hostname;
20
+ webConfig.port = port;
21
+ webConfig.protocol = protocol;
22
+ //webConfig.path = null;
23
+ webConfig.timeout = 120000;
24
+ webConfig.proxyTimeout = 120000;
25
+ webConfig.proxyName = "Cloud CMS UI Proxy";
26
+ webConfig.onReq = function(req, options) {
27
+
28
+ if (!options.headers) {
29
+ options.headers = {};
30
+ }
31
+ var headers = options.headers;
32
+
33
+ if (options.path && options.path.startsWith("/proxy")) {
34
+ options.path = options.path.substring(6);
35
+ }
36
+
37
+ if (pathPrefix) {
38
+ options.path = path.join(pathPrefix, options.path);
39
+ }
40
+
41
+ // used to auto-assign the client header for /oauth/token requests
42
+ //oauth2.autoProxy(req);
43
+
44
+ // copy domain host into "x-cloudcms-domainhost"
45
+ if (req.domainHost) {
46
+ headers["x-cloudcms-domainhost"] = req.domainHost; // this could be "localhost"
47
+ }
48
+
49
+ // copy virtual host into "x-cloudcms-virtualhost"
50
+ if (req.virtualHost) {
51
+ headers["x-cloudcms-virtualhost"] = req.virtualHost; // this could be "root.cloudcms.net" or "abc.cloudcms.net"
52
+ }
53
+
54
+ // copy deployment descriptor info
55
+ if (req.descriptor)
56
+ {
57
+ if (req.descriptor.tenant)
58
+ {
59
+ if (req.descriptor.tenant.id)
60
+ {
61
+ headers["x-cloudcms-tenant-id"] = req.descriptor.tenant.id;
62
+ }
63
+
64
+ if (req.descriptor.tenant.title)
65
+ {
66
+ headers["x-cloudcms-tenant-title"] = req.descriptor.tenant.title;
67
+ }
68
+ }
69
+
70
+ if (req.descriptor.application)
71
+ {
72
+ if (req.descriptor.application.id)
73
+ {
74
+ headers["x-cloudcms-application-id"] = req.descriptor.application.id;
75
+ }
76
+
77
+ if (req.descriptor.application.title)
78
+ {
79
+ headers["x-cloudcms-application-title"] = req.descriptor.application.title;
80
+ }
81
+ }
82
+ }
83
+
84
+ // set optional "x-cloudcms-origin" header
85
+ var cloudcmsOrigin = null;
86
+ if (req.virtualHost)
87
+ {
88
+ cloudcmsOrigin = req.virtualHost;
89
+ }
90
+ if (cloudcmsOrigin)
91
+ {
92
+ headers["x-cloudcms-origin"] = cloudcmsOrigin;
93
+ }
94
+
95
+ // set x-cloudcms-server-version header
96
+ //headers["x-cloudcms-server-version"] = process.env.CLOUDCMS_APPSERVER_PACKAGE_VERSION;
97
+
98
+ // keep alive
99
+ //req.headers["connection"] = "keep-alive";
100
+
101
+ // if the incoming request didn't have an "Authorization" header
102
+ // and we have a logged in Gitana User via Auth, then set authorization header to Bearer Access Token
103
+ if (!req.headers["authorization"])
104
+ {
105
+ if (req.gitana_user)
106
+ {
107
+ headers["authorization"] = "Bearer " + req.gitana_user.getDriver().http.accessToken();
108
+ }
109
+ else if (req.gitana_proxy_access_token)
110
+ {
111
+ headers["authorization"] = "Bearer " + req.gitana_proxy_access_token;
112
+ }
113
+ }
114
+ };
115
+ webConfig.onRes = function(req, res, proxyRes) {
116
+
117
+ // if (req.gitana_user)
118
+ // {
119
+ // var chunks = [];
120
+ //
121
+ // // triggers on data receive
122
+ // proxyRes.on('data', function(chunk) {
123
+ // // add received chunk to chunks array
124
+ // chunks.push(chunk);
125
+ // });
126
+ //
127
+ // proxyRes.on("end", function () {
128
+ //
129
+ // if (proxyRes.statusCode === 401)
130
+ // {
131
+ // var text = "" + Buffer.concat(chunks);
132
+ // if (text && (text.indexOf("invalid_token") > -1) || (text.indexOf("invalid_grant") > -1))
133
+ // {
134
+ // var identifier = req.identity_properties.provider_id + "/" + req.identity_properties.user_identifier;
135
+ //
136
+ // _LOCK([identifier], function(err, releaseLockFn) {
137
+ //
138
+ // if (err)
139
+ // {
140
+ // // failed to acquire lock
141
+ // console.log("FAILED TO ACQUIRE LOCK", err);
142
+ // req.log("FAILED TO ACQUIRE LOCK", err);
143
+ // try { releaseLockFn(); } catch (e) { }
144
+ // return;
145
+ // }
146
+ //
147
+ // var cleanup = function (full)
148
+ // {
149
+ // delete Gitana.APPS[req.identity_properties.token];
150
+ // delete Gitana.PLATFORM_CACHE[req.identity_properties.token];
151
+ //
152
+ // if (full) {
153
+ // auth.removeUserCacheEntry(identifier);
154
+ // }
155
+ // };
156
+ //
157
+ // // null out the access token
158
+ // // this will force the refresh token to be used to get a new one on the next request
159
+ // req.gitana_user.getDriver().http.refresh(function (err) {
160
+ //
161
+ // if (err) {
162
+ // cleanup(true);
163
+ // req.log("Invalidated auth state for gitana user: " + req.identity_properties.token);
164
+ // return releaseLockFn();
165
+ // }
166
+ //
167
+ // req.gitana_user.getDriver().reloadAuthInfo(function () {
168
+ // cleanup(true);
169
+ // req.log("Refreshed token for gitana user: " + req.identity_properties.token);
170
+ // releaseLockFn();
171
+ // });
172
+ // });
173
+ // });
174
+ // }
175
+ //
176
+ // }
177
+ // });
178
+ // }
179
+
180
+ //res.setHeader('x-powered-by', 'cloudcms');
181
+ res.writeHead(proxyRes.statusCode, proxyRes.headers)
182
+ proxyRes.pipe(res)
183
+ };
184
+
185
+ var proxyRequestHandler = function(req, res) {
186
+ proxy.web(req, res, webConfig, function(err, req, res) {
187
+ defaultWebHandler(err, req, res);
188
+ });
189
+ };
190
+
191
+ return proxyRequestHandler;
192
+ };
193
+
194
+ const http = require("http");
195
+ const server = http.createServer()
196
+ server.listen(3000);
197
+
198
+ var proxyRequestHandler = createProxyHandler("http", "api.default.svc.cluster.local", 80);
199
+ server.on('request', (req, res) => {
200
+ req.virtualHost = "mt85.us1.cloudcms.net";
201
+
202
+ proxyRequestHandler(req, res);
203
+ });
@@ -0,0 +1,86 @@
1
+ {
2
+ "name": "d1",
3
+ "description": "D1",
4
+ "version": "0.0.1",
5
+ "dependencies": {
6
+ "@socket.io/cluster-adapter": "^0.2.0",
7
+ "@socket.io/redis-adapter": "^7.2.0",
8
+ "@socket.io/sticky": "^1.0.1",
9
+ "accepts": "^1.3.8",
10
+ "agentkeepalive": "^4.2.1",
11
+ "alpaca": "^1.5.27",
12
+ "archiver": "^1.3.0",
13
+ "async": "^3.2.3",
14
+ "async-lock": "^1.3.2",
15
+ "aws-sdk": "^2.1208.0",
16
+ "basic-auth": "^2.0.1",
17
+ "body-parser": "^1.20.0",
18
+ "bytes": "^2.5.0",
19
+ "canoe": "^0.3.3",
20
+ "clone": "^2.1.2",
21
+ "connect-flash": "^0.1.1",
22
+ "connect-multiparty": "^2.2.0",
23
+ "connect-redis": "^6.1.3",
24
+ "consolidate": "^0.14.5",
25
+ "cookie-parser": "^1.4.4",
26
+ "debug": "^2.6.9",
27
+ "dustjs-helpers": "1.7.4",
28
+ "dustjs-linkedin": "3.0.1",
29
+ "errorhandler": "^1.5.1",
30
+ "express": "^4.18.1",
31
+ "express-session": "^1.17.3",
32
+ "express-useragent": "^1.0.15",
33
+ "extend-with-super": "^2.0.0",
34
+ "finalhandler": "^1.2.0",
35
+ "gitana": "^1.0.322",
36
+ "handlebars": "^4.4.2",
37
+ "hbs": "^4.0.5",
38
+ "helmet": "^4.6.0",
39
+ "http2-proxy": "^5.0.53",
40
+ "ioredis": "4.28.5",
41
+ "json5": "^1.0.1",
42
+ "jsonwebtoken": "^8.5.1",
43
+ "klaw": "^1.3.1",
44
+ "lru-cache": "^4.1.5",
45
+ "marked": "^4.0.14",
46
+ "memorystore": "^1.6.1",
47
+ "mime": "^1.6.0",
48
+ "mkdirp": "^0.5.1",
49
+ "moment": "^2.24.0",
50
+ "morgan": "^1.9.1",
51
+ "object-hash": "^1.3.1",
52
+ "object-merge": "^2.5.1",
53
+ "on-headers": "^1.0.2",
54
+ "passport": "^0.4.0",
55
+ "passport-cas": "^0.0.3",
56
+ "passport-facebook": "^2.1.1",
57
+ "passport-github": "^1.1.0",
58
+ "passport-google-oauth": "^1.0.0",
59
+ "passport-linkedin": "^1.0.0",
60
+ "passport-local": "^1.0.0",
61
+ "passport-oauth": "^1.0.0",
62
+ "passport-saml": "^2.2.0",
63
+ "passport-twitter": "^0.1.5",
64
+ "pkginfo": "^0.4.1",
65
+ "random-js": "^1.0.8",
66
+ "recursive-readdir": "^2.2.2",
67
+ "redis": "^4.2.0",
68
+ "redlock": "4.2.0",
69
+ "request": "^2.88.0",
70
+ "request-param": "^1.0.1",
71
+ "response-time": "^2.3.2",
72
+ "semver": "^7.3.7",
73
+ "serve-favicon": "^2.5.0",
74
+ "session-file-store": "^0.2.2",
75
+ "sha1": "^1.1.1",
76
+ "socket.io": "^4.5.1",
77
+ "ssl-root-cas": "^1.3.1",
78
+ "stomp-client": "^0.9.0",
79
+ "targz": "^1.0.1",
80
+ "temp": "^0.8.3",
81
+ "uuid": "^3.3.2",
82
+ "vm2": "^3.8.4",
83
+ "watch": "^0.13.0",
84
+ "winston": "^3.3.3"
85
+ }
86
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "author": {
3
+ "name": "Gitana Software, Inc.",
4
+ "email": "info@cloudcms.com",
5
+ "url": "https://www.cloudcms.com"
6
+ },
7
+ "name": "d1",
8
+ "description": "D1",
9
+ "version": "0.0.1",
10
+ "dependencies": {
11
+ "http2-proxy": "^5.0.53",
12
+ "finalhandler": "^1.2.0"
13
+ }
14
+ }
@@ -1,3 +1,5 @@
1
+ var request = require("../../util/request");
2
+
1
3
  /**
2
4
  * Sample New York Times Events tag for Dust.
3
5
  *
@@ -6,7 +8,6 @@
6
8
  exports = module.exports = function(app, dust, callback)
7
9
  {
8
10
  var support = require("../support")(dust);
9
- var request = require("../../util/request");
10
11
 
11
12
  // helper functions
12
13
  var isDefined = support.isDefined;
@@ -162,10 +162,10 @@ var handleInvalidate = function(req, res)
162
162
  // new timestamp
163
163
  process.env.CLOUDCMS_APPSERVER_TIMESTAMP = new Date().getTime();
164
164
 
165
- // update all socket clients
166
- process.IO.sockets.emit("timestamp", {
167
- "timestamp": process.env.CLOUDCMS_APPSERVER_TIMESTAMP
168
- });
165
+ // // update all socket clients
166
+ // process.IO.sockets.emit("timestamp", {
167
+ // "timestamp": process.env.CLOUDCMS_APPSERVER_TIMESTAMP
168
+ // });
169
169
 
170
170
  console.log("Server timestamp regenerated");
171
171
 
package/index.js CHANGED
@@ -34,7 +34,7 @@ process.logInfo = process.log = function(text, level)
34
34
  var Gitana = require("gitana");
35
35
 
36
36
  // default http timeout
37
- process.defaultHttpTimeoutMs = 120000; // 2 minutes
37
+ process.defaultHttpTimeoutMs = 60000;
38
38
 
39
39
  if (process.env.DEFAULT_HTTP_TIMEOUT_MS)
40
40
  {
@@ -48,27 +48,29 @@ if (process.env.DEFAULT_HTTP_TIMEOUT_MS)
48
48
  }
49
49
  }
50
50
 
51
+ // dns fix for Node 17 +
52
+ // see: https://nodejs.org/api/dns.html#dnssetdefaultresultorderorder
53
+ var dns = require("dns");
54
+ dns.setDefaultResultOrder("ipv4first");
55
+
51
56
  // default agents
52
57
  var HttpKeepAliveAgent = require('agentkeepalive');
53
- const templates = require("./middleware/templates/templates");
54
58
  var HttpsKeepAliveAgent = require('agentkeepalive').HttpsAgent;
55
59
  http.globalAgent = new HttpKeepAliveAgent({
56
60
  keepAlive: true,
57
- keepAliveMsecs: 1000,
58
- freeSocketTimeout: 30000,
61
+ keepAliveMsecs: 5000,
62
+ maxSockets: 16000,
63
+ maxFreeSockets: 256,
59
64
  timeout: process.defaultHttpTimeoutMs,
60
- maxSockets: 200,
61
- maxFreeSockets: 40,
62
- rejectUnauthorized: false
65
+ freeSocketTimeout: 4000
63
66
  });
64
67
  https.globalAgent = new HttpsKeepAliveAgent({
65
68
  keepAlive: true,
66
69
  keepAliveMsecs: 1000,
67
- freeSocketTimeout: 30000,
70
+ maxSockets: 16000,
71
+ maxFreeSockets: 256,
68
72
  timeout: process.defaultHttpTimeoutMs,
69
- maxSockets: 200,
70
- maxFreeSockets: 40,
71
- rejectUnauthorized: false
73
+ freeSocketTimeout: 4000
72
74
  });
73
75
 
74
76
  // disable for now
@@ -127,7 +129,7 @@ exports = module.exports = function()
127
129
  // TODO: this is to disable really annoying Express 3.0 deprecated's for multipart() which should hopefully
128
130
  // TODO: be resolved soon
129
131
  console.warn = function() {};
130
-
132
+
131
133
  process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
132
134
 
133
135
  // assume app-server base path if none provided
@@ -140,6 +142,7 @@ exports = module.exports = function()
140
142
  var defaultGitanaProxyScheme = "https";
141
143
  var defaultGitanaProxyHost = "api.cloudcms.com";
142
144
  var defaultGitanaProxyPort = 443;
145
+ var defaultGitanaProxyPath = "";
143
146
 
144
147
  var gitanaJsonPath = path.join(process.env.CLOUDCMS_APPSERVER_BASE_PATH, "gitana.json");
145
148
  if (fs.existsSync(gitanaJsonPath))
@@ -151,6 +154,7 @@ exports = module.exports = function()
151
154
 
152
155
  defaultGitanaProxyHost = parsedUrl.hostname;
153
156
  defaultGitanaProxyScheme = parsedUrl.protocol.substring(0, parsedUrl.protocol.length - 1); // remove the :
157
+ defaultGitanaProxyPath = parsedUrl.path;
154
158
 
155
159
  if (parsedUrl.port)
156
160
  {
@@ -177,10 +181,13 @@ exports = module.exports = function()
177
181
  if (!process.env.GITANA_PROXY_PORT) {
178
182
  process.env.GITANA_PROXY_PORT = defaultGitanaProxyPort;
179
183
  }
180
-
184
+ if (!process.env.GITANA_PROXY_PATH) {
185
+ process.env.GITANA_PROXY_PATH = defaultGitanaProxyPath;
186
+ }
187
+
181
188
  if (cluster.isMaster)
182
189
  {
183
- process.log("Gitana Proxy pointed to: " + util.asURL(process.env.GITANA_PROXY_SCHEME, process.env.GITANA_PROXY_HOST, process.env.GITANA_PROXY_PORT));
190
+ process.log("Gitana Proxy pointed to: " + util.asURL(process.env.GITANA_PROXY_SCHEME, process.env.GITANA_PROXY_HOST, process.env.GITANA_PROXY_PORT, process.env.GITANA_PROXY_PATH));
184
191
  }
185
192
 
186
193
  // all web modules are included by default
@@ -128,7 +128,7 @@ var doSend = function(callback)
128
128
  }
129
129
 
130
130
  // url over to cloud cms
131
- var URL = util.asURL(process.env.GITANA_PROXY_SCHEME, process.env.GITANA_PROXY_HOST, process.env.GITANA_PROXY_PORT) + "/warehouses/" + warehouseId + "/interactions/_create";
131
+ var URL = util.asURL(process.env.GITANA_PROXY_SCHEME, process.env.GITANA_PROXY_HOST, process.env.GITANA_PROXY_PORT, process.env.GITANA_PROXY_PATH) + "/warehouses/" + warehouseId + "/interactions/_create";
132
132
  var requestConfig = {
133
133
  "url": URL,
134
134
  "qs": {},
@@ -1,17 +1,209 @@
1
- module.exports = function(options)
1
+ const cluster = require("cluster");
2
+
3
+ // Handle uncaught exceptions...
4
+ process.on('uncaughtException', function(err, source) {
5
+ // if (err === "read ECONNRESET")
6
+ // {
7
+ // // skip
8
+ // }
9
+ // else
10
+ // {
11
+ console.log(`Launchpad - process received event 'uncaughtException': ${err}, source: ${source}`);
12
+ console.log(err.stack);
13
+ // }
14
+ });
15
+
16
+ module.exports = function(type, config, options)
2
17
  {
3
- // allow for override
4
- if (process.env.CLOUDCMS_LAUNCHPAD_SETUP) {
5
- options.setup = process.env.CLOUDCMS_LAUNCHPAD_SETUP;
18
+ if (!type) {
19
+ type = process.env.CLOUDCMS_LAUNCHPAD_SETUP;
6
20
  }
7
-
8
- // default to single mode
9
- if (!options.setup) {
10
- options.setup = "single";
21
+ if (!type) {
22
+ type = "single";
23
+ }
24
+
25
+ process.env.CLOUDCMS_LAUNCHPAD_SETUP = type
26
+
27
+ var launcherFactory = require("./launchers/" + type);
28
+ if (!launcherFactory)
29
+ {
30
+ throw new Error("Cannot find launcher factory: " + type);
31
+ }
32
+
33
+ var launcher = launcherFactory(config);
34
+
35
+ var reportFn = options.report;
36
+ if (!reportFn) {
37
+ options.report = reportFn = function () {};
38
+ }
39
+
40
+ var completionFn = options.complete;
41
+ if (!completionFn) {
42
+ options.complete = completionFn = function(err) {
43
+ throw new Error(err);
44
+ };
45
+ }
46
+
47
+ var fork = true;
48
+ if (type === "single") {
49
+ fork = false;
11
50
  }
51
+
52
+ var bindToListeningPort = function(app, httpServer)
53
+ {
54
+ var httpServerPort = -1;
55
+ if (app) {
56
+ httpServerPort = app.get("port");
57
+ }
58
+ if (httpServerPort === -1) {
59
+ httpServerPort = process.env.PORT;
60
+ }
61
+ if (httpServerPort === -1) {
62
+ httpServerPort = 3000;
63
+ }
64
+
65
+ httpServer.listen(httpServerPort);
66
+ }
67
+
68
+ var bindSignalHandler = function()
69
+ {
70
+ var signal = false;
71
+ process.on('SIGINT', function() {
72
+ if (!signal) {
73
+ signal = true;
74
+ console.log("-------");
75
+ console.log("Heard SIGINT - shutting down in 10 seconds...");
76
+ console.log("-------");
77
+ setTimeout(function() { process.exit(0); }, 10000);
78
+ }
79
+ });
80
+ process.on('SIGTERM', function() {
81
+ if (!signal) {
82
+ signal = true;
83
+ console.log("-------");
84
+ console.log("Heard SIGTERM - shutting down in 10 seconds...");
85
+ console.log("-------");
86
+ setTimeout(function() { process.exit(0); }, 10000);
87
+ }
88
+ });
89
+ };
90
+
91
+ if (!fork)
92
+ {
93
+ bindSignalHandler();
94
+
95
+ return launchWorker(launcher, config, options, function(err, app, httpServer) {
96
+
97
+ if (err) {
98
+ return completionFn(config, err);
99
+ }
100
+
101
+ // bind to listening port
102
+ bindToListeningPort(app, httpServer);
103
+
104
+ reportFn(config);
105
+ completionFn(config);
106
+ });
107
+ }
108
+ else
109
+ {
110
+ // in cluster mode, we have a single master listening to the port which distributes work to the workers
111
+
112
+ if (cluster.isMaster)
113
+ {
114
+ bindSignalHandler();
115
+
116
+ return launchMaster(launcher, config, options, function(err, workers, httpServer) {
117
+
118
+ if (err) {
119
+ return completionFn(config, err);
120
+ }
121
+
122
+ //reportFn(config);
123
+ completionFn(config);
124
+ });
125
+ }
126
+ else
127
+ {
128
+ return launchWorker(launcher, config, options, function(err, app, httpServer) {
129
+
130
+ // bind to listening port
131
+ bindToListeningPort(app, httpServer);
132
+
133
+ completionFn(config, err);
134
+ });
135
+ }
136
+ }
137
+ };
12
138
 
13
- process.env.CLOUDCMS_LAUNCHPAD_SETUP = options.setup;
139
+ var launchMaster = function(launcher, config, options, done)
140
+ {
141
+ var createHttpServer = options.createHttpServer;
142
+
143
+ createHttpServer(null, function(err, httpServer) {
144
+
145
+ if (err) {
146
+ return done(err);
147
+ }
148
+
149
+ launcher.startCluster(httpServer, function(err) {
150
+
151
+ if (err) {
152
+ return done(err);
153
+ }
154
+
155
+ launcher.afterStartCluster(httpServer, function(err, workers) {
156
+ console.log("LaunchPad started Master: " + process.pid);
157
+ done(err, workers, httpServer);
158
+ });
159
+ });
160
+ });
161
+ };
162
+
163
+ var launchWorker = function(launcher, config, options, done)
164
+ {
165
+ var startServer = options.startServer;
166
+
167
+ var configureServer = options.configureServer;
168
+ if (!configureServer) {
169
+ options.configureServer = configureServer = function(config, app, httpServer, done) {
170
+ done();
171
+ }
172
+ }
173
+
174
+ startServer(config, function(err, app, httpServer) {
175
+
176
+ if (err) {
177
+ return done(err);
178
+ }
179
+
180
+ launcher.afterStartServer(app, httpServer, function(err) {
181
+
182
+ if (err) {
183
+ return done(err);
184
+ }
185
+
186
+ configureServer(config, app, httpServer, function(err) {
187
+
188
+ if (err) {
189
+ return done(err);
190
+ }
191
+
192
+ // if we are on a worker process, then inform the master that we completed
193
+ if (process.send) {
194
+ process.send("worker-startup");
195
+ }
196
+
197
+ if (process.env["CLUSTER_REPORT"])
198
+ {
199
+ var reportFn = options.report;
200
+ reportFn(config);
201
+ }
14
202
 
15
- var launch = require("./launchers/" + options.setup);
16
- launch(options);
203
+ console.log("LaunchPad started Worker: " + process.pid);
204
+
205
+ done(null, app, httpServer);
206
+ });
207
+ });
208
+ });
17
209
  };