4cko
/usr/local/rvm/gems/ruby-3.4.7/bin:/usr/local/rvm/gems/ruby-3.4.7@global/bin:/usr/local/rvm/rubies/ruby-3.4.7/bin:/home/codespace/.vscode-remote/data/User/globalStorage/github.copilot-chat/debugCommand:/home/codespace/.vscode-remote/data/User/globalStorage/github.copilot-chat/copilotCli:/vscode/bin/linux-x64/7e7950df89d055b5a378379db9ee14290772148a/bin/remote-cli:/home/codespace/.local/bin:/home/codespace/.dotnet:/home/codespace/nvm/current/bin:/home/codespace/.php/current/bin:/home/codespace/.python/current/bin:/home/codespace/java/current/bin:/home/codespace/.ruby/current/bin:/home/codespace/.local/bin:/usr/local/python/current/bin:/usr/local/py-utils/bin:/usr/local/jupyter:/usr/local/oryx:/usr/local/go/bin:/go/bin:/usr/local/sdkman/bin:/usr/local/sdkman/candidates/java/current/bin:/usr/local/sdkman/candidates/gradle/current/bin:/usr/local/sdkman/candidates/maven/current/bin:/usr/local/sdkman/candidates/ant/current/bin:/usr/local/rvm/gems/default/bin:/usr/local/rvm/gems/default@global/bin:/usr/local/rvm/rubies/default/bin:/usr/local/share/rbenv/bin:/usr/local/php/current/bin:/opt/conda/bin:/usr/local/nvs:/usr/local/share/nvm/versions/node/v24.14.0/bin:/usr/local/hugo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/share/dotnet:/home/codespace/.dotnet/tools:/usr/local/rvm/bin
a2c64e7 | ; | |
| // Node-only: relies on the built-in `http2` module. Browser/react-native | |
| // builds replace `lib/adapters/http.js` (the sole importer) with `lib/helpers/null.js` | |
| // via the `browser` package.json field, so this module is never reached in | |
| // those environments. Do not import it from any browser-reachable code path. | |
| import http2 from 'http2'; | |
| import util from 'util'; | |
| class Http2Sessions { | |
| constructor() { | |
| this.sessions = Object.create(null); | |
| } | |
| getSession(authority, options) { | |
| options = Object.assign( | |
| { | |
| sessionTimeout: 1000, | |
| }, | |
| options | |
| ); | |
| let authoritySessions = this.sessions[authority]; | |
| if (authoritySessions) { | |
| let len = authoritySessions.length; | |
| for (let i = 0; i < len; i++) { | |
| const [sessionHandle, sessionOptions] = authoritySessions[i]; | |
| if ( | |
| !sessionHandle.destroyed && | |
| !sessionHandle.closed && | |
| util.isDeepStrictEqual(sessionOptions, options) | |
| ) { | |
| return sessionHandle; | |
| } | |
| } | |
| } | |
| const session = http2.connect(authority, options); | |
| let removed; | |
| let timer; | |
| const removeSession = () => { | |
| if (removed) { | |
| return; | |
| } | |
| removed = true; | |
| if (timer) { | |
| clearTimeout(timer); | |
| timer = null; | |
| } | |
| let entries = authoritySessions, | |
| len = entries.length, | |
| i = len; | |
| while (i--) { | |
| if (entries[i][0] === session) { | |
| if (len === 1) { | |
| delete this.sessions[authority]; | |
| } else { | |
| entries.splice(i, 1); | |
| } | |
| if (!session.closed) { | |
| session.close(); | |
| } | |
| return; | |
| } | |
| } | |
| }; | |
| const originalRequestFn = session.request; | |
| const { sessionTimeout } = options; | |
| if (sessionTimeout != null) { | |
| let streamsCount = 0; | |
| session.request = function () { | |
| const stream = originalRequestFn.apply(this, arguments); | |
| streamsCount++; | |
| if (timer) { | |
| clearTimeout(timer); | |
| timer = null; | |
| } | |
| stream.once('close', () => { | |
| if (!--streamsCount) { | |
| timer = setTimeout(() => { | |
| timer = null; | |
| removeSession(); | |
| }, sessionTimeout); | |
| } | |
| }); | |
| return stream; | |
| }; | |
| } | |
| session.once('close', removeSession); | |
| let entry = [session, options]; | |
| authoritySessions | |
| ? authoritySessions.push(entry) | |
| : (authoritySessions = this.sessions[authority] = [entry]); | |
| return session; | |
| } | |
| } | |
| export default Http2Sessions; | |