hashicorp-copywrite[bot] 5fb9df1640
[COMPLIANCE] License changes (#18443)
* Adding explicit MPL license for sub-package

This directory and its subdirectories (packages) contain files licensed with the MPLv2 `LICENSE` file in this directory and are intentionally licensed separately from the BSL `LICENSE` file at the root of this repository.

* Adding explicit MPL license for sub-package

This directory and its subdirectories (packages) contain files licensed with the MPLv2 `LICENSE` file in this directory and are intentionally licensed separately from the BSL `LICENSE` file at the root of this repository.

* Updating the license from MPL to Business Source License

Going forward, this project will be licensed under the Business Source License v1.1. Please see our blog post for more details at <Blog URL>, FAQ at www.hashicorp.com/licensing-faq, and details of the license at www.hashicorp.com/bsl.

* add missing license headers

* Update copyright file headers to BUSL-1.1

* Update copyright file headers to BUSL-1.1

* Update copyright file headers to BUSL-1.1

* Update copyright file headers to BUSL-1.1

* Update copyright file headers to BUSL-1.1

* Update copyright file headers to BUSL-1.1

* Update copyright file headers to BUSL-1.1

* Update copyright file headers to BUSL-1.1

* Update copyright file headers to BUSL-1.1

* Update copyright file headers to BUSL-1.1

* Update copyright file headers to BUSL-1.1

* Update copyright file headers to BUSL-1.1

* Update copyright file headers to BUSL-1.1

* Update copyright file headers to BUSL-1.1

* Update copyright file headers to BUSL-1.1

---------

Co-authored-by: hashicorp-copywrite[bot] <110428419+hashicorp-copywrite[bot]@users.noreply.github.com>
2023-08-11 09:12:13 -04:00

103 lines
2.6 KiB
JavaScript

/**
* Copyright (c) HashiCorp, Inc.
* SPDX-License-Identifier: BUSL-1.1
*/
import Service, { inject as service } from '@ember/service';
export default class ConnectionsService extends Service {
@service('dom')
dom;
@service('env')
env;
@service('data-source/service')
data;
init() {
super.init(...arguments);
this._listeners = this.dom.listeners();
this.connections = new Set();
this.addVisibilityChange();
}
willDestroy() {
this._listeners.remove();
this.purge();
super.willDestroy(...arguments);
}
addVisibilityChange() {
// when the user hides the tab, abort all connections
this._listeners.add(this.dom.document(), {
visibilitychange: (e) => {
if (e.target.hidden) {
this.purge(-1);
}
},
});
}
whenAvailable(e) {
// if the user has hidden the tab (hidden browser/tab switch)
// any aborted errors should restart
const doc = this.dom.document();
if (doc.hidden) {
return new Promise((resolve) => {
const remove = this._listeners.add(doc, {
visibilitychange: function (event) {
remove();
// we resolve with the event that comes from
// whenAvailable not visibilitychange
resolve(e);
},
});
});
}
return Promise.resolve(e);
}
purge(statusCode = 0) {
[...this.connections].forEach(function (connection) {
// Cancelled
connection.abort(statusCode);
});
this.connections = new Set();
}
acquire(request) {
if (this.connections.size >= this.env.var('CONSUL_HTTP_MAX_CONNECTIONS')) {
const closed = this.data.closed();
let connection = [...this.connections].find((item) => {
const id = item.headers()['x-request-id'];
if (id) {
return closed.includes(item.headers()['x-request-id']);
}
return false;
});
if (typeof connection === 'undefined') {
// all connections are being used on the page
// if the new one is a blocking query then cancel the oldest connection
if (request.headers()['content-type'] === 'text/event-stream') {
connection = this.connections.values().next().value;
}
// otherwise wait for a connection to become available
}
// cancel the connection
if (typeof connection !== 'undefined') {
// if its a shared blocking query cancel everything
// listening to it
this.release(connection);
// Too Many Requests
connection.abort(429);
}
}
this.connections.add(request);
}
release(request) {
this.connections.delete(request);
}
}