jscall 1.3.0 → 1.4.0

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: 1df05fa2e6cee8575b7cdf9a95d35c264422d66c1c793f71e620462380a891bc
4
- data.tar.gz: 4bae39ef37ec190d8c6b87fb4541c0ec4f074b7c5b09eeecc1d92a4a47dd570c
3
+ metadata.gz: ccebaf9700a3adef5c0bba832014a8f29ecfecee4d2e6fd1303c77a986bd6e5a
4
+ data.tar.gz: ea718525489e87dd340200008540c269b33e5b3432a8b6eb6ddd6103ca53329e
5
5
  SHA512:
6
- metadata.gz: 16c12783ff80fefb85e4453ca09b54faf4b614895157f4e57108379a51ef0ebbacc2fb38ddff7d87faef50a5c3880a6690cfeb03dc5e5d67be447e36236475af
7
- data.tar.gz: a5b57ae8e5d7d891648d457ed32f481ea1b0d528d973e693e164f5053e39f6bfce235148fc22990a53e52e5d7ceaa5eb91dc3297b4b89b8a7af90aa47b88ff54
6
+ metadata.gz: d6852583f9276d903886d9f3ff1dbcf3ca16569844567f43751bee97917715d0014c8bf598e84aae7a2ba4db6145398b397c1b21e59d921755a6c8d3b0f6bee9
7
+ data.tar.gz: 3fe7e88204d5971a3a425ca3a2329f560a547204e06e009f791017036ef75e2054da4716b2ddc948b8d170d3eaa05845c30551a88e700cda03eee814530f4857
data/README.md CHANGED
@@ -110,6 +110,11 @@ created in Ruby.
110
110
  Note that you must `await` every call to Ruby object since it is
111
111
  asynchronous call.
112
112
 
113
+ A shorthand for `obj.to_a()` is `obj.to_a` in Ruby. However,
114
+ this shorthand is not available in JavaScript.
115
+ You must explicitly write `obj.to_a()`
116
+ in JavaScript when `obj` is a Ruby object.
117
+
113
118
  In JavaScript, `Ruby.exec` is available to run a program in Ruby.
114
119
  For example,
115
120
 
data/lib/jscall/main.mjs CHANGED
@@ -43,8 +43,8 @@ const exported = new class {
43
43
  }
44
44
  }
45
45
 
46
- export_remoteref(prref) { // proxy for remote reference
47
- return prref.__self__.id
46
+ export_remoteref(rref) { // proxy for remote reference
47
+ return rref.id
48
48
  }
49
49
 
50
50
  next_element() {
@@ -61,6 +61,8 @@ const exported = new class {
61
61
  const obj = this.objects[idx]
62
62
  if (typeof obj === 'number')
63
63
  throw `unknown index is given to find(): ${idx}`
64
+ else if (obj === null)
65
+ throw `null is exported? ${idx}`
64
66
  else
65
67
  return obj
66
68
  }
@@ -95,12 +97,12 @@ const remoteRefHandler = new class {
95
97
  else
96
98
  return (...args) => {
97
99
  // this returns Promise
98
- return funcall_to_ruby(obj.id, name, args)
100
+ return funcall_to_ruby(obj, name, args)
99
101
  }
100
102
  }
101
103
  apply(obj, self, args) {
102
104
  // this returns Promise
103
- return funcall_to_ruby(obj.id, 'call', args)
105
+ return funcall_to_ruby(obj, 'call', args)
104
106
  }
105
107
  }
106
108
 
@@ -154,11 +156,11 @@ const encode_obj = obj => {
154
156
  else if (obj instanceof Map) {
155
157
  const hash = {}
156
158
  for (const [key, value] of obj.entries())
157
- hash[key] = value
159
+ hash[key] = encode_obj(value)
158
160
  return [param_hash, hash]
159
161
  }
160
162
  else if (obj instanceof RemoteRef)
161
- return [param_local_object, exported.export_remoteref(obj)]
163
+ return [param_local_object, exported.export_remoteref(obj.__self__)]
162
164
  else
163
165
  return [param_object, exported.export(obj)]
164
166
  }
@@ -203,12 +205,12 @@ export const decode_obj_or_error = obj => {
203
205
  const js_eval = eval
204
206
 
205
207
  export const funcall_from_ruby = cmd => {
208
+ if (debug_level >= 10)
209
+ console.error(`RubyToJS> ${cmd[3]} ${cmd[1]} ${cmd[2]}`)
210
+
206
211
  const receiver = decode_obj(cmd[2])
207
212
  const name = cmd[3]
208
213
  const args = cmd[4].map(e => decode_obj(e))
209
- if (debug_level >= 10)
210
- console.error(`RubyToJS> ${name} ${cmd[1]}`)
211
-
212
214
  if (name.endsWith('=')) {
213
215
  const name2 = name.substring(0, name.length - 1)
214
216
  if (receiver === null)
@@ -311,13 +313,13 @@ export const make_cmd_eval = src => {
311
313
  return reply_with_piggyback([cmd_eval, message_id, src])
312
314
  }
313
315
 
314
- let funcall_to_ruby = (receiver_id, name, args) => {
316
+ let funcall_to_ruby = (receiver, name, args) => {
315
317
  return new Promise((resolve, reject) => {
316
- const cmd = make_cmd_call(receiver_id, name, args)
318
+ const cmd = make_cmd_call(receiver, name, args)
317
319
  const message_id = cmd[1]
318
320
  callback_stack.push([message_id, resolve, reject])
319
321
  if (debug_level >= 10)
320
- console.error(`JStoRuby< ${name} ${message_id}`)
322
+ console.error(`JStoRuby< ${name} ${message_id} ${cmd[2][1]}`)
321
323
 
322
324
  stdout_puts(JSON.stringify(cmd))
323
325
  })
@@ -325,7 +327,8 @@ let funcall_to_ruby = (receiver_id, name, args) => {
325
327
 
326
328
  export const set_funcall_to_ruby = f => { funcall_to_ruby = f }
327
329
 
328
- export const make_cmd_call = (receiver_id, name, args) => {
330
+ export const make_cmd_call = (obj, name, args) => {
331
+ const receiver_id = exported.export_remoteref(obj)
329
332
  const message_id = fresh_id()
330
333
  const receiver = [param_local_object, receiver_id]
331
334
  const encoded_args = args.map(e => encode_obj(e))
data/lib/jscall/synch.mjs CHANGED
@@ -171,8 +171,8 @@ export const exec = src => {
171
171
  return event_loop()
172
172
  }
173
173
 
174
- main.set_funcall_to_ruby((receiver_id, name, args) => {
175
- const cmd = main.make_cmd_call(receiver_id, name, args)
174
+ main.set_funcall_to_ruby((receiver, name, args) => {
175
+ const cmd = main.make_cmd_call(receiver, name, args)
176
176
  main.stdout_puts(JSON.stringify(cmd))
177
177
  return event_loop()
178
178
  })
@@ -3,5 +3,5 @@
3
3
  # Copyright (C) 2022- Shigeru Chiba. All rights reserved.
4
4
 
5
5
  module Jscall
6
- VERSION = "1.3.0"
6
+ VERSION = "1.4.0"
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jscall
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shigeru Chiba
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-10-12 00:00:00.000000000 Z
11
+ date: 2022-12-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: webrick