mirror of https://github.com/jkjoy/sunpeiwen.git
304 lines
6.2 KiB
JavaScript
304 lines
6.2 KiB
JavaScript
|
'use strict'
|
||
|
|
||
|
const { webidl } = require('../fetch/webidl')
|
||
|
const { kEnumerableProperty } = require('../core/util')
|
||
|
const { MessagePort } = require('worker_threads')
|
||
|
|
||
|
/**
|
||
|
* @see https://html.spec.whatwg.org/multipage/comms.html#messageevent
|
||
|
*/
|
||
|
class MessageEvent extends Event {
|
||
|
#eventInit
|
||
|
|
||
|
constructor (type, eventInitDict = {}) {
|
||
|
webidl.argumentLengthCheck(arguments, 1, { header: 'MessageEvent constructor' })
|
||
|
|
||
|
type = webidl.converters.DOMString(type)
|
||
|
eventInitDict = webidl.converters.MessageEventInit(eventInitDict)
|
||
|
|
||
|
super(type, eventInitDict)
|
||
|
|
||
|
this.#eventInit = eventInitDict
|
||
|
}
|
||
|
|
||
|
get data () {
|
||
|
webidl.brandCheck(this, MessageEvent)
|
||
|
|
||
|
return this.#eventInit.data
|
||
|
}
|
||
|
|
||
|
get origin () {
|
||
|
webidl.brandCheck(this, MessageEvent)
|
||
|
|
||
|
return this.#eventInit.origin
|
||
|
}
|
||
|
|
||
|
get lastEventId () {
|
||
|
webidl.brandCheck(this, MessageEvent)
|
||
|
|
||
|
return this.#eventInit.lastEventId
|
||
|
}
|
||
|
|
||
|
get source () {
|
||
|
webidl.brandCheck(this, MessageEvent)
|
||
|
|
||
|
return this.#eventInit.source
|
||
|
}
|
||
|
|
||
|
get ports () {
|
||
|
webidl.brandCheck(this, MessageEvent)
|
||
|
|
||
|
if (!Object.isFrozen(this.#eventInit.ports)) {
|
||
|
Object.freeze(this.#eventInit.ports)
|
||
|
}
|
||
|
|
||
|
return this.#eventInit.ports
|
||
|
}
|
||
|
|
||
|
initMessageEvent (
|
||
|
type,
|
||
|
bubbles = false,
|
||
|
cancelable = false,
|
||
|
data = null,
|
||
|
origin = '',
|
||
|
lastEventId = '',
|
||
|
source = null,
|
||
|
ports = []
|
||
|
) {
|
||
|
webidl.brandCheck(this, MessageEvent)
|
||
|
|
||
|
webidl.argumentLengthCheck(arguments, 1, { header: 'MessageEvent.initMessageEvent' })
|
||
|
|
||
|
return new MessageEvent(type, {
|
||
|
bubbles, cancelable, data, origin, lastEventId, source, ports
|
||
|
})
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @see https://websockets.spec.whatwg.org/#the-closeevent-interface
|
||
|
*/
|
||
|
class CloseEvent extends Event {
|
||
|
#eventInit
|
||
|
|
||
|
constructor (type, eventInitDict = {}) {
|
||
|
webidl.argumentLengthCheck(arguments, 1, { header: 'CloseEvent constructor' })
|
||
|
|
||
|
type = webidl.converters.DOMString(type)
|
||
|
eventInitDict = webidl.converters.CloseEventInit(eventInitDict)
|
||
|
|
||
|
super(type, eventInitDict)
|
||
|
|
||
|
this.#eventInit = eventInitDict
|
||
|
}
|
||
|
|
||
|
get wasClean () {
|
||
|
webidl.brandCheck(this, CloseEvent)
|
||
|
|
||
|
return this.#eventInit.wasClean
|
||
|
}
|
||
|
|
||
|
get code () {
|
||
|
webidl.brandCheck(this, CloseEvent)
|
||
|
|
||
|
return this.#eventInit.code
|
||
|
}
|
||
|
|
||
|
get reason () {
|
||
|
webidl.brandCheck(this, CloseEvent)
|
||
|
|
||
|
return this.#eventInit.reason
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// https://html.spec.whatwg.org/multipage/webappapis.html#the-errorevent-interface
|
||
|
class ErrorEvent extends Event {
|
||
|
#eventInit
|
||
|
|
||
|
constructor (type, eventInitDict) {
|
||
|
webidl.argumentLengthCheck(arguments, 1, { header: 'ErrorEvent constructor' })
|
||
|
|
||
|
super(type, eventInitDict)
|
||
|
|
||
|
type = webidl.converters.DOMString(type)
|
||
|
eventInitDict = webidl.converters.ErrorEventInit(eventInitDict ?? {})
|
||
|
|
||
|
this.#eventInit = eventInitDict
|
||
|
}
|
||
|
|
||
|
get message () {
|
||
|
webidl.brandCheck(this, ErrorEvent)
|
||
|
|
||
|
return this.#eventInit.message
|
||
|
}
|
||
|
|
||
|
get filename () {
|
||
|
webidl.brandCheck(this, ErrorEvent)
|
||
|
|
||
|
return this.#eventInit.filename
|
||
|
}
|
||
|
|
||
|
get lineno () {
|
||
|
webidl.brandCheck(this, ErrorEvent)
|
||
|
|
||
|
return this.#eventInit.lineno
|
||
|
}
|
||
|
|
||
|
get colno () {
|
||
|
webidl.brandCheck(this, ErrorEvent)
|
||
|
|
||
|
return this.#eventInit.colno
|
||
|
}
|
||
|
|
||
|
get error () {
|
||
|
webidl.brandCheck(this, ErrorEvent)
|
||
|
|
||
|
return this.#eventInit.error
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Object.defineProperties(MessageEvent.prototype, {
|
||
|
[Symbol.toStringTag]: {
|
||
|
value: 'MessageEvent',
|
||
|
configurable: true
|
||
|
},
|
||
|
data: kEnumerableProperty,
|
||
|
origin: kEnumerableProperty,
|
||
|
lastEventId: kEnumerableProperty,
|
||
|
source: kEnumerableProperty,
|
||
|
ports: kEnumerableProperty,
|
||
|
initMessageEvent: kEnumerableProperty
|
||
|
})
|
||
|
|
||
|
Object.defineProperties(CloseEvent.prototype, {
|
||
|
[Symbol.toStringTag]: {
|
||
|
value: 'CloseEvent',
|
||
|
configurable: true
|
||
|
},
|
||
|
reason: kEnumerableProperty,
|
||
|
code: kEnumerableProperty,
|
||
|
wasClean: kEnumerableProperty
|
||
|
})
|
||
|
|
||
|
Object.defineProperties(ErrorEvent.prototype, {
|
||
|
[Symbol.toStringTag]: {
|
||
|
value: 'ErrorEvent',
|
||
|
configurable: true
|
||
|
},
|
||
|
message: kEnumerableProperty,
|
||
|
filename: kEnumerableProperty,
|
||
|
lineno: kEnumerableProperty,
|
||
|
colno: kEnumerableProperty,
|
||
|
error: kEnumerableProperty
|
||
|
})
|
||
|
|
||
|
webidl.converters.MessagePort = webidl.interfaceConverter(MessagePort)
|
||
|
|
||
|
webidl.converters['sequence<MessagePort>'] = webidl.sequenceConverter(
|
||
|
webidl.converters.MessagePort
|
||
|
)
|
||
|
|
||
|
const eventInit = [
|
||
|
{
|
||
|
key: 'bubbles',
|
||
|
converter: webidl.converters.boolean,
|
||
|
defaultValue: false
|
||
|
},
|
||
|
{
|
||
|
key: 'cancelable',
|
||
|
converter: webidl.converters.boolean,
|
||
|
defaultValue: false
|
||
|
},
|
||
|
{
|
||
|
key: 'composed',
|
||
|
converter: webidl.converters.boolean,
|
||
|
defaultValue: false
|
||
|
}
|
||
|
]
|
||
|
|
||
|
webidl.converters.MessageEventInit = webidl.dictionaryConverter([
|
||
|
...eventInit,
|
||
|
{
|
||
|
key: 'data',
|
||
|
converter: webidl.converters.any,
|
||
|
defaultValue: null
|
||
|
},
|
||
|
{
|
||
|
key: 'origin',
|
||
|
converter: webidl.converters.USVString,
|
||
|
defaultValue: ''
|
||
|
},
|
||
|
{
|
||
|
key: 'lastEventId',
|
||
|
converter: webidl.converters.DOMString,
|
||
|
defaultValue: ''
|
||
|
},
|
||
|
{
|
||
|
key: 'source',
|
||
|
// Node doesn't implement WindowProxy or ServiceWorker, so the only
|
||
|
// valid value for source is a MessagePort.
|
||
|
converter: webidl.nullableConverter(webidl.converters.MessagePort),
|
||
|
defaultValue: null
|
||
|
},
|
||
|
{
|
||
|
key: 'ports',
|
||
|
converter: webidl.converters['sequence<MessagePort>'],
|
||
|
get defaultValue () {
|
||
|
return []
|
||
|
}
|
||
|
}
|
||
|
])
|
||
|
|
||
|
webidl.converters.CloseEventInit = webidl.dictionaryConverter([
|
||
|
...eventInit,
|
||
|
{
|
||
|
key: 'wasClean',
|
||
|
converter: webidl.converters.boolean,
|
||
|
defaultValue: false
|
||
|
},
|
||
|
{
|
||
|
key: 'code',
|
||
|
converter: webidl.converters['unsigned short'],
|
||
|
defaultValue: 0
|
||
|
},
|
||
|
{
|
||
|
key: 'reason',
|
||
|
converter: webidl.converters.USVString,
|
||
|
defaultValue: ''
|
||
|
}
|
||
|
])
|
||
|
|
||
|
webidl.converters.ErrorEventInit = webidl.dictionaryConverter([
|
||
|
...eventInit,
|
||
|
{
|
||
|
key: 'message',
|
||
|
converter: webidl.converters.DOMString,
|
||
|
defaultValue: ''
|
||
|
},
|
||
|
{
|
||
|
key: 'filename',
|
||
|
converter: webidl.converters.USVString,
|
||
|
defaultValue: ''
|
||
|
},
|
||
|
{
|
||
|
key: 'lineno',
|
||
|
converter: webidl.converters['unsigned long'],
|
||
|
defaultValue: 0
|
||
|
},
|
||
|
{
|
||
|
key: 'colno',
|
||
|
converter: webidl.converters['unsigned long'],
|
||
|
defaultValue: 0
|
||
|
},
|
||
|
{
|
||
|
key: 'error',
|
||
|
converter: webidl.converters.any
|
||
|
}
|
||
|
])
|
||
|
|
||
|
module.exports = {
|
||
|
MessageEvent,
|
||
|
CloseEvent,
|
||
|
ErrorEvent
|
||
|
}
|