chore: minor cleanup

This commit is contained in:
alina 🌸 2024-09-18 02:16:30 +03:00
parent cb04b111a5
commit a7ae3735c6
Signed by: teidesu
SSH key fingerprint: SHA256:uNeCpw6aTSU4aIObXLvHfLkDa82HWH9EiOj9AXOIRpI
8 changed files with 39 additions and 170 deletions

View file

@ -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:

View file

@ -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'

View file

@ -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()
}
} }

View file

@ -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:

View file

@ -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()
}
} }

View file

@ -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()
}
} }

View file

@ -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)
// })
// })

View file

@ -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))
})
}) })
} }