Skip to content

Commit 7db60b6

Browse files
Add nextNavPerShare to libre (#4161)
* Add nextNavPerShare to libre * Fix typo * Add new field * Rename * Update packages/sources/nav-libre/src/transport/nav.ts --------- Co-authored-by: mmcallister-cll <139181225+mmcallister-cll@users.noreply.github.com>
1 parent 77ae1fb commit 7db60b6

File tree

6 files changed

+37
-17
lines changed

6 files changed

+37
-17
lines changed

.changeset/dry-jobs-battle.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@chainlink/nav-libre-adapter': minor
3+
---
4+
5+
Report nextNavPerShare

packages/sources/nav-libre/src/endpoint/nav.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ export type BaseEndpointTypes = {
2323
Result: number
2424
Data: {
2525
navPerShare: number
26+
nextNavPerShare: number
2627
navDate: string
28+
navDateTimestampMs: number
2729
globalFundID: number
2830
}
2931
}

packages/sources/nav-libre/src/transport/fund.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@ import { Requester } from '@chainlink/external-adapter-framework/util/requester'
22
import { AdapterError } from '@chainlink/external-adapter-framework/validation/error'
33
import { getRequestHeaders } from './authentication'
44

5+
export const ACCOUNTING_DATE_KEY = 'Accounting Date'
6+
export const NAV_PER_SHARE_KEY = 'NAV Per Share'
7+
export const NEXT_NAV_PRICE_KEY = 'Next NAV Price'
8+
59
interface FundResponse {
610
Data: {
711
'Trading Level Net ROR': {
@@ -18,9 +22,9 @@ interface FundResponse {
1822
YTD: number
1923
ITD: number
2024
}
21-
'NAV Per Share': number
22-
'Next NAV Price': number
23-
'Accounting Date': string
25+
[NAV_PER_SHARE_KEY]: number
26+
[NEXT_NAV_PRICE_KEY]: number
27+
[ACCOUNTING_DATE_KEY]: string
2428
'Ending Balance': number
2529
}[]
2630
}

packages/sources/nav-libre/src/transport/nav.ts

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { BaseEndpointTypes, inputParameters } from '../endpoint/nav'
2-
import { getFund } from './fund'
2+
import { ACCOUNTING_DATE_KEY, getFund, NAV_PER_SHARE_KEY, NEXT_NAV_PRICE_KEY } from './fund'
33
import { getFundDates } from './fund-dates'
44

55
import { EndpointContext } from '@chainlink/external-adapter-framework/adapter'
@@ -31,11 +31,16 @@ export class NavLibreTransport extends SubscriptionTransport<BaseEndpointTypes>
3131
this.config = adapterSettings
3232
}
3333
async backgroundHandler(context: EndpointContext<BaseEndpointTypes>, entries: RequestParams[]) {
34-
await Promise.all(entries.map(async (param) => this.handleRequest(context, param)))
35-
await sleep(context.adapterSettings.BACKGROUND_EXECUTE_MS)
34+
await Promise.all(entries.map(async (param) => this.handleRequest(param)))
35+
// Only sleep more if we have requests, avoids long startup delay for first asset
36+
if (entries.length == 0) {
37+
await sleep(1_000)
38+
} else {
39+
await sleep(context.adapterSettings.BACKGROUND_EXECUTE_MS)
40+
}
3641
}
3742

38-
async handleRequest(_context: EndpointContext<BaseEndpointTypes>, param: RequestParams) {
43+
async handleRequest(param: RequestParams) {
3944
let response: AdapterResponse<BaseEndpointTypes['Response']>
4045
try {
4146
response = await this._handleRequest(param)
@@ -91,8 +96,6 @@ export class NavLibreTransport extends SubscriptionTransport<BaseEndpointTypes>
9196
requester: this.requester,
9297
})
9398

94-
const ACCOUNTING_DATE_KEY = 'Accounting Date'
95-
const NAV_PER_SHARE_KEY = 'NAV Per Share'
9699
// Find the latest NAV entry by Accounting Date
97100
const latest = fund.reduce((latestRow, row) =>
98101
parseDateString(row[ACCOUNTING_DATE_KEY]) > parseDateString(latestRow[ACCOUNTING_DATE_KEY])
@@ -107,7 +110,9 @@ export class NavLibreTransport extends SubscriptionTransport<BaseEndpointTypes>
107110
data: {
108111
globalFundID: param.globalFundID,
109112
navPerShare: latest[NAV_PER_SHARE_KEY],
113+
nextNavPerShare: latest[NEXT_NAV_PRICE_KEY],
110114
navDate: latest[ACCOUNTING_DATE_KEY],
115+
navDateTimestampMs: parseDateString(latest[ACCOUNTING_DATE_KEY]).getTime(),
111116
},
112117
timestamps: {
113118
providerDataRequestedUnixMs,

packages/sources/nav-libre/test/integration/__snapshots__/adapter.test.ts.snap

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ exports[`execute nav endpoint should return success 1`] = `
55
"data": {
66
"globalFundID": 1234,
77
"navDate": "01-01-2024",
8+
"navDateTimestampMs": 1704067200000,
89
"navPerShare": 123.45,
10+
"nextNavPerShare": 124.56,
911
},
1012
"result": 123.45,
1113
"statusCode": 200,

packages/sources/nav-libre/test/unit/nav.test.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ const FUND_DATES_RES = makeStub('fundDatesRes', {
4242
})
4343

4444
const FUND_ROWS = [
45-
{ 'NAV Per Share': 50, 'Accounting Date': '06-10-2025' },
46-
{ 'NAV Per Share': 150, 'Accounting Date': '06-25-2025' },
45+
{ 'NAV Per Share': 50, 'Next NAV Price': 51, 'Accounting Date': '06-10-2025' },
46+
{ 'NAV Per Share': 150, 'Next NAV Price': 151, 'Accounting Date': '06-25-2025' },
4747
]
4848

4949
const FUND_RES = makeStub('fundRes', {
@@ -65,7 +65,7 @@ describe('NavLibreTransport – handleRequest', () => {
6565

6666
const param = makeStub('param', { globalFundID: FUND_ID } as typeof navInputParams.validated)
6767

68-
await transport.handleRequest({ adapterSettings } as any, param)
68+
await transport.handleRequest(param)
6969

7070
expect(responseCache.write).toHaveBeenCalledTimes(1)
7171

@@ -76,7 +76,9 @@ describe('NavLibreTransport – handleRequest', () => {
7676
data: {
7777
globalFundID: FUND_ID,
7878
navPerShare: 150,
79+
nextNavPerShare: 151,
7980
navDate: '06-25-2025',
81+
navDateTimestampMs: 1750809600000,
8082
},
8183
timestamps: expect.objectContaining({
8284
providerDataRequestedUnixMs: expect.any(Number),
@@ -107,7 +109,7 @@ describe('NavLibreTransport – handleRequest', () => {
107109

108110
const param = makeStub('param', { globalFundID: FUND_ID } as typeof navInputParams.validated)
109111

110-
await transport.handleRequest({ adapterSettings } as any, param)
112+
await transport.handleRequest(param)
111113

112114
expect(responseCache.write).toHaveBeenCalledTimes(1)
113115
const cached = getCachedResponse()
@@ -122,15 +124,15 @@ describe('NavLibreTransport – handleRequest', () => {
122124
requester.request.mockResolvedValueOnce(shortSpanDates)
123125

124126
const fundRows = [
125-
{ 'NAV Per Share': 42, 'Accounting Date': '06-30-2025' },
126-
{ 'NAV Per Share': 43, 'Accounting Date': '07-01-2025' },
127+
{ 'NAV Per Share': 42, 'Next NAV Price': 142, 'Accounting Date': '06-30-2025' },
128+
{ 'NAV Per Share': 43, 'Next NAV Price': 143, 'Accounting Date': '07-01-2025' },
127129
]
128130
const fundRes = makeStub('fundRes', { response: { data: { Data: fundRows } } })
129131
requester.request.mockResolvedValueOnce(fundRes)
130132

131133
const param = makeStub('param', { globalFundID: FUND_ID } as typeof navInputParams.validated)
132134

133-
await transport.handleRequest({ adapterSettings } as any, param)
135+
await transport.handleRequest(param)
134136

135137
expect(requester.request).toHaveBeenNthCalledWith(
136138
2,
@@ -148,7 +150,7 @@ describe('NavLibreTransport – handleRequest', () => {
148150
)
149151
const param = makeStub('param', { globalFundID: FUND_ID } as typeof navInputParams.validated)
150152

151-
await transport.handleRequest({ adapterSettings } as any, param)
153+
await transport.handleRequest(param)
152154

153155
const cached = getCachedResponse()
154156
expect(cached.statusCode).toBe(400)

0 commit comments

Comments
 (0)