提交 2b6b07f8 编写于 作者: A Alex Dima

Send/Receive bulk messages to extension host process

上级 c0df4038
......@@ -54,86 +54,117 @@ function createRPC(serializeAndSend: (obj: any) => void): IRPCFunc {
}
export interface IPluginsIPC extends remote.IRemoteCom {
handle(msg: string): void;
handle(msg: string[]): void;
}
export function create(send: (obj: string) => void): IPluginsIPC {
export function create(send: (obj: string[]) => void): IPluginsIPC {
let rpc = createRPC(marshallAndSend);
let bigHandler: remote.IManyHandler = null;
let invokedHandlers: { [req: string]: winjs.TPromise<any>; } = Object.create(null);
let messagesToSend: string[] = [];
let r: IPluginsIPC = {
callOnRemote: rpc,
registerBigHandler: (_bigHandler: remote.IManyHandler): void => {
bigHandler = _bigHandler;
},
handle: (rawmsg) => {
let msg = marshalling.parse(rawmsg);
let messagesToReceive: string[] = [];
let receiveOneMessage = () => {
let rawmsg = messagesToReceive.shift();
if (msg.seq) {
if (!pendingRPCReplies.hasOwnProperty(msg.seq)) {
console.warn('Got reply to unknown seq');
return;
}
let reply = pendingRPCReplies[msg.seq];
delete pendingRPCReplies[msg.seq];
if (msg.err) {
let err = msg.err;
if (msg.err.$isError) {
err = new Error();
err.name = msg.err.name;
err.message = msg.err.message;
err.stack = msg.err.stack;
}
reply.e(err);
return;
}
if (messagesToReceive.length > 0) {
process.nextTick(receiveOneMessage);
}
reply.c(msg.res);
return;
}
let msg = marshalling.parse(rawmsg);
if (msg.cancel) {
if (invokedHandlers[msg.cancel]) {
invokedHandlers[msg.cancel].cancel();
}
if (msg.seq) {
if (!pendingRPCReplies.hasOwnProperty(msg.seq)) {
console.warn('Got reply to unknown seq');
return;
}
let reply = pendingRPCReplies[msg.seq];
delete pendingRPCReplies[msg.seq];
if (msg.err) {
console.error(msg.err);
let err = msg.err;
if (msg.err.$isError) {
err = new Error();
err.name = msg.err.name;
err.message = msg.err.message;
err.stack = msg.err.stack;
}
reply.e(err);
return;
}
let rpcId = msg.rpcId;
reply.c(msg.res);
return;
}
if (!bigHandler) {
throw new Error('got message before big handler attached!');
if (msg.cancel) {
if (invokedHandlers[msg.cancel]) {
invokedHandlers[msg.cancel].cancel();
}
return;
}
if (msg.err) {
console.error(msg.err);
return;
}
let rpcId = msg.rpcId;
if (!bigHandler) {
throw new Error('got message before big handler attached!');
}
let req = msg.req;
invokedHandlers[req] = invokeHandler(rpcId, msg.method, msg.args);
invokedHandlers[req].then((r) => {
delete invokedHandlers[req];
marshallAndSend({
seq: req,
res: r
});
}, (err) => {
delete invokedHandlers[req];
marshallAndSend({
seq: req,
err: errors.transformErrorForSerialization(err)
});
let req = msg.req;
invokedHandlers[req] = invokeHandler(rpcId, msg.method, msg.args);
invokedHandlers[req].then((r) => {
delete invokedHandlers[req];
marshallAndSend({
seq: req,
res: r
});
}, (err) => {
delete invokedHandlers[req];
marshallAndSend({
seq: req,
err: errors.transformErrorForSerialization(err)
});
});
};
let r: IPluginsIPC = {
callOnRemote: rpc,
registerBigHandler: (_bigHandler: remote.IManyHandler): void => {
bigHandler = _bigHandler;
},
handle: (rawmsg) => {
// console.log('RECEIVED ' + rawmsg.length + ' MESSAGES.');
if (messagesToReceive.length === 0) {
process.nextTick(receiveOneMessage);
}
messagesToReceive = messagesToReceive.concat(rawmsg);
}
};
function sendAccumulated(): void {
let tmp = messagesToSend;
messagesToSend = [];
// console.log('SENDING ' + tmp.length + ' MESSAGES.');
send(tmp);
}
function marshallAndSend(msg: any): void {
send(marshalling.stringify(msg));
let value = marshalling.stringify(msg);
if (messagesToSend.length === 0) {
process.nextTick(sendAccumulated);
}
messagesToSend.push(value);
}
function invokeHandler(rpcId: string, method: string, args: any[]): winjs.TPromise<any> {
......
......@@ -53,7 +53,7 @@ export class MainThreadService extends CommonMainThreadService {
// Message: Window --> Plugin Host
this.remoteCom = pluginsIPC.create((msg) => {
if (logCommunication) {
console.log('%c[Window \u2192 Plugin]%c[len: ' + strings.pad(msg.length, 5, ' ') + ']', 'color: darkgreen', 'color: grey', JSON.parse(msg));
console.log('%c[Window \u2192 Plugin]%c[len: ' + strings.pad(msg.length, 5, ' ') + ']', 'color: darkgreen', 'color: grey', msg);
}
this.pluginHostProcessManager.postMessage(msg);
......@@ -62,7 +62,7 @@ export class MainThreadService extends CommonMainThreadService {
// Message: Plugin Host --> Window
this.pluginHostProcessManager.startPluginHostProcess((msg) => {
if (logCommunication) {
console.log('%c[Plugin \u2192 Window]%c[len: ' + strings.pad(msg.length, 5, ' ') + ']', 'color: darkgreen', 'color: grey', JSON.parse(msg));
console.log('%c[Plugin \u2192 Window]%c[len: ' + strings.pad(msg.length, 5, ' ') + ']', 'color: darkgreen', 'color: grey', msg);
}
this.remoteCom.handle(msg);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册