[M76 Migration][Service][Global] Support multiple connections 51/226851/1
authorYoungsoo Choi <kenshin.choi@samsung.com>
Fri, 3 Jan 2020 07:49:01 +0000 (23:49 -0800)
committerYoungsoo Choi <kenshin.choi@samsung.com>
Fri, 6 Mar 2020 04:08:22 +0000 (20:08 -0800)
This supports multiple connections between ui apps and service apps.

Reference: https://review.tizen.org/gerrit/221517/

Change-Id: I383592399b89a8eef22d7a06aadb08c5ca27f736
Signed-off-by: Youngsoo Choi <kenshin.choi@samsung.com>
wrt_app/service/main.js

index f6350de..a37e977 100755 (executable)
@@ -24,26 +24,26 @@ const XWalkExtension = require('../common/wrt_xwalk_extension');
 
 var sandbox = [];
 var sandbox_count = 0;
+var service_source = [];
 
-wrt.on('start-service', (event, app_id, permissions) => {
-  console.log('start service app : ' + app_id + ', permissions : ' + permissions);
-  new XWalkExtension();
-  if (sandbox[app_id] === undefined) {
+wrt.on('start-service', (event, internal_id, permissions) => {
+  console.log('start service app : ' + internal_id + ', permissions : ' + permissions);
+  if (sandbox[internal_id] === undefined) {
     if (sandbox_count === 0) {
       new XWalkExtension();
     }
     sandbox_count++;
     const Module = require('module');
-    sandbox[app_id] = {
+    sandbox[internal_id] = {
       console: console,
       module: new Module,
       require: require,
       tizen: tizen,
     };
-    let access_control_manager = new AccessControlManager(permissions, sandbox[app_id]);
+    let access_control_manager = new AccessControlManager(permissions, sandbox[internal_id]);
     access_control_manager.initialize();
-    for(let key in global) {
-      sandbox[app_id][key] = global[key];
+    for (let key in global) {
+      sandbox[internal_id][key] = global[key];
     }
     let standard_object_list = [ Error, EvalError, RangeError, ReferenceError,
         SyntaxError, TypeError, URIError, Number, BigInt, Math, Date,
@@ -56,36 +56,44 @@ wrt.on('start-service', (event, app_id, permissions) => {
         WebAssembly.Table, WebAssembly.CompileError, WebAssembly.LinkError,
         WebAssembly.RuntimeError, Boolean, Function, Object, Symbol ];
     for (let idx in standard_object_list) {
-      sandbox[app_id][standard_object_list[idx].name] = standard_object_list[idx];
+      sandbox[internal_id][standard_object_list[idx].name] = standard_object_list[idx];
     }
-    let options = { filename: app_id };
-    vm.runInNewContext(wrt.readService(app_id), sandbox[app_id], options);
+    let options = { filename: internal_id };
+    let service_id = internal_id.substr(0, internal_id.indexOf(":"));
+    let terminate_service_client_process = false;
+    if (service_source[service_id] === undefined) {
+      service_source[service_id] = wrt.readService(internal_id);
+      terminate_service_client_process = true;
+    }
+    vm.runInNewContext(service_source[service_id], sandbox[internal_id], options);
 
-    if (!wrt.terminateClient(app_id)) {
-      console.log('Failed to terminate client process');
+    if (terminate_service_client_process) {
+      if (!wrt.terminateServiceClientProcess(internal_id)) {
+        console.log('Failed to terminate client process');
+      }
     }
   }
-  if (sandbox[app_id]['started'] === undefined) {
-    sandbox[app_id]['started'] = true;
-    sandbox[app_id]['stopped'] = undefined;
+  if (sandbox[internal_id]['started'] === undefined) {
+    sandbox[internal_id]['started'] = true;
+    sandbox[internal_id]['stopped'] = undefined;
     const start_callback_string = 'if (module.exports.onStart !== undefined) { module.exports.onStart(); }';
-    vm.runInContext(start_callback_string, sandbox[app_id]);
+    vm.runInContext(start_callback_string, sandbox[internal_id]);
   }
   const request_callback_string = 'if (module.exports.onRequest !== undefined) { module.exports.onRequest(); }';
-  vm.runInContext(request_callback_string, sandbox[app_id]);
+  vm.runInContext(request_callback_string, sandbox[internal_id]);
 });
 
-wrt.on('stop-service', (event, app_id) => {
-  if (sandbox[app_id]['stopped'] === undefined) {
+wrt.on('stop-service', (event, internal_id) => {
+  if (sandbox[internal_id]['stopped'] === undefined) {
     sandbox_count--;
-    sandbox[app_id]['stopped'] = true;
-    sandbox[app_id]['started'] = undefined;
+    sandbox[internal_id]['stopped'] = true;
+    sandbox[internal_id]['started'] = undefined;
     const stop_callback_string = 'if (module.exports.onStop !== undefined) { module.exports.onStop(); }';
-    vm.runInContext(stop_callback_string, sandbox[app_id]);
-    for(let key in sandbox[app_id]) {
-      delete sandbox[app_id][key];
+    vm.runInContext(stop_callback_string, sandbox[internal_id]);
+    for(let key in sandbox[internal_id]) {
+      delete sandbox[internal_id][key];
     }
-    delete sandbox[app_id];
+    delete sandbox[internal_id];
     if (sandbox_count === 0) {
       tizen = null;
     }