[MessageHandler] Re-factor the _onComObjOnMessage function to use early returns

When `ReadableStream` support was added to the `MessageHandler`, the `_onComObjOnMessage` function became more complex than previously.
All of the nested `if`/`else if`/`else` branches are now, at least in my opinion, making some of this code a bit difficult to follow. Hence this patch, which attempts to help readability by making use of early `return`s and `Error`s.

The patch also changes a couple of `var`/`let` occurences to `const`.
This commit is contained in:
Jonas Jenwald 2019-10-30 12:12:50 +01:00
parent 62f28e11a3
commit f61fb3e0f9

View File

@ -70,64 +70,67 @@ function MessageHandler(sourceName, targetName, comObj) {
this.streamSinks = Object.create(null); this.streamSinks = Object.create(null);
this.streamControllers = Object.create(null); this.streamControllers = Object.create(null);
this.callbackCapabilities = Object.create(null); this.callbackCapabilities = Object.create(null);
const ah = this.actionHandler = Object.create(null); this.actionHandler = Object.create(null);
this._onComObjOnMessage = (event) => { this._onComObjOnMessage = (event) => {
let data = event.data; const data = event.data;
if (data.targetName !== this.sourceName) { if (data.targetName !== this.sourceName) {
return; return;
} }
if (data.stream) { if (data.stream) {
this._processStreamMessage(data); this._processStreamMessage(data);
} else if (data.callback) { return;
}
if (data.callback) {
const callbackId = data.callbackId; const callbackId = data.callbackId;
const capability = this.callbackCapabilities[callbackId]; const capability = this.callbackCapabilities[callbackId];
if (!capability) {
if (capability) {
delete this.callbackCapabilities[callbackId];
if (data.callback === CallbackKind.DATA) {
capability.resolve(data.data);
} else if (data.callback === CallbackKind.ERROR) {
capability.reject(wrapReason(data.reason));
} else {
throw new Error('Unexpected callback case');
}
} else {
throw new Error(`Cannot resolve callback ${callbackId}`); throw new Error(`Cannot resolve callback ${callbackId}`);
} }
} else if (ah[data.action]) { delete this.callbackCapabilities[callbackId];
const action = ah[data.action];
if (data.callbackId) { if (data.callback === CallbackKind.DATA) {
let sourceName = this.sourceName; capability.resolve(data.data);
let targetName = data.sourceName; } else if (data.callback === CallbackKind.ERROR) {
new Promise(function(resolve) { capability.reject(wrapReason(data.reason));
resolve(action(data.data));
}).then(function(result) {
comObj.postMessage({
sourceName,
targetName,
callback: CallbackKind.DATA,
callbackId: data.callbackId,
data: result,
});
}, function(reason) {
comObj.postMessage({
sourceName,
targetName,
callback: CallbackKind.ERROR,
callbackId: data.callbackId,
reason: wrapReason(reason),
});
});
} else if (data.streamId) {
this._createStreamSink(data);
} else { } else {
action(data.data); throw new Error('Unexpected callback case');
} }
} else { return;
}
const action = this.actionHandler[data.action];
if (!action) {
throw new Error(`Unknown action from worker: ${data.action}`); throw new Error(`Unknown action from worker: ${data.action}`);
} }
if (data.callbackId) {
const sourceName = this.sourceName;
const targetName = data.sourceName;
new Promise(function(resolve) {
resolve(action(data.data));
}).then(function(result) {
comObj.postMessage({
sourceName,
targetName,
callback: CallbackKind.DATA,
callbackId: data.callbackId,
data: result,
});
}, function(reason) {
comObj.postMessage({
sourceName,
targetName,
callback: CallbackKind.ERROR,
callbackId: data.callbackId,
reason: wrapReason(reason),
});
});
return;
}
if (data.streamId) {
this._createStreamSink(data);
return;
}
action(data.data);
}; };
comObj.addEventListener('message', this._onComObjOnMessage); comObj.addEventListener('message', this._onComObjOnMessage);
} }