pulsar/script/update-server/run-server.js
2019-05-31 18:33:56 +02:00

135 lines
3.8 KiB
JavaScript

require('colors');
const fs = require('fs');
const path = require('path');
const express = require('express');
const app = express();
const port = process.env.PORT || 3456;
// Load the metadata for the local build of Atom
const buildPath = path.resolve(__dirname, '..', '..', 'out');
const packageJsonPath = path.join(buildPath, 'app', 'package.json');
if (!fs.existsSync(buildPath) || !fs.existsSync(packageJsonPath)) {
console.log(
`This script requires a full Atom build with release packages for the current platform in the following path:\n ${buildPath}\n`
);
if (process.platform === 'darwin') {
console.log(
`Run this command before trying again:\n script/build --compress-artifacts --test-sign\n\n`
);
} else if (process.platform === 'win32') {
console.log(
`Run this command before trying again:\n script/build --create-windows-installer\n\n`
);
}
process.exit(1);
}
const appMetadata = require(packageJsonPath);
const versionMatch = appMetadata.version.match(/-(beta|nightly)\d+$/);
const releaseChannel = versionMatch ? versionMatch[1] : 'stable';
console.log(
`Serving ${
appMetadata.productName
} release assets (channel = ${releaseChannel})\n`.green
);
function getMacZip(req, res) {
console.log(`Received request for atom-mac.zip, sending it`);
res.sendFile(path.join(buildPath, 'atom-mac.zip'));
}
function getMacUpdates(req, res) {
if (req.query.version !== appMetadata.version) {
const updateInfo = {
name: appMetadata.version,
pub_date: new Date().toISOString(),
url: `http://localhost:${port}/mac/atom-mac.zip`,
notes: '<p>No Details</p>'
};
console.log(
`Received request for macOS updates (version = ${
req.query.version
}), sending\n`,
updateInfo
);
res.json(updateInfo);
} else {
console.log(
`Received request for macOS updates, sending 204 as Atom is up to date (version = ${
req.query.version
})`
);
res.sendStatus(204);
}
}
function getReleasesFile(fileName) {
return function(req, res) {
console.log(
`Received request for ${fileName}, version: ${req.query.version}`
);
if (req.query.version) {
const versionMatch = (req.query.version || '').match(
/-(beta|nightly)\d+$/
);
const versionChannel = (versionMatch && versionMatch[1]) || 'stable';
if (releaseChannel !== versionChannel) {
console.log(
`Atom requested an update for version ${
req.query.version
} but the current release channel is ${releaseChannel}`
);
res.sendStatus(404);
return;
}
}
res.sendFile(path.join(buildPath, fileName));
};
}
function getNupkgFile(is64bit) {
return function(req, res) {
let nupkgFile = req.params.nupkg;
if (is64bit) {
const nupkgMatch = nupkgFile.match(/atom-(.+)-(delta|full)\.nupkg/);
if (nupkgMatch) {
nupkgFile = `atom-x64-${nupkgMatch[1]}-${nupkgMatch[2]}.nupkg`;
}
}
console.log(
`Received request for ${req.params.nupkg}, sending ${nupkgFile}`
);
res.sendFile(path.join(buildPath, nupkgFile));
};
}
if (process.platform === 'darwin') {
app.get('/mac/atom-mac.zip', getMacZip);
app.get('/api/updates', getMacUpdates);
} else if (process.platform === 'win32') {
app.get('/api/updates/RELEASES', getReleasesFile('RELEASES'));
app.get('/api/updates/:nupkg', getNupkgFile());
app.get('/api/updates-x64/RELEASES', getReleasesFile('RELEASES-x64'));
app.get('/api/updates-x64/:nupkg', getNupkgFile(true));
} else {
console.log(
`The current platform '${
process.platform
}' doesn't support Squirrel updates, exiting.`.red
);
process.exit(1);
}
app.listen(port, () => {
console.log(
`Run Atom with ATOM_UPDATE_URL_PREFIX="http://localhost:${port}" set to test updates!\n`
.yellow
);
});