Files
peardock/lib/ota-config.cjs
T
2026-07-14 20:05:40 -04:00

130 lines
3.2 KiB
JavaScript

/**
* Shared OTA / pear-runtime-updater config for peardock client + server.
*
* package.json fields:
* upgrade — default pear:// channel (client fallback)
* upgradeClient — Electron client channel (preferred for kind=client)
* upgradeServer — Bare server channel (kind=server)
*
* Env overrides:
* PEARDOCK_OTA_UPGRADE / PEARDOCK_OTA_CLIENT / PEARDOCK_OTA_SERVER
* PEARDOCK_OTA_DISABLE=1
*/
'use strict'
const path = require('path')
/**
* @param {'client'|'server'} kind
* @param {object} [pkg]
* @returns {string|null} pear:// link or null
*/
function resolveUpgradeLink(kind, pkg = {}) {
const env =
process.env.PEARDOCK_OTA_UPGRADE ||
(kind === 'server'
? process.env.PEARDOCK_OTA_SERVER
: process.env.PEARDOCK_OTA_CLIENT) ||
''
if (env && String(env).trim()) return String(env).trim()
if (kind === 'server') {
return (
String(pkg.upgradeServer || pkg.upgrade || '').trim() || null
)
}
// client
return (
String(pkg.upgradeClient || pkg.upgrade || '').trim() || null
)
}
/**
* On-disk artifact name expected by pear-runtime-updater applyUpdate()
* (matches by-arch/.../app/<name> layout).
*
* @param {'client'|'server'} kind
* @param {{ platform?: string, productName?: string }} [opts]
* @returns {string}
*/
function artifactName(kind, opts = {}) {
const platform = opts.platform || process.platform
const product = opts.productName || 'peardock'
if (kind === 'server') {
if (platform === 'win32') return 'peardock-server.exe'
return 'peardock-server'
}
// Electron client (forge executableName: peardock-client)
if (platform === 'darwin') return `${product}.app`
if (platform === 'win32') return 'peardock-client.exe'
return 'peardock-client'
}
/**
* @param {'client'|'server'} kind
* @param {{
* pkg?: object,
* dir?: string,
* app?: string|null,
* name?: string,
* version?: string,
* platform?: string,
* }} [opts]
* @returns {{
* enabled: boolean,
* upgrade: string|null,
* dir: string,
* version: string,
* name: string,
* app: string|null,
* kind: string,
* }}
*/
function buildUpdaterOptions(kind = 'client', opts = {}) {
const pkg = opts.pkg || {}
const disabled =
process.env.PEARDOCK_OTA_DISABLE === '1' ||
process.env.PEARDOCK_OTA_DISABLE === 'true'
const upgrade = resolveUpgradeLink(kind, pkg)
const validLink = Boolean(upgrade && /^pear:\/\//i.test(upgrade))
const name =
opts.name ||
artifactName(kind, {
platform: opts.platform,
productName: pkg.productName || pkg.name || 'peardock',
})
const version = String(opts.version || pkg.version || '0.0.0')
const dir =
opts.dir ||
path.join(
process.env.PEARDOCK_HOME ||
process.env.HOME ||
process.env.USERPROFILE ||
process.cwd(),
'.config',
'peardock',
kind === 'server' ? 'pear-runtime-server' : 'pear-runtime-data'
)
return {
enabled: !disabled && validLink,
upgrade: validLink ? upgrade : upgrade || null,
dir,
version,
name,
app: opts.app != null ? opts.app : null,
kind,
}
}
module.exports = {
resolveUpgradeLink,
artifactName,
buildUpdaterOptions,
}