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);
74 console.debug(`${id}'s pkgid is empty, so stop service`);
75 requestStopService(id);
78 wrt.setServiceAppId(id);
79 wrt.security?.dropThreadPrivilege(packageId, serviceId);
81 XWalkExtension.initialize();
82 XWalkExtension.setRuntimeMessageHandler((type, data) => {
83 if (type === 'tizen://exit') {
84 console.debug(`${id} will be closed by ${type}`);
85 requestStopService(id);
89 console.debug(`serviceType : ${global['serviceType']}`)
90 new DeviceAPIRouter(id, isGlobalService());
91 printAppControlData(id);
93 // This is for awaking up uv loop.
94 if (isGlobalService()) {
95 dummyTimer = setInterval(() => {
96 checkLauncherAlive(id);
100 if (isServiceApplication()) {
101 registerExtensionResolver(id);
102 filename = wrt.getStartServiceFile(id);
103 console.debug(`start global service file: ${filename}`);
107 app = require(filename);
108 if (app.onStart !== undefined) {
111 if (app.onRequest !== undefined) {
115 console.debug(`exception on start: ${e}`);
116 requestStopService(id);
118 if (isGlobalService()) {
119 wrt.finishStartingService(id);
124 export function stop(id: string) {
126 clearInterval(dummyTimer);
128 if (app.onStop !== undefined) {
130 } else if (app.onExit !== undefined) {
134 console.debug(`exception on stop: ${e}`);
139 let id = workerData.id;
141 console.debug('workerData.id is empty!');
145 Object.defineProperty(global, 'internalId', {
150 wrt.tv?.serviceMount(id);
151 let filename = workerData.filename;
154 parentPort?.on('message', (message) => {
155 console.debug(`Received message type : ${message.type}`);
156 if (message.type === 'wake') {
158 } else if (message.type === 'stop') {
161 XWalkExtension.cleanup();
162 parentPort?.postMessage("will-terminate");
164 wrt.tv?.serviceUmount(id);