Skip to content

Commit

Permalink
feature: fetch metadata for latest server version
Browse files Browse the repository at this point in the history
  • Loading branch information
tkurki committed Nov 22, 2020
1 parent 3cd9fc5 commit 55768d0
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 23 deletions.
11 changes: 6 additions & 5 deletions src/interfaces/appstore.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ const { installModule, removeModule } = require('../modules')
const {
isTheServerModule,
findModulesWithKeyword,
getLatestServerVersion,
getLatestServerVersionInfo,
getAuthor
} = require('../modules')
const { SERVERROUTESPREFIX } = require('../constants')
Expand Down Expand Up @@ -123,9 +123,9 @@ module.exports = function(app) {
app.get(`${SERVERROUTESPREFIX}/appstore/available/`, (req, res) => {
findPluginsAndWebapps()
.then(([plugins, webapps]) => {
getLatestServerVersion(app.config.version)
.then(serverVersion => {
const result = getAllModuleInfo(plugins, webapps, serverVersion)
getLatestServerVersionInfo(app.config.version)
.then(({version}) => {
const result = getAllModuleInfo(plugins, webapps, version)
res.send(JSON.stringify(result))
})
.catch(err => {
Expand Down Expand Up @@ -172,7 +172,8 @@ module.exports = function(app) {
updates: [],
installing: [],
storeAvailable: true,
isInDocker: process.env.IS_IN_DOCKER === 'true'
isInDocker: process.env.IS_IN_DOCKER === 'true',
nodeVersion: {}
}
}

Expand Down
26 changes: 16 additions & 10 deletions src/modules.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -58,84 +58,90 @@ describe('modulesWithKeyword', () => {
})

describe('checkForNewServerVersion', () => {
const newMinorVersionInfo = { version: '1.18.0', disttag: 'latest', minimumNodeVersio: '10'}
it('normal version upgrade', done => {
checkForNewServerVersion(
'1.17.0',
(err, newVersion) => {
if (err) {
done(err)
} else {
chai.expect(newVersion).to.equal('1.18.0')
chai.expect(newVersion).to.equal(newMinorVersionInfo.version)
done()
}
},
() => Promise.resolve('1.18.0')
() => Promise.resolve(newMinorVersionInfo)
)
})

it('normal version does not upgrade to beta', done => {
const newBetaVersion = { version: '1.18.0-beta.2', disttag: 'latest', minimumNodeVersio: '10'}
checkForNewServerVersion(
'1.17.0',
err => {
done('callback should not be called')
},
() => Promise.resolve('1.18.0-beta.1')
() => Promise.resolve(newBetaVersion)
)
done()
})

it('beta upgrades to same minor newer beta', done => {
const newerBetaVersionInfo = { version: '1.18.0-beta.2', disttag: 'latest', minimumNodeVersio: '10'}
checkForNewServerVersion(
'1.18.0-beta.1',
(err, newVersion) => {
if (err) {
done(err)
} else {
chai.expect(newVersion).to.equal('1.18.0-beta.2')
chai.expect(newVersion).to.equal(newerBetaVersionInfo.version)
done()
}
},
() => Promise.resolve('1.18.0-beta.2')
() => Promise.resolve(newerBetaVersionInfo)
)
})

it('beta upgrades to same normal version', done => {
const sameNormalVersion = { version: '1.18.0', disttag: 'latest', minimumNodeVersio: '10'}
checkForNewServerVersion(
'1.18.0-beta.2',
(err, newVersion) => {
if (err) {
done(err)
} else {
chai.expect(newVersion).to.equal('1.18.0')
chai.expect(newVersion).to.equal(sameNormalVersion.version)
done()
}
},
() => Promise.resolve('1.18.0')
() => Promise.resolve(sameNormalVersion)
)
})

it('beta upgrades to newer normal version', done => {
const newerNormalVersion = { version: '1.19.0', disttag: 'latest', minimumNodeVersio: '10'}
checkForNewServerVersion(
'1.18.0-beta.2',
(err, newVersion) => {
if (err) {
done(err)
} else {
chai.expect(newVersion).to.equal('1.19.0')
chai.expect(newVersion).to.equal(newerNormalVersion.version)
done()
}
},
() => Promise.resolve('1.19.0')
() => Promise.resolve(newerNormalVersion)
)
})

it('beta does not upgrade to newer minor beta', done => {
const nextMinorBetaVersion = { version: '1.18.0-beta.2', disttag: 'latest', minimumNodeVersio: '10'}
checkForNewServerVersion(
'1.17.0-beta.1',
err => {
done('callback should not be called')
},
() => Promise.resolve('1.18.0-beta.2')
() => Promise.resolve(nextMinorBetaVersion)
)
done()
})
Expand Down
37 changes: 29 additions & 8 deletions src/modules.ts
Original file line number Diff line number Diff line change
Expand Up @@ -268,25 +268,46 @@ function doFetchDistTags() {
return fetch('http://registry.npmjs.org/-/package/signalk-server/dist-tags')
}

function getLatestServerVersion(
export interface ServerVersionInfo {
version: string
disttag: string
minimumNodeVersion: string
}

function getLatestServerVersionInfo(
currentVersion: string,
distTags = doFetchDistTags
): Promise<string> {
): Promise<ServerVersionInfo> {
return new Promise((resolve, reject) => {
distTags()
.then(npmjsResults => npmjsResults.json())
.then(npmjsParsed => {
const prereleaseData = semver.prerelease(currentVersion)
if (prereleaseData) {
if (semver.satisfies(npmjsParsed.latest, `>${currentVersion}`)) {
resolve(npmjsParsed.latest)
return [npmjsParsed.latest, 'latest']
} else {
resolve(npmjsParsed[prereleaseData[0]])
return [npmjsParsed[prereleaseData[0]], 'beta']
}
} else {
resolve(npmjsParsed.latest)
return([npmjsParsed.latest, 'latest'])
}
})
.then(([version, disttag]) => {
return fetch('https://registry.npmjs.org/signalk-server', {
headers: {
Accept: 'application/vnd.npm.install-v1+json'
}
})
.then(res => res.json())
.then(moduleMetadata => {
resolve({
version,
disttag,
minimumNodeVersion: `${moduleMetadata.versions[version].engines}`
})
})
})
.catch(reject)
})
}
Expand All @@ -299,10 +320,10 @@ function checkForNewServerVersion(
) => any,
getLatestServerVersionP: (
version: string
) => Promise<string> = getLatestServerVersion
) => Promise<ServerVersionInfo> = getLatestServerVersionInfo
) {
getLatestServerVersionP(currentVersion)
.then((version: string) => {
.then(({version}) => {
if (semver.satisfies(new SemVer(version), `>${currentVersion}`)) {
serverUpgradeIsAvailable(undefined, version)
}
Expand Down Expand Up @@ -331,7 +352,7 @@ module.exports = {
removeModule,
isTheServerModule,
findModulesWithKeyword,
getLatestServerVersion,
getLatestServerVersionInfo,
checkForNewServerVersion,
getAuthor,
restoreModules
Expand Down

0 comments on commit 55768d0

Please sign in to comment.