cloudcms-server 0.9.257 → 0.9.262

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 (72) 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/framework/controllers.js +4 -4
  5. package/launchpad/index.js +174 -11
  6. package/launchpad/launchers/cluster.js +103 -107
  7. package/launchpad/launchers/redis.js +84 -0
  8. package/launchpad/launchers/single.js +36 -22
  9. package/locks/locks.js +4 -3
  10. package/locks/providers/cluster.js +1 -1
  11. package/locks/providers/memory.js +1 -1
  12. package/locks/providers/redis.js +57 -48
  13. package/middleware/authentication/providers/saml.js +1 -1
  14. package/middleware/awareness/awareness.js +51 -29
  15. package/middleware/awareness/providers/abstract-async.js +109 -70
  16. package/middleware/awareness/providers/abstract.js +1 -1
  17. package/middleware/awareness/providers/memory.js +0 -14
  18. package/middleware/awareness/providers/redis.js +113 -232
  19. package/middleware/cache/providers/redis.js +17 -21
  20. package/middleware/cloudcms/cloudcms.js +5 -1
  21. package/middleware/proxy/proxy.js +2 -1
  22. package/middleware/stores/stores.js +2 -2
  23. package/middleware/virtual-config/virtual-config.js +4 -4
  24. package/middleware/wcm/wcm.js +4 -4
  25. package/package.json +11 -6
  26. package/server/index.js +610 -576
  27. package/temp/clusterlock/index.js +2 -0
  28. package/temp/passport-saml/LICENSE +23 -0
  29. package/temp/passport-saml/README.md +406 -0
  30. package/temp/passport-saml/lib/node-saml/algorithms.d.ts +5 -0
  31. package/temp/passport-saml/lib/node-saml/algorithms.js +41 -0
  32. package/temp/passport-saml/lib/node-saml/algorithms.js.map +1 -0
  33. package/temp/passport-saml/lib/node-saml/index.d.ts +3 -0
  34. package/temp/passport-saml/lib/node-saml/index.js +6 -0
  35. package/temp/passport-saml/lib/node-saml/index.js.map +1 -0
  36. package/temp/passport-saml/lib/node-saml/inmemory-cache-provider.d.ts +45 -0
  37. package/temp/passport-saml/lib/node-saml/inmemory-cache-provider.js +86 -0
  38. package/temp/passport-saml/lib/node-saml/inmemory-cache-provider.js.map +1 -0
  39. package/temp/passport-saml/lib/node-saml/saml-post-signing.d.ts +3 -0
  40. package/temp/passport-saml/lib/node-saml/saml-post-signing.js +15 -0
  41. package/temp/passport-saml/lib/node-saml/saml-post-signing.js.map +1 -0
  42. package/temp/passport-saml/lib/node-saml/saml.d.ts +77 -0
  43. package/temp/passport-saml/lib/node-saml/saml.js +1170 -0
  44. package/temp/passport-saml/lib/node-saml/saml.js.map +1 -0
  45. package/temp/passport-saml/lib/node-saml/types.d.ts +95 -0
  46. package/temp/passport-saml/lib/node-saml/types.js +8 -0
  47. package/temp/passport-saml/lib/node-saml/types.js.map +1 -0
  48. package/temp/passport-saml/lib/node-saml/utility.d.ts +3 -0
  49. package/temp/passport-saml/lib/node-saml/utility.js +19 -0
  50. package/temp/passport-saml/lib/node-saml/utility.js.map +1 -0
  51. package/temp/passport-saml/lib/node-saml/xml.d.ts +21 -0
  52. package/temp/passport-saml/lib/node-saml/xml.js +140 -0
  53. package/temp/passport-saml/lib/node-saml/xml.js.map +1 -0
  54. package/temp/passport-saml/lib/passport-saml/index.d.ts +6 -0
  55. package/temp/passport-saml/lib/passport-saml/index.js +11 -0
  56. package/temp/passport-saml/lib/passport-saml/index.js.map +1 -0
  57. package/temp/passport-saml/lib/passport-saml/multiSamlStrategy.d.ts +13 -0
  58. package/temp/passport-saml/lib/passport-saml/multiSamlStrategy.js +63 -0
  59. package/temp/passport-saml/lib/passport-saml/multiSamlStrategy.js.map +1 -0
  60. package/temp/passport-saml/lib/passport-saml/strategy.d.ts +20 -0
  61. package/temp/passport-saml/lib/passport-saml/strategy.js +167 -0
  62. package/temp/passport-saml/lib/passport-saml/strategy.js.map +1 -0
  63. package/temp/passport-saml/lib/passport-saml/types.d.ts +51 -0
  64. package/temp/passport-saml/lib/passport-saml/types.js +11 -0
  65. package/temp/passport-saml/lib/passport-saml/types.js.map +1 -0
  66. package/temp/passport-saml/package.json +96 -0
  67. package/util/auth.js +1 -1
  68. package/util/cloudcms.js +6 -6
  69. package/util/proxy-factory.js +22 -7
  70. package/util/util.js +1 -1
  71. package/launchpad/launchers/sticky-cluster.js +0 -43
  72. package/web/socket.io/socket.io.js +0 -4240
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?
@@ -163,10 +163,10 @@ var handleInvalidate = function(req, res)
163
163
  // new timestamp
164
164
  process.env.CLOUDCMS_APPSERVER_TIMESTAMP = new Date().getTime();
165
165
 
166
- // update all socket clients
167
- process.IO.sockets.emit("timestamp", {
168
- "timestamp": process.env.CLOUDCMS_APPSERVER_TIMESTAMP
169
- });
166
+ // // update all socket clients
167
+ // process.IO.sockets.emit("timestamp", {
168
+ // "timestamp": process.env.CLOUDCMS_APPSERVER_TIMESTAMP
169
+ // });
170
170
 
171
171
  console.log("Server timestamp regenerated");
172
172
 
@@ -1,17 +1,180 @@
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
+ if (!fork)
53
+ {
54
+ return launchWorker(launcher, config, options, function(err, app, httpServer) {
55
+
56
+ if (err) {
57
+ return completionFn(config, err);
58
+ }
59
+
60
+ var httpServerPort = -1;
61
+ // if (app) {
62
+ // httpServerPort = app.get("port");
63
+ // }
64
+ if (httpServerPort === -1) {
65
+ httpServerPort = process.env.PORT;
66
+ }
67
+ if (httpServerPort === -1) {
68
+ httpServerPort = 3000;
69
+ }
70
+
71
+ httpServer.listen(httpServerPort);
72
+
73
+ reportFn(config);
74
+ completionFn(config);
75
+ });
76
+ }
77
+ else
78
+ {
79
+ if (cluster.isMaster)
80
+ {
81
+ return launchMaster(launcher, config, options, function(err, workers) {
82
+
83
+ if (err) {
84
+ return completionFn(config, err);
85
+ }
86
+
87
+ //reportFn(config);
88
+ completionFn(config);
89
+ });
90
+ }
91
+ else
92
+ {
93
+ return launchWorker(launcher, config, options, function(err) {
94
+ completionFn(config, err);
95
+ });
96
+ }
97
+ }
98
+ };
99
+
100
+ var launchMaster = function(launcher, config, options, done)
101
+ {
102
+ var createHttpServer = options.createHttpServer;
103
+
104
+ createHttpServer(null, function(err, httpServer) {
105
+
106
+ if (err) {
107
+ return done(err);
108
+ }
109
+
110
+ launcher.startCluster(httpServer, function(err) {
111
+
112
+ if (err) {
113
+ return done(err);
114
+ }
115
+
116
+ var httpServerPort = -1;
117
+ // if (app) {
118
+ // httpServerPort = app.get("port");
119
+ // }
120
+ if (httpServerPort === -1) {
121
+ httpServerPort = process.env.PORT;
122
+ }
123
+ if (httpServerPort === -1) {
124
+ httpServerPort = 3000;
125
+ }
126
+
127
+ httpServer.listen(httpServerPort);
128
+
129
+ launcher.afterStartCluster(httpServer, function(err, workers) {
130
+ done(err, workers);
131
+ });
132
+ });
133
+ });
134
+ };
12
135
 
13
- process.env.CLOUDCMS_LAUNCHPAD_SETUP = options.setup;
136
+ var launchWorker = function(launcher, config, options, done)
137
+ {
138
+ var startServer = options.startServer;
139
+
140
+ var configureServer = options.configureServer;
141
+ if (!configureServer) {
142
+ options.configureServer = configureServer = function(config, app, httpServer, done) {
143
+ done();
144
+ }
145
+ }
146
+
147
+ startServer(config, function(err, app, httpServer) {
148
+
149
+ if (err) {
150
+ return done(err);
151
+ }
152
+
153
+ launcher.afterStartServer(app, httpServer, function(err) {
154
+
155
+ if (err) {
156
+ return done(err);
157
+ }
158
+
159
+ configureServer(config, app, httpServer, function(err) {
160
+
161
+ if (err) {
162
+ return done(err);
163
+ }
164
+
165
+ // if we are on a worker process, then inform the master that we completed
166
+ if (process.send) {
167
+ process.send("worker-startup");
168
+ }
169
+
170
+ if (process.env["CLUSTER_REPORT"])
171
+ {
172
+ var reportFn = options.report;
173
+ reportFn(config);
174
+ }
14
175
 
15
- var launch = require("./launchers/" + options.setup);
16
- launch(options);
176
+ done(null, app, httpServer);
177
+ });
178
+ });
179
+ });
17
180
  };
@@ -1,121 +1,117 @@
1
- var cluster = require("cluster");
2
- var async = require("async");
3
-
4
1
  var clusterlock = require("../../temp/clusterlock");
5
2
 
6
- var workers = [];
7
-
8
- module.exports = function(options)
9
- {
10
- // always take up the max # of CPU's
11
- var cpuCount = require("os").cpus().length;
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");
12
8
 
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
- }
9
+ // numCPUs = 1;
10
+ // console.log("FORCE ONE CPU");
22
11
 
23
- if (cluster.isMaster)
12
+ module.exports = function(config) {
13
+
14
+ var r = {};
15
+
16
+ r.startCluster = function(httpServer, callback)
24
17
  {
25
- // master
26
-
27
- var fns = [];
28
- for (var i = 0; i < cpuCount; i++)
29
- {
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
- }
18
+ // setup sticky sessions
19
+ setupMaster(httpServer, {
20
+ loadBalancingMethod: "least-connection"
21
+ });
85
22
 
86
- async.parallel(fns, function (err) {
23
+ // setup connections between the workers
24
+ setupPrimary();
87
25
 
88
- // start up cluster locks
89
- clusterlock.setup();
26
+ // needed for packets containing buffers
27
+ cluster.setupPrimary({
28
+ serialization: "advanced"
29
+ });
90
30
 
91
- // tell the first worker to report
92
- if (workers.length > 0)
93
- {
94
- workers[0].send("server-report");
31
+ return callback();
32
+ };
33
+
34
+ r.afterStartCluster = function(httpServer, callback)
35
+ {
36
+ // start up cluster locks
37
+ clusterlock.setup();
38
+
39
+ var startupCount = 0;
40
+
41
+ var workers = [];
42
+ for (let i = 0; i < numCPUs; i++)
43
+ {
44
+ var workerEnv = {};
45
+ if (i === 0) {
46
+ workerEnv["CLUSTER_REPORT"] = true;
95
47
  }
96
-
97
- setTimeout(function() {
98
- completionCallback();
99
- }, 250);
48
+
49
+ var worker = cluster.fork(workerEnv);
50
+
51
+ worker.on('message', function (msg, c) {
52
+ //console.log("Worker message: " + msg + ", c: " + c);
53
+ if (msg === "worker-startup") {
54
+ startupCount++;
55
+ }
56
+ });
57
+
58
+ worker.on('error', function(err) {
59
+ console.log("Worker.on(error) - " + JSON.stringify(err));
60
+ });
61
+
62
+ workers.push(worker);
63
+ }
64
+
65
+ cluster.on("error", function(err) {
66
+ console.log("Cluster.on(error) - " + JSON.stringify(err));
100
67
  });
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")
68
+
69
+ cluster.on("exit", (worker) => {
70
+ console.log(`Worker ${worker.process.pid} died`);
71
+ cluster.fork();
72
+ });
73
+
74
+ // wait for workers to start
75
+ var waitFn = function() {
76
+ setTimeout(function() {
77
+ if (startupCount >= numCPUs) {
78
+ return callback(null, workers);
79
+ }
80
+ else
114
81
  {
115
- reportCallback();
82
+ waitFn();
116
83
  }
117
-
84
+ }, 25);
85
+ };
86
+ waitFn();
87
+ };
88
+
89
+ r.afterStartServer = function(app, httpServer, callback)
90
+ {
91
+ // worker
92
+
93
+ const io = new Server(httpServer);
94
+ httpServer.io = io;
95
+
96
+ // use the cluster adapter
97
+ io.adapter(createAdapter());
98
+
99
+ // setup connection with the primary process
100
+ setupWorker(io);
101
+
102
+ // on connect
103
+ io.on("connection", (socket) => {
104
+ // TODO
105
+
106
+ // always catch err
107
+ socket.on("error", function(err) {
108
+ console.log("Caught socket error");
109
+ console.log(err.stack);
118
110
  });
119
111
  });
120
- }
121
- };
112
+
113
+ return callback();
114
+ };
115
+
116
+ return r;
117
+ }
@@ -0,0 +1,84 @@
1
+ const { Server } = require("socket.io");
2
+ const { setupWorker } = require("@socket.io/sticky");
3
+ const { createAdapter } = require("@socket.io/redis-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
+ (async function(app, httpServer, callback) {
27
+ var redisOptions = redisHelper.redisOptions({}, "CLOUDCMS_CLUSTER");
28
+ await redisHelper.createAndConnect(redisOptions, function(err, _client) {
29
+
30
+ const pubClient = _client;
31
+ const subClient = pubClient.duplicate();
32
+
33
+ pubClient.on("error", function(err) {
34
+ // something went wrong
35
+ console.log("Pub Client caught error: ", err);
36
+ });
37
+
38
+ subClient.on("error", function(err) {
39
+ // something went wrong
40
+ console.log("Sub Client caught error: ", err);
41
+ });
42
+
43
+ const io = new Server(httpServer);
44
+ httpServer.io = io;
45
+
46
+ io.engine.on("connection_error", function(err) {
47
+ // console.log("CONNECTION ERROR");
48
+ // console.log("REQUEST: " + err.req); // the request object
49
+ // console.log("CODE: " + err.code); // the error code, for example 1
50
+ // console.log("MESSAGE: " + err.message); // the error message, for example "Session ID unknown"
51
+ // console.log("CONTEXT: " + err.context); // some additional error context
52
+ });
53
+
54
+ // use the redis adapter
55
+ io.adapter(createAdapter(pubClient, subClient, {
56
+ //publishOnSpecificResponseChannel: true
57
+ }));
58
+
59
+ // setup connection with the primary process
60
+ setupWorker(io);
61
+
62
+ // on connect
63
+ io.on("connection", (socket) => {
64
+ //console.log("Redis Launcher on('connection') - socket id:" + socket.id);
65
+ // socket.on('message', function(m) {
66
+ // console.log("Socket Connection message: " + m);
67
+ // });
68
+ //
69
+ // // always catch err
70
+ // socket.on("error", function(err) {
71
+ // console.log("Caught socket error");
72
+ // console.log(err.stack);
73
+ // });
74
+
75
+ // TODO
76
+ });
77
+
78
+ return callback();
79
+ });
80
+ })(app, httpServer, callback);
81
+ };
82
+
83
+ return r;
84
+ }
@@ -1,23 +1,37 @@
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
+ // always catch err
25
+ socket.on("error", function(err) {
26
+ console.log("Caught socket error");
27
+ console.log(err.stack);
28
+ });
29
+ });
30
+
31
+ httpServer.io = io;
32
+
33
+ callback();
34
+ };
35
+
36
+ return r;
37
+ }
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