Self Hosting (Custom)Server Frameworks
Elysia
Since v0.22.0+Build a self-hosted Hot Updater server with Elysia framework.
Installation
Install Elysia.
npm install elysia --save-devSetup
Make sure you've set up your database adapter first (see Database Adapters).
Import the Hot Updater instance and mount it to your Elysia app:
import { Elysia } from "elysia";
import { hotUpdater } from "./hotUpdater";
new Elysia()
.mount("/hot-updater", hotUpdater.handler)
.listen(3000);API Endpoints
The server automatically creates these endpoints:
| Method | Endpoint | Description |
|---|---|---|
| GET | /hot-updater/version | Get server version |
| GET | /hot-updater/fingerprint/:platform/:fingerprintHash/:channel/:minBundleId/:bundleId | Check for updates by fingerprint |
| GET | /hot-updater/app-version/:platform/:version/:channel/:minBundleId/:bundleId | Check for updates by app version |
| GET | /hot-updater/api/bundles | List bundles (query: channel, platform, limit, offset) |
| GET | /hot-updater/api/bundles/:id | Get bundle by ID |
| POST | /hot-updater/api/bundles | Create or update bundles |
| DELETE | /hot-updater/api/bundles/:id | Delete bundle |
| GET | /hot-updater/api/bundles/channels | List all channels |
Security
The Hot Updater handler does not include built-in authentication. Protect admin endpoints at the framework level.
Protecting Endpoints
Update endpoints are public for React Native clients. Bundle management endpoints (/api/*) require protection.
Install the bearer plugin:
npm install @elysiajs/bearer --save-devimport { Elysia } from "elysia";
import { bearer } from "@elysiajs/bearer";
import { hotUpdater } from "./hotUpdater";
new Elysia()
.use(bearer())
// Protect /api/* endpoints
.onBeforeHandle(({ bearer, request }) => {
if (new URL(request.url).pathname.includes("/api/")) {
if (bearer !== process.env.API_KEY) {
return new Response("Unauthorized", { status: 401 });
}
}
})
.all("/hot-updater/*", ({ request }) => hotUpdater.handler(request))
.listen(3000);Set your API key in environment variables:
API_KEY=your-secret-api-keyCLI Configuration
Configure the CLI to include the API key when deploying bundles:
import { standaloneRepository } from "@hot-updater/standalone";
export default defineConfig({
// ...
database: standaloneRepository({
baseUrl: "http://localhost:3000/hot-updater",
commonHeaders: {
Authorization: `Bearer ${process.env.API_KEY}`,
},
}),
});React Native Setup
Configure your React Native app to connect to this server. Use getUpdateSource with your server URL.
import { HotUpdater } from '@hot-updater/react-native';
import { getUpdateSource } from '@hot-updater/react-native';
export default HotUpdater.wrap({
source: getUpdateSource('http://localhost:3000/hot-updater', {
updateStrategy: 'appVersion', // or "fingerprint"
}),
fallbackComponent: ({ progress, status }) => (
// ... Custom loading UI
),
onError: error => {
// ... Error handling
},
})(App);