@timmeck/trading-brain 2.31.22 → 2.31.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -24,45 +24,55 @@ function createMockRepo() {
24
24
  };
25
25
  }
26
26
  describe('PriceFetcher', () => {
27
- describe('Rate limiting', () => {
27
+ describe('Per-provider rate limiting', () => {
28
28
  it('should have rate limiting properties initialized', () => {
29
29
  const repo = createMockRepo();
30
30
  const fetcher = new PriceFetcher(mockConfig, repo);
31
- // Verify internal state
32
- expect(fetcher.consecutiveErrors).toBe(0);
33
- expect(fetcher.backoffMs).toBe(0);
34
- expect(fetcher.MAX_CONSECUTIVE_ERRORS).toBe(5);
31
+ expect(fetcher.providerErrors).toBeInstanceOf(Map);
32
+ expect(fetcher.providerBackoff).toBeInstanceOf(Map);
33
+ expect(fetcher.MAX_CONSECUTIVE_ERRORS).toBe(3);
35
34
  });
36
- it('should track consecutive errors and compute backoff', () => {
35
+ it('should track consecutive errors per provider and compute backoff', () => {
37
36
  const repo = createMockRepo();
38
37
  const fetcher = new PriceFetcher(mockConfig, repo);
39
- // Simulate errors
40
- for (let i = 0; i < 5; i++) {
41
- fetcher.recordError();
38
+ for (let i = 0; i < 3; i++) {
39
+ fetcher.recordProviderError('coingecko');
42
40
  }
43
- expect(fetcher.consecutiveErrors).toBe(5);
44
- expect(fetcher.backoffMs).toBeGreaterThan(0);
41
+ expect(fetcher.providerErrors.get('coingecko')).toBe(3);
42
+ expect(fetcher.getBackoff('coingecko')).toBeGreaterThan(0);
43
+ // Yahoo should be unaffected
44
+ expect(fetcher.getBackoff('yahoo')).toBe(0);
45
45
  });
46
- it('should reset error tracking on success', () => {
46
+ it('should reset error tracking on provider success', () => {
47
47
  const repo = createMockRepo();
48
48
  const fetcher = new PriceFetcher(mockConfig, repo);
49
- // Simulate errors then success
50
49
  for (let i = 0; i < 5; i++) {
51
- fetcher.recordError();
50
+ fetcher.recordProviderError('yahoo');
52
51
  }
53
- expect(fetcher.consecutiveErrors).toBe(5);
54
- fetcher.recordSuccess();
55
- expect(fetcher.consecutiveErrors).toBe(0);
56
- expect(fetcher.backoffMs).toBe(0);
52
+ expect(fetcher.providerErrors.get('yahoo')).toBe(5);
53
+ fetcher.recordProviderSuccess('yahoo');
54
+ expect(fetcher.providerErrors.get('yahoo')).toBe(0);
55
+ expect(fetcher.getBackoff('yahoo')).toBe(0);
57
56
  });
58
- it('should cap backoff at 30 seconds', () => {
57
+ it('should cap backoff at MAX_BACKOFF_MS', () => {
59
58
  const repo = createMockRepo();
60
59
  const fetcher = new PriceFetcher(mockConfig, repo);
61
- // Simulate many errors
62
60
  for (let i = 0; i < 20; i++) {
63
- fetcher.recordError();
61
+ fetcher.recordProviderError('coingecko');
62
+ }
63
+ expect(fetcher.getBackoff('coingecko')).toBeLessThanOrEqual(30_000);
64
+ });
65
+ it('should isolate providers from each other', () => {
66
+ const repo = createMockRepo();
67
+ const fetcher = new PriceFetcher(mockConfig, repo);
68
+ for (let i = 0; i < 5; i++) {
69
+ fetcher.recordProviderError('coingecko');
64
70
  }
65
- expect(fetcher.backoffMs).toBeLessThanOrEqual(30_000);
71
+ fetcher.recordProviderError('yahoo');
72
+ expect(fetcher.providerErrors.get('coingecko')).toBe(5);
73
+ expect(fetcher.providerErrors.get('yahoo')).toBe(1);
74
+ expect(fetcher.getBackoff('coingecko')).toBeGreaterThan(0);
75
+ expect(fetcher.getBackoff('yahoo')).toBe(0);
66
76
  });
67
77
  });
68
78
  describe('Cache', () => {
@@ -1 +1 @@
1
- {"version":3,"file":"price-fetcher.test.js","sourceRoot":"","sources":["../../../src/paper/__tests__/price-fetcher.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"price-fetcher.test.js","sourceRoot":"","sources":["../../../src/paper/__tests__/price-fetcher.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@timmeck/trading-brain",
3
- "version": "2.31.22",
3
+ "version": "2.31.23",
4
4
  "description": "Adaptive trading intelligence system with Hebbian synapses, spreading activation, Wilson Score confidence, and adaptive calibration",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",