Skip to content

Commit 627597a

Browse files
committed
Increased release redundancy
1 parent 565346b commit 627597a

File tree

4 files changed

+115
-84
lines changed

4 files changed

+115
-84
lines changed

DeskThingServer/src/main/services/ipc/releasesIpc.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,13 @@ export const releaseHandler = async (
2323
'initializing',
2424
[
2525
{
26-
channel: ProgressChannel.REFRESH_RELEASES,
26+
channel: ProgressChannel.ST_RELEASE_REFRESH,
2727
weight: 100
2828
}
2929
]
3030
)
3131
await releaseStore.refreshData(data.options?.force)
32-
progressBus.complete(ProgressChannel.IPC_RELEASES, 'Refreshing Releases', 'complete')
32+
progressBus.complete(ProgressChannel.IPC_RELEASES, 'Refresh Complete', 'Complete')
3333
return
3434
} catch (error) {
3535
progressBus.error(

DeskThingServer/src/main/services/releases/migrationUtils.ts

Lines changed: 49 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,9 @@ export const handleReleaseJSONFileMigration = async <T extends 'app' | 'client'>
7777
// Update the URL
7878
const latestRelease = findFirstZipAsset(githubReleases, updatedRelease.appManifest.id)
7979
if (latestRelease) {
80-
logger.debug(`Updating URL for ${updatedRelease.appManifest.id} to ${latestRelease.browser_download_url}`)
80+
logger.debug(
81+
`Updating URL for ${updatedRelease.appManifest.id} to ${latestRelease.browser_download_url}`
82+
)
8183
updatedRelease.updateUrl = latestRelease.browser_download_url
8284
} else {
8385
logger.debug(`No release found for ${updatedRelease.appManifest.id}`)
@@ -389,7 +391,6 @@ export const handleReleaseMultiToAppJSONMigration = async (
389391
])
390392
if (releaseMeta.fileIds) {
391393
const releases = await githubStore.getAllReleases(validatedRepoUrl)
392-
393394
const serverReleases = await Promise.all(
394395
releaseMeta.fileIds.map(async (id) => {
395396
return convertIdToReleaseServer(id, validatedRepoUrl, releases).catch((error) => {
@@ -431,8 +432,16 @@ export const handleReleaseMultiToAppJSONMigration = async (
431432
)
432433
}
433434

435+
const validatedRepoUrl = await determineValidUrl([
436+
releaseMeta.repository,
437+
pastRelease?.repository || ''
438+
])
439+
440+
const releases = await githubStore.getAllReleases(validatedRepoUrl)
441+
434442
const latestJson: AppLatestJSONLatest[] = await Promise.all(
435443
releaseMeta.releases.map(async (release) => {
444+
const appRelease = findFirstZipAsset(releases, release.id)
436445
return {
437446
meta_version: '0.11.8',
438447
meta_type: 'app',
@@ -443,33 +452,52 @@ export const handleReleaseMultiToAppJSONMigration = async (
443452
requires: [],
444453
tags: release.tags || '',
445454
requiredVersions: release.requiredVersions || '',
446-
author: release.author || '',
455+
author: release.author || appRelease?.uploader.login || '',
447456
description: release.description || '',
448-
homepage: release.homepage || '',
449-
repository: release.repository || '',
450-
updateUrl: release.updateUrl || ''
457+
homepage: release.homepage || validatedRepoUrl || '',
458+
repository: validatedRepoUrl || release.repository || '',
459+
updateUrl:
460+
appRelease?.browser_download_url ||
461+
(await determineValidUpdateUrl(
462+
[
463+
validatedRepoUrl,
464+
release.updateUrl,
465+
release.repository,
466+
releaseMeta.repository,
467+
pastRelease?.repository || ''
468+
],
469+
release.id
470+
))
451471
},
452472
icon: release.icon,
453473
hash: release.hash,
454474
hashAlgorithm: release.hashAlgorithm,
455-
repository: await determineValidUrl([
456-
release.repository,
457-
releaseMeta.repository,
458-
pastRelease?.repository || ''
459-
]),
460-
updateUrl: await determineValidUpdateUrl(
461-
[
462-
release.updateUrl,
475+
repository:
476+
validatedRepoUrl ||
477+
(await determineValidUrl([
463478
release.repository,
464479
releaseMeta.repository,
465480
pastRelease?.repository || ''
466-
],
467-
release.id
468-
),
469-
downloads: release.downloads || 0,
470-
size: release.size || 0,
471-
createdAt: release.createdAt || 0,
472-
updatedAt: release.updatedAt || 0
481+
])),
482+
updateUrl:
483+
appRelease?.browser_download_url ||
484+
(await determineValidUpdateUrl(
485+
[
486+
release.updateUrl,
487+
release.repository,
488+
releaseMeta.repository,
489+
pastRelease?.repository || ''
490+
],
491+
release.id
492+
)),
493+
downloads: appRelease?.download_count || release.downloads || 0,
494+
size: release.size || appRelease?.size || 0,
495+
createdAt: appRelease?.created_at
496+
? new Date(appRelease.created_at).getTime()
497+
: release.createdAt || 0,
498+
updatedAt: appRelease?.updated_at
499+
? new Date(appRelease.updated_at).getTime()
500+
: release.updatedAt || 0
473501
}
474502
})
475503
)

DeskThingServer/src/main/services/releases/releaseUtils.ts

Lines changed: 48 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -54,30 +54,22 @@ const createClientReleaseFile = async (force = false): Promise<ClientReleaseFile
5454
'@server/static/releaseMetadata'
5555
)
5656
try {
57-
progressBus.startOperation(
57+
const update = progressBus.start(
5858
ProgressChannel.FN_RELEASE_CLIENT_REFRESH,
5959
'Creating Client Releases File',
6060
'Initializing Refresh'
6161
)
6262
const githubStore = await storeProvider.getStore('githubStore')
6363

64-
progressBus.update(
65-
ProgressChannel.FN_RELEASE_CLIENT_REFRESH,
66-
`Fetching latest release from ${clientRepo}`,
67-
20
68-
)
64+
update(`Fetching latest release from ${clientRepo}`, 20)
6965
logger.debug(`Fetching latest release from ${clientRepo}`)
7066
const latestReleaseAssets = await githubStore.getLatestRelease(clientRepo, force)
7167

7268
if (!latestReleaseAssets) {
7369
throw new Error('Unable to find latest release assets')
7470
}
7571

76-
progressBus.update(
77-
ProgressChannel.FN_RELEASE_CLIENT_REFRESH,
78-
'Searching for latest.json asset',
79-
30
80-
)
72+
update('Searching for latest.json asset', 30)
8173
const latestReleaseJsonAsset = latestReleaseAssets.assets.find(
8274
(asset) => asset.name == 'latest.json'
8375
)
@@ -86,11 +78,7 @@ const createClientReleaseFile = async (force = false): Promise<ClientReleaseFile
8678
throw new Error('Unable to find latest.json asset in releases')
8779
}
8880

89-
progressBus.update(
90-
ProgressChannel.FN_RELEASE_CLIENT_REFRESH,
91-
'Fetching latest.json content',
92-
40
93-
)
81+
update('Fetching latest.json content', 40)
9482
const latestJSON = await githubStore.fetchJSONAssetContent<
9583
ClientLatestJSONLatest | MultiReleaseJSONLatest | AppLatestJSONLatest
9684
>(latestReleaseJsonAsset)
@@ -149,6 +137,10 @@ const createClientReleaseFile = async (force = false): Promise<ClientReleaseFile
149137
timestamp: Date.now()
150138
}
151139

140+
progressBus.complete(
141+
ProgressChannel.FN_RELEASE_CLIENT_REFRESH,
142+
'Finished creating client release file'
143+
)
152144
return finalClientReleaseFile
153145
} catch (error) {
154146
progressBus.error(
@@ -163,30 +155,22 @@ const createClientReleaseFile = async (force = false): Promise<ClientReleaseFile
163155
const createAppReleaseFile = async (force = false): Promise<AppReleaseFile0118> => {
164156
const { appsRepo, defaultAppLatestJSONFallback } = await import('@server/static/releaseMetadata')
165157
try {
166-
progressBus.startOperation(
158+
const update = progressBus.start(
167159
ProgressChannel.FN_RELEASE_APP_REFRESH,
168160
'Creating App Releases File',
169161
'Initializing Refresh'
170162
)
171163
const githubStore = await storeProvider.getStore('githubStore')
172164

173-
progressBus.update(
174-
ProgressChannel.FN_RELEASE_APP_REFRESH,
175-
`Fetching latest release from ${appsRepo}`,
176-
20
177-
)
165+
update(`Fetching latest release from ${appsRepo}`, 20)
178166
logger.debug(`Fetching latest release from ${appsRepo}`)
179167
const latestReleaseAssets = await githubStore.getLatestRelease(appsRepo, force)
180168

181169
if (!latestReleaseAssets) {
182170
throw new Error('Unable to find latest release assets')
183171
}
184172

185-
progressBus.update(
186-
ProgressChannel.FN_RELEASE_APP_REFRESH,
187-
'Searching for latest.json asset',
188-
30
189-
)
173+
update('Searching for latest.json asset', 30)
190174
const latestReleaseJsonAsset = latestReleaseAssets.assets.find(
191175
(asset) => asset.name == 'latest.json'
192176
)
@@ -195,7 +179,7 @@ const createAppReleaseFile = async (force = false): Promise<AppReleaseFile0118>
195179
throw new Error('Unable to find latest.json asset in releases')
196180
}
197181

198-
progressBus.update(ProgressChannel.FN_RELEASE_APP_REFRESH, 'Fetching latest.json content', 40)
182+
update('Fetching latest.json content', 40)
199183
const latestJSON = await githubStore.fetchJSONAssetContent<
200184
ClientLatestJSONLatest | MultiReleaseJSONLatest | AppLatestJSONLatest
201185
>(latestReleaseJsonAsset)
@@ -204,26 +188,19 @@ const createAppReleaseFile = async (force = false): Promise<AppReleaseFile0118>
204188
throw new Error('Unable to fetch latest.json')
205189
}
206190

207-
progressBus.update(ProgressChannel.FN_RELEASE_APP_REFRESH, 'Validating latest.json content', 50)
191+
update('Validating latest.json content', 50)
208192
const adaptedRelease = await handleReleaseJSONMigration(latestJSON)
209193

210194
if (adaptedRelease.meta_type == 'client')
211195
throw new Error(`Received meta type 'app' when expecting Multi or Client`)
212196

213197
if (adaptedRelease.meta_type == 'multi') {
214-
progressBus.update(
215-
ProgressChannel.FN_RELEASE_APP_REFRESH,
216-
'Converting multi-release to release server format',
217-
60
218-
)
198+
update('Converting multi-release to release server format', 60)
219199
const result = await convertMultiToReleaseServer(adaptedRelease)
220200

221201
if (result.type == 'converted-repos') {
222-
progressBus.update(
223-
ProgressChannel.FN_RELEASE_APP_REFRESH,
224-
'Creating empty release file',
225-
80
226-
)
202+
update('Creating empty release file', 100)
203+
227204
return {
228205
version: '0.11.8',
229206
type: 'app',
@@ -236,11 +213,7 @@ const createAppReleaseFile = async (force = false): Promise<AppReleaseFile0118>
236213
if (result.type == 'converted-clients')
237214
throw new Error('Received "client" type when expecting multi or client')
238215

239-
progressBus.update(
240-
ProgressChannel.FN_RELEASE_APP_REFRESH,
241-
'Creating app release file from multi-release',
242-
90
243-
)
216+
update('Creating app release file from multi-release', 90)
244217
const appReleaseFile: AppReleaseFile0118 = {
245218
version: '0.11.8',
246219
type: 'app',
@@ -249,14 +222,12 @@ const createAppReleaseFile = async (force = false): Promise<AppReleaseFile0118>
249222
timestamp: Date.now()
250223
}
251224

225+
update('Finalizing app release file', 100)
226+
252227
return appReleaseFile
253228
}
254229

255-
progressBus.update(
256-
ProgressChannel.FN_RELEASE_APP_REFRESH,
257-
'Creating app server configuration',
258-
70
259-
)
230+
update('Creating app server configuration', 70)
260231
const latestServer: AppLatestServer = {
261232
id: adaptedRelease.appManifest.id,
262233
type: 'app',
@@ -266,7 +237,7 @@ const createAppReleaseFile = async (force = false): Promise<AppReleaseFile0118>
266237
pastReleases: []
267238
}
268239

269-
progressBus.update(ProgressChannel.FN_RELEASE_APP_REFRESH, 'Finalizing app release file', 90)
240+
update('Finalizing app release file', 90)
270241
const finalAppReleaseFile: AppReleaseFile0118 = {
271242
version: '0.11.8',
272243
type: 'app',
@@ -443,14 +414,26 @@ export async function handleRefreshReleaseFile<T extends 'app' | 'client'>(
443414
{ force = false }: RefreshOptions
444415
): Promise<AppReleaseFile0118 | ClientReleaseFile0118 | ClientReleaseFile | AppReleaseFile> {
445416
try {
417+
const update = progressBus.start(
418+
type == 'app'
419+
? ProgressChannel.FN_RELEASE_APP_REFRESH
420+
: ProgressChannel.FN_RELEASE_CLIENT_REFRESH,
421+
'Refreshing Release File',
422+
'Starting...'
423+
)
424+
446425
// migrate to 0.11.8
447426
const releaseFile = await handleReleaseJSONFileMigration(type, prevReleaseFile)
448427

428+
update(`Updating ${releaseFile.releases.length} ${type} releases`, 50)
449429
// Handle migrating any old releases to the latest
450430
const migratedReleases = await Promise.all(
451-
releaseFile.releases.map((release: ClientLatestServer | AppLatestServer) =>
452-
updateLatestServer(release, force)
453-
)
431+
releaseFile.releases.map(async (release: ClientLatestServer | AppLatestServer) => {
432+
update(`Updating ${release.id}`, 70)
433+
const res = await updateLatestServer(release, force)
434+
update(`Updated ${release.id}`, 80)
435+
return res
436+
})
454437
)
455438

456439
if (type == 'app') {
@@ -461,7 +444,8 @@ export async function handleRefreshReleaseFile<T extends 'app' | 'client'>(
461444
releases: migratedReleases as AppLatestServer[],
462445
timestamp: Date.now()
463446
}
464-
447+
448+
update('Saving app release file', 100)
465449
return finalReleaseFile
466450
} else {
467451
const finalReleaseFile: ClientReleaseFile0118 = {
@@ -471,14 +455,23 @@ export async function handleRefreshReleaseFile<T extends 'app' | 'client'>(
471455
releases: migratedReleases as ClientLatestServer[],
472456
timestamp: Date.now()
473457
}
474-
458+
update('Saving client release file', 100)
475459
return finalReleaseFile
476460
}
477461
} catch (error) {
478462
logger.warn(`Unable to migrate ${type} release file because: ${handleError(error)}`, {
479463
function: 'handleRefreshReleaseFile'
480464
})
481465

466+
progressBus.error(
467+
type == 'app'
468+
? ProgressChannel.FN_RELEASE_APP_REFRESH
469+
: ProgressChannel.FN_RELEASE_CLIENT_REFRESH,
470+
'Error refreshing release file',
471+
handleError(error),
472+
'Error Refreshing!'
473+
)
474+
482475
return prevReleaseFile
483476
}
484477
}

0 commit comments

Comments
 (0)