diff --git a/.config/cypress-devcontainer.yml b/.config/cypress-devcontainer.yml index 8b11c8413c..7656526019 100644 --- a/.config/cypress-devcontainer.yml +++ b/.config/cypress-devcontainer.yml @@ -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 diff --git a/.config/docker_example.yml b/.config/docker_example.yml index dc354324dc..60a314c31c 100644 --- a/.config/docker_example.yml +++ b/.config/docker_example.yml @@ -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 diff --git a/.config/example.yml b/.config/example.yml index c7884a3687..0aa8940677 100644 --- a/.config/example.yml +++ b/.config/example.yml @@ -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 diff --git a/.devcontainer/devcontainer.yml b/.devcontainer/devcontainer.yml index fb0d25c214..cd99d063d5 100644 --- a/.devcontainer/devcontainer.yml +++ b/.devcontainer/devcontainer.yml @@ -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 diff --git a/CHANGELOG.md b/CHANGELOG.md index 2206c1d80b..7c011b8c89 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 diff --git a/chart/files/default.yml b/chart/files/default.yml index 8fa0b39eff..c148cade9f 100644 --- a/chart/files/default.yml +++ b/chart/files/default.yml @@ -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 diff --git a/packages/backend/package.json b/packages/backend/package.json index b75d85bf9f..0f8f28aceb 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -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", diff --git a/packages/backend/src/boot/common.ts b/packages/backend/src/boot/common.ts index 25cc7c6797..b27e8c1d6b 100644 --- a/packages/backend/src/boot/common.ts +++ b/packages/backend/src/boot/common.ts @@ -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'); diff --git a/packages/backend/src/boot/master.ts b/packages/backend/src/boot/master.ts index 041f58e509..533ebe5bbb 100644 --- a/packages/backend/src/boot/master.ts +++ b/packages/backend/src/boot/master.ts @@ -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'); diff --git a/packages/backend/src/boot/worker.ts b/packages/backend/src/boot/worker.ts index 3feb6fd199..d8fb1eeaac 100644 --- a/packages/backend/src/boot/worker.ts +++ b/packages/backend/src/boot/worker.ts @@ -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'); diff --git a/packages/backend/src/config.ts b/packages/backend/src/config.ts index d2b11ef9f4..d67fe6fc6f 100644 --- a/packages/backend/src/config.ts +++ b/packages/backend/src/config.ts @@ -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, diff --git a/packages/backend/src/core/activitypub/ApRequestService.ts b/packages/backend/src/core/activitypub/ApRequestService.ts index 0ad885a17c..9e2a12c6f6 100644 --- a/packages/backend/src/core/activitypub/ApRequestService.ts +++ b/packages/backend/src/core/activitypub/ApRequestService.ts @@ -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 }): Signed { + static async createSignedPost(args: { key: PrivateKey, url: string, body: string, digest?: string, additionalHeaders: Record }): Promise { 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 }): Signed { + static async createSignedGet(args: { key: PrivateKey, url: string, additionalHeaders: Record }): Promise { 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 { 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`, diff --git a/packages/backend/src/core/activitypub/JsonLdService.ts b/packages/backend/src/core/activitypub/JsonLdService.ts index 100d4fa19f..7c7dc01510 100644 --- a/packages/backend/src/core/activitypub/JsonLdService.ts +++ b/packages/backend/src/core/activitypub/JsonLdService.ts @@ -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, diff --git a/packages/backend/test/environment.unit.ts b/packages/backend/test/environment.unit.ts new file mode 100644 index 0000000000..65df110903 --- /dev/null +++ b/packages/backend/test/environment.unit.ts @@ -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; diff --git a/packages/backend/test/unit/ap-request.ts b/packages/backend/test/unit/ap-request.ts index 83bcdb717b..249117ca64 100644 --- a/packages/backend/test/unit/ap-request.ts +++ b/packages/backend/test/unit/ap-request.ts @@ -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'); diff --git a/packages/backend/vitest.config.unit.ts b/packages/backend/vitest.config.unit.ts index 8f341fdc09..61e6f0e5e4 100644 --- a/packages/backend/vitest.config.unit.ts +++ b/packages/backend/vitest.config.unit.ts @@ -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'], }, }), diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d0735db214..65198c2924 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -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: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 1d6b36f582..8d1fcbb508 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -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*'