mirror of
https://github.com/pockethost/pockethost.git
synced 2025-07-08 05:42:35 +00:00
118 lines
3.5 KiB
TypeScript
118 lines
3.5 KiB
TypeScript
import { clientService, instanceService, rpcService } from '$services'
|
|
import {
|
|
CreateInstancePayload,
|
|
CreateInstancePayloadSchema,
|
|
CreateInstanceResult,
|
|
InstanceStatus,
|
|
Logger,
|
|
RenameInstancePayloadSchema,
|
|
RpcCommands,
|
|
SaveSecretsPayload,
|
|
SaveSecretsPayloadSchema,
|
|
SaveSecretsResult,
|
|
SaveVersionPayload,
|
|
SaveVersionPayloadSchema,
|
|
// gen:import
|
|
SaveVersionResult,
|
|
SetInstanceMaintenancePayloadSchema,
|
|
type RenameInstancePayload,
|
|
type RenameInstanceResult,
|
|
type SetInstanceMaintenancePayload,
|
|
type SetInstanceMaintenanceResult,
|
|
} from '@pockethost/common'
|
|
import { valid, validRange } from 'semver'
|
|
import { PocketbaseReleaseVersionService } from '../PocketbaseReleaseVersionService'
|
|
|
|
export const registerRpcCommands = async (logger: Logger) => {
|
|
const { client } = await clientService()
|
|
const _rpcCommandLogger = logger.create(`RpcCommands`)
|
|
const { dbg, warn } = _rpcCommandLogger
|
|
|
|
const { registerCommand } = await rpcService()
|
|
|
|
registerCommand<CreateInstancePayload, CreateInstanceResult>(
|
|
RpcCommands.CreateInstance,
|
|
CreateInstancePayloadSchema,
|
|
async (rpc) => {
|
|
const { payload } = rpc
|
|
const { subdomain } = payload
|
|
const instance = await client.createInstance({
|
|
subdomain,
|
|
uid: rpc.userId,
|
|
version: (await PocketbaseReleaseVersionService()).getLatestVersion(),
|
|
status: InstanceStatus.Idle,
|
|
secondsThisMonth: 0,
|
|
secrets: {},
|
|
maintenance: false,
|
|
})
|
|
return { instance }
|
|
},
|
|
)
|
|
|
|
registerCommand<SaveVersionPayload, SaveVersionResult>(
|
|
RpcCommands.SaveVersion,
|
|
SaveVersionPayloadSchema,
|
|
async (rpc) => {
|
|
const { payload } = rpc
|
|
const { instanceId, version } = payload
|
|
if (valid(version) === null && validRange(version) === null) {
|
|
return {
|
|
status: `error`,
|
|
message: `Version must be a valid semver or semver range`,
|
|
}
|
|
}
|
|
await client.updateInstance(instanceId, { version })
|
|
return { status: 'ok' }
|
|
},
|
|
)
|
|
|
|
registerCommand<SaveSecretsPayload, SaveSecretsResult>(
|
|
RpcCommands.SaveSecrets,
|
|
SaveSecretsPayloadSchema,
|
|
async (job) => {
|
|
const { payload } = job
|
|
const { instanceId, secrets } = payload
|
|
await client.updateInstance(instanceId, { secrets })
|
|
return { status: 'ok' }
|
|
},
|
|
)
|
|
|
|
registerCommand<RenameInstancePayload, RenameInstanceResult>(
|
|
RpcCommands.RenameInstance,
|
|
RenameInstancePayloadSchema,
|
|
async (job) => {
|
|
const { dbg, error } = _rpcCommandLogger.create(`renameInstance`)
|
|
const { payload } = job
|
|
const { instanceId, subdomain } = payload
|
|
dbg(`Updating instance`)
|
|
await client.updateInstance(instanceId, { subdomain })
|
|
dbg(`Instance updated successfully `)
|
|
return {}
|
|
},
|
|
)
|
|
|
|
registerCommand<SetInstanceMaintenancePayload, SetInstanceMaintenanceResult>(
|
|
RpcCommands.SetInstanceMaintenance,
|
|
SetInstanceMaintenancePayloadSchema,
|
|
async (job) => {
|
|
const { payload } = job
|
|
const { instanceId, maintenance } = payload
|
|
dbg(`Updating to maintenance mode ${instanceId}`)
|
|
await client.updateInstance(instanceId, { maintenance })
|
|
if (maintenance) {
|
|
try {
|
|
dbg(`Shutting down instance ${instanceId}`)
|
|
const is = await instanceService()
|
|
const api = is.getInstanceApiIfExistsById(instanceId)
|
|
await api?.shutdown()
|
|
} catch (e) {
|
|
warn(e)
|
|
}
|
|
}
|
|
return {}
|
|
},
|
|
)
|
|
|
|
// gen:command
|
|
}
|