It is more proper that service*.ts are placed in service/ directory.
Change-Id: I5bd14d66d3196e4a1e32dd5af8b07eb68035ba26
Signed-off-by: DongHyun Song <dh81.song@samsung.com>
+++ /dev/null
-import { Worker, isMainThread } from 'worker_threads';
-import { wrt } from '../browser/wrt';
-
-interface WorkerMap {
- [id: string]: any;
-}
-let workers: WorkerMap = {};
-let runner: any;
-
-Object.defineProperty(global, 'serviceType', {
- value: wrt.getServiceModel(),
- writable: false
-});
-
-function createWorker(id: string, startService: string, filename: string) {
- if (workers[id]) {
- workers[id].postMessage({ type: 'wake' });
- return;
- }
-
- workers[id] = new Worker(startService, {
- workerData: {
- id,
- filename
- }
- });
- workers[id].on('message', (message: string) => {
- if (message === 'will-terminate') {
- workers[id].terminate();
- }
- });
- workers[id].on('exit', (code: number) => {
- delete workers[id];
- let runningServices = Object.keys(workers).length;
- console.log(`exit code(${code}), remain services(${runningServices})`);
- });
-}
-
-function terminateWorker(id: string, delay: number) {
- if (!workers[id]) {
- console.log(`This worker is already terminated. ${id}`);
- return;
- }
- console.log(`${id} will shutdown after ${delay}ms`);
- workers[id].postMessage({ type: 'stop', delay });
-}
-
-export function startService(id: string, filename: string) {
- console.log(`startService - ${id}`);
- if (global['serviceType'] === 'STANDALONE') {
- let ids = id.split(':');
- let serviceId = ids[0];
- let packageId = serviceId.split('.')[0];
- wrt.security?.dropThreadPrivilege(packageId, serviceId);
- }
- let startService = `${__dirname}/service_runner.js`;
- createWorker(id, startService, filename);
-}
-
-export function stopService(id: string) {
- console.log(`stopService - ${id}`);
- terminateWorker(id, 500);
-}
-
-export function handleBuiltinService(serviceId: string, serviceName: string) {
- if (!serviceName) {
- return;
- }
- let need_stop = (serviceName.substr(0, 5) === 'stop_');
- if (need_stop) {
- console.log(`${serviceName} will be terminated.`);
- workers[serviceId].terminate();
- } else {
- console.log(`Builtin service is ${serviceName}`);
- let startService = `${__dirname}/../service/builtins/${serviceName}.js`;
- createWorker(serviceId, startService, '');
- }
-}
\ No newline at end of file
+++ /dev/null
-import './init';
-import * as XWalkExtension from './wrt_xwalk_extension';
-import { DeviceAPIRouter } from '../service/device_api_router';
-import { isMainThread, parentPort, workerData } from 'worker_threads';
-import { wrt } from '../browser/wrt';
-
-Object.defineProperty(global, 'serviceType', {
- value: wrt.getServiceModel(),
- writable: false
-});
-
-function isServiceApplication() {
- return global['serviceType'] !== 'UI';
-}
-
-function isGlobalService() {
- return global['serviceType'] === 'GLOBAL';
-}
-function printAppControlData(id: string) {
- let reqAppControl = global.tizen.application.getCurrentApplication().getRequestedAppControl();
- if (reqAppControl) {
- console.log(`id: ${id}, appControlData operation: ${reqAppControl.appControl.operation}`);
- let appControlData = reqAppControl.appControl.data;
- for (let dataIndex in appControlData) {
- for (let valueIndex in appControlData[dataIndex].value)
- console.log(`data[${dataIndex}][${valueIndex}]: ${appControlData[dataIndex].value[valueIndex]}`);
- }
- }
-}
-
-function registerExtensionResolver(id: string) {
- if (wrt.tv) {
- let extensionResolver = (module: any, file_path: string) => {
- console.log(`resolved path: ${file_path}`);
- let content = (wrt.tv as NativeWRTjs.TVExtension).decryptFile(id, file_path);
- if (content) {
- // Remove BOM
- if (content.charCodeAt(0) === 0xFEFF)
- content = content.slice(1);
- module._compile(content, file_path);
- }
- };
- require.extensions['.js.spm'] = extensionResolver;
- require.extensions['.spm'] = extensionResolver;
- }
-}
-
-let requestStopService = (id: string) => {
- requestStopService = (id: string) => {};
- setTimeout(() => wrt.stopService(id), 500);
-}
-
-let app: any = null;
-let dummyTimer: any;
-let periodLauncherAlive = 20; // 2s
-
-let checkLauncherAlive = (id: string) => {
- periodLauncherAlive--;
- if (!periodLauncherAlive) {
- periodLauncherAlive = 20;
- if (!wrt.checkLauncherAlive(id)) {
- console.log(`${id} launcher was killed.`)
- requestStopService(id);
- checkLauncherAlive = () => {};
- }
- }
-}
-
-export function start(id: string, filename: string) {
- XWalkExtension.initialize();
- XWalkExtension.setRuntimeMessageHandler((type, data) => {
- if (type === 'tizen://exit') {
- console.log(`${id} will be closed by ${type}`);
- requestStopService(id);
- }
- });
-
- console.log(`serviceType : ${global['serviceType']}`)
- new DeviceAPIRouter(id, isGlobalService());
-
- // this is workaround solution to make webapis singleton worker
- // ahead of dropThreadPrivilege()
- global.tizen.systeminfo.getPropertyValue("CPU", () => { }, () => { });
-
- // This is for awaking up uv loop.
- dummyTimer = setInterval(() => {
- checkLauncherAlive(id);
- }, 100);
-
- if (isServiceApplication()) {
- registerExtensionResolver(id);
- filename = wrt.getStartServiceFile(id);
- console.log(`start global service file: ${filename}`);
- }
-
- printAppControlData(id);
-
- try {
- let ids = id.split(':');
- let serviceId = ids[0];
- let packageId = global.webapis.getPackageId();
- wrt.security?.dropThreadPrivilege(packageId, serviceId);
-
- app = require(filename);
- if (app.onStart !== undefined) {
- app.onStart();
- }
- if (app.onRequest !== undefined) {
- app.onRequest();
- }
- if (isGlobalService()) {
- wrt.finishStartingService(id);
- }
- } catch (e) {
- console.log(`exception on start: ${e}`);
- requestStopService(id);
- }
-}
-
-export function stop(id: string) {
- if (dummyTimer)
- clearInterval(dummyTimer);
- try {
- if (app.onStop !== undefined) {
- app.onStop();
- } else if (app.onExit !== undefined) {
- app.onExit();
- }
- } catch (e) {
- console.log(`exception on stop: ${e}`);
- }
-}
-
-function run() {
- let id = workerData.id;
- // FIXME: this should be 'wrt.tv?.serviceMount(id)' after Tizen 6.5 release
- (wrt.tv as any)?.serviceMount(id);
-
- let filename = workerData.filename;
- start(id, filename);
-
- if (!parentPort)
- return;
- parentPort.on('message', (message) => {
- console.log(`Received message type : ${message.type}`);
- if (message.type === 'wake') {
- app?.onRequest();
- } else if (message.type === 'stop') {
- stop(id);
- setTimeout(() => {
- XWalkExtension.cleanup();
- parentPort?.postMessage("will-terminate");
- (wrt.tv as any)?.serviceUmount(id);
- }, message.delay);
- }
- });
-}
-
-if (!isMainThread) {
- run();
-}
import '../common/init';
import { wrt } from '../browser/wrt';
-import * as ServiceManager from '../common/service_manager';
+import * as ServiceManager from './service_manager';
wrt.on('start-service', (event: any, internal_id: string) => {
console.log(`start service app : ${internal_id}`);
--- /dev/null
+import { Worker, isMainThread } from 'worker_threads';
+import { wrt } from '../browser/wrt';
+
+interface WorkerMap {
+ [id: string]: any;
+}
+let workers: WorkerMap = {};
+let runner: any;
+
+Object.defineProperty(global, 'serviceType', {
+ value: wrt.getServiceModel(),
+ writable: false
+});
+
+function createWorker(id: string, startService: string, filename: string) {
+ if (workers[id]) {
+ workers[id].postMessage({ type: 'wake' });
+ return;
+ }
+
+ workers[id] = new Worker(startService, {
+ workerData: {
+ id,
+ filename
+ }
+ });
+ workers[id].on('message', (message: string) => {
+ if (message === 'will-terminate') {
+ workers[id].terminate();
+ }
+ });
+ workers[id].on('exit', (code: number) => {
+ delete workers[id];
+ let runningServices = Object.keys(workers).length;
+ console.log(`exit code(${code}), remain services(${runningServices})`);
+ });
+}
+
+function terminateWorker(id: string, delay: number) {
+ if (!workers[id]) {
+ console.log(`This worker is already terminated. ${id}`);
+ return;
+ }
+ console.log(`${id} will shutdown after ${delay}ms`);
+ workers[id].postMessage({ type: 'stop', delay });
+}
+
+export function startService(id: string, filename: string) {
+ console.log(`startService - ${id}`);
+ if (global['serviceType'] === 'STANDALONE') {
+ let ids = id.split(':');
+ let serviceId = ids[0];
+ let packageId = serviceId.split('.')[0];
+ wrt.security?.dropThreadPrivilege(packageId, serviceId);
+ }
+ let startService = `${__dirname}/service_runner.js`;
+ createWorker(id, startService, filename);
+}
+
+export function stopService(id: string) {
+ console.log(`stopService - ${id}`);
+ terminateWorker(id, 500);
+}
+
+export function handleBuiltinService(serviceId: string, serviceName: string) {
+ if (!serviceName) {
+ return;
+ }
+ let need_stop = (serviceName.substr(0, 5) === 'stop_');
+ if (need_stop) {
+ console.log(`${serviceName} will be terminated.`);
+ workers[serviceId].terminate();
+ } else {
+ console.log(`Builtin service is ${serviceName}`);
+ let startService = `${__dirname}/../service/builtins/${serviceName}.js`;
+ createWorker(serviceId, startService, '');
+ }
+}
\ No newline at end of file
--- /dev/null
+import '../common/init';
+import * as XWalkExtension from '../common/wrt_xwalk_extension';
+import { DeviceAPIRouter } from './device_api_router';
+import { isMainThread, parentPort, workerData } from 'worker_threads';
+import { wrt } from '../browser/wrt';
+
+Object.defineProperty(global, 'serviceType', {
+ value: wrt.getServiceModel(),
+ writable: false
+});
+
+function isServiceApplication() {
+ return global['serviceType'] !== 'UI';
+}
+
+function isGlobalService() {
+ return global['serviceType'] === 'GLOBAL';
+}
+function printAppControlData(id: string) {
+ let reqAppControl = global.tizen.application.getCurrentApplication().getRequestedAppControl();
+ if (reqAppControl) {
+ console.log(`id: ${id}, appControlData operation: ${reqAppControl.appControl.operation}`);
+ let appControlData = reqAppControl.appControl.data;
+ for (let dataIndex in appControlData) {
+ for (let valueIndex in appControlData[dataIndex].value)
+ console.log(`data[${dataIndex}][${valueIndex}]: ${appControlData[dataIndex].value[valueIndex]}`);
+ }
+ }
+}
+
+function registerExtensionResolver(id: string) {
+ if (wrt.tv) {
+ let extensionResolver = (module: any, file_path: string) => {
+ console.log(`resolved path: ${file_path}`);
+ let content = (wrt.tv as NativeWRTjs.TVExtension).decryptFile(id, file_path);
+ if (content) {
+ // Remove BOM
+ if (content.charCodeAt(0) === 0xFEFF)
+ content = content.slice(1);
+ module._compile(content, file_path);
+ }
+ };
+ require.extensions['.js.spm'] = extensionResolver;
+ require.extensions['.spm'] = extensionResolver;
+ }
+}
+
+let requestStopService = (id: string) => {
+ requestStopService = (id: string) => {};
+ setTimeout(() => wrt.stopService(id), 500);
+}
+
+let app: any = null;
+let dummyTimer: any;
+let periodLauncherAlive = 20; // 2s
+
+let checkLauncherAlive = (id: string) => {
+ periodLauncherAlive--;
+ if (!periodLauncherAlive) {
+ periodLauncherAlive = 20;
+ if (!wrt.checkLauncherAlive(id)) {
+ console.log(`${id} launcher was killed.`)
+ requestStopService(id);
+ checkLauncherAlive = () => {};
+ }
+ }
+}
+
+export function start(id: string, filename: string) {
+ XWalkExtension.initialize();
+ XWalkExtension.setRuntimeMessageHandler((type, data) => {
+ if (type === 'tizen://exit') {
+ console.log(`${id} will be closed by ${type}`);
+ requestStopService(id);
+ }
+ });
+
+ console.log(`serviceType : ${global['serviceType']}`)
+ new DeviceAPIRouter(id, isGlobalService());
+
+ // this is workaround solution to make webapis singleton worker
+ // ahead of dropThreadPrivilege()
+ global.tizen.systeminfo.getPropertyValue("CPU", () => { }, () => { });
+
+ // This is for awaking up uv loop.
+ dummyTimer = setInterval(() => {
+ checkLauncherAlive(id);
+ }, 100);
+
+ if (isServiceApplication()) {
+ registerExtensionResolver(id);
+ filename = wrt.getStartServiceFile(id);
+ console.log(`start global service file: ${filename}`);
+ }
+
+ printAppControlData(id);
+
+ try {
+ let ids = id.split(':');
+ let serviceId = ids[0];
+ let packageId = global.webapis.getPackageId();
+ wrt.security?.dropThreadPrivilege(packageId, serviceId);
+
+ app = require(filename);
+ if (app.onStart !== undefined) {
+ app.onStart();
+ }
+ if (app.onRequest !== undefined) {
+ app.onRequest();
+ }
+ if (isGlobalService()) {
+ wrt.finishStartingService(id);
+ }
+ } catch (e) {
+ console.log(`exception on start: ${e}`);
+ requestStopService(id);
+ }
+}
+
+export function stop(id: string) {
+ if (dummyTimer)
+ clearInterval(dummyTimer);
+ try {
+ if (app.onStop !== undefined) {
+ app.onStop();
+ } else if (app.onExit !== undefined) {
+ app.onExit();
+ }
+ } catch (e) {
+ console.log(`exception on stop: ${e}`);
+ }
+}
+
+function run() {
+ let id = workerData.id;
+ // FIXME: this should be 'wrt.tv?.serviceMount(id)' after Tizen 6.5 release
+ (wrt.tv as any)?.serviceMount(id);
+
+ let filename = workerData.filename;
+ start(id, filename);
+
+ if (!parentPort)
+ return;
+ parentPort.on('message', (message) => {
+ console.log(`Received message type : ${message.type}`);
+ if (message.type === 'wake') {
+ app?.onRequest();
+ } else if (message.type === 'stop') {
+ stop(id);
+ setTimeout(() => {
+ XWalkExtension.cleanup();
+ parentPort?.postMessage("will-terminate");
+ (wrt.tv as any)?.serviceUmount(id);
+ }, message.delay);
+ }
+ });
+}
+
+if (!isMainThread) {
+ run();
+}