h2c-client.js 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. 'use strict'
  2. const { InvalidArgumentError } = require('../core/errors')
  3. const Client = require('./client')
  4. class H2CClient extends Client {
  5. constructor (origin, clientOpts) {
  6. if (typeof origin === 'string') {
  7. origin = new URL(origin)
  8. }
  9. if (origin.protocol !== 'http:') {
  10. throw new InvalidArgumentError(
  11. 'h2c-client: Only h2c protocol is supported'
  12. )
  13. }
  14. const { connect, maxConcurrentStreams, pipelining, ...opts } =
  15. clientOpts ?? {}
  16. let defaultMaxConcurrentStreams = 100
  17. let defaultPipelining = 100
  18. if (
  19. maxConcurrentStreams != null &&
  20. Number.isInteger(maxConcurrentStreams) &&
  21. maxConcurrentStreams > 0
  22. ) {
  23. defaultMaxConcurrentStreams = maxConcurrentStreams
  24. }
  25. if (pipelining != null && Number.isInteger(pipelining) && pipelining > 0) {
  26. defaultPipelining = pipelining
  27. }
  28. if (defaultPipelining > defaultMaxConcurrentStreams) {
  29. throw new InvalidArgumentError(
  30. 'h2c-client: pipelining cannot be greater than maxConcurrentStreams'
  31. )
  32. }
  33. super(origin, {
  34. ...opts,
  35. maxConcurrentStreams: defaultMaxConcurrentStreams,
  36. pipelining: defaultPipelining,
  37. allowH2: true,
  38. useH2c: true
  39. })
  40. }
  41. }
  42. module.exports = H2CClient