diff --git a/packages/ws/README.md b/packages/ws/README.md index 654ad6894..4e767ad5c 100644 --- a/packages/ws/README.md +++ b/packages/ws/README.md @@ -132,6 +132,10 @@ const manager = new WebSocketManager({ new WorkerShardingStrategy(manager, { shardsPerWorker: 2, workerPath: './worker.js', + // Optionally, if you you have custom messaging, like for analytic collection, you can use this: + async unknownPayloadHandler(data: any) { + // handle data here :3 + }, }), }); ``` @@ -140,6 +144,7 @@ And your `worker.ts` file: ```ts import { WorkerBootstrapper, WebSocketShardEvents } from '@discordjs/ws'; +import { parentPort } from 'node:worker_threads'; const bootstrapper = new WorkerBootstrapper(); void bootstrapper.bootstrap({ @@ -158,6 +163,9 @@ void bootstrapper.bootstrap({ }); }, }); + +// This will go to `unknownPayloadHandler` in the main thread, or be ignored if not provided +parentPort!.postMessage({ custom: 'data' }); ``` ## Links diff --git a/packages/ws/src/strategies/sharding/WorkerShardingStrategy.ts b/packages/ws/src/strategies/sharding/WorkerShardingStrategy.ts index fbca00c31..9960bc7a7 100644 --- a/packages/ws/src/strategies/sharding/WorkerShardingStrategy.ts +++ b/packages/ws/src/strategies/sharding/WorkerShardingStrategy.ts @@ -66,6 +66,10 @@ export interface WorkerShardingStrategyOptions { * Dictates how many shards should be spawned per worker thread. */ shardsPerWorker: number | 'all'; + /** + * Handles a payload not recognized by the handler. + */ + unknownPayloadHandler?(payload: any): unknown; /** * Path to the worker file to use. The worker requires quite a bit of setup, it is recommended you leverage the {@link WorkerBootstrapper} class. */ @@ -225,7 +229,13 @@ export class WorkerShardingStrategy implements IShardingStrategy { .on('messageerror', (err) => { throw err; }) - .on('message', async (payload: WorkerReceivePayload) => this.onMessage(worker, payload)); + .on('message', async (payload: any) => { + if ('op' in payload) { + await this.onMessage(worker, payload); + } else { + await this.options.unknownPayloadHandler?.(payload); + } + }); this.#workers.push(worker); for (const shardId of workerData.shardIds) { @@ -347,6 +357,11 @@ export class WorkerShardingStrategy implements IShardingStrategy { break; } + + default: { + await this.options.unknownPayloadHandler?.(payload); + break; + } } }