mirror of
https://github.com/pulsar-edit/pulsar.git
synced 2024-09-20 15:37:46 +03:00
218 lines
6.9 KiB
JavaScript
218 lines
6.9 KiB
JavaScript
(function() {
|
|
// Define the window start time before the requires so we get a more accurate
|
|
// window:start marker.
|
|
const startWindowTime = Date.now();
|
|
|
|
const electron = require('electron');
|
|
const path = require('path');
|
|
const Module = require('module');
|
|
const getWindowLoadSettings = require('../src/get-window-load-settings');
|
|
const getReleaseChannel = require('../src/get-release-channel');
|
|
const StartupTime = require('../src/startup-time');
|
|
const entryPointDirPath = __dirname;
|
|
let blobStore = null;
|
|
let useSnapshot = false;
|
|
|
|
const startupMarkers = electron.remote.getCurrentWindow().startupMarkers;
|
|
|
|
if (startupMarkers) {
|
|
StartupTime.importData(startupMarkers);
|
|
}
|
|
StartupTime.addMarker('window:start', startWindowTime);
|
|
|
|
window.onload = function() {
|
|
try {
|
|
StartupTime.addMarker('window:onload:start');
|
|
const startTime = Date.now();
|
|
|
|
process.on('unhandledRejection', function(error, promise) {
|
|
console.error(
|
|
'Unhandled promise rejection %o with error: %o',
|
|
promise,
|
|
error
|
|
);
|
|
});
|
|
|
|
// Normalize to make sure drive letter case is consistent on Windows
|
|
process.resourcesPath = path.normalize(process.resourcesPath);
|
|
|
|
setupAtomHome();
|
|
const devMode =
|
|
getWindowLoadSettings().devMode ||
|
|
!getWindowLoadSettings().resourcePath.startsWith(
|
|
process.resourcesPath + path.sep
|
|
);
|
|
useSnapshot = !devMode && typeof snapshotResult !== 'undefined';
|
|
|
|
if (devMode) {
|
|
const metadata = require('../package.json');
|
|
if (!metadata._deprecatedPackages) {
|
|
try {
|
|
metadata._deprecatedPackages = require('../script/deprecated-packages.json');
|
|
} catch (requireError) {
|
|
console.error(
|
|
'Failed to setup deprecated packages list',
|
|
requireError.stack
|
|
);
|
|
}
|
|
}
|
|
} else if (useSnapshot) {
|
|
Module.prototype.require = function(module) {
|
|
const absoluteFilePath = Module._resolveFilename(module, this, false);
|
|
let relativeFilePath = path.relative(
|
|
entryPointDirPath,
|
|
absoluteFilePath
|
|
);
|
|
if (process.platform === 'win32') {
|
|
relativeFilePath = relativeFilePath.replace(/\\/g, '/');
|
|
}
|
|
let cachedModule =
|
|
snapshotResult.customRequire.cache[relativeFilePath];
|
|
if (!cachedModule) {
|
|
cachedModule = { exports: Module._load(module, this, false) };
|
|
snapshotResult.customRequire.cache[relativeFilePath] = cachedModule;
|
|
}
|
|
return cachedModule.exports;
|
|
};
|
|
|
|
snapshotResult.setGlobals(
|
|
global,
|
|
process,
|
|
window,
|
|
document,
|
|
console,
|
|
require
|
|
);
|
|
}
|
|
|
|
const FileSystemBlobStore = useSnapshot
|
|
? snapshotResult.customRequire('../src/file-system-blob-store.js')
|
|
: require('../src/file-system-blob-store');
|
|
blobStore = FileSystemBlobStore.load(
|
|
path.join(process.env.ATOM_HOME, 'blob-store')
|
|
);
|
|
|
|
const NativeCompileCache = useSnapshot
|
|
? snapshotResult.customRequire('../src/native-compile-cache.js')
|
|
: require('../src/native-compile-cache');
|
|
NativeCompileCache.setCacheStore(blobStore);
|
|
NativeCompileCache.setV8Version(process.versions.v8);
|
|
NativeCompileCache.install();
|
|
|
|
if (getWindowLoadSettings().profileStartup) {
|
|
profileStartup(Date.now() - startTime);
|
|
} else {
|
|
StartupTime.addMarker('window:setup-window:start');
|
|
setupWindow().then(() => {
|
|
StartupTime.addMarker('window:setup-window:end');
|
|
});
|
|
setLoadTime(Date.now() - startTime);
|
|
}
|
|
} catch (error) {
|
|
handleSetupError(error);
|
|
}
|
|
StartupTime.addMarker('window:onload:end');
|
|
};
|
|
|
|
function setLoadTime(loadTime) {
|
|
if (global.atom) {
|
|
global.atom.loadTime = loadTime;
|
|
}
|
|
}
|
|
|
|
function handleSetupError(error) {
|
|
const currentWindow = electron.remote.getCurrentWindow();
|
|
currentWindow.setSize(800, 600);
|
|
currentWindow.center();
|
|
currentWindow.show();
|
|
currentWindow.openDevTools();
|
|
console.error(error.stack || error);
|
|
}
|
|
|
|
function setupWindow() {
|
|
const CompileCache = useSnapshot
|
|
? snapshotResult.customRequire('../src/compile-cache.js')
|
|
: require('../src/compile-cache');
|
|
CompileCache.setAtomHomeDirectory(process.env.ATOM_HOME);
|
|
CompileCache.install(process.resourcesPath, require);
|
|
|
|
const ModuleCache = useSnapshot
|
|
? snapshotResult.customRequire('../src/module-cache.js')
|
|
: require('../src/module-cache');
|
|
ModuleCache.register(getWindowLoadSettings());
|
|
|
|
const startCrashReporter = useSnapshot
|
|
? snapshotResult.customRequire('../src/crash-reporter-start.js')
|
|
: require('../src/crash-reporter-start');
|
|
|
|
const { userSettings, appVersion } = getWindowLoadSettings();
|
|
const uploadToServer =
|
|
userSettings &&
|
|
userSettings.core &&
|
|
userSettings.core.telemetryConsent === 'limited';
|
|
const releaseChannel = getReleaseChannel(appVersion);
|
|
|
|
startCrashReporter({
|
|
uploadToServer,
|
|
releaseChannel
|
|
});
|
|
|
|
const CSON = useSnapshot
|
|
? snapshotResult.customRequire('../node_modules/season/lib/cson.js')
|
|
: require('season');
|
|
CSON.setCacheDir(path.join(CompileCache.getCacheDirectory(), 'cson'));
|
|
|
|
const initScriptPath = path.relative(
|
|
entryPointDirPath,
|
|
getWindowLoadSettings().windowInitializationScript
|
|
);
|
|
const initialize = useSnapshot
|
|
? snapshotResult.customRequire(initScriptPath)
|
|
: require(initScriptPath);
|
|
|
|
StartupTime.addMarker('window:initialize:start');
|
|
|
|
return initialize({ blobStore: blobStore }).then(function() {
|
|
StartupTime.addMarker('window:initialize:end');
|
|
electron.ipcRenderer.send('window-command', 'window:loaded');
|
|
});
|
|
}
|
|
|
|
function profileStartup(initialTime) {
|
|
function profile() {
|
|
console.profile('startup');
|
|
const startTime = Date.now();
|
|
setupWindow().then(function() {
|
|
setLoadTime(Date.now() - startTime + initialTime);
|
|
console.profileEnd('startup');
|
|
console.log(
|
|
'Switch to the Profiles tab to view the created startup profile'
|
|
);
|
|
});
|
|
}
|
|
|
|
const webContents = electron.remote.getCurrentWindow().webContents;
|
|
if (webContents.devToolsWebContents) {
|
|
profile();
|
|
} else {
|
|
webContents.once('devtools-opened', () => {
|
|
setTimeout(profile, 1000);
|
|
});
|
|
webContents.openDevTools();
|
|
}
|
|
}
|
|
|
|
function setupAtomHome() {
|
|
if (process.env.ATOM_HOME) {
|
|
return;
|
|
}
|
|
|
|
// Ensure ATOM_HOME is always set before anything else is required
|
|
// This is because of a difference in Linux not inherited between browser and render processes
|
|
// https://github.com/atom/atom/issues/5412
|
|
if (getWindowLoadSettings() && getWindowLoadSettings().atomHome) {
|
|
process.env.ATOM_HOME = getWindowLoadSettings().atomHome;
|
|
}
|
|
}
|
|
})();
|