nodo 1.7.1 → 1.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +34 -1
- data/lib/nodo/core.rb +9 -6
- data/lib/nodo/dependency.rb +28 -5
- data/lib/nodo/nodo.cjs +6 -2
- data/lib/nodo/version.rb +1 -1
- data/lib/nodo.rb +2 -1
- metadata +19 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 50f955c1543aab886f5da57ffa11eafcd600d69faa7b783bd947f88982407982
|
4
|
+
data.tar.gz: 2600178935813941c441f72c931cfbd83873bd927d12a1c87128db4ee1f827b7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e7532dcb62426fe8a8718134256aae2b32c551421c78f45b47a0ab2b57a614cba9999bd6232eeaf0817fbed27b5a25dac8237646bd265b80d577c53ee5521282
|
7
|
+
data.tar.gz: c1d108e0e17b17427dcd4420d34bd8174dbc32e8fd69b3500ab22b1131beaa6de960d88378723a50f3e8d20a3f7099d593a1a5573791e0a9b7e436af2b042be5
|
data/README.md
CHANGED
@@ -28,7 +28,8 @@ gem 'nodo'
|
|
28
28
|
|
29
29
|
Nodo requires a working installation of Node.js.
|
30
30
|
|
31
|
-
If the executable is located in your `PATH`, no configuration is required.
|
31
|
+
If the executable is located in your `PATH`, no configuration is required.
|
32
|
+
Otherwise, the path to the binary can be set using:
|
32
33
|
|
33
34
|
```ruby
|
34
35
|
Nodo.binary = '/usr/local/bin/node'
|
@@ -99,6 +100,23 @@ bar = Bar.new
|
|
99
100
|
bar.v4 => "b305f5c4-db9a-4504-b0c3-4e097a5ec8b9"
|
100
101
|
```
|
101
102
|
|
103
|
+
`import` is also supported for loading ESM packages:
|
104
|
+
|
105
|
+
```ruby
|
106
|
+
class Bar < Nodo::Core
|
107
|
+
import :uuid
|
108
|
+
|
109
|
+
function :v4, <<~JS
|
110
|
+
() => {
|
111
|
+
return uuid.v4();
|
112
|
+
}
|
113
|
+
JS
|
114
|
+
end
|
115
|
+
|
116
|
+
bar = Bar.new
|
117
|
+
bar.v4 => "b305f5c4-db9a-4504-b0c3-4e097a5ec8b9"
|
118
|
+
```
|
119
|
+
|
102
120
|
### Aliasing requires
|
103
121
|
|
104
122
|
If the library name cannot be used as name of the constant, the `const` name
|
@@ -364,3 +382,18 @@ option:
|
|
364
382
|
```ruby
|
365
383
|
WebMock.disable_net_connect!(allow_localhost: true)
|
366
384
|
```
|
385
|
+
|
386
|
+
## Node process options
|
387
|
+
|
388
|
+
Extra commandline arguments to the `node` binary can be supplied in standard
|
389
|
+
[`Process::spawn` array form](https://docs.ruby-lang.org/en/master/Process.html#method-c-spawn):
|
390
|
+
|
391
|
+
```ruby
|
392
|
+
Nodo.args = %w[--enable-source-maps]
|
393
|
+
```
|
394
|
+
|
395
|
+
Environment variables to be supplied to the `node` process can be set using:
|
396
|
+
|
397
|
+
```ruby
|
398
|
+
Nodo.env = { 'NAME' => 'value' }
|
399
|
+
```
|
data/lib/nodo/core.rb
CHANGED
@@ -82,7 +82,7 @@ module Nodo
|
|
82
82
|
|
83
83
|
def generate_class_code
|
84
84
|
<<~JS
|
85
|
-
(() => {
|
85
|
+
(async () => {
|
86
86
|
const __nodo_klass__ = { nodo: global.nodo };
|
87
87
|
#{dependencies.map(&:to_js).join}
|
88
88
|
#{constants.map(&:to_js).join}
|
@@ -106,10 +106,13 @@ module Nodo
|
|
106
106
|
|
107
107
|
private
|
108
108
|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
109
|
+
{ require: :cjs, import: :esm }.each do |method, type|
|
110
|
+
define_method method do |*mods|
|
111
|
+
deps = mods.last.is_a?(Hash) ? mods.pop : {}
|
112
|
+
mods = mods.map { |m| [m, m] }.to_h
|
113
|
+
self.dependencies = dependencies + mods.merge(deps).map { |name, package| Dependency.new(name, package, type: type) }
|
114
|
+
end
|
115
|
+
private method
|
113
116
|
end
|
114
117
|
|
115
118
|
def function(name, _code = nil, timeout: Nodo.timeout, code: nil, &block)
|
@@ -208,7 +211,7 @@ module Nodo
|
|
208
211
|
@@tmpdir = Pathname.new(Dir.mktmpdir('nodo'))
|
209
212
|
env = Nodo.env.merge('NODE_PATH' => Nodo.modules_root.to_s)
|
210
213
|
env['NODO_DEBUG'] = '1' if Nodo.debug
|
211
|
-
@@node_pid = Process.spawn(env, Nodo.binary, '-e', self.class.generate_core_code, '--', socket_path.to_s, err: :out)
|
214
|
+
@@node_pid = Process.spawn(env, Nodo.binary, '-e', self.class.generate_core_code, *Nodo.args, '--', socket_path.to_s, err: :out)
|
212
215
|
at_exit do
|
213
216
|
@@exiting = true
|
214
217
|
Process.kill(:SIGTERM, node_pid) rescue Errno::ECHILD
|
data/lib/nodo/dependency.rb
CHANGED
@@ -1,12 +1,22 @@
|
|
1
1
|
module Nodo
|
2
2
|
class Dependency
|
3
|
-
attr_reader :name, :package
|
4
|
-
|
5
|
-
def initialize(name, package)
|
6
|
-
@name, @package = name, package
|
3
|
+
attr_reader :name, :package, :type
|
4
|
+
|
5
|
+
def initialize(name, package, type:)
|
6
|
+
@name, @package, @type = name, package, type
|
7
7
|
end
|
8
|
-
|
8
|
+
|
9
9
|
def to_js
|
10
|
+
case type
|
11
|
+
when :cjs then to_cjs
|
12
|
+
when :esm then to_esm
|
13
|
+
else raise "Unknown dependency type: #{type}"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def to_cjs
|
10
20
|
<<~JS
|
11
21
|
const #{name} = __nodo_klass__.#{name} = (() => {
|
12
22
|
try {
|
@@ -18,5 +28,18 @@ module Nodo
|
|
18
28
|
})();
|
19
29
|
JS
|
20
30
|
end
|
31
|
+
|
32
|
+
def to_esm
|
33
|
+
<<~JS
|
34
|
+
const #{name} = __nodo_klass__.#{name} = await (async () => {
|
35
|
+
try {
|
36
|
+
return await nodo.import(#{package.to_json});
|
37
|
+
} catch(e) {
|
38
|
+
e.nodo_dependency = #{package.to_json};
|
39
|
+
throw e;
|
40
|
+
}
|
41
|
+
})();
|
42
|
+
JS
|
43
|
+
end
|
21
44
|
end
|
22
45
|
end
|
data/lib/nodo/nodo.cjs
CHANGED
@@ -99,8 +99,12 @@ module.exports = (function() {
|
|
99
99
|
|
100
100
|
try {
|
101
101
|
if (DEFINE_METHOD == method) {
|
102
|
-
|
103
|
-
|
102
|
+
Promise.resolve(vm.runInThisContext(input, class_name)).then((result) => {
|
103
|
+
classes[class_name] = result;
|
104
|
+
respond_with_data(res, class_name, start);
|
105
|
+
}).catch((error) => {
|
106
|
+
respond_with_error(res, 500, error);
|
107
|
+
})
|
104
108
|
} else if (EVALUATE_METHOD == method) {
|
105
109
|
Promise.resolve(vm.runInNewContext(input, context)).then((result) => {
|
106
110
|
respond_with_data(res, result, start);
|
data/lib/nodo/version.rb
CHANGED
data/lib/nodo.rb
CHANGED
@@ -9,11 +9,12 @@ require 'forwardable'
|
|
9
9
|
|
10
10
|
module Nodo
|
11
11
|
class << self
|
12
|
-
attr_accessor :modules_root, :env, :binary, :logger, :debug, :timeout
|
12
|
+
attr_accessor :modules_root, :env, :binary, :args, :logger, :debug, :timeout
|
13
13
|
end
|
14
14
|
self.modules_root = './node_modules'
|
15
15
|
self.env = {}
|
16
16
|
self.binary = 'node'
|
17
|
+
self.args = nil
|
17
18
|
self.logger = Logger.new(STDOUT)
|
18
19
|
self.debug = false
|
19
20
|
self.timeout = 60
|
metadata
CHANGED
@@ -1,15 +1,28 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nodo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.8.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matthias Grosser
|
8
|
-
autorequire:
|
9
8
|
bindir: bin
|
10
9
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
10
|
+
date: 2025-08-25 00:00:00.000000000 Z
|
11
|
+
dependencies:
|
12
|
+
- !ruby/object:Gem::Dependency
|
13
|
+
name: logger
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
15
|
+
requirements:
|
16
|
+
- - ">="
|
17
|
+
- !ruby/object:Gem::Version
|
18
|
+
version: '0'
|
19
|
+
type: :runtime
|
20
|
+
prerelease: false
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
22
|
+
requirements:
|
23
|
+
- - ">="
|
24
|
+
- !ruby/object:Gem::Version
|
25
|
+
version: '0'
|
13
26
|
description: Fast Ruby bridge to run JavaScript inside a Node process
|
14
27
|
email:
|
15
28
|
- mtgrosser@gmx.net
|
@@ -34,7 +47,6 @@ homepage: https://github.com/mtgrosser/nodo
|
|
34
47
|
licenses:
|
35
48
|
- MIT
|
36
49
|
metadata: {}
|
37
|
-
post_install_message:
|
38
50
|
rdoc_options: []
|
39
51
|
require_paths:
|
40
52
|
- lib
|
@@ -42,15 +54,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
42
54
|
requirements:
|
43
55
|
- - ">="
|
44
56
|
- !ruby/object:Gem::Version
|
45
|
-
version:
|
57
|
+
version: 3.0.0
|
46
58
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
47
59
|
requirements:
|
48
60
|
- - ">="
|
49
61
|
- !ruby/object:Gem::Version
|
50
62
|
version: '0'
|
51
63
|
requirements: []
|
52
|
-
rubygems_version: 3.
|
53
|
-
signing_key:
|
64
|
+
rubygems_version: 3.6.2
|
54
65
|
specification_version: 4
|
55
66
|
summary: Call Node.js from Ruby
|
56
67
|
test_files: []
|