From 42f9e73b55b3c58245a3945172269d617285e5df Mon Sep 17 00:00:00 2001 From: AJ ONeal Date: Mon, 13 Nov 2023 09:44:38 -0700 Subject: [PATCH] ref(flutter): cleanup releases.js, add hash, don't resort --- flutter/releases.js | 134 +++++++++++++++++++++++++++++--------------- 1 file changed, 89 insertions(+), 45 deletions(-) diff --git a/flutter/releases.js b/flutter/releases.js index d97d7f9..77db1cb 100644 --- a/flutter/releases.js +++ b/flutter/releases.js @@ -1,55 +1,99 @@ 'use strict'; -var map = {}; +var FLUTTER_OSES = ['macos', 'linux', 'windows']; -module.exports = function (request) { - var all = { +// stable, beta, dev +var channelMap = {}; + +// This can be spot-checked against +// https://docs.flutter.dev/release/archive?tab=windows + +// The release URLs are +// - https://storage.googleapis.com/flutter_infra_release/releases/releases_macos.json +// - https://storage.googleapis.com/flutter_infra_release/releases/releases_linux.json +// - https://storage.googleapis.com/flutter_infra_release/releases/releases_windows.json +// The old release URLs are +// - https://storage.googleapis.com/flutter_infra/releases/releases_macos.json +// - https://storage.googleapis.com/flutter_infra/releases/releases_linux.json +// - https://storage.googleapis.com/flutter_infra/releases/releases_windows.json + +// The data looks like +// { +// "base_url": "https://storage.googleapis.com/flutter_infra/releases", +// "current_release": { +// "beta": "b22742018b3edf16c6cadd7b76d9db5e7f9064b5", +// "dev": "fa5883b78e566877613ad1ccb48dd92075cb5c23", +// "stable": "02c026b03cd31dd3f867e5faeb7e104cce174c5f" +// }, +// "releases": [ +// { +// "hash": "fa5883b78e566877613ad1ccb48dd92075cb5c23", +// "channel": "dev", +// "version": "2.3.0-16.0.pre", +// "release_date": "2021-05-27T23:58:47.683121Z", +// "archive": "dev/macos/flutter_macos_2.3.0-16.0.pre-dev.zip", +// "sha256": "f572b42d36714e6c58a3ed170b93bb414e2ced3ca4bde5094fbe18061cbcba6c" +// }, +// { +// "hash": "02c026b03cd31dd3f867e5faeb7e104cce174c5f", +// "channel": "stable", +// "version": "2.2.1", +// "release_date": "2021-05-27T23:06:07.243882Z", +// "archive": "stable/macos/flutter_macos_2.2.1-stable.zip", +// "sha256": "6373d39ec563c337600baf42a42b258420208e4523d85479373e113d61d748df" +// }, +// { +// "hash": "b22742018b3edf16c6cadd7b76d9db5e7f9064b5", +// "channel": "beta", +// "version": "2.2.0", +// "release_date": "2021-05-19T21:14:59.281482Z", +// "archive": "beta/macos/flutter_macos_2.2.0-beta.zip", +// "sha256": "31ab530e708f8d1274712211253a27a4ce7d676f139d30f2ec021df22382f052" +// } +// ] +// } + +module.exports = async function (request) { + let all = { download: '', releases: [], + channels: [], }; - return Promise.all( - ['macos', 'linux', 'windows'].map(function (osname) { - return request({ - url: `https://storage.googleapis.com/flutter_infra_release/releases/releases_${osname}.json`, - json: true, - }).then(function (resp) { - var body = resp.body; - all.download = body.base_url + '/{{ download }}'; - body.releases.forEach(function (asset) { - if (!map[asset.channel]) { - map[asset.channel] = true; - } - all.releases.push({ - version: asset.version, - lts: false, - channel: asset.channel, - date: asset.release_date.replace(/T.*/, ''), - os: osname, - arch: 'amd64', - hash: '-', // not sure about including hash / sha256 yet - download: asset.archive, - }); - }); - }); - }), - ).then(function () { - all.releases.sort(function (a, b) { - if ('stable' === a.channel && a.channel !== b.channel) { - return -1; - } - if ('stable' === b.channel && a.channel !== b.channel) { - return 1; - } - if ('beta' === a.channel && a.channel !== b.channel) { - return -1; - } - if ('beta' === b.channel && a.channel !== b.channel) { - return 1; - } - return new Date(b.date).valueOf() - new Date(a.date).valueOf(); + + for (let osname of FLUTTER_OSES) { + let resp = await request({ + url: `https://storage.googleapis.com/flutter_infra_release/releases/releases_${osname}.json`, + json: true, }); - return all; - }); + + let body = resp.body; + all.download = `${body.base_url}/{{ download }}`; + + for (let asset of body.releases) { + if (!channelMap[asset.channel]) { + channelMap[asset.channel] = true; + } + + all.releases.push({ + version: asset.version, + lts: false, + channel: asset.channel, + date: asset.release_date.replace(/T.*/, ''), + os: osname, + arch: 'amd64', + hash: asset.hash, + download: asset.archive, + }); + } + } + + all.channels = Object.keys(channelMap); + + // note: versions have a waterfall relationship with channels: + // - a release that is in beta today may become stable tomorrow + // - semver prereleases are either beta or dev + + return all; }; if (module === require.main) {