@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.
Files changed (75) hide show
  1. package/node/wrappers/models/hydrate.test.d.ts +1 -0
  2. package/node/wrappers/models/hydrate.test.js +204 -0
  3. package/node/wrappers/models/hydrate.test.js.map +1 -0
  4. package/node/wrappers/models/hydrate.test.ts +214 -0
  5. package/node/wrappers/models/lazy-hydrate-race.test.d.ts +1 -0
  6. package/node/wrappers/models/lazy-hydrate-race.test.js +153 -0
  7. package/node/wrappers/models/lazy-hydrate-race.test.js.map +1 -0
  8. package/node/wrappers/models/lazy-hydrate-race.test.ts +144 -0
  9. package/node/wrappers/models/lazy-hydrate.bench.test.d.ts +1 -0
  10. package/node/wrappers/models/lazy-hydrate.bench.test.js +121 -0
  11. package/node/wrappers/models/lazy-hydrate.bench.test.js.map +1 -0
  12. package/node/wrappers/models/lazy-hydrate.bench.test.ts +103 -0
  13. package/node/wrappers/models/portfolio/portfolio.d.ts +18 -0
  14. package/node/wrappers/models/portfolio/portfolio.js +93 -1
  15. package/node/wrappers/models/portfolio/portfolio.js.map +1 -1
  16. package/node/wrappers/models/portfolio/portfolio.ts +58 -1
  17. package/node/wrappers/models/portfolio-price-transaction.lazy-hydrate.test.d.ts +1 -0
  18. package/node/wrappers/models/portfolio-price-transaction.lazy-hydrate.test.js +158 -0
  19. package/node/wrappers/models/portfolio-price-transaction.lazy-hydrate.test.js.map +1 -0
  20. package/node/wrappers/models/portfolio-price-transaction.lazy-hydrate.test.ts +153 -0
  21. package/node/wrappers/models/price/Price.d.ts +5 -0
  22. package/node/wrappers/models/price/Price.js +48 -0
  23. package/node/wrappers/models/price/Price.js.map +1 -1
  24. package/node/wrappers/models/price/Price.ts +26 -0
  25. package/node/wrappers/models/security/identifier-validation.test.d.ts +1 -0
  26. package/node/wrappers/models/security/identifier-validation.test.js +104 -0
  27. package/node/wrappers/models/security/identifier-validation.test.js.map +1 -0
  28. package/node/wrappers/models/security/identifier-validation.test.ts +133 -0
  29. package/node/wrappers/models/security/identifier.d.ts +26 -0
  30. package/node/wrappers/models/security/identifier.js +54 -1
  31. package/node/wrappers/models/security/identifier.js.map +1 -1
  32. package/node/wrappers/models/security/identifier.test.js +6 -9
  33. package/node/wrappers/models/security/identifier.test.js.map +1 -1
  34. package/node/wrappers/models/security/identifier.test.ts +6 -9
  35. package/node/wrappers/models/security/identifier.ts +58 -0
  36. package/node/wrappers/models/security/security.d.ts +23 -5
  37. package/node/wrappers/models/security/security.js +53 -6
  38. package/node/wrappers/models/security/security.js.map +1 -1
  39. package/node/wrappers/models/security/security.ts +38 -6
  40. package/node/wrappers/models/transaction/transaction.d.ts +18 -0
  41. package/node/wrappers/models/transaction/transaction.js +98 -0
  42. package/node/wrappers/models/transaction/transaction.js.map +1 -1
  43. package/node/wrappers/models/transaction/transaction.ts +65 -0
  44. package/node/wrappers/services/portfolio-service/PortfolioService.js +35 -0
  45. package/node/wrappers/services/portfolio-service/PortfolioService.js.map +1 -1
  46. package/node/wrappers/services/portfolio-service/PortfolioService.ts +14 -2
  47. package/node/wrappers/services/price-service/PriceService.js +10 -0
  48. package/node/wrappers/services/price-service/PriceService.js.map +1 -1
  49. package/node/wrappers/services/price-service/PriceService.ts +12 -2
  50. package/node/wrappers/services/security-service/SecurityService.js +23 -0
  51. package/node/wrappers/services/security-service/SecurityService.js.map +1 -1
  52. package/node/wrappers/services/security-service/SecurityService.ts +27 -2
  53. package/node/wrappers/services/security.identifier-guard.test.d.ts +1 -0
  54. package/node/wrappers/services/security.identifier-guard.test.js +63 -0
  55. package/node/wrappers/services/security.identifier-guard.test.js.map +1 -0
  56. package/node/wrappers/services/security.identifier-guard.test.ts +70 -0
  57. package/node/wrappers/services/service-client-writethrough.test.d.ts +1 -0
  58. package/node/wrappers/services/service-client-writethrough.test.js +147 -0
  59. package/node/wrappers/services/service-client-writethrough.test.js.map +1 -0
  60. package/node/wrappers/services/service-client-writethrough.test.ts +141 -0
  61. package/node/wrappers/services/transaction-service/TransactionService.js +36 -0
  62. package/node/wrappers/services/transaction-service/TransactionService.js.map +1 -1
  63. package/node/wrappers/services/transaction-service/TransactionService.ts +13 -0
  64. package/node/wrappers/util/link-cache.d.ts +13 -6
  65. package/node/wrappers/util/link-cache.js +51 -15
  66. package/node/wrappers/util/link-cache.js.map +1 -1
  67. package/node/wrappers/util/link-cache.ts +51 -17
  68. package/node/wrappers/util/link-resolver.d.ts +39 -31
  69. package/node/wrappers/util/link-resolver.js +157 -97
  70. package/node/wrappers/util/link-resolver.js.map +1 -1
  71. package/node/wrappers/util/link-resolver.test.js +88 -2
  72. package/node/wrappers/util/link-resolver.test.js.map +1 -1
  73. package/node/wrappers/util/link-resolver.test.ts +76 -2
  74. package/node/wrappers/util/link-resolver.ts +143 -124
  75. 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('caching disabled (cacheSize=0) re-RPCs every call', async () => {
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, mutates each item's proto
32
- * to swap the link sub-message for the resolved full entity (with
33
- * is_link=false on the embedded copy).
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
- * Mutation semantic: when bulk-resolving, the embedded sub-message is
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 cache keys
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
- constructor(opts: LinkResolverOptions = {}) {
156
- const cacheSize = opts.cacheSize ?? 1000;
157
- const ttlMs = opts.ttlMs;
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
- this.securityCache = new TinyLRU(cacheSize, ttlMs);
160
- this.portfolioCache = new TinyLRU(cacheSize, ttlMs);
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 → (cacheKey → UUID) for items not yet cached.
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(cacheKey)) bucket.set(cacheKey, uuid);
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
- // Recover the LocalTimestampProto for this bucket from the first
243
- // item whose serialized as_of matches. We could store it alongside
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
- this.securityCache.set(`${uuidStr}@${bucketKey}`, proto);
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 bucketKey = asOfKey(sec.getAsOf());
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(cacheKey)) bucket.set(cacheKey, uuid);
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, (it) => it.getPortfolio(), bucketKey);
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
- this.portfolioCache.set(`${uuidStr}@${bucketKey}`, proto);
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 bucketKey = asOfKey(port.getAsOf());
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. Not part of the stable API. */
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 key = `${uuid.toString()}@${asOfKey(asOf)}`;
336
-
337
- const cached = this.securityCache.get(key);
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: ${uuid.toString()}@${asOfKey(asOf)}`);
324
+ throw new Error(`Security not found: ${key}`);
346
325
  }
347
326
  const proto = protos[0];
348
- this.securityCache.set(key, proto);
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 key = `${uuid.toString()}@${asOfKey(asOf)}`;
360
-
361
- const cached = this.portfolioCache.get(key);
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: ${uuid.toString()}@${asOfKey(asOf)}`);
349
+ throw new Error(`Portfolio not found: ${key}`);
370
350
  }
371
351
  const proto = protos[0];
372
- this.portfolioCache.set(key, proto);
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();