All Downloads are FREE. Search and download functionalities are using the official Maven repository.

package.dist.src.internal.grpc.idle-grpc-client-wrapper.js Maven / Gradle / Ivy

The newest version!
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.IdleGrpcClientWrapper = void 0;
/**
 * This wrapper allows us to ensure that a grpc client is not re-used if it has been idle
 * for longer than a specified period of time.  This is important in some environments,
 * such as AWS Lambda, where the runtime may be paused indefinitely between invocations.
 * In such cases we have observed that while the runtime is suspended, the connection
 * may have been closed by the server. (e.g., AWS NLB has an idle timeout of 350s:
 * https://docs.aws.amazon.com/elasticloadbalancing/latest/network/network-load-balancers.html#connection-idle-timeout )
 * When the runtime resumes, it does not recognize that the connection has been closed,
 * and it may continue to attempt to send bytes to it, resulting in client-side timeouts
 * (DEADLINE_EXCEEDED).  Forcefully refreshing the client if it has been idle for too
 * long will prevent this.
 *
 * NOTE: We can't rely on keepalive pings in this scenario, because the lambda runtime
 * may be suspended in such a way that background tasks such as the keepalive pings
 * will not be able to execute.
 */
class IdleGrpcClientWrapper {
    constructor(props) {
        this.logger = props.loggerFactory.getLogger(this);
        this.clientFactoryFn = props.clientFactoryFn;
        this.client = this.clientFactoryFn();
        this.maxIdleMillis = props.maxIdleMillis;
        this.lastAccessTime = Date.now();
        this.maxClientAgeMillis = props.maxClientAgeMillis;
        this.clientCreatedTime = Date.now();
    }
    getClient() {
        this.logger.trace(`Checking to see if client has been idle for more than ${this.maxIdleMillis} ms`);
        if (Date.now() - this.lastAccessTime > this.maxIdleMillis) {
            this.logger.info(`Client has been idle for more than ${this.maxIdleMillis} ms; reconnecting.`);
            this.client.close();
            this.client = this.clientFactoryFn();
        }
        if (this.maxClientAgeMillis !== undefined) {
            this.logger.trace(`Checking to see if client was created more than ${this.maxClientAgeMillis} ms`);
            if (Date.now() - this.clientCreatedTime > this.maxClientAgeMillis) {
                this.logger.info(`Client was created more than ${this.maxClientAgeMillis} millis ago; recreating as asked.`);
                this.client.close();
                this.client = this.clientFactoryFn();
                this.clientCreatedTime = Date.now();
            }
        }
        this.lastAccessTime = Date.now();
        return this.client;
    }
}
exports.IdleGrpcClientWrapper = IdleGrpcClientWrapper;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRsZS1ncnBjLWNsaWVudC13cmFwcGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2ludGVybmFsL2dycGMvaWRsZS1ncnBjLWNsaWVudC13cmFwcGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQVVBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQWEscUJBQXFCO0lBYWhDLFlBQVksS0FBb0M7UUFDOUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUM7UUFDN0MsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUMsa0JBQWtCLENBQUM7UUFDbkQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRUQsU0FBUztRQUNQLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUNmLHlEQUF5RCxJQUFJLENBQUMsYUFBYSxLQUFLLENBQ2pGLENBQUM7UUFDRixJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDekQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ2Qsc0NBQXNDLElBQUksQ0FBQyxhQUFhLG9CQUFvQixDQUM3RSxDQUFDO1lBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUN0QztRQUVELElBQUksSUFBSSxDQUFDLGtCQUFrQixLQUFLLFNBQVMsRUFBRTtZQUN6QyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDZixtREFBbUQsSUFBSSxDQUFDLGtCQUFrQixLQUFLLENBQ2hGLENBQUM7WUFDRixJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFO2dCQUNqRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDZCxnQ0FBZ0MsSUFBSSxDQUFDLGtCQUFrQixtQ0FBbUMsQ0FDM0YsQ0FBQztnQkFDRixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNwQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDckMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQzthQUNyQztTQUNGO1FBRUQsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDakMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7Q0FDRjtBQXBERCxzREFvREMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0Nsb3NlYWJsZUdycGNDbGllbnQsIEdycGNDbGllbnRXcmFwcGVyfSBmcm9tICcuL2dycGMtY2xpZW50LXdyYXBwZXInO1xuaW1wb3J0IHtNb21lbnRvTG9nZ2VyLCBNb21lbnRvTG9nZ2VyRmFjdG9yeX0gZnJvbSAnQGdvbW9tZW50by9zZGstY29yZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSWRsZUdycGNDbGllbnRXcmFwcGVyUHJvcHM8VCBleHRlbmRzIENsb3NlYWJsZUdycGNDbGllbnQ+IHtcbiAgY2xpZW50RmFjdG9yeUZuOiAoKSA9PiBUO1xuICBsb2dnZXJGYWN0b3J5OiBNb21lbnRvTG9nZ2VyRmFjdG9yeTtcbiAgbWF4SWRsZU1pbGxpczogbnVtYmVyO1xuICBtYXhDbGllbnRBZ2VNaWxsaXM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhpcyB3cmFwcGVyIGFsbG93cyB1cyB0byBlbnN1cmUgdGhhdCBhIGdycGMgY2xpZW50IGlzIG5vdCByZS11c2VkIGlmIGl0IGhhcyBiZWVuIGlkbGVcbiAqIGZvciBsb25nZXIgdGhhbiBhIHNwZWNpZmllZCBwZXJpb2Qgb2YgdGltZS4gIFRoaXMgaXMgaW1wb3J0YW50IGluIHNvbWUgZW52aXJvbm1lbnRzLFxuICogc3VjaCBhcyBBV1MgTGFtYmRhLCB3aGVyZSB0aGUgcnVudGltZSBtYXkgYmUgcGF1c2VkIGluZGVmaW5pdGVseSBiZXR3ZWVuIGludm9jYXRpb25zLlxuICogSW4gc3VjaCBjYXNlcyB3ZSBoYXZlIG9ic2VydmVkIHRoYXQgd2hpbGUgdGhlIHJ1bnRpbWUgaXMgc3VzcGVuZGVkLCB0aGUgY29ubmVjdGlvblxuICogbWF5IGhhdmUgYmVlbiBjbG9zZWQgYnkgdGhlIHNlcnZlci4gKGUuZy4sIEFXUyBOTEIgaGFzIGFuIGlkbGUgdGltZW91dCBvZiAzNTBzOlxuICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2VsYXN0aWNsb2FkYmFsYW5jaW5nL2xhdGVzdC9uZXR3b3JrL25ldHdvcmstbG9hZC1iYWxhbmNlcnMuaHRtbCNjb25uZWN0aW9uLWlkbGUtdGltZW91dCApXG4gKiBXaGVuIHRoZSBydW50aW1lIHJlc3VtZXMsIGl0IGRvZXMgbm90IHJlY29nbml6ZSB0aGF0IHRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIGNsb3NlZCxcbiAqIGFuZCBpdCBtYXkgY29udGludWUgdG8gYXR0ZW1wdCB0byBzZW5kIGJ5dGVzIHRvIGl0LCByZXN1bHRpbmcgaW4gY2xpZW50LXNpZGUgdGltZW91dHNcbiAqIChERUFETElORV9FWENFRURFRCkuICBGb3JjZWZ1bGx5IHJlZnJlc2hpbmcgdGhlIGNsaWVudCBpZiBpdCBoYXMgYmVlbiBpZGxlIGZvciB0b29cbiAqIGxvbmcgd2lsbCBwcmV2ZW50IHRoaXMuXG4gKlxuICogTk9URTogV2UgY2FuJ3QgcmVseSBvbiBrZWVwYWxpdmUgcGluZ3MgaW4gdGhpcyBzY2VuYXJpbywgYmVjYXVzZSB0aGUgbGFtYmRhIHJ1bnRpbWVcbiAqIG1heSBiZSBzdXNwZW5kZWQgaW4gc3VjaCBhIHdheSB0aGF0IGJhY2tncm91bmQgdGFza3Mgc3VjaCBhcyB0aGUga2VlcGFsaXZlIHBpbmdzXG4gKiB3aWxsIG5vdCBiZSBhYmxlIHRvIGV4ZWN1dGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBJZGxlR3JwY0NsaWVudFdyYXBwZXI8VCBleHRlbmRzIENsb3NlYWJsZUdycGNDbGllbnQ+XG4gIGltcGxlbWVudHMgR3JwY0NsaWVudFdyYXBwZXI8VD5cbntcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IE1vbWVudG9Mb2dnZXI7XG5cbiAgcHJpdmF0ZSBjbGllbnQ6IFQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50RmFjdG9yeUZuOiAoKSA9PiBUO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbWF4SWRsZU1pbGxpczogbnVtYmVyO1xuICBwcml2YXRlIGxhc3RBY2Nlc3NUaW1lOiBudW1iZXI7XG4gIHByaXZhdGUgY2xpZW50Q3JlYXRlZFRpbWU6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXhDbGllbnRBZ2VNaWxsaXM/OiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IElkbGVHcnBjQ2xpZW50V3JhcHBlclByb3BzPFQ+KSB7XG4gICAgdGhpcy5sb2dnZXIgPSBwcm9wcy5sb2dnZXJGYWN0b3J5LmdldExvZ2dlcih0aGlzKTtcbiAgICB0aGlzLmNsaWVudEZhY3RvcnlGbiA9IHByb3BzLmNsaWVudEZhY3RvcnlGbjtcbiAgICB0aGlzLmNsaWVudCA9IHRoaXMuY2xpZW50RmFjdG9yeUZuKCk7XG4gICAgdGhpcy5tYXhJZGxlTWlsbGlzID0gcHJvcHMubWF4SWRsZU1pbGxpcztcbiAgICB0aGlzLmxhc3RBY2Nlc3NUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB0aGlzLm1heENsaWVudEFnZU1pbGxpcyA9IHByb3BzLm1heENsaWVudEFnZU1pbGxpcztcbiAgICB0aGlzLmNsaWVudENyZWF0ZWRUaW1lID0gRGF0ZS5ub3coKTtcbiAgfVxuXG4gIGdldENsaWVudCgpOiBUIHtcbiAgICB0aGlzLmxvZ2dlci50cmFjZShcbiAgICAgIGBDaGVja2luZyB0byBzZWUgaWYgY2xpZW50IGhhcyBiZWVuIGlkbGUgZm9yIG1vcmUgdGhhbiAke3RoaXMubWF4SWRsZU1pbGxpc30gbXNgXG4gICAgKTtcbiAgICBpZiAoRGF0ZS5ub3coKSAtIHRoaXMubGFzdEFjY2Vzc1RpbWUgPiB0aGlzLm1heElkbGVNaWxsaXMpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oXG4gICAgICAgIGBDbGllbnQgaGFzIGJlZW4gaWRsZSBmb3IgbW9yZSB0aGFuICR7dGhpcy5tYXhJZGxlTWlsbGlzfSBtczsgcmVjb25uZWN0aW5nLmBcbiAgICAgICk7XG4gICAgICB0aGlzLmNsaWVudC5jbG9zZSgpO1xuICAgICAgdGhpcy5jbGllbnQgPSB0aGlzLmNsaWVudEZhY3RvcnlGbigpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm1heENsaWVudEFnZU1pbGxpcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZ2dlci50cmFjZShcbiAgICAgICAgYENoZWNraW5nIHRvIHNlZSBpZiBjbGllbnQgd2FzIGNyZWF0ZWQgbW9yZSB0aGFuICR7dGhpcy5tYXhDbGllbnRBZ2VNaWxsaXN9IG1zYFxuICAgICAgKTtcbiAgICAgIGlmIChEYXRlLm5vdygpIC0gdGhpcy5jbGllbnRDcmVhdGVkVGltZSA+IHRoaXMubWF4Q2xpZW50QWdlTWlsbGlzKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmluZm8oXG4gICAgICAgICAgYENsaWVudCB3YXMgY3JlYXRlZCBtb3JlIHRoYW4gJHt0aGlzLm1heENsaWVudEFnZU1pbGxpc30gbWlsbGlzIGFnbzsgcmVjcmVhdGluZyBhcyBhc2tlZC5gXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY2xpZW50LmNsb3NlKCk7XG4gICAgICAgIHRoaXMuY2xpZW50ID0gdGhpcy5jbGllbnRGYWN0b3J5Rm4oKTtcbiAgICAgICAgdGhpcy5jbGllbnRDcmVhdGVkVGltZSA9IERhdGUubm93KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5sYXN0QWNjZXNzVGltZSA9IERhdGUubm93KCk7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50O1xuICB9XG59XG4iXX0=




© 2015 - 2025 Weber Informatics LLC | Privacy Policy