This patch introduces 2 sso API.
- webapis.sso.getGuid(): string;
- webapis.sso.getOspAccessToken(clientId: string, secret: string,
resolve: Function, reject?: Function): void;
. reject is optional
When the 'OspAccessToken' event is emitted from WRT side to the main
thread, then, it propagates the event to the all workers. But the worker
has registered 'OspAccessToken' event can only take it.
Like as this manner, message listener can be expanded for another
purpose later.
Related chromium-efl patch:
https://review.tizen.org/gerrit/#/c/platform/framework/web/chromium-efl/+/282600/
Change-Id: I5c941e66e2729dbbeeafbbdb35a803134ed4924b
Signed-off-by: DongHyun Song <dh81.song@samsung.com>
import { wrt } from '../browser/wrt';
import * as ServiceMessage from '../common/service_message';
+import { parentPort } from 'worker_threads';
export class DeviceAPIRouter {
currentApplication: any;
permissions: string[];
pkgApiVersion: string;
messagePortInfo: any;
+ messageListeners: any;
constructor(id: string, isGlobal: boolean) {
this.id = id;
this.permissions = [];
this.pkgApiVersion = '';
this.messagePortInfo = {};
+ this.messageListeners = {};
this.initWebapis();
if (isGlobal) {
isRunningApp: { writable: false, enumerable: true },
postPlainNotification: { writable: false, enumerable: true },
});
+
this.initMDEWebapis();
this.initEdgeWebapis();
this.initProductWebapis();
+ this.initSSOWebapis();
}
initMDEWebapis() {
}
}
+ initSSOWebapis() {
+ if (wrt.tv) {
+ global.webapis.sso = {};
+ global.webapis.sso.getGuid = () => {
+ return wrt.tv?.getSSOGuid() || '';
+ }
+ global.webapis.sso.getOspAccessToken = (clientId: string, secret: string, resolve: Function, reject?: Function) => {
+ parentPort?.postMessage({ type: 'register-message', listener: 'OspAccessToken' });
+ this.messageListeners['OspAccessToken'] = { resolve, reject };
+ return wrt.tv?.getOspAccessToken(clientId, secret) || '';
+ }
+ Object.defineProperties(global.webapis.sso, {
+ getGuid: { writable: false, enumerable: true },
+ getOspAccessToken: { writable: false, enumerable: true },
+ });
+ }
+ }
+
+ notifyMessage(notification: any) {
+ if (!this.messageListeners[notification.listener])
+ return;
+ console.debug(`notification.listener : ${notification.listener}`);
+ if (notification.data && notification.data.indexOf('error_code') > -1)
+ this.messageListeners[notification.listener].reject?.(notification.data);
+ else
+ this.messageListeners[notification.listener].resolve(notification.data);
+ }
+
initProductWebapis() {
// for TV profile
if (wrt.tv && !global.webapis.productinfo) {
import { wrt } from '../browser/wrt';
import * as ServiceManager from './service_manager';
-wrt.on('start-service', (event: any, internal_id: string) => {
- console.debug(`start service app : ${internal_id}`);
- ServiceManager.startService(internal_id, '');
+wrt.on('start-service', (event: any, internalId: string) => {
+ console.debug(`start service app : ${internalId}`);
+ ServiceManager.startService(internalId, '');
});
-wrt.on('stop-service', (event: any, internal_id: string) => {
- console.debug(`stop service app : ${internal_id}`);
- ServiceManager.stopService(internal_id);
+wrt.on('stop-service', (event: any, internalId: string) => {
+ console.debug(`stop service app : ${internalId}`);
+ ServiceManager.stopService(internalId);
});
-wrt.on('builtin-service', (event: any, internal_id: string, service_name: string) => {
- console.debug(`id: ${internal_id}, service_name: ${service_name}`);
- ServiceManager.handleBuiltinService(internal_id, service_name);
+wrt.on('builtin-service', (event: any, internalId: string, serviceName: string) => {
+ console.debug(`id: ${internalId}, serviceName: ${serviceName}`);
+ ServiceManager.handleBuiltinService(internalId, serviceName);
+});
+
+wrt.on('message', (event: any, type: string, data: string) => {
+ console.debug(`onMessage : ${type} - ${data}`);
+ ServiceManager.notifyMessage(type, data);
});
wrt.on('quit', (event: any) => {
interface WorkerMap {
[id: string]: any;
}
+
+interface MessageObserver {
+ [id: string]: Set<string>;
+}
+
let workers: WorkerMap = {};
let dyingWorkerQueue: WorkerMap = {};
+let messageObservers: MessageObserver = {};
Object.defineProperty(global, 'serviceType', {
value: wrt.getServiceModel(),
filename
}
});
- workers[id].on('message', (message: string) => {
- if (message === 'will-terminate') {
- dyingWorkerQueue[id] = message;
- checkDyingWorker();
+ workers[id].on('message', (message: any) => {
+ switch (message.type) {
+ case 'will-terminate':
+ delete messageObservers[id];
+ dyingWorkerQueue[id] = 'will-terminate';
+ checkDyingWorker();
+ break;
+ case 'register-message':
+ if (!messageObservers[id]) {
+ messageObservers[id] = new Set();
+ }
+ messageObservers[id].add(message.listener);
+ break;
+ default:
+ break;
}
});
workers[id].on('exit', (code: number) => {
let startService = `${__dirname}/../service/builtins/${serviceName}.js`;
createWorker(serviceId, startService, '');
}
+}
+
+export function notifyMessage(listener: string, data: string) {
+ for (const id in messageObservers) {
+ if (messageObservers[id].has(listener)) {
+ console.debug(`notify message - ${listener}`);
+ if (workers[id]) {
+ const notification = { listener, data };
+ workers[id].postMessage({ type: 'notify-message', notification });
+ }
+ }
+ }
}
\ No newline at end of file
let app: any = null;
let dummyTimer: any;
let periodLauncherAlive = 40; // 4s
+let deviceApiRouter: any = null;
let checkLauncherAlive = (id: string) => {
periodLauncherAlive--;
});
console.debug(`serviceType : ${global['serviceType']}`)
- new DeviceAPIRouter(id, isGlobalService());
+ deviceApiRouter = new DeviceAPIRouter(id, isGlobalService());
printAppControlData(id);
ServiceMessage.initConsoleMessageNotification(id);
parentPort?.on('message', (message) => {
console.debug(`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");
- parentPort?.close();
- }, message.delay);
+ switch (message.type) {
+ case 'wake':
+ app?.onRequest();
+ break;
+ case 'stop':
+ stop(id);
+ setTimeout(() => {
+ XWalkExtension.cleanup();
+ parentPort?.postMessage({ type : 'will-terminate' });
+ parentPort?.close();
+ }, message.delay);
+ break;
+ case 'notify-message':
+ deviceApiRouter?.notifyMessage(message.notification);
+ break;
+ default:
+ break;
}
});
}