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.log(`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.log(`data[${dataIndex}][${valueIndex}]: ${appControlData[dataIndex].value[valueIndex]}`);
31 function registerExtensionResolver(id: string) {
33 let extensionResolver = (module: any, file_path: string) => {
34 console.log(`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.log(`${id} launcher was killed.`)
63 requestStopService(id);
64 checkLauncherAlive = () => {};
69 export function start(id: string, filename: string) {
70 XWalkExtension.initialize();
71 XWalkExtension.setRuntimeMessageHandler((type, data) => {
72 if (type === 'tizen://exit') {
73 console.log(`${id} will be closed by ${type}`);
74 requestStopService(id);
78 console.log(`serviceType : ${global['serviceType']}`)
79 new DeviceAPIRouter(id, isGlobalService());
81 // this is workaround solution to make webapis singleton worker
82 // ahead of dropThreadPrivilege()
83 global.tizen.systeminfo.getPropertyValue("CPU", () => { }, () => { });
85 // This is for awaking up uv loop.
86 dummyTimer = setInterval(() => {
87 checkLauncherAlive(id);
90 if (isServiceApplication()) {
91 registerExtensionResolver(id);
92 filename = wrt.getStartServiceFile(id);
93 console.log(`start global service file: ${filename}`);
96 printAppControlData(id);
99 let ids = id.split(':');
100 let serviceId = ids[0];
101 let packageId = global.webapis.getPackageId();
102 wrt.security?.dropThreadPrivilege(packageId, serviceId);
104 app = require(filename);
105 if (app.onStart !== undefined) {
108 if (app.onRequest !== undefined) {
111 if (isGlobalService()) {
112 wrt.finishStartingService(id);
115 console.log(`exception on start: ${e}`);
116 requestStopService(id);
120 export function stop(id: string) {
122 clearInterval(dummyTimer);
124 if (app.onStop !== undefined) {
126 } else if (app.onExit !== undefined) {
130 console.log(`exception on stop: ${e}`);
135 let id = workerData.id;
136 // FIXME: this should be 'wrt.tv?.serviceMount(id)' after Tizen 6.5 release
137 (wrt.tv as any)?.serviceMount(id);
139 let filename = workerData.filename;
144 parentPort.on('message', (message) => {
145 console.log(`Received message type : ${message.type}`);
146 if (message.type === 'wake') {
148 } else if (message.type === 'stop') {
151 XWalkExtension.cleanup();
152 parentPort?.postMessage("will-terminate");
153 (wrt.tv as any)?.serviceUmount(id);