How to use createRetryingSocket method in Cypress

Best JavaScript code snippet using cypress

agent.js

Source:agent.js Github

copy

Full Screen

...60    };61    if (!opts.shouldRetry) {62        connectOpts.getDelayMsForRetry = function () { return undefined; };63    }64    connect_1.createRetryingSocket(connectOpts, function (err, sock, triggerRetry) {65        if (err) {66            return cb(err);67        }68        cb(undefined, sock, triggerRetry);69    });70};71exports.isRequestHttps = function (options) {72    // WSS connections will not have an href, but you can tell protocol from the defaultAgent73    return lodash_1.default.get(options, '_defaultAgent.protocol') === 'https:' || (options.href || '').slice(0, 6) === 'https';74};75exports.isResponseStatusCode200 = function (head) {76    // read status code from proxy's response77    var matches = head.match(statusCodeRe);78    return lodash_1.default.get(matches, 1) === '200';...

Full Screen

Full Screen

proxy_spec.js

Source:proxy_spec.js Github

copy

Full Screen

1process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'2const { request, expect } = require('../spec_helper')3const DebugProxy = require('@cypress/debugging-proxy')4const https = require('https')5const net = require('net')6const network = require('@packages/network')7const Promise = require('bluebird')8const proxy = require('../helpers/proxy')9const httpServer = require('../helpers/http_server')10const httpsServer = require('../helpers/https_server')11describe('Proxy', () => {12  beforeEach(function () {13    return Promise.join(14      httpServer.start(),15      httpsServer.start(8443),16      httpsServer.start(8444),17      proxy.start(3333)18      .then((proxy1) => {19        this.proxy = proxy120      }),21    )22  })23  afterEach(() => {24    return Promise.join(25      httpServer.stop(),26      httpsServer.stop(),27      proxy.stop(),28    )29  })30  it('can request the googles', function () {31    // give some padding to external32    // network request33    this.timeout(10000)34    return Promise.all([35      request({36        strictSSL: false,37        proxy: 'http://localhost:3333',38        url: 'https://www.google.com',39      }),40      request({41        strictSSL: false,42        proxy: 'http://localhost:3333',43        url: 'https://mail.google.com',44      }),45      request({46        strictSSL: false,47        proxy: 'http://localhost:3333',48        url: 'https://google.com',49      }),50    ])51  })52  it('can call the httpsDirectly without a proxy', () => {53    return request({54      strictSSL: false,55      url: 'https://localhost:8443',56    })57  })58  it('can boot the httpsServer', () => {59    return request({60      strictSSL: false,61      url: 'https://localhost:8443/',62      proxy: 'http://localhost:3333',63    })64    .then((html) => {65      expect(html).to.include('https server')66    })67  })68  it('yields the onRequest callback', () => {69    return request({70      strictSSL: false,71      url: 'https://localhost:8443/replace',72      proxy: 'http://localhost:3333',73    })74    .then((html) => {75      expect(html).to.include('replaced content')76    })77  })78  it('closes outgoing connections when client disconnects', function () {79    this.sandbox.spy(net, 'connect')80    return request({81      strictSSL: false,82      url: 'https://localhost:8444/replace',83      proxy: 'http://localhost:3333',84      resolveWithFullResponse: true,85    })86    .then((res) => {87      // ensure client has disconnected88      expect(res.socket.destroyed).to.be.true89      // ensure the outgoing socket created for this connection was destroyed90      expect(net.connect).calledOnce91      const socket = net.connect.getCalls()[0].returnValue92      return new Promise((resolve) => {93        socket.on('close', () => {94          expect(socket.destroyed).to.be.true95          resolve()96        })97      })98    })99  })100  it('can boot the httpServer', () => {101    return request({102      strictSSL: false,103      url: 'http://localhost:8080/',104      proxy: 'http://localhost:3333',105    })106    .then((html) => {107      expect(html).to.include('http server')108    })109  })110  context('generating certificates', () => {111    it('reuses existing certificates', function () {112      return request({113        strictSSL: false,114        url: 'https://localhost:8443/',115        proxy: 'http://localhost:3333',116      })117      .then(() => {118        proxy.reset()119        // force this to reject if its called120        this.sandbox.stub(this.proxy, '_generateMissingCertificates').rejects(new Error('should not call'))121        return request({122          strictSSL: false,123          url: 'https://localhost:8443/',124          proxy: 'http://localhost:3333',125        })126      })127    })128    // https://github.com/cypress-io/cypress/issues/771129    it('generates certs and can proxy requests for HTTPS requests to IPs', function () {130      this.sandbox.spy(this.proxy, '_generateMissingCertificates')131      this.sandbox.spy(this.proxy, '_getServerPortForIp')132      return Promise.all([133        httpsServer.start(8445),134        this.proxy._ca.removeAll(),135      ])136      .then(() => {137        return request({138          strictSSL: false,139          url: 'https://127.0.0.1:8445/',140          proxy: 'http://localhost:3333',141        })142      }).then(() => {143        // this should not stand up its own https server144        return request({145          strictSSL: false,146          url: 'https://localhost:8443/',147          proxy: 'http://localhost:3333',148        })149      }).then(() => {150        expect(this.proxy._ipServers['127.0.0.1']).to.be.an.instanceOf(https.Server)151        expect(this.proxy._getServerPortForIp).to.be.calledWith('127.0.0.1').and.be.calledOnce152        expect(this.proxy._generateMissingCertificates).to.be.calledTwice153      })154    })155  })156  context('closing', () => {157    it('resets sslServers and can reopen', function () {158      return request({159        strictSSL: false,160        url: 'https://localhost:8443/',161        proxy: 'http://localhost:3333',162      })163      .then(() => {164        return proxy.stop()165      }).then(() => {166        return proxy.start(3333)167      }).then(() => {168      // force this to reject if its called169        this.sandbox.stub(this.proxy, '_generateMissingCertificates').rejects(new Error('should not call'))170        return request({171          strictSSL: false,172          url: 'https://localhost:8443/',173          proxy: 'http://localhost:3333',174        })175      })176    })177  })178  // TODO179  context('with an upstream proxy', () => {180    beforeEach(function () {181      // PROXY vars should override npm_config vars, so set them to cause failures if they are used182      // @see https://github.com/cypress-io/cypress/pull/8295183      process.env.npm_config_proxy = process.env.npm_config_https_proxy = 'http://erroneously-used-npm-proxy.invalid'184      process.env.npm_config_noproxy = 'just,some,nonsense'185      process.env.NO_PROXY = ''186      process.env.HTTP_PROXY = process.env.HTTPS_PROXY = 'http://localhost:9001'187      this.upstream = new DebugProxy({188        keepRequests: true,189      })190      return this.upstream.start(9001)191    })192    it('passes a request to an https server through the upstream', function () {193      this.upstream._onConnect = function (domain, port) {194        expect(domain).to.eq('localhost')195        expect(port).to.eq('8444')196        return true197      }198      return request({199        strictSSL: false,200        url: 'https://localhost:8444/',201        proxy: 'http://localhost:3333',202      }).then((res) => {203        expect(res).to.contain('https server')204      })205    })206    it('uses HTTP basic auth when provided', function () {207      this.upstream.setAuth({208        username: 'foo',209        password: 'bar',210      })211      this.upstream._onConnect = function (domain, port) {212        expect(domain).to.eq('localhost')213        expect(port).to.eq('8444')214        return true215      }216      process.env.HTTP_PROXY = (process.env.HTTPS_PROXY = 'http://foo:bar@localhost:9001')217      return request({218        strictSSL: false,219        url: 'https://localhost:8444/',220        proxy: 'http://localhost:3333',221      }).then((res) => {222        expect(res).to.contain('https server')223      })224    })225    it('closes outgoing connections when client disconnects', function () {226      this.sandbox.spy(net, 'connect')227      return request({228        strictSSL: false,229        url: 'https://localhost:8444/replace',230        proxy: 'http://localhost:3333',231        resolveWithFullResponse: true,232        forever: false,233      })234      .then((res) => {235        // ensure client has disconnected236        expect(res.socket.destroyed).to.be.true237        // ensure the outgoing socket created for this connection was destroyed238        expect(net.connect).calledOnce239        const socket = net.connect.getCalls()[0].returnValue240        return new Promise((resolve) => {241          return socket.on('close', () => {242            expect(socket.destroyed).to.be.true243            resolve()244          })245        })246      })247    })248    // https://github.com/cypress-io/cypress/issues/4257249    it('passes through to SNI when it is intercepted and not through proxy', function () {250      const createSocket = this.sandbox.stub(network.connect, 'createRetryingSocket').callsArgWith(1, new Error('stub'))251      const createProxyConn = this.sandbox.spy(network.agent.httpsAgent, 'createUpstreamProxyConnection')252      return request({253        strictSSL: false,254        url: 'https://localhost:8443',255        proxy: 'http://localhost:3333',256        resolveWithFullResponse: true,257        forever: false,258      })259      .then(() => {260        throw new Error('should not succeed')261      }).catch({ message: 'Error: Client network socket disconnected before secure TLS connection was established' }, () => {262        expect(createProxyConn).to.not.be.called263        expect(createSocket).to.be.calledWith({264          port: this.proxy._sniPort,265          host: 'localhost',266        })267      })268    })269    return afterEach(function () {270      this.upstream.stop()271      delete process.env.HTTP_PROXY272      delete process.env.HTTPS_PROXY273      delete process.env.NO_PROXY274    })275  })...

Full Screen

Full Screen

server.js

Source:server.js Github

copy

Full Screen

...103    }104    if (!port) {105      port = '443'106    }107    return connect.createRetryingSocket({ port, host: hostname }, onSocket)108  }109  _onServerConnectData (req, browserSocket, head) {110    let sem; let sslServer111    const firstBytes = head[0]112    const makeConnection = (port) => {113      debug('Making intercepted connection to %s', port)114      return this._makeConnection(browserSocket, head, port, 'localhost')115    }116    if (!SSL_RECORD_TYPES.includes(firstBytes)) {117      // if this isn't an SSL request then go118      // ahead and make the connection now119      return makeConnection(this._port)120    }121    // else spin up the SNI server...

Full Screen

Full Screen

connect.js

Source:connect.js Github

copy

Full Screen

...56        return tls_1.default.connect(netOpts, onConnect);57    }58    return net_1.default.connect(netOpts, onConnect);59}60function createRetryingSocket(opts, cb) {61    if (typeof opts.getDelayMsForRetry === 'undefined') {62        opts.getDelayMsForRetry = getDelayForRetry;63    }64    function tryConnect(iteration = 0) {65        const retry = (err) => {66            const delay = opts.getDelayMsForRetry(iteration, err);67            if (typeof delay === 'undefined') {68                debug('retries exhausted, bubbling up error %o', { iteration, err });69                return cb(err);70            }71            debug('received error on connect, retrying %o', { iteration, delay, err });72            setTimeout(() => {73                tryConnect(iteration + 1);74            }, delay);...

Full Screen

Full Screen

protocol.js

Source:protocol.js Github

copy

Full Screen

...15  }16}17function _connectAsync (opts) {18  return Promise.fromCallback((cb) => {19    connect.createRetryingSocket({20      getDelayMsForRetry: _getDelayMsForRetry,21      ...opts,22    }, cb)23  })24  .then((sock) => {25    // can be closed, just needed to test the connection26    sock.end()27  })28  .catch((err) => {29    errors.throw('CDP_COULD_NOT_CONNECT', opts.port, err)30  })31}32/**33 * Waits for the port to respond with connection to Chrome Remote Interface...

Full Screen

Full Screen

Using AI Code Generation

copy

Full Screen

1socket.on('connect', () => {2  console.log('connected')3})4socket.on('event', (data) => {5  console.log('event', data)6})7socket.on('disconnect', () => {8  console.log('disconnected')9})10socket.on('error', (error) => {11  console.log('error', error)12})13Cypress.Commands.add('createRetryingSocket', (url, options) => {14  const socket = new WebSocket(url, options)15  const retryingSocket = {16    on: (event, callback) => {17      socket.addEventListener(event, (event) => {18        if (event.type === 'error') {19          return retryingSocket.on(event.type, callback)20        }21        callback(event)22      })23    },24    send: (data) => {25      if (socket.readyState === WebSocket.OPEN) {26        return socket.send(data)27      }28      return retryingSocket.send(data)29    },30  }31})32  socket.on('connect', () => {33    console.log('connected')34  })35  socket.on('event', (data) => {36    console.log('event', data)37  })38  socket.on('disconnect', () => {39    console.log('disconnected')40  })41  socket.on('error', (error) => {42    console.log('error', error)43  })44})

Full Screen

Using AI Code Generation

copy

Full Screen

1describe('test', () => {2  it('test', () => {3      socket.on('connect', () => {4      });5    });6  });7});

Full Screen

Using AI Code Generation

copy

Full Screen

1const createRetryingSocket = (url) => {2  const socket = new WebSocket(url);3  const originalOpen = socket.open;4  socket.open = function () {5    return new Promise((resolve, reject) => {6      const retry = () => {7        originalOpen.apply(socket, arguments);8      };9      socket.addEventListener("open", resolve);10      socket.addEventListener("error", retry);11      retry();12    });13  };14  return socket;15};16const createRetryingSocket = (url) => {17  const socket = new WebSocket(url);18  const originalOpen = socket.open;19  socket.open = function () {20    return new Promise((resolve, reject) => {21      const retry = () => {22        originalOpen.apply(socket, arguments);23      };24      socket.addEventListener("open", resolve);25      socket.addEventListener("error", retry);26      retry();27    });28  };29  return socket;30};31const createRetryingSocket = (url) => {32  const socket = new WebSocket(url);33  const originalOpen = socket.open;34  socket.open = function () {35    return new Promise((resolve, reject) => {36      const retry = () => {37        originalOpen.apply(socket, arguments);38      };39      socket.addEventListener("open", resolve);40      socket.addEventListener("error", retry);41      retry();42    });43  };44  return socket;45};46const createRetryingSocket = (url) => {47  const socket = new WebSocket(url);48  const originalOpen = socket.open;49  socket.open = function () {50    return new Promise((resolve, reject) => {51      const retry = () => {52        originalOpen.apply(socket, arguments);53      };54      socket.addEventListener("open", resolve);55      socket.addEventListener("error", retry);56      retry();57    });58  };59  return socket;60};61const createRetryingSocket = (url) => {62  const socket = new WebSocket(url);63  const originalOpen = socket.open;64  socket.open = function () {65    return new Promise((resolve, reject) => {66      const retry = () => {67        originalOpen.apply(socket, arguments);68      };69      socket.addEventListener("open", resolve);70      socket.addEventListener("error", retry);

Full Screen

Using AI Code Generation

copy

Full Screen

1});2socket.on('connect', () => {3  socket.emit('event', 'data');4  socket.on('event', (data) => {5    console.log('data', data);6  });7});8A Javascript client library for the browser (which can be also run from Node.js): Source | API9In your Cypress support file (usually cypress/support/index.js ), import the plugin:10import 'cypress-socket-io-plugin';11}).on('connect', () => {12  cy.socket().emit('event', 'data');13  cy.socket().on('event', (data) => {14    console.log('data', data);15  });16});17A Javascript client library for the browser (which can be also run from Node.js): Source | API

Full Screen

Using AI Code Generation

copy

Full Screen

1describe('test', () => {2  it('test', () => {3    cy.get('socket').should('have.attr', 'id', 'socket')4  })5})6Cypress.Commands.add('createRetryingSocket', (url, alias) => {7  cy.window().then(win => {8    const socket = new win.WebSocket(url)9    const retry = () => {10      cy.wait(1000)11      cy.createRetryingSocket(url, alias)12    }13    socket.onopen = () => {14      cy.log('socket opened')15      cy.wrap(socket).as(alias)16    }17    socket.onclose = () => {18      cy.log('socket closed')19      retry()20    }21    socket.onerror = () => {22      cy.log('socket error')23      retry()24    }25  })26})

Full Screen

Using AI Code Generation

copy

Full Screen

1const createRetryingSocket = require('cypress/lib/socket').createRetryingSocket2const socket = createRetryingSocket('localhost', 3000)3const createRetryingSocket = require('cypress/lib/socket').createRetryingSocket4const socket = createRetryingSocket('localhost', 3000)5const createRetryingSocket = require('cypress/lib/socket').createRetryingSocket6const socket = createRetryingSocket('localhost', 3000)7const createRetryingSocket = require('cypress/lib/socket').createRetryingSocket8const socket = createRetryingSocket('localhost', 3000)9const createRetryingSocket = require('cypress/lib/socket').createRetryingSocket10const socket = createRetryingSocket('localhost', 3000)11const createRetryingSocket = require('cypress/lib/socket').createRetryingSocket12const socket = createRetryingSocket('localhost', 3000)13const createRetryingSocket = require('cypress/lib/socket').createRetryingSocket14const socket = createRetryingSocket('localhost', 3000)15const createRetryingSocket = require('cypress/lib/socket').createRetryingSocket16const socket = createRetryingSocket('localhost', 3000)

Full Screen

Cypress Tutorial

Cypress is a renowned Javascript-based open-source, easy-to-use end-to-end testing framework primarily used for testing web applications. Cypress is a relatively new player in the automation testing space and has been gaining much traction lately, as evidenced by the number of Forks (2.7K) and Stars (42.1K) for the project. LambdaTest’s Cypress Tutorial covers step-by-step guides that will help you learn from the basics till you run automation tests on LambdaTest.

Chapters:

  1. What is Cypress? -
  2. Why Cypress? - Learn why Cypress might be a good choice for testing your web applications.
  3. Features of Cypress Testing - Learn about features that make Cypress a powerful and flexible tool for testing web applications.
  4. Cypress Drawbacks - Although Cypress has many strengths, it has a few limitations that you should be aware of.
  5. Cypress Architecture - Learn more about Cypress architecture and how it is designed to be run directly in the browser, i.e., it does not have any additional servers.
  6. Browsers Supported by Cypress - Cypress is built on top of the Electron browser, supporting all modern web browsers. Learn browsers that support Cypress.
  7. Selenium vs Cypress: A Detailed Comparison - Compare and explore some key differences in terms of their design and features.
  8. Cypress Learning: Best Practices - Take a deep dive into some of the best practices you should use to avoid anti-patterns in your automation tests.
  9. How To Run Cypress Tests on LambdaTest? - Set up a LambdaTest account, and now you are all set to learn how to run Cypress tests.

Certification

You can elevate your expertise with end-to-end testing using the Cypress automation framework and stay one step ahead in your career by earning a Cypress certification. Check out our Cypress 101 Certification.

YouTube

Watch this 3 hours of complete tutorial to learn the basics of Cypress and various Cypress commands with the Cypress testing at LambdaTest.

Run Cypress automation tests on LambdaTest cloud grid

Perform automation testing on 3000+ real desktop and mobile devices online.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful