64 lines
1.5 KiB
TypeScript
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()
|
|
}
|
|
}
|