iopa
Version:
API-first, Internet of Things (IoT) stack for Typescript, official implementation of the Internet Open Protocols Alliance (IOPA) reference pattern
51 lines (46 loc) • 1.32 kB
text/typescript
import { IExtendableEventTarget, ITraceEvent, ITraceEvents } from '@iopa/types'
export class ExtendableEventTarget
extends EventTarget
implements IExtendableEventTarget
{
public constructor() {
super()
}
public dispatchEvent(event: Event): boolean {
if (!(event instanceof Event)) {
const { type, ...rest } = event as Record<string, any>
const eventInstance = new Event(type)
Object.keys(rest).forEach((key) => {
eventInstance[key] = rest[key]
})
event = eventInstance
}
return super.dispatchEvent(event)
}
public async dispatchEventExtendable(event: Event): Promise<boolean> {
const promises: Promise<any>[] = []
const extendableEvent: ExtendableEvent = {
...event,
waitUntil: (p: Promise<any>) => {
promises.push(p)
}
}
const result = this.dispatchEvent(extendableEvent)
await Promise.all(promises)
return result
}
}
export class TraceEvent extends Event implements ITraceEvent {
public label: string
public get type(): keyof ITraceEvents {
return super.type as keyof ITraceEvents
}
public constructor(
type: string,
eventInitDict?: EventInit & { label: string }
) {
const { label, ...options } = eventInitDict || {}
super(type, options)
this.label = label
}
}