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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0c0c3cef7af9cd8352a7470125eda15d01a56f795a5ce3fd2b1474b47f77f171
4
- data.tar.gz: 759f66869c24cc8511fae1adf0a633fc73dd45d340ff9f16186570c5aefccbab
3
+ metadata.gz: 50f955c1543aab886f5da57ffa11eafcd600d69faa7b783bd947f88982407982
4
+ data.tar.gz: 2600178935813941c441f72c931cfbd83873bd927d12a1c87128db4ee1f827b7
5
5
  SHA512:
6
- metadata.gz: 010242af2332f9eb6ac1b136ae13ab570ae63212f61fb4b056a20407cc4209d52774dec9bcb87c44c9b9f87d13f3145bc468b0e96bd4b3fd7635815035381288
7
- data.tar.gz: 0363c67c93b8015f45028625d3c3e76a5be084f087f5f34286a47fa9bbd5227d27267cbbbfaf133fe46bc325a4e46de4178946cdfe84c9d401950e30e2bc6897
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. Otherwise, the path to to binary can be set using:
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
- def require(*mods)
110
- deps = mods.last.is_a?(Hash) ? mods.pop : {}
111
- mods = mods.map { |m| [m, m] }.to_h
112
- self.dependencies = dependencies + mods.merge(deps).map { |name, package| Dependency.new(name, package) }
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
@@ -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
- classes[class_name] = vm.runInThisContext(input, class_name);
103
- respond_with_data(res, class_name, start);
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
@@ -1,3 +1,3 @@
1
1
  module Nodo
2
- VERSION = '1.7.1'
2
+ VERSION = '1.8.1'
3
3
  end
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.7.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: 2024-10-02 00:00:00.000000000 Z
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: 2.7.0
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.5.11
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: []