1 import '../common/init';
2 import * as XWalkExtension from '../common/wrt_xwalk_extension';
3 import { DeviceAPIRouter } from './device_api_router';
4 import { isMainThread, parentPort, workerData } from 'worker_threads';
5 import { wrt } from '../browser/wrt';
7 Object.defineProperty(global, 'serviceType', {
8 value: wrt.getServiceModel(),
12 function isServiceApplication() {
13 return global['serviceType'] !== 'UI';
16 function isGlobalService() {
17 return global['serviceType'] === 'GLOBAL';
19 function printAppControlData(id: string) {
20 let reqAppControl = global.tizen.application.getCurrentApplication().getRequestedAppControl();
22 console.debug(`id: ${id}, appControlData operation: ${reqAppControl.appControl.operation}`);
23 let appControlData = reqAppControl.appControl.data;
24 for (let dataIndex in appControlData) {
25 for (let valueIndex in appControlData[dataIndex].value)
26 console.debug(`data[${dataIndex}][${valueIndex}]: ${appControlData[dataIndex].value[valueIndex]}`);
31 function registerExtensionResolver(id: string) {
33 let extensionResolver = (module: any, file_path: string) => {
34 console.debug(`resolved path: ${file_path}`);
35 let content = (wrt.tv as NativeWRTjs.TVExtension).decryptFile(id, file_path);
38 if (content.charCodeAt(0) === 0xFEFF)
39 content = content.slice(1);
40 module._compile(content, file_path);
43 require.extensions['.js.spm'] = extensionResolver;
44 require.extensions['.spm'] = extensionResolver;
48 let requestStopService = (id: string) => {
49 requestStopService = (id: string) => {};
50 setTimeout(() => wrt.stopService(id), 500);
55 let periodLauncherAlive = 20; // 2s
57 let checkLauncherAlive = (id: string) => {
58 periodLauncherAlive--;
59 if (!periodLauncherAlive) {
60 periodLauncherAlive = 20;
61 if (!wrt.checkLauncherAlive(id)) {
62 console.debug(`${id} launcher was killed.`)
63 requestStopService(id);
64 checkLauncherAlive = () => {};
69 export function start(id: string, filename: string) {
70 let ids = id.split(':');
71 let serviceId = ids[0];
72 let packageId = wrt.getPackageId(id);
73 wrt.setServiceAppId(id);
74 wrt.security?.dropThreadPrivilege(packageId, serviceId);
76 XWalkExtension.initialize();
77 XWalkExtension.setRuntimeMessageHandler((type, data) => {
78 if (type === 'tizen://exit') {
79 console.debug(`${id} will be closed by ${type}`);
80 requestStopService(id);
84 console.debug(`serviceType : ${global['serviceType']}`)
85 new DeviceAPIRouter(id, isGlobalService());
86 printAppControlData(id);
88 // This is for awaking up uv loop.
89 if (isGlobalService()) {
90 dummyTimer = setInterval(() => {
91 checkLauncherAlive(id);
95 if (isServiceApplication()) {
96 registerExtensionResolver(id);
97 filename = wrt.getStartServiceFile(id);
98 console.debug(`start global service file: ${filename}`);
102 app = require(filename);
103 if (app.onStart !== undefined) {
106 if (app.onRequest !== undefined) {
110 console.debug(`exception on start: ${e}`);
111 requestStopService(id);
113 if (isGlobalService()) {
114 wrt.finishStartingService(id);
119 export function stop(id: string) {
121 clearInterval(dummyTimer);
123 if (app.onStop !== undefined) {
125 } else if (app.onExit !== undefined) {
129 console.debug(`exception on stop: ${e}`);
134 let id = workerData.id;
136 console.debug('workerData.id is empty!');
140 Object.defineProperty(global, 'internalId', {
145 wrt.tv?.serviceMount(id);
146 let filename = workerData.filename;
149 parentPort?.on('message', (message) => {
150 console.debug(`Received message type : ${message.type}`);
151 if (message.type === 'wake') {
153 } else if (message.type === 'stop') {
156 XWalkExtension.cleanup();
157 parentPort?.postMessage("will-terminate");
159 wrt.tv?.serviceUmount(id);