Merge branch 'v2023.12.9'
Some checks are pending
/ test-build (push) Waiting to run

This commit is contained in:
nelle 2024-07-28 19:01:14 -06:00
commit 03e54e88b8
408 changed files with 17480 additions and 20204 deletions

View file

@ -1,5 +1,5 @@
on:
- push
push:
jobs:
test-build:
runs-on: docker
@ -15,19 +15,15 @@ jobs:
image: redis
steps:
- name: Clone repository
run: git clone https://iceshrimp.dev/iceshrimp/iceshrimp.git --branch=${{ github.ref_name }} --depth=1 /iceshrimp
run: git clone https://iceshrimp.dev/iceshrimp/iceshrimp.git --branch=${{ github.ref_name }} --depth=1 .
- name: Install build dependencies
run: |
cd /iceshrimp
cp -Tr /iceshrimp-caches/yarn .yarn
yarn --immutable
rm -rf /iceshrimp-caches/yarn/* && cp -Tr .yarn /iceshrimp-caches/yarn
- name: Build the shrimp
run: |
cd /iceshrimp
yarn build:debug
run: yarn build:debug
- name: Test the shrimp
run: |
cd /iceshrimp
cp .config/ci.yml .config/default.yml
yarn run migrate

828
.pnp.cjs generated

File diff suppressed because it is too large Load diff

52
.pnp.loader.mjs generated
View file

@ -1,9 +1,12 @@
/* eslint-disable */
// @ts-nocheck
import fs from 'fs';
import { URL as URL$1, fileURLToPath, pathToFileURL } from 'url';
import path from 'path';
import { createHash } from 'crypto';
import { EOL } from 'os';
import moduleExports, { isBuiltin } from 'module';
import esmModule, { createRequire, isBuiltin } from 'module';
import assert from 'assert';
const SAFE_TIME = 456789e3;
@ -830,6 +833,12 @@ class ProxiedFS extends FakeFS {
rmdirSync(p, opts) {
return this.baseFs.rmdirSync(this.mapToBase(p), opts);
}
async rmPromise(p, opts) {
return this.baseFs.rmPromise(this.mapToBase(p), opts);
}
rmSync(p, opts) {
return this.baseFs.rmSync(this.mapToBase(p), opts);
}
async linkPromise(existingP, newP) {
return this.baseFs.linkPromise(this.mapToBase(existingP), this.mapToBase(newP));
}
@ -1211,6 +1220,18 @@ class NodeFS extends BasePortableFakeFS {
rmdirSync(p, opts) {
return this.realFs.rmdirSync(npath.fromPortablePath(p), opts);
}
async rmPromise(p, opts) {
return await new Promise((resolve, reject) => {
if (opts) {
this.realFs.rm(npath.fromPortablePath(p), opts, this.makeCallback(resolve, reject));
} else {
this.realFs.rm(npath.fromPortablePath(p), this.makeCallback(resolve, reject));
}
});
}
rmSync(p, opts) {
return this.realFs.rmSync(npath.fromPortablePath(p), opts);
}
async linkPromise(existingP, newP) {
return await new Promise((resolve, reject) => {
this.realFs.link(npath.fromPortablePath(existingP), npath.fromPortablePath(newP), this.makeCallback(resolve, reject));
@ -1403,6 +1424,8 @@ const URL = Number(process.versions.node.split('.', 1)[0]) < 20 ? URL$1 : global
const [major, minor] = process.versions.node.split(`.`).map((value) => parseInt(value, 10));
const WATCH_MODE_MESSAGE_USES_ARRAYS = major > 19 || major === 19 && minor >= 2 || major === 18 && minor >= 13;
const HAS_LAZY_LOADED_TRANSLATORS = major === 20 && minor < 6 || major === 19 && minor >= 3;
const SUPPORTS_IMPORT_ATTRIBUTES = major >= 21 || major === 20 && minor >= 10 || major === 18 && minor >= 20;
const SUPPORTS_IMPORT_ATTRIBUTES_ONLY = major >= 22;
function readPackageScope(checkPath) {
const rootSeparatorIndex = checkPath.indexOf(npath.sep);
@ -1493,10 +1516,21 @@ async function load$1(urlString, context, nextLoad) {
const format = getFileFormat(filePath);
if (!format)
return nextLoad(urlString, context, nextLoad);
if (format === `json` && context.importAssertions?.type !== `json`) {
const err = new TypeError(`[ERR_IMPORT_ASSERTION_TYPE_MISSING]: Module "${urlString}" needs an import assertion of type "json"`);
err.code = `ERR_IMPORT_ASSERTION_TYPE_MISSING`;
throw err;
if (format === `json`) {
if (SUPPORTS_IMPORT_ATTRIBUTES_ONLY) {
if (context.importAttributes?.type !== `json`) {
const err = new TypeError(`[ERR_IMPORT_ATTRIBUTE_MISSING]: Module "${urlString}" needs an import attribute of "type: json"`);
err.code = `ERR_IMPORT_ATTRIBUTE_MISSING`;
throw err;
}
} else {
const type = `importAttributes` in context ? context.importAttributes?.type : context.importAssertions?.type;
if (type !== `json`) {
const err = new TypeError(`[ERR_IMPORT_ASSERTION_TYPE_MISSING]: Module "${urlString}" needs an import ${SUPPORTS_IMPORT_ATTRIBUTES ? `attribute` : `assertion`} of type "json"`);
err.code = `ERR_IMPORT_ASSERTION_TYPE_MISSING`;
throw err;
}
}
}
if (process.env.WATCH_REPORT_DEPENDENCIES && process.send) {
const pathToSend = pathToFileURL(
@ -1941,6 +1975,13 @@ function packageImportsResolve({ name, base, conditions, readFileSyncFn }) {
throwImportNotDefined(name, packageJSONUrl, base);
}
let findPnpApi = esmModule.findPnpApi;
if (!findPnpApi) {
const require = createRequire(import.meta.url);
const pnpApi = require(`./.pnp.cjs`);
pnpApi.setup();
findPnpApi = esmModule.findPnpApi;
}
const pathRegExp = /^(?![a-zA-Z]:[\\/]|\\\\|\.{0,2}(?:\/|$))((?:node:)?(?:@[^/]+\/)?[^/]+)\/*(.*|)$/;
const isRelativeRegexp = /^\.{0,2}\//;
function tryReadFile(filePath) {
@ -1968,7 +2009,6 @@ async function resolvePrivateRequest(specifier, issuer, context, nextResolve) {
}
}
async function resolve$1(originalSpecifier, context, nextResolve) {
const { findPnpApi } = moduleExports;
if (!findPnpApi || isBuiltin(originalSpecifier))
return nextResolve(originalSpecifier, context, nextResolve);
let specifier = originalSpecifier;

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f55f261eeccf10a7439daaece365db141f635a7e9a1f9016e00ab8f28943399f
size 91230

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2813f320e458788fe0798d2ccfcda5761be9356459aead4956f33c948d3c488b
size 22555

BIN
.yarn/cache/@img-sharp-darwin-arm64-npm-0.33.4-061afc6886-10.zip (Stored with Git LFS) vendored Normal file

Binary file not shown.

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:723b51d409908aa6afafeca67892dc83b016696018d449e18a81d11bd1110b95
size 106850

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:e00b4d72355e50af073adb1d02fcae5f858e91ab2323022f560b0fff36f3d5cb
size 7008013

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0ffccca8cd6273fcc7a24fc1ec2cc621247c31e6d69dfe6200190186653d8330
size 7894090

BIN
.yarn/cache/@img-sharp-libvips-linux-arm64-npm-1.0.2-a3a6e66f3b-10.zip (Stored with Git LFS) vendored Normal file

Binary file not shown.

BIN
.yarn/cache/@img-sharp-libvips-linux-x64-npm-1.0.2-69e740ab3d-10.zip (Stored with Git LFS) vendored Normal file

Binary file not shown.

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2bfedd5b2cfa0952e02cdd4d72f83e32df9de82db18cf5195e16f72891d815ac
size 7099479

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:737651fc2b1963b06609484ac20fedd163bdd57b51ab4eb693cd506d5841695a
size 7204642

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:80752717166479cd78d3a4477293e80d7d96de70a09785489f51b86bc177296e
size 107298

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:37df8739ba92bd891180a9fe4aa2a372cfd4ea92223bd14ccc5f0526661df978
size 114780

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:507a08f66569fb890d3459241a989b257ae758b7cec2014ee18d4574f4233a61
size 111591

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:bb0ca07851c9935e2889d79d613591929b83d9274b8636e247665ca1a1c6f57f
size 118348

Binary file not shown.

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:efc418b0cc9ffe3683b1cf5f5c2be1f614a8babd885446b88111c9f2f8308379
size 168922

BIN
.yarn/cache/chalk-npm-4.0.0-50e5418ea0-f8ae363f43.zip (Stored with Git LFS) vendored

Binary file not shown.

BIN
.yarn/cache/chownr-npm-1.1.4-5bd400ab08-115648f8eb.zip (Stored with Git LFS) vendored

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:23b86d525b50e2419c6def32d652247d834dac64ca9e61f89b7d893febfbca34
size 9395

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
.yarn/cache/nan-npm-2.18.0-a51ed5bed5-5520e22c64.zip (Stored with Git LFS) vendored

Binary file not shown.

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:bb4ff42d414f1c2a732d520e2b25bedf23587ff4d22cf672519bf53b83ddc0dd
size 99593

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
.yarn/cache/rc-npm-1.2.8-d6768ac936-5c4d72ae7e.zip (Stored with Git LFS) vendored

Binary file not shown.

BIN
.yarn/cache/re2-npm-1.20.11-ab65de125e-a8665c861c.zip (Stored with Git LFS) vendored Normal file

Binary file not shown.

BIN
.yarn/cache/re2-npm-1.20.9-65a014d791-0ecd9f849b.zip (Stored with Git LFS) vendored

Binary file not shown.

BIN
.yarn/cache/semver-npm-7.6.2-0fec6944bb-296b17d027.zip (Stored with Git LFS) vendored Normal file

Binary file not shown.

BIN
.yarn/cache/sharp-npm-0.32.1-5af640fc49-07df854f3d.zip (Stored with Git LFS) vendored

Binary file not shown.

BIN
.yarn/cache/sharp-npm-0.33.4-afc15185a7-f396d1363d.zip (Stored with Git LFS) vendored Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
.yarn/cache/summaly-npm-2.7.0-e25bfbf6a2-ce49173396.zip (Stored with Git LFS) vendored

Binary file not shown.

BIN
.yarn/cache/tar-fs-npm-2.1.1-e374d3b7a2-526deae025.zip (Stored with Git LFS) vendored

Binary file not shown.

Binary file not shown.

BIN
.yarn/cache/uuid-npm-7.0.3-2b088bd924-b2a4d30ecd.zip (Stored with Git LFS) vendored

Binary file not shown.

BIN
.yarn/cache/uuid-npm-9.0.1-39a8442bc6-9d0b6adb72.zip (Stored with Git LFS) vendored Normal file

Binary file not shown.

BIN
.yarn/corepack.tgz (Stored with Git LFS)

Binary file not shown.

View file

@ -1,3 +1,61 @@
## v2023.12.9
This release contains a security patch, as well as minor fixes and improvements. Upgrading is strongly recommended for all server operators.
### Highlights
- Several DoS vulnerabilities - allowing remote attackers to allocate arbitrary amounts of memory - were patched
- Corrupt jobs now get discarded instead of clogging up the failed queues
### Backend
- Fetched JSON-LD contexts are now limited to 1MiB, resolving a DoS attack vector
- Fetched node-fetch responses are now limited to 1MiB/10MiB, resolving a DoS attack vector
### Miscellaneous
- The docker images now use the bundled libvips version shipping with sharp instead of the system-wide one, reducing the image size by ~60MB
- The example docker-compose.yml file was updated
- The iceshrimp-js package was renamed to iceshrimp-sdk in order to prevent confusion should this repository be renamed to iceshrimp-js in the future (to distinguish it from Iceshrimp.NET)
- Various dependency updates
- Various translation updates
### Attribution
This release was made possible by project contributors: AntoineÐ & Laura Hausmann
## v2023.12.8
This release contains minor fixes and improvements. Upgrading is recommended for all server operators.
### Highlights
- AiScript has been updated to v0.17.0
- Several new MFM functions have been added
### Backend
- Pinned notes are rendered as links instead of objects, improving privacy
- Sporadic errors while scrolling through followers/following lists were fixed
- The link preview generator now sends a proper user agent instead of identifying itself as a generic bot
- The home timeline query heuristic now gets reset when follow lists are being imported, resolving a timeline performance edge case
### Mastodon client API
- The verify_credentials response now includes the follow_requests_count property, improving compatibiltiy with certain Mastodon clients
- Attachments will now fall back to their full res version if they don't have a thumbnail, fixing a crash with the official Mastodon for Android app
### Frontend
- The placeholder timetravel buttons have been removed
- The experiments page has been removed
### Miscellaneous
- The helm chart was updated and now has more configuration options
- The yarn version was updated to v4.3.1
- The README was updated to better reflect the current development situation in relation to the rewrite
- The project now builds against NodeJS 22
- The dockerfile was updated & now builds against alpine 3.20
- Backend dependencies have been updated
- The recommended key/value store was switched to valkey
- The CI configuration has been updated
- Various translation updates
### Attribution
This release was made possible by project contributors: AverageDood, Gersonzao, Kopper, Laura Hausmann, Mae Dartmann, Pyrox, Tournesol, ari melody, limepotato, mia & zotan
It also includes cherry-picked contributions from external contributors: naskya (firefish), ChaoticLeah (cutiekey)
## v2023.12.7
This is a security release. Upgrading is therefore strongly recommended.
@ -718,4 +776,4 @@ It also includes cherry-picked contributions from external contributors: Namekuj
---
This file lists all major changes made since the fork from Firefish on 2023-07-21. For changes prior to that date, please reference the [Firefish](https://git.joinfirefish.org/firefish/firefish/-/tree/76ad0a19b3a64eaecb4da31f20c229e423ee2095/) repository.
This file lists all major changes made since the fork from Firefish on 2023-07-21. For changes prior to that date, please reference the [Firefish](https://firefish.dev/firefish/firefish/-/tree/76ad0a19b3a64eaecb4da31f20c229e423ee2095/) repository.

View file

@ -1,10 +1,10 @@
# syntax = docker/dockerfile:1.2
## Install dev and compilation dependencies, build files
FROM alpine:3.18 as build
FROM alpine:3.20 as build
WORKDIR /iceshrimp
# Install compilation dependencies
RUN apk add --no-cache --no-progress git alpine-sdk vips-dev python3 nodejs-current npm vips
RUN apk add --no-cache --no-progress git alpine-sdk python3 py3-setuptools nodejs-current npm
# Copy in all files for the build
COPY . ./
@ -31,11 +31,11 @@ RUN yarn focus-production
RUN --mount=type=cache,target=/iceshrimp/.yarncache_focused rm -rf .yarncache/* && cp -r .yarn/. .yarncache_focused
## Runtime container
FROM alpine:3.18
FROM alpine:3.20
WORKDIR /iceshrimp
# Install runtime dependencies
RUN apk add --no-cache --no-progress tini ffmpeg vips-dev zip unzip nodejs-current libheif-dev
RUN apk add --no-cache --no-progress tini ffmpeg zip unzip nodejs-current libheif-dev
# Copy built files
COPY --from=build /iceshrimp /iceshrimp

View file

@ -57,7 +57,7 @@
- Check out [FediDB](https://fedidb.org/software/iceshrimp) or [Fediverse Observer](https://iceshrimp.fediverse.observer/list) to get an overview of the instances that are out there.
- Please note that we do not operate a "flagship instance", the only project-affiliated domain is `iceshrimp.dev`.
- Want to donate to the project?
- Our backend lead dev (zotan) is in need of a better laptop, as their current one does not have enough memory. You can contribute [here](https://bunq.me/zotanlaptopcrowdfund). Any leftover money will be given to queers in need.
- Our frontend dev (Lilian) needs help paying for healthcare costs. You can contribute [here](https://bunq.me/lilianhealthcarefund). Money from the fund will be used for co-pays, and medical expenses not covered by insurance.
- Need help or want to contribute? Join the [chat room](https://chat.iceshrimp.dev)!
---

View file

@ -8,7 +8,7 @@
},
"formatter": {
"ignore": [
"packages/iceshrimp-js/api-extractor.json",
"packages/iceshrimp-sdk/api-extractor.json",
"packages/*/tsconfig.json",
"packages/*/built",
"packages/*/package-lock.json",

View file

@ -15,7 +15,7 @@ type: application
# This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version.
# Versions are expected to follow Semantic Versioning (https://semver.org/)
version: 0.1.2
version: 0.1.4
# This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application. Versions are not expected to

View file

@ -31,6 +31,7 @@ A fun, new, open way to experience social media https://iceshrimp.dev
| iceshrimp.libreTranslate.apiKey | string | `""` | |
| iceshrimp.libreTranslate.apiUrl | string | `""` | |
| iceshrimp.libreTranslate.managed | bool | `false` | |
| iceshrimp.maxNoteLength | integer | `3000` | Max note length |
| iceshrimp.objectStorage.access_key | string | `""` | |
| iceshrimp.objectStorage.access_secret | string | `""` | |
| iceshrimp.objectStorage.baseUrl | string | `""` | |
@ -51,6 +52,7 @@ A fun, new, open way to experience social media https://iceshrimp.dev
| iceshrimp.smtp.port | int | `587` | |
| iceshrimp.smtp.server | string | `"smtp.mailgun.org"` | |
| iceshrimp.smtp.useImplicitSslTls | bool | `false` | |
| iceshrimp.strategy | object | `{}` | Override DeploymentStrategy for Iceshrimp |
| elasticsearch | object | `{"auth":{},"enabled":false,"hostname":"","port":9200,"ssl":false}` | https://github.com/bitnami/charts/tree/master/bitnami/elasticsearch#parameters |
| fullnameOverride | string | `""` | |
| image.pullPolicy | string | `"IfNotPresent"` | |

View file

@ -211,7 +211,7 @@ id: 'aid'
#───┘ Other configuration └─────────────────────────────────────
# Max note length, should be < 8000.
#maxNoteLength: 3000
maxNoteLength: {{ .Values.iceshrimp.maxNoteLength | default 3000 }}
# Maximum lenght of an image caption or file comment (default 1500, max 8192)
#maxCaptionLength: 1500

View file

@ -5,9 +5,15 @@ metadata:
labels:
{{- include "iceshrimp.labels" . | nindent 4 }}
spec:
{{- if not .Values.autoscaling.enabled }}
{{- if not .Values.autoscaling.enabled }}
replicas: {{ .Values.replicaCount }}
{{- end }}
{{- if .Values.iceshrimp.deploymentStrategy }}
strategy:
{{- toYaml .Values.iceshrimp.deploymentStrategy | nindent 4 }}
{{- end }}
selector:
matchLabels:
{{- include "iceshrimp.selectorLabels" . | nindent 6 }}

View file

@ -54,6 +54,13 @@ iceshrimp:
helm.sh/resource-policy: keep
size: 10Gi
# Deployment strategy (optional), see https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#strategy
# deploymentStrategy:
# type: RollingUpdate
# rollingUpdate:
# maxUnavailable: 0
# maxSurge: 1
# -- If you want to allow iceshrimp to connect to private ips, enter the cidrs here.
allowedPrivateNetworks: []
# - "10.0.0.0/8"
@ -68,6 +75,9 @@ iceshrimp:
# Number of worker processes per replica
clusterLimit: 1
# Max note length
maxNoteLength: 3000
# https://github.com/bitnami/charts/tree/master/bitnami/postgresql#parameters
postgresql:
# -- disable if you want to use an existing db; in which case the values below

View file

@ -22,7 +22,7 @@ services:
redis:
restart: always
container_name: iceshrimp_redis
image: docker.io/redis:7.0-alpine
image: docker.io/valkey/valkey:7-alpine
networks:
- network
volumes:

View file

@ -2,4 +2,4 @@
You can find interactive API documentation at any Iceshrimp instance. https://iceshrimp.social/api-doc
You can also find auto-generated documentation for iceshrimp-js [here](../packages/iceshrimp-js/markdown/iceshrimp-js.md).
You can also find auto-generated documentation for iceshrimp-sdk [here](../packages/iceshrimp-sdk/markdown/iceshrimp-sdk.md).

View file

@ -28,7 +28,7 @@ services:
redis:
restart: unless-stopped
image: docker.io/redis:7.0-alpine
image: docker.io/valkey/valkey:7-alpine
container_name: iceshrimp_redis
networks:
- ishnet
@ -37,7 +37,7 @@ services:
db:
restart: unless-stopped
image: docker.io/postgres:12.2-alpine
image: docker.io/postgres:16-alpine
container_name: iceshrimp_db
networks:
- ishnet

View file

@ -14,7 +14,7 @@ This document will guide you through manual installation of Iceshrimp. We also p
- [**Node.js**](https://nodejs.org) v18.16.0+ (v20 recommended)
- [**PostgreSQL**](https://www.postgresql.org/) 12+ (including modules, usually packaged as postgresql-contrib)
- [**Redis**](https://redis.io/) 6+
- [**Valkey**](https://valkey.io/) (or any other Redis 6 compatible fork)
- [**libvips**](https://www.libvips.org/)
- **Web proxy**
- nginx

View file

@ -2092,15 +2092,6 @@ preventAiLearning: Evita l'indexació dels bots
preventAiLearningDescription: Sol·liciteu que els models de llenguatge d'IA de tercers
no estudiïn el contingut que pengeu, com ara publicacions i imatges.
pwa: Instal·lar PWA
_experiments:
alpha: Alfa
beta: Beta
release: Publicà
title: Experiments
enablePostImports: Activar l'importació de publicacions
postImportsCaption: Permet els usuaris importar publicacions desde comptes a Iceshrimp,
Iceshrimp, Mastodon, Akkoma i Pleroma. Pot fer que el servidor vagi més lent durant
la càrrega si tens un coll d'ampolla a la cua.
noGraze: Si us plau, desactiva l'extensió del navegador "Graze for Mastodon", ja que
interfereix amb Iceshrimp.
accessibility: Accessibilitat

View file

@ -2101,12 +2101,6 @@ accessibility: Erreichbarkeit
jumpToPrevious: Zum Vorherigen springen
silencedWarning: Diese Meldung wird angezeigt, weil diese Nutzer von Servern stammen,
die Ihr Administrator abgeschaltet hat, so dass es sich möglicherweise um Spam handelt.
_experiments:
title: Funktionstests
enablePostImports: Beitragsimporte aktivieren
postImportsCaption: Erlaubt es Nutzer:innen ihre Posts von alten Iceshrimp, Iceshrimp,
Mastodon, Akkoma und Pleroma Accounts zu importieren. Bei Engpässen in der Warteschlange
kann es zu Verlangsamungen beim Laden während des Imports kommen.
noGraze: Bitte deaktivieren Sie die Browsererweiterung "Graze for Mastodon", da sie
die Funktion von Iceshrimp stört.
indexFrom: Indexieren ab Beitragskennung aufwärts

View file

@ -1344,6 +1344,15 @@ _mfm:
plain: "Plain"
plainDescription: "Deactivates the effects of all MFM contained within this MFM
effect."
border: "Border"
borderDescription: "Adds a border around content."
ruby: "Ruby"
rubyDescription: "Render a small annotation above text, Usually used for showing pronounciations of East Asian characters."
unixtime: "Unix Time"
unixtimeDescription: "Convert a number of seconds since 1st of January, 1970 to a readable date."
followmouse: "Follow Mouse"
followmouseDescription: "Make content follow the mouse cursor."
followmouseToggle: "Toggle preview"
_instanceTicker:
none: "Never show"
remote: "Show for remote creatures"
@ -2148,12 +2157,6 @@ _deck:
channel: "Channel"
mentions: "Mentions"
direct: "Direct messages"
_experiments:
title: "Experiments"
enablePostImports: "Enable beep imports"
postImportsCaption: "Allows creatures to import their beeps from past Jörmungandr, Misskey,
Mastodon, Akkoma, and Pleroma accounts. It may cause slowdowns during load if
your queue is bottlenecked."
_dialog:
charactersExceeded: "Max characters exceeded! Current: {current}/Limit: {max}"
charactersBelow: "Not enough characters! Current: {current}/Limit: {min}"

View file

@ -447,7 +447,7 @@ title: "Título"
text: "Texto"
enable: "Activar"
next: "Siguiente"
retype: "Intentar de nuevo"
retype: "otra vez"
noteOf: "Publicaciones de {user}"
inviteToGroup: "Invitar al grupo"
quoteAttached: "Cita añadida"
@ -468,9 +468,9 @@ weakPassword: "Contraseña débil"
normalPassword: "Contraseña aceptable"
strongPassword: "Contraseña fuerte"
passwordMatched: "Coincide"
passwordNotMatched: "Las contraseñas no coinciden"
passwordNotMatched: "No coincide"
signinWith: "Inicia sesión con {x}"
signinFailed: "Autenticación fallida. Asegúrate de haber usado el nombre de usuario
signinFailed: "Inicio de sesión fallido. Asegúrate de haber usado el nombre de usuario
y contraseña correctos."
tapSecurityKey: "Toque la clave de seguridad"
or: "O"
@ -2188,12 +2188,6 @@ _feeds:
copyFeed: Copiar feed
rss: RSS
atom: Atom
_experiments:
title: Experimentos
enablePostImports: Activar importaciones de publicaciones
postImportsCaption: Permite a los usuarios importar publicaciones de cuentas antiguas
de Iceshrimp, Misskey, Mastodon, Akkoma y Pleroma. Puede que cause ralentizaciones
durante la carga si sufres cuello de botella.
_skinTones:
mediumDark: Medio oscuro
dark: Oscuro

View file

@ -993,9 +993,9 @@ _registry:
domain: "Domaine"
createKey: "Créer une clé"
_aboutIceshrimp:
about: "Iceshrimp est un média social décentralisé et fédéré utilisant ActivityPub.\n\
C'est un fork de Calckey/Firefish (lui-même fork de Misskey) qui se concentre
sur la stabilité, les performances et la facilité d'utilisation plutôt que sur
about: "Iceshrimp est un média social décentralisé et fédéré utilisant ActivityPub.\n
Cest un fork de Calckey/Firefish (lui-même fork de Misskey) qui se concentre
sur la stabilité, les performances et la facilité dutilisation plutôt que sur
de nouvelles fonctionnalités."
contributors: "Principaux contributeurs"
allContributors: "Tous les contributeurs"
@ -1114,6 +1114,17 @@ _mfm:
backgroundDescription: Changer la couleur darrière-plan dun texte.
background: Couleur darrière-plan
plain: Simple
border: Bordure
rubyDescription: Affiche une petite annotation au-dessus du texte, généralement
utilisée pour afficher les prononciations des caractères dAsie de lEst.
borderDescription: Ajoute une bordure autour du contenu.
ruby: Rubis
unixtime: Heure Unix (Posix)
unixtimeDescription: Convertit un nombre de secondes depuis le 1er janvier 1970
en une date lisible.
followmouse: Suivre la souris
followmouseDescription: Faire en sorte que le contenu suive le curseur de la souris.
followmouseToggle: Afficher/Masquer laperçu
_instanceTicker:
none: "Cacher"
remote: "Montrer pour les utilisateur·ice·s distant·e·s"
@ -2103,15 +2114,6 @@ editNote: Modifier publication
edited: "Modifié à {date} {time}"
flagShowTimelineRepliesDescription: Si activé, affiche dans le fil les réponses des
utilisatieur·rice·s aux publications des autres.
_experiments:
alpha: Alpha
beta: Beta
enablePostImports: Autoriser limportation de publications
title: Expérimentations
postImportsCaption: Permet aux utilisateurs dimporter leurs publications à partir
de leurs anciens comptes Iceshrimp, Misskey, Mastodon, Akkoma et Pleroma. Cela
peut entraîner des ralentissements lors du chargement si votre file dattente
est congestionnée.
findOtherInstance: Trouver une autre instance
userSaysSomethingReasonQuote: "{name} a cité une publication contenant {reason}"
signupsDisabled: Les inscriptions sur cette instance sont actuellement désactivés,
@ -2215,7 +2217,7 @@ _filters:
matchOptions: Modifier la sensibilité à la casse et/ou activer la correspondance
exacte avec une suite de caractères
info: Nomenclature
info2: Un tiret entre crochets [-] indique la possibilité d'inverser/négativer
info2: Un tiret entre crochets [-] indique la possibilité dinverser/négativer
un filtre avec le caractère tiret -
infoEnd: Filtrer par aliases
replyTo: En réponse à
@ -2263,10 +2265,10 @@ cwStyle: Apparence des «Avertissement de contenu»
collapseAllCws: Cacher le contenu de toutes les réponses
searchNotLoggedIn_1: Vous devez être authentifié pour pouvoir utiliser la recherche
en texte intégral.
searchNotLoggedIn_2: Toutefois, vous pouvez effectuer des recherches à l'aide de hashtags
searchNotLoggedIn_2: Toutefois, vous pouvez effectuer des recherches à laide de hashtags
et rechercher des utilisateurs.
antennaTimelineHint: Les antennes affichent les messages correspondants dans l'ordre
dans lequel ils ont été reçus, ce qui n'est pas nécessairement chronologique.
antennaTimelineHint: Les antennes affichent les messages correspondants dans lordre
dans lequel ils ont été reçus, ce qui nest pas nécessairement chronologique.
alwaysExpandCws: Toujours dérouler les messages avec des avertissements sur le contenu
hideFromHome: Cacher de la timeline «Principal»
_wellness:

View file

@ -1898,11 +1898,6 @@ noteId: 投稿のID
hiddenTagsDescription: 'トレンドと「みつける」から除外したいハッシュタグを(先頭の # を除いて)改行区切りで入力してください。この設定はトレンドと「みつける」以外には影響しません。'
hiddenTags: 非表示にするハッシュタグ
apps: "アプリ"
_experiments:
title: 試験的な機能
postImportsCaption:
ユーザーが過去の投稿をIceshrimp・Iceshrimp・Mastodon・Akkoma・Pleromaからインポートすることを許可します。キューが溜まっているときにインポートするとサーバーに負荷がかかる可能性があります。
enablePostImports: 投稿のインポートを有効にする
sendModMail: モデレーション通知を送る
deleted: 削除済み
editNote: 投稿を編集

View file

@ -1257,11 +1257,6 @@ _aboutIceshrimp:
de bovenstaande link om je naam hier te krijgen!
contributors: Belangrijkste bijdragers
allContributors: Alle bijdragers
_experiments:
postImportsCaption: Hiermee kunnen gebruikers hun posts van eerdere Iceshrimp, Misskey,
Mastodon, Akkoma en Pleroma-accounts importen. Dit kan tijdensh het laden voor
traagheid zorgen als de wachtrij vol zit.
enablePostImports: Post-importeren aanzetten
hiddenTagsDescription: 'Geef de hashtags (zonder #) op die je uit Trending en Verkennen
wilt verbergen. Verborgen hashtags zijn nog steeds ontdekbaar via andere manieren.'
pinnedClipId: ID van de clip on vast te zetten

View file

@ -2098,12 +2098,6 @@ preventAiLearningDescription: Zażądaj, by modele językowe AI osób trzecich n
silencedWarning: Ta strona się pokazuje, ponieważ wymienieni użytkownicy są z serwerów
które Twój admin wyciszył, więc mogą być oni potencjalnymi spamerami.
verifiedLink: Zweryfikowany link
_experiments:
enablePostImports: Włącz import postów
postImportsCaption: Pozwala użytkownikom na zaimportowanie ich postów z poprzednich
kont Iceshrimp, Misskey, Mastodon, Akkomy czy Pleromy. Może to spowodować spowolnienia
podczas ładowania, jeśli twoja kolejka ma wąskie gardło.
title: Eksperymenty
alwaysExpandCws: Zawsze rozwijaj posty z CW
video: Film
swipeOnMobile: Zezwól na przesuwanie palcem między stronami

View file

@ -57,7 +57,7 @@ login: Entrar
loggingIn: Entrando
logout: Sair
signup: Criar conta
uploading: Enviando...
uploading: Enviando
users: Usuários
addUser: Adicione um usuário
addInstance: Adicionar um servidor
@ -95,7 +95,7 @@ alreadyFavorited: Já foi adicionado aos marcadores.
download: Download
pageLoadError: Ocorreu um erro ao carregar a página.
pageLoadErrorDescription: Isso normalmente é causado por erros de rede ou pelo cache
do navegador. Tente limpar o cache e, depois de esperar um pouquinho, tente novamente.
do navegador. Tente limpar o cache ou esperar um pouquinho e recarregar a página.
serverIsDead: Esse servidos não está respondendo. Por favor espere um pouco e tente
novamente.
youShouldUpgradeClient: Para visualizar essa página, favor reiniciar para atualizar
@ -110,3 +110,60 @@ followRequests: Pedidos de seguimento
unfollow: Parar de seguir
followRequestPending: Pedido de seguimento pendente
enterEmoji: Insira um emoji
markAsSensitive: Marcar como sensível
unmarkAsSensitive: Desmarcar como sensível
processing: Processando…
renoted: Impulsionado.
blockConfirm: Tem certeza de que deseja bloquear esta conta?
unsuspendConfirm: Tem certeza de que deseja remover a suspensão desta conta?
flagAsBotDescription: Habilite esta opção se esta conta for controlada por um programa.
Se ativado, ela funcionará como um sinalizador para outros desenvolvedores, evitando
intermináveis cadeias de interação com outros bots e ajustando os sistemas internos
do Iceshrimp para tratar esta conta como um bot.
sendErrorReportsDescription: "Quando ativado, informações de erro detalhadas serão
compartilhadas com o Iceshrimp quando ocorrer um problema, ajudando a melhorar a
qualidade do Iceshrimp.\n Isso incluirá informações como a versão do seu sistema
operacional, qual navegador você está usando, sua atividade no Iceshrimp, etc."
general: Geral
federation: Federação
receiveFollowRequest: Pedido de seguidor recebido
followRequestAccepted: Pedido de seguidor aceito
pinned: Fixar no perfil
reaction: Reações
removeReaction: Remover sua reação
enableEmojiReactions: Ativar reações de emoji
showEmojisInReactionNotifications: Mostrar emojis em notificações de reação
reactionSetting: Reações a serem mostradas no seletor de reações
reactionSettingDescription2: Arraste para organizar, clique para excluir, aperte "+"
para adicionar.
attachCancel: Remover anexo
enterFileName: Insira nome de arquivo
suspend: Suspender
unsuspend: Remover suspensão
unblockConfirm: Tem certeza de que deseja desbloquear esta conta?
suspendConfirm: Tem certeza de que deseja suspender esta conta?
editWidgetsExit: Feito
sensitive: Sensível
block: Bloquear
unblock: Desbloquear
emoji: Emoji
emojis: Emoji
wallpaper: Plano de fundo
recipient: Destinatário(s)
annotation: Comentários
instances: Servidores
charts: Gráficos
operations: Operações
software: Programa
version: Versão
metadata: Metadados
network: Rede
disk: Disco
statistics: Estatísticas
done: Feito
default: Padrão
blocked: ''
migrationConfirm: "Você tem certeza absoluta de que deseja migrar sua conta para {account}?
Depois de fazer isso, você não poderá reverter e não poderá usar sua conta normalmente
novamente.\nAlém disso, certifique-se de definir esta conta atual como a conta da
qual você está migrando."

View file

@ -1859,12 +1859,6 @@ _notification:
youReceivedFollowRequest: Bir takip isteği geldi
youGotPoll: '{name} anketinde oylama yaptı'
youGotMessagingMessageFromUser: '{name} sana bir sohbet mesajı gönderdi'
_experiments:
title: Deneyler
postImportsCaption: Kullanıcıların geçmiş Iceshrimp, Iceshrimp, Mastodon, Akkoma ve
Pleroma hesaplarından gönderilerini içe aktarmalarına izin verir. Kuyruğunuz tıkanırsa
yükleme sırasında yavaşlamalara neden olabilir.
enablePostImports: Gönderi içeri aktarmasını aktif et
_dialog:
charactersExceeded: 'Maksimum karakter aşıldı! Geçerli: {current}/Sınır: {max}'
charactersBelow: 'Yeterli karakter yok! Geçerli: {current}/Sınır: {min}'

View file

@ -1904,12 +1904,6 @@ _instanceMute:
title: Приховує записи з перелічених серверів.
instanceMuteDescription2: Розділити новими рядками
heading: Список серверів для заглушення
_experiments:
enablePostImports: Ввімкнути імпорт записів
title: Експерименти
postImportsCaption: Дозволяє користувачам імпортувати свої публікації з минулих
облікових записів Iceshrimp, Misskey, Mastodon, Akkoma і Pleroma. Це може знизити
швидкість під час завантаження, якщо ваша черга перевантажена.
_dialog:
charactersExceeded: 'Перевищено максимальну кількість символів! Обмеження: {current}/{max}'
charactersBelow: 'Недостатньо символів! Обмеження: {current}/{min}'

View file

@ -1815,10 +1815,6 @@ _messaging:
dms: 私信
groups: 群组
migration: 迁移
_experiments:
title: 实验性功能
postImportsCaption: 允许用户从过去的 Iceshrimp、Iceshrimp、Mastodon、Akkoma 和 Pleroma 账号导入帖子。如果您的队列出现拥堵,则可能会导致加载速度减慢。
enablePostImports: 启用帖子导入
license: 许可证
flagSpeakAsCatDescription: 在猫模式下您的帖子会喵化
allowedInstances: 白名单服务器

View file

@ -1823,8 +1823,6 @@ flagSpeakAsCat: 像貓一樣地說話
silenceThisInstance: 靜音此伺服器
silencedInstances: 已靜音的伺服器
silenced: 已靜音
_experiments:
title: 試驗功能
findOtherInstance: 找找另一個伺服器
noGraze: 瀏覽器擴展 "Graze for Mastodon" 會與Iceshrimp發生衝突請停用該擴展。
userSaysSomethingReasonRenote: '{name} 轉傳了包含 {reason} 的貼文'

View file

@ -1,80 +1,82 @@
{
"name": "iceshrimp",
"version": "2023.12.7-jormungandr.18",
"repository": {
"type": "git",
"url": "https://iceshrimp.dev/limepotato/jormungandr-bite.git"
},
"private": true,
"scripts": {
"rebuild": "clean && node ./scripts/build-greet.js && yarn workspace iceshrimp-js build && yarn workspaces foreach -Apitv run build && gulp",
"build": "node ./scripts/build-greet.js && yarn workspace iceshrimp-js run build && yarn workspaces foreach -Apitv run build && gulp",
"build:debug": "node ./scripts/build-greet.js && yarn workspace iceshrimp-js run build:debug && yarn workspaces foreach -Apitv run build:debug && gulp",
"start": "yarn workspace backend run start",
"start:debug": "yarn workspace backend run start:debug",
"start:test": "yarn workspace backend run start:test",
"init": "yarn migrate",
"migrate": "yarn workspace backend run migrate",
"revertmigration": "yarn workspace backend run revertmigration",
"migrateandstart": "yarn migrate && yarn start",
"gulp": "gulp build",
"watch": "yarn dev",
"dev": "node ./scripts/dev.js",
"dev:staging": "NODE_OPTIONS=--max_old_space_size=3072 NODE_ENV=development yarn build && yarn start",
"lint": "yarn workspaces foreach -Ap run lint",
"cy:open": "cypress open --browser --e2e --config-file=cypress.config.ts",
"cy:run": "cypress run",
"e2e": "start-server-and-test start:test http://localhost:61812 cy:run",
"mocha": "yarn workspace backend run mocha",
"test": "yarn mocha",
"format": "yarn workspaces foreach -Ap run format",
"clean": "node ./scripts/clean.js",
"clean-all": "node ./scripts/clean-all.js",
"cleanall": "yarn clean-all",
"focus-production": "node ./scripts/focus-production.js",
"regen-version": "node ./scripts/regen-version.js",
"pack-yarn": "corepack pack -o .yarn/corepack.tgz"
},
"workspaces": [
"packages/backend",
"packages/client",
"packages/sw",
"packages/iceshrimp-js"
],
"resolutions": {
"chokidar": "^3.3.1"
},
"dependencies": {
"@bull-board/api": "5.6.0",
"@bull-board/ui": "5.6.0",
"js-yaml": "4.1.0",
"seedrandom": "^3.0.5"
},
"devDependencies": {
"@biomejs/biome": "1.4.1",
"@types/gulp": "4.0.13",
"@types/gulp-rename": "2.0.2",
"@types/node": "20.4.1",
"chalk": "4.1.2",
"chokidar": "^3.5.3",
"cross-env": "7.0.3",
"cypress": "10.11.0",
"execa": "5.1.1",
"glob": "^10.3.10",
"gulp": "4.0.2",
"gulp-cssnano": "2.1.3",
"gulp-rename": "2.0.0",
"gulp-replace": "1.1.4",
"gulp-terser": "2.1.0",
"install-peers": "^1.0.4",
"start-server-and-test": "1.15.2",
"typescript": "5.1.6",
"yaml": "^2.3.4"
},
"packageManager": "yarn@4.1.1",
"dependenciesMeta": {
"@discordapp/twemoji@14.1.2": {
"unplugged": true
}
}
"name": "iceshrimp",
"version": "2023.12.9-jormungandr.18",
"repository": {
"type": "git",
"url": "https://iceshrimp.dev/limepotato/jormungandr-bite.git"
},
"private": true,
"scripts": {
"rebuild": "clean && node ./scripts/build-greet.js && yarn workspace iceshrimp-sdk build && yarn workspaces foreach -Apitv run build && gulp",
"build": "node ./scripts/build-greet.js && yarn workspace iceshrimp-sdk run build && yarn workspaces foreach -Apitv run build && gulp",
"build:debug": "node ./scripts/build-greet.js && yarn workspace iceshrimp-sdk run build:debug && yarn workspaces foreach -Apitv run build:debug && gulp",
"start": "yarn workspace backend run start",
"start:debug": "yarn workspace backend run start:debug",
"start:test": "yarn workspace backend run start:test",
"init": "yarn migrate",
"migrate": "yarn workspace backend run migrate",
"revertmigration": "yarn workspace backend run revertmigration",
"migrateandstart": "yarn migrate && yarn start",
"gulp": "gulp build",
"watch": "yarn dev",
"dev": "node ./scripts/dev.js",
"dev:staging": "NODE_OPTIONS=--max_old_space_size=3072 NODE_ENV=development yarn build && yarn start",
"lint": "yarn workspaces foreach -Ap run lint",
"cy:open": "cypress open --browser --e2e --config-file=cypress.config.ts",
"cy:run": "cypress run",
"e2e": "start-server-and-test start:test http://localhost:61812 cy:run",
"mocha": "yarn workspace backend run mocha",
"test": "yarn mocha",
"format": "yarn workspaces foreach -Ap run format",
"clean": "node ./scripts/clean.js",
"clean-all": "node ./scripts/clean-all.js",
"cleanall": "yarn clean-all",
"focus-production": "node ./scripts/focus-production.js",
"regen-version": "node ./scripts/regen-version.js",
"pack-yarn": "corepack pack -o .yarn/corepack.tgz"
},
"workspaces": [
"packages/backend",
"packages/client",
"packages/sw",
"packages/iceshrimp-sdk"
],
"resolutions": {
"chokidar": "^3.3.1"
},
"dependencies": {
"@bull-board/api": "5.6.0",
"@bull-board/ui": "5.6.0",
"js-yaml": "4.1.0",
"seedrandom": "^3.0.5"
},
"devDependencies": {
"@biomejs/biome": "1.4.1",
"@types/gulp": "4.0.13",
"@types/gulp-rename": "2.0.2",
"@types/node": "20.4.1",
"chalk": "4.1.2",
"chokidar": "^3.5.3",
"cross-env": "7.0.3",
"cypress": "10.11.0",
"execa": "5.1.1",
"glob": "^10.3.10",
"gulp": "4.0.2",
"gulp-cssnano": "2.1.3",
"gulp-rename": "2.0.0",
"gulp-replace": "1.1.4",
"gulp-terser": "2.1.0",
"install-peers": "^1.0.4",
"start-server-and-test": "1.15.2",
"typescript": "5.1.6",
"yaml": "^2.3.4"
},
"packageManager": "yarn@4.3.1",
"dependenciesMeta": {
"@discordapp/twemoji@14.1.2": { "unplugged": true },
"@microsoft/api-documenter@7.22.30": { "unplugged": true },
"@microsoft/api-extractor@7.36.3": { "unplugged": true },
"@microsoft/api-extractor-model@7.27.5": { "unplugged": true },
"eventemitter3@4.0.7": { "unplugged": true }
}
}

View file

@ -5,4 +5,4 @@ This directory contains all of the packages Iceshrimp uses.
- `backend`: Main backend code written in TypeScript for NodeJS
- `client`: Web interface written in Vue3 and TypeScript
- `sw`: Web [Service Worker](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API) written in TypeScript
- `iceshrimp-js`: TypeScript SDK for both backend and client, also published on [NPM](https://www.npmjs.com/package/iceshrimp-js) for public use
- `iceshrimp-sdk`: TypeScript SDK for both backend and client

View file

@ -27,6 +27,7 @@
"@bull-board/koa": "5.6.0",
"@bull-board/ui": "5.6.0",
"@discordapp/twemoji": "14.1.2",
"@iceshrimp/summaly": "2.7.2",
"@koa/cors": "3.4.3",
"@koa/multer": "3.0.2",
"@koa/router": "9.0.1",
@ -34,7 +35,6 @@
"@peertube/http-signature": "1.7.0",
"@redocly/openapi-core": "1.0.0-beta.131",
"@sinonjs/fake-timers": "9.1.2",
"@syuilo/aiscript": "0.11.1",
"@transfem-org/sfm-js": "^0.24.5",
"adm-zip": "^0.5.10",
"ajv": "8.12.0",
@ -69,7 +69,7 @@
"gunzip-maybe": "^1.4.2",
"happy-dom": "^12.10.3",
"hpagent": "0.1.2",
"iceshrimp-js": "workspace:*",
"iceshrimp-sdk": "workspace:*",
"ioredis": "5.3.2",
"ip-cidr": "3.1.0",
"is-svg": "4.3.2",
@ -93,7 +93,7 @@
"msgpackr": "1.9.5",
"multer": "1.4.4-lts.1",
"nested-property": "4.0.0",
"node-fetch": "3.3.1",
"node-fetch": "3.3.2",
"nodemailer": "6.9.3",
"oauth": "^0.10.0",
"os-utils": "0.0.14",
@ -111,7 +111,7 @@
"qs": "6.11.2",
"random-seed": "0.3.0",
"ratelimiter": "3.4.1",
"re2": "^1.20.9",
"re2": "^1.20.11",
"redis-lock": "0.1.4",
"redis-semaphore": "5.3.1",
"reflect-metadata": "0.1.13",
@ -121,9 +121,8 @@
"sanitize-html": "2.10.0",
"seedrandom": "^3.0.5",
"semver": "7.5.4",
"sharp": "0.32.1",
"sharp": "0.33.4",
"stringz": "2.1.0",
"summaly": "2.7.0",
"syslog-pro": "1.0.0",
"systeminformation": "^5.21.12",
"tar-stream": "^3.1.6",

View file

@ -24,6 +24,7 @@ export class FederatedBite1705528046452 implements MigrationInterface {
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`DELETE FROM "notification" WHERE "biteId" IS NOT NULL`);
await queryRunner.query(`ALTER TABLE "notification" DROP CONSTRAINT "FK_c54844158c1eead7042e7ca4c83"`);
await queryRunner.query(`ALTER TABLE "bite" DROP CONSTRAINT "FK_5d5f68610583f2e0b6785d3c0e9"`);
await queryRunner.query(`ALTER TABLE "bite" DROP CONSTRAINT "FK_a646fbbeb6efa2531c75fec46b9"`);

View file

@ -0,0 +1,13 @@
import { MigrationInterface, QueryRunner } from "typeorm";
export class BiteNotificationIndex1722204953558 implements MigrationInterface {
name = 'BiteNotificationIndex1722204953558'
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`CREATE INDEX "IDX_c54844158c1eead7042e7ca4c8" ON "notification" ("biteId") `);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`DROP INDEX "public"."IDX_c54844158c1eead7042e7ca4c8"`);
}
}

View file

@ -88,7 +88,6 @@ export async function getResponse(args: {
body?: string;
headers: Record<string, string>;
timeout?: number;
size?: number;
redirect?: RequestRedirect;
}) {
const timeout = args.timeout || 10 * 1000;
@ -103,7 +102,7 @@ export async function getResponse(args: {
headers: args.headers,
body: args.body,
timeout,
size: args.size || 10 * 1024 * 1024,
size: 10 * 1024 * 1024,
agent: getAgentByUrl,
signal: controller.signal,
redirect: args.redirect

View file

@ -1,4 +1,4 @@
import { Check, Column, Entity, ManyToOne, PrimaryColumn } from "typeorm";
import { Check, Column, Entity, ManyToOne, PrimaryColumn, Index } from "typeorm";
import { id } from "../id.js";
import { User } from "./user.js";

View file

@ -183,6 +183,7 @@ export class Notification {
@JoinColumn()
public appAccessToken: AccessToken | null;
@Index()
@Column({ ...id(), nullable: true })
public biteId: Bite["id"] | null;

View file

@ -241,24 +241,29 @@ export const UserRepository = db.getRepository(User).extend({
},
async userFromURI(uri: string): Promise<User | null> {
const dbResolver = new DbResolver();
let local = await dbResolver.getUserFromApId(uri);
if (local) {
return local;
try {
const dbResolver = new DbResolver();
let local = await dbResolver.getUserFromApId(uri);
if (local) {
return local;
}
// fetching Object once from remote
const resolver = new Resolver();
const object = (await resolver.resolve(uri)) as any;
// /@user If a URI other than the id is specified,
// the URI is determined here
if (uri !== object.id) {
local = await dbResolver.getUserFromApId(object.id);
if (local != null) return local;
}
return isActor(object) ? await createPerson(getApId(object)) : null;
}
// fetching Object once from remote
const resolver = new Resolver();
const object = (await resolver.resolve(uri)) as any;
// /@user If a URI other than the id is specified,
// the URI is determined here
if (uri !== object.id) {
local = await dbResolver.getUserFromApId(object.id);
if (local != null) return local;
catch {
return null;
}
return isActor(object) ? await createPerson(getApId(object)) : null;
},
async getHasUnreadAntenna(userId: User["id"]): Promise<boolean> {

View file

@ -1,4 +1,5 @@
import type Bull from "bull";
import { noop } from "@/queue/processors/noop.js";
const jobs = {} as Record<string, Bull.ProcessCallbackFunction<Record<string, unknown>>>;
@ -6,4 +7,6 @@ export default function (q: Bull.Queue) {
for (const [k, v] of Object.entries(jobs)) {
q.process(k, 16, v);
}
q.process(noop);
}

View file

@ -9,6 +9,7 @@ import { Users, DriveFiles } from "@/models/index.js";
import type { DbUserImportJobData } from "@/queue/types.js";
import { queueLogger } from "../../logger.js";
import type Bull from "bull";
import { cache as heuristic } from "@/server/api/common/generate-following-query.js";
const logger = queueLogger.createSubLogger("import-following");
@ -111,6 +112,7 @@ export async function importFollowing(
}
}
await heuristic.delete(user.id);
logger.succ("Imported");
done();
}

View file

@ -16,6 +16,7 @@ import { importMastoPost } from "./import-masto-post.js";
import { importCkPost } from "./import-firefish-post.js";
import { importBlocking } from "./import-blocking.js";
import { importCustomEmojis } from "./import-custom-emojis.js";
import { noop } from "@/queue/processors/noop.js";
const jobs = {
deleteDriveFiles,
@ -44,4 +45,6 @@ export default function (dbQueue: Bull.Queue<DbJobData>) {
for (const [k, v] of Object.entries(jobs)) {
dbQueue.process(k, v);
}
dbQueue.process(noop);
}

View file

@ -22,6 +22,10 @@ const logger = new Logger("deliver");
let latest: string | null = null;
export default async (job: Bull.Job<DeliverJobData>) => {
if (job.data == null || Object.keys(job.data).length === 0) {
job.opts.removeOnComplete = true;
return "Skip (data was null or empty)";
}
const { host } = new URL(job.data.to);
const puny = toPuny(host);

View file

@ -11,6 +11,11 @@ export async function endedPollNotification(
job: Bull.Job<EndedPollNotificationJobData>,
done: any,
): Promise<void> {
if (job.data == null || Object.keys(job.data).length === 0) {
job.opts.removeOnComplete = true;
done();
return;
}
const note = await Notes.findOneBy({ id: job.data.noteId });
if (note == null || !note.hasPoll) {
done();

View file

@ -29,6 +29,10 @@ const logger = new Logger("inbox");
// Processing when an activity arrives in the user's inbox
export default async (job: Bull.Job<InboxJobData>): Promise<string> => {
if (job.data == null || Object.keys(job.data).length === 0) {
job.opts.removeOnComplete = true;
return "Skip (data was null or empty)";
}
const signature = job.data.signature; // HTTP-signature
let activity = job.data.activity;

View file

@ -0,0 +1,7 @@
import Bull from "bull";
// Processor to be registered for jobs with __default__ (unnamed) handlers in queues that only have named handlers
// Prevents sporadic bogus jobs from clogging up the queues
export async function noop(job: Bull.Job): Promise<void> {
job.opts.removeOnComplete = true;
}

View file

@ -2,6 +2,7 @@ import type Bull from "bull";
import type { ObjectStorageJobData } from "@/queue/types.js";
import deleteFile from "./delete-file.js";
import cleanRemoteFiles from "./clean-remote-files.js";
import { noop } from "@/queue/processors/noop.js";
const jobs = {
deleteFile,
@ -16,4 +17,6 @@ export default function (q: Bull.Queue) {
for (const [k, v] of Object.entries(jobs)) {
q.process(k, 16, v);
}
q.process(noop);
}

View file

@ -6,6 +6,7 @@ import { checkExpiredMutings } from "./check-expired-mutings.js";
import { clean } from "./clean.js";
import { setLocalEmojiSizes } from "./local-emoji-size.js";
import { verifyLinks } from "./verify-links.js";
import { noop } from "@/queue/processors/noop.js";
const jobs = {
tickCharts,
@ -25,4 +26,6 @@ export default function (dbQueue: Bull.Queue<Record<string, unknown>>) {
for (const [k, v] of Object.entries(jobs)) {
dbQueue.process(k, v);
}
dbQueue.process(noop);
}

View file

@ -9,6 +9,10 @@ import config from "@/config/index.js";
const logger = new Logger("webhook");
export default async (job: Bull.Job<WebhookDeliverJobData>) => {
if (job.data == null || Object.keys(job.data).length === 0) {
job.opts.removeOnComplete = true;
return "Skip (data was null or empty)";
}
try {
logger.debug(`delivering ${job.data.webhookId}`);

View file

@ -6,7 +6,6 @@ import config from "@/config/index.js";
import { genId } from "@/misc/gen-id.js";
import { createBite } from "@/services/create-bite.js";
import { Bite } from "@/models/entities/bite.js";
import { tickBiteIncoming } from "@/metrics.js";
export default async (
actor: CacheableRemoteUser,
@ -76,7 +75,5 @@ export default async (
bite.published ? new Date(bite.published) : null,
);
tickBiteIncoming();
return "ok";
};

View file

@ -126,6 +126,7 @@ export class LdSignature {
headers: {
Accept: "application/ld+json, application/json",
},
size: 1024 * 1024, // 1MiB
// TODO
//timeout: this.loderTimeout,
agent: (u) => (u.protocol === "http:" ? httpAgent : httpsAgent),

View file

@ -584,7 +584,7 @@ export async function updateNote(value: string | IObject, resolver?: Resolver) {
text = await htmlToMfm(post.content, post.tag);
}
const cw = post.sensitive && post.summary;
const cw = post.summary === "" ? null : post.summary;
// File parsing
const fileList = post.attachment

View file

@ -56,6 +56,8 @@ import {
import { RecursionLimiter } from "@/models/repositories/user-profile.js";
import { UserConverter } from "@/server/api/mastodon/converters/user.js";
import fetch from "node-fetch";
const logger = apLogger;
const nameLength = 128;
@ -271,6 +273,7 @@ export async function createPerson(
try {
let data = await fetch(person.followers, {
headers: { Accept: "application/json" },
size: 1024 * 1024
});
let json_data = JSON.parse(await data.text());
@ -286,6 +289,7 @@ export async function createPerson(
try {
let data = await fetch(person.following, {
headers: { Accept: "application/json" },
size: 1024 * 1024
});
let json_data = JSON.parse(await data.text());
@ -529,6 +533,7 @@ export async function updatePerson(
try {
let data = await fetch(person.followers, {
headers: { Accept: "application/json" },
size: 1024 * 1024
});
let json_data = JSON.parse(await data.text());
@ -544,6 +549,7 @@ export async function updatePerson(
try {
let data = await fetch(person.following, {
headers: { Accept: "application/json" },
size: 1024 * 1024
});
let json_data = JSON.parse(await data.text());

View file

@ -11,14 +11,14 @@ export default function (
totalItems: any,
first?: string,
last?: string,
orderedItems?: Record<string, unknown>[],
orderedItems?: (Record<string, unknown> | string)[],
): {
id: string | null;
type: "OrderedCollection";
totalItems: any;
first?: string;
last?: string;
orderedItems?: Record<string, unknown>[];
orderedItems?: (Record<string, unknown> | string)[];
} {
const page: any = {
id,

View file

@ -27,7 +27,6 @@ import { shouldBlockInstance } from "@/misc/should-block-instance.js";
import { apLogger } from "@/remote/activitypub/logger.js";
import { In, IsNull, Not } from "typeorm";
import renderBite from "@/remote/activitypub/renderer/bite.js";
import { tickResolve } from "@/metrics.js";
export default class Resolver {
private history: Set<string>;

View file

@ -37,7 +37,6 @@ import { serverLogger } from "./index.js";
import config from "@/config/index.js";
import Koa from "koa";
import renderBite from "@/remote/activitypub/renderer/bite.js";
import { tickFetch } from "@/metrics.js";
// Init router
const router = new Router();

Some files were not shown because too many files have changed in this diff Show more