refactor (backend): port config loader to backend-rs completely

This commit is contained in:
naskya 2024-04-20 02:07:08 +09:00
parent 1be5373dfc
commit 3b89a8bfa6
No known key found for this signature in database
GPG Key ID: 712D413B3A9FED5C
104 changed files with 375 additions and 262 deletions

View File

@ -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

View File

@ -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

View File

@ -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";

View File

@ -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);

View File

@ -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))

View File

@ -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]

View File

@ -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

View File

@ -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");

View File

@ -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";

View File

@ -0,0 +1,4 @@
import { loadConfig, loadEnv } from "backend-rs";
export const config = loadConfig();
export const envOption = loadEnv();

View File

@ -1,5 +0,0 @@
import load from "./load.js";
import { readEnvironmentConfig } from "backend-rs";
export default load();
export const envOption = readEnvironmentConfig();

View File

@ -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.`);
}
}

View File

@ -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;

View File

@ -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,

View File

@ -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";

View File

@ -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;

View File

@ -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";

View File

@ -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) {

View File

@ -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";

View File

@ -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(

View File

@ -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";

View File

@ -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";

View File

@ -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";

View File

@ -1,4 +1,4 @@
import config from "@/config/index.js";
import { config } from "@/config.js";
export const packedFederationInstanceSchema = {
type: "object",

View File

@ -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 {

View File

@ -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, {

View File

@ -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";

View File

@ -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");

View File

@ -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,

View File

@ -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";

View File

@ -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,

View File

@ -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";

View File

@ -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 }) => ({

View File

@ -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) => ({

View File

@ -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) => {

View File

@ -1,4 +1,4 @@
import config from "@/config/index.js";
import { config } from "@/config.js";
import type { Blocking } from "@/models/entities/blocking.js";
/**

View File

@ -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) => {

View File

@ -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 }) => ({

View File

@ -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) => ({

View File

@ -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

View File

@ -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";

View File

@ -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";

View File

@ -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";

View File

@ -1,4 +1,4 @@
import config from "@/config/index.js";
import { config } from "@/config.js";
export default (tag: string) => ({
type: "Hashtag",

View File

@ -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";

View File

@ -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";

View File

@ -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";

View File

@ -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";

View File

@ -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";

View File

@ -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";

View File

@ -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";

View File

@ -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";

View File

@ -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"] }) => ({

View File

@ -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) => ({

View File

@ -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"] }) => {

View File

@ -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"] }) => {

View File

@ -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";

View File

@ -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";

View File

@ -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";

View File

@ -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";

View File

@ -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";

View File

@ -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";

View File

@ -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";

View File

@ -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";

View File

@ -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";

View File

@ -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]);

View File

@ -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";

View File

@ -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"];

View File

@ -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";

View File

@ -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";

View File

@ -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";

View File

@ -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();

View File

@ -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";

View File

@ -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";

View File

@ -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";

View File

@ -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";

View File

@ -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";

View File

@ -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";

View File

@ -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 = {

View File

@ -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";

View File

@ -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";

View File

@ -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";

View File

@ -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,

View File

@ -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";

View File

@ -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";

View File

@ -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";

View File

@ -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";

View File

@ -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,

View File

@ -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) => {

View File

@ -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";

View File

@ -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";

View File

@ -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);

View File

@ -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 {

View File

@ -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: {

View File

@ -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";

View File

@ -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";

View File

@ -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 {

View File

@ -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";

View File

@ -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";

View File

@ -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