[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:
parent
62f28e11a3
commit
f61fb3e0f9
@ -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);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user