SKKU-ESLAB / opel-alpha

Open Platform Event Logger (OPEL) Project
Other
3 stars 0 forks source link

Make NIL JavaScript-only (OPEL JavaScript API Layer) #133

Open RedCarrottt opened 7 years ago

RedCarrottt commented 7 years ago

Related to #100, #114

NIL in OPEL Alpha 1/2 is charged with three tasks.

Although there is a d-bus wrapper npm package(node-dbus), NIL does the same task.

Furthermore, since NIL does three tasks in single code, it became too complicated spaghetti.

Therefore, I propose to introduce node-dbus npm to handle d-bus IPC and write OPEL JavaScript API functions in only JavaScript.

At first, I will test it in App API, Remote UI API and Face Detection API, which I'm charged with, in Alpha 4(#140).

I will propose the sample JavaScript-only API layer in future.

RedCarrottt commented 7 years ago

To-do

RedCarrottt commented 7 years ago

현재 node-dbus를 이용해서 NIL을 JavaScript 코드로 대체할 수 있음을 밝혀냈습니다.

아직은 AppCore Manager와 OPEL Manager를 구조적으로 대조정하고 있기 때문에 JavaScript-only NIL 작업은 후순위로 밀렸습니다.

일단 어떻게 하면 JavaScript 코드로 NIL을 구현할 수 있는지 메모해두려고 합니다. 현재 작업 중인 미완성 코드이기 때문에, 완성된 버전이 나오면 다시 업데이트하도록 하겠습니다.

app.js

App API의 onTermination()의 경우, 다음과 같은 JavaScript 코드를 사용하면 됩니다. 물론, 아직 dbus server 부분까지 테스트한 것은 아니라서 불완전한 상태입니다.

/* app.js: OPEL JavaScript API - App API
 */

var dbus = require("node-dbus");
var base = require("./base");

var getBaseSignal = function() {
  return base.getBaseSignal("/org/opel/sysAppManager", "org.opel.sysAppManager");
};

/* onTermination(): Register the callback of app termination event */
exports.onTermination = function(callback) {
  var signal = getBaseSignal();
  signal.member.value = 'onTermination'; // Name
  signal.appendArgs("ii", pid, reqNum++); // Arguments
  signal.send();
};

API 당 10줄 내외만 작성하면 됩니다. 기존 NIL이 API 당 60줄의 native code를 요구하며, libdbus의 복잡한 API를 사용해야 했던 것과 비교하면 획기적인 변화입니다.

base.js

위와 같은 API를 쉽게 만들기 위해, node-dbus의 wrapper 모듈로 base.js도 만들었습니다.

/* base.js: OPEL JavaScript API - Base API
 */

var dbus = require("node-dbus");
var reqNum = 0;

var callbacks = [];

exports.getBaseSignal = function(pathStr, ifaceStr) {
  var signal =  Object.create(dbus.DBusMessage, {
    path: { value: pathStr, writable: true },
    iface: { value: ifaceStr, writable: true },
    member: { value: "", writable: true },
    bus: { value: dbus.DBUS_BUS_SESSION, writable: true },
    variantPolicy: { value: dbus.NDBUS_VARIANT_POLICY_DEFAULT, writable: true },
    type: { value: dbus.DBUS_MESSAGE_TYPE_SIGNAL }
  });
  signal.on ("error", function (error) {
    console.log ("[API] Dbus failure: ");
    console.log (error);
  });
  return signal;
};