From: DongHyun Song Date: Wed, 7 Jul 2021 05:02:54 +0000 (+0900) Subject: [Service] Move service files to service/ folder X-Git-Tag: submit/tizen/20210708.160020^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a41cfa5d222c8ff12ee5fa869c5cdfe2235a271f;p=platform%2Fframework%2Fweb%2Fwrtjs.git [Service] Move service files to service/ folder It is more proper that service*.ts are placed in service/ directory. Change-Id: I5bd14d66d3196e4a1e32dd5af8b07eb68035ba26 Signed-off-by: DongHyun Song --- diff --git a/wrt_app/common/service_manager.ts b/wrt_app/common/service_manager.ts deleted file mode 100644 index 66213f6b..00000000 --- a/wrt_app/common/service_manager.ts +++ /dev/null @@ -1,78 +0,0 @@ -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 diff --git a/wrt_app/common/service_runner.ts b/wrt_app/common/service_runner.ts deleted file mode 100644 index 93be76e6..00000000 --- a/wrt_app/common/service_runner.ts +++ /dev/null @@ -1,161 +0,0 @@ -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(); -} diff --git a/wrt_app/service/main.ts b/wrt_app/service/main.ts index 6e6c222b..b0292ae8 100755 --- a/wrt_app/service/main.ts +++ b/wrt_app/service/main.ts @@ -18,7 +18,7 @@ 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}`); diff --git a/wrt_app/service/service_manager.ts b/wrt_app/service/service_manager.ts new file mode 100644 index 00000000..66213f6b --- /dev/null +++ b/wrt_app/service/service_manager.ts @@ -0,0 +1,78 @@ +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 diff --git a/wrt_app/service/service_runner.ts b/wrt_app/service/service_runner.ts new file mode 100644 index 00000000..c028e032 --- /dev/null +++ b/wrt_app/service/service_runner.ts @@ -0,0 +1,161 @@ +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(); +}