initial commit
This commit is contained in:
35
src/helpers/EventEmitter.ts
Normal file
35
src/helpers/EventEmitter.ts
Normal file
@ -0,0 +1,35 @@
|
||||
/**
|
||||
* fully typed node-like event emitter
|
||||
* usage: `EventEmitter<{ event: eventDataType }>`
|
||||
*/
|
||||
export class EventEmitter<T extends {} = {}> {
|
||||
private listeners: { [E in keyof T]: Set<((data: T[E]) => void)> } = Object.create(null)
|
||||
|
||||
public on<E extends keyof T>(event: E, listener: ((data: T[E]) => void)) {
|
||||
this.listeners[event] ||= new Set()
|
||||
this.listeners[event].add(listener)
|
||||
}
|
||||
|
||||
public off<E extends keyof T>(event: E, listener: ((data: T[E]) => void)) {
|
||||
this.listeners[event]?.delete(listener)
|
||||
if(this.listeners[event]?.size === 0) {
|
||||
delete this.listeners[event]
|
||||
}
|
||||
}
|
||||
|
||||
public once<E extends keyof T>(event: E, listener: ((data: T[E]) => void)) {
|
||||
const wrapped = (data: T[E]) => {
|
||||
this.off(event, wrapped)
|
||||
listener(data)
|
||||
}
|
||||
|
||||
this.on(event, wrapped)
|
||||
}
|
||||
|
||||
protected emit<E extends keyof T>(event: E, data: T[E]) {
|
||||
if(!this.listeners[event]) return
|
||||
for(const listener of this.listeners[event]) {
|
||||
listener(data)
|
||||
}
|
||||
}
|
||||
}
|
16
src/helpers/SocketAdapter.ts
Normal file
16
src/helpers/SocketAdapter.ts
Normal file
@ -0,0 +1,16 @@
|
||||
import { EventEmitter } from '../helpers/EventEmitter'
|
||||
|
||||
export interface SocketAdapterConstructor {
|
||||
new(url: string): SocketAdapter
|
||||
}
|
||||
|
||||
/** cross-platform websocket interface */
|
||||
export abstract class SocketAdapter extends EventEmitter<{
|
||||
message: string,
|
||||
open: null,
|
||||
close: null,
|
||||
error: any
|
||||
}> {
|
||||
public abstract send(message: string): void
|
||||
public abstract close(): void
|
||||
}
|
Reference in New Issue
Block a user