智慧水务管理系统 - 精河县供水工程综合管理平台

Http2Sessions.js 2.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. 'use strict';
  2. // Node-only: relies on the built-in `http2` module. Browser/react-native
  3. // builds replace `lib/adapters/http.js` (the sole importer) with `lib/helpers/null.js`
  4. // via the `browser` package.json field, so this module is never reached in
  5. // those environments. Do not import it from any browser-reachable code path.
  6. import http2 from 'http2';
  7. import util from 'util';
  8. class Http2Sessions {
  9. constructor() {
  10. this.sessions = Object.create(null);
  11. }
  12. getSession(authority, options) {
  13. options = Object.assign(
  14. {
  15. sessionTimeout: 1000,
  16. },
  17. options
  18. );
  19. let authoritySessions = this.sessions[authority];
  20. if (authoritySessions) {
  21. let len = authoritySessions.length;
  22. for (let i = 0; i < len; i++) {
  23. const [sessionHandle, sessionOptions] = authoritySessions[i];
  24. if (
  25. !sessionHandle.destroyed &&
  26. !sessionHandle.closed &&
  27. util.isDeepStrictEqual(sessionOptions, options)
  28. ) {
  29. return sessionHandle;
  30. }
  31. }
  32. }
  33. const session = http2.connect(authority, options);
  34. let removed;
  35. let timer;
  36. const removeSession = () => {
  37. if (removed) {
  38. return;
  39. }
  40. removed = true;
  41. if (timer) {
  42. clearTimeout(timer);
  43. timer = null;
  44. }
  45. let entries = authoritySessions,
  46. len = entries.length,
  47. i = len;
  48. while (i--) {
  49. if (entries[i][0] === session) {
  50. if (len === 1) {
  51. delete this.sessions[authority];
  52. } else {
  53. entries.splice(i, 1);
  54. }
  55. if (!session.closed) {
  56. session.close();
  57. }
  58. return;
  59. }
  60. }
  61. };
  62. const originalRequestFn = session.request;
  63. const { sessionTimeout } = options;
  64. if (sessionTimeout != null) {
  65. let streamsCount = 0;
  66. session.request = function () {
  67. const stream = originalRequestFn.apply(this, arguments);
  68. streamsCount++;
  69. if (timer) {
  70. clearTimeout(timer);
  71. timer = null;
  72. }
  73. stream.once('close', () => {
  74. if (!--streamsCount) {
  75. timer = setTimeout(() => {
  76. timer = null;
  77. removeSession();
  78. }, sessionTimeout);
  79. }
  80. });
  81. return stream;
  82. };
  83. }
  84. session.once('close', removeSession);
  85. let entry = [session, options];
  86. authoritySessions
  87. ? authoritySessions.push(entry)
  88. : (authoritySessions = this.sessions[authority] = [entry]);
  89. return session;
  90. }
  91. }
  92. export default Http2Sessions;