[hotfix] Ignore type checking for edge
[platform/framework/web/wrtjs.git] / wrt_app / service / device_api_router.ts
1 import { wrt } from '../browser/wrt';
2
3 export class DeviceAPIRouter {
4   currentApplication: any;
5   funcCurrentApplication: any;
6   funcRequestedAppcontrol: any;
7   funcGetAppInfo: any;
8   funcGetAppcerts: any;
9   funcGetContext: any;
10   funcGetSharedUri: any;
11   funcGetMetadata: any;
12   funcGetPackageInfo: any;
13
14   id: string;
15   serviceId: string;
16   packageId: string;
17   callerAppId: string;
18   permissions: string[];
19   pkgApiVersion: string;
20
21   constructor(id: string, isGlobal: boolean) {
22     this.id = id;
23     let ids = id.split(':');
24     this.serviceId = ids[0];
25     this.callerAppId = ids[1] ?? '';
26     this.packageId = this.serviceId.split('.')[0];
27     this.permissions = [];
28     this.pkgApiVersion = '';
29
30     this.initWebapis();
31     if (isGlobal) {
32       this.permissions = wrt.getPrivileges(this.id);
33       this.pkgApiVersion = wrt.getPkgApiVersion(this.id);
34       this.refineApplicationApis();
35       this.refinePackageApis();
36       this.refineFilesystemApis()
37       this.initAccessControlManager();
38       this.refineXwalkUtilApis();
39     }
40   }
41
42   initWebapis() {
43     let app_info = global.tizen.application.getAppInfo(this.serviceId);
44     if (app_info) {
45       this.packageId = app_info.packageId;
46     }
47
48     global.webapis = global.webapis ?? {};
49     global.webapis.getCallerAppId = () => {
50       return this.callerAppId;
51     }
52     global.webapis.getServiceId = () => {
53       return this.serviceId;
54     }
55     global.webapis.getPackageId = () => {
56       return this.packageId;
57     }
58     global.webapis.postPlainNotification = (title: string, message: string, timeout?: number) => {
59       return wrt.postPlainNotification(title, message, timeout ?? 10);
60     }
61     Object.defineProperties(global.webapis, {
62       getCallerAppId: { writable: false, enumerable: true },
63       getPackageId: { writable: false, enumerable: true },
64       getServiceId: { writable: false, enumerable: true },
65       postPlainNotification: { writable: false, enumerable: true },
66     });
67     this.initMDEWebapis();
68     this.initEdgeWebapis();
69     this.initProductWebapis();
70   }
71
72   initMDEWebapis() {
73     if (wrt['mde'] && !global.webapis.mde) {
74       let mde = wrt.mde as NativeWRTjs.MDEExtension;
75       global.webapis.mde = {};
76       if (wrt.tv) {
77         global.webapis.mde.deInitVirtualEventGenerator = (type: number) => {
78           return mde.deInitVirtualEventGenerator(type);
79         }
80         global.webapis.mde.generateVirtualKeyEvent = (keycode: number, state: number) => {
81           return mde.generateVirtualKeyEvent(keycode, state);
82         }
83         global.webapis.mde.generateVirtualMouseButtonEvent = (button: number, status: number) => {
84           return mde.generateVirtualMouseButtonEvent(button, status);
85         }
86         global.webapis.mde.generateVirtualMouseMoveEvent = (x: number, y: number, move_count: number) => {
87           return mde.generateVirtualMouseMoveEvent(x, y, move_count);
88         }
89         global.webapis.mde.initVirtualEventGenerator = (type: number) => {
90           return mde.initVirtualEventGenerator(type);
91         }
92       }
93       global.webapis.mde.getCurrentLoginId = () => {
94         return mde.getCurrentLoginId();
95       }
96       global.webapis.mde.getDeviceName = () => {
97         return mde.getDeviceName();
98       }
99       global.webapis.mde.launchBrowserFromUrl = (url: string) => {
100         return mde.launchBrowserFromUrl(url);
101       }
102       Object.defineProperty(global.webapis, 'mde', { writable: false, enumerable: true });
103     }
104   }
105
106   initEdgeWebapis() {
107     if ((wrt as any)['edge'] && !global.webapis.edge) {
108       let edge = (wrt as any).edge as any;
109       global.webapis.edge = {
110         orchestrationGetDevicelist: (service_name: string, exec_type: string) => {
111           return edge?.orchestrationGetDevicelist(service_name, exec_type);
112         },
113         orchestrationReadCapability: (ip: string) => {
114           return edge?.orchestrationReadCapability(ip);
115         },
116         orchestrationRequestService: (app_name: string, self_select: boolean, exec_type: string, exec_parameter: string) => {
117           return edge?.orchestrationRequestService(app_name, self_select, exec_type, exec_parameter);
118         },
119         orchestrationRequestServiceOnDevice: (app_name: string, self_select: boolean, exec_type: string, exec_parameter: string, ip: string) => {
120           return edge?.orchestrationRequestServiceOnDevice(app_name, self_select, exec_type, exec_parameter, ip);
121         },
122         orchestrationWriteCapability: (json: string) => {
123           return edge?.orchestrationWriteCapability(json);
124         },
125       }
126       Object.defineProperty(global.webapis, 'edge', { writable: false, enumerable: true });
127     }
128   }
129
130   initProductWebapis() {
131     // for TV profile
132     if (wrt.tv && !global.webapis.productinfo) {
133       global.webapis.cachedProperty = global.webapis.cachedProperty ?? {};
134       let getCachedValue = (name: string) => {
135         if (global.webapis.cachedProperty[name]) {
136           return global.webapis.cachedProperty[name];
137         }
138         let tv = wrt.tv as NativeWRTjs.TVExtension;
139         return (global.webapis.cachedProperty[name] = tv.queryProductValue(name));
140       }
141       global.webapis.productinfo = {
142         getDuid: () => {
143           return getCachedValue('getDuid');
144         },
145         getFirmware: () => {
146           return getCachedValue('getFirmware');
147         },
148         getLocalSet: () => {
149           return getCachedValue('getLocalSet');
150         },
151         getModel: () => {
152           return getCachedValue('getModel');
153         },
154         getModelCode: () => {
155           return getCachedValue('getModelCode');
156         },
157         getRealModel: () => {
158           return getCachedValue('getRealModel');
159         },
160         getSmartTVServerVersion: () => {
161           return getCachedValue('getSmartTVServerVersion');
162         },
163         getSmartTVServerType: () => {
164           return Number(getCachedValue('getSmartTVServerType'));
165         },
166         isWallModel: () => {
167           return (getCachedValue('isWallModel') === 'true');
168         },
169         isUHDAModel: () => {
170           return (getCachedValue('isUHDAModel') === 'true');
171         },
172         is8KPanelSupported: () => {
173           return (getCachedValue('is8KPanelSupported') === 'true');
174         }
175       };
176
177       global.webapis.productinfo.ProductInfoSiServerType = {
178           SI_TYPE_OPERATIING_SERVER: 0,
179           SI_TYPE_DEVELOPMENT_SERVER: 1,
180           SI_TYPE_DEVELOPING_SERVER: 2
181       };
182     }
183   }
184
185   initAccessControlManager() {
186     console.log(`permissions : ${this.permissions}`);
187     const AccessControlManager = require('./access_control_manager');
188     AccessControlManager.initialize(this.packageId, this.serviceId, this.permissions);
189   }
190
191   getServiceId() {
192     return global.webapis.getServiceId();
193   }
194
195   getPackageId() {
196     return global.webapis.getPackageId();
197   }
198
199   hasNoneOrNull(args: any[]) {
200     return !args.length || null === args[0];
201   }
202
203   refineApplicationApis() {
204     // tizen.application.getCurrentApplication()
205     this.funcCurrentApplication = global.tizen.application.getCurrentApplication;
206     global.tizen.application.getCurrentApplication = () => {
207       console.log(`Routing - getCurrentApplication() : ${this.getServiceId()}`);
208       if (this.currentApplication)
209         return this.currentApplication;
210       this.currentApplication = {};
211       const originCurrentApplication = this.funcCurrentApplication();
212       for (let key in originCurrentApplication) {
213         if (key === 'appInfo') {
214           this.currentApplication.appInfo = {};
215           for (let key in originCurrentApplication.appInfo) {
216             if (key === 'id') {
217               this.currentApplication.appInfo[key] = this.getServiceId();
218             } else {
219               this.currentApplication.appInfo[key] = originCurrentApplication.appInfo[key];
220             }
221           }
222         } else {
223           if (key === 'broadcastEvent' || key === 'broadcastTrustedEvent') {
224             this.currentApplication[key] = originCurrentApplication[key].bind(originCurrentApplication);
225           } else {
226             this.currentApplication[key] = originCurrentApplication[key];
227           }
228         }
229       }
230       Object.defineProperties(this.currentApplication.appInfo, {
231         categories: { writable: false, enumerable: true },
232         iconPath: { writable: false, enumerable: true },
233         id: { writable: false, enumerable: true },
234         installDate: { writable: false, enumerable: true },
235         name: { writable: false, enumerable: true },
236         packageId: { writable: false, enumerable: true },
237         show: { writable: false, enumerable: true },
238         size: { enumerable: true },
239         version: { writable: false, enumerable: true }
240       });
241       Object.defineProperties(this.currentApplication, {
242         appInfo: { enumerable: true },
243         contextId: { writable: false, enumerable: true }
244       });
245       // tizen.application.getCurrentApplication().getRequestedAppControl()
246       this.funcRequestedAppcontrol = this.currentApplication.getRequestedAppControl;
247       this.currentApplication.getRequestedAppControl = () => {
248         console.log(`Routing - getRequestedAppControl() : ${this.getServiceId()}`);
249         if (wrt.tv)
250           wrt.tv.setCurrentApplication(this.getServiceId());
251         return this.funcRequestedAppcontrol();
252       }
253       return this.currentApplication;
254     }
255     // tizen.application.getAppInfo()
256     this.funcGetAppInfo = global.tizen.application.getAppInfo;
257     global.tizen.application.getAppInfo = (...args: any[]) => {
258       let app_id = args[0];
259       if (this.hasNoneOrNull(args))
260         app_id = this.getServiceId();
261       console.log(`Routing - getAppInfo(${app_id})`);
262       return this.funcGetAppInfo(app_id);
263     }
264     // tizen.application.getAppCerts()
265     this.funcGetAppcerts = global.tizen.application.getAppCerts;
266     global.tizen.application.getAppCerts = (...args: any[]) => {
267       let app_id = args[0];
268       if (this.hasNoneOrNull(args))
269         app_id = this.getServiceId();
270       console.log(`Routing - getAppCerts() ` + app_id);
271       return this.funcGetAppcerts(app_id);
272     }
273     // tizen.application.getAppContext()
274     this.funcGetContext = global.tizen.application.getAppContext;
275     global.tizen.application.getAppContext = (...args: any[]) => {
276       console.log(`Routing - getAppContext()`);
277       if (this.hasNoneOrNull(args)) {
278         const context = {"id": this.funcGetContext().id, "appId": this.getServiceId()};
279         Object.defineProperties(context, {
280           appId: { writable: false, enumerable: true },
281           id: { writable: false, enumerable: true }
282         });
283         return context;
284       }
285       return this.funcGetContext(args[0]);
286     }
287     // tizen.application.getAppSharedURI()
288     this.funcGetSharedUri = global.tizen.application.getAppSharedURI;
289     global.tizen.application.getAppSharedURI = (...args: any[]) => {
290       let app_id = args[0];
291       if (this.hasNoneOrNull(args))
292         app_id = this.getServiceId();
293       console.log(`Routing - getAppSharedURI()`);
294       return this.funcGetSharedUri(app_id);
295     }
296     // tizen.application.getAppMetaData()
297     this.funcGetMetadata = global.tizen.application.getAppMetaData;
298     global.tizen.application.getAppMetaData = (...args: any[]) => {
299       let app_id = args[0];
300       if (this.hasNoneOrNull(args))
301         app_id = this.getServiceId();
302       console.log(`Routing - getAppMetaData()`);
303       return this.funcGetMetadata(app_id);
304     }
305   }
306
307   refinePackageApis() {
308     // tizen.package.getPackageInfo()
309     this.funcGetPackageInfo = global.tizen.package.getPackageInfo;
310     global.tizen.package.getPackageInfo = (...args: any[]) => {
311       let package_id = args[0];
312       if (this.hasNoneOrNull(args))
313         package_id = this.getPackageId();
314       console.log(`Routing - getPackageInfo() : ${package_id}`);
315       return this.funcGetPackageInfo(package_id);
316     }
317   }
318
319   injectVirtualRootResolver(func: Function) {
320     return (...args: any[]) => {
321       console.log('arguments : ' + args);
322       if (args.length && !(args[0] === null || args[0] === undefined)) {
323         args[0] = wrt.resolveVirtualRoot(this.getServiceId(), args[0]);
324         console.log('updated argument[0] : ' + args[0]);
325       }
326       return func.apply(global.tizen.filesystem, args);
327     }
328   }
329
330   refineFilesystemApis() {
331     global.tizen.filesystem.resolve = this.injectVirtualRootResolver(global.tizen.filesystem.resolve);
332     global.tizen.filesystem.listDirectory = this.injectVirtualRootResolver(global.tizen.filesystem.listDirectory);
333     global.tizen.filesystem.createDirectory = this.injectVirtualRootResolver(global.tizen.filesystem.createDirectory);
334     global.tizen.filesystem.deleteDirectory = this.injectVirtualRootResolver(global.tizen.filesystem.deleteDirectory);
335     global.tizen.filesystem.openFile = this.injectVirtualRootResolver(global.tizen.filesystem.openFile);
336     global.tizen.filesystem.deleteFile = this.injectVirtualRootResolver(global.tizen.filesystem.deleteFile);
337     global.tizen.filesystem.moveFile = this.injectVirtualRootResolver(global.tizen.filesystem.moveFile);
338     global.tizen.filesystem.copyFile = this.injectVirtualRootResolver(global.tizen.filesystem.copyFile);
339     global.tizen.filesystem.isFile = this.injectVirtualRootResolver(global.tizen.filesystem.isFile);
340     global.tizen.filesystem.toURI = this.injectVirtualRootResolver(global.tizen.filesystem.toURI);
341     global.tizen.filesystem.isDirectory = this.injectVirtualRootResolver(global.tizen.filesystem.isDirectory);
342     global.tizen.filesystem.pathExists = this.injectVirtualRootResolver(global.tizen.filesystem.pathExists);
343   }
344
345   refineXwalkUtilApis() {
346     global.xwalk.utils.checkPrivilegeAccess = (privilege: string) => {
347       if (!this.permissions.includes(privilege)) {
348         throw 'Permission denied';
349       }
350     }
351     global.xwalk.utils.getPkgApiVersion = () => {
352       return this.pkgApiVersion;
353     }
354   }
355 }