chore: minor cleanup
This commit is contained in:
parent
cb04b111a5
commit
a7ae3735c6
8 changed files with 39 additions and 170 deletions
|
@ -38,7 +38,7 @@ export class BaseTelegramClient extends BaseTelegramClientBase {
|
||||||
constructor(opts: BaseTelegramClientOptions) {
|
constructor(opts: BaseTelegramClientOptions) {
|
||||||
super({
|
super({
|
||||||
crypto: new BunCryptoProvider(),
|
crypto: new BunCryptoProvider(),
|
||||||
transport: TcpTransport,
|
transport: new TcpTransport(),
|
||||||
platform: new BunPlatform(),
|
platform: new BunPlatform(),
|
||||||
...opts,
|
...opts,
|
||||||
storage:
|
storage:
|
||||||
|
|
|
@ -2,7 +2,8 @@ export * from './client.js'
|
||||||
export * from './platform.js'
|
export * from './platform.js'
|
||||||
export * from './sqlite/index.js'
|
export * from './sqlite/index.js'
|
||||||
export * from './utils/crypto.js'
|
export * from './utils/crypto.js'
|
||||||
// export * from './utils/tcp.js'
|
export * from './utils/tcp.js'
|
||||||
|
export * from './utils/proxies.js'
|
||||||
export * from './worker.js'
|
export * from './worker.js'
|
||||||
export * from '@mtcute/core'
|
export * from '@mtcute/core'
|
||||||
export * from '@mtcute/html-parser'
|
export * from '@mtcute/html-parser'
|
||||||
|
|
|
@ -1,7 +1,14 @@
|
||||||
import { connectTcp } from '@fuman/bun-net'
|
import { connectTcp } from '@fuman/bun-net'
|
||||||
import { IntermediatePacketCodec, type TelegramTransport } from '@mtcute/core'
|
import { IntermediatePacketCodec, type TelegramTransport } from '@mtcute/core'
|
||||||
|
import type { ITcpConnection } from '@fuman/net'
|
||||||
|
import type { BasicDcOption } from '@mtcute/core/utils.js'
|
||||||
|
|
||||||
export const TcpTransport: TelegramTransport = {
|
export class TcpTransport implements TelegramTransport {
|
||||||
connect: dc => connectTcp({ address: dc.ipAddress, port: dc.port }),
|
connect(dc: BasicDcOption): Promise<ITcpConnection> {
|
||||||
packetCodec: () => new IntermediatePacketCodec(),
|
return connectTcp({ address: dc.ipAddress, port: dc.port })
|
||||||
|
}
|
||||||
|
|
||||||
|
packetCodec(): IntermediatePacketCodec {
|
||||||
|
return new IntermediatePacketCodec()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,7 +37,7 @@ export class BaseTelegramClient extends BaseTelegramClientBase {
|
||||||
constructor(opts: BaseTelegramClientOptions) {
|
constructor(opts: BaseTelegramClientOptions) {
|
||||||
super({
|
super({
|
||||||
crypto: new DenoCryptoProvider(),
|
crypto: new DenoCryptoProvider(),
|
||||||
transport: TcpTransport,
|
transport: new TcpTransport(),
|
||||||
platform: new DenoPlatform(),
|
platform: new DenoPlatform(),
|
||||||
...opts,
|
...opts,
|
||||||
storage:
|
storage:
|
||||||
|
|
|
@ -1,7 +1,14 @@
|
||||||
import { connectTcp } from '@fuman/deno-net'
|
import { connectTcp } from '@fuman/deno-net'
|
||||||
|
import type { ITcpConnection } from '@fuman/net'
|
||||||
import { IntermediatePacketCodec, type TelegramTransport } from '@mtcute/core'
|
import { IntermediatePacketCodec, type TelegramTransport } from '@mtcute/core'
|
||||||
|
import type { BasicDcOption } from '@mtcute/core/utils.js'
|
||||||
|
|
||||||
export const TcpTransport: TelegramTransport = {
|
export class TcpTransport implements TelegramTransport {
|
||||||
connect: dc => connectTcp({ address: dc.ipAddress, port: dc.port }),
|
connect(dc: BasicDcOption): Promise<ITcpConnection> {
|
||||||
packetCodec: () => new IntermediatePacketCodec(),
|
return connectTcp({ address: dc.ipAddress, port: dc.port })
|
||||||
|
}
|
||||||
|
|
||||||
|
packetCodec(): IntermediatePacketCodec {
|
||||||
|
return new IntermediatePacketCodec()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,15 @@
|
||||||
|
import type { ITcpConnection } from '@fuman/net'
|
||||||
import { connectTcp } from '@fuman/node'
|
import { connectTcp } from '@fuman/node'
|
||||||
import type { TelegramTransport } from '@mtcute/core'
|
import type { TelegramTransport } from '@mtcute/core'
|
||||||
import { IntermediatePacketCodec } from '@mtcute/core'
|
import { IntermediatePacketCodec } from '@mtcute/core'
|
||||||
|
import type { BasicDcOption } from '@mtcute/core/utils.js'
|
||||||
|
|
||||||
export const TcpTransport: TelegramTransport = {
|
export class TcpTransport implements TelegramTransport {
|
||||||
connect: dc => connectTcp({ address: dc.ipAddress, port: dc.port }),
|
connect(dc: BasicDcOption): Promise<ITcpConnection> {
|
||||||
packetCodec: () => new IntermediatePacketCodec(),
|
return connectTcp({ address: dc.ipAddress, port: dc.port })
|
||||||
|
}
|
||||||
|
|
||||||
|
packetCodec(): IntermediatePacketCodec {
|
||||||
|
return new IntermediatePacketCodec()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,141 +0,0 @@
|
||||||
// todo: move to fuman
|
|
||||||
// import type { Mock, MockedObject } from 'vitest'
|
|
||||||
// import { describe, expect, it, vi } from 'vitest'
|
|
||||||
// import { TransportState } from '@mtcute/core'
|
|
||||||
// import { getPlatform } from '@mtcute/core/platform.js'
|
|
||||||
// import { LogManager, defaultProductionDc } from '@mtcute/core/utils.js'
|
|
||||||
// import { defaultTestCryptoProvider, u8HexDecode } from '@mtcute/test'
|
|
||||||
|
|
||||||
// import { WebSocketTransport } from './websocket.js'
|
|
||||||
|
|
||||||
// const p = getPlatform()
|
|
||||||
|
|
||||||
// describe('WebSocketTransport', () => {
|
|
||||||
// const create = async () => {
|
|
||||||
// let closeListener: () => void = () => {}
|
|
||||||
// const fakeWs = vi.fn().mockImplementation(() => ({
|
|
||||||
// addEventListener: vi.fn().mockImplementation((event: string, cb: () => void) => {
|
|
||||||
// if (event === 'open') {
|
|
||||||
// cb()
|
|
||||||
// }
|
|
||||||
// if (event === 'close') {
|
|
||||||
// closeListener = cb
|
|
||||||
// }
|
|
||||||
// }),
|
|
||||||
// removeEventListener: vi.fn(),
|
|
||||||
// close: vi.fn().mockImplementation(() => closeListener()),
|
|
||||||
// send: vi.fn(),
|
|
||||||
// }))
|
|
||||||
|
|
||||||
// const transport = new WebSocketTransport({ ws: fakeWs })
|
|
||||||
// const logger = new LogManager()
|
|
||||||
// logger.level = 10
|
|
||||||
// transport.setup(await defaultTestCryptoProvider(), logger)
|
|
||||||
|
|
||||||
// return [transport, fakeWs] as const
|
|
||||||
// }
|
|
||||||
|
|
||||||
// const getLastSocket = (ws: Mock) => {
|
|
||||||
// return ws.mock.results[ws.mock.results.length - 1].value as MockedObject<WebSocket>
|
|
||||||
// }
|
|
||||||
|
|
||||||
// it('should initiate a websocket connection to the given dc', async () => {
|
|
||||||
// const [t, ws] = await create()
|
|
||||||
|
|
||||||
// t.connect(defaultProductionDc.main, false)
|
|
||||||
|
|
||||||
// expect(ws).toHaveBeenCalledOnce()
|
|
||||||
// expect(ws).toHaveBeenCalledWith('wss://venus.web.telegram.org/apiws', 'binary')
|
|
||||||
// await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready))
|
|
||||||
// })
|
|
||||||
|
|
||||||
// it('should set up event handlers', async () => {
|
|
||||||
// const [t, ws] = await create()
|
|
||||||
|
|
||||||
// t.connect(defaultProductionDc.main, false)
|
|
||||||
// const socket = getLastSocket(ws)
|
|
||||||
|
|
||||||
// expect(socket.addEventListener).toHaveBeenCalledWith('message', expect.any(Function))
|
|
||||||
// expect(socket.addEventListener).toHaveBeenCalledWith('error', expect.any(Function))
|
|
||||||
// expect(socket.addEventListener).toHaveBeenCalledWith('close', expect.any(Function))
|
|
||||||
// })
|
|
||||||
|
|
||||||
// it('should write packet codec tag to the socket', async () => {
|
|
||||||
// const [t, ws] = await create()
|
|
||||||
|
|
||||||
// t.connect(defaultProductionDc.main, false)
|
|
||||||
// const socket = getLastSocket(ws)
|
|
||||||
|
|
||||||
// await vi.waitFor(() =>
|
|
||||||
// expect(socket.send).toHaveBeenCalledWith(
|
|
||||||
// u8HexDecode(
|
|
||||||
// '29afd26df40fb8ed10b6b4ad6d56ef5df9453f88e6ee6adb6e0544ba635dc6a8a990c9b8b980c343936b33fa7f97bae025102532233abb26d4a1fe6d34f1ba08',
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// )
|
|
||||||
// })
|
|
||||||
|
|
||||||
// it('should write to the underlying socket', async () => {
|
|
||||||
// const [t, ws] = await create()
|
|
||||||
|
|
||||||
// t.connect(defaultProductionDc.main, false)
|
|
||||||
// const socket = getLastSocket(ws)
|
|
||||||
// await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready))
|
|
||||||
|
|
||||||
// await t.send(p.hexDecode('00010203040506070809'))
|
|
||||||
|
|
||||||
// expect(socket.send).toHaveBeenCalledWith(u8HexDecode('af020630c8ef14bcf53af33853ea'))
|
|
||||||
// })
|
|
||||||
|
|
||||||
// it('should correctly close', async () => {
|
|
||||||
// const [t, ws] = await create()
|
|
||||||
|
|
||||||
// t.connect(defaultProductionDc.main, false)
|
|
||||||
// const socket = getLastSocket(ws)
|
|
||||||
// await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready))
|
|
||||||
|
|
||||||
// await t.close()
|
|
||||||
|
|
||||||
// expect(socket.close).toHaveBeenCalled()
|
|
||||||
// })
|
|
||||||
|
|
||||||
// it('should correctly handle incoming messages', async () => {
|
|
||||||
// const [t, ws] = await create()
|
|
||||||
|
|
||||||
// const feedSpy = vi.spyOn(t._packetCodec, 'feed')
|
|
||||||
|
|
||||||
// t.connect(defaultProductionDc.main, false)
|
|
||||||
// const socket = getLastSocket(ws)
|
|
||||||
// await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready))
|
|
||||||
|
|
||||||
// const data = p.hexDecode('00010203040506070809')
|
|
||||||
// const message = new MessageEvent('message', { data })
|
|
||||||
|
|
||||||
// const onMessageCall = socket.addEventListener.mock.calls.find(([event]) => event === 'message') as unknown as [
|
|
||||||
// string,
|
|
||||||
// (evt: MessageEvent) => void,
|
|
||||||
// ]
|
|
||||||
// onMessageCall[1](message)
|
|
||||||
|
|
||||||
// expect(feedSpy).toHaveBeenCalledWith(u8HexDecode('00010203040506070809'))
|
|
||||||
// })
|
|
||||||
|
|
||||||
// it('should propagate errors', async () => {
|
|
||||||
// const [t, ws] = await create()
|
|
||||||
|
|
||||||
// const spyEmit = vi.spyOn(t, 'emit').mockImplementation(() => true)
|
|
||||||
|
|
||||||
// t.connect(defaultProductionDc.main, false)
|
|
||||||
// const socket = getLastSocket(ws)
|
|
||||||
// await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready))
|
|
||||||
|
|
||||||
// const error = new Error('test')
|
|
||||||
// const onErrorCall = socket.addEventListener.mock.calls.find(([event]) => event === 'error') as unknown as [
|
|
||||||
// string,
|
|
||||||
// (evt: { error: Error }) => void,
|
|
||||||
// ]
|
|
||||||
// onErrorCall[1]({ error })
|
|
||||||
|
|
||||||
// expect(spyEmit).toHaveBeenCalledWith('error', error)
|
|
||||||
// })
|
|
||||||
// })
|
|
|
@ -8,14 +8,11 @@ import {
|
||||||
MtUnsupportedError,
|
MtUnsupportedError,
|
||||||
ObfuscatedPacketCodec,
|
ObfuscatedPacketCodec,
|
||||||
} from '@mtcute/core'
|
} from '@mtcute/core'
|
||||||
import { WebSocketConnection } from '@fuman/net'
|
import type { WebSocketConstructor } from '@fuman/net'
|
||||||
|
import { connectWs } from '@fuman/net'
|
||||||
|
|
||||||
import type { BasicDcOption } from './utils'
|
import type { BasicDcOption } from './utils'
|
||||||
|
|
||||||
export interface WebSocketConstructor {
|
|
||||||
new (address: string, protocol?: string): WebSocket
|
|
||||||
}
|
|
||||||
|
|
||||||
const subdomainsMap: Record<string, string> = {
|
const subdomainsMap: Record<string, string> = {
|
||||||
1: 'pluto',
|
1: 'pluto',
|
||||||
2: 'venus',
|
2: 'venus',
|
||||||
|
@ -60,18 +57,9 @@ export class WebSocketTransport implements TelegramTransport {
|
||||||
async connect(dc: BasicDcOption, testMode: boolean): Promise<ITelegramConnection> {
|
async connect(dc: BasicDcOption, testMode: boolean): Promise<ITelegramConnection> {
|
||||||
const url = `wss://${this._subdomains[dc.id]}.${this._baseDomain}/apiws${testMode ? '_test' : ''}`
|
const url = `wss://${this._subdomains[dc.id]}.${this._baseDomain}/apiws${testMode ? '_test' : ''}`
|
||||||
|
|
||||||
return new Promise((resolve, reject) => {
|
return connectWs({
|
||||||
const socket = new this._WebSocket(url)
|
url,
|
||||||
|
implementation: this._WebSocket,
|
||||||
const onError = (event: Event) => {
|
|
||||||
socket.removeEventListener('error', onError)
|
|
||||||
reject(event)
|
|
||||||
}
|
|
||||||
socket.addEventListener('error', onError)
|
|
||||||
socket.addEventListener('open', () => {
|
|
||||||
socket.removeEventListener('error', onError)
|
|
||||||
resolve(new WebSocketConnection(socket))
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue