mirror of
https://github.com/finos/SymphonyElectron.git
synced 2025-02-25 18:55:29 -06:00
Implemented unified log extraction
This commit is contained in:
parent
80ff046b32
commit
604caedd69
@ -8,6 +8,7 @@ import { analytics } from './analytics-handler';
|
||||
import { config } from './config-handler';
|
||||
import { memoryMonitor } from './memory-monitor';
|
||||
import { protocolHandler } from './protocol-handler';
|
||||
import { finalizeLogExports, registerLogRetriever } from './reports-handler';
|
||||
import { screenSnippet } from './screen-snippet-handler';
|
||||
import { activate, handleKeyPress } from './window-actions';
|
||||
import { ICustomBrowserWindow, windowHandler } from './window-handler';
|
||||
@ -53,6 +54,12 @@ ipcMain.on(apiName.symphonyApi, (event: Electron.IpcMainEvent, arg: IApiArgs) =>
|
||||
// we make use of it and update the pod version info on SDA
|
||||
windowHandler.updateVersionInfo();
|
||||
break;
|
||||
case apiCmds.registerLogRetriever:
|
||||
registerLogRetriever( event.sender, arg.logName );
|
||||
break;
|
||||
case apiCmds.logReceiver:
|
||||
finalizeLogExports( arg.logs );
|
||||
break;
|
||||
case apiCmds.badgeDataUrl:
|
||||
if (typeof arg.dataUrl === 'string' && typeof arg.count === 'number') {
|
||||
setDataUrl(arg.dataUrl, arg.count);
|
||||
|
@ -4,6 +4,7 @@ import * as electron from 'electron';
|
||||
import * as fs from 'fs';
|
||||
import * as path from 'path';
|
||||
|
||||
import { ILogs } from '../common/api-interface';
|
||||
import { isLinux, isMac } from '../common/env';
|
||||
import { i18n } from '../common/i18n';
|
||||
import { logger } from '../common/logger';
|
||||
@ -17,19 +18,30 @@ import { logger } from '../common/logger';
|
||||
* @param fileExtensions {Array} array of file ext
|
||||
* @return {Promise<void>}
|
||||
*/
|
||||
const generateArchiveForDirectory = (source: string, destination: string, fileExtensions: string[]): Promise<void> => {
|
||||
const generateArchiveForDirectory = (source: string, destination: string, fileExtensions: string[], retrievedLogs: ILogs[]): Promise<void> => {
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
logger.info(`reports-handler: generating archive for directory ${source}`);
|
||||
const output = fs.createWriteStream(destination);
|
||||
const archive = archiver('zip', { zlib: { level: 9 } });
|
||||
const filesForCleanup: string[] = [];
|
||||
|
||||
output.on('close', () => {
|
||||
for (const file of filesForCleanup) {
|
||||
if (fs.existsSync( file )) {
|
||||
fs.unlinkSync(file);
|
||||
}
|
||||
}
|
||||
logger.info(`reports-handler: generated archive for directory ${source}`);
|
||||
return resolve();
|
||||
});
|
||||
|
||||
archive.on('error', (err: Error) => {
|
||||
for (const file of filesForCleanup) {
|
||||
if (fs.existsSync( file )) {
|
||||
fs.unlinkSync(file);
|
||||
}
|
||||
}
|
||||
logger.error(`reports-handler: error archiving directory for ${source} with error ${err}`);
|
||||
return reject(err);
|
||||
});
|
||||
@ -53,17 +65,45 @@ const generateArchiveForDirectory = (source: string, destination: string, fileEx
|
||||
}
|
||||
});
|
||||
|
||||
for (const logs of retrievedLogs) {
|
||||
for (const logFile of logs.logFiles) {
|
||||
const file = path.join( source, logFile.filename );
|
||||
fs.writeFileSync(file, logFile.contents );
|
||||
archive.file(file, { name: 'logs/' + logFile.filename });
|
||||
filesForCleanup.push(file);
|
||||
}
|
||||
}
|
||||
|
||||
archive.finalize();
|
||||
});
|
||||
};
|
||||
|
||||
interface ILogRetriever {
|
||||
sender: Electron.WebContents;
|
||||
logName: string;
|
||||
}
|
||||
|
||||
const logRetrievers: ILogRetriever[] = [];
|
||||
const receivedLogs: ILogs[] = [];
|
||||
|
||||
export const registerLogRetriever = ( sender: Electron.WebContents, logName: string): void => {
|
||||
logRetrievers.push( { sender, logName } );
|
||||
};
|
||||
|
||||
export const collectLogs = (): void => {
|
||||
receivedLogs.length = 0;
|
||||
for (const logRetriever of logRetrievers ) {
|
||||
logRetriever.sender.send('collect-logs', logRetriever.logName );
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Compress and export logs stored under system log directory
|
||||
*
|
||||
* MacOS - /Library/Logs/Symphony/
|
||||
* Windows - AppData\Roaming\Symphony\logs
|
||||
*/
|
||||
export const exportLogs = (): void => {
|
||||
export const packageLogs = (retrievedLogs: ILogs[]): void => {
|
||||
const FILE_EXTENSIONS = [ '.log' ];
|
||||
const MAC_LOGS_PATH = '/Library/Logs/Symphony/';
|
||||
const LINUX_LOGS_PATH = '/.config/Symphony/';
|
||||
@ -86,7 +126,7 @@ export const exportLogs = (): void => {
|
||||
const timestamp = new Date().getTime();
|
||||
const destination = app.getPath('downloads') + destPath + timestamp + '.zip';
|
||||
|
||||
generateArchiveForDirectory(source, destination, FILE_EXTENSIONS)
|
||||
generateArchiveForDirectory(source, destination, FILE_EXTENSIONS, retrievedLogs)
|
||||
.then(() => {
|
||||
shell.showItemInFolder(destination);
|
||||
})
|
||||
@ -102,6 +142,36 @@ export const exportLogs = (): void => {
|
||||
});
|
||||
};
|
||||
|
||||
export const finalizeLogExports = (logs: ILogs) => {
|
||||
receivedLogs.push(logs);
|
||||
|
||||
let allReceived = true;
|
||||
for (const logRetriever of logRetrievers ) {
|
||||
let found = false;
|
||||
for (const log of receivedLogs) {
|
||||
if (log.logName === logRetriever.logName) {
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
if (!found) {
|
||||
allReceived = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (allReceived) {
|
||||
packageLogs(receivedLogs);
|
||||
receivedLogs.length = 0;
|
||||
}
|
||||
};
|
||||
|
||||
export const exportLogs = (): void => {
|
||||
if ( logRetrievers.length > 0) {
|
||||
collectLogs();
|
||||
} else {
|
||||
packageLogs([]);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Compress and export crash dump stored under system crashes directory
|
||||
*/
|
||||
@ -125,7 +195,7 @@ export const exportCrashDumps = (): void => {
|
||||
|
||||
const destination = electron.app.getPath('downloads') + destPath + timestamp + '.zip';
|
||||
|
||||
generateArchiveForDirectory(source, destination, FILE_EXTENSIONS)
|
||||
generateArchiveForDirectory(source, destination, FILE_EXTENSIONS, [])
|
||||
.then(() => {
|
||||
electron.shell.showItemInFolder(destination);
|
||||
})
|
||||
|
@ -7,6 +7,8 @@ export enum apiCmds {
|
||||
activate = 'activate',
|
||||
registerBoundsChange = 'register-bounds-change',
|
||||
registerProtocolHandler = 'register-protocol-handler',
|
||||
registerLogRetriever = 'register-log-retriever',
|
||||
logReceiver = 'log-receiver',
|
||||
registerAnalyticsHandler = 'register-analytics-handler',
|
||||
registerActivityDetection = 'register-activity-detection',
|
||||
showNotificationSettings = 'show-notification-settings',
|
||||
@ -61,6 +63,8 @@ export interface IApiArgs {
|
||||
displayId: string;
|
||||
path: string;
|
||||
type: string;
|
||||
logName: string;
|
||||
logs: ILogs;
|
||||
}
|
||||
|
||||
export type WindowTypes = 'screen-picker' | 'screen-sharing-indicator' | 'notification-settings';
|
||||
@ -144,3 +148,13 @@ export interface ILogMsg {
|
||||
}
|
||||
|
||||
export type LogLevel = 'error' | 'warn' | 'info' | 'verbose' | 'debug' | 'silly';
|
||||
|
||||
export interface ILogFile {
|
||||
filename: string;
|
||||
contents: string;
|
||||
}
|
||||
|
||||
export interface ILogs {
|
||||
logName: string;
|
||||
logFiles: ILogFile[];
|
||||
}
|
||||
|
@ -105,6 +105,16 @@
|
||||
<p>snippet output:</p>
|
||||
<image id='snippet-img'/>
|
||||
|
||||
<hr>
|
||||
<p>RTC Logs:</p>
|
||||
Filename <input type='text' id='rtc-log-filename' value='rtc_log.log'/>
|
||||
<p>Contents</p>
|
||||
<textarea id="rtc-log-contents" rows="4">Test log contents</textarea>
|
||||
<p/>
|
||||
Filename <input type='text' id='rtc-log-filename2' value=''/>
|
||||
<p>Contents</p>
|
||||
<textarea id="rtc-log-contents2" rows="4"></textarea>
|
||||
|
||||
<hr>
|
||||
<p>Window activate:</p>
|
||||
<button id='open-win'>open window</button>
|
||||
@ -155,6 +165,8 @@
|
||||
activate: 'activate',
|
||||
registerBoundsChange: 'register-bounds-change',
|
||||
registerProtocolHandler: 'register-protocol-handler',
|
||||
registerLogRetriever: 'register-log-retriever',
|
||||
logReceiver: 'log-receiver',
|
||||
registerAnalyticHandler: 'register-analytic-handler',
|
||||
registerActivityDetection: 'register-activity-detection',
|
||||
showNotificationSettings: 'show-notification-settings',
|
||||
@ -408,9 +420,33 @@
|
||||
window.postMessage({ method, data }, '*');
|
||||
};
|
||||
|
||||
const getRTCLogs = () => {
|
||||
if (document.getElementById('rtc-log-filename2').value == '') {
|
||||
const filename = document.getElementById('rtc-log-filename').value;
|
||||
const contents = document.getElementById('rtc-log-contents').value;
|
||||
return [ { filename, contents }, ];
|
||||
} else {
|
||||
const filename1 = document.getElementById('rtc-log-filename').value;
|
||||
const contents1 = document.getElementById('rtc-log-contents').value;
|
||||
const filename2 = document.getElementById('rtc-log-filename2').value;
|
||||
const contents2 = document.getElementById('rtc-log-contents2').value;
|
||||
return [ { filename: filename1, contents: contents1 },
|
||||
{ filename: filename2, contents: contents2 }, ];
|
||||
}
|
||||
}
|
||||
|
||||
window.addEventListener('message', (event) => {
|
||||
const { data, method } = event.data;
|
||||
switch (method) {
|
||||
case 'collect-logs':
|
||||
if( data === 'RTC' ) {
|
||||
if (window.ssf) {
|
||||
window.ssf.logReceiver('RTC', getRTCLogs());
|
||||
} else {
|
||||
postMessage( apiCmds.logReceiver, { logName: 'RTC', logFiles: getRTCLogs() } );
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'activity-callback':
|
||||
activityCallback(data);
|
||||
break;
|
||||
@ -437,6 +473,15 @@
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Log retriever
|
||||
*/
|
||||
if (window.ssf) {
|
||||
window.ssf.registerLogRetriever('RTC');
|
||||
} else {
|
||||
postMessage(apiCmds.registerLogRetriever, 'RTC' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Analytic events
|
||||
*/
|
||||
|
@ -49,6 +49,7 @@ export class AppBridge {
|
||||
onRegisterLoggerCallback: (msg: ILogMsg, logLevel: LogLevel, showInConsole: boolean) =>
|
||||
this.registerLoggerCallback(msg, logLevel, showInConsole),
|
||||
onRegisterProtocolHandlerCallback: (uri: string) => this.protocolHandlerCallback(uri),
|
||||
onCollectLogsCallback: (logName: string) => this.collectLogsCallback(logName),
|
||||
onScreenSharingIndicatorCallback: (arg: IScreenSharingIndicator) => this.screenSharingIndicatorCallback(arg),
|
||||
onMediaSourceCallback: (
|
||||
error: IScreenSourceError | null,
|
||||
@ -122,6 +123,12 @@ export class AppBridge {
|
||||
case apiCmds.registerProtocolHandler:
|
||||
ssf.registerProtocolHandler(this.callbackHandlers.onRegisterProtocolHandlerCallback);
|
||||
break;
|
||||
case apiCmds.registerLogRetriever:
|
||||
ssf.registerLogRetriever(this.callbackHandlers.onCollectLogsCallback, data);
|
||||
break;
|
||||
case apiCmds.logReceiver:
|
||||
ssf.logReceiver( data.logName, data.logFiles );
|
||||
break;
|
||||
case apiCmds.openScreenSharingIndicator:
|
||||
ssf.openScreenSharingIndicator(data as IScreenSharingIndicatorOptions, this.callbackHandlers.onScreenSharingIndicatorCallback);
|
||||
break;
|
||||
@ -190,6 +197,8 @@ export class AppBridge {
|
||||
*/
|
||||
private protocolHandlerCallback = (uri: string): void => this.broadcastMessage('protocol-callback', uri);
|
||||
|
||||
private collectLogsCallback = (logName: string): void => this.broadcastMessage('collect-logs',logName);
|
||||
|
||||
/**
|
||||
* Broadcast event that stops screen sharing
|
||||
* @param arg {IScreenSharingIndicator}
|
||||
|
@ -38,6 +38,7 @@ export interface ILocalObject {
|
||||
boundsChangeCallback?: (arg: IBoundsChange) => void;
|
||||
screenSharingIndicatorCallback?: (arg: IScreenSharingIndicator) => void;
|
||||
protocolActionCallback?: (arg: string) => void;
|
||||
collectLogsCallback?: (arg: string) => void;
|
||||
analyticsEventHandler?: (arg: any) => void;
|
||||
}
|
||||
|
||||
@ -263,6 +264,33 @@ export class SSFApi {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Allows JS to register a log retriever that can be used by the
|
||||
* electron main process to retrieve current logs.
|
||||
*/
|
||||
public registerLogRetriever(collectLogs: (logName: string) => void, logName: string): void {
|
||||
if (typeof collectLogs === 'function') {
|
||||
|
||||
local.collectLogsCallback = collectLogs;
|
||||
|
||||
local.ipcRenderer.send(apiName.symphonyApi, {
|
||||
cmd: apiCmds.registerLogRetriever,
|
||||
logName,
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Send log files to main process when requested.
|
||||
*/
|
||||
public logReceiver(logName: string, logFiles): void {
|
||||
local.ipcRenderer.send(apiName.symphonyApi, {
|
||||
cmd: apiCmds.logReceiver,
|
||||
logs: { logName, logFiles },
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Allows JS to register analytics event handler
|
||||
* to pass analytics event data
|
||||
@ -490,6 +518,12 @@ local.ipcRenderer.on('screen-snippet-data', (_event: Event, arg: IScreenSnippet)
|
||||
}
|
||||
});
|
||||
|
||||
local.ipcRenderer.on('collect-logs', ( _event: Event, arg: string ) => {
|
||||
if (typeof local.collectLogsCallback === 'function') {
|
||||
local.collectLogsCallback(arg);
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* An event triggered by the main process
|
||||
* for ever few minutes if the user is active
|
||||
|
236
tMessage(apiCmds.openScreenSnippet)[A
Normal file
236
tMessage(apiCmds.openScreenSnippet)[A
Normal file
@ -0,0 +1,236 @@
|
||||
[1mdiff --git a/src/app/main-api-handler.ts b/src/app/main-api-handler.ts[m
|
||||
[1mindex fd274b1..3df2dd8 100644[m
|
||||
[1m--- a/src/app/main-api-handler.ts[m
|
||||
[1m+++ b/src/app/main-api-handler.ts[m
|
||||
[36m@@ -53,6 +53,13 @@[m [mipcMain.on(apiName.symphonyApi, (event: Electron.IpcMainEvent, arg: IApiArgs) =>[m
|
||||
// we make use of it and update the pod version info on SDA[m
|
||||
windowHandler.updateVersionInfo();[m
|
||||
break;[m
|
||||
[32m+[m[32m case apiCmds.registerLogRetriever:[m
|
||||
[32m+[m[32m logger.info( 'register-log-retriever: ' + JSON.stringify( arg ) );[m
|
||||
[32m+[m[32m event.sender.send('collect-logs');[m
|
||||
[32m+[m[32m break;[m
|
||||
[32m+[m[32m case apiCmds.logReceiver:[m
|
||||
[32m+[m[32m logger.info( 'log-receiver: ' + JSON.stringify( arg ) );[m
|
||||
[32m+[m[32m break;[m
|
||||
case apiCmds.badgeDataUrl:[m
|
||||
if (typeof arg.dataUrl === 'string' && typeof arg.count === 'number') {[m
|
||||
setDataUrl(arg.dataUrl, arg.count);[m
|
||||
[1mdiff --git a/src/common/api-interface.ts b/src/common/api-interface.ts[m
|
||||
[1mindex 3c46915..a481438 100644[m
|
||||
[1m--- a/src/common/api-interface.ts[m
|
||||
[1m+++ b/src/common/api-interface.ts[m
|
||||
[36m@@ -7,6 +7,8 @@[m [mexport enum apiCmds {[m
|
||||
activate = 'activate',[m
|
||||
registerBoundsChange = 'register-bounds-change',[m
|
||||
registerProtocolHandler = 'register-protocol-handler',[m
|
||||
[32m+[m[32m registerLogRetriever = 'register-log-retriever',[m
|
||||
[32m+[m[32m logReceiver = 'log-receiver',[m
|
||||
registerAnalyticsHandler = 'register-analytics-handler',[m
|
||||
registerActivityDetection = 'register-activity-detection',[m
|
||||
showNotificationSettings = 'show-notification-settings',[m
|
||||
[1mdiff --git a/src/demo/index.html b/src/demo/index.html[m
|
||||
[1mindex bb9961a..0063cf2 100644[m
|
||||
[1m--- a/src/demo/index.html[m
|
||||
[1m+++ b/src/demo/index.html[m
|
||||
[36m@@ -105,6 +105,16 @@[m
|
||||
<p>snippet output:</p>[m
|
||||
<image id='snippet-img'/>[m
|
||||
[m
|
||||
[32m+[m[32m <hr>[m
|
||||
[32m+[m[32m <p>RTC Logs:</p>[m
|
||||
[32m+[m[32m Filename <input type='text' id='rtc-log-filename' value='rtc_log'/>[m
|
||||
[32m+[m[32m <p>Contents</p>[m
|
||||
[32m+[m[32m <textarea id="rtc-log-contents" rows="4">Test log contents</textarea>[m
|
||||
[32m+[m
|
||||
[32m+[m[32m Filename <input type='text' id='rtc-log-filename2' value=''/>[m
|
||||
[32m+[m[32m <p>Contents</p>[m
|
||||
[32m+[m[32m <textarea id="rtc-log-contents2" rows="4"></textarea>[m
|
||||
[32m+[m
|
||||
<hr>[m
|
||||
<p>Window activate:</p>[m
|
||||
<button id='open-win'>open window</button>[m
|
||||
[36m@@ -155,6 +165,8 @@[m
|
||||
activate: 'activate',[m
|
||||
registerBoundsChange: 'register-bounds-change',[m
|
||||
registerProtocolHandler: 'register-protocol-handler',[m
|
||||
[32m+[m[32m registerLogRetriever: 'register-log-retriever',[m
|
||||
[32m+[m[32m logReceiver: 'log-receiver',[m
|
||||
registerAnalyticHandler: 'register-analytic-handler',[m
|
||||
registerActivityDetection: 'register-activity-detection',[m
|
||||
showNotificationSettings: 'show-notification-settings',[m
|
||||
[36m@@ -408,9 +420,28 @@[m
|
||||
window.postMessage({ method, data }, '*');[m
|
||||
};[m
|
||||
[m
|
||||
[32m+[m[32m const getRTCLogs = () => {[m
|
||||
[32m+[m[32m if (document.getElementById('rtc-log-filename2').value == '') {[m
|
||||
[32m+[m[32m const filename = document.getElementById('rtc-log-filename').value;[m
|
||||
[32m+[m[32m const contents = document.getElementById('rtc-log-contents').value;[m
|
||||
[32m+[m[32m return { name: 'RTC', logs: [ { filename, contents }, ] };[m
|
||||
[32m+[m[32m } else {[m
|
||||
[32m+[m[32m const filename1 = document.getElementById('rtc-log-filename').value;[m
|
||||
[32m+[m[32m const contents1 = document.getElementById('rtc-log-contents').value;[m
|
||||
[32m+[m[32m const filename2 = document.getElementById('rtc-log-filename2').value;[m
|
||||
[32m+[m[32m const contents2 = document.getElementById('rtc-log-contents2').value;[m
|
||||
[32m+[m[32m return {name: 'RTC', logs: [ { filename: filename1, contents: contents1 },[m[41m [m
|
||||
[32m+[m[32m { filename: filename2, contents: contents2 }, ] };[m
|
||||
[32m+[m[32m }[m
|
||||
[32m+[m[32m }[m
|
||||
[32m+[m
|
||||
window.addEventListener('message', (event) => {[m
|
||||
const { data, method } = event.data;[m
|
||||
[32m+[m[32m alert( 'EVENT ' + JSON.stringify( event.data ) );[m
|
||||
switch (method) {[m
|
||||
[32m+[m[32m case 'collect-logs':[m
|
||||
[32m+[m[32m broadcastMessage( apiCmds.logReceiver, getRTCLogs() );[m
|
||||
[32m+[m[32m break;[m
|
||||
case 'activity-callback':[m
|
||||
activityCallback(data);[m
|
||||
break;[m
|
||||
[36m@@ -437,6 +468,17 @@[m
|
||||
}[m
|
||||
});[m
|
||||
[m
|
||||
[32m+[m[32m /**[m
|
||||
[32m+[m[32m * Log retriever[m
|
||||
[32m+[m[32m */[m
|
||||
[32m+[m[32m window.addEventListener( 'collect-logs', () => alert('send-logs') );[m
|
||||
[32m+[m
|
||||
[32m+[m[32m if (window.ssf) {[m
|
||||
[32m+[m[32m window.ssf.registerLogRetriever('RTC');[m
|
||||
[32m+[m[32m } else {[m
|
||||
[32m+[m[32m postMessage(apiCmds.registerLogRetriever, 'RTC' );[m
|
||||
[32m+[m[32m }[m
|
||||
[32m+[m
|
||||
/**[m
|
||||
* Analytic events[m
|
||||
*/[m
|
||||
[1mdiff --git a/src/renderer/app-bridge.ts b/src/renderer/app-bridge.ts[m
|
||||
[1mindex 3b8dda1..eef4fe6 100644[m
|
||||
[1m--- a/src/renderer/app-bridge.ts[m
|
||||
[1m+++ b/src/renderer/app-bridge.ts[m
|
||||
[36m@@ -49,6 +49,7 @@[m [mexport class AppBridge {[m
|
||||
onRegisterLoggerCallback: (msg: ILogMsg, logLevel: LogLevel, showInConsole: boolean) =>[m
|
||||
this.registerLoggerCallback(msg, logLevel, showInConsole),[m
|
||||
onRegisterProtocolHandlerCallback: (uri: string) => this.protocolHandlerCallback(uri),[m
|
||||
[32m+[m[32m onCollectLogsCallback: () => this.collectLogsCallback( ),[m
|
||||
onScreenSharingIndicatorCallback: (arg: IScreenSharingIndicator) => this.screenSharingIndicatorCallback(arg),[m
|
||||
onMediaSourceCallback: ([m
|
||||
error: IScreenSourceError | null,[m
|
||||
[36m@@ -64,6 +65,7 @@[m [mexport class AppBridge {[m
|
||||
const currentWindow = remote.getCurrentWindow();[m
|
||||
// @ts-ignore[m
|
||||
this.origin = currentWindow.origin || '';[m
|
||||
[32m+[m[32m this.origin = '*';[m
|
||||
if (ssInstance && typeof ssInstance.setBroadcastMessage === 'function') {[m
|
||||
ssInstance.setBroadcastMessage(this.broadcastMessage);[m
|
||||
}[m
|
||||
[36m@@ -122,6 +124,12 @@[m [mexport class AppBridge {[m
|
||||
case apiCmds.registerProtocolHandler:[m
|
||||
ssf.registerProtocolHandler(this.callbackHandlers.onRegisterProtocolHandlerCallback);[m
|
||||
break;[m
|
||||
[32m+[m[32m case apiCmds.registerLogRetriever:[m
|
||||
[32m+[m[32m ssf.registerLogRetriever(this.callbackHandlers.onCollectLogsCallback, data);[m
|
||||
[32m+[m[32m break;[m
|
||||
[32m+[m[32m case apiCmds.logReceiver:[m
|
||||
[32m+[m[32m ssf.logReceiver( data );[m
|
||||
[32m+[m[32m break;[m
|
||||
case apiCmds.openScreenSharingIndicator:[m
|
||||
ssf.openScreenSharingIndicator(data as IScreenSharingIndicatorOptions, this.callbackHandlers.onScreenSharingIndicatorCallback);[m
|
||||
break;[m
|
||||
[36m@@ -190,6 +198,12 @@[m [mexport class AppBridge {[m
|
||||
*/[m
|
||||
private protocolHandlerCallback = (uri: string): void => this.broadcastMessage('protocol-callback', uri);[m
|
||||
[m
|
||||
[32m+[m[32m /**[m
|
||||
[32m+[m[32m * Broadcast protocol uri[m
|
||||
[32m+[m[32m * @param uri {string}[m
|
||||
[32m+[m[32m */[m
|
||||
[32m+[m[32m private collectLogsCallback = (): void => this.broadcastMessage('collect-logs',null);[m
|
||||
[32m+[m
|
||||
/**[m
|
||||
* Broadcast event that stops screen sharing[m
|
||||
* @param arg {IScreenSharingIndicator}[m
|
||||
[1mdiff --git a/src/renderer/ssf-api.ts b/src/renderer/ssf-api.ts[m
|
||||
[1mindex 7d698a8..e00bc96 100644[m
|
||||
[1m--- a/src/renderer/ssf-api.ts[m
|
||||
[1m+++ b/src/renderer/ssf-api.ts[m
|
||||
[36m@@ -38,6 +38,7 @@[m [mexport interface ILocalObject {[m
|
||||
boundsChangeCallback?: (arg: IBoundsChange) => void;[m
|
||||
screenSharingIndicatorCallback?: (arg: IScreenSharingIndicator) => void;[m
|
||||
protocolActionCallback?: (arg: string) => void;[m
|
||||
[32m+[m[32m collectLogsCallback?: () => void;[m
|
||||
analyticsEventHandler?: (arg: any) => void;[m
|
||||
}[m
|
||||
[m
|
||||
[36m@@ -263,6 +264,56 @@[m [mexport class SSFApi {[m
|
||||
}[m
|
||||
}[m
|
||||
[m
|
||||
[32m+[m[32m /**[m
|
||||
[32m+[m[32m * Allows JS to register a protocol handler that can be used by the[m
|
||||
[32m+[m[32m * electron main process.[m
|
||||
[32m+[m[32m *[m
|
||||
[32m+[m[32m * @param protocolHandler {Function} callback will be called when app is[m
|
||||
[32m+[m[32m * invoked with registered protocol (e.g., symphony). The callback[m
|
||||
[32m+[m[32m * receives a single string argument: full uri that the app was[m
|
||||
[32m+[m[32m * invoked with e.g., symphony://?streamId=xyz123&streamType=chatroom[m
|
||||
[32m+[m[32m *[m
|
||||
[32m+[m[32m * Note: this function should only be called after client app is fully[m
|
||||
[32m+[m[32m * able for protocolHandler callback to be invoked. It is possible[m
|
||||
[32m+[m[32m * the app was started using protocol handler, in this case as soon as[m
|
||||
[32m+[m[32m * this registration func is invoked then the protocolHandler callback[m
|
||||
[32m+[m[32m * will be immediately called.[m
|
||||
[32m+[m[32m */[m
|
||||
[32m+[m[32m public registerLogRetriever(collectLogs: () => void, name: string): void {[m
|
||||
[32m+[m[32m if (typeof collectLogs === 'function') {[m
|
||||
[32m+[m
|
||||
[32m+[m[32m local.collectLogsCallback = collectLogs;[m
|
||||
[32m+[m
|
||||
[32m+[m[32m local.ipcRenderer.send(apiName.symphonyApi, {[m
|
||||
[32m+[m[32m cmd: apiCmds.registerLogRetriever,[m
|
||||
[32m+[m[32m name,[m
|
||||
[32m+[m[32m });[m
|
||||
[32m+[m
|
||||
[32m+[m[32m }[m
|
||||
[32m+[m[32m }[m
|
||||
[32m+[m
|
||||
[32m+[m[32m /**[m
|
||||
[32m+[m[32m * Allows JS to register a protocol handler that can be used by the[m
|
||||
[32m+[m[32m * electron main process.[m
|
||||
[32m+[m[32m *[m
|
||||
[32m+[m[32m * @param protocolHandler {Function} callback will be called when app is[m
|
||||
[32m+[m[32m * invoked with registered protocol (e.g., symphony). The callback[m
|
||||
[32m+[m[32m * receives a single string argument: full uri that the app was[m
|
||||
[32m+[m[32m * invoked with e.g., symphony://?streamId=xyz123&streamType=chatroom[m
|
||||
[32m+[m[32m *[m
|
||||
[32m+[m[32m * Note: this function should only be called after client app is fully[m
|
||||
[32m+[m[32m * able for protocolHandler callback to be invoked. It is possible[m
|
||||
[32m+[m[32m * the app was started using protocol handler, in this case as soon as[m
|
||||
[32m+[m[32m * this registration func is invoked then the protocolHandler callback[m
|
||||
[32m+[m[32m * will be immediately called.[m
|
||||
[32m+[m[32m */[m
|
||||
[32m+[m[32m public logReceiver(logs): void {[m
|
||||
[32m+[m[32m local.ipcRenderer.send(apiName.symphonyApi, {[m
|
||||
[32m+[m[32m cmd: apiCmds.logReceiver,[m
|
||||
[32m+[m[32m logs,[m
|
||||
[32m+[m[32m });[m
|
||||
[32m+[m[32m }[m
|
||||
[32m+[m
|
||||
/**[m
|
||||
* Allows JS to register analytics event handler[m
|
||||
* to pass analytics event data[m
|
||||
[36m@@ -490,6 +541,12 @@[m [mlocal.ipcRenderer.on('screen-snippet-data', (_event: Event, arg: IScreenSnippet)[m
|
||||
}[m
|
||||
});[m
|
||||
[m
|
||||
[32m+[m[32mlocal.ipcRenderer.on('collect-logs', () => {[m
|
||||
[32m+[m[32m if (typeof local.collectLogsCallback === 'function') {[m
|
||||
[32m+[m[32m local.collectLogsCallback();[m
|
||||
[32m+[m[32m }[m
|
||||
[32m+[m[32m});[m
|
||||
[32m+[m
|
||||
/**[m
|
||||
* An event triggered by the main process[m
|
||||
* for ever few minutes if the user is active[m
|
Loading…
Reference in New Issue
Block a user