ton_sdk_client 1.9.0 → 1.15.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 +4 -4
- data/CHANGELOG.md +30 -0
- data/README.md +1 -1
- data/lib/ton_sdk_client/abi.rb +115 -295
- data/lib/ton_sdk_client/boc.rb +58 -165
- data/lib/ton_sdk_client/client.rb +9 -51
- data/lib/ton_sdk_client/client_context.rb +2 -0
- data/lib/ton_sdk_client/config.rb +49 -90
- data/lib/ton_sdk_client/crypto.rb +116 -675
- data/lib/ton_sdk_client/debot.rb +153 -252
- data/lib/ton_sdk_client/interop.rb +3 -3
- data/lib/ton_sdk_client/net.rb +81 -170
- data/lib/ton_sdk_client/processing.rb +7 -36
- data/lib/ton_sdk_client/tvm.rb +74 -93
- data/lib/ton_sdk_client/utils.rb +47 -16
- data/lib/ton_sdk_client/version.rb +2 -2
- metadata +2 -2
data/lib/ton_sdk_client/debot.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module TonSdk
|
2
2
|
|
3
3
|
# NOTE
|
4
|
-
# as of
|
4
|
+
# as of 28 apr 2021, in the main repository this module is still unstable
|
5
5
|
module Debot
|
6
6
|
|
7
7
|
#
|
@@ -19,28 +19,19 @@ module TonSdk
|
|
19
19
|
GET_METHOD_FAILED = 808
|
20
20
|
INVALID_MSG = 809
|
21
21
|
EXTERNAL_CALL_FAILED = 810
|
22
|
+
BROWSER_CALLBACK_FAILED = 811
|
23
|
+
OPERATION_REJECTED = 812
|
22
24
|
end
|
23
25
|
|
24
|
-
|
25
|
-
attr_reader :description, :name, :action_type, :to, :attributes, :misc
|
26
|
-
|
27
|
-
def initialize(description:, name:, action_type:, to:, attributes:, misc:)
|
28
|
-
@description = description
|
29
|
-
@name = name
|
30
|
-
@action_type = action_type
|
31
|
-
@to = to
|
32
|
-
@attributes = attributes
|
33
|
-
@misc = misc
|
34
|
-
end
|
35
|
-
|
26
|
+
DebotAction = Struct.new(:description, :name, :action_type, :to, :attributes, :misc, keyword_init: true) do
|
36
27
|
def to_h
|
37
28
|
{
|
38
|
-
description:
|
39
|
-
name:
|
40
|
-
action_type:
|
41
|
-
to:
|
42
|
-
attributes:
|
43
|
-
misc:
|
29
|
+
description: self.description,
|
30
|
+
name: self.name,
|
31
|
+
action_type: self.action_type,
|
32
|
+
to: self.to,
|
33
|
+
attributes: self.attributes,
|
34
|
+
misc: self.misc
|
44
35
|
}
|
45
36
|
end
|
46
37
|
|
@@ -58,27 +49,18 @@ module TonSdk
|
|
58
49
|
end
|
59
50
|
end
|
60
51
|
|
61
|
-
|
62
|
-
attr_reader :address
|
63
|
-
|
64
|
-
def initialize(a)
|
65
|
-
@address = a
|
66
|
-
end
|
67
|
-
|
68
|
-
def to_h = { address: @address }
|
69
|
-
end
|
70
|
-
|
71
|
-
class RegisteredDebot
|
72
|
-
attr_reader :debot_handle
|
73
|
-
|
74
|
-
def initialize(a)
|
75
|
-
@debot_handle = a
|
76
|
-
end
|
52
|
+
ParamsOfStart = Struct.new(:debot_handle)
|
77
53
|
|
78
|
-
|
54
|
+
RegisteredDebot = Struct.new(:debot_handle, :debot_abi, :info) do
|
55
|
+
def to_h = {
|
56
|
+
debot_handle: @debot_handle,
|
57
|
+
debot_abi: @debot_abi,
|
58
|
+
info: @info.to_h
|
59
|
+
}
|
79
60
|
end
|
80
61
|
|
81
62
|
class ParamsOfAppDebotBrowser
|
63
|
+
private_class_method :new
|
82
64
|
|
83
65
|
# todo remove?
|
84
66
|
TYPE_VALUES = [
|
@@ -89,50 +71,56 @@ module TonSdk
|
|
89
71
|
:input,
|
90
72
|
:get_signing_box,
|
91
73
|
:invoke_debot,
|
92
|
-
:send
|
74
|
+
:send,
|
75
|
+
:approve
|
93
76
|
]
|
94
77
|
|
95
|
-
attr_reader :type_, :msg, :context_id, :action, :prompt, :debot_addr, :message
|
78
|
+
attr_reader :type_, :msg, :context_id, :action, :prompt, :debot_addr, :message, :activity
|
96
79
|
|
97
|
-
def new_with_type_log(msg)
|
80
|
+
def self.new_with_type_log(msg)
|
98
81
|
@type_ = :log
|
99
82
|
@msg = msg
|
100
83
|
end
|
101
84
|
|
102
|
-
def new_with_type_switch(context_id)
|
85
|
+
def self.new_with_type_switch(context_id)
|
103
86
|
@type_ = :switch
|
104
87
|
@context_id = context_id
|
105
88
|
end
|
106
89
|
|
107
|
-
def new_with_type_switch_completed
|
90
|
+
def self.new_with_type_switch_completed
|
108
91
|
@type_ = :switch_completed
|
109
92
|
end
|
110
93
|
|
111
|
-
def new_with_type_show_action(action)
|
94
|
+
def self.new_with_type_show_action(action)
|
112
95
|
@type_ = :show_action
|
113
96
|
@action = action
|
114
97
|
end
|
115
98
|
|
116
|
-
def new_with_type_input(prompt)
|
99
|
+
def self.new_with_type_input(prompt)
|
117
100
|
@type_ = :input
|
118
101
|
@prompt = prompt
|
119
102
|
end
|
120
103
|
|
121
|
-
def new_with_type_get_signing_box
|
104
|
+
def self.new_with_type_get_signing_box
|
122
105
|
@type_ = :get_signing_box
|
123
106
|
end
|
124
107
|
|
125
|
-
def new_with_type_invoke_debot(debot_addr, action)
|
108
|
+
def self.new_with_type_invoke_debot(debot_addr, action)
|
126
109
|
@type_ = :invoke_debot
|
127
110
|
@debot_addr = debot_addr
|
128
111
|
@action = action
|
129
112
|
end
|
130
113
|
|
131
|
-
def new_with_type_send(message)
|
114
|
+
def self.new_with_type_send(message)
|
132
115
|
@type_ = :send
|
133
116
|
@message = message
|
134
117
|
end
|
135
118
|
|
119
|
+
def self.new_with_type_approve(activity)
|
120
|
+
@type_ = :approve
|
121
|
+
@activity = activity
|
122
|
+
end
|
123
|
+
|
136
124
|
def to_h
|
137
125
|
{
|
138
126
|
type: Helper.sym_to_capitalized_case_str(@type_),
|
@@ -148,14 +136,38 @@ module TonSdk
|
|
148
136
|
def self.from_json(j)
|
149
137
|
return nil if j.nil?
|
150
138
|
|
151
|
-
self.
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
139
|
+
tp = self.parse_type(j["type"])
|
140
|
+
case tp
|
141
|
+
when :log
|
142
|
+
self.new_with_type_log(j["msg"])
|
143
|
+
|
144
|
+
when :switch
|
145
|
+
self.new_with_type_switch(j["context_id"])
|
146
|
+
|
147
|
+
when :switch_completed
|
148
|
+
self.new_with_type_switch_completed
|
149
|
+
|
150
|
+
when :show_action
|
151
|
+
self.new_with_type_show_action(DebotAction.from_json(j["action"]))
|
152
|
+
|
153
|
+
when :input
|
154
|
+
self.new_with_type_input(j["prompt"])
|
155
|
+
|
156
|
+
when :get_signing_box
|
157
|
+
self.new_with_type_get_signing_box
|
158
|
+
|
159
|
+
when :invoke_debot
|
160
|
+
self.new_with_type_invoke_debot(j["debot_addr"], DebotAction.from_json(j["action"]))
|
161
|
+
|
162
|
+
when :send
|
163
|
+
self.new_with_type_send(j["message"])
|
164
|
+
|
165
|
+
when :approve
|
166
|
+
self.new_with_type_send(DebotActivity.from_json(j["activity"]))
|
167
|
+
|
168
|
+
else
|
169
|
+
raise ArgumentError.new("no handler for type: #{tp}")
|
170
|
+
end
|
159
171
|
end
|
160
172
|
|
161
173
|
private
|
@@ -171,42 +183,33 @@ module TonSdk
|
|
171
183
|
end
|
172
184
|
|
173
185
|
class ResultOfAppDebotBrowser
|
174
|
-
|
175
|
-
:input,
|
176
|
-
:get_signing_box,
|
177
|
-
:invoke_debot
|
178
|
-
]
|
186
|
+
private_class_method :new
|
179
187
|
|
180
|
-
attr_reader :type_, :value, :signing_box
|
188
|
+
attr_reader :type_, :value, :signing_box, :is_approved
|
181
189
|
|
182
|
-
def
|
183
|
-
|
184
|
-
|
185
|
-
end
|
186
|
-
@type_ = type_
|
187
|
-
@value = value
|
188
|
-
@signing_box = signing_box
|
190
|
+
def self.new_with_type_input(a)
|
191
|
+
@type_ = :input
|
192
|
+
@value = a
|
189
193
|
end
|
190
|
-
end
|
191
194
|
|
192
|
-
|
193
|
-
|
195
|
+
def self.new_with_type_get_signing_box(a)
|
196
|
+
@type_ = :get_signing_box
|
197
|
+
@signing_box = signing_box
|
198
|
+
end
|
194
199
|
|
195
|
-
def
|
196
|
-
@
|
200
|
+
def self.new_with_type_invoke_debot
|
201
|
+
@type_ = :invoke_debot
|
197
202
|
end
|
198
203
|
|
199
|
-
def
|
204
|
+
def self.new_with_type_approve(a)
|
205
|
+
@type_ = :approve
|
206
|
+
@is_approved = a
|
207
|
+
end
|
200
208
|
end
|
201
209
|
|
202
|
-
|
203
|
-
attr_reader :debot_handle, :action
|
204
|
-
|
205
|
-
def initialize(debot_handle:, action:)
|
206
|
-
@debot_handle = debot_handle
|
207
|
-
@action = action
|
208
|
-
end
|
210
|
+
ParamsOfFetch = Struct.new(:address)
|
209
211
|
|
212
|
+
ParamsOfExecute = Struct.new(:debot_handle, :action) do
|
210
213
|
def to_h
|
211
214
|
{
|
212
215
|
debot_handle: @debot_handle,
|
@@ -215,115 +218,91 @@ module TonSdk
|
|
215
218
|
end
|
216
219
|
end
|
217
220
|
|
218
|
-
|
219
|
-
|
221
|
+
ParamsOfSend = Struct.new(:debot_handle, :message)
|
222
|
+
ParamsOfInit = Struct.new(:address)
|
223
|
+
DebotInfo = Struct.new(
|
224
|
+
:name,
|
225
|
+
:version,
|
226
|
+
:publisher,
|
227
|
+
:caption,
|
228
|
+
:author,
|
229
|
+
:support,
|
230
|
+
:hello,
|
231
|
+
:language,
|
232
|
+
:dabi,
|
233
|
+
:icon,
|
234
|
+
:interfaces,
|
235
|
+
keyword_init: true
|
236
|
+
) do
|
237
|
+
def initialize(
|
238
|
+
name: nil,
|
239
|
+
version: nil,
|
240
|
+
publisher: nil,
|
241
|
+
caption: nil,
|
242
|
+
author: nil,
|
243
|
+
support: nil,
|
244
|
+
hello: nil,
|
245
|
+
language: nil,
|
246
|
+
dabi: nil,
|
247
|
+
icon: nil,
|
248
|
+
interfaces: []
|
249
|
+
)
|
250
|
+
super
|
251
|
+
end
|
252
|
+
end
|
220
253
|
|
221
|
-
|
222
|
-
|
223
|
-
|
254
|
+
ResultOfFetch = Struct.new(:info)
|
255
|
+
Spending = Struct.new(:amount, :dst)
|
256
|
+
|
257
|
+
class DebotActivity
|
258
|
+
private_class_method :new
|
259
|
+
|
260
|
+
attr_reader :type_, :msg, :dst, :out, :fee, :setcode, :signkey, :signing_box_handle
|
261
|
+
|
262
|
+
def self.new_with_type_transaction(msg:, dst:, out:, fee:, setcode:, signkey:, signing_box_handle:)
|
263
|
+
@type_ = :transaction
|
264
|
+
@msg = msg
|
265
|
+
@dst = dst
|
266
|
+
@out = out
|
267
|
+
@fee = fee
|
268
|
+
@setcode = setcode
|
269
|
+
@signkey = signkey
|
270
|
+
@signing_box_handle = signing_box_handle
|
224
271
|
end
|
225
272
|
|
226
|
-
def
|
227
|
-
|
228
|
-
debot_handle: @debot_handle,
|
229
|
-
message: @message
|
230
|
-
}
|
273
|
+
def self.from_json(j)
|
274
|
+
# todo
|
231
275
|
end
|
232
276
|
end
|
233
277
|
|
278
|
+
|
279
|
+
|
234
280
|
#
|
235
281
|
# functions
|
236
282
|
#
|
237
283
|
|
238
|
-
def self.
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
# 2) this all can be replaced with 'app_browser_obj.request(...)' and
|
244
|
-
# 'app_browser_obj.notify(...)' calls, possibly
|
245
|
-
|
246
|
-
app_resp_handler = Proc.new do |data|
|
247
|
-
req_data = data["request_data"]
|
248
|
-
case data["type"]
|
249
|
-
when "Log"
|
250
|
-
new_obj = ParamsOfAppDebotBrowser.from_json(data)
|
251
|
-
app_browser_obj.log(new_obj.msg)
|
252
|
-
|
253
|
-
when "Switch"
|
254
|
-
new_obj = ParamsOfAppDebotBrowser.from_json(data)
|
255
|
-
app_browser_obj.switch_to(new_obj.context_id)
|
256
|
-
|
257
|
-
when "SwitchCompleted"
|
258
|
-
app_browser_obj.switch_completed()
|
259
|
-
|
260
|
-
when "ShowAction"
|
261
|
-
new_obj = ParamsOfAppDebotBrowser.from_json(data)
|
262
|
-
app_browser_obj.show_action(new_obj.action)
|
263
|
-
|
264
|
-
when "Input"
|
265
|
-
new_obj = ParamsOfAppDebotBrowser.from_json(data)
|
266
|
-
# TODO possibly in a new thread or fiber
|
267
|
-
app_req_res = begin
|
268
|
-
res = app_browser_obj.input(new_obj.prompt)
|
269
|
-
Client::AppRequestResult(type_: :ok, result: ResultOfAppDebotBrowser.new(type_: :input, value: res))
|
270
|
-
rescue Exception => e
|
271
|
-
Client::AppRequestResult(type_: :error, text: e.message)
|
272
|
-
end
|
273
|
-
|
274
|
-
params = Client::ParamsOfResolveAppRequest.new(
|
275
|
-
app_request_id: data["app_request_id"],
|
276
|
-
result: app_req_res
|
277
|
-
)
|
278
|
-
TonSdk::Client.resolve_app_request(c_ctx, params)
|
279
|
-
|
280
|
-
when "GetSigningBox"
|
281
|
-
new_obj = ParamsOfAppDebotBrowser.from_json(data)
|
282
|
-
# TODO possibly in a new thread or fiber
|
283
|
-
app_req_res = begin
|
284
|
-
res = app_browser_obj.get_signing_box()
|
285
|
-
Client::AppRequestResult(type_: :ok, result: ResultOfAppDebotBrowser.new(type_: :get_signing_box, signing_box: res))
|
286
|
-
rescue Exception => e
|
287
|
-
Client::AppRequestResult(type_: :error, text: e.message)
|
288
|
-
end
|
289
|
-
|
290
|
-
params = Client::ParamsOfResolveAppRequest.new(
|
291
|
-
app_request_id: data["app_request_id"],
|
292
|
-
result: app_req_res
|
293
|
-
)
|
294
|
-
TonSdk::Client.resolve_app_request(c_ctx, params)
|
295
|
-
|
296
|
-
when "InvokeDebot"
|
297
|
-
new_obj = ParamsOfAppDebotBrowser.from_json(data)
|
298
|
-
# TODO possibly in a new thread or fiber
|
299
|
-
app_req_res = begin
|
300
|
-
res = app_browser_obj.invoke_debot(new_obj.debot_addr, new_obj.action)
|
301
|
-
Client::AppRequestResult(type_: :ok, result: ResultOfAppDebotBrowser.new(type_: :invoke_debot))
|
302
|
-
rescue Exception => e
|
303
|
-
Client::AppRequestResult(type_: :error, text: e.message)
|
304
|
-
end
|
305
|
-
|
306
|
-
params = Client::ParamsOfResolveAppRequest.new(
|
307
|
-
app_request_id: data["app_request_id"],
|
308
|
-
result: app_req_res
|
284
|
+
def self.init(ctx, params, app_browser_obj)
|
285
|
+
Interop::request_to_native_lib(ctx, "debot.init", params) do |resp|
|
286
|
+
if resp.success?
|
287
|
+
yield NativeLibResponsetResult.new(
|
288
|
+
result: nil
|
309
289
|
)
|
310
|
-
TonSdk::Client.resolve_app_request(c_ctx, params)
|
311
|
-
|
312
290
|
else
|
313
|
-
|
291
|
+
yield resp
|
314
292
|
end
|
315
293
|
end
|
294
|
+
end
|
316
295
|
|
296
|
+
def self.start(ctx, params)
|
317
297
|
Interop::request_to_native_lib(
|
318
298
|
ctx,
|
319
299
|
"debot.start",
|
320
|
-
params
|
321
|
-
debot_app_response_handler: app_resp_handler,
|
300
|
+
params,
|
322
301
|
is_single_thread_only: false
|
323
302
|
) do |resp|
|
324
303
|
if resp.success?
|
325
304
|
yield NativeLibResponsetResult.new(
|
326
|
-
result:
|
305
|
+
result: nil
|
327
306
|
)
|
328
307
|
else
|
329
308
|
yield resp
|
@@ -331,95 +310,17 @@ module TonSdk
|
|
331
310
|
end
|
332
311
|
end
|
333
312
|
|
334
|
-
def self.fetch(ctx, params
|
335
|
-
# TODO
|
336
|
-
# 1) the handlers in 'start' and 'fetch' are identical
|
337
|
-
# verify that it works and get rid of repetition
|
338
|
-
|
339
|
-
# 2) this all can be replaced with 'app_browser_obj.request(...)' and
|
340
|
-
# 'app_browser_obj.notify(...)' calls, possibly
|
341
|
-
|
342
|
-
app_resp_handler = Proc.new do |data|
|
343
|
-
req_data = data["request_data"]
|
344
|
-
case data["type"]
|
345
|
-
when "Log"
|
346
|
-
new_obj = ParamsOfAppDebotBrowser.from_json(data)
|
347
|
-
app_browser_obj.log(new_obj.msg)
|
348
|
-
|
349
|
-
when "Switch"
|
350
|
-
new_obj = ParamsOfAppDebotBrowser.from_json(data)
|
351
|
-
app_browser_obj.switch_to(new_obj.context_id)
|
352
|
-
|
353
|
-
when "SwitchCompleted"
|
354
|
-
app_browser_obj.switch_completed()
|
355
|
-
|
356
|
-
when "ShowAction"
|
357
|
-
new_obj = ParamsOfAppDebotBrowser.from_json(data)
|
358
|
-
app_browser_obj.show_action(new_obj.action)
|
359
|
-
|
360
|
-
when "Input"
|
361
|
-
new_obj = ParamsOfAppDebotBrowser.from_json(data)
|
362
|
-
# TODO possibly in a new thread or fiber
|
363
|
-
app_req_res = begin
|
364
|
-
res = app_browser_obj.input(new_obj.prompt)
|
365
|
-
Client::AppRequestResult(type_: :ok, result: ResultOfAppDebotBrowser.new(type_: :input, value: res))
|
366
|
-
rescue Exception => e
|
367
|
-
Client::AppRequestResult(type_: :error, text: e.message)
|
368
|
-
end
|
369
|
-
|
370
|
-
params = Client::ParamsOfResolveAppRequest.new(
|
371
|
-
app_request_id: data["app_request_id"],
|
372
|
-
result: app_req_res
|
373
|
-
)
|
374
|
-
TonSdk::Client.resolve_app_request(c_ctx, params)
|
375
|
-
|
376
|
-
when "GetSigningBox"
|
377
|
-
new_obj = ParamsOfAppDebotBrowser.from_json(data)
|
378
|
-
# TODO possibly in a new thread or fiber
|
379
|
-
app_req_res = begin
|
380
|
-
res = app_browser_obj.get_signing_box()
|
381
|
-
Client::AppRequestResult(type_: :ok, result: ResultOfAppDebotBrowser.new(type_: :get_signing_box, signing_box: res))
|
382
|
-
rescue Exception => e
|
383
|
-
Client::AppRequestResult(type_: :error, text: e.message)
|
384
|
-
end
|
385
|
-
|
386
|
-
params = Client::ParamsOfResolveAppRequest.new(
|
387
|
-
app_request_id: data["app_request_id"],
|
388
|
-
result: app_req_res
|
389
|
-
)
|
390
|
-
TonSdk::Client.resolve_app_request(c_ctx, params)
|
391
|
-
|
392
|
-
when "InvokeDebot"
|
393
|
-
new_obj = ParamsOfAppDebotBrowser.from_json(data)
|
394
|
-
# TODO possibly in a new thread or fiber
|
395
|
-
app_req_res = begin
|
396
|
-
res = app_browser_obj.invoke_debot(new_obj.debot_addr, new_obj.action)
|
397
|
-
Client::AppRequestResult(type_: :ok, result: ResultOfAppDebotBrowser.new(type_: :invoke_debot))
|
398
|
-
rescue Exception => e
|
399
|
-
Client::AppRequestResult(type_: :error, text: e.message)
|
400
|
-
end
|
401
|
-
|
402
|
-
params = Client::ParamsOfResolveAppRequest.new(
|
403
|
-
app_request_id: data["app_request_id"],
|
404
|
-
result: app_req_res
|
405
|
-
)
|
406
|
-
TonSdk::Client.resolve_app_request(c_ctx, params)
|
407
|
-
|
408
|
-
else
|
409
|
-
# TODO log 'unknown option'
|
410
|
-
end
|
411
|
-
end
|
412
|
-
|
313
|
+
def self.fetch(ctx, params)
|
413
314
|
Interop::request_to_native_lib(
|
414
315
|
ctx,
|
415
316
|
"debot.fetch",
|
416
|
-
params
|
417
|
-
debot_app_response_handler: app_resp_handler,
|
317
|
+
params,
|
418
318
|
is_single_thread_only: false
|
419
319
|
) do |resp|
|
420
320
|
if resp.success?
|
421
321
|
yield NativeLibResponsetResult.new(
|
422
|
-
|
322
|
+
# TODO: parse DebotInfo
|
323
|
+
result: ResultOfFetch.new(resp.result["info"])
|
423
324
|
)
|
424
325
|
else
|
425
326
|
yield resp
|
@@ -428,7 +329,7 @@ module TonSdk
|
|
428
329
|
end
|
429
330
|
|
430
331
|
def self.execute(ctx, params)
|
431
|
-
Interop::request_to_native_lib(ctx, "debot.execute", params
|
332
|
+
Interop::request_to_native_lib(ctx, "debot.execute", params) do |resp|
|
432
333
|
if resp.success?
|
433
334
|
yield NativeLibResponsetResult.new(
|
434
335
|
result: nil
|
@@ -440,7 +341,7 @@ module TonSdk
|
|
440
341
|
end
|
441
342
|
|
442
343
|
def self.remove(ctx, params)
|
443
|
-
Interop::request_to_native_lib(ctx, "debot.remove", params
|
344
|
+
Interop::request_to_native_lib(ctx, "debot.remove", params) do |resp|
|
444
345
|
if resp.success?
|
445
346
|
yield NativeLibResponsetResult.new(
|
446
347
|
result: nil
|
@@ -452,7 +353,7 @@ module TonSdk
|
|
452
353
|
end
|
453
354
|
|
454
355
|
def self.send(ctx, params)
|
455
|
-
Interop::request_to_native_lib(ctx, "debot.send", params
|
356
|
+
Interop::request_to_native_lib(ctx, "debot.send", params) do |resp|
|
456
357
|
if resp.success?
|
457
358
|
yield NativeLibResponsetResult.new(
|
458
359
|
result: nil
|