Skip to content
This repository was archived by the owner on Aug 7, 2021. It is now read-only.

Commit 83047a3

Browse files
author
Vasil Chimev
authored
refactor: fetch V8 versions map from url or local file (#262)
1 parent 6ca2e92 commit 83047a3

File tree

3 files changed

+80
-26
lines changed

3 files changed

+80
-26
lines changed

snapshot/android/project-snapshot-generator.js

Lines changed: 66 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,23 @@
1-
const { join, isAbsolute, resolve } = require("path");
2-
const fs = require("fs");
3-
const os = require("os");
1+
const { dirname, isAbsolute, join, resolve } = require("path");
2+
const { existsSync, readFileSync, writeFileSync } = require("fs");
43

54
const shelljs = require("shelljs");
65
const semver = require("semver");
76

87
const SnapshotGenerator = require("./snapshot-generator");
98
const TnsJavaClassesGenerator = require("./tns-java-classes-generator");
10-
const { getJsonFile } = require("./utils");
9+
const {
10+
CONSTANTS,
11+
createDirectory,
12+
getJsonFile,
13+
} = require("./utils");
1114
const { getPackageJson } = require("../../projectHelpers");
1215

1316
const MIN_ANDROID_RUNTIME_VERSION = "3.0.0";
1417
const VALID_ANDROID_RUNTIME_TAGS = Object.freeze(["next", "rc"]);
15-
const V8_VERSIONS_URL = "https://raw.githubusercontent.com/NativeScript/android-runtime/master/v8-versions.json";
18+
const V8_VERSIONS_FILE_NAME = "v8-versions.json";
19+
const V8_VERSIONS_URL = `https://raw.githubusercontent.com/NativeScript/android-runtime/master/${V8_VERSIONS_FILE_NAME}`;
20+
const V8_VERSIONS_LOCAL_PATH = resolve(CONSTANTS.SNAPSHOT_TMP_DIR, V8_VERSIONS_FILE_NAME);
1621

1722
const resolveRelativePath = (path) => {
1823
if (path)
@@ -91,37 +96,80 @@ ProjectSnapshotGenerator.installSnapshotArtefacts = function(projectRoot) {
9196
shelljs.exec("find " + blobsDestinationPath + " -name '*.blob' -execdir mv {} snapshot.blob ';'");
9297

9398
// Update the package.json file
94-
const appPackageJson = shelljs.test("-e", appPackageJsonPath) ? JSON.parse(fs.readFileSync(appPackageJsonPath, 'utf8')) : {};
99+
const appPackageJson = shelljs.test("-e", appPackageJsonPath) ? JSON.parse(readFileSync(appPackageJsonPath, 'utf8')) : {};
95100
appPackageJson["android"] = appPackageJson["android"] || {};
96101
appPackageJson["android"]["heapSnapshotBlob"] = "../snapshots";
97-
fs.writeFileSync(appPackageJsonPath, JSON.stringify(appPackageJson, null, 2));
102+
writeFileSync(appPackageJsonPath, JSON.stringify(appPackageJson, null, 2));
98103
}
99104
}
100105

106+
const versionIsPrerelease = version => version.indexOf("-") > -1;
107+
const v8VersionsFileExists = () => existsSync(V8_VERSIONS_LOCAL_PATH);
108+
const saveV8VersionsFile = versionsMap =>
109+
writeFileSync(V8_VERSIONS_LOCAL_PATH, JSON.stringify(versionsMap));
110+
const readV8VersionsFile = () => JSON.parse(readFileSync(V8_VERSIONS_LOCAL_PATH));
111+
const fetchV8VersionsFile = () =>
112+
new Promise((resolve, reject) => {
113+
getJsonFile(V8_VERSIONS_URL)
114+
.then(versionsMap => {
115+
createDirectory(dirname(V8_VERSIONS_LOCAL_PATH));
116+
saveV8VersionsFile(versionsMap);
117+
return resolve(versionsMap);
118+
})
119+
.catch(reject);
120+
});
121+
122+
const findV8Version = (runtimeVersion, v8VersionsMap) => {
123+
const runtimeReleaseVersion = runtimeVersion.replace(/-.*/, "");
124+
const runtimeRange = Object.keys(v8VersionsMap)
125+
.find(range => semver.satisfies(runtimeReleaseVersion, range));
126+
127+
return v8VersionsMap[runtimeRange];
128+
}
129+
130+
const getV8VersionsMap = runtimeVersion =>
131+
new Promise((resolve, reject) => {
132+
if (!v8VersionsFileExists() || versionIsPrerelease(runtimeVersion)) {
133+
fetchV8VersionsFile()
134+
.then(versionsMap => resolve({ versionsMap, latest: true }))
135+
.catch(reject);
136+
} else {
137+
const versionsMap = readV8VersionsFile();
138+
return resolve({ versionsMap, latest: false });
139+
}
140+
});
141+
101142
ProjectSnapshotGenerator.prototype.getV8Version = function(generationOptions) {
102143
return new Promise((resolve, reject) => {
103144
const maybeV8Version = generationOptions.v8Version;
104145
if (maybeV8Version) {
105146
return resolve(maybeV8Version);
106147
}
107148

108-
getJsonFile(V8_VERSIONS_URL).then(v8VersionsMap => {
109-
const runtimeVersion = this.getAndroidRuntimeVersion().replace(/-.*/, "");
110-
111-
const runtimeRange = Object.keys(v8VersionsMap)
112-
.find(range => semver.satisfies(runtimeVersion, range));
113-
const v8Version = v8VersionsMap[runtimeRange];
114-
115-
return resolve(v8Version);
116-
}).catch(reject);
149+
const runtimeVersion = this.getAndroidRuntimeVersion();
150+
getV8VersionsMap(runtimeVersion)
151+
.then(({ versionsMap, latest}) => {
152+
const v8Version = findV8Version(runtimeVersion, versionsMap);
153+
154+
if (!v8Version && !latest) {
155+
fetchV8VersionsFile().then(latestVersionsMap => {
156+
const version = findV8Version(runtimeVersion, latestVersionsMap)
157+
return resolve(version);
158+
})
159+
.catch(reject);
160+
} else {
161+
return resolve(v8Version);
162+
}
163+
})
164+
.catch(reject);
117165
});
118166
}
119167

120168
ProjectSnapshotGenerator.prototype.validateAndroidRuntimeVersion = function() {
121169
const currentRuntimeVersion = this.getAndroidRuntimeVersion();
122170

123171
if (!currentRuntimeVersion ||
124-
!fs.existsSync(join(this.options.projectRoot, "platforms/android"))) {
172+
!existsSync(join(this.options.projectRoot, "platforms/android"))) {
125173

126174
throw new Error("In order to generate a V8 snapshot you must have the \"android\" platform installed - to do so please run \"tns platform add android\".");
127175
}
@@ -174,7 +222,7 @@ ProjectSnapshotGenerator.prototype.generate = function(generationOptions) {
174222
this.generateTnsJavaClassesFile({ output: tnsJavaClassesDestination, options: generationOptions.tnsJavaClassesOptions });
175223
}
176224

177-
const snapshotToolsPath = resolveRelativePath(generationOptions.snapshotToolsPath) || join(os.tmpdir(), "snapshot-tools");
225+
const snapshotToolsPath = resolveRelativePath(generationOptions.snapshotToolsPath) || CONSTANTS.SNAPSHOT_TMP_DIR;
178226
const androidNdkPath = generationOptions.androidNdkPath || process.env.ANDROID_NDK_HOME;
179227

180228
console.log("Snapshot tools path: " + snapshotToolsPath);
@@ -206,4 +254,3 @@ ProjectSnapshotGenerator.prototype.generate = function(generationOptions) {
206254
throw new Error(`Cannot find suitable v8 version! Original error: ${error.message || error}`);
207255
});
208256
}
209-

snapshot/android/snapshot-generator.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
const fs = require("fs");
2-
const { join, dirname } = require("path");
2+
const { dirname, join } = require("path");
33
const os = require("os");
44
const child_process = require("child_process");
55

66
const shelljs = require("shelljs");
77

8-
const { downloadFile } = require("./utils");
8+
const { createDirectory, downloadFile } = require("./utils");
99

1010
const NDK_BUILD_SEED_PATH = join(__dirname, "snapshot-generator-tools/ndk-build");
1111
const BUNDLE_PREAMBLE_PATH = join(__dirname, "snapshot-generator-tools/bundle-preamble.js");
@@ -63,6 +63,7 @@ SnapshotGenerator.prototype.downloadMksnapshotTool = function(snapshotToolsPath,
6363
return snapshotToolsDownloads[mksnapshotToolPath];
6464

6565
const downloadUrl = MKSNAPSHOT_TOOLS_DOWNLOAD_ROOT_URL + mksnapshotToolRelativePath;
66+
createDirectory(dirname(mksnapshotToolPath));
6667
snapshotToolsDownloads[mksnapshotToolPath] = downloadFile(downloadUrl, mksnapshotToolPath);
6768
return snapshotToolsDownloads[mksnapshotToolPath];
6869
}

snapshot/android/utils.js

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,20 @@
1+
const { chmodSync, createWriteStream, existsSync } = require("fs");
12
const { get: httpsGet } = require("https");
2-
const { dirname } = require("path");
3-
const { chmodSync, createWriteStream } = require("fs");
4-
3+
const { tmpdir } = require("os");
4+
const { dirname, join } = require("path");
55
const { mkdir } = require("shelljs");
66

7+
const CONSTANTS = {
8+
SNAPSHOT_TMP_DIR: join(tmpdir(), "snapshot-tools"),
9+
};
10+
11+
const createDirectory = dir => mkdir('-p', dir);
12+
713
const downloadFile = (url, destinationFilePath) =>
814
new Promise((resolve, reject) => {
915
const request = httpsGet(url, response => {
1016
switch (response.statusCode) {
1117
case 200:
12-
mkdir("-p", dirname(destinationFilePath));
1318
const file = createWriteStream(destinationFilePath);
1419
file.on('error', function (error) {
1520
return reject(error);
@@ -54,7 +59,8 @@ const getJsonFile = url =>
5459
});
5560

5661
module.exports = {
62+
CONSTANTS,
63+
createDirectory,
5764
downloadFile,
5865
getJsonFile,
5966
};
60-

0 commit comments

Comments
 (0)