Skip to content

Commit 609568d

Browse files
committed
Allow replacing entire req.data property in all realtime middleware
1 parent c024b1a commit 609568d

File tree

2 files changed

+42
-32
lines changed

2 files changed

+42
-32
lines changed

scserver.js

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -535,11 +535,11 @@ SCServer.prototype._isPrivateTransmittedEvent = function (event) {
535535
return !!event && event.indexOf('#') == 0;
536536
};
537537

538-
SCServer.prototype.verifyInboundEvent = function (socket, event, data, cb) {
538+
SCServer.prototype.verifyInboundEvent = function (socket, eventName, eventData, cb) {
539539
var request = {
540540
socket: socket,
541-
event: event,
542-
data: data
541+
event: eventName,
542+
data: eventData
543543
};
544544

545545
var token = socket.getAuthToken();
@@ -578,15 +578,15 @@ SCServer.prototype._passThroughMiddleware = function (options, cb) {
578578

579579
if (this._isPrivateTransmittedEvent(event)) {
580580
if (event == this._subscribeEvent) {
581-
var data = options.data || {};
582-
request.channel = data.channel;
583-
request.waitForAuth = data.waitForAuth;
584-
request.data = data.data;
581+
var eventData = options.data || {};
582+
request.channel = eventData.channel;
583+
request.waitForAuth = eventData.waitForAuth;
584+
request.data = eventData.data;
585585

586586
if (request.waitForAuth && request.authTokenExpiredError) {
587587
// If the channel has the waitForAuth flag set, then we will handle the expiry quietly
588588
// and we won't pass this request through the subscribe middleware.
589-
cb(request.authTokenExpiredError);
589+
cb(request.authTokenExpiredError, eventData);
590590
} else {
591591
async.applyEachSeries(this._middleware[this.MIDDLEWARE_SUBSCRIBE], request,
592592
function (err) {
@@ -601,37 +601,43 @@ SCServer.prototype._passThroughMiddleware = function (options, cb) {
601601
self.emit('warning', err);
602602
}
603603
}
604-
cb(err);
604+
if (request.data !== undefined) {
605+
eventData.data = request.data;
606+
}
607+
cb(err, eventData);
605608
}
606609
}
607610
);
608611
}
609612
} else if (event == this._publishEvent) {
610613
if (this.allowClientPublish) {
611-
var data = options.data || {};
612-
request.channel = data.channel;
613-
request.data = data.data;
614+
var eventData = options.data || {};
615+
request.channel = eventData.channel;
616+
request.data = eventData.data;
614617

615618
async.applyEachSeries(this._middleware[this.MIDDLEWARE_PUBLISH_IN], request,
616619
function (err) {
617620
if (callbackInvoked) {
618621
self.emit('warning', new InvalidActionError('Callback for ' + self.MIDDLEWARE_PUBLISH_IN + ' middleware was already invoked'));
619622
} else {
620623
callbackInvoked = true;
624+
if (request.data !== undefined) {
625+
eventData.data = request.data;
626+
}
621627
if (err) {
622628
if (err === true) {
623629
err = new SilentMiddlewareBlockedError('Action was silently blocked by ' + self.MIDDLEWARE_PUBLISH_IN + ' middleware', self.MIDDLEWARE_PUBLISH_IN);
624630
} else if (self.middlewareEmitWarnings) {
625631
self.emit('warning', err);
626632
}
627-
cb(err);
633+
cb(err, eventData);
628634
} else {
629635
self.exchange.publish(request.channel, request.data, function (err) {
630636
if (err) {
631637
err = new BrokerError(err);
632638
self.emit('warning', err);
633639
}
634-
cb(err);
640+
cb(err, eventData);
635641
});
636642
}
637643
}
@@ -640,11 +646,11 @@ SCServer.prototype._passThroughMiddleware = function (options, cb) {
640646
} else {
641647
var noPublishError = new InvalidActionError('Client publish feature is disabled');
642648
self.emit('warning', noPublishError);
643-
cb(noPublishError);
649+
cb(noPublishError, options.data);
644650
}
645651
} else {
646652
// Do not allow blocking other reserved events or it could interfere with SC behaviour
647-
cb();
653+
cb(null, options.data);
648654
}
649655
} else {
650656
request.event = event;
@@ -663,48 +669,51 @@ SCServer.prototype._passThroughMiddleware = function (options, cb) {
663669
self.emit('warning', err);
664670
}
665671
}
666-
cb(err);
672+
cb(err, request.data);
667673
}
668674
}
669675
);
670676
}
671677
};
672678

673-
SCServer.prototype.verifyOutboundEvent = function (socket, event, data, options, cb) {
679+
SCServer.prototype.verifyOutboundEvent = function (socket, eventName, eventData, options, cb) {
674680
var self = this;
675681

676682
var callbackInvoked = false;
677683

678-
if (event == this._publishEvent) {
684+
if (eventName == this._publishEvent) {
679685
var request = {
680686
socket: socket,
681-
channel: data.channel,
682-
data: data.data
687+
channel: eventData.channel,
688+
data: eventData.data
683689
};
684690
async.applyEachSeries(this._middleware[this.MIDDLEWARE_PUBLISH_OUT], request,
685691
function (err) {
686692
if (callbackInvoked) {
687693
self.emit('warning', new InvalidActionError('Callback for ' + self.MIDDLEWARE_PUBLISH_OUT + ' middleware was already invoked'));
688694
} else {
689695
callbackInvoked = true;
696+
if (request.data !== undefined) {
697+
eventData.data = request.data;
698+
}
690699
if (err) {
691700
if (err === true) {
692701
err = new SilentMiddlewareBlockedError('Action was silently blocked by ' + self.MIDDLEWARE_PUBLISH_OUT + ' middleware', self.MIDDLEWARE_PUBLISH_OUT);
693702
} else if (self.middlewareEmitWarnings) {
694703
self.emit('warning', err);
695704
}
696-
cb(err);
705+
cb(err, eventData);
697706
} else {
698707
if (options && request.useCache) {
699708
options.useCache = true;
700709
}
701-
cb();
710+
cb(null, eventData);
702711
}
703712
}
704713
}
705714
);
706715
} else {
707-
cb();
716+
cb(null, eventData);
708717
}
709718
};
710719

scsocket.js

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -98,19 +98,20 @@ var SCSocket = function (id, server, socket) {
9898

9999
if (self._localEvents[eventName] == null) {
100100
var response = new Response(self, obj.cid);
101-
self.server.verifyInboundEvent(self, eventName, obj.data, function (err) {
101+
self.server.verifyInboundEvent(self, eventName, obj.data, function (err, newData) {
102102
if (err) {
103103
response.error(err);
104104
} else {
105+
var eventData = newData;
105106
if (eventName == '#disconnect') {
106-
var eventData = obj.data || {};
107-
self._onSCClose(eventData.code, eventData.data);
107+
var disconnectData = eventData || {};
108+
self._onSCClose(disconnectData.code, disconnectData.data);
108109
} else {
109110
if (self._autoAckEvents[eventName]) {
110111
response.end();
111-
SCEmitter.prototype.emit.call(self, eventName, obj.data);
112+
SCEmitter.prototype.emit.call(self, eventName, eventData);
112113
} else {
113-
SCEmitter.prototype.emit.call(self, eventName, obj.data, response.callback.bind(response));
114+
SCEmitter.prototype.emit.call(self, eventName, eventData, response.callback.bind(response));
114115
}
115116
}
116117
}
@@ -249,12 +250,12 @@ SCSocket.prototype.emit = function (event, data, callback, options) {
249250
var self = this;
250251

251252
if (this._localEvents[event] == null) {
252-
this.server.verifyOutboundEvent(this, event, data, options, function (err) {
253+
this.server.verifyOutboundEvent(this, event, data, options, function (err, newData) {
253254
var eventObject = {
254255
event: event
255256
};
256-
if (data !== undefined) {
257-
eventObject.data = data;
257+
if (newData !== undefined) {
258+
eventObject.data = newData;
258259
}
259260
eventObject.cid = self._nextCallId();
260261

0 commit comments

Comments
 (0)