84 lines
2.3 KiB
JavaScript
84 lines
2.3 KiB
JavaScript
'use strict';
|
|
|
|
const { webidl } = require('../../fetch/webidl');
|
|
const { validateCloseCodeAndReason } = require('../util');
|
|
const { kConstruct } = require('../../../core/symbols');
|
|
const { kEnumerableProperty } = require('../../../core/util');
|
|
|
|
class WebSocketError extends DOMException {
|
|
#closeCode;
|
|
#reason;
|
|
|
|
constructor(message = '', init = undefined) {
|
|
message = webidl.converters.DOMString(message, 'WebSocketError', 'message');
|
|
|
|
// 1. Set this 's name to " WebSocketError ".
|
|
// 2. Set this 's message to message .
|
|
super(message, 'WebSocketError');
|
|
|
|
if (init === kConstruct) {
|
|
return;
|
|
} else if (init !== null) {
|
|
init = webidl.converters.WebSocketCloseInfo(init);
|
|
}
|
|
|
|
// 3. Let code be init [" closeCode "] if it exists , or null otherwise.
|
|
let code = init.closeCode ?? null;
|
|
|
|
// 4. Let reason be init [" reason "] if it exists , or the empty string otherwise.
|
|
const reason = init.reason ?? '';
|
|
|
|
// 5. Validate close code and reason with code and reason .
|
|
validateCloseCodeAndReason(code, reason);
|
|
|
|
// 6. If reason is non-empty, but code is not set, then set code to 1000 ("Normal Closure").
|
|
if (reason.length !== 0 && code === null) {
|
|
code = 1000;
|
|
}
|
|
|
|
// 7. Set this 's closeCode to code .
|
|
this.#closeCode = code;
|
|
|
|
// 8. Set this 's reason to reason .
|
|
this.#reason = reason;
|
|
}
|
|
|
|
get closeCode() {
|
|
return this.#closeCode;
|
|
}
|
|
|
|
get reason() {
|
|
return this.#reason;
|
|
}
|
|
|
|
/**
|
|
* @param {string} message
|
|
* @param {number|null} code
|
|
* @param {string} reason
|
|
*/
|
|
static createUnvalidatedWebSocketError(message, code, reason) {
|
|
const error = new WebSocketError(message, kConstruct);
|
|
error.#closeCode = code;
|
|
error.#reason = reason;
|
|
return error;
|
|
}
|
|
}
|
|
|
|
const { createUnvalidatedWebSocketError } = WebSocketError;
|
|
delete WebSocketError.createUnvalidatedWebSocketError;
|
|
|
|
Object.defineProperties(WebSocketError.prototype, {
|
|
closeCode: kEnumerableProperty,
|
|
reason: kEnumerableProperty,
|
|
[Symbol.toStringTag]: {
|
|
value: 'WebSocketError',
|
|
writable: false,
|
|
enumerable: false,
|
|
configurable: true,
|
|
},
|
|
});
|
|
|
|
webidl.is.WebSocketError = webidl.util.MakeTypeAssertion(WebSocketError);
|
|
|
|
module.exports = { WebSocketError, createUnvalidatedWebSocketError };
|