proxy-socket-handler.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. 'use strict';
  2. const {ERR_HTTP2_NO_SOCKET_MANIPULATION} = require('./errors.js');
  3. /* istanbul ignore file */
  4. /* https://github.com/nodejs/node/blob/6eec858f34a40ffa489c1ec54bb24da72a28c781/lib/internal/http2/compat.js#L195-L272 */
  5. const proxySocketHandler = {
  6. has(stream, property) {
  7. // Replaced [kSocket] with .socket
  8. const reference = stream.session === undefined ? stream : stream.session.socket;
  9. return (property in stream) || (property in reference);
  10. },
  11. get(stream, property) {
  12. switch (property) {
  13. case 'on':
  14. case 'once':
  15. case 'end':
  16. case 'emit':
  17. case 'destroy':
  18. return stream[property].bind(stream);
  19. case 'writable':
  20. case 'destroyed':
  21. return stream[property];
  22. case 'readable':
  23. if (stream.destroyed) {
  24. return false;
  25. }
  26. return stream.readable;
  27. case 'setTimeout': {
  28. const {session} = stream;
  29. if (session !== undefined) {
  30. return session.setTimeout.bind(session);
  31. }
  32. return stream.setTimeout.bind(stream);
  33. }
  34. case 'write':
  35. case 'read':
  36. case 'pause':
  37. case 'resume':
  38. throw new ERR_HTTP2_NO_SOCKET_MANIPULATION();
  39. default: {
  40. // Replaced [kSocket] with .socket
  41. const reference = stream.session === undefined ? stream : stream.session.socket;
  42. const value = reference[property];
  43. return typeof value === 'function' ? value.bind(reference) : value;
  44. }
  45. }
  46. },
  47. getPrototypeOf(stream) {
  48. if (stream.session !== undefined) {
  49. // Replaced [kSocket] with .socket
  50. return Reflect.getPrototypeOf(stream.session.socket);
  51. }
  52. return Reflect.getPrototypeOf(stream);
  53. },
  54. set(stream, property, value) {
  55. switch (property) {
  56. case 'writable':
  57. case 'readable':
  58. case 'destroyed':
  59. case 'on':
  60. case 'once':
  61. case 'end':
  62. case 'emit':
  63. case 'destroy':
  64. stream[property] = value;
  65. return true;
  66. case 'setTimeout': {
  67. const {session} = stream;
  68. if (session === undefined) {
  69. stream.setTimeout = value;
  70. } else {
  71. session.setTimeout = value;
  72. }
  73. return true;
  74. }
  75. case 'write':
  76. case 'read':
  77. case 'pause':
  78. case 'resume':
  79. throw new ERR_HTTP2_NO_SOCKET_MANIPULATION();
  80. default: {
  81. // Replaced [kSocket] with .socket
  82. const reference = stream.session === undefined ? stream : stream.session.socket;
  83. reference[property] = value;
  84. return true;
  85. }
  86. }
  87. }
  88. };
  89. module.exports = proxySocketHandler;