From 7ffa49f7e4dd24bb4cfe072d7721c8d62312c61b Mon Sep 17 00:00:00 2001 From: cjihrig Date: Tue, 30 Oct 2018 14:16:42 -0400 Subject: [PATCH] grpc-js-core: remove use of flow() and flowRight() This commit replaces combinations of bind(), map(), and flow() with simple for loops. This improves performance, and lessens the dependency on lodash. --- packages/grpc-js-core/src/filter-stack.ts | 48 +++++++++++++++++------ 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/packages/grpc-js-core/src/filter-stack.ts b/packages/grpc-js-core/src/filter-stack.ts index 360a5cfc..f9cd7d61 100644 --- a/packages/grpc-js-core/src/filter-stack.ts +++ b/packages/grpc-js-core/src/filter-stack.ts @@ -1,4 +1,4 @@ -import {flow, flowRight, map} from 'lodash'; +import {map} from 'lodash'; import {Call, StatusObject, WriteObject} from './call-stream'; import {Filter, FilterFactory} from './filter'; @@ -8,29 +8,53 @@ export class FilterStack implements Filter { constructor(private readonly filters: Filter[]) {} sendMetadata(metadata: Promise) { - return flow(map( - this.filters, (filter) => filter.sendMetadata.bind(filter)))(metadata); + let result: Promise = metadata; + + for (let i = 0; i < this.filters.length; i++) { + result = this.filters[i].sendMetadata(result); + } + + return result; } receiveMetadata(metadata: Promise) { - return flowRight( - map(this.filters, (filter) => filter.receiveMetadata.bind(filter)))( - metadata); + let result: Promise = metadata; + + for (let i = this.filters.length - 1; i >= 0; i--) { + result = this.filters[i].receiveMetadata(result); + } + + return result; } sendMessage(message: Promise): Promise { - return flow(map(this.filters, (filter) => filter.sendMessage.bind(filter)))( - message); + let result: Promise = message; + + for (let i = 0; i < this.filters.length; i++) { + result = this.filters[i].sendMessage(result); + } + + return result; } receiveMessage(message: Promise): Promise { - return flowRight(map( - this.filters, (filter) => filter.receiveMessage.bind(filter)))(message); + let result: Promise = message; + + for (let i = this.filters.length - 1; i >= 0; i--) { + result = this.filters[i].receiveMessage(result); + } + + return result; } receiveTrailers(status: Promise): Promise { - return flowRight(map( - this.filters, (filter) => filter.receiveTrailers.bind(filter)))(status); + let result: Promise = status; + + for (let i = this.filters.length - 1; i >= 0; i--) { + result = this.filters[i].receiveTrailers(result); + } + + return result; } }