static long dm_evalOnOtherMachineWithReturnValue_timeout = 60000; static A dm_evalOnOtherMachineWithReturnValue(fS computerID, S code, O... _) { fS id = aGlobalID(); final new Var> var; temp vmBus_onMessage('gotFromPrivateChat, voidfunc(S sender, S msg) { if (var.has() || neq(sender, computerID)) ret; new Matches m; if (!startsWith(msg, "done " + id + " ", m)) ret; if (neq(getAuthorOfSignedText(msg), computerID)) ret; S s = firstLine(m.rest()); if (startsWith(s, "direct: ", m)) var.set((Either) eitherA(m.rest())); else if (startsWith(s, "quoted: ", m)) var.set((Either) eitherA(unquote(m.rest()))); else if (startsWith(s, "base64: ", m)) var.set((Either) eitherA(base64decode(m.rest()))); else if (startsWith(s, "error: ", m)) var.set((Either) eitherB(m.rest())); else var.set((Either) eitherB("unknown mode")); }); dm_privateChat_sendSigned(computerID, computerID + " eval " + (boolOptPar(_, 'realEval) ? "real " : "") + (boolOptPar(_, 'fresh) ? "fresh " : "") + id + ": " + code); Either e = waitForVarToBeNotNullWithTimeout(var, dm_evalOnOtherMachineWithReturnValue_timeout); if (e == null) fail("timeout"); if (eitherIsB(e)) fail(eitherGetB(e)); ret (A) eitherGetA(e); }