Files
welshman/packages/net/src/Connection.ts
T
2024-11-08 14:35:26 -08:00

64 lines
1.5 KiB
TypeScript

import {Emitter} from '@welshman/lib'
import {normalizeRelayUrl} from '@welshman/util'
import {Socket} from './Socket'
import type {Message} from './Socket'
import {ConnectionEvent} from './ConnectionEvent'
import {ConnectionState} from './ConnectionState'
import {ConnectionStats} from './ConnectionStats'
import {ConnectionAuth} from './ConnectionAuth'
import {ConnectionSender} from './ConnectionSender'
export enum ConnectionStatus {
Ready = "ready",
Closed = "Closed",
Closing = "Closing",
}
const {Ready, Closed, Closing} = ConnectionStatus
export class Connection extends Emitter {
url: string
socket: Socket
sender: ConnectionSender
state: ConnectionState
stats: ConnectionStats
auth: ConnectionAuth
status = Ready
constructor(url: string) {
super()
if (url !== normalizeRelayUrl(url)) {
console.warn(`Attempted to open connection to non-normalized url ${url}`)
}
this.url = url
this.socket = new Socket(this)
this.sender = new ConnectionSender(this)
this.state = new ConnectionState(this)
this.stats = new ConnectionStats(this)
this.auth = new ConnectionAuth(this)
this.setMaxListeners(100)
}
emit = (type: ConnectionEvent, ...args: any[]) => super.emit(type, this, ...args)
send = async (message: Message) => {
await this.socket.open()
if (this.status === Ready) {
this.sender.push(message)
}
}
close = async () => {
this.status = Closing
await this.sender.close()
await this.socket.close()
this.status = Closed
this.removeAllListeners()
}
}