35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
# File 'lib/isomorfeus/puppeteer/execution_context.rb', line 35
def await_ruby(ruby_source = '', &block)
ruby_source = Isomorfeus::Puppetmaster.block_source_code(&block) if block_given?
ruby_source = "#{ruby_source}.then { |result| $promise_result = result; $promise_resolved = true }.fail { |result| $promise_result = result; $promise_resolved = true }"
compiled_ruby = Isomorfeus::Puppetmaster.compile_ruby_source(ruby_source)
evaluate <<~JAVASCRIPT
function(){
fun = function() {
if (Opal) {
Opal.gvars.promise_resolved = false;
Opal.await_ruby_exception = null;
try {
return #{compiled_ruby}
} catch (e) {
Opal.await_ruby_exception = e;
Opal.gvars.promise_resolved = true;
}
} else {
setTimeout(fun, 100);
}
}
fun();
}
JAVASCRIPT
have_result = false
start = Time.now
until have_result do
raise "await_ruby: execution timed out! Is Opal available?" if (Time.now - start) > 30
have_result = evaluate 'function() { return Opal ? Opal.gvars.promise_resolved : null; }'
sleep 0.1 unless have_result
end
result, exception = evaluate <<~JAVASCRIPT
function () {
var result;
var exception = false;
if (Opal.await_ruby_exception) {
var e = Opal.await_ruby_exception;
exception = { message: e.message, name: e.name, stack: e.stack }
} else if (Opal.gvars.promise_result['$respond_to?']('is_a?') && Opal.gvars.promise_result['$is_a?'](Opal.Exception)) {
let r = Opal.gvars.promise_result;
exception = { message: r.$message(), name: r.$class().$name(), stack: r.$backtrace() }
} else if (Opal.gvars.promise_result['$respond_to?']('to_n')) {
result = Opal.gvars.promise_result.$to_n()
} else { result = Opal.gvars.promise_result };
delete Opal.gvars.promise_result;
delete Opal.gvars.promise_resolved;
return [result, exception];
}
JAVASCRIPT
if exception
e = RuntimeError.new("#{exception['name']}: #{exception['message']}")
e.set_backtrace(exception['stack'])
raise e
end
result
end
|