2024-08-13 04:53:07 +03:00
|
|
|
import { Worker, parentPort } from 'node:worker_threads'
|
2024-03-23 18:13:31 +03:00
|
|
|
|
|
|
|
import { setPlatform } from '@mtcute/core/platform.js'
|
2024-08-13 04:53:07 +03:00
|
|
|
import type {
|
2024-03-23 18:13:31 +03:00
|
|
|
ClientMessageHandler,
|
|
|
|
RespondFn,
|
|
|
|
SendFn,
|
|
|
|
SomeWorker,
|
|
|
|
TelegramWorkerOptions,
|
|
|
|
TelegramWorkerPortOptions,
|
|
|
|
WorkerCustomMethods,
|
|
|
|
WorkerMessageHandler,
|
|
|
|
} from '@mtcute/core/worker.js'
|
2024-08-13 04:53:07 +03:00
|
|
|
import {
|
|
|
|
TelegramWorker as TelegramWorkerBase,
|
|
|
|
TelegramWorkerPort as TelegramWorkerPortBase,
|
|
|
|
} from '@mtcute/core/worker.js'
|
2024-03-23 18:13:31 +03:00
|
|
|
|
2024-04-28 22:41:28 +03:00
|
|
|
import { BunPlatform } from './platform.js'
|
2024-03-23 18:13:31 +03:00
|
|
|
|
|
|
|
export type { TelegramWorkerOptions, TelegramWorkerPortOptions, WorkerCustomMethods }
|
|
|
|
|
|
|
|
let _registered = false
|
|
|
|
|
|
|
|
export class TelegramWorker<T extends WorkerCustomMethods> extends TelegramWorkerBase<T> {
|
|
|
|
registerWorker(handler: WorkerMessageHandler): RespondFn {
|
|
|
|
if (!parentPort) {
|
|
|
|
throw new Error('TelegramWorker must be created from a worker thread')
|
|
|
|
}
|
|
|
|
if (_registered) {
|
|
|
|
throw new Error('TelegramWorker must be created only once')
|
|
|
|
}
|
|
|
|
|
|
|
|
_registered = true
|
|
|
|
|
|
|
|
const port = parentPort
|
|
|
|
|
|
|
|
const respond: RespondFn = port.postMessage.bind(port)
|
|
|
|
|
2024-08-13 04:53:07 +03:00
|
|
|
// eslint-disable-next-line ts/no-unsafe-argument
|
|
|
|
parentPort.on('message', message => handler(message, respond))
|
2024-03-23 18:13:31 +03:00
|
|
|
|
|
|
|
return respond
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export class TelegramWorkerPort<T extends WorkerCustomMethods> extends TelegramWorkerPortBase<T> {
|
|
|
|
constructor(readonly options: TelegramWorkerPortOptions) {
|
2024-04-28 22:41:28 +03:00
|
|
|
setPlatform(new BunPlatform())
|
2024-03-23 18:13:31 +03:00
|
|
|
super(options)
|
|
|
|
}
|
|
|
|
|
|
|
|
connectToWorker(worker: SomeWorker, handler: ClientMessageHandler): [SendFn, () => void] {
|
|
|
|
if (!(worker instanceof Worker)) {
|
2024-08-13 04:53:07 +03:00
|
|
|
throw new TypeError('Only worker_threads are supported')
|
2024-03-23 18:13:31 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
const send: SendFn = worker.postMessage.bind(worker)
|
|
|
|
|
|
|
|
worker.on('message', handler)
|
|
|
|
|
|
|
|
return [
|
|
|
|
send,
|
|
|
|
() => {
|
|
|
|
worker.off('message', handler)
|
|
|
|
},
|
|
|
|
]
|
|
|
|
}
|
|
|
|
}
|