| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336 |
- "use strict";
- var __defProp = Object.defineProperty;
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
- var __getOwnPropNames = Object.getOwnPropertyNames;
- var __hasOwnProp = Object.prototype.hasOwnProperty;
- var __export = (target, all) => {
- for (var name in all)
- __defProp(target, name, { get: all[name], enumerable: true });
- };
- var __copyProps = (to, from, except, desc) => {
- if (from && typeof from === "object" || typeof from === "function") {
- for (let key of __getOwnPropNames(from))
- if (!__hasOwnProp.call(to, key) && key !== except)
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
- }
- return to;
- };
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
- var webSocketMockSource_exports = {};
- __export(webSocketMockSource_exports, {
- source: () => source
- });
- module.exports = __toCommonJS(webSocketMockSource_exports);
- const source = `
- var __commonJS = obj => {
- let required = false;
- let result;
- return function __require() {
- if (!required) {
- required = true;
- let fn;
- for (const name in obj) { fn = obj[name]; break; }
- const module = { exports: {} };
- fn(module.exports, module);
- result = module.exports;
- }
- return result;
- }
- };
- var __export = (target, all) => {for (var name in all) target[name] = all[name];};
- var __toESM = mod => ({ ...mod, 'default': mod });
- var __toCommonJS = mod => ({ ...mod, __esModule: true });
- // packages/injected/src/webSocketMock.ts
- var webSocketMock_exports = {};
- __export(webSocketMock_exports, {
- inject: () => inject
- });
- module.exports = __toCommonJS(webSocketMock_exports);
- function inject(globalThis) {
- if (globalThis.__pwWebSocketDispatch)
- return;
- function generateId() {
- const bytes = new Uint8Array(32);
- globalThis.crypto.getRandomValues(bytes);
- const hex = "0123456789abcdef";
- return [...bytes].map((value) => {
- const high = Math.floor(value / 16);
- const low = value % 16;
- return hex[high] + hex[low];
- }).join("");
- }
- function bufferToData(b) {
- let s = "";
- for (let i = 0; i < b.length; i++)
- s += String.fromCharCode(b[i]);
- return { data: globalThis.btoa(s), isBase64: true };
- }
- function stringToBuffer(s) {
- s = globalThis.atob(s);
- const b = new Uint8Array(s.length);
- for (let i = 0; i < s.length; i++)
- b[i] = s.charCodeAt(i);
- return b.buffer;
- }
- function messageToData(message, cb) {
- if (message instanceof globalThis.Blob)
- return message.arrayBuffer().then((buffer) => cb(bufferToData(new Uint8Array(buffer))));
- if (typeof message === "string")
- return cb({ data: message, isBase64: false });
- if (ArrayBuffer.isView(message))
- return cb(bufferToData(new Uint8Array(message.buffer, message.byteOffset, message.byteLength)));
- return cb(bufferToData(new Uint8Array(message)));
- }
- function dataToMessage(data, binaryType) {
- if (!data.isBase64)
- return data.data;
- const buffer = stringToBuffer(data.data);
- return binaryType === "arraybuffer" ? buffer : new Blob([buffer]);
- }
- const binding = globalThis.__pwWebSocketBinding;
- const NativeWebSocket = globalThis.WebSocket;
- const idToWebSocket = /* @__PURE__ */ new Map();
- globalThis.__pwWebSocketDispatch = (request) => {
- const ws = idToWebSocket.get(request.id);
- if (!ws)
- return;
- if (request.type === "connect")
- ws._apiConnect();
- if (request.type === "passthrough")
- ws._apiPassThrough();
- if (request.type === "ensureOpened")
- ws._apiEnsureOpened();
- if (request.type === "sendToPage")
- ws._apiSendToPage(dataToMessage(request.data, ws.binaryType));
- if (request.type === "closePage")
- ws._apiClosePage(request.code, request.reason, request.wasClean);
- if (request.type === "sendToServer")
- ws._apiSendToServer(dataToMessage(request.data, ws.binaryType));
- if (request.type === "closeServer")
- ws._apiCloseServer(request.code, request.reason, request.wasClean);
- };
- const _WebSocketMock = class _WebSocketMock extends EventTarget {
- constructor(url, protocols) {
- var _a, _b;
- super();
- // WebSocket.CLOSED
- this.CONNECTING = 0;
- // WebSocket.CONNECTING
- this.OPEN = 1;
- // WebSocket.OPEN
- this.CLOSING = 2;
- // WebSocket.CLOSING
- this.CLOSED = 3;
- // WebSocket.CLOSED
- this._oncloseListener = null;
- this._onerrorListener = null;
- this._onmessageListener = null;
- this._onopenListener = null;
- this.bufferedAmount = 0;
- this.extensions = "";
- this.protocol = "";
- this.readyState = 0;
- this._origin = "";
- this._passthrough = false;
- this._wsBufferedMessages = [];
- this._binaryType = "blob";
- this.url = new URL(url, globalThis.window.document.baseURI).href.replace(/^http/, "ws");
- this._origin = (_b = (_a = URL.parse(this.url)) == null ? void 0 : _a.origin) != null ? _b : "";
- this._protocols = protocols;
- this._id = generateId();
- idToWebSocket.set(this._id, this);
- binding({ type: "onCreate", id: this._id, url: this.url });
- }
- // --- native WebSocket implementation ---
- get binaryType() {
- return this._binaryType;
- }
- set binaryType(type) {
- this._binaryType = type;
- if (this._ws)
- this._ws.binaryType = type;
- }
- get onclose() {
- return this._oncloseListener;
- }
- set onclose(listener) {
- if (this._oncloseListener)
- this.removeEventListener("close", this._oncloseListener);
- this._oncloseListener = listener;
- if (this._oncloseListener)
- this.addEventListener("close", this._oncloseListener);
- }
- get onerror() {
- return this._onerrorListener;
- }
- set onerror(listener) {
- if (this._onerrorListener)
- this.removeEventListener("error", this._onerrorListener);
- this._onerrorListener = listener;
- if (this._onerrorListener)
- this.addEventListener("error", this._onerrorListener);
- }
- get onopen() {
- return this._onopenListener;
- }
- set onopen(listener) {
- if (this._onopenListener)
- this.removeEventListener("open", this._onopenListener);
- this._onopenListener = listener;
- if (this._onopenListener)
- this.addEventListener("open", this._onopenListener);
- }
- get onmessage() {
- return this._onmessageListener;
- }
- set onmessage(listener) {
- if (this._onmessageListener)
- this.removeEventListener("message", this._onmessageListener);
- this._onmessageListener = listener;
- if (this._onmessageListener)
- this.addEventListener("message", this._onmessageListener);
- }
- send(message) {
- if (this.readyState === _WebSocketMock.CONNECTING)
- throw new DOMException(\`Failed to execute 'send' on 'WebSocket': Still in CONNECTING state.\`);
- if (this.readyState !== _WebSocketMock.OPEN)
- throw new DOMException(\`WebSocket is already in CLOSING or CLOSED state.\`);
- if (this._passthrough) {
- if (this._ws)
- this._apiSendToServer(message);
- } else {
- messageToData(message, (data) => binding({ type: "onMessageFromPage", id: this._id, data }));
- }
- }
- close(code, reason) {
- if (code !== void 0 && code !== 1e3 && (code < 3e3 || code > 4999))
- throw new DOMException(\`Failed to execute 'close' on 'WebSocket': The close code must be either 1000, or between 3000 and 4999. \${code} is neither.\`);
- if (this.readyState === _WebSocketMock.OPEN || this.readyState === _WebSocketMock.CONNECTING)
- this.readyState = _WebSocketMock.CLOSING;
- if (this._passthrough)
- this._apiCloseServer(code, reason, true);
- else
- binding({ type: "onClosePage", id: this._id, code, reason, wasClean: true });
- }
- // --- methods called from the routing API ---
- _apiEnsureOpened() {
- if (!this._ws)
- this._ensureOpened();
- }
- _apiSendToPage(message) {
- this._ensureOpened();
- if (this.readyState !== _WebSocketMock.OPEN)
- throw new DOMException(\`WebSocket is already in CLOSING or CLOSED state.\`);
- this.dispatchEvent(new MessageEvent("message", { data: message, origin: this._origin, cancelable: true }));
- }
- _apiSendToServer(message) {
- if (!this._ws)
- throw new Error("Cannot send a message before connecting to the server");
- if (this._ws.readyState === _WebSocketMock.CONNECTING)
- this._wsBufferedMessages.push(message);
- else
- this._ws.send(message);
- }
- _apiConnect() {
- if (this._ws)
- throw new Error("Can only connect to the server once");
- this._ws = new NativeWebSocket(this.url, this._protocols);
- this._ws.binaryType = this._binaryType;
- this._ws.onopen = () => {
- for (const message of this._wsBufferedMessages)
- this._ws.send(message);
- this._wsBufferedMessages = [];
- this._ensureOpened();
- };
- this._ws.onclose = (event) => {
- this._onWSClose(event.code, event.reason, event.wasClean);
- };
- this._ws.onmessage = (event) => {
- if (this._passthrough)
- this._apiSendToPage(event.data);
- else
- messageToData(event.data, (data) => binding({ type: "onMessageFromServer", id: this._id, data }));
- };
- this._ws.onerror = () => {
- const event = new Event("error", { cancelable: true });
- this.dispatchEvent(event);
- };
- }
- // This method connects to the server, and passes all messages through,
- // as if WebSocketMock was not engaged.
- _apiPassThrough() {
- this._passthrough = true;
- this._apiConnect();
- }
- _apiCloseServer(code, reason, wasClean) {
- if (!this._ws) {
- this._onWSClose(code, reason, wasClean);
- return;
- }
- if (this._ws.readyState === _WebSocketMock.CONNECTING || this._ws.readyState === _WebSocketMock.OPEN)
- this._ws.close(code, reason);
- }
- _apiClosePage(code, reason, wasClean) {
- if (this.readyState === _WebSocketMock.CLOSED)
- return;
- this.readyState = _WebSocketMock.CLOSED;
- this.dispatchEvent(new CloseEvent("close", { code, reason, wasClean, cancelable: true }));
- this._maybeCleanup();
- if (this._passthrough)
- this._apiCloseServer(code, reason, wasClean);
- else
- binding({ type: "onClosePage", id: this._id, code, reason, wasClean });
- }
- // --- internals ---
- _ensureOpened() {
- var _a;
- if (this.readyState !== _WebSocketMock.CONNECTING)
- return;
- this.extensions = ((_a = this._ws) == null ? void 0 : _a.extensions) || "";
- if (this._ws)
- this.protocol = this._ws.protocol;
- else if (Array.isArray(this._protocols))
- this.protocol = this._protocols[0] || "";
- else
- this.protocol = this._protocols || "";
- this.readyState = _WebSocketMock.OPEN;
- this.dispatchEvent(new Event("open", { cancelable: true }));
- }
- _onWSClose(code, reason, wasClean) {
- if (this._passthrough)
- this._apiClosePage(code, reason, wasClean);
- else
- binding({ type: "onCloseServer", id: this._id, code, reason, wasClean });
- if (this._ws) {
- this._ws.onopen = null;
- this._ws.onclose = null;
- this._ws.onmessage = null;
- this._ws.onerror = null;
- this._ws = void 0;
- this._wsBufferedMessages = [];
- }
- this._maybeCleanup();
- }
- _maybeCleanup() {
- if (this.readyState === _WebSocketMock.CLOSED && !this._ws)
- idToWebSocket.delete(this._id);
- }
- };
- _WebSocketMock.CONNECTING = 0;
- // WebSocket.CONNECTING
- _WebSocketMock.OPEN = 1;
- // WebSocket.OPEN
- _WebSocketMock.CLOSING = 2;
- // WebSocket.CLOSING
- _WebSocketMock.CLOSED = 3;
- let WebSocketMock = _WebSocketMock;
- globalThis.WebSocket = class WebSocket extends WebSocketMock {
- };
- }
- `;
- // Annotate the CommonJS export names for ESM import in node:
- 0 && (module.exports = {
- source
- });
|