summaryrefslogtreecommitdiff
path: root/packages/frontend/src/scripts/worker-multi-dispatch.ts
diff options
context:
space:
mode:
authorShun Sakai <sorairolake@protonmail.ch>2023-07-27 14:31:52 +0900
committerGitHub <noreply@github.com>2023-07-27 14:31:52 +0900
commitc2370a1be631355e709c47d3b5e9469906116b84 (patch)
tree75071c994f444f3ceea6ad0225e09b9374ca02ca /packages/frontend/src/scripts/worker-multi-dispatch.ts
parentchore: update pnpm to 8.6.10 (diff)
downloadmisskey-c2370a1be631355e709c47d3b5e9469906116b84.tar.gz
misskey-c2370a1be631355e709c47d3b5e9469906116b84.tar.bz2
misskey-c2370a1be631355e709c47d3b5e9469906116b84.zip
chore: 著作権とライセンスについての情報を各ファイルに追加する (#11348)
* chore: Add the SPDX information to each file Add copyright and licensing information as defined in version 3.0 of the REUSE Specification. * tweak format --------- Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
Diffstat (limited to 'packages/frontend/src/scripts/worker-multi-dispatch.ts')
-rw-r--r--packages/frontend/src/scripts/worker-multi-dispatch.ts127
1 files changed, 66 insertions, 61 deletions
diff --git a/packages/frontend/src/scripts/worker-multi-dispatch.ts b/packages/frontend/src/scripts/worker-multi-dispatch.ts
index 1847a8ccff..1d184e99a1 100644
--- a/packages/frontend/src/scripts/worker-multi-dispatch.ts
+++ b/packages/frontend/src/scripts/worker-multi-dispatch.ts
@@ -1,75 +1,80 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and other misskey contributors
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
function defaultUseWorkerNumber(prev: number, totalWorkers: number) {
- return prev + 1;
+ return prev + 1;
}
export class WorkerMultiDispatch<POST = any, RETURN = any> {
- private symbol = Symbol('WorkerMultiDispatch');
- private workers: Worker[] = [];
- private terminated = false;
- private prevWorkerNumber = 0;
- private getUseWorkerNumber = defaultUseWorkerNumber;
- private finalizationRegistry: FinalizationRegistry<symbol>;
+ private symbol = Symbol('WorkerMultiDispatch');
+ private workers: Worker[] = [];
+ private terminated = false;
+ private prevWorkerNumber = 0;
+ private getUseWorkerNumber = defaultUseWorkerNumber;
+ private finalizationRegistry: FinalizationRegistry<symbol>;
- constructor(workerConstructor: () => Worker, concurrency: number, getUseWorkerNumber = defaultUseWorkerNumber) {
- this.getUseWorkerNumber = getUseWorkerNumber;
- for (let i = 0; i < concurrency; i++) {
- this.workers.push(workerConstructor());
- }
+ constructor(workerConstructor: () => Worker, concurrency: number, getUseWorkerNumber = defaultUseWorkerNumber) {
+ this.getUseWorkerNumber = getUseWorkerNumber;
+ for (let i = 0; i < concurrency; i++) {
+ this.workers.push(workerConstructor());
+ }
- this.finalizationRegistry = new FinalizationRegistry(() => {
- this.terminate();
- });
- this.finalizationRegistry.register(this, this.symbol);
+ this.finalizationRegistry = new FinalizationRegistry(() => {
+ this.terminate();
+ });
+ this.finalizationRegistry.register(this, this.symbol);
- if (_DEV_) console.log('WorkerMultiDispatch: Created', this);
- }
+ if (_DEV_) console.log('WorkerMultiDispatch: Created', this);
+ }
- public postMessage(message: POST, options?: Transferable[] | StructuredSerializeOptions, useWorkerNumber: typeof defaultUseWorkerNumber = this.getUseWorkerNumber) {
- let workerNumber = useWorkerNumber(this.prevWorkerNumber, this.workers.length);
- workerNumber = Math.abs(Math.round(workerNumber)) % this.workers.length;
- if (_DEV_) console.log('WorkerMultiDispatch: Posting message to worker', workerNumber, useWorkerNumber);
- this.prevWorkerNumber = workerNumber;
+ public postMessage(message: POST, options?: Transferable[] | StructuredSerializeOptions, useWorkerNumber: typeof defaultUseWorkerNumber = this.getUseWorkerNumber) {
+ let workerNumber = useWorkerNumber(this.prevWorkerNumber, this.workers.length);
+ workerNumber = Math.abs(Math.round(workerNumber)) % this.workers.length;
+ if (_DEV_) console.log('WorkerMultiDispatch: Posting message to worker', workerNumber, useWorkerNumber);
+ this.prevWorkerNumber = workerNumber;
- // 不毛だがunionをoverloadに突っ込めない
- // https://stackoverflow.com/questions/66507585/overload-signatures-union-types-and-no-overload-matches-this-call-error
- // https://github.com/microsoft/TypeScript/issues/14107
- if (Array.isArray(options)) {
- this.workers[workerNumber].postMessage(message, options);
- } else {
- this.workers[workerNumber].postMessage(message, options);
- }
- return workerNumber;
- }
+ // 不毛だがunionをoverloadに突っ込めない
+ // https://stackoverflow.com/questions/66507585/overload-signatures-union-types-and-no-overload-matches-this-call-error
+ // https://github.com/microsoft/TypeScript/issues/14107
+ if (Array.isArray(options)) {
+ this.workers[workerNumber].postMessage(message, options);
+ } else {
+ this.workers[workerNumber].postMessage(message, options);
+ }
+ return workerNumber;
+ }
- public addListener(callback: (this: Worker, ev: MessageEvent<RETURN>) => any, options?: boolean | AddEventListenerOptions) {
- this.workers.forEach(worker => {
- worker.addEventListener('message', callback, options);
- });
- }
+ public addListener(callback: (this: Worker, ev: MessageEvent<RETURN>) => any, options?: boolean | AddEventListenerOptions) {
+ this.workers.forEach(worker => {
+ worker.addEventListener('message', callback, options);
+ });
+ }
- public removeListener(callback: (this: Worker, ev: MessageEvent<RETURN>) => any, options?: boolean | AddEventListenerOptions) {
- this.workers.forEach(worker => {
- worker.removeEventListener('message', callback, options);
- });
- }
+ public removeListener(callback: (this: Worker, ev: MessageEvent<RETURN>) => any, options?: boolean | AddEventListenerOptions) {
+ this.workers.forEach(worker => {
+ worker.removeEventListener('message', callback, options);
+ });
+ }
- public terminate() {
- this.terminated = true;
- if (_DEV_) console.log('WorkerMultiDispatch: Terminating', this);
- this.workers.forEach(worker => {
- worker.terminate();
- });
- this.workers = [];
- this.finalizationRegistry.unregister(this);
- }
+ public terminate() {
+ this.terminated = true;
+ if (_DEV_) console.log('WorkerMultiDispatch: Terminating', this);
+ this.workers.forEach(worker => {
+ worker.terminate();
+ });
+ this.workers = [];
+ this.finalizationRegistry.unregister(this);
+ }
- public isTerminated() {
- return this.terminated;
- }
- public getWorkers() {
- return this.workers;
- }
- public getSymbol() {
- return this.symbol;
- }
+ public isTerminated() {
+ return this.terminated;
+ }
+ public getWorkers() {
+ return this.workers;
+ }
+ public getSymbol() {
+ return this.symbol;
+ }
}