2024-08-13 04:53:07 +03:00
|
|
|
import { Worker, parentPort } from 'node:worker_threads'
|
2024-03-23 18:13:31 +03:00
|
|
|
|
2024-08-13 04:53:07 +03:00
|
|
|
import type {
|
2024-03-23 18:13:31 +03:00
|
|
|
ClientMessageHandler,
|
|
|
|
RespondFn,
|
|
|
|
SendFn,
|
|
|
|
SomeWorker,
|
|
|
|
TelegramWorkerOptions,
|
|
|
|
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-11-16 16:00:12 +03:00
|
|
|
import { BunPlatform } from './platform.js'
|
2024-03-23 18:13:31 +03:00
|
|
|
|
2024-09-18 02:10:36 +03:00
|
|
|
export type { TelegramWorkerOptions, WorkerCustomMethods }
|
|
|
|
|
|
|
|
export interface TelegramWorkerPortOptions {
|
|
|
|
worker: SomeWorker
|
|
|
|
}
|
2024-03-23 18:13:31 +03:00
|
|
|
|
|
|
|
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> {
|
2024-09-18 02:10:36 +03:00
|
|
|
constructor(options: TelegramWorkerPortOptions) {
|
|
|
|
super({
|
|
|
|
worker: options.worker,
|
|
|
|
platform: new BunPlatform(),
|
|
|
|
})
|
2024-03-23 18:13:31 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
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)
|
|
|
|
},
|
|
|
|
]
|
|
|
|
}
|
|
|
|
}
|