1
0
mirror of https://github.com/misskey-dev/misskey.git synced 2026-05-16 16:45:30 +02:00

perf: rsa sign on slacc (#17322)

* perf: rsa sign on slacc

* fix: missing async/await

* fix: threadPoolSize is always number

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* test(backend): init slacc in unit setup and await ap-request signing

* test(backend): move slacc init to unit testEnvironment

* test(backend): delete unused file

* docs: update CHANGELOG

* docs: fix indent

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* chore: migrate to vitest

* fix

* fix: fix changelog

* chore: regenerate lockfile

* docs: changelog

---------

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: kakkokari-gtyih <67428053+kakkokari-gtyih@users.noreply.github.com>
This commit is contained in:
Acid Chicken
2026-05-12 17:36:49 +09:00
committed by GitHub
parent a19da1258d
commit b950f905e5
18 changed files with 201 additions and 130 deletions

View File

@@ -182,6 +182,9 @@ id: 'aidx'
# Number of worker processes
#clusterLimit: 1
# Number of threads of extra thread pool for CPU-intensive tasks (per worker)
#threadPoolSize: 1
# Job concurrency per worker
# deliverJobConcurrency: 128
# inboxJobConcurrency: 16

View File

@@ -194,6 +194,9 @@ id: 'aidx'
# Number of worker processes
#clusterLimit: 1
# Number of threads of extra thread pool for CPU-intensive tasks (per worker)
#threadPoolSize: 1
# Job concurrency per worker
# deliverJobConcurrency: 128
# inboxJobConcurrency: 16

View File

@@ -328,6 +328,9 @@ id: 'aidx'
# Number of worker processes
#clusterLimit: 1
# Number of threads of extra thread pool for CPU-intensive tasks (per worker)
#threadPoolSize: 1
# Job concurrency per worker
#deliverJobConcurrency: 128
#inboxJobConcurrency: 16

View File

@@ -169,6 +169,9 @@ id: 'aidx'
# Number of worker processes
#clusterLimit: 1
# Number of threads of extra thread pool for CPU-intensive tasks (per worker)
#threadPoolSize: 1
# Job concurrency per worker
# deliverJobConcurrency: 128
# inboxJobConcurrency: 16

View File

@@ -1,5 +1,10 @@
## Unreleased
### Note
- config に `threadPoolSize` オプションが追加されました。
- デフォルトは `1` で、ワーカーごとに指定した数のスレッドが作成されます。
- スレッドプールは CPU バウンドな処理をオフロードするために使用されるため、みだりに大きな値を指定しないでください。
### General
- Enhance: Unicode 17.0 に収録されている絵文字の処理・表示に対応
- Fluent Emojiや端末ネイティブの絵文字を利用している場合は、最新の絵文字に対応しておらず正しく表示できない可能性があります。絵文字が表示できない場合は、表示に使用する絵文字をTwemojiに切り替えてご利用ください。
@@ -15,7 +20,7 @@
- Fix: チャンネルの作成ロールポリシーにて、ヘッダーにロールポリシーの値が表示されない問題を修正
### Server
-
- Enhance: RSA 署名処理のオフロード
## 2026.5.1

View File

@@ -190,6 +190,9 @@ id: "aidx"
# Number of worker processes
#clusterLimit: 1
# Number of threads of extra thread pool for CPU-intensive tasks (per worker)
#threadPoolSize: 1
# Job concurrency per worker
# deliverJobConcurrency: 128
# inboxJobConcurrency: 16

View File

@@ -37,19 +37,19 @@
"@tensorflow/tfjs": "4.22.0",
"@tensorflow/tfjs-node": "4.22.0",
"bufferutil": "4.1.0",
"slacc-android-arm-eabi": "0.0.10",
"slacc-android-arm64": "0.0.10",
"slacc-darwin-arm64": "0.0.10",
"slacc-darwin-universal": "0.0.10",
"slacc-darwin-x64": "0.0.10",
"slacc-freebsd-x64": "0.0.10",
"slacc-linux-arm-gnueabihf": "0.0.10",
"slacc-linux-arm64-gnu": "0.0.10",
"slacc-linux-arm64-musl": "0.0.10",
"slacc-linux-x64-gnu": "0.0.10",
"slacc-linux-x64-musl": "0.0.10",
"slacc-win32-arm64-msvc": "0.0.10",
"slacc-win32-x64-msvc": "0.0.10",
"slacc-android-arm-eabi": "0.1.5",
"slacc-android-arm64": "0.1.5",
"slacc-darwin-arm64": "0.1.5",
"slacc-darwin-universal": "0.1.5",
"slacc-darwin-x64": "0.1.5",
"slacc-freebsd-x64": "0.1.5",
"slacc-linux-arm-gnueabihf": "0.1.5",
"slacc-linux-arm64-gnu": "0.1.5",
"slacc-linux-arm64-musl": "0.1.5",
"slacc-linux-x64-gnu": "0.1.5",
"slacc-linux-x64-musl": "0.1.5",
"slacc-win32-arm64-msvc": "0.1.5",
"slacc-win32-x64-msvc": "0.1.5",
"utf-8-validate": "6.0.6"
},
"dependencies": {
@@ -142,7 +142,7 @@
"secure-json-parse": "4.1.0",
"semver": "7.7.4",
"sharp": "0.33.5",
"slacc": "0.0.10",
"slacc": "0.1.5",
"strict-event-emitter-types": "2.0.0",
"stringz": "2.1.0",
"systeminformation": "5.31.5",

View File

@@ -4,7 +4,21 @@
*/
import { NestFactory } from '@nestjs/core';
import { init } from 'slacc';
import { NestLogger } from '@/NestLogger.js';
import type { Config } from '@/config.js';
let slaccInitialized = false;
export function initExtraThreadPool(config: Config) {
if (slaccInitialized) return;
const threadPoolSize = Math.max(config.threadPoolSize ?? 1, 1);
init(threadPoolSize);
slaccInitialized = true;
}
export async function server() {
const { MainModule } = await import('../MainModule.js');

View File

@@ -13,7 +13,7 @@ import { loadConfig } from '@/config.js';
import type { Config } from '@/config.js';
import { showMachineInfo } from '@/misc/show-machine-info.js';
import { envOption } from '@/env.js';
import { jobQueue, server } from './common.js';
import { initExtraThreadPool, jobQueue, server } from './common.js';
const logger = new Logger('core', 'cyan');
const bootLogger = logger.createSubLogger('boot', 'magenta');
@@ -64,6 +64,8 @@ export async function masterMain() {
bootLogger.succ('Misskey initialized');
initExtraThreadPool(config);
if (config.sentryForBackend) {
const Sentry = await import('@sentry/node');
const { nodeProfilingIntegration } = await import('@sentry/profiling-node');

View File

@@ -6,7 +6,7 @@
import cluster from 'node:cluster';
import { envOption } from '@/env.js';
import { loadConfig } from '@/config.js';
import { jobQueue, server } from './common.js';
import { initExtraThreadPool, jobQueue, server } from './common.js';
/**
* Init worker process
@@ -14,6 +14,8 @@ import { jobQueue, server } from './common.js';
export async function workerMain() {
const config = loadConfig();
initExtraThreadPool(config);
if (config.sentryForBackend) {
const Sentry = await import('@sentry/node');
const { nodeProfilingIntegration } = await import('@sentry/profiling-node');

View File

@@ -85,6 +85,7 @@ type Source = {
maxFileSize?: number;
clusterLimit?: number;
threadPoolSize?: number;
id: string;
@@ -158,6 +159,7 @@ export type Config = {
allowedPrivateNetworks: string[] | undefined;
maxFileSize: number;
clusterLimit: number | undefined;
threadPoolSize: number;
id: string;
outgoingAddress: string | undefined;
outgoingAddressFamily: 'ipv4' | 'ipv6' | 'dual' | undefined;
@@ -313,6 +315,7 @@ export function loadConfig(): Config {
allowedPrivateNetworks: config.allowedPrivateNetworks,
maxFileSize: config.maxFileSize ?? 262144000,
clusterLimit: config.clusterLimit,
threadPoolSize: config.threadPoolSize ?? 1,
outgoingAddress: config.outgoingAddress,
outgoingAddressFamily: config.outgoingAddressFamily,
deliverJobConcurrency: config.deliverJobConcurrency,

View File

@@ -5,8 +5,10 @@
import * as crypto from 'node:crypto';
import { URL } from 'node:url';
import { promisify } from 'node:util';
import { Inject, Injectable } from '@nestjs/common';
import * as htmlParser from 'node-html-parser';
import { RsaKeyPair } from 'slacc';
import { DI } from '@/di-symbols.js';
import type { Config } from '@/config.js';
import type { MiUser } from '@/models/User.js';
@@ -39,7 +41,7 @@ type PrivateKey = {
};
export class ApRequestCreator {
static createSignedPost(args: { key: PrivateKey, url: string, body: string, digest?: string, additionalHeaders: Record<string, string> }): Signed {
static async createSignedPost(args: { key: PrivateKey, url: string, body: string, digest?: string, additionalHeaders: Record<string, string> }): Promise<Signed> {
const u = new URL(args.url);
const digestHeader = args.digest ?? this.createDigest(args.body);
@@ -54,7 +56,7 @@ export class ApRequestCreator {
}, args.additionalHeaders),
};
const result = this.#signToRequest(request, args.key, ['(request-target)', 'date', 'host', 'digest']);
const result = await this.#signToRequest(request, args.key, ['(request-target)', 'date', 'host', 'digest']);
return {
request,
@@ -68,7 +70,7 @@ export class ApRequestCreator {
return `SHA-256=${crypto.createHash('sha256').update(body).digest('base64')}`;
}
static createSignedGet(args: { key: PrivateKey, url: string, additionalHeaders: Record<string, string> }): Signed {
static async createSignedGet(args: { key: PrivateKey, url: string, additionalHeaders: Record<string, string> }): Promise<Signed> {
const u = new URL(args.url);
const request: Request = {
@@ -81,7 +83,7 @@ export class ApRequestCreator {
}, args.additionalHeaders),
};
const result = this.#signToRequest(request, args.key, ['(request-target)', 'date', 'host']);
const result = await this.#signToRequest(request, args.key, ['(request-target)', 'date', 'host']);
return {
request,
@@ -91,9 +93,10 @@ export class ApRequestCreator {
};
}
static #signToRequest(request: Request, key: PrivateKey, includeHeaders: string[]): Signed {
static async #signToRequest(request: Request, key: PrivateKey, includeHeaders: string[]): Promise<Signed> {
const signingString = this.#genSigningString(request, includeHeaders);
const signature = crypto.sign('sha256', Buffer.from(signingString), key.privateKeyPem).toString('base64');
const sign = promisify(RsaKeyPair.prototype.sign).bind(RsaKeyPair.fromPem(key.privateKeyPem));
const signature = (await sign(Buffer.from(signingString))).toString('base64');
const signatureHeader = `keyId="${key.keyId}",algorithm="rsa-sha256",headers="${includeHeaders.join(' ')}",signature="${signature}"`;
request.headers = this.#objectAssignWithLcKey(request.headers, {
@@ -160,7 +163,7 @@ export class ApRequestService {
const keypair = await this.userKeypairService.getUserKeypair(user.id);
const req = ApRequestCreator.createSignedPost({
const req = await ApRequestCreator.createSignedPost({
key: {
privateKeyPem: keypair.privateKey,
keyId: `${this.config.url}/users/${user.id}#main-key`,
@@ -189,7 +192,7 @@ export class ApRequestService {
const _followAlternate = followAlternate ?? true;
const keypair = await this.userKeypairService.getUserKeypair(user.id);
const req = ApRequestCreator.createSignedGet({
const req = await ApRequestCreator.createSignedGet({
key: {
privateKeyPem: keypair.privateKey,
keyId: `${this.config.url}/users/${user.id}#main-key`,

View File

@@ -4,7 +4,9 @@
*/
import * as crypto from 'node:crypto';
import { promisify } from 'node:util';
import { Injectable } from '@nestjs/common';
import { RsaKeyPair } from 'slacc';
import { HttpRequestService } from '@/core/HttpRequestService.js';
import { bindThis } from '@/decorators.js';
import { CONTEXT, PRELOADED_CONTEXTS } from './misc/contexts.js';
@@ -45,11 +47,9 @@ class JsonLd {
const toBeSigned = await this.createVerifyData(data, options);
const signer = crypto.createSign('sha256');
signer.update(toBeSigned);
signer.end();
const sign = promisify(RsaKeyPair.prototype.sign).bind(RsaKeyPair.fromPem(privateKey));
const signature = signer.sign(privateKey);
const signature = await sign(Buffer.from(toBeSigned));
return {
...data,

View File

@@ -0,0 +1,10 @@
/*
* SPDX-FileCopyrightText: syuilo and misskey-project
* SPDX-License-Identifier: AGPL-3.0-only
*/
import { init } from 'slacc';
import { builtinEnvironments } from 'vitest/runtime';
init(1);
export default builtinEnvironments.node;

View File

@@ -42,7 +42,7 @@ describe('ap-request', () => {
'User-Agent': 'UA',
};
const req = ApRequestCreator.createSignedPost({ key, url, body, additionalHeaders: headers });
const req = await ApRequestCreator.createSignedPost({ key, url, body, additionalHeaders: headers });
const parsed = buildParsedSignature(req.signingString, req.signature, 'rsa-sha256');
@@ -58,7 +58,7 @@ describe('ap-request', () => {
'User-Agent': 'UA',
};
const req = ApRequestCreator.createSignedGet({ key, url, additionalHeaders: headers });
const req = await ApRequestCreator.createSignedGet({ key, url, additionalHeaders: headers });
const parsed = buildParsedSignature(req.signingString, req.signature, 'rsa-sha256');

View File

@@ -6,6 +6,7 @@ export default mergeConfig(
defineConfig({
test: {
globalSetup: './test/setup.unit.ts',
environment: './test/environment.unit.ts',
include: ['test/unit/**/*.ts', 'src/**/*.test.ts'],
},
}),

197
pnpm-lock.yaml generated
View File

@@ -358,8 +358,8 @@ importers:
specifier: 0.33.5
version: 0.33.5
slacc:
specifier: 0.0.10
version: 0.0.10
specifier: 0.1.5
version: 0.1.5
strict-event-emitter-types:
specifier: 2.0.0
version: 2.0.0
@@ -561,44 +561,44 @@ importers:
specifier: 4.1.0
version: 4.1.0
slacc-android-arm-eabi:
specifier: 0.0.10
version: 0.0.10
specifier: 0.1.5
version: 0.1.5
slacc-android-arm64:
specifier: 0.0.10
version: 0.0.10
specifier: 0.1.5
version: 0.1.5
slacc-darwin-arm64:
specifier: 0.0.10
version: 0.0.10
specifier: 0.1.5
version: 0.1.5
slacc-darwin-universal:
specifier: 0.0.10
version: 0.0.10
specifier: 0.1.5
version: 0.1.5
slacc-darwin-x64:
specifier: 0.0.10
version: 0.0.10
specifier: 0.1.5
version: 0.1.5
slacc-freebsd-x64:
specifier: 0.0.10
version: 0.0.10
specifier: 0.1.5
version: 0.1.5
slacc-linux-arm-gnueabihf:
specifier: 0.0.10
version: 0.0.10
specifier: 0.1.5
version: 0.1.5
slacc-linux-arm64-gnu:
specifier: 0.0.10
version: 0.0.10
specifier: 0.1.5
version: 0.1.5
slacc-linux-arm64-musl:
specifier: 0.0.10
version: 0.0.10
specifier: 0.1.5
version: 0.1.5
slacc-linux-x64-gnu:
specifier: 0.0.10
version: 0.0.10
specifier: 0.1.5
version: 0.1.5
slacc-linux-x64-musl:
specifier: 0.0.10
version: 0.0.10
specifier: 0.1.5
version: 0.1.5
slacc-win32-arm64-msvc:
specifier: 0.0.10
version: 0.0.10
specifier: 0.1.5
version: 0.1.5
slacc-win32-x64-msvc:
specifier: 0.0.10
version: 0.0.10
specifier: 0.1.5
version: 0.1.5
utf-8-validate:
specifier: 6.0.6
version: 6.0.6
@@ -4688,6 +4688,7 @@ packages:
'@ungap/structured-clone@1.3.0':
resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
deprecated: Potential CWE-502 - Update to 1.3.1 or higher
'@vitejs/plugin-vue@6.0.6':
resolution: {integrity: sha512-u9HHgfrq3AjXlysn0eINFnWQOJQLO9WN6VprZ8FXl7A2bYisv3Hui9Ij+7QZ41F/WYWarHjwBbXtD7dKg3uxbg==}
@@ -9280,90 +9281,90 @@ packages:
sinon@18.0.1:
resolution: {integrity: sha512-a2N2TDY1uGviajJ6r4D1CyRAkzE9NNVlYOV1wX5xQDuAk0ONgzgRl0EjCQuRCPxOwp13ghsMwt9Gdldujs39qw==}
slacc-android-arm-eabi@0.0.10:
resolution: {integrity: sha512-U3dVBuM1m8rT1D/w6S4knJ/uscNwsCR+MKxSQFbgDJEh8Atv+ovuC+FMGuaBT4iOQjpMj5dWSsN3ZPjVeo3hgA==}
engines: {node: '>= 10'}
slacc-android-arm-eabi@0.1.5:
resolution: {integrity: sha512-4BvH5Ut1egLORdiMfww+RyIDTMVVx3jFdcAa6gz7VglCmksyTsvuGbTgn31aC/1hjqug3eObkS+K7d3ZW8Yk/Q==}
engines: {node: '>=24 || ^23.6.0 || ^22.14.0'}
cpu: [arm]
os: [android]
slacc-android-arm64@0.0.10:
resolution: {integrity: sha512-guVp88sW+4j1clTSXMzyDJHG8ondVnd8/FMKXIOfzKCEwSwX3uBxsuyHqtGvXkEwyZAGsBUy13Ei/PZAwElwYA==}
engines: {node: '>= 10'}
slacc-android-arm64@0.1.5:
resolution: {integrity: sha512-P11kuouiYh74XSWdFOg0BBEoOl7d5PXy4JYXD4+FMhfew71aW98Mr4t1zI6JiolPqRKec5rRqqXUZwTXtVfXMQ==}
engines: {node: '>=24 || ^23.6.0 || ^22.14.0'}
cpu: [arm64]
os: [android]
slacc-darwin-arm64@0.0.10:
resolution: {integrity: sha512-633qnOMTP7egvd5IeljAOku0tnxlBXSoCRu7HiT0yeXxN9y5Tbg2X2/FaRzstI36lClfIJ0Lavne4mOw/90z9A==}
engines: {node: '>= 10'}
slacc-darwin-arm64@0.1.5:
resolution: {integrity: sha512-hwqTm0E4ujBjWpHTRQESOmRKymgVW+7S/hukRt0SjZp3FYec3tjaFK7hyJqcH9ht7XpuDtdPkMtVtAV+QRr/gA==}
engines: {node: '>=24 || ^23.6.0 || ^22.14.0'}
cpu: [arm64]
os: [darwin]
slacc-darwin-universal@0.0.10:
resolution: {integrity: sha512-x5kEqRMTEQTi3NCufPEukWvaWqcOL+7EkP18ZCCiajcWH83jWnT8DOSGOmmLYdrXd0B7ZZcbd8GyLp3i5zu8PA==}
engines: {node: '>= 10'}
slacc-darwin-universal@0.1.5:
resolution: {integrity: sha512-anhPH1uROGEE5IXXFhS3MCRN9kejoBZVcUnwo+uzArvH0ONOVMEc/3AsgnNlbDhXBcYFPSALPQmTMsiK34Aerg==}
engines: {node: '>=24 || ^23.6.0 || ^22.14.0'}
os: [darwin]
slacc-darwin-x64@0.0.10:
resolution: {integrity: sha512-5gQYboy/4T6Bj3sVXiCpM3EvF1sK/Zx1Nq5YBMUuYb2GzrIwywghHbCD6bK4JYGvNsLN7r4PC45ZUB4gVkU8yA==}
engines: {node: '>= 10'}
slacc-darwin-x64@0.1.5:
resolution: {integrity: sha512-BcK74s+GydaenPxcF7sHh0O6ksXXDdMYmqHlDHlyfvy1JeIgGGicnek/RQF7KpFR4ztVWCIMCPf08SfcePkUhw==}
engines: {node: '>=24 || ^23.6.0 || ^22.14.0'}
cpu: [x64]
os: [darwin]
slacc-freebsd-x64@0.0.10:
resolution: {integrity: sha512-Jmi5YszELef/aCzYto+LwiNGhCk5mrlJfTJU/pOI91HBbrZlV+aRyIsPCcxAMg5yPsPQuyRljrDouVYrPzNmjw==}
engines: {node: '>= 10'}
slacc-freebsd-x64@0.1.5:
resolution: {integrity: sha512-Tvuor8A3lY7+dmK3qBQt2+jSCC8ekJlx5xjMN1ITAw0XabLurpsaiAxlQ2oBr5r6TSli7ifg3eN4KJkjsK0wvw==}
engines: {node: '>=24 || ^23.6.0 || ^22.14.0'}
cpu: [x64]
os: [freebsd]
slacc-linux-arm-gnueabihf@0.0.10:
resolution: {integrity: sha512-9lTM3DGtISQlZYSKrMuQyKCiUnHYRcy04mY6HF1ywYcQ2sqfv3bKEnrypVewepIFUtytlIGzkgpiUAk/ghYGoA==}
engines: {node: '>= 10'}
slacc-linux-arm-gnueabihf@0.1.5:
resolution: {integrity: sha512-5UxG9pVO7eHcGsY+ZS4qPrqiDqraOHcjG6igqUJxpumSg7N+OdjwvIpbSc0OE7ihlGfc2BASoMHvCCKAGTGduw==}
engines: {node: '>=24 || ^23.6.0 || ^22.14.0'}
cpu: [arm]
os: [linux]
slacc-linux-arm64-gnu@0.0.10:
resolution: {integrity: sha512-qXrNWSINXOjHRO3c9idGm8DeOAjAjG1xHY8WiplCoHWgsZf3E7V+sPhWqRUaGQEvftsJg40+cFYREBaLQhpAVQ==}
engines: {node: '>= 10'}
slacc-linux-arm64-gnu@0.1.5:
resolution: {integrity: sha512-9lGsHXExvuhnKHbwlPCfyQPrAKERSzTUG3pbB/MIOYRLLdl8/dB/Y9xaKjLs4lcGENjxOc56HWc8ammvt3N8MA==}
engines: {node: '>=24 || ^23.6.0 || ^22.14.0'}
cpu: [arm64]
os: [linux]
libc: [glibc]
slacc-linux-arm64-musl@0.0.10:
resolution: {integrity: sha512-3lUX7752f6Okn54aONioaA+9M5TvifqXBAart+u2lNXEdWmmh003cVSU2Vcwg7nJ9lLHtju2DkDmKKfJjFuShA==}
engines: {node: '>= 10'}
slacc-linux-arm64-musl@0.1.5:
resolution: {integrity: sha512-NkJWT+0mpXwi8+tmJIbqubunEaqrpDuc+eja4x9ctsZsg8ziyr/7/lw1k5eLgda2bTNk2VWW16G+nJsYoHtdLg==}
engines: {node: '>=24 || ^23.6.0 || ^22.14.0'}
cpu: [arm64]
os: [linux]
libc: [musl]
slacc-linux-x64-gnu@0.0.10:
resolution: {integrity: sha512-BxxvylF9zlOLRLCpiyMvKTIUpdLlpetNBJ+DSMDh5+Ggq+AmQz2NUGawmcBJw58F8nMCj9TpWLlGNWc2AuY+JQ==}
engines: {node: '>= 10'}
slacc-linux-x64-gnu@0.1.5:
resolution: {integrity: sha512-NRjPRndLumowKUsgjpdX4/JFWDhRuUYBxW3oNMiOBIih3QWQ6c5aSUzp+qtQOpAT3rWUX+u6MJzy01MBK6eUsA==}
engines: {node: '>=24 || ^23.6.0 || ^22.14.0'}
cpu: [x64]
os: [linux]
libc: [glibc]
slacc-linux-x64-musl@0.0.10:
resolution: {integrity: sha512-TYJi8LOtJiTFcZvka4du7bMjF9Bz1RHRwyLnScr5E5yjjgoLRrsvgSu7bxp87xH+rgJ3CdEwE3w3Ux8EiewHpA==}
engines: {node: '>= 10'}
slacc-linux-x64-musl@0.1.5:
resolution: {integrity: sha512-bA3wxy3CV92vThnOydEQjSwHKlYmw7TzZAxGjdeUYTcXLGv3kNTFqVlaza51baX1zaAbLugE+XFqaMdWkExZuQ==}
engines: {node: '>=24 || ^23.6.0 || ^22.14.0'}
cpu: [x64]
os: [linux]
libc: [glibc]
libc: [musl]
slacc-win32-arm64-msvc@0.0.10:
resolution: {integrity: sha512-1CHPLiDB4exzFyT5ndtJDsRRhBxNg8mGz6I6eJEMjelGkJR2KZPT9LZuby/1bS/bcVOr7zuJvGNfbEGBeHRwPQ==}
engines: {node: '>= 10'}
slacc-win32-arm64-msvc@0.1.5:
resolution: {integrity: sha512-244eoyUKr9ucAbsF7FEKzHXgii/toF78F3Cm0wyUQDg5OT0k6B+Us9+MKL0/DPfqu81FqG/ej1TQTV8zArp01Q==}
engines: {node: '>=24 || ^23.6.0 || ^22.14.0'}
cpu: [arm64]
os: [win32]
slacc-win32-x64-msvc@0.0.10:
resolution: {integrity: sha512-wAXBy5yKCAzfYWjVlyPpu6PscD+j4QhCQEy0wZaVuzNyx60HpXWcTZxxVnMR730Y7tfc7cBxSI8NtRb8RguSgg==}
engines: {node: '>= 10'}
slacc-win32-x64-msvc@0.1.5:
resolution: {integrity: sha512-XQVxOJuyklg2u3Sgw4wFTEr6CMiMbzbG2OfJ03K1HrD4rDv6dYSwyJaoTpvcop3Ugr3FqaMRuCS9e9o/Ch+khA==}
engines: {node: '>=24 || ^23.6.0 || ^22.14.0'}
cpu: [x64]
os: [win32]
slacc@0.0.10:
resolution: {integrity: sha512-2jgms2/4mLr1AMq4oloAwPdKQK9RQvgmoEpMIxvC+HeHMwCR0XxB7gr/rKo4iLOKJ6gx02mnBU0JHWcTIonpmA==}
engines: {node: '>= 10'}
slacc@0.1.5:
resolution: {integrity: sha512-rl7VNJQvmxZ/nmBepSGypPi6tNTOTK/j90yVCbqYaeNe7NiZD03SGM5SxpTRwxf2PH30TgDAHWPsjQ9Tt49sMQ==}
engines: {node: '>=24 || ^23.6.0 || ^22.14.0'}
slash@3.0.0:
resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
@@ -19728,60 +19729,60 @@ snapshots:
nise: 6.1.1
supports-color: 7.2.0
slacc-android-arm-eabi@0.0.10:
slacc-android-arm-eabi@0.1.5:
optional: true
slacc-android-arm64@0.0.10:
slacc-android-arm64@0.1.5:
optional: true
slacc-darwin-arm64@0.0.10:
slacc-darwin-arm64@0.1.5:
optional: true
slacc-darwin-universal@0.0.10:
slacc-darwin-universal@0.1.5:
optional: true
slacc-darwin-x64@0.0.10:
slacc-darwin-x64@0.1.5:
optional: true
slacc-freebsd-x64@0.0.10:
slacc-freebsd-x64@0.1.5:
optional: true
slacc-linux-arm-gnueabihf@0.0.10:
slacc-linux-arm-gnueabihf@0.1.5:
optional: true
slacc-linux-arm64-gnu@0.0.10:
slacc-linux-arm64-gnu@0.1.5:
optional: true
slacc-linux-arm64-musl@0.0.10:
slacc-linux-arm64-musl@0.1.5:
optional: true
slacc-linux-x64-gnu@0.0.10:
slacc-linux-x64-gnu@0.1.5:
optional: true
slacc-linux-x64-musl@0.0.10:
slacc-linux-x64-musl@0.1.5:
optional: true
slacc-win32-arm64-msvc@0.0.10:
slacc-win32-arm64-msvc@0.1.5:
optional: true
slacc-win32-x64-msvc@0.0.10:
slacc-win32-x64-msvc@0.1.5:
optional: true
slacc@0.0.10:
slacc@0.1.5:
optionalDependencies:
slacc-android-arm-eabi: 0.0.10
slacc-android-arm64: 0.0.10
slacc-darwin-arm64: 0.0.10
slacc-darwin-universal: 0.0.10
slacc-darwin-x64: 0.0.10
slacc-freebsd-x64: 0.0.10
slacc-linux-arm-gnueabihf: 0.0.10
slacc-linux-arm64-gnu: 0.0.10
slacc-linux-arm64-musl: 0.0.10
slacc-linux-x64-gnu: 0.0.10
slacc-linux-x64-musl: 0.0.10
slacc-win32-arm64-msvc: 0.0.10
slacc-win32-x64-msvc: 0.0.10
slacc-android-arm-eabi: 0.1.5
slacc-android-arm64: 0.1.5
slacc-darwin-arm64: 0.1.5
slacc-darwin-universal: 0.1.5
slacc-darwin-x64: 0.1.5
slacc-freebsd-x64: 0.1.5
slacc-linux-arm-gnueabihf: 0.1.5
slacc-linux-arm64-gnu: 0.1.5
slacc-linux-arm64-musl: 0.1.5
slacc-linux-x64-gnu: 0.1.5
slacc-linux-x64-musl: 0.1.5
slacc-win32-arm64-msvc: 0.1.5
slacc-win32-x64-msvc: 0.1.5
slash@3.0.0: {}

View File

@@ -33,7 +33,22 @@ onlyBuiltDependencies:
ignorePatchFailures: false
minimumReleaseAge: 10080 # delay 7days to mitigate supply-chain attack
minimumReleaseAgeExclude:
- '@syuilo/aiscript'
- '@misskey-dev/*'
- '@syuilo/aiscript'
- buraha
- mfm-js
- slacc
- slacc-android-arm-eabi
- slacc-android-arm64
- slacc-darwin-arm64
- slacc-darwin-universal
- slacc-darwin-x64
- slacc-freebsd-x64
- slacc-linux-arm-gnueabihf
- slacc-linux-arm64-gnu
- slacc-linux-arm64-musl
- slacc-linux-x64-gnu
- slacc-linux-x64-musl
- slacc-win32-arm64-msvc
- slacc-win32-x64-msvc
- '@typescript/native-preview*'