UNPKG

react-native-fast-io

Version:

Modern IO for React Native, built on top of Nitro and Web standards

187 lines (179 loc) 5.43 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.WebSocket = exports.MessageEvent = exports.ErrorEvent = exports.CloseEvent = void 0; var _eventTargetShim = require("event-target-shim"); var _wsNitro = require("../native/ws.nitro.js"); var _blob = require("./blob.js"); var WebSocketReadyState = /*#__PURE__*/function (WebSocketReadyState) { WebSocketReadyState[WebSocketReadyState["CONNECTING"] = 0] = "CONNECTING"; WebSocketReadyState[WebSocketReadyState["OPEN"] = 1] = "OPEN"; WebSocketReadyState[WebSocketReadyState["CLOSING"] = 2] = "CLOSING"; WebSocketReadyState[WebSocketReadyState["CLOSED"] = 3] = "CLOSED"; return WebSocketReadyState; }(WebSocketReadyState || {}); /** * https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.5 */ const ABNORMAL_CLOSURE = 1006; /** * Events */ class MessageEvent extends _eventTargetShim.Event { constructor(data) { super('message'); this.data = data; } } exports.MessageEvent = MessageEvent; class ErrorEvent extends _eventTargetShim.Event { constructor(error) { super('error'); this.error = error; } } exports.ErrorEvent = ErrorEvent; class CloseEvent extends _eventTargetShim.Event { constructor(code = 0, reason = '') { super('close'); this.code = code; this.reason = reason; } get wasClean() { throw new Error('Not implemented'); } } /** * https://websockets.spec.whatwg.org/#interface-definition */ exports.CloseEvent = CloseEvent; class WebSocket extends _eventTargetShim.EventTarget { CONNECTING = WebSocketReadyState.CONNECTING; OPEN = WebSocketReadyState.OPEN; CLOSING = WebSocketReadyState.CLOSING; CLOSED = WebSocketReadyState.CLOSED; binaryType = 'blob'; #readyState = WebSocketReadyState.CONNECTING; get readyState() { return this.#readyState; } get bufferedAmount() { throw new Error('Not implemented'); } get extensions() { throw new Error('Not implemented'); } #protocol = ''; get protocol() { return this.#protocol; } constructor(url, protocols = []) { super(); this.url = url; this.ws = _wsNitro.WebSocketManager.create(url, Array.isArray(protocols) ? protocols : [protocols]); this.ws.onOpen(protocol => { this.#readyState = WebSocketReadyState.OPEN; this.#protocol = protocol; this.dispatchEvent(new _eventTargetShim.Event('open')); }); this.ws.onMessage(data => { this.dispatchEvent(new MessageEvent(data)); }); this.ws.onArrayBuffer(buffer => { if (this.binaryType === 'blob') { this.dispatchEvent(new MessageEvent(new _blob.Blob([buffer]))); return; } this.dispatchEvent(new MessageEvent(buffer)); }); this.ws.onError(message => { this.dispatchEvent(new ErrorEvent(message)); /** * Sending `close` frame before proceeding to close the connection * https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.7 */ this.#readyState = WebSocketReadyState.CLOSED; this.dispatchEvent(new CloseEvent(ABNORMAL_CLOSURE)); this.close(); }); this.ws.onClose((code, reason) => { this.#readyState = WebSocketReadyState.CLOSED; this.dispatchEvent(new CloseEvent(code, reason)); }); this.ws.connect(); } /** * https://websockets.spec.whatwg.org/#dom-websocket-send */ send(message) { if (this.#readyState === WebSocketReadyState.CONNECTING) { throw new Error('InvalidStateError'); } if (this.#readyState !== WebSocketReadyState.OPEN) { return; } if (typeof message === 'string') { this.ws.send(message); return; } if (message instanceof ArrayBuffer) { this.ws.sendArrayBuffer(message); return; } if (ArrayBuffer.isView(message)) { this.ws.sendArrayBuffer(message.buffer); return; } if (message instanceof _blob.Blob) { ; (async () => { const arrayBuffer = await message.arrayBuffer(); this.ws.sendArrayBuffer(arrayBuffer); })(); return; } } /** * https://websockets.spec.whatwg.org/#dom-websocket-close */ close(code = 1000, reason = '') { if (this.#readyState === WebSocketReadyState.CLOSING || this.#readyState === WebSocketReadyState.CLOSED) { return; } if (code !== 1000 && (code < 3000 || code > 4999)) { throw new Error('Invalid close code. Must be 1000 or in range 3000-4999.'); } this.#readyState = WebSocketReadyState.CLOSING; this.ws.close(code, reason); } ping() { this.ws.ping(); } get onopen() { return (0, _eventTargetShim.getEventAttributeValue)(this, 'open'); } set onopen(value) { (0, _eventTargetShim.setEventAttributeValue)(this, 'open', value); } get onmessage() { return (0, _eventTargetShim.getEventAttributeValue)(this, 'message'); } set onmessage(value) { (0, _eventTargetShim.setEventAttributeValue)(this, 'message', value); } get onerror() { return (0, _eventTargetShim.getEventAttributeValue)(this, 'error'); } set onerror(value) { (0, _eventTargetShim.setEventAttributeValue)(this, 'error', value); } get onclose() { return (0, _eventTargetShim.getEventAttributeValue)(this, 'close'); } set onclose(value) { (0, _eventTargetShim.setEventAttributeValue)(this, 'close', value); } } exports.WebSocket = WebSocket; //# sourceMappingURL=ws.js.map