@@ -63,7 +63,8 @@ static napi_value resize(napi_env env, napi_callback_info info) {
6363 return nullptr ;
6464}
6565
66- napi_threadsafe_function registered_callback = nullptr ;
66+ napi_threadsafe_function on_data_callback = nullptr ;
67+ napi_threadsafe_function on_exit_callback = nullptr ;
6768
6869struct data_buffer {
6970 char *buf;
@@ -96,19 +97,23 @@ static void *terminal_worker(void *) {
9697 }
9798
9899 // call callback registered by ArkTS
99- if (hex.length () > 0 && registered_callback != nullptr ) {
100+ if (hex.length () > 0 && on_data_callback != nullptr ) {
100101 data_buffer *pbuf = new data_buffer{.buf = new char [hex.length ()], .size = (size_t )hex.length ()};
101102 memcpy (pbuf->buf , &hex[0 ], hex.length ());
102- napi_call_threadsafe_function (registered_callback , pbuf, napi_tsfn_nonblocking);
103+ napi_call_threadsafe_function (on_data_callback , pbuf, napi_tsfn_nonblocking);
103104 }
104105
105106 OH_LOG_INFO (LOG_APP, " Got: %{public}s" , hex.c_str ());
106107 } else if (r < 0 ) {
107108
108109 OH_LOG_INFO (LOG_APP, " Program exited: %{public}ld %{public}d" , r, errno);
110+ break ;
109111 }
110112 }
111113 }
114+
115+ napi_call_threadsafe_function (on_exit_callback, nullptr , napi_tsfn_nonblocking);
116+ return nullptr ;
112117}
113118
114119static napi_value run (napi_env env, napi_callback_info info) {
@@ -142,7 +147,7 @@ static napi_value run(napi_env env, napi_callback_info info) {
142147 // termios
143148 struct termios t {};
144149 struct termios *term = &t;
145-
150+
146151 term->c_iflag = ICRNL | IXON | IUTF8;
147152 term->c_oflag = NL0 | CR0 | TAB0 | BS0 | VT0 | FF0 | OPOST | ONLCR;
148153 term->c_cflag = B38400 | CS8 | CREAD;
@@ -233,7 +238,7 @@ static napi_value send(napi_env env, napi_callback_info info) {
233238 return nullptr ;
234239}
235240
236- void real_func_call_js (napi_env env, napi_value js_callback, void *context, void *data) {
241+ void call_on_data_callback (napi_env env, napi_value js_callback, void *context, void *data) {
237242
238243 data_buffer *buffer = static_cast <data_buffer *>(data);
239244
@@ -253,7 +258,17 @@ void real_func_call_js(napi_env env, napi_value js_callback, void *context, void
253258 delete buffer;
254259}
255260
256- static napi_value register_callback (napi_env env, napi_callback_info info) {
261+ void call_on_exit_callback (napi_env env, napi_value js_callback, void *context, void *data) {
262+
263+ napi_value global;
264+ napi_get_global (env, &global);
265+
266+ napi_value result;
267+ napi_value args[1 ] = {};
268+ napi_call_function (env, global, js_callback, 0 , args, &result);
269+ }
270+
271+ static napi_value register_on_data_callback (napi_env env, napi_callback_info info) {
257272
258273 size_t argc = 1 ;
259274 napi_value args[1 ];
@@ -263,7 +278,22 @@ static napi_value register_callback(napi_env env, napi_callback_info info) {
263278 napi_create_string_utf8 (env, " data_callback" , NAPI_AUTO_LENGTH, &src_cb_name);
264279
265280 napi_create_threadsafe_function (env, args[0 ], nullptr , src_cb_name, 0 , 1 , nullptr , nullptr , nullptr ,
266- real_func_call_js, ®istered_callback);
281+ call_on_data_callback, &on_data_callback);
282+
283+ return nullptr ;
284+ }
285+
286+ static napi_value register_on_exit_callback (napi_env env, napi_callback_info info) {
287+
288+ size_t argc = 1 ;
289+ napi_value args[1 ];
290+ napi_get_cb_info (env, info, &argc, args, nullptr , nullptr );
291+
292+ napi_value src_cb_name;
293+ napi_create_string_utf8 (env, " exit_callback" , NAPI_AUTO_LENGTH, &src_cb_name);
294+
295+ napi_create_threadsafe_function (env, args[0 ], nullptr , src_cb_name, 0 , 1 , nullptr , nullptr , nullptr ,
296+ call_on_exit_callback, &on_exit_callback);
267297
268298 return nullptr ;
269299}
@@ -274,7 +304,8 @@ static napi_value Init(napi_env env, napi_value exports) {
274304 {" resize" , nullptr , resize, nullptr , nullptr , nullptr , napi_default, nullptr },
275305 {" run" , nullptr , run, nullptr , nullptr , nullptr , napi_default, nullptr },
276306 {" send" , nullptr , send, nullptr , nullptr , nullptr , napi_default, nullptr },
277- {" subscribe" , nullptr , register_callback, nullptr , nullptr , nullptr , napi_default, nullptr }};
307+ {" onData" , nullptr , register_on_data_callback, nullptr , nullptr , nullptr , napi_default, nullptr },
308+ {" onExit" , nullptr , register_on_exit_callback, nullptr , nullptr , nullptr , napi_default, nullptr }};
278309 napi_define_properties (env, exports, sizeof (desc) / sizeof (desc[0 ]), desc);
279310 return exports;
280311}
0 commit comments