@fintekkers/ledger-models 0.4.9 → 0.4.11
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.
- package/node/wrappers/models/hydrate.test.d.ts +1 -0
- package/node/wrappers/models/hydrate.test.js +204 -0
- package/node/wrappers/models/hydrate.test.js.map +1 -0
- package/node/wrappers/models/hydrate.test.ts +214 -0
- package/node/wrappers/models/lazy-hydrate-race.test.d.ts +1 -0
- package/node/wrappers/models/lazy-hydrate-race.test.js +153 -0
- package/node/wrappers/models/lazy-hydrate-race.test.js.map +1 -0
- package/node/wrappers/models/lazy-hydrate-race.test.ts +144 -0
- package/node/wrappers/models/lazy-hydrate.bench.test.d.ts +1 -0
- package/node/wrappers/models/lazy-hydrate.bench.test.js +121 -0
- package/node/wrappers/models/lazy-hydrate.bench.test.js.map +1 -0
- package/node/wrappers/models/lazy-hydrate.bench.test.ts +103 -0
- package/node/wrappers/models/portfolio/portfolio.d.ts +18 -0
- package/node/wrappers/models/portfolio/portfolio.js +93 -1
- package/node/wrappers/models/portfolio/portfolio.js.map +1 -1
- package/node/wrappers/models/portfolio/portfolio.ts +58 -1
- package/node/wrappers/models/portfolio-price-transaction.lazy-hydrate.test.d.ts +1 -0
- package/node/wrappers/models/portfolio-price-transaction.lazy-hydrate.test.js +158 -0
- package/node/wrappers/models/portfolio-price-transaction.lazy-hydrate.test.js.map +1 -0
- package/node/wrappers/models/portfolio-price-transaction.lazy-hydrate.test.ts +153 -0
- package/node/wrappers/models/price/Price.d.ts +5 -0
- package/node/wrappers/models/price/Price.js +48 -0
- package/node/wrappers/models/price/Price.js.map +1 -1
- package/node/wrappers/models/price/Price.ts +26 -0
- package/node/wrappers/models/security/identifier-validation.test.d.ts +1 -0
- package/node/wrappers/models/security/identifier-validation.test.js +104 -0
- package/node/wrappers/models/security/identifier-validation.test.js.map +1 -0
- package/node/wrappers/models/security/identifier-validation.test.ts +133 -0
- package/node/wrappers/models/security/identifier.d.ts +26 -0
- package/node/wrappers/models/security/identifier.js +54 -1
- package/node/wrappers/models/security/identifier.js.map +1 -1
- package/node/wrappers/models/security/identifier.test.js +6 -9
- package/node/wrappers/models/security/identifier.test.js.map +1 -1
- package/node/wrappers/models/security/identifier.test.ts +6 -9
- package/node/wrappers/models/security/identifier.ts +58 -0
- package/node/wrappers/models/security/security.d.ts +23 -5
- package/node/wrappers/models/security/security.js +53 -6
- package/node/wrappers/models/security/security.js.map +1 -1
- package/node/wrappers/models/security/security.ts +38 -6
- package/node/wrappers/models/transaction/transaction.d.ts +18 -0
- package/node/wrappers/models/transaction/transaction.js +98 -0
- package/node/wrappers/models/transaction/transaction.js.map +1 -1
- package/node/wrappers/models/transaction/transaction.ts +65 -0
- package/node/wrappers/services/portfolio-service/PortfolioService.js +35 -0
- package/node/wrappers/services/portfolio-service/PortfolioService.js.map +1 -1
- package/node/wrappers/services/portfolio-service/PortfolioService.ts +14 -2
- package/node/wrappers/services/price-service/PriceService.js +10 -0
- package/node/wrappers/services/price-service/PriceService.js.map +1 -1
- package/node/wrappers/services/price-service/PriceService.ts +12 -2
- package/node/wrappers/services/security-service/SecurityService.js +23 -0
- package/node/wrappers/services/security-service/SecurityService.js.map +1 -1
- package/node/wrappers/services/security-service/SecurityService.ts +27 -2
- package/node/wrappers/services/security.identifier-guard.test.d.ts +1 -0
- package/node/wrappers/services/security.identifier-guard.test.js +63 -0
- package/node/wrappers/services/security.identifier-guard.test.js.map +1 -0
- package/node/wrappers/services/security.identifier-guard.test.ts +70 -0
- package/node/wrappers/services/service-client-writethrough.test.d.ts +1 -0
- package/node/wrappers/services/service-client-writethrough.test.js +147 -0
- package/node/wrappers/services/service-client-writethrough.test.js.map +1 -0
- package/node/wrappers/services/service-client-writethrough.test.ts +141 -0
- package/node/wrappers/services/transaction-service/TransactionService.js +36 -0
- package/node/wrappers/services/transaction-service/TransactionService.js.map +1 -1
- package/node/wrappers/services/transaction-service/TransactionService.ts +13 -0
- package/node/wrappers/util/link-cache.d.ts +13 -6
- package/node/wrappers/util/link-cache.js +51 -15
- package/node/wrappers/util/link-cache.js.map +1 -1
- package/node/wrappers/util/link-cache.ts +51 -17
- package/node/wrappers/util/link-resolver.d.ts +39 -31
- package/node/wrappers/util/link-resolver.js +157 -97
- package/node/wrappers/util/link-resolver.js.map +1 -1
- package/node/wrappers/util/link-resolver.test.js +88 -2
- package/node/wrappers/util/link-resolver.test.js.map +1 -1
- package/node/wrappers/util/link-resolver.test.ts +76 -2
- package/node/wrappers/util/link-resolver.ts +143 -124
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link-resolver.test.js","sourceRoot":"","sources":["link-resolver.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"link-resolver.test.js","sourceRoot":"","sources":["link-resolver.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import LinkResolver from './link-resolver';
|
|
2
2
|
import Price from '../models/price/Price';
|
|
3
3
|
import { UUID } from '../models/utils/uuid';
|
|
4
|
+
import * as LinkCacheModuleTop from './link-cache';
|
|
4
5
|
|
|
5
6
|
import { SecurityProto } from '../../fintekkers/models/security/security_pb';
|
|
6
7
|
import { PortfolioProto } from '../../fintekkers/models/portfolio/portfolio_pb';
|
|
@@ -121,6 +122,14 @@ function linkPrice(securityUuid: UUID, priceValue: string, asOf?: LocalTimestamp
|
|
|
121
122
|
}
|
|
122
123
|
|
|
123
124
|
describe('LinkResolver', () => {
|
|
125
|
+
// Process-wide LinkCache singletons survive across tests, so clear them
|
|
126
|
+
// between cases to keep tests independent (post-W4 the resolver no longer
|
|
127
|
+
// owns its own cache).
|
|
128
|
+
beforeEach(() => {
|
|
129
|
+
LinkCacheModuleTop.SECURITY.clear();
|
|
130
|
+
LinkCacheModuleTop.PORTFOLIO.clear();
|
|
131
|
+
});
|
|
132
|
+
|
|
124
133
|
test('bulk resolveSecurities dedupes UUIDs (5 prices, 3 unique → 1 RPC, 3 UUIDs)', async () => {
|
|
125
134
|
const uuidA = UUID.random();
|
|
126
135
|
const uuidB = UUID.random();
|
|
@@ -203,7 +212,10 @@ describe('LinkResolver', () => {
|
|
|
203
212
|
for (const r of results) expect(r.getIssuerName()).toBe('AAPL');
|
|
204
213
|
});
|
|
205
214
|
|
|
206
|
-
test('
|
|
215
|
+
test('LinkCache evict between calls forces refetch', async () => {
|
|
216
|
+
// Post-W4 the resolver no longer owns its cache. Evict the entry from
|
|
217
|
+
// LinkCache.SECURITY between calls to force a refetch — the equivalent
|
|
218
|
+
// of the old `cacheSize=0` semantic.
|
|
207
219
|
const uuid = UUID.random();
|
|
208
220
|
const store = new Map<string, SecurityProto>([
|
|
209
221
|
[uuid.toString(), fullSecurity(uuid, 'AAPL')],
|
|
@@ -211,12 +223,12 @@ describe('LinkResolver', () => {
|
|
|
211
223
|
const callLog = newCallLog();
|
|
212
224
|
|
|
213
225
|
const resolver = new LinkResolver({
|
|
214
|
-
cacheSize: 0,
|
|
215
226
|
securityClient: mockSecurityClient(store, callLog),
|
|
216
227
|
portfolioClient: mockPortfolioClient(new Map(), newCallLog()),
|
|
217
228
|
});
|
|
218
229
|
|
|
219
230
|
await resolver.getSecurity(uuid);
|
|
231
|
+
LinkCacheModuleTop.SECURITY.evict(uuid.toString());
|
|
220
232
|
await resolver.getSecurity(uuid);
|
|
221
233
|
|
|
222
234
|
expect(callLog.count).toBe(2);
|
|
@@ -400,3 +412,65 @@ describe('LinkResolver', () => {
|
|
|
400
412
|
expect(callLog.count).toBe(2);
|
|
401
413
|
});
|
|
402
414
|
});
|
|
415
|
+
|
|
416
|
+
import * as LinkCacheModule from './link-cache';
|
|
417
|
+
import { ZonedDateTime } from '../models/utils/datetime';
|
|
418
|
+
|
|
419
|
+
describe('LinkResolver write-through to LinkCache', () => {
|
|
420
|
+
beforeEach(() => {
|
|
421
|
+
LinkCacheModule.SECURITY.clear();
|
|
422
|
+
LinkCacheModule.PORTFOLIO.clear();
|
|
423
|
+
});
|
|
424
|
+
|
|
425
|
+
function fullSecurityWithAsOf(uuid: UUID, issuer: string, asOf: LocalTimestampProto): SecurityProto {
|
|
426
|
+
const proto = fullSecurity(uuid, issuer);
|
|
427
|
+
proto.setAsOf(asOf);
|
|
428
|
+
return proto;
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
test('getSecurity populates LinkCache.SECURITY', async () => {
|
|
432
|
+
const uuid = UUID.random();
|
|
433
|
+
const asOf = makeAsOf(1_700_000_010);
|
|
434
|
+
const store = new Map<string, SecurityProto>([
|
|
435
|
+
[uuid.toString(), fullSecurityWithAsOf(uuid, 'ACME', asOf)],
|
|
436
|
+
]);
|
|
437
|
+
const resolver = new LinkResolver({
|
|
438
|
+
securityClient: mockSecurityClient(store, newCallLog()),
|
|
439
|
+
portfolioClient: mockPortfolioClient(new Map(), newCallLog()),
|
|
440
|
+
});
|
|
441
|
+
|
|
442
|
+
const out = await resolver.getSecurity(uuid, asOf);
|
|
443
|
+
expect(out.getIssuerName()).toBe('ACME');
|
|
444
|
+
|
|
445
|
+
const cached = LinkCacheModule.SECURITY.get(uuid.toString(), new ZonedDateTime(asOf));
|
|
446
|
+
expect(cached).toBeDefined();
|
|
447
|
+
expect(cached!.getIssuerName()).toBe('ACME');
|
|
448
|
+
});
|
|
449
|
+
|
|
450
|
+
test('resolveSecurities populates LinkCache.SECURITY', async () => {
|
|
451
|
+
const uuid = UUID.random();
|
|
452
|
+
const asOf = makeAsOf(1_700_000_011);
|
|
453
|
+
const store = new Map<string, SecurityProto>([
|
|
454
|
+
[uuid.toString(), fullSecurityWithAsOf(uuid, 'BULK', asOf)],
|
|
455
|
+
]);
|
|
456
|
+
const resolver = new LinkResolver({
|
|
457
|
+
securityClient: mockSecurityClient(store, newCallLog()),
|
|
458
|
+
portfolioClient: mockPortfolioClient(new Map(), newCallLog()),
|
|
459
|
+
});
|
|
460
|
+
|
|
461
|
+
const linkSec = new SecurityProto();
|
|
462
|
+
linkSec.setUuid(uuid.toUUIDProto());
|
|
463
|
+
linkSec.setIsLink(true);
|
|
464
|
+
linkSec.setAsOf(asOf);
|
|
465
|
+
const priceProto = new PriceProto();
|
|
466
|
+
priceProto.setUuid(UUID.random().toUUIDProto());
|
|
467
|
+
priceProto.setSecurity(linkSec);
|
|
468
|
+
const price = new Price(priceProto);
|
|
469
|
+
|
|
470
|
+
await resolver.resolveSecurities([price]);
|
|
471
|
+
|
|
472
|
+
const cached = LinkCacheModule.SECURITY.get(uuid.toString(), new ZonedDateTime(asOf));
|
|
473
|
+
expect(cached).toBeDefined();
|
|
474
|
+
expect(cached!.getIssuerName()).toBe('BULK');
|
|
475
|
+
});
|
|
476
|
+
});
|
|
@@ -2,53 +2,50 @@ import { promisify } from 'util';
|
|
|
2
2
|
|
|
3
3
|
import { SecurityProto } from '../../fintekkers/models/security/security_pb';
|
|
4
4
|
import { PortfolioProto } from '../../fintekkers/models/portfolio/portfolio_pb';
|
|
5
|
+
import { TransactionProto } from '../../fintekkers/models/transaction/transaction_pb';
|
|
5
6
|
import { UUIDProto } from '../../fintekkers/models/util/uuid_pb';
|
|
6
7
|
import { LocalTimestampProto } from '../../fintekkers/models/util/local_timestamp_pb';
|
|
7
8
|
|
|
8
9
|
import { SecurityClient } from '../../fintekkers/services/security-service/security_service_grpc_pb';
|
|
9
10
|
import { PortfolioClient } from '../../fintekkers/services/portfolio-service/portfolio_service_grpc_pb';
|
|
11
|
+
import { TransactionClient } from '../../fintekkers/services/transaction-service/transaction_service_grpc_pb';
|
|
10
12
|
import { QuerySecurityRequestProto } from '../../fintekkers/requests/security/query_security_request_pb';
|
|
11
13
|
import { QuerySecurityResponseProto } from '../../fintekkers/requests/security/query_security_response_pb';
|
|
12
14
|
import { QueryPortfolioRequestProto } from '../../fintekkers/requests/portfolio/query_portfolio_request_pb';
|
|
13
15
|
import { QueryPortfolioResponseProto } from '../../fintekkers/requests/portfolio/query_portfolio_response_pb';
|
|
16
|
+
import { QueryTransactionRequestProto } from '../../fintekkers/requests/transaction/query_transaction_request_pb';
|
|
17
|
+
import { QueryTransactionResponseProto } from '../../fintekkers/requests/transaction/query_transaction_response_pb';
|
|
14
18
|
|
|
15
19
|
import Security from '../models/security/security';
|
|
16
20
|
import Portfolio from '../models/portfolio/portfolio';
|
|
21
|
+
import Transaction from '../models/transaction/transaction';
|
|
17
22
|
import { UUID } from '../models/utils/uuid';
|
|
18
23
|
import EnvConfig from '../models/utils/requestcontext';
|
|
24
|
+
import { ZonedDateTime } from '../models/utils/datetime';
|
|
25
|
+
import * as LinkCacheModule from './link-cache';
|
|
19
26
|
|
|
20
27
|
/**
|
|
21
28
|
* LinkResolver — bulk hydration of `is_link=true` entity references into
|
|
22
29
|
* full entities. Implements the consumer side of the `is_link` pattern
|
|
23
30
|
* documented in `docs/adr/is_link_pattern.md`.
|
|
24
31
|
*
|
|
32
|
+
* W4: the resolver no longer owns its own LRU. Cache reads/writes route
|
|
33
|
+
* through the process-wide `LinkCache.SECURITY` / `LinkCache.PORTFOLIO`
|
|
34
|
+
* singletons. The resolver still does concurrent-call dedup (single
|
|
35
|
+
* in-flight RPC per (uuid, as_of)) and bulk per-bucket batching; storage
|
|
36
|
+
* and eviction live in LinkCache.
|
|
37
|
+
*
|
|
25
38
|
* Two surface methods:
|
|
26
39
|
* - getSecurity(uuid) / getPortfolio(uuid): single-UUID resolution. Cached
|
|
27
40
|
* and concurrent-deduped.
|
|
28
41
|
* - resolveSecurities(items) / resolvePortfolios(items): bulk in-place
|
|
29
42
|
* mutation across a heterogeneous list of items that each have a
|
|
30
43
|
* proto-style getter+setter for the embedded entity. Collects unique
|
|
31
|
-
* link UUIDs, fires one batched GetByIds RPC
|
|
32
|
-
* to swap the link sub-message for the resolved
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
* Caching:
|
|
36
|
-
* - Process-level LRU keyed on UUID string. Default 1000 entries, no TTL
|
|
37
|
-
* (entries live until evicted by LRU). Long-running services that need
|
|
38
|
-
* freshness should pass `{ ttlMs: <ms> }`. Tests can disable with
|
|
39
|
-
* `{ cacheSize: 0 }`.
|
|
40
|
-
* - Concurrent same-UUID requests are deduped via an in-flight promise
|
|
41
|
-
* map — N parallel callers for the same UUID share one RPC.
|
|
42
|
-
*
|
|
43
|
-
* RPC choice: uses `GetByIds` (unary, UUID-keyed bulk) per the ADR. The
|
|
44
|
-
* existing `SecurityService.search` (streaming) would also work but
|
|
45
|
-
* requires more wrapper plumbing for batched-by-UUID semantics.
|
|
44
|
+
* link UUIDs, fires one batched GetByIds RPC per as_of bucket, mutates
|
|
45
|
+
* each item's proto to swap the link sub-message for the resolved
|
|
46
|
+
* full entity.
|
|
46
47
|
*
|
|
47
|
-
*
|
|
48
|
-
* replaced (not the outer entity). Outer Price.proto.is_link is unchanged;
|
|
49
|
-
* only the inner SecurityProto is swapped from link-stub to full entity.
|
|
50
|
-
* Wrapper objects that read through the proto (`price.getSecurity()`)
|
|
51
|
-
* automatically see the resolved data.
|
|
48
|
+
* RPC choice: uses `GetByIds` (unary, UUID-keyed bulk) per the ADR.
|
|
52
49
|
*
|
|
53
50
|
* Time-travel (`as_of`) semantic: per is_link_pattern.md addendum, when
|
|
54
51
|
* a link sub-message has only `uuid` set the resolver fetches the latest
|
|
@@ -61,104 +58,74 @@ import EnvConfig from '../models/utils/requestcontext';
|
|
|
61
58
|
export interface LinkResolverOptions {
|
|
62
59
|
/** Optional API key. If omitted, EnvConfig.apiCredentials is used. */
|
|
63
60
|
apiKey?: string;
|
|
64
|
-
/** LRU max entries. Default 1000. Set to 0 to disable caching. */
|
|
65
|
-
cacheSize?: number;
|
|
66
|
-
/** Per-entry TTL in ms. Default undefined (no expiry). */
|
|
67
|
-
ttlMs?: number;
|
|
68
61
|
/**
|
|
69
62
|
* Test injection: clients to use instead of constructing real ones.
|
|
70
63
|
* Production callers should not set these.
|
|
71
64
|
*/
|
|
72
65
|
securityClient?: SecurityClient;
|
|
73
66
|
portfolioClient?: PortfolioClient;
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
interface CacheEntry<V> {
|
|
77
|
-
value: V;
|
|
78
|
-
insertedAt: number;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* Tiny LRU. Map keeps insertion order; on get-hit we delete + re-insert
|
|
83
|
-
* to bump to the end (most recently used). On overflow we drop the
|
|
84
|
-
* oldest entry (first key in the Map). Avoids pulling in lru-cache as a
|
|
85
|
-
* dependency for ~30 lines of logic.
|
|
86
|
-
*/
|
|
87
|
-
class TinyLRU<V> {
|
|
88
|
-
private map = new Map<string, CacheEntry<V>>();
|
|
89
|
-
constructor(private maxSize: number, private ttlMs?: number) {}
|
|
90
|
-
|
|
91
|
-
get(key: string): V | undefined {
|
|
92
|
-
if (this.maxSize === 0) return undefined;
|
|
93
|
-
const entry = this.map.get(key);
|
|
94
|
-
if (!entry) return undefined;
|
|
95
|
-
if (this.ttlMs !== undefined && Date.now() - entry.insertedAt > this.ttlMs) {
|
|
96
|
-
this.map.delete(key);
|
|
97
|
-
return undefined;
|
|
98
|
-
}
|
|
99
|
-
// Bump to most-recently-used.
|
|
100
|
-
this.map.delete(key);
|
|
101
|
-
this.map.set(key, entry);
|
|
102
|
-
return entry.value;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
set(key: string, value: V): void {
|
|
106
|
-
if (this.maxSize === 0) return;
|
|
107
|
-
if (this.map.has(key)) this.map.delete(key);
|
|
108
|
-
this.map.set(key, { value, insertedAt: Date.now() });
|
|
109
|
-
while (this.map.size > this.maxSize) {
|
|
110
|
-
const oldest = this.map.keys().next().value;
|
|
111
|
-
if (oldest === undefined) break;
|
|
112
|
-
this.map.delete(oldest);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
size(): number {
|
|
117
|
-
return this.map.size;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
clear(): void {
|
|
121
|
-
this.map.clear();
|
|
122
|
-
}
|
|
67
|
+
transactionClient?: TransactionClient;
|
|
123
68
|
}
|
|
124
69
|
|
|
125
70
|
/**
|
|
126
|
-
* Stable serialization of a LocalTimestampProto for use in
|
|
127
|
-
* and as_of-bucket grouping. Uses the proto's binary form (Uint8Array
|
|
71
|
+
* Stable serialization of a LocalTimestampProto for use in in-flight dedup
|
|
72
|
+
* keys and as_of-bucket grouping. Uses the proto's binary form (Uint8Array
|
|
128
73
|
* → base64). Returns the literal "latest" when as_of is undefined so
|
|
129
74
|
* unset and explicit-undefined collapse to the same bucket.
|
|
130
|
-
*
|
|
131
|
-
* Two LocalTimestampProto instances representing the same moment will
|
|
132
|
-
* produce the same key as long as the underlying nanos/seconds match —
|
|
133
|
-
* proto3 binary encoding is canonical for unset fields.
|
|
134
75
|
*/
|
|
135
76
|
function asOfKey(asOf: LocalTimestampProto | undefined): string {
|
|
136
77
|
if (!asOf) return 'latest';
|
|
137
|
-
// serializeBinary returns Uint8Array.
|
|
138
78
|
const bytes = asOf.serializeBinary();
|
|
139
79
|
return Buffer.from(bytes).toString('base64');
|
|
140
80
|
}
|
|
141
81
|
|
|
82
|
+
function asOfToZdt(asOf: LocalTimestampProto | undefined): ZonedDateTime | null {
|
|
83
|
+
return asOf ? new ZonedDateTime(asOf) : null;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Process-wide default singleton — lazily constructed on first
|
|
87
|
+
// `LinkResolver.getDefault()` call. Used by the wrapper `hydrate()`
|
|
88
|
+
// methods so callers don't have to thread a resolver instance through
|
|
89
|
+
// their code. Override the default by calling `LinkResolver.setDefault(...)`
|
|
90
|
+
// at process start (tests with mocked clients, alternate endpoints, etc.).
|
|
91
|
+
let defaultLinkResolver: LinkResolver | undefined;
|
|
92
|
+
|
|
142
93
|
class LinkResolver {
|
|
143
94
|
private securityClient: SecurityClient;
|
|
144
95
|
private portfolioClient: PortfolioClient;
|
|
145
|
-
|
|
146
|
-
private securityCache: TinyLRU<SecurityProto>;
|
|
147
|
-
private portfolioCache: TinyLRU<PortfolioProto>;
|
|
96
|
+
private transactionClient: TransactionClient;
|
|
148
97
|
|
|
149
98
|
// Concurrent-call dedupe: a UUID currently being fetched maps to the
|
|
150
99
|
// promise the *first* caller is awaiting. Subsequent callers for the
|
|
151
100
|
// same UUID receive that same promise.
|
|
152
101
|
private securityInFlight = new Map<string, Promise<SecurityProto>>();
|
|
153
102
|
private portfolioInFlight = new Map<string, Promise<PortfolioProto>>();
|
|
103
|
+
private transactionInFlight = new Map<string, Promise<TransactionProto>>();
|
|
154
104
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
105
|
+
/**
|
|
106
|
+
* Process-wide singleton — lazily constructed with default options
|
|
107
|
+
* (env-derived endpoint via `EnvConfig`). The wrapper `hydrate()`
|
|
108
|
+
* methods reach for this when no resolver is passed explicitly, so
|
|
109
|
+
* users get auto-resolve on link-mode wrappers without threading a
|
|
110
|
+
* resolver through every call site.
|
|
111
|
+
*/
|
|
112
|
+
static getDefault(): LinkResolver {
|
|
113
|
+
if (!defaultLinkResolver) {
|
|
114
|
+
defaultLinkResolver = new LinkResolver();
|
|
115
|
+
}
|
|
116
|
+
return defaultLinkResolver;
|
|
117
|
+
}
|
|
158
118
|
|
|
159
|
-
|
|
160
|
-
|
|
119
|
+
/**
|
|
120
|
+
* Replace the process-wide default. Call once at process start for
|
|
121
|
+
* tests with mocked clients or to point at a non-default endpoint.
|
|
122
|
+
* Pass `undefined` to clear (next `getDefault()` call rebuilds).
|
|
123
|
+
*/
|
|
124
|
+
static setDefault(resolver: LinkResolver | undefined): void {
|
|
125
|
+
defaultLinkResolver = resolver;
|
|
126
|
+
}
|
|
161
127
|
|
|
128
|
+
constructor(opts: LinkResolverOptions = {}) {
|
|
162
129
|
if (opts.securityClient) {
|
|
163
130
|
this.securityClient = opts.securityClient;
|
|
164
131
|
} else if (opts.apiKey) {
|
|
@@ -176,6 +143,15 @@ class LinkResolver {
|
|
|
176
143
|
} else {
|
|
177
144
|
this.portfolioClient = new PortfolioClient(EnvConfig.apiURL, EnvConfig.apiCredentials);
|
|
178
145
|
}
|
|
146
|
+
|
|
147
|
+
if (opts.transactionClient) {
|
|
148
|
+
this.transactionClient = opts.transactionClient;
|
|
149
|
+
} else if (opts.apiKey) {
|
|
150
|
+
const { credentials, interceptors } = EnvConfig.getAuthenticatedClientOptions(opts.apiKey);
|
|
151
|
+
this.transactionClient = new TransactionClient(EnvConfig.apiURL, credentials, { interceptors });
|
|
152
|
+
} else {
|
|
153
|
+
this.transactionClient = new TransactionClient(EnvConfig.apiURL, EnvConfig.apiCredentials);
|
|
154
|
+
}
|
|
179
155
|
}
|
|
180
156
|
|
|
181
157
|
/**
|
|
@@ -198,6 +174,15 @@ class LinkResolver {
|
|
|
198
174
|
return new Portfolio(proto);
|
|
199
175
|
}
|
|
200
176
|
|
|
177
|
+
/**
|
|
178
|
+
* Resolve a single TransactionProto by UUID, optionally as of `asOf`.
|
|
179
|
+
* Cached + concurrent-deduped on (uuid, asOf).
|
|
180
|
+
*/
|
|
181
|
+
async getTransaction(uuid: UUID, asOf?: LocalTimestampProto): Promise<Transaction> {
|
|
182
|
+
const proto = await this.fetchTransactionProto(uuid, asOf);
|
|
183
|
+
return new Transaction(proto);
|
|
184
|
+
}
|
|
185
|
+
|
|
201
186
|
/**
|
|
202
187
|
* Walk `items`, find the ones whose embedded security is `is_link=true`,
|
|
203
188
|
* batch-fetch the unique (uuid, as_of) pairs (grouped by as_of so each
|
|
@@ -205,17 +190,13 @@ class LinkResolver {
|
|
|
205
190
|
* place so subsequent `item.getSecurity()` calls return the full entity.
|
|
206
191
|
* Returns the same array for chaining.
|
|
207
192
|
*
|
|
208
|
-
* Honors per-link `as_of`: if the embedded sub-message has `as_of` set,
|
|
209
|
-
* the resolver fetches the version of the entity at that timestamp,
|
|
210
|
-
* not the latest.
|
|
211
|
-
*
|
|
212
193
|
* `T` is structural: anything with a `proto` field that exposes
|
|
213
194
|
* `getSecurity()` / `setSecurity()` works (Price, Transaction, etc).
|
|
214
195
|
*/
|
|
215
196
|
async resolveSecurities<T extends ResolvableSecurity>(items: T[]): Promise<T[]> {
|
|
216
197
|
if (items.length === 0) return items;
|
|
217
198
|
|
|
218
|
-
// Group: as_of bucket → (
|
|
199
|
+
// Group: as_of bucket → (uuid string → UUID) for items not yet cached.
|
|
219
200
|
const buckets = new Map<string, Map<string, UUID>>();
|
|
220
201
|
for (const item of items) {
|
|
221
202
|
const sec = item.proto.getSecurity();
|
|
@@ -224,31 +205,28 @@ class LinkResolver {
|
|
|
224
205
|
if (!uuidProto) continue;
|
|
225
206
|
const uuid = UUID.fromU8Array(uuidProto.getRawUuid_asU8());
|
|
226
207
|
const asOf = sec.getAsOf();
|
|
208
|
+
const uuidStr = uuid.toString();
|
|
209
|
+
if (LinkCacheModule.SECURITY.get(uuidStr, asOfToZdt(asOf))) continue;
|
|
227
210
|
const bucketKey = asOfKey(asOf);
|
|
228
|
-
const cacheKey = `${uuid.toString()}@${bucketKey}`;
|
|
229
|
-
// Skip if already cached for this exact (uuid, as_of).
|
|
230
|
-
if (this.securityCache.get(cacheKey)) continue;
|
|
231
211
|
let bucket = buckets.get(bucketKey);
|
|
232
212
|
if (!bucket) {
|
|
233
213
|
bucket = new Map<string, UUID>();
|
|
234
214
|
buckets.set(bucketKey, bucket);
|
|
235
215
|
}
|
|
236
|
-
if (!bucket.has(
|
|
216
|
+
if (!bucket.has(uuidStr)) bucket.set(uuidStr, uuid);
|
|
237
217
|
}
|
|
238
218
|
|
|
239
219
|
// One GetByIds RPC per as_of bucket. Fire in parallel.
|
|
240
220
|
await Promise.all(
|
|
241
221
|
Array.from(buckets.entries()).map(async ([bucketKey, uuidMap]) => {
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
// but it's cheap to re-find.
|
|
245
|
-
const asOf = bucketKey === 'latest' ? undefined : findAsOfForBucket(items, (sec) => sec.getSecurity(), bucketKey);
|
|
222
|
+
const asOf = bucketKey === 'latest' ? undefined : findAsOfForBucket(items, (proto) => proto.getSecurity(), bucketKey);
|
|
223
|
+
const asOfZdt = asOfToZdt(asOf);
|
|
246
224
|
const fetched = await this.batchFetchSecurities(Array.from(uuidMap.values()), asOf);
|
|
247
225
|
for (const proto of fetched) {
|
|
248
226
|
const uuidProto = proto.getUuid();
|
|
249
227
|
if (!uuidProto) continue;
|
|
250
228
|
const uuidStr = UUID.fromU8Array(uuidProto.getRawUuid_asU8()).toString();
|
|
251
|
-
|
|
229
|
+
LinkCacheModule.SECURITY.put(uuidStr, proto, asOfZdt);
|
|
252
230
|
}
|
|
253
231
|
}),
|
|
254
232
|
);
|
|
@@ -260,8 +238,7 @@ class LinkResolver {
|
|
|
260
238
|
const uuidProto = sec.getUuid();
|
|
261
239
|
if (!uuidProto) continue;
|
|
262
240
|
const uuidStr = UUID.fromU8Array(uuidProto.getRawUuid_asU8()).toString();
|
|
263
|
-
const
|
|
264
|
-
const resolved = this.securityCache.get(`${uuidStr}@${bucketKey}`);
|
|
241
|
+
const resolved = LinkCacheModule.SECURITY.get(uuidStr, asOfToZdt(sec.getAsOf()));
|
|
265
242
|
if (resolved) item.proto.setSecurity(resolved);
|
|
266
243
|
}
|
|
267
244
|
|
|
@@ -283,26 +260,27 @@ class LinkResolver {
|
|
|
283
260
|
if (!uuidProto) continue;
|
|
284
261
|
const uuid = UUID.fromU8Array(uuidProto.getRawUuid_asU8());
|
|
285
262
|
const asOf = port.getAsOf();
|
|
263
|
+
const uuidStr = uuid.toString();
|
|
264
|
+
if (LinkCacheModule.PORTFOLIO.get(uuidStr, asOfToZdt(asOf))) continue;
|
|
286
265
|
const bucketKey = asOfKey(asOf);
|
|
287
|
-
const cacheKey = `${uuid.toString()}@${bucketKey}`;
|
|
288
|
-
if (this.portfolioCache.get(cacheKey)) continue;
|
|
289
266
|
let bucket = buckets.get(bucketKey);
|
|
290
267
|
if (!bucket) {
|
|
291
268
|
bucket = new Map<string, UUID>();
|
|
292
269
|
buckets.set(bucketKey, bucket);
|
|
293
270
|
}
|
|
294
|
-
if (!bucket.has(
|
|
271
|
+
if (!bucket.has(uuidStr)) bucket.set(uuidStr, uuid);
|
|
295
272
|
}
|
|
296
273
|
|
|
297
274
|
await Promise.all(
|
|
298
275
|
Array.from(buckets.entries()).map(async ([bucketKey, uuidMap]) => {
|
|
299
|
-
const asOf = bucketKey === 'latest' ? undefined : findAsOfForBucket(items, (
|
|
276
|
+
const asOf = bucketKey === 'latest' ? undefined : findAsOfForBucket(items, (proto) => proto.getPortfolio(), bucketKey);
|
|
277
|
+
const asOfZdt = asOfToZdt(asOf);
|
|
300
278
|
const fetched = await this.batchFetchPortfolios(Array.from(uuidMap.values()), asOf);
|
|
301
279
|
for (const proto of fetched) {
|
|
302
280
|
const uuidProto = proto.getUuid();
|
|
303
281
|
if (!uuidProto) continue;
|
|
304
282
|
const uuidStr = UUID.fromU8Array(uuidProto.getRawUuid_asU8()).toString();
|
|
305
|
-
|
|
283
|
+
LinkCacheModule.PORTFOLIO.put(uuidStr, proto, asOfZdt);
|
|
306
284
|
}
|
|
307
285
|
}),
|
|
308
286
|
);
|
|
@@ -313,39 +291,40 @@ class LinkResolver {
|
|
|
313
291
|
const uuidProto = port.getUuid();
|
|
314
292
|
if (!uuidProto) continue;
|
|
315
293
|
const uuidStr = UUID.fromU8Array(uuidProto.getRawUuid_asU8()).toString();
|
|
316
|
-
const
|
|
317
|
-
const resolved = this.portfolioCache.get(`${uuidStr}@${bucketKey}`);
|
|
294
|
+
const resolved = LinkCacheModule.PORTFOLIO.get(uuidStr, asOfToZdt(port.getAsOf()));
|
|
318
295
|
if (resolved) item.proto.setPortfolio(resolved);
|
|
319
296
|
}
|
|
320
297
|
|
|
321
298
|
return items;
|
|
322
299
|
}
|
|
323
300
|
|
|
324
|
-
/** Test/debug helper.
|
|
301
|
+
/** Test/debug helper. Clears in-flight maps; the process-wide LinkCache
|
|
302
|
+
* is left alone (tests that need to drop a specific cached entry call
|
|
303
|
+
* `LinkCache.SECURITY.evict(uuid)` directly). */
|
|
325
304
|
clearCache(): void {
|
|
326
|
-
this.securityCache.clear();
|
|
327
|
-
this.portfolioCache.clear();
|
|
328
305
|
this.securityInFlight.clear();
|
|
329
306
|
this.portfolioInFlight.clear();
|
|
307
|
+
this.transactionInFlight.clear();
|
|
330
308
|
}
|
|
331
309
|
|
|
332
310
|
// ---------- internals ----------
|
|
333
311
|
|
|
334
312
|
private async fetchSecurityProto(uuid: UUID, asOf?: LocalTimestampProto): Promise<SecurityProto> {
|
|
335
|
-
const
|
|
336
|
-
|
|
337
|
-
const cached =
|
|
313
|
+
const uuidStr = uuid.toString();
|
|
314
|
+
const asOfZdt = asOfToZdt(asOf);
|
|
315
|
+
const cached = LinkCacheModule.SECURITY.get(uuidStr, asOfZdt);
|
|
338
316
|
if (cached) return cached;
|
|
339
317
|
|
|
318
|
+
const key = `${uuidStr}@${asOfKey(asOf)}`;
|
|
340
319
|
const inFlight = this.securityInFlight.get(key);
|
|
341
320
|
if (inFlight) return inFlight;
|
|
342
321
|
|
|
343
322
|
const promise = this.batchFetchSecurities([uuid], asOf).then((protos) => {
|
|
344
323
|
if (protos.length === 0) {
|
|
345
|
-
throw new Error(`Security not found: ${
|
|
324
|
+
throw new Error(`Security not found: ${key}`);
|
|
346
325
|
}
|
|
347
326
|
const proto = protos[0];
|
|
348
|
-
|
|
327
|
+
LinkCacheModule.SECURITY.put(uuidStr, proto, asOfZdt);
|
|
349
328
|
return proto;
|
|
350
329
|
}).finally(() => {
|
|
351
330
|
this.securityInFlight.delete(key);
|
|
@@ -356,20 +335,21 @@ class LinkResolver {
|
|
|
356
335
|
}
|
|
357
336
|
|
|
358
337
|
private async fetchPortfolioProto(uuid: UUID, asOf?: LocalTimestampProto): Promise<PortfolioProto> {
|
|
359
|
-
const
|
|
360
|
-
|
|
361
|
-
const cached =
|
|
338
|
+
const uuidStr = uuid.toString();
|
|
339
|
+
const asOfZdt = asOfToZdt(asOf);
|
|
340
|
+
const cached = LinkCacheModule.PORTFOLIO.get(uuidStr, asOfZdt);
|
|
362
341
|
if (cached) return cached;
|
|
363
342
|
|
|
343
|
+
const key = `${uuidStr}@${asOfKey(asOf)}`;
|
|
364
344
|
const inFlight = this.portfolioInFlight.get(key);
|
|
365
345
|
if (inFlight) return inFlight;
|
|
366
346
|
|
|
367
347
|
const promise = this.batchFetchPortfolios([uuid], asOf).then((protos) => {
|
|
368
348
|
if (protos.length === 0) {
|
|
369
|
-
throw new Error(`Portfolio not found: ${
|
|
349
|
+
throw new Error(`Portfolio not found: ${key}`);
|
|
370
350
|
}
|
|
371
351
|
const proto = protos[0];
|
|
372
|
-
|
|
352
|
+
LinkCacheModule.PORTFOLIO.put(uuidStr, proto, asOfZdt);
|
|
373
353
|
return proto;
|
|
374
354
|
}).finally(() => {
|
|
375
355
|
this.portfolioInFlight.delete(key);
|
|
@@ -379,6 +359,31 @@ class LinkResolver {
|
|
|
379
359
|
return promise;
|
|
380
360
|
}
|
|
381
361
|
|
|
362
|
+
private async fetchTransactionProto(uuid: UUID, asOf?: LocalTimestampProto): Promise<TransactionProto> {
|
|
363
|
+
const uuidStr = uuid.toString();
|
|
364
|
+
const asOfZdt = asOfToZdt(asOf);
|
|
365
|
+
const cached = LinkCacheModule.TRANSACTION.get(uuidStr, asOfZdt);
|
|
366
|
+
if (cached) return cached;
|
|
367
|
+
|
|
368
|
+
const key = `${uuidStr}@${asOfKey(asOf)}`;
|
|
369
|
+
const inFlight = this.transactionInFlight.get(key);
|
|
370
|
+
if (inFlight) return inFlight;
|
|
371
|
+
|
|
372
|
+
const promise = this.batchFetchTransactions([uuid], asOf).then((protos) => {
|
|
373
|
+
if (protos.length === 0) {
|
|
374
|
+
throw new Error(`Transaction not found: ${key}`);
|
|
375
|
+
}
|
|
376
|
+
const proto = protos[0];
|
|
377
|
+
LinkCacheModule.TRANSACTION.put(uuidStr, proto, asOfZdt);
|
|
378
|
+
return proto;
|
|
379
|
+
}).finally(() => {
|
|
380
|
+
this.transactionInFlight.delete(key);
|
|
381
|
+
});
|
|
382
|
+
|
|
383
|
+
this.transactionInFlight.set(key, promise);
|
|
384
|
+
return promise;
|
|
385
|
+
}
|
|
386
|
+
|
|
382
387
|
private async batchFetchSecurities(uuids: UUID[], asOf?: LocalTimestampProto): Promise<SecurityProto[]> {
|
|
383
388
|
if (uuids.length === 0) return [];
|
|
384
389
|
const request = new QuerySecurityRequestProto();
|
|
@@ -393,6 +398,20 @@ class LinkResolver {
|
|
|
393
398
|
return response.getSecurityResponseList();
|
|
394
399
|
}
|
|
395
400
|
|
|
401
|
+
private async batchFetchTransactions(uuids: UUID[], asOf?: LocalTimestampProto): Promise<TransactionProto[]> {
|
|
402
|
+
if (uuids.length === 0) return [];
|
|
403
|
+
const request = new QueryTransactionRequestProto();
|
|
404
|
+
request.setObjectClass('TransactionRequest');
|
|
405
|
+
request.setVersion('0.0.1');
|
|
406
|
+
const uuidProtos: UUIDProto[] = uuids.map((u) => u.toUUIDProto());
|
|
407
|
+
request.setUuidsList(uuidProtos);
|
|
408
|
+
if (asOf) request.setAsOf(asOf);
|
|
409
|
+
|
|
410
|
+
const getByIdsAsync = promisify(this.transactionClient.getByIds.bind(this.transactionClient));
|
|
411
|
+
const response = (await getByIdsAsync(request)) as QueryTransactionResponseProto;
|
|
412
|
+
return response.getTransactionResponseList();
|
|
413
|
+
}
|
|
414
|
+
|
|
396
415
|
private async batchFetchPortfolios(uuids: UUID[], asOf?: LocalTimestampProto): Promise<PortfolioProto[]> {
|
|
397
416
|
if (uuids.length === 0) return [];
|
|
398
417
|
const request = new QueryPortfolioRequestProto();
|