mirror of
https://github.com/status-im/consul.git
synced 2025-01-09 21:35:52 +00:00
5fb9df1640
* 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>
103 lines
2.6 KiB
JavaScript
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);
|
|
}
|
|
}
|