forked from AxTps/Starlight_Lancher
57 lines
1.9 KiB
JavaScript
57 lines
1.9 KiB
JavaScript
import crypto from 'node:crypto'
|
|
import fs from 'node:fs'
|
|
|
|
const [catalogPath, releasePath, tag] = process.argv.slice(2)
|
|
const serverUrl = process.env.UPDATE_SERVER_URL?.replace(/\/$/, '')
|
|
const webhookSecret = process.env.UPDATE_SERVER_WEBHOOK_SECRET
|
|
|
|
if (!catalogPath || !releasePath || !tag || !serverUrl || !webhookSecret) {
|
|
throw new Error(
|
|
'Usage: UPDATE_SERVER_URL=... UPDATE_SERVER_WEBHOOK_SECRET=... node scripts/axolotl/publish-update-server.mjs <catalog.json> <release.json> <version-tag>',
|
|
)
|
|
}
|
|
|
|
const catalog = JSON.parse(fs.readFileSync(catalogPath, 'utf8'))
|
|
const release = JSON.parse(fs.readFileSync(releasePath, 'utf8'))
|
|
const version = tag.replace(/^v/, '')
|
|
if (catalog.version !== version || release.tag_name !== tag) {
|
|
throw new Error('Release catalog metadata does not match the release tag')
|
|
}
|
|
if (!release.published_at) {
|
|
throw new Error(`GitHub release ${tag} must be published before notifying the Update Server`)
|
|
}
|
|
|
|
const payload = JSON.stringify({
|
|
event_id: `github-${tag}-${release.id ?? release.node_id ?? version}`,
|
|
tag,
|
|
version,
|
|
channel: version.includes('-') ? 'beta' : 'release',
|
|
release: {
|
|
id: release.id,
|
|
tag_name: release.tag_name,
|
|
draft: release.draft,
|
|
body: release.body ?? '',
|
|
published_at: release.published_at,
|
|
assets: release.assets,
|
|
},
|
|
catalog,
|
|
force_update: process.env.UPDATE_SERVER_FORCE_UPDATE === 'true',
|
|
})
|
|
const timestamp = String(Math.floor(Date.now() / 1000))
|
|
const signature = crypto
|
|
.createHmac('sha256', webhookSecret)
|
|
.update(`${timestamp}.${payload}`)
|
|
.digest('hex')
|
|
const response = await fetch(`${serverUrl}/api/webhook/release`, {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
'X-Webhook-Timestamp': timestamp,
|
|
'X-Webhook-Signature': `sha256=${signature}`,
|
|
},
|
|
body: payload,
|
|
})
|
|
if (!response.ok) {
|
|
throw new Error(`Update Server publish failed: ${response.status} ${await response.text()}`)
|
|
}
|