feat: New one-click Home Server, now in Labs. Launch your own self-hosted server instance with just 1 click from the Preferences window. (#2645)
This commit is contained in:
@@ -1,25 +1,16 @@
|
||||
import path from 'path'
|
||||
import os from 'os'
|
||||
|
||||
import {
|
||||
HomeServerManagerInterface,
|
||||
HomeServerEnvironmentConfiguration,
|
||||
Result,
|
||||
} from '@web/Application/Device/DesktopSnjsExports'
|
||||
import { HomeServer, HomeServerInterface } from '@standardnotes/home-server'
|
||||
|
||||
import { WebContents } from 'electron'
|
||||
import { MessageToWebApp } from '../../Shared/IpcMessages'
|
||||
import { FilesManagerInterface } from '../File/FilesManagerInterface'
|
||||
import { HomeServerConfigurationFile } from './HomeServerConfigurationFile'
|
||||
import { isWindows } from '../Types/Platforms'
|
||||
|
||||
const os = require('os')
|
||||
|
||||
interface TempHomeServerInterface {
|
||||
start(configuration?: unknown): Promise<Result<string>>
|
||||
activatePremiumFeatures(username: string): Promise<Result<string>>
|
||||
stop(): Promise<Result<string>>
|
||||
isRunning(): Promise<boolean>
|
||||
}
|
||||
|
||||
export class HomeServerManager implements HomeServerManagerInterface {
|
||||
private readonly HOME_SERVER_CONFIGURATION_FILE_NAME = 'config.json'
|
||||
@@ -31,7 +22,7 @@ export class HomeServerManager implements HomeServerManagerInterface {
|
||||
|
||||
private readonly LOGS_BUFFER_SIZE = 1000
|
||||
|
||||
private homeServer?: TempHomeServerInterface
|
||||
private homeServer?: HomeServerInterface
|
||||
|
||||
constructor(
|
||||
private webContents: WebContents,
|
||||
@@ -55,12 +46,15 @@ export class HomeServerManager implements HomeServerManagerInterface {
|
||||
return this.lastErrorMessage
|
||||
}
|
||||
|
||||
async activatePremiumFeatures(username: string): Promise<string | undefined> {
|
||||
async activatePremiumFeatures(username: string, subscriptionId: number): Promise<string | undefined> {
|
||||
if (!this.homeServer) {
|
||||
return
|
||||
}
|
||||
|
||||
const result = await this.homeServer.activatePremiumFeatures(username)
|
||||
const result = await this.homeServer.activatePremiumFeatures({
|
||||
username,
|
||||
subscriptionId,
|
||||
})
|
||||
|
||||
if (result.isFailed()) {
|
||||
return result.getError()
|
||||
@@ -137,11 +131,7 @@ export class HomeServerManager implements HomeServerManagerInterface {
|
||||
}
|
||||
|
||||
async startHomeServer(): Promise<string | undefined> {
|
||||
await this.lazyLoadHomeServerOnApplicablePlatforms()
|
||||
|
||||
if (!this.homeServer) {
|
||||
return
|
||||
}
|
||||
this.homeServer = new HomeServer()
|
||||
|
||||
try {
|
||||
this.lastErrorMessage = undefined
|
||||
@@ -232,6 +222,9 @@ export class HomeServerManager implements HomeServerManagerInterface {
|
||||
const interfaces = os.networkInterfaces()
|
||||
for (const interfaceName in interfaces) {
|
||||
const addresses = interfaces[interfaceName]
|
||||
if (!addresses) {
|
||||
continue
|
||||
}
|
||||
for (const address of addresses) {
|
||||
if (address.family === 'IPv4' && !address.internal) {
|
||||
return address.address
|
||||
@@ -274,14 +267,4 @@ export class HomeServerManager implements HomeServerManagerInterface {
|
||||
|
||||
return configuration
|
||||
}
|
||||
|
||||
private async lazyLoadHomeServerOnApplicablePlatforms(): Promise<void> {
|
||||
if (isWindows()) {
|
||||
return
|
||||
}
|
||||
|
||||
if (this.homeServer) {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -283,8 +283,8 @@ export class RemoteBridge implements CrossProcessBridge {
|
||||
return this.homeServerManager.setHomeServerDataLocation(location)
|
||||
}
|
||||
|
||||
async activatePremiumFeatures(username: string): Promise<string | undefined> {
|
||||
return this.homeServerManager.activatePremiumFeatures(username)
|
||||
async activatePremiumFeatures(username: string, subscriptionId: number): Promise<string | undefined> {
|
||||
return this.homeServerManager.activatePremiumFeatures(username, subscriptionId)
|
||||
}
|
||||
|
||||
async isHomeServerRunning(): Promise<boolean> {
|
||||
|
||||
@@ -37,8 +37,8 @@ export class DesktopDevice extends WebOrDesktopDevice implements DesktopDeviceIn
|
||||
return this.remoteBridge.isHomeServerRunning()
|
||||
}
|
||||
|
||||
async activatePremiumFeatures(username: string): Promise<string | undefined> {
|
||||
return this.remoteBridge.activatePremiumFeatures(username)
|
||||
async activatePremiumFeatures(username: string, subscriptionId: number): Promise<string | undefined> {
|
||||
return this.remoteBridge.activatePremiumFeatures(username, subscriptionId)
|
||||
}
|
||||
|
||||
async setHomeServerConfiguration(configurationJSONString: string): Promise<void> {
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
"selfReferences": true
|
||||
},
|
||||
"dependencies": {
|
||||
"@standardnotes/home-server": "^1.22.1",
|
||||
"keytar": "^7.9.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,7 +28,8 @@
|
||||
"release:mac": "node scripts/build.mjs mac",
|
||||
"start": "electron ./app --enable-logging --icon _icon/icon.png",
|
||||
"ava": "rimraf test/data/tmp && ava --serial",
|
||||
"rebuild:keytar": "yarn app/node_modules/keytar build "
|
||||
"rebuild:keytar": "yarn app/node_modules/keytar build ",
|
||||
"rebuild:home-server": "electron-rebuild -f -w @standardnotes/home-server -m ./app"
|
||||
},
|
||||
"installConfig": {
|
||||
"hoistingLimits": "workspaces"
|
||||
@@ -64,6 +65,7 @@
|
||||
"babel-loader": "^9.1.0",
|
||||
"copy-webpack-plugin": "^11.0.0",
|
||||
"electron-builder": "23.6.0",
|
||||
"electron-rebuild": "^3.2.9",
|
||||
"eslint": "*",
|
||||
"eslint-config-prettier": "^8.9.0",
|
||||
"eslint-plugin-import": "^2.26.0",
|
||||
|
||||
Reference in New Issue
Block a user