refactor (backend): port config loader to backend-rs completely
This commit is contained in:
parent
1be5373dfc
commit
3b89a8bfa6
104 changed files with 375 additions and 262 deletions
70
packages/backend-rs/index.d.ts
vendored
70
packages/backend-rs/index.d.ts
vendored
|
@ -12,7 +12,7 @@ export interface EnvConfig {
|
|||
withLogTime: boolean
|
||||
slow: boolean
|
||||
}
|
||||
export function readEnvironmentConfig(): EnvConfig
|
||||
export function loadEnv(): EnvConfig
|
||||
export interface ServerConfig {
|
||||
url: string
|
||||
port: number
|
||||
|
@ -29,7 +29,7 @@ export interface ServerConfig {
|
|||
/** `NapiValue` is not implemented for `u64` */
|
||||
maxFileSize?: number
|
||||
accessLog?: string
|
||||
clusterLimits?: WorkerConfig
|
||||
clusterLimits?: _WorkerConfig
|
||||
cuid?: IdConfig
|
||||
outgoingAddress?: string
|
||||
deliverJobConcurrency?: number
|
||||
|
@ -76,6 +76,10 @@ export interface TlsConfig {
|
|||
host: string
|
||||
rejectUnauthorized: boolean
|
||||
}
|
||||
export interface WorkerConfig {
|
||||
web: number
|
||||
queue: number
|
||||
}
|
||||
export interface WorkerConfig {
|
||||
web?: number
|
||||
queue?: number
|
||||
|
@ -121,7 +125,67 @@ export interface ObjectStorageConfig {
|
|||
setPublicReadOnUpload?: boolean
|
||||
s3ForcePathStyle?: boolean
|
||||
}
|
||||
export function readServerConfig(): ServerConfig
|
||||
export interface Config {
|
||||
url: string
|
||||
port: number
|
||||
bind?: string
|
||||
disableHsts?: boolean
|
||||
db: DbConfig
|
||||
redis: RedisConfig
|
||||
cacheServer?: RedisConfig
|
||||
proxy?: string
|
||||
proxySmtp?: string
|
||||
proxyBypassHosts?: Array<string>
|
||||
allowedPrivateNetworks?: Array<string>
|
||||
maxFileSize?: number
|
||||
accessLog?: string
|
||||
clusterLimits: WorkerConfig
|
||||
cuid?: IdConfig
|
||||
outgoingAddress?: string
|
||||
deliverJobConcurrency?: number
|
||||
inboxJobConcurrency?: number
|
||||
deliverJobPerSec?: number
|
||||
inboxJobPerSec?: number
|
||||
deliverJobMaxAttempts?: number
|
||||
inboxJobMaxAttempts?: number
|
||||
logLevel?: Array<string>
|
||||
syslog?: SysLogConfig
|
||||
proxyRemoteFiles?: boolean
|
||||
mediaProxy?: string
|
||||
summalyProxyUrl?: string
|
||||
reservedUsernames?: Array<string>
|
||||
maxUserSignups?: number
|
||||
isManagedHosting?: boolean
|
||||
maxNoteLength?: number
|
||||
maxCaptionLength?: number
|
||||
deepl?: DeepLConfig
|
||||
libreTranslate?: LibreTranslateConfig
|
||||
email?: EmailConfig
|
||||
objectStorage?: ObjectStorageConfig
|
||||
version: string
|
||||
host: string
|
||||
hostname: string
|
||||
scheme: string
|
||||
wsScheme: string
|
||||
apiUrl: string
|
||||
wsUrl: string
|
||||
authUrl: string
|
||||
driveUrl: string
|
||||
userAgent: string
|
||||
clientEntry: Manifest
|
||||
}
|
||||
export interface Manifest {
|
||||
file: string
|
||||
name: string
|
||||
src: string
|
||||
isEntry: boolean
|
||||
isDynamicEntry: boolean
|
||||
imports: Array<string>
|
||||
dynamicImports: Array<string>
|
||||
css: Array<string>
|
||||
assets: Array<string>
|
||||
}
|
||||
export function loadConfig(): Config
|
||||
export interface Acct {
|
||||
username: string
|
||||
host: string | null
|
||||
|
|
|
@ -310,10 +310,10 @@ if (!nativeBinding) {
|
|||
throw new Error(`Failed to load native binding`)
|
||||
}
|
||||
|
||||
const { readEnvironmentConfig, readServerConfig, stringToAcct, acctToString, checkWordMute, getFullApAccount, isSelfHost, isSameOrigin, extractHost, toPuny, isUnicodeEmoji, sqlLikeEscape, safeForSql, formatMilliseconds, getNoteSummary, toMastodonId, fromMastodonId, fetchMeta, metaToPugArgs, nyaify, hashPassword, verifyPassword, isOldPasswordAlgorithm, decodeReaction, countReactions, toDbReaction, AntennaSrcEnum, MutedNoteReasonEnum, NoteVisibilityEnum, NotificationTypeEnum, PageVisibilityEnum, PollNotevisibilityEnum, RelayStatusEnum, UserEmojimodpermEnum, UserProfileFfvisibilityEnum, UserProfileMutingnotificationtypesEnum, initIdGenerator, getTimestamp, genId, secureRndstr } = nativeBinding
|
||||
const { loadEnv, loadConfig, stringToAcct, acctToString, checkWordMute, getFullApAccount, isSelfHost, isSameOrigin, extractHost, toPuny, isUnicodeEmoji, sqlLikeEscape, safeForSql, formatMilliseconds, getNoteSummary, toMastodonId, fromMastodonId, fetchMeta, metaToPugArgs, nyaify, hashPassword, verifyPassword, isOldPasswordAlgorithm, decodeReaction, countReactions, toDbReaction, AntennaSrcEnum, MutedNoteReasonEnum, NoteVisibilityEnum, NotificationTypeEnum, PageVisibilityEnum, PollNotevisibilityEnum, RelayStatusEnum, UserEmojimodpermEnum, UserProfileFfvisibilityEnum, UserProfileMutingnotificationtypesEnum, initIdGenerator, getTimestamp, genId, secureRndstr } = nativeBinding
|
||||
|
||||
module.exports.readEnvironmentConfig = readEnvironmentConfig
|
||||
module.exports.readServerConfig = readServerConfig
|
||||
module.exports.loadEnv = loadEnv
|
||||
module.exports.loadConfig = loadConfig
|
||||
module.exports.stringToAcct = stringToAcct
|
||||
module.exports.acctToString = acctToString
|
||||
module.exports.checkWordMute = checkWordMute
|
||||
|
|
|
@ -11,7 +11,7 @@ pub struct EnvConfig {
|
|||
}
|
||||
|
||||
#[crate::export]
|
||||
pub fn read_environment_config() -> EnvConfig {
|
||||
pub fn load_env() -> EnvConfig {
|
||||
let node_env = std::env::var("NODE_ENV").unwrap_or_default().to_lowercase();
|
||||
let is_testing = node_env == "test";
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@ use std::fs;
|
|||
#[derive(Clone, Debug, PartialEq, Deserialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
#[crate::export(object, use_nullable = false)]
|
||||
pub struct ServerConfig {
|
||||
struct ServerConfig {
|
||||
pub url: String,
|
||||
pub port: u16,
|
||||
/// host to listen on
|
||||
|
@ -25,7 +25,7 @@ pub struct ServerConfig {
|
|||
/// `NapiValue` is not implemented for `u64`
|
||||
pub max_file_size: Option<i64>,
|
||||
pub access_log: Option<String>,
|
||||
pub cluster_limits: Option<WorkerConfig>,
|
||||
pub cluster_limits: Option<_WorkerConfig>,
|
||||
pub cuid: Option<IdConfig>,
|
||||
pub outgoing_address: Option<String>,
|
||||
|
||||
|
@ -94,10 +94,16 @@ pub struct TlsConfig {
|
|||
pub reject_unauthorized: bool,
|
||||
}
|
||||
|
||||
#[crate::export(object, use_nullable = false)]
|
||||
pub struct WorkerConfig {
|
||||
pub web: u32,
|
||||
pub queue: u32,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, Deserialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
#[crate::export(object, use_nullable = false)]
|
||||
pub struct WorkerConfig {
|
||||
pub struct _WorkerConfig {
|
||||
pub web: Option<u32>,
|
||||
pub queue: Option<u32>,
|
||||
}
|
||||
|
@ -167,17 +173,198 @@ pub struct ObjectStorageConfig {
|
|||
pub s3_force_path_style: Option<bool>,
|
||||
}
|
||||
|
||||
#[crate::export]
|
||||
pub fn read_server_config() -> ServerConfig {
|
||||
#[crate::export(object, use_nullable = false)]
|
||||
pub struct Config {
|
||||
// ServerConfig (from default.yml)
|
||||
pub url: String,
|
||||
pub port: u16,
|
||||
pub bind: Option<String>,
|
||||
pub disable_hsts: Option<bool>,
|
||||
pub db: DbConfig,
|
||||
pub redis: RedisConfig,
|
||||
pub cache_server: Option<RedisConfig>,
|
||||
pub proxy: Option<String>,
|
||||
pub proxy_smtp: Option<String>,
|
||||
pub proxy_bypass_hosts: Option<Vec<String>>,
|
||||
pub allowed_private_networks: Option<Vec<String>>,
|
||||
pub max_file_size: Option<i64>,
|
||||
pub access_log: Option<String>,
|
||||
pub cluster_limits: WorkerConfig,
|
||||
pub cuid: Option<IdConfig>,
|
||||
pub outgoing_address: Option<String>,
|
||||
pub deliver_job_concurrency: Option<u32>,
|
||||
pub inbox_job_concurrency: Option<u32>,
|
||||
pub deliver_job_per_sec: Option<u32>,
|
||||
pub inbox_job_per_sec: Option<u32>,
|
||||
pub deliver_job_max_attempts: Option<u32>,
|
||||
pub inbox_job_max_attempts: Option<u32>,
|
||||
pub log_level: Option<Vec<String>>,
|
||||
pub syslog: Option<SysLogConfig>,
|
||||
pub proxy_remote_files: Option<bool>,
|
||||
pub media_proxy: Option<String>,
|
||||
pub summaly_proxy_url: Option<String>,
|
||||
pub reserved_usernames: Option<Vec<String>>,
|
||||
pub max_user_signups: Option<u32>,
|
||||
pub is_managed_hosting: Option<bool>,
|
||||
pub max_note_length: Option<u32>,
|
||||
pub max_caption_length: Option<u32>,
|
||||
pub deepl: Option<DeepLConfig>,
|
||||
pub libre_translate: Option<LibreTranslateConfig>,
|
||||
pub email: Option<EmailConfig>,
|
||||
pub object_storage: Option<ObjectStorageConfig>,
|
||||
|
||||
// Mixin
|
||||
pub version: String,
|
||||
pub host: String,
|
||||
pub hostname: String,
|
||||
pub scheme: String,
|
||||
pub ws_scheme: String,
|
||||
pub api_url: String,
|
||||
pub ws_url: String,
|
||||
pub auth_url: String,
|
||||
pub drive_url: String,
|
||||
pub user_agent: String,
|
||||
pub client_entry: Manifest,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, Deserialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
struct Meta {
|
||||
pub version: String,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, Deserialize)]
|
||||
struct ManifestJson {
|
||||
#[serde(rename = "src/init.ts")]
|
||||
pub init_ts: Manifest,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, Deserialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
#[crate::export(object, use_nullable = false)]
|
||||
pub struct Manifest {
|
||||
pub file: String,
|
||||
pub name: String,
|
||||
pub src: String,
|
||||
pub is_entry: bool,
|
||||
pub is_dynamic_entry: bool,
|
||||
pub imports: Vec<String>,
|
||||
pub dynamic_imports: Vec<String>,
|
||||
pub css: Vec<String>,
|
||||
pub assets: Vec<String>,
|
||||
}
|
||||
|
||||
fn read_config_file() -> ServerConfig {
|
||||
let cwd = env::current_dir().unwrap();
|
||||
let yml = fs::File::open(cwd.join("../../.config/default.yml"))
|
||||
.expect("Failed to open '.config/default.yml'");
|
||||
let mut data: ServerConfig = serde_yaml::from_reader(yml).expect("Failed to parse yaml");
|
||||
let mut data: ServerConfig =
|
||||
serde_yaml::from_reader(yml).expect("Failed to parse .config/default.yml");
|
||||
|
||||
data.url = url::Url::parse(&data.url)
|
||||
.expect("Config url is invalid")
|
||||
.origin()
|
||||
.ascii_serialization();
|
||||
|
||||
if data.bind.is_none() {
|
||||
data.bind = std::env::var("BIND").ok()
|
||||
}
|
||||
|
||||
data
|
||||
}
|
||||
|
||||
pub static SERVER_CONFIG: Lazy<ServerConfig> = Lazy::new(read_server_config);
|
||||
fn read_meta() -> Meta {
|
||||
let cwd = env::current_dir().unwrap();
|
||||
let meta_json = fs::File::open(cwd.join("../../built/meta.json"))
|
||||
.expect("Failed to open 'built/meta.json'");
|
||||
serde_json::from_reader(meta_json).expect("Failed to parse built/meta.json")
|
||||
}
|
||||
|
||||
fn read_manifest() -> Manifest {
|
||||
let cwd = env::current_dir().unwrap();
|
||||
let manifest_json = fs::File::open(cwd.join("../../built/_client_dist_/manifest.json"))
|
||||
.expect("Failed to open 'built/_client_dist_/manifest.json'");
|
||||
let manifest: ManifestJson = serde_json::from_reader(manifest_json)
|
||||
.expect("Failed to parse built/_client_dist_/manifest.json");
|
||||
|
||||
manifest.init_ts
|
||||
}
|
||||
|
||||
#[crate::export]
|
||||
fn load_config() -> Config {
|
||||
let server_config = read_config_file();
|
||||
let version = read_meta().version;
|
||||
let manifest = read_manifest();
|
||||
let url = url::Url::parse(&server_config.url).expect("Config url is invalid");
|
||||
let host = url
|
||||
.host_str()
|
||||
.expect("Hostname is missing in the config url")
|
||||
.to_owned();
|
||||
let hostname = url
|
||||
.domain()
|
||||
.expect("Domain is missing in the config url")
|
||||
.to_owned();
|
||||
let scheme = url.scheme().to_owned();
|
||||
let ws_scheme = scheme.replace("http", "ws");
|
||||
|
||||
let cluster_limits = match server_config.cluster_limits {
|
||||
Some(cl) => WorkerConfig {
|
||||
web: cl.web.unwrap_or(1),
|
||||
queue: cl.queue.unwrap_or(1),
|
||||
},
|
||||
None => WorkerConfig { web: 1, queue: 1 },
|
||||
};
|
||||
|
||||
Config {
|
||||
url: server_config.url,
|
||||
port: server_config.port,
|
||||
bind: server_config.bind,
|
||||
disable_hsts: server_config.disable_hsts,
|
||||
db: server_config.db,
|
||||
redis: server_config.redis,
|
||||
cache_server: server_config.cache_server,
|
||||
proxy: server_config.proxy,
|
||||
proxy_smtp: server_config.proxy_smtp,
|
||||
proxy_bypass_hosts: server_config.proxy_bypass_hosts,
|
||||
allowed_private_networks: server_config.allowed_private_networks,
|
||||
max_file_size: server_config.max_file_size,
|
||||
access_log: server_config.access_log,
|
||||
cluster_limits,
|
||||
cuid: server_config.cuid,
|
||||
outgoing_address: server_config.outgoing_address,
|
||||
deliver_job_concurrency: server_config.deliver_job_concurrency,
|
||||
inbox_job_concurrency: server_config.inbox_job_concurrency,
|
||||
deliver_job_per_sec: server_config.deliver_job_per_sec,
|
||||
inbox_job_per_sec: server_config.inbox_job_per_sec,
|
||||
deliver_job_max_attempts: server_config.deliver_job_max_attempts,
|
||||
inbox_job_max_attempts: server_config.inbox_job_max_attempts,
|
||||
log_level: server_config.log_level,
|
||||
syslog: server_config.syslog,
|
||||
proxy_remote_files: server_config.proxy_remote_files,
|
||||
media_proxy: server_config.media_proxy,
|
||||
summaly_proxy_url: server_config.summaly_proxy_url,
|
||||
reserved_usernames: server_config.reserved_usernames,
|
||||
max_user_signups: server_config.max_user_signups,
|
||||
is_managed_hosting: server_config.is_managed_hosting,
|
||||
max_note_length: server_config.max_note_length,
|
||||
max_caption_length: server_config.max_caption_length,
|
||||
deepl: server_config.deepl,
|
||||
libre_translate: server_config.libre_translate,
|
||||
email: server_config.email,
|
||||
object_storage: server_config.object_storage,
|
||||
|
||||
ws_url: format!("{}://{}", ws_scheme, host),
|
||||
api_url: format!("{}://{}/api", scheme, host),
|
||||
auth_url: format!("{}://{}/auth", scheme, host),
|
||||
drive_url: format!("{}://{}/files", scheme, host),
|
||||
user_agent: format!("Firefish/{} ({})", version, url),
|
||||
version,
|
||||
host,
|
||||
hostname,
|
||||
scheme,
|
||||
ws_scheme,
|
||||
client_entry: manifest,
|
||||
}
|
||||
}
|
||||
|
||||
pub static CONFIG: Lazy<Config> = Lazy::new(load_config);
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
use crate::config::server::SERVER_CONFIG;
|
||||
use crate::config::server::CONFIG;
|
||||
use sea_orm::{Database, DbConn, DbErr};
|
||||
|
||||
static DB_CONN: once_cell::sync::OnceCell<DbConn> = once_cell::sync::OnceCell::new();
|
||||
|
@ -6,11 +6,11 @@ static DB_CONN: once_cell::sync::OnceCell<DbConn> = once_cell::sync::OnceCell::n
|
|||
async fn init_database() -> Result<&'static DbConn, DbErr> {
|
||||
let database_uri = format!(
|
||||
"postgres://{}:{}@{}:{}/{}",
|
||||
SERVER_CONFIG.db.user,
|
||||
urlencoding::encode(&SERVER_CONFIG.db.pass),
|
||||
SERVER_CONFIG.db.host,
|
||||
SERVER_CONFIG.db.port,
|
||||
SERVER_CONFIG.db.db,
|
||||
CONFIG.db.user,
|
||||
urlencoding::encode(&CONFIG.db.pass),
|
||||
CONFIG.db.host,
|
||||
CONFIG.db.port,
|
||||
CONFIG.db.db,
|
||||
);
|
||||
let conn = Database::connect(database_uri).await?;
|
||||
Ok(DB_CONN.get_or_init(move || conn))
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
use crate::config::server::SERVER_CONFIG;
|
||||
use crate::config::server::CONFIG;
|
||||
|
||||
#[derive(thiserror::Error, Debug)]
|
||||
pub enum Error {
|
||||
|
@ -14,21 +14,21 @@ pub enum Error {
|
|||
pub fn get_full_ap_account(username: &str, host: Option<&str>) -> Result<String, Error> {
|
||||
Ok(match host {
|
||||
Some(host) => format!("{}@{}", username, to_puny(host)?),
|
||||
None => format!("{}@{}", username, extract_host(&SERVER_CONFIG.url)?),
|
||||
None => format!("{}@{}", username, extract_host(&CONFIG.url)?),
|
||||
})
|
||||
}
|
||||
|
||||
#[crate::export]
|
||||
pub fn is_self_host(host: Option<&str>) -> Result<bool, Error> {
|
||||
Ok(match host {
|
||||
Some(host) => extract_host(&SERVER_CONFIG.url)? == to_puny(host)?,
|
||||
Some(host) => extract_host(&CONFIG.url)? == to_puny(host)?,
|
||||
None => true,
|
||||
})
|
||||
}
|
||||
|
||||
#[crate::export]
|
||||
pub fn is_same_origin(uri: &str) -> Result<bool, Error> {
|
||||
Ok(url::Url::parse(uri)?.origin().ascii_serialization() == SERVER_CONFIG.url)
|
||||
Ok(url::Url::parse(uri)?.origin().ascii_serialization() == CONFIG.url)
|
||||
}
|
||||
|
||||
#[crate::export]
|
||||
|
|
|
@ -3,7 +3,7 @@ import chalk from "chalk";
|
|||
import Xev from "xev";
|
||||
|
||||
import Logger from "@/services/logger.js";
|
||||
import { envOption } from "@/config/index.js";
|
||||
import { envOption } from "@/config.js";
|
||||
import { inspect } from "node:util";
|
||||
|
||||
// for typeorm
|
||||
|
|
|
@ -8,9 +8,8 @@ import chalkTemplate from "chalk-template";
|
|||
import semver from "semver";
|
||||
|
||||
import Logger from "@/services/logger.js";
|
||||
import loadConfig from "@/config/load.js";
|
||||
import type { Config } from "@/config/types.js";
|
||||
import { envOption } from "@/config/index.js";
|
||||
import type { Config } from "backend-rs";
|
||||
import { config, envOption } from "@/config.js";
|
||||
import { showMachineInfo } from "@/misc/show-machine-info.js";
|
||||
import { db, initDb } from "@/db/postgre.js";
|
||||
import { inspect } from "node:util";
|
||||
|
@ -87,15 +86,12 @@ function greet() {
|
|||
* Init master process
|
||||
*/
|
||||
export async function masterMain() {
|
||||
let config!: Config;
|
||||
|
||||
// initialize app
|
||||
try {
|
||||
greet();
|
||||
showEnvironment();
|
||||
await showMachineInfo(bootLogger);
|
||||
showNodejsVersion();
|
||||
config = loadConfigBoot();
|
||||
await connectDb();
|
||||
} catch (e) {
|
||||
bootLogger.error(
|
||||
|
@ -154,28 +150,6 @@ function showNodejsVersion(): void {
|
|||
}
|
||||
}
|
||||
|
||||
function loadConfigBoot(): Config {
|
||||
const configLogger = bootLogger.createSubLogger("config");
|
||||
let config;
|
||||
|
||||
try {
|
||||
config = loadConfig();
|
||||
} catch (exception) {
|
||||
if (exception.code === "ENOENT") {
|
||||
configLogger.error("Configuration file not found", null, true);
|
||||
process.exit(1);
|
||||
} else if (e instanceof Error) {
|
||||
configLogger.error(e.message);
|
||||
process.exit(1);
|
||||
}
|
||||
throw exception;
|
||||
}
|
||||
|
||||
configLogger.succ("Loaded");
|
||||
|
||||
return config;
|
||||
}
|
||||
|
||||
async function connectDb(): Promise<void> {
|
||||
const dbLogger = bootLogger.createSubLogger("db");
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import cluster from "node:cluster";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import { initDb } from "@/db/postgre.js";
|
||||
import { initIdGenerator } from "backend-rs";
|
||||
import os from "node:os";
|
||||
|
|
4
packages/backend/src/config.ts
Normal file
4
packages/backend/src/config.ts
Normal file
|
@ -0,0 +1,4 @@
|
|||
import { loadConfig, loadEnv } from "backend-rs";
|
||||
|
||||
export const config = loadConfig();
|
||||
export const envOption = loadEnv();
|
|
@ -1,5 +0,0 @@
|
|||
import load from "./load.js";
|
||||
import { readEnvironmentConfig } from "backend-rs";
|
||||
|
||||
export default load();
|
||||
export const envOption = readEnvironmentConfig();
|
|
@ -1,89 +0,0 @@
|
|||
/**
|
||||
* Config loader
|
||||
*/
|
||||
|
||||
import * as fs from "node:fs";
|
||||
import { fileURLToPath } from "node:url";
|
||||
import { dirname } from "node:path";
|
||||
import type { Mixin } from "./types.js";
|
||||
import { readServerConfig } from "backend-rs";
|
||||
|
||||
const _filename = fileURLToPath(import.meta.url);
|
||||
const _dirname = dirname(_filename);
|
||||
|
||||
/**
|
||||
* Path of configuration directory
|
||||
*/
|
||||
const dir = `${_dirname}/../../../../.config`;
|
||||
|
||||
/**
|
||||
* Path of configuration file
|
||||
*/
|
||||
const path =
|
||||
process.env.NODE_ENV === "test" ? `${dir}/test.yml` : `${dir}/default.yml`;
|
||||
|
||||
export default function load() {
|
||||
const meta = JSON.parse(
|
||||
fs.readFileSync(`${_dirname}/../../../../built/meta.json`, "utf-8"),
|
||||
);
|
||||
const clientManifest = JSON.parse(
|
||||
fs.readFileSync(
|
||||
`${_dirname}/../../../../built/_client_dist_/manifest.json`,
|
||||
"utf-8",
|
||||
),
|
||||
);
|
||||
const config = readServerConfig();
|
||||
|
||||
const mixin = {} as Mixin;
|
||||
|
||||
const url = tryCreateUrl(config.url);
|
||||
|
||||
config.url = url.origin;
|
||||
|
||||
config.port = config.port || parseInt(process.env.PORT || "", 10);
|
||||
config.bind = config.bind || process.env.BIND;
|
||||
|
||||
mixin.version = meta.version;
|
||||
mixin.host = url.host;
|
||||
mixin.hostname = url.hostname;
|
||||
mixin.scheme = url.protocol.replace(/:$/, "");
|
||||
mixin.wsScheme = mixin.scheme.replace("http", "ws");
|
||||
mixin.wsUrl = `${mixin.wsScheme}://${mixin.host}`;
|
||||
mixin.apiUrl = `${mixin.scheme}://${mixin.host}/api`;
|
||||
mixin.authUrl = `${mixin.scheme}://${mixin.host}/auth`;
|
||||
mixin.driveUrl = `${mixin.scheme}://${mixin.host}/files`;
|
||||
mixin.userAgent = `Firefish/${meta.version} (${config.url})`;
|
||||
mixin.clientEntry = clientManifest["src/init.ts"];
|
||||
|
||||
if (config.proxyRemoteFiles == null) config.proxyRemoteFiles = true;
|
||||
if (!config.redis.prefix) config.redis.prefix = mixin.hostname;
|
||||
if (config.cacheServer && !config.cacheServer.prefix)
|
||||
config.cacheServer.prefix = mixin.hostname;
|
||||
|
||||
if (!config.clusterLimits) {
|
||||
config.clusterLimits = {
|
||||
web: 1,
|
||||
queue: 1,
|
||||
};
|
||||
} else {
|
||||
config.clusterLimits = {
|
||||
web: 1,
|
||||
queue: 1,
|
||||
...config.clusterLimits,
|
||||
};
|
||||
|
||||
if (config.clusterLimits.web! < 1 || config.clusterLimits.queue! < 1) {
|
||||
throw new Error("Invalid cluster limits");
|
||||
}
|
||||
}
|
||||
|
||||
return Object.assign(config, mixin);
|
||||
}
|
||||
|
||||
function tryCreateUrl(url: string) {
|
||||
try {
|
||||
return new URL(url);
|
||||
} catch (e) {
|
||||
throw new Error(`url="${url}" is not a valid URL.`);
|
||||
}
|
||||
}
|
|
@ -1,20 +0,0 @@
|
|||
import type { ServerConfig } from "backend-rs";
|
||||
|
||||
/**
|
||||
* Firefish が自動的に(ユーザーが設定した情報から推論して)設定する情報
|
||||
*/
|
||||
export type Mixin = {
|
||||
version: string;
|
||||
host: string;
|
||||
hostname: string;
|
||||
scheme: string;
|
||||
wsScheme: string;
|
||||
apiUrl: string;
|
||||
wsUrl: string;
|
||||
authUrl: string;
|
||||
driveUrl: string;
|
||||
userAgent: string;
|
||||
clientEntry: string;
|
||||
};
|
||||
|
||||
export type Config = ServerConfig & Mixin;
|
|
@ -1,4 +1,4 @@
|
|||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import {
|
||||
DB_MAX_IMAGE_COMMENT_LENGTH,
|
||||
DB_MAX_NOTE_TEXT_LENGTH,
|
||||
|
|
|
@ -5,7 +5,7 @@ pg.types.setTypeParser(20, Number);
|
|||
import type { Logger } from "typeorm";
|
||||
import { DataSource } from "typeorm";
|
||||
import * as highlight from "cli-highlight";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
|
||||
import { User } from "@/models/entities/user.js";
|
||||
import { DriveFile } from "@/models/entities/drive-file.js";
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import Redis from "ioredis";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
|
||||
export function createConnection() {
|
||||
let source = config.redis;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import { type HTMLElement, Window } from "happy-dom";
|
||||
import type * as mfm from "mfm-js";
|
||||
import katex from "katex";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import { intersperse } from "@/prelude/array.js";
|
||||
import type { IMentionedRemoteUsers } from "@/models/entities/note.js";
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import fetch from "node-fetch";
|
||||
import { URLSearchParams } from "node:url";
|
||||
import { getAgentByUrl } from "@/misc/fetch.js";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import { inspect } from "node:util";
|
||||
|
||||
export async function verifyRecaptcha(secret: string, response: string) {
|
||||
|
|
|
@ -3,7 +3,7 @@ import * as stream from "node:stream";
|
|||
import * as util from "node:util";
|
||||
import got, * as Got from "got";
|
||||
import { httpAgent, httpsAgent, StatusError } from "./fetch.js";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import chalk from "chalk";
|
||||
import Logger from "@/services/logger.js";
|
||||
import IPCIDR from "ip-cidr";
|
||||
|
|
|
@ -4,7 +4,7 @@ import type { URL } from "node:url";
|
|||
import CacheableLookup from "cacheable-lookup";
|
||||
import fetch, { type RequestRedirect } from "node-fetch";
|
||||
import { HttpProxyAgent, HttpsProxyAgent } from "hpagent";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import { isValidUrl } from "./is-valid-url.js";
|
||||
|
||||
export async function getJson(
|
||||
|
|
|
@ -4,7 +4,7 @@ import type { Emoji } from "@/models/entities/emoji.js";
|
|||
import type { Note } from "@/models/entities/note.js";
|
||||
import { Cache } from "./cache.js";
|
||||
import { decodeReaction, isSelfHost, toPuny } from "backend-rs";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import { query } from "@/prelude/url.js";
|
||||
import { redisClient } from "@/db/redis.js";
|
||||
import type { NoteEdit } from "@/models/entities/note-edit.js";
|
||||
|
|
|
@ -4,7 +4,7 @@ import type { User } from "@/models/entities/user.js";
|
|||
import { toPuny } from "backend-rs";
|
||||
import { awaitAll } from "@/prelude/await-all.js";
|
||||
import type { Packed } from "@/misc/schema.js";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import { query, appendQuery } from "@/prelude/url.js";
|
||||
import { Users, DriveFolders } from "../index.js";
|
||||
import { deepClone } from "@/misc/clone.js";
|
||||
|
|
|
@ -2,7 +2,7 @@ import { In, Not } from "typeorm";
|
|||
import Ajv from "ajv";
|
||||
import type { ILocalUser, IRemoteUser } from "@/models/entities/user.js";
|
||||
import { User } from "@/models/entities/user.js";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import type { Packed } from "@/misc/schema.js";
|
||||
import type { Promiseable } from "@/prelude/await-all.js";
|
||||
import { awaitAll } from "@/prelude/await-all.js";
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
|
||||
export const packedFederationInstanceSchema = {
|
||||
type: "object",
|
||||
|
|
|
@ -1,11 +1,10 @@
|
|||
import type httpSignature from "@peertube/http-signature";
|
||||
import { v4 as uuid } from "uuid";
|
||||
|
||||
import config from "@/config/index.js";
|
||||
import { config, envOption } from "@/config.js";
|
||||
import type { DriveFile } from "@/models/entities/drive-file.js";
|
||||
import type { IActivity } from "@/remote/activitypub/type.js";
|
||||
import type { Webhook, webhookEventTypes } from "@/models/entities/webhook.js";
|
||||
import { envOption } from "@/config/index.js";
|
||||
|
||||
import processDeliver from "./processors/deliver.js";
|
||||
import processInbox from "./processors/inbox.js";
|
||||
|
@ -24,10 +23,9 @@ import {
|
|||
objectStorageQueue,
|
||||
endedPollNotificationQueue,
|
||||
webhookDeliverQueue,
|
||||
backgroundQueue,
|
||||
} from "./queues.js";
|
||||
import type { ThinUser } from "./types.js";
|
||||
import { Note } from "@/models/entities/note.js";
|
||||
import type { Note } from "@/models/entities/note.js";
|
||||
|
||||
function renderError(e: Error): any {
|
||||
return {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import Bull from "bull";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
|
||||
export function initialize<T>(name: string, limitPerSec = -1) {
|
||||
return new Bull<T>(name, {
|
||||
|
|
|
@ -9,7 +9,7 @@ import { format as dateFormat } from "date-fns";
|
|||
import { Users, Emojis } from "@/models/index.js";
|
||||
import { createTemp, createTempDir } from "@/misc/create-temp.js";
|
||||
import { downloadUrl } from "@/misc/download-url.js";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import { IsNull } from "typeorm";
|
||||
import { inspect } from "node:util";
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ import Logger from "@/services/logger.js";
|
|||
import type { WebhookDeliverJobData } from "../types.js";
|
||||
import { getResponse, StatusError } from "@/misc/fetch.js";
|
||||
import { Webhooks } from "@/models/index.js";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
|
||||
const logger = new Logger("webhook");
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import { initialize as initializeQueue } from "./initialize.js";
|
||||
import type {
|
||||
DeliverJobData,
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import { URL } from "url";
|
||||
import httpSignature, { IParsedSignature } from "@peertube/http-signature";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import { fetchMeta } from "backend-rs";
|
||||
import { toPuny } from "backend-rs";
|
||||
import DbResolver from "@/remote/activitypub/db-resolver.js";
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import escapeRegexp from "escape-regexp";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import type { Note } from "@/models/entities/note.js";
|
||||
import type {
|
||||
CacheableRemoteUser,
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import type { CacheableRemoteUser } from "@/models/entities/user.js";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import type { IFlag } from "../../type.js";
|
||||
import { getApIds } from "../../type.js";
|
||||
import { AbuseUserReports, Users } from "@/models/index.js";
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import type { User } from "@/models/entities/user.js";
|
||||
|
||||
export default (object: any, user: { id: User["id"]; host: null }) => ({
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import type { ILocalUser } from "@/models/entities/user.js";
|
||||
|
||||
export default (user: ILocalUser, target: any, object: any) => ({
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import type { Note } from "@/models/entities/note.js";
|
||||
|
||||
export default (object: any, note: Note) => {
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import type { Blocking } from "@/models/entities/blocking.js";
|
||||
|
||||
/**
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import type { Note } from "@/models/entities/note.js";
|
||||
|
||||
export default (object: any, note: Note) => {
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import type { User } from "@/models/entities/user.js";
|
||||
|
||||
export default (object: any, user: { id: User["id"]; host: null }) => ({
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import type { Emoji } from "@/models/entities/emoji.js";
|
||||
|
||||
export default (emoji: Emoji) => ({
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import type { ILocalUser } from "@/models/entities/user.js";
|
||||
|
||||
// to anonymise reporters, the reporting actor must be a system user
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import type { Relay } from "@/models/entities/relay.js";
|
||||
import type { ILocalUser } from "@/models/entities/user.js";
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import { Users } from "@/models/index.js";
|
||||
import type { User } from "@/models/entities/user.js";
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import type { User } from "@/models/entities/user.js";
|
||||
import { Users } from "@/models/index.js";
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
|
||||
export default (tag: string) => ({
|
||||
type: "Hashtag",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import { v4 as uuid } from "uuid";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import { getUserKeypair } from "@/misc/keypair-store.js";
|
||||
import type { User } from "@/models/entities/user.js";
|
||||
import { LdSignature } from "../misc/ld-signature.js";
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import type { ILocalUser } from "@/models/entities/user.js";
|
||||
import type { UserKeypair } from "@/models/entities/user-keypair.js";
|
||||
import { createPublicKey } from "node:crypto";
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import { IsNull } from "typeorm";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import type { NoteReaction } from "@/models/entities/note-reaction.js";
|
||||
import type { Note } from "@/models/entities/note.js";
|
||||
import { Emojis } from "@/models/index.js";
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import type { User, ILocalUser } from "@/models/entities/user.js";
|
||||
import { Users } from "@/models/index.js";
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import { In, IsNull } from "typeorm";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import type { Note, IMentionedRemoteUsers } from "@/models/entities/note.js";
|
||||
import type { DriveFile } from "@/models/entities/drive-file.js";
|
||||
import { DriveFiles, Notes, Users, Emojis, Polls } from "@/models/index.js";
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import { URL } from "node:url";
|
||||
import * as mfm from "mfm-js";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import type { ILocalUser } from "@/models/entities/user.js";
|
||||
import { DriveFiles, UserProfiles } from "@/models/index.js";
|
||||
import { getUserKeypair } from "@/misc/keypair-store.js";
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import type { User } from "@/models/entities/user.js";
|
||||
import type { Note } from "@/models/entities/note.js";
|
||||
import type { Poll } from "@/models/entities/poll.js";
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import type { User } from "@/models/entities/user.js";
|
||||
import type { MessagingMessage } from "@/models/entities/messaging-message.js";
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import type { User } from "@/models/entities/user.js";
|
||||
|
||||
export default (object: any, user: { id: User["id"] }) => ({
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import type { User } from "@/models/entities/user.js";
|
||||
|
||||
export default (user: { id: User["id"] }, target: any, object: any) => ({
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import type { User } from "@/models/entities/user.js";
|
||||
|
||||
export default (object: any, user: { id: User["id"] }) => {
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import type { User } from "@/models/entities/user.js";
|
||||
|
||||
export default (object: any, user: { id: User["id"] }) => {
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import type { Note } from "@/models/entities/note.js";
|
||||
import type { IRemoteUser, User } from "@/models/entities/user.js";
|
||||
import type { PollVote } from "@/models/entities/poll-vote.js";
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import { getUserKeypair } from "@/misc/keypair-store.js";
|
||||
import type { User, ILocalUser } from "@/models/entities/user.js";
|
||||
import { StatusError, getResponse } from "@/misc/fetch.js";
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import type { ILocalUser } from "@/models/entities/user.js";
|
||||
import { getInstanceActor } from "@/services/instance-actor.js";
|
||||
import { fetchMeta } from "backend-rs";
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import { URL } from "node:url";
|
||||
import chalk from "chalk";
|
||||
import { IsNull } from "typeorm";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import type { User, IRemoteUser } from "@/models/entities/user.js";
|
||||
import { Users } from "@/models/index.js";
|
||||
import { toPuny } from "backend-rs";
|
||||
|
|
|
@ -31,7 +31,7 @@ import Following from "./activitypub/following.js";
|
|||
import Followers from "./activitypub/followers.js";
|
||||
import Outbox, { packActivity } from "./activitypub/outbox.js";
|
||||
import { serverLogger } from "./index.js";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import Koa from "koa";
|
||||
import * as crypto from "node:crypto";
|
||||
import { inspect } from "node:util";
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import { IsNull } from "typeorm";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import { renderActivity } from "@/remote/activitypub/renderer/index.js";
|
||||
import renderOrderedCollection from "@/remote/activitypub/renderer/ordered-collection.js";
|
||||
import renderNote from "@/remote/activitypub/renderer/note.js";
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import { IsNull, LessThan } from "typeorm";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import * as url from "@/prelude/url.js";
|
||||
import { renderActivity } from "@/remote/activitypub/renderer/index.js";
|
||||
import renderOrderedCollection from "@/remote/activitypub/renderer/ordered-collection.js";
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import { LessThan, IsNull } from "typeorm";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import * as url from "@/prelude/url.js";
|
||||
import { renderActivity } from "@/remote/activitypub/renderer/index.js";
|
||||
import renderOrderedCollection from "@/remote/activitypub/renderer/ordered-collection.js";
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import { Brackets, IsNull } from "typeorm";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import { renderActivity } from "@/remote/activitypub/renderer/index.js";
|
||||
import renderOrderedCollection from "@/remote/activitypub/renderer/ordered-collection.js";
|
||||
import renderOrderedCollectionPage from "@/remote/activitypub/renderer/ordered-collection-page.js";
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import * as crypto from "node:crypto";
|
||||
import * as jsrsasign from "jsrsasign";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
|
||||
const ECC_PRELUDE = Buffer.from([0x04]);
|
||||
const NULL_BYTE = Buffer.from([0]);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import type Koa from "koa";
|
||||
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import type { ILocalUser } from "@/models/entities/user.js";
|
||||
import { Signins } from "@/models/index.js";
|
||||
import { genId } from "backend-rs";
|
||||
|
|
|
@ -8,7 +8,7 @@ import { genId, hashPassword, toPuny } from "backend-rs";
|
|||
import { UserKeypair } from "@/models/entities/user-keypair.js";
|
||||
import { UsedUsername } from "@/models/entities/used-username.js";
|
||||
import { db } from "@/db/postgre.js";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
|
||||
export async function signup(opts: {
|
||||
username: User["username"];
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import { Meta } from "@/models/entities/meta.js";
|
||||
import { insertModerationLog } from "@/services/insert-moderation-log.js";
|
||||
import { db } from "@/db/postgre.js";
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import { fetchMeta } from "backend-rs";
|
||||
import { MAX_NOTE_TEXT_LENGTH, MAX_CAPTION_TEXT_LENGTH } from "@/const.js";
|
||||
import define from "@/server/api/define.js";
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import { v4 as uuid } from "uuid";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import define from "@/server/api/define.js";
|
||||
import { ApiError } from "@/server/api/error.js";
|
||||
import { Apps, AuthSessions } from "@/models/index.js";
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import Parser from "rss-parser";
|
||||
import { getResponse } from "@/misc/fetch.js";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import define from "@/server/api/define.js";
|
||||
|
||||
const rssParser = new Parser();
|
||||
|
|
|
@ -6,7 +6,7 @@ import {
|
|||
AttestationChallenges,
|
||||
Users,
|
||||
} from "@/models/index.js";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import { procedures, hash } from "@/server/api/2fa.js";
|
||||
import { publishMainStream } from "@/services/stream.js";
|
||||
import { verifyPassword } from "backend-rs";
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import * as OTPAuth from "otpauth";
|
||||
import * as QRCode from "qrcode";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import { UserProfiles } from "@/models/index.js";
|
||||
import define from "@/server/api/define.js";
|
||||
import { verifyPassword } from "backend-rs";
|
||||
|
|
|
@ -10,7 +10,7 @@ import deleteFollowing from "@/services/following/delete.js";
|
|||
import create from "@/services/following/create.js";
|
||||
import { getUser } from "@/server/api/common/getters.js";
|
||||
import { Followings, Users } from "@/models/index.js";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import { publishMainStream } from "@/services/stream.js";
|
||||
import { stringToAcct } from "backend-rs";
|
||||
import { inspect } from "node:util";
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import { publishMainStream } from "@/services/stream.js";
|
||||
import define from "@/server/api/define.js";
|
||||
import rndstr from "rndstr";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import { Users, UserProfiles } from "@/models/index.js";
|
||||
import { sendEmail } from "@/services/send-email.js";
|
||||
import { ApiError } from "@/server/api/error.js";
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import JSON5 from "json5";
|
||||
import { IsNull, MoreThan } from "typeorm";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import { fetchMeta } from "backend-rs";
|
||||
import { Ads, Emojis, Users } from "@/models/index.js";
|
||||
import { MAX_NOTE_TEXT_LENGTH, MAX_CAPTION_TEXT_LENGTH } from "@/const.js";
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import rndstr from "rndstr";
|
||||
import { IsNull } from "typeorm";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import { Users, UserProfiles, PasswordResetRequests } from "@/models/index.js";
|
||||
import { sendEmail } from "@/services/send-email.js";
|
||||
import { genId } from "backend-rs";
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import { IsNull } from "typeorm";
|
||||
import { Users, UsedUsernames } from "@/models/index.js";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import define from "@/server/api/define.js";
|
||||
|
||||
export const meta = {
|
||||
|
|
|
@ -12,7 +12,7 @@ import {
|
|||
getClient,
|
||||
} from "./mastodon/ApiMastodonCompatibleService.js";
|
||||
import { AccessTokens, Users } from "@/models/index.js";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import endpoints from "./endpoints.js";
|
||||
import compatibility from "./compatibility.js";
|
||||
import handler from "./api-handler.js";
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import { Entity } from "megalodon";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import { fetchMeta } from "backend-rs";
|
||||
import { Users, Notes } from "@/models/index.js";
|
||||
import { IsNull } from "typeorm";
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import endpoints from "@/server/api/endpoints.js";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import { errors as basicErrors } from "./errors.js";
|
||||
import { schemas, convertSchemaToOpenApiSchema } from "./schemas.js";
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import type Koa from "koa";
|
||||
import * as OTPAuth from "otpauth";
|
||||
import signin from "@/server/api/common/signin.js";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import {
|
||||
Users,
|
||||
Signins,
|
||||
|
|
|
@ -3,7 +3,7 @@ import rndstr from "rndstr";
|
|||
import { verifyHcaptcha, verifyRecaptcha } from "@/misc/captcha.js";
|
||||
import { Users, RegistrationTickets, UserPendings } from "@/models/index.js";
|
||||
import { signup } from "@/server/api/common/signup.js";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import { sendEmail } from "@/services/send-email.js";
|
||||
import { fetchMeta, genId, hashPassword } from "backend-rs";
|
||||
import { validateEmailForAccount } from "@/services/validate-email-for-account.js";
|
||||
|
|
|
@ -13,7 +13,7 @@ import koaLogger from "koa-logger";
|
|||
import * as slow from "koa-slow";
|
||||
|
||||
import { IsNull } from "typeorm";
|
||||
import config, { envOption } from "@/config/index.js";
|
||||
import { config, envOption } from "@/config.js";
|
||||
import Logger from "@/services/logger.js";
|
||||
import { Users } from "@/models/index.js";
|
||||
import { fetchMeta } from "backend-rs";
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import Router from "@koa/router";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import { fetchMeta } from "backend-rs";
|
||||
import { Users, Notes } from "@/models/index.js";
|
||||
import { IsNull, MoreThan } from "typeorm";
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import { Feed } from "feed";
|
||||
import { In, IsNull } from "typeorm";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import type { User } from "@/models/entities/user.js";
|
||||
import { Notes, DriveFiles, UserProfiles, Users } from "@/models/index.js";
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@ import { KoaAdapter } from "@bull-board/koa";
|
|||
|
||||
import { In, IsNull } from "typeorm";
|
||||
import { fetchMeta, metaToPugArgs } from "backend-rs";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import {
|
||||
Users,
|
||||
Notes,
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import type Koa from "koa";
|
||||
import { fetchMeta } from "backend-rs";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import manifest from "./manifest.json" assert { type: "json" };
|
||||
|
||||
export const manifestHandler = async (ctx: Koa.Context) => {
|
||||
|
|
|
@ -2,7 +2,7 @@ import type Koa from "koa";
|
|||
import summaly from "summaly";
|
||||
import { fetchMeta } from "backend-rs";
|
||||
import Logger from "@/services/logger.js";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import { query } from "@/prelude/url.js";
|
||||
import { getJson } from "@/misc/fetch.js";
|
||||
import { inspect } from "node:util";
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import Router from "@koa/router";
|
||||
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import { type Acct, stringToAcct } from "backend-rs";
|
||||
import { links } from "./nodeinfo.js";
|
||||
import { escapeAttribute, escapeValue } from "@/prelude/xml.js";
|
||||
|
|
|
@ -3,7 +3,7 @@ import * as fsPromises from "node:fs/promises";
|
|||
import * as Path from "node:path";
|
||||
import { fileURLToPath } from "node:url";
|
||||
import { dirname } from "node:path";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
|
||||
const _filename = fileURLToPath(import.meta.url);
|
||||
const _dirname = dirname(_filename);
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import { Window } from "happy-dom";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
|
||||
async function getRelMeLinks(url: string): Promise<string[]> {
|
||||
try {
|
||||
|
|
|
@ -6,7 +6,7 @@ import type { User } from "@/models/entities/user.js";
|
|||
import { Blockings, FollowRequests, Users } from "@/models/index.js";
|
||||
import { genId } from "backend-rs";
|
||||
import { createNotification } from "@/services/create-notification.js";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
|
||||
export default async function (
|
||||
follower: {
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import renderAdd from "@/remote/activitypub/renderer/add.js";
|
||||
import renderRemove from "@/remote/activitypub/renderer/remove.js";
|
||||
import { renderActivity } from "@/remote/activitypub/renderer/index.js";
|
||||
|
|
|
@ -2,7 +2,7 @@ import cluster from "node:cluster";
|
|||
import chalk from "chalk";
|
||||
import { default as convertColor } from "color-convert";
|
||||
import { format as dateFormat } from "date-fns";
|
||||
import config, { envOption } from "@/config/index.js";
|
||||
import { config, envOption } from "@/config.js";
|
||||
|
||||
import * as SyslogPro from "syslog-pro";
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import { MessagingMessages, Users } from "@/models/index.js";
|
||||
import type { MessagingMessage } from "@/models/entities/messaging-message.js";
|
||||
import {
|
||||
|
|
|
@ -10,7 +10,7 @@ import renderCreate from "@/remote/activitypub/renderer/create.js";
|
|||
import renderAnnounce from "@/remote/activitypub/renderer/announce.js";
|
||||
import { renderActivity } from "@/remote/activitypub/renderer/index.js";
|
||||
import { resolveUser } from "@/remote/resolve-user.js";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import { updateHashtags } from "@/services/update-hashtag.js";
|
||||
import { concat } from "@/prelude/array.js";
|
||||
import { insertNoteUnread } from "@/services/note/unread.js";
|
||||
|
|
|
@ -5,7 +5,7 @@ import renderAnnounce from "@/remote/activitypub/renderer/announce.js";
|
|||
import renderUndo from "@/remote/activitypub/renderer/undo.js";
|
||||
import { renderActivity } from "@/remote/activitypub/renderer/index.js";
|
||||
import renderTombstone from "@/remote/activitypub/renderer/tombstone.js";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import type { User, ILocalUser, IRemoteUser } from "@/models/entities/user.js";
|
||||
import type { Note, IMentionedRemoteUsers } from "@/models/entities/note.js";
|
||||
import { Notes, Users, Instances } from "@/models/index.js";
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import push from "web-push";
|
||||
import config from "@/config/index.js";
|
||||
import { config } from "@/config.js";
|
||||
import { SwSubscriptions } from "@/models/index.js";
|
||||
import { fetchMeta, getNoteSummary } from "backend-rs";
|
||||
import type { Packed } from "@/misc/schema.js";
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue