diff --git a/hystrixjs/hystrixjs-tests.ts b/hystrixjs/hystrixjs-tests.ts new file mode 100644 index 0000000000..80f840861e --- /dev/null +++ b/hystrixjs/hystrixjs-tests.ts @@ -0,0 +1,86 @@ +/// +/// + +import hystrixjs = require('hystrixjs'); +import q = require('q'); + +var commandFactory = hystrixjs.commandFactory; + +var command = commandFactory + .getOrCreate('testCommand', 'testGroup') + .circuitBreakerSleepWindowInMilliseconds(5000) + .errorHandler((error) => { + return false; + }) + .timeout(3000) + .circuitBreakerRequestVolumeThreshold(10) + .requestVolumeRejectionThreshold(10) + .circuitBreakerForceOpened(true) + .circuitBreakerForceClosed(false) + .statisticalWindowNumberOfBuckets(10) + .statisticalWindowLength(10) + .percentileWindowNumberOfBuckets(10) + .percentileWindowLength(60) + .circuitBreakerErrorThresholdPercentage(30) + .fallbackTo((error) => { + return q.resolve('fallback'); + }) + .run((args) => { + return q.resolve(args); + }) + .build(); + +command.execute('something').then((result) => { + console.log(result); +}) + +commandFactory.resetCache(); + +var metricsFactory = hystrixjs.metricsFactory; + +var metrics = metricsFactory.getOrCreate({ + commandKey: 'metricsKey', + commandGroup: 'metricsGroup' +}) +metrics.markSuccess(); +metrics.markFailure(); +metrics.markRejected(); +metrics.markTimeout(); +metrics.incrementExecutionCount(); +metrics.decrementExecutionCount(); +metrics.getCurrentExecutionCount(); +metrics.addExecutionTime(3000); +metrics.getRollingCount("FAILURE"); +var healthcounts = metrics.getHealthCounts(); +console.log(healthcounts.totalCount); +console.log(healthcounts.errorCount); +console.log(healthcounts.errorPercentage); + +metricsFactory.resetCache(); + +metricsFactory.getAllMetrics().map((metrics) => { + console.log(metrics.getCurrentExecutionCount()); +}); + +var hystrixConfig = hystrixjs.hystrixConfig; +console.log(hystrixConfig.metricsPercentileWindowBuckets()); +console.log(hystrixConfig.circuitBreakerForceClosed()); +console.log(hystrixConfig.circuitBreakerForceOpened()); +console.log(hystrixConfig.circuitBreakerSleepWindowInMilliseconds()); +console.log(hystrixConfig.circuitBreakerErrorThresholdPercentage()); +console.log(hystrixConfig.circuitBreakerRequestVolumeThreshold()); +console.log(hystrixConfig.circuitBreakerRequestVolumeThresholdForceOverride()); +console.log(hystrixConfig.circuitBreakerRequestVolumeThresholdOverride()); +console.log(hystrixConfig.executionTimeoutInMilliseconds()); +console.log(hystrixConfig.metricsStatisticalWindowBuckets()); +console.log(hystrixConfig.metricsStatisticalWindowInMilliseconds()); +console.log(hystrixConfig.metricsPercentileWindowInMilliseconds()); +console.log(hystrixConfig.requestVolumeRejectionThreshold()); +console.log(hystrixConfig.resetProperties()); +console.log(hystrixConfig.init({})); + +var hystrixSSEStream = hystrixjs.hystrixSSEStream; + +hystrixSSEStream.toObservable().subscribe((result) => { + console.log(result); +}) diff --git a/hystrixjs/hystrixjs.d.ts b/hystrixjs/hystrixjs.d.ts new file mode 100644 index 0000000000..1fd55e7e57 --- /dev/null +++ b/hystrixjs/hystrixjs.d.ts @@ -0,0 +1,148 @@ +// Type definitions for dragula v2.1.2 +// Project: https://bitbucket.org/igor_sechyn/hystrixjs +// Definitions by: Igor Sechyn +// Definitions: https://github.com/borisyankov/DefinitelyTyped + +/// +/// + +declare module HystrixJS { + + interface HystrixProperties { + "hystrix.force.circuit.open"?: boolean, + "hystrix.force.circuit.closed"?: boolean, + "hystrix.circuit.sleepWindowInMilliseconds"?:number, + "hystrix.circuit.errorThresholdPercentage"?: number, + "hystrix.circuit.volumeThreshold"?:number, + "hystrix.circuit.volumeThreshold.forceOverride"?: boolean, + "hystrix.circuit.volumeThreshold.override"?: number, + "hystrix.execution.timeoutInMilliseconds"?: number, + "hystrix.metrics.statistical.window.timeInMilliseconds"?: number, + "hystrix.metrics.statistical.window.bucketsNumber"?: number, + "hystrix.metrics.percentile.window.timeInMilliseconds"?: number, + "hystrix.metrics.percentile.window.bucketsNumber"?: number, + "hystrix.request.volume.rejectionThreshold"?: number + } + + interface HystrixConfig { + metricsPercentileWindowBuckets(): number; + circuitBreakerForceClosed(): boolean; + circuitBreakerForceOpened(): boolean; + circuitBreakerSleepWindowInMilliseconds(): number; + circuitBreakerErrorThresholdPercentage(): number; + circuitBreakerRequestVolumeThreshold(): number; + circuitBreakerRequestVolumeThresholdForceOverride(): boolean; + circuitBreakerRequestVolumeThresholdOverride(): number; + executionTimeoutInMilliseconds(): number; + metricsStatisticalWindowBuckets(): number; + metricsStatisticalWindowInMilliseconds(): number; + metricsPercentileWindowInMilliseconds(): number; + metricsPercentileWindowBuckets(): number; + requestVolumeRejectionThreshold(): number; + resetProperties(): void; + init(properties: HystrixProperties): void; + } + + interface Command { + execute(...args: any[]): Q.Promise; + } + + interface CommandBuilder { + circuitBreakerSleepWindowInMilliseconds(value: number): CommandBuilder; + errorHandler(value: (error: any) => boolean): CommandBuilder; + timeout(value: number): CommandBuilder; + circuitBreakerRequestVolumeThreshold(value: number): CommandBuilder; + requestVolumeRejectionThreshold(value: number): CommandBuilder; + circuitBreakerForceOpened(value: boolean): CommandBuilder; + circuitBreakerForceClosed(value: boolean): CommandBuilder; + statisticalWindowNumberOfBuckets(value: number): CommandBuilder; + statisticalWindowLength(value: number): CommandBuilder; + percentileWindowNumberOfBuckets(value: number): CommandBuilder; + percentileWindowLength(value: number): CommandBuilder; + circuitBreakerErrorThresholdPercentage(value: number): CommandBuilder; + run(value: (args: any) => Q.Promise): CommandBuilder; + fallbackTo(value: (...args: any[]) => Q.Promise): CommandBuilder; + context(value: any): CommandBuilder; + build(): Command; + } + + interface CommandFactory { + getOrCreate(commandKey: string, commandGroup?: string): CommandBuilder; + resetCache(): void; + } + + interface HealthCounts { + totalCount: number; + errorCount: number; + errorPercentage: number; + } + + interface CommandMetrics { + markSuccess(): void; + markRejected(): void; + markFailure(): void; + markTimeout(): void; + markShortCircuited(): void; + incrementExecutionCount(): void; + decrementExecutionCount(): void; + getCurrentExecutionCount(): number; + addExecutionTime(value: number): void; + getRollingCount(type: any): number; + getExecutionTime(percentile: any): number; + getHealthCounts(): HealthCounts; + reset(): void; + } + + interface MetricsProperties { + commandKey: string, + commandGroup: string, + statisticalWindowTimeInMilliSeconds?: number, + statisticalWindowNumberOfBuckets?: number, + percentileWindowTimeInMilliSeconds?: number, + percentileWindowNumberOfBuckets?: number + } + + interface MetricsFactory { + getOrCreate(config: MetricsProperties): CommandMetrics; + resetCache(): void; + getAllMetrics(): Array; + } + + interface CirctuiBreakerConfig { + circuitBreakerSleepWindowInMilliseconds: number, + commandKey: string, + circuitBreakerErrorThresholdPercentage: number, + circuitBreakerRequestVolumeThreshold: number, + commandGroup: string, + circuitBreakerForceClosed: boolean, + circuitBreakerForceOpened: boolean + } + + interface CircuitBreaker { + allowRequest(): boolean; + allowSingleTest(): boolean; + isOpen(): boolean; + markSuccess(): void; + } + + interface CircuitFactory { + getOrCreate(config: CirctuiBreakerConfig): CircuitBreaker; + getCache(): Array; + resetCache(): void; + } + + interface HystrixSSEStream { + toObservable(): Rx.Observable + } +} +declare var hystrixjs: { + commandFactory: HystrixJS.CommandFactory, + metricsFactory: HystrixJS.MetricsFactory, + circuitFactory: HystrixJS.CircuitFactory, + hystrixSSEStream: HystrixJS.HystrixSSEStream, + hystrixConfig: HystrixJS.HystrixConfig +}; + +declare module "hystrixjs" { + export = hystrixjs; +}