@salesforce/lds-utils-adapters 1.124.1 → 1.124.3

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.
@@ -8,387 +8,387 @@ import { isDurableEnvironmentEvent } from '@luvio/environments';
8
8
 
9
9
  const { stringify } = JSON;
10
10
 
11
- function isPromise(value) {
12
- // check for Thenable due to test frameworks using custom Promise impls
13
- return value !== null && value !== undefined && typeof value.then === 'function';
14
- }
15
- function isErrorSnapshot(snapshot) {
16
- return snapshot.state === 'Error';
11
+ function isPromise(value) {
12
+ // check for Thenable due to test frameworks using custom Promise impls
13
+ return value !== null && value !== undefined && typeof value.then === 'function';
14
+ }
15
+ function isErrorSnapshot(snapshot) {
16
+ return snapshot.state === 'Error';
17
17
  }
18
18
 
19
- function runAdapterWithReport(adapterName, adapter, adapterConfig, requestContext, onAdapterComplete) {
20
- let adapterStart;
21
- let adapterEnd;
22
- let lookupStart;
23
- let lookupEnd;
24
- let cacheStart;
25
- let cacheEnd;
26
- let networkStart;
27
- let networkEnd;
28
- let staleLookup = false;
29
- let result;
30
- let snapshotState = '';
31
- let error;
32
- let exceptionMessage;
33
- let completedNetworkRequests = [];
34
- let collectedNetworkStartEvents = {};
35
- let reviveStats = [];
36
- let rawEvents = [];
37
- const markEnd = (adapterEndedCallback) => {
38
- if (adapterStart === undefined) {
39
- throw Error('adapter has not been started yet');
40
- }
41
- if (adapterEnd) {
42
- throw Error('adapter has already ended');
43
- }
44
- if (result === undefined) {
45
- throw Error('no result type set');
46
- }
47
- adapterEnd = Date.now();
48
- const executionTime = adapterEnd - adapterStart;
49
- const cacheLookupTime = cacheEnd - cacheStart;
50
- const lookupTime = lookupEnd - lookupStart;
51
- const networkLookupTime = networkEnd - networkStart;
52
- const config = stringify(adapterConfig);
53
- switch (result) {
54
- case 'l1-hit':
55
- if (staleLookup === true) {
56
- adapterEndedCallback({
57
- result: 'l1-hit',
58
- adapterName,
59
- rawEvents,
60
- config,
61
- stale: true,
62
- executionTime,
63
- cacheLookupTime,
64
- lookupTime,
65
- snapshotState,
66
- });
67
- }
68
- else {
69
- adapterEndedCallback({
70
- result: 'l1-hit',
71
- adapterName,
72
- rawEvents,
73
- config,
74
- stale: false,
75
- executionTime,
76
- cacheLookupTime,
77
- lookupTime,
78
- snapshotState,
79
- });
80
- }
81
- break;
82
- case 'l2-hit':
83
- if (staleLookup === true) {
84
- adapterEndedCallback({
85
- result: 'l2-hit',
86
- adapterName,
87
- rawEvents,
88
- config,
89
- stale: true,
90
- executionTime,
91
- cacheLookupTime,
92
- lookupTime,
93
- snapshotState,
94
- revives: reviveStats,
95
- });
96
- }
97
- else {
98
- adapterEndedCallback({
99
- result: 'l2-hit',
100
- adapterName,
101
- rawEvents,
102
- config,
103
- stale: false,
104
- executionTime,
105
- cacheLookupTime,
106
- lookupTime,
107
- snapshotState,
108
- revives: reviveStats,
109
- });
110
- }
111
- break;
112
- case 'cache-miss':
113
- adapterEndedCallback({
114
- result: 'cache-miss',
115
- adapterName,
116
- rawEvents,
117
- config,
118
- executionTime,
119
- cacheLookupTime,
120
- lookupTime,
121
- networkLookupTime,
122
- completedNetworkRequests,
123
- snapshotState,
124
- revives: reviveStats,
125
- });
126
- break;
127
- case 'invalid-config':
128
- adapterEndedCallback({
129
- result: 'invalid-config',
130
- rawEvents,
131
- config,
132
- adapterName,
133
- executionTime,
134
- });
135
- break;
136
- case 'error':
137
- adapterEndedCallback({
138
- result: 'error',
139
- rawEvents,
140
- config,
141
- error,
142
- adapterName,
143
- executionTime,
144
- cacheLookupTime,
145
- lookupTime,
146
- networkLookupTime,
147
- snapshotState,
148
- });
149
- break;
150
- case 'exception':
151
- adapterEndedCallback({
152
- result: 'exception',
153
- rawEvents,
154
- config,
155
- exceptionMessage,
156
- adapterName,
157
- executionTime,
158
- });
159
- break;
160
- }
161
- };
162
- const markException = (error) => {
163
- let message = 'Unknown Error';
164
- if (error instanceof Error)
165
- message = error.message;
166
- exceptionMessage = message;
167
- result = 'exception';
168
- };
169
- const metricsEventObserver = {
170
- onAdapterEvent: (ev) => {
171
- rawEvents.push(ev);
172
- switch (ev.type) {
173
- case 'adapter-lookup-start':
174
- lookupStart = Date.now();
175
- break;
176
- case 'adapter-lookup-end':
177
- lookupEnd = Date.now();
178
- break;
179
- case 'cache-lookup-start':
180
- cacheStart = Date.now();
181
- break;
182
- case 'cache-lookup-end':
183
- cacheEnd = Date.now();
184
- if (ev.wasResultAsync === false) {
185
- // L1 cache hit
186
- result = 'l1-hit';
187
- }
188
- else {
189
- // L2 cache hit
190
- result = 'l2-hit';
191
- }
192
- if (ev.snapshotState === 'Stale') {
193
- staleLookup = true;
194
- }
195
- break;
196
- case 'network-lookup-start':
197
- // if the lookup is stale, the network lookup is
198
- // caused by an async refresh
199
- if (staleLookup === false) {
200
- result = 'cache-miss';
201
- networkStart = Date.now();
202
- }
203
- break;
204
- case 'network-lookup-end':
205
- if (staleLookup === false) {
206
- networkEnd = Date.now();
207
- }
208
- break;
209
- case 'network-request-start':
210
- collectedNetworkStartEvents[ev.uuid] = ev;
211
- break;
212
- case 'network-request-end': {
213
- const startEvent = collectedNetworkStartEvents[ev.uuid];
214
- if (startEvent === undefined || startEvent.type !== 'network-request-start') {
215
- if (process.env.NODE_ENV !== 'production') {
216
- throw Error('no matching network start event emmited');
217
- }
218
- return;
219
- }
220
- completedNetworkRequests.push({
221
- request: startEvent.request,
222
- response: ev.response,
223
- duration: ev.timestamp - startEvent.timestamp,
224
- });
225
- break;
226
- }
227
- }
228
- },
229
- onEnvironmentEvent: (ev) => {
230
- rawEvents.push(ev);
231
- if (isDurableEnvironmentEvent(ev)) {
232
- if (ev.data.type === 'l2-revive-end') {
233
- let missingKeys;
234
- const snapshot = ev.data.snapshot;
235
- if (snapshot.state === 'Unfulfilled') {
236
- missingKeys = snapshot.missingLinks.keysAsArray();
237
- if (snapshot.missingLinks.size() === 0) {
238
- missingKeys.push(snapshot.recordId);
239
- }
240
- }
241
- reviveStats.push({
242
- resultState: ev.data.snapshot.state,
243
- missingKeys,
244
- l2Trips: ev.data.l2Trips,
245
- duration: ev.data.duration,
246
- });
247
- }
248
- }
249
- },
250
- onCustomAdapterEvent: (ev) => {
251
- rawEvents.push(ev);
252
- },
253
- };
254
- const bindObserverToAdapterRequestContext = (requestContext) => {
255
- let requestContextWithInstrumentationObserver = requestContext;
256
- if (requestContextWithInstrumentationObserver === undefined) {
257
- requestContextWithInstrumentationObserver = { eventObservers: [] };
258
- }
259
- if (requestContextWithInstrumentationObserver.eventObservers === undefined) {
260
- requestContextWithInstrumentationObserver.eventObservers = [];
261
- }
262
- requestContextWithInstrumentationObserver.eventObservers.push(metricsEventObserver);
263
- };
264
- adapterStart = Date.now();
265
- try {
266
- bindObserverToAdapterRequestContext(requestContext);
267
- const adapterResult = adapter(adapterConfig, requestContext);
268
- if (isPromise(adapterResult)) {
269
- adapterResult
270
- .then((snapshot) => {
271
- snapshotState = snapshot.state;
272
- if (isErrorSnapshot(snapshot)) {
273
- result = 'error';
274
- error = stringify(snapshot.error);
275
- }
276
- markEnd(onAdapterComplete);
277
- })
278
- .catch((e) => {
279
- // async error
280
- markException(e);
281
- markEnd(onAdapterComplete);
282
- });
283
- }
284
- else {
285
- if (adapterResult === null) {
286
- // invalid config
287
- result = 'invalid-config';
288
- }
289
- else if (isErrorSnapshot(adapterResult)) {
290
- snapshotState = 'Error';
291
- result = 'error';
292
- error = stringify(adapterResult.error);
293
- }
294
- markEnd(onAdapterComplete);
295
- }
296
- return adapterResult;
297
- }
298
- catch (error) {
299
- // synchronous error (lookup exception)
300
- markException(error);
301
- markEnd(onAdapterComplete);
302
- throw error;
303
- }
19
+ function runAdapterWithReport(adapterName, adapter, adapterConfig, requestContext, onAdapterComplete) {
20
+ let adapterStart;
21
+ let adapterEnd;
22
+ let lookupStart;
23
+ let lookupEnd;
24
+ let cacheStart;
25
+ let cacheEnd;
26
+ let networkStart;
27
+ let networkEnd;
28
+ let staleLookup = false;
29
+ let result;
30
+ let snapshotState = '';
31
+ let error;
32
+ let exceptionMessage;
33
+ let completedNetworkRequests = [];
34
+ let collectedNetworkStartEvents = {};
35
+ let reviveStats = [];
36
+ let rawEvents = [];
37
+ const markEnd = (adapterEndedCallback) => {
38
+ if (adapterStart === undefined) {
39
+ throw Error('adapter has not been started yet');
40
+ }
41
+ if (adapterEnd) {
42
+ throw Error('adapter has already ended');
43
+ }
44
+ if (result === undefined) {
45
+ throw Error('no result type set');
46
+ }
47
+ adapterEnd = Date.now();
48
+ const executionTime = adapterEnd - adapterStart;
49
+ const cacheLookupTime = cacheEnd - cacheStart;
50
+ const lookupTime = lookupEnd - lookupStart;
51
+ const networkLookupTime = networkEnd - networkStart;
52
+ const config = stringify(adapterConfig);
53
+ switch (result) {
54
+ case 'l1-hit':
55
+ if (staleLookup === true) {
56
+ adapterEndedCallback({
57
+ result: 'l1-hit',
58
+ adapterName,
59
+ rawEvents,
60
+ config,
61
+ stale: true,
62
+ executionTime,
63
+ cacheLookupTime,
64
+ lookupTime,
65
+ snapshotState,
66
+ });
67
+ }
68
+ else {
69
+ adapterEndedCallback({
70
+ result: 'l1-hit',
71
+ adapterName,
72
+ rawEvents,
73
+ config,
74
+ stale: false,
75
+ executionTime,
76
+ cacheLookupTime,
77
+ lookupTime,
78
+ snapshotState,
79
+ });
80
+ }
81
+ break;
82
+ case 'l2-hit':
83
+ if (staleLookup === true) {
84
+ adapterEndedCallback({
85
+ result: 'l2-hit',
86
+ adapterName,
87
+ rawEvents,
88
+ config,
89
+ stale: true,
90
+ executionTime,
91
+ cacheLookupTime,
92
+ lookupTime,
93
+ snapshotState,
94
+ revives: reviveStats,
95
+ });
96
+ }
97
+ else {
98
+ adapterEndedCallback({
99
+ result: 'l2-hit',
100
+ adapterName,
101
+ rawEvents,
102
+ config,
103
+ stale: false,
104
+ executionTime,
105
+ cacheLookupTime,
106
+ lookupTime,
107
+ snapshotState,
108
+ revives: reviveStats,
109
+ });
110
+ }
111
+ break;
112
+ case 'cache-miss':
113
+ adapterEndedCallback({
114
+ result: 'cache-miss',
115
+ adapterName,
116
+ rawEvents,
117
+ config,
118
+ executionTime,
119
+ cacheLookupTime,
120
+ lookupTime,
121
+ networkLookupTime,
122
+ completedNetworkRequests,
123
+ snapshotState,
124
+ revives: reviveStats,
125
+ });
126
+ break;
127
+ case 'invalid-config':
128
+ adapterEndedCallback({
129
+ result: 'invalid-config',
130
+ rawEvents,
131
+ config,
132
+ adapterName,
133
+ executionTime,
134
+ });
135
+ break;
136
+ case 'error':
137
+ adapterEndedCallback({
138
+ result: 'error',
139
+ rawEvents,
140
+ config,
141
+ error,
142
+ adapterName,
143
+ executionTime,
144
+ cacheLookupTime,
145
+ lookupTime,
146
+ networkLookupTime,
147
+ snapshotState,
148
+ });
149
+ break;
150
+ case 'exception':
151
+ adapterEndedCallback({
152
+ result: 'exception',
153
+ rawEvents,
154
+ config,
155
+ exceptionMessage,
156
+ adapterName,
157
+ executionTime,
158
+ });
159
+ break;
160
+ }
161
+ };
162
+ const markException = (error) => {
163
+ let message = 'Unknown Error';
164
+ if (error instanceof Error)
165
+ message = error.message;
166
+ exceptionMessage = message;
167
+ result = 'exception';
168
+ };
169
+ const metricsEventObserver = {
170
+ onAdapterEvent: (ev) => {
171
+ rawEvents.push(ev);
172
+ switch (ev.type) {
173
+ case 'adapter-lookup-start':
174
+ lookupStart = Date.now();
175
+ break;
176
+ case 'adapter-lookup-end':
177
+ lookupEnd = Date.now();
178
+ break;
179
+ case 'cache-lookup-start':
180
+ cacheStart = Date.now();
181
+ break;
182
+ case 'cache-lookup-end':
183
+ cacheEnd = Date.now();
184
+ if (ev.wasResultAsync === false) {
185
+ // L1 cache hit
186
+ result = 'l1-hit';
187
+ }
188
+ else {
189
+ // L2 cache hit
190
+ result = 'l2-hit';
191
+ }
192
+ if (ev.snapshotState === 'Stale') {
193
+ staleLookup = true;
194
+ }
195
+ break;
196
+ case 'network-lookup-start':
197
+ // if the lookup is stale, the network lookup is
198
+ // caused by an async refresh
199
+ if (staleLookup === false) {
200
+ result = 'cache-miss';
201
+ networkStart = Date.now();
202
+ }
203
+ break;
204
+ case 'network-lookup-end':
205
+ if (staleLookup === false) {
206
+ networkEnd = Date.now();
207
+ }
208
+ break;
209
+ case 'network-request-start':
210
+ collectedNetworkStartEvents[ev.uuid] = ev;
211
+ break;
212
+ case 'network-request-end': {
213
+ const startEvent = collectedNetworkStartEvents[ev.uuid];
214
+ if (startEvent === undefined || startEvent.type !== 'network-request-start') {
215
+ if (process.env.NODE_ENV !== 'production') {
216
+ throw Error('no matching network start event emmited');
217
+ }
218
+ return;
219
+ }
220
+ completedNetworkRequests.push({
221
+ request: startEvent.request,
222
+ response: ev.response,
223
+ duration: ev.timestamp - startEvent.timestamp,
224
+ });
225
+ break;
226
+ }
227
+ }
228
+ },
229
+ onEnvironmentEvent: (ev) => {
230
+ rawEvents.push(ev);
231
+ if (isDurableEnvironmentEvent(ev)) {
232
+ if (ev.data.type === 'l2-revive-end') {
233
+ let missingKeys;
234
+ const snapshot = ev.data.snapshot;
235
+ if (snapshot.state === 'Unfulfilled') {
236
+ missingKeys = snapshot.missingLinks.keysAsArray();
237
+ if (snapshot.missingLinks.size() === 0) {
238
+ missingKeys.push(snapshot.recordId);
239
+ }
240
+ }
241
+ reviveStats.push({
242
+ resultState: ev.data.snapshot.state,
243
+ missingKeys,
244
+ l2Trips: ev.data.l2Trips,
245
+ duration: ev.data.duration,
246
+ });
247
+ }
248
+ }
249
+ },
250
+ onCustomAdapterEvent: (ev) => {
251
+ rawEvents.push(ev);
252
+ },
253
+ };
254
+ const bindObserverToAdapterRequestContext = (requestContext) => {
255
+ let requestContextWithInstrumentationObserver = requestContext;
256
+ if (requestContextWithInstrumentationObserver === undefined) {
257
+ requestContextWithInstrumentationObserver = { eventObservers: [] };
258
+ }
259
+ if (requestContextWithInstrumentationObserver.eventObservers === undefined) {
260
+ requestContextWithInstrumentationObserver.eventObservers = [];
261
+ }
262
+ requestContextWithInstrumentationObserver.eventObservers.push(metricsEventObserver);
263
+ };
264
+ adapterStart = Date.now();
265
+ try {
266
+ bindObserverToAdapterRequestContext(requestContext);
267
+ const adapterResult = adapter(adapterConfig, requestContext);
268
+ if (isPromise(adapterResult)) {
269
+ adapterResult
270
+ .then((snapshot) => {
271
+ snapshotState = snapshot.state;
272
+ if (isErrorSnapshot(snapshot)) {
273
+ result = 'error';
274
+ error = stringify(snapshot.error);
275
+ }
276
+ markEnd(onAdapterComplete);
277
+ })
278
+ .catch((e) => {
279
+ // async error
280
+ markException(e);
281
+ markEnd(onAdapterComplete);
282
+ });
283
+ }
284
+ else {
285
+ if (adapterResult === null) {
286
+ // invalid config
287
+ result = 'invalid-config';
288
+ }
289
+ else if (isErrorSnapshot(adapterResult)) {
290
+ snapshotState = 'Error';
291
+ result = 'error';
292
+ error = stringify(adapterResult.error);
293
+ }
294
+ markEnd(onAdapterComplete);
295
+ }
296
+ return adapterResult;
297
+ }
298
+ catch (error) {
299
+ // synchronous error (lookup exception)
300
+ markException(error);
301
+ markEnd(onAdapterComplete);
302
+ throw error;
303
+ }
304
304
  }
305
305
 
306
- /* Ideally we would use AbortController but it does not exist in V8, this is a simplified version */
307
- class LdsAbortController {
308
- constructor() {
309
- this._aborted = false;
310
- this.listeners = new Set();
311
- }
312
- get aborted() {
313
- return this._aborted;
314
- }
315
- addEventListener(listener) {
316
- this.listeners.add(listener);
317
- }
318
- removeEventListener(listener) {
319
- this.listeners.delete(listener);
320
- }
321
- abort() {
322
- if (!this.aborted) {
323
- this._aborted = true;
324
- for (const listener of this.listeners) {
325
- listener();
326
- }
327
- }
328
- }
306
+ /* Ideally we would use AbortController but it does not exist in V8, this is a simplified version */
307
+ class LdsAbortController {
308
+ constructor() {
309
+ this._aborted = false;
310
+ this.listeners = new Set();
311
+ }
312
+ get aborted() {
313
+ return this._aborted;
314
+ }
315
+ addEventListener(listener) {
316
+ this.listeners.add(listener);
317
+ }
318
+ removeEventListener(listener) {
319
+ this.listeners.delete(listener);
320
+ }
321
+ abort() {
322
+ if (!this.aborted) {
323
+ this._aborted = true;
324
+ for (const listener of this.listeners) {
325
+ listener();
326
+ }
327
+ }
328
+ }
329
329
  }
330
330
 
331
- class AsyncWorkerPool {
332
- constructor(concurrency) {
333
- this.queue = [];
334
- this.activeWork = [];
335
- this.concurrency = concurrency;
336
- }
337
- push(work) {
338
- return new Promise((resolve, reject) => {
339
- this.queue.push({
340
- ...work,
341
- workFn: (abortController) => work.workFn(abortController).then(resolve).catch(reject),
342
- });
343
- this.doWork();
344
- });
345
- }
346
- /**
347
- * cancel all work in the queue and active work
348
- * @returns true if all work was cancelled, false if any work could not be cancelled
349
- */
350
- cancel() {
351
- let success = true;
352
- for (const { cancelFn } of this.queue) {
353
- if (cancelFn) {
354
- try {
355
- cancelFn();
356
- }
357
- catch (_a) {
358
- success = false;
359
- }
360
- }
361
- }
362
- this.queue = [];
363
- for (const { abortController, cancelFn } of this.activeWork) {
364
- abortController.abort();
365
- if (cancelFn) {
366
- try {
367
- cancelFn();
368
- }
369
- catch (_b) {
370
- success = false;
371
- }
372
- }
373
- }
374
- this.activeWork = [];
375
- return success;
376
- }
377
- doWork() {
378
- while (this.queue.length > 0 && this.activeWork.length < this.concurrency) {
379
- const work = this.queue.shift();
380
- if (work) {
381
- const abortController = new LdsAbortController();
382
- const newWork = { ...work, abortController };
383
- this.activeWork.push(newWork);
384
- const { workFn } = work;
385
- workFn(abortController).finally(() => {
386
- this.activeWork = this.activeWork.filter((w) => w !== newWork);
387
- this.doWork();
388
- });
389
- }
390
- }
391
- }
331
+ class AsyncWorkerPool {
332
+ constructor(concurrency) {
333
+ this.queue = [];
334
+ this.activeWork = [];
335
+ this.concurrency = concurrency;
336
+ }
337
+ push(work) {
338
+ return new Promise((resolve, reject) => {
339
+ this.queue.push({
340
+ ...work,
341
+ workFn: (abortController) => work.workFn(abortController).then(resolve).catch(reject),
342
+ });
343
+ this.doWork();
344
+ });
345
+ }
346
+ /**
347
+ * cancel all work in the queue and active work
348
+ * @returns true if all work was cancelled, false if any work could not be cancelled
349
+ */
350
+ cancel() {
351
+ let success = true;
352
+ for (const { cancelFn } of this.queue) {
353
+ if (cancelFn) {
354
+ try {
355
+ cancelFn();
356
+ }
357
+ catch (_a) {
358
+ success = false;
359
+ }
360
+ }
361
+ }
362
+ this.queue = [];
363
+ for (const { abortController, cancelFn } of this.activeWork) {
364
+ abortController.abort();
365
+ if (cancelFn) {
366
+ try {
367
+ cancelFn();
368
+ }
369
+ catch (_b) {
370
+ success = false;
371
+ }
372
+ }
373
+ }
374
+ this.activeWork = [];
375
+ return success;
376
+ }
377
+ doWork() {
378
+ while (this.queue.length > 0 && this.activeWork.length < this.concurrency) {
379
+ const work = this.queue.shift();
380
+ if (work) {
381
+ const abortController = new LdsAbortController();
382
+ const newWork = { ...work, abortController };
383
+ this.activeWork.push(newWork);
384
+ const { workFn } = work;
385
+ workFn(abortController).finally(() => {
386
+ this.activeWork = this.activeWork.filter((w) => w !== newWork);
387
+ this.doWork();
388
+ });
389
+ }
390
+ }
391
+ }
392
392
  }
393
393
 
394
394
  export { AsyncWorkerPool, LdsAbortController, runAdapterWithReport };
@@ -1,71 +1,71 @@
1
- import type { LuvioAdapterEvent, NormalizedKeyMetadata, ResourceRequest } from '@luvio/engine';
2
- export type AdapterResultType = 'invalid-config' | 'l1-hit' | 'l2-hit' | 'cache-miss' | 'error' | 'exception';
3
- export type AdapterReport = L1CacheHitFresh | L1CacheHitStale | L2CacheHitFresh | L2CacheHitStale | CacheMiss | InvalidConfig | Error | Exception;
4
- interface ReportBase {
5
- adapterName: string;
6
- config: string;
7
- executionTime: number;
8
- snapshotState: string;
9
- rawEvents: LuvioAdapterEvent[];
10
- }
11
- export interface CompletedNetworkRequest {
12
- request: ResourceRequest;
13
- response: unknown;
14
- duration: number;
15
- }
16
- interface SuccessBase extends ReportBase {
17
- lookupTime: number;
18
- cacheLookupTime: number;
19
- }
20
- interface StaleBase {
21
- stale: true;
22
- }
23
- export interface ReviveStats {
24
- duration: number;
25
- l2Trips: {
26
- duration: number;
27
- keysRequestedCount: number;
28
- }[];
29
- missingKeys: (string | NormalizedKeyMetadata)[] | undefined;
30
- resultState: string;
31
- }
32
- interface L1CacheHitFresh extends SuccessBase {
33
- result: 'l1-hit';
34
- stale: false;
35
- }
36
- interface L1CacheHitStale extends SuccessBase, StaleBase {
37
- result: 'l1-hit';
38
- }
39
- interface L2CacheHit extends SuccessBase {
40
- result: 'l2-hit';
41
- lookupTime: number;
42
- revives: ReviveStats[];
43
- }
44
- interface L2CacheHitFresh extends L2CacheHit {
45
- stale: false;
46
- revives: ReviveStats[];
47
- }
48
- interface L2CacheHitStale extends L2CacheHit, StaleBase {
49
- }
50
- interface CacheMiss extends SuccessBase {
51
- result: 'cache-miss';
52
- lookupTime: number;
53
- networkLookupTime: number;
54
- completedNetworkRequests: CompletedNetworkRequest[];
55
- revives: ReviveStats[];
56
- }
57
- interface Error extends ReportBase {
58
- result: 'error';
59
- error: unknown;
60
- lookupTime: number;
61
- cacheLookupTime?: number;
62
- networkLookupTime?: number;
63
- }
64
- interface Exception extends Omit<ReportBase, 'snapshotState'> {
65
- result: 'exception';
66
- exceptionMessage: string;
67
- }
68
- interface InvalidConfig extends Omit<ReportBase, 'snapshotState'> {
69
- result: 'invalid-config';
70
- }
71
- export {};
1
+ import type { LuvioAdapterEvent, NormalizedKeyMetadata, ResourceRequest } from '@luvio/engine';
2
+ export type AdapterResultType = 'invalid-config' | 'l1-hit' | 'l2-hit' | 'cache-miss' | 'error' | 'exception';
3
+ export type AdapterReport = L1CacheHitFresh | L1CacheHitStale | L2CacheHitFresh | L2CacheHitStale | CacheMiss | InvalidConfig | Error | Exception;
4
+ interface ReportBase {
5
+ adapterName: string;
6
+ config: string;
7
+ executionTime: number;
8
+ snapshotState: string;
9
+ rawEvents: LuvioAdapterEvent[];
10
+ }
11
+ export interface CompletedNetworkRequest {
12
+ request: ResourceRequest;
13
+ response: unknown;
14
+ duration: number;
15
+ }
16
+ interface SuccessBase extends ReportBase {
17
+ lookupTime: number;
18
+ cacheLookupTime: number;
19
+ }
20
+ interface StaleBase {
21
+ stale: true;
22
+ }
23
+ export interface ReviveStats {
24
+ duration: number;
25
+ l2Trips: {
26
+ duration: number;
27
+ keysRequestedCount: number;
28
+ }[];
29
+ missingKeys: (string | NormalizedKeyMetadata)[] | undefined;
30
+ resultState: string;
31
+ }
32
+ interface L1CacheHitFresh extends SuccessBase {
33
+ result: 'l1-hit';
34
+ stale: false;
35
+ }
36
+ interface L1CacheHitStale extends SuccessBase, StaleBase {
37
+ result: 'l1-hit';
38
+ }
39
+ interface L2CacheHit extends SuccessBase {
40
+ result: 'l2-hit';
41
+ lookupTime: number;
42
+ revives: ReviveStats[];
43
+ }
44
+ interface L2CacheHitFresh extends L2CacheHit {
45
+ stale: false;
46
+ revives: ReviveStats[];
47
+ }
48
+ interface L2CacheHitStale extends L2CacheHit, StaleBase {
49
+ }
50
+ interface CacheMiss extends SuccessBase {
51
+ result: 'cache-miss';
52
+ lookupTime: number;
53
+ networkLookupTime: number;
54
+ completedNetworkRequests: CompletedNetworkRequest[];
55
+ revives: ReviveStats[];
56
+ }
57
+ interface Error extends ReportBase {
58
+ result: 'error';
59
+ error: unknown;
60
+ lookupTime: number;
61
+ cacheLookupTime?: number;
62
+ networkLookupTime?: number;
63
+ }
64
+ interface Exception extends Omit<ReportBase, 'snapshotState'> {
65
+ result: 'exception';
66
+ exceptionMessage: string;
67
+ }
68
+ interface InvalidConfig extends Omit<ReportBase, 'snapshotState'> {
69
+ result: 'invalid-config';
70
+ }
71
+ export {};
@@ -1,18 +1,18 @@
1
- import { LdsAbortController } from './LdsAbortController';
2
- export interface Work<T> {
3
- workFn: (abortController: LdsAbortController) => Promise<T>;
4
- cancelFn?: () => void;
5
- }
6
- export declare class AsyncWorkerPool {
7
- private concurrency;
8
- private queue;
9
- private activeWork;
10
- constructor(concurrency: number);
11
- push<T>(work: Work<T>): Promise<T>;
12
- /**
13
- * cancel all work in the queue and active work
14
- * @returns true if all work was cancelled, false if any work could not be cancelled
15
- */
16
- cancel(): boolean;
17
- private doWork;
18
- }
1
+ import { LdsAbortController } from './LdsAbortController';
2
+ export interface Work<T> {
3
+ workFn: (abortController: LdsAbortController) => Promise<T>;
4
+ cancelFn?: () => void;
5
+ }
6
+ export declare class AsyncWorkerPool {
7
+ private concurrency;
8
+ private queue;
9
+ private activeWork;
10
+ constructor(concurrency: number);
11
+ push<T>(work: Work<T>): Promise<T>;
12
+ /**
13
+ * cancel all work in the queue and active work
14
+ * @returns true if all work was cancelled, false if any work could not be cancelled
15
+ */
16
+ cancel(): boolean;
17
+ private doWork;
18
+ }
@@ -1,10 +1,10 @@
1
- type EventListener = () => void;
2
- export declare class LdsAbortController {
3
- private _aborted;
4
- get aborted(): boolean;
5
- private listeners;
6
- addEventListener(listener: EventListener): void;
7
- removeEventListener(listener: EventListener): void;
8
- abort(): void;
9
- }
10
- export {};
1
+ type EventListener = () => void;
2
+ export declare class LdsAbortController {
3
+ private _aborted;
4
+ get aborted(): boolean;
5
+ private listeners;
6
+ addEventListener(listener: EventListener): void;
7
+ removeEventListener(listener: EventListener): void;
8
+ abort(): void;
9
+ }
10
+ export {};
@@ -1,5 +1,5 @@
1
- declare const stringify: {
2
- (value: any, replacer?: ((this: any, key: string, value: any) => any) | undefined, space?: string | number | undefined): string;
3
- (value: any, replacer?: (string | number)[] | null | undefined, space?: string | number | undefined): string;
4
- };
5
- export { stringify as JSONStringify, };
1
+ declare const stringify: {
2
+ (value: any, replacer?: ((this: any, key: string, value: any) => any) | undefined, space?: string | number | undefined): string;
3
+ (value: any, replacer?: (string | number)[] | null | undefined, space?: string | number | undefined): string;
4
+ };
5
+ export { stringify as JSONStringify, };
@@ -1,4 +1,4 @@
1
- export { runAdapterWithReport } from './runAdapterWithReport';
2
- export { AdapterReport } from './AdapterReport';
3
- export { AsyncWorkerPool } from './AsyncWorkerPool';
4
- export { LdsAbortController } from './LdsAbortController';
1
+ export { runAdapterWithReport } from './runAdapterWithReport';
2
+ export { AdapterReport } from './AdapterReport';
3
+ export { AsyncWorkerPool } from './AsyncWorkerPool';
4
+ export { LdsAbortController } from './LdsAbortController';
@@ -1,3 +1,3 @@
1
- import type { Adapter, AdapterRequestContext } from '@luvio/engine';
2
- import type { AdapterReport } from './AdapterReport';
3
- export declare function runAdapterWithReport<C, D>(adapterName: string, adapter: Adapter<C, D>, adapterConfig: C, requestContext: AdapterRequestContext, onAdapterComplete: (report: AdapterReport) => void): import("@luvio/engine").ErrorSnapshot | import("@luvio/engine").DataSnapshot<D, unknown> | Promise<import("@luvio/engine").ErrorSnapshot | import("@luvio/engine").FulfilledSnapshot<D, unknown> | import("@luvio/engine").UnfulfilledSnapshot<D, unknown> | import("@luvio/engine").StaleSnapshot<D, unknown> | import("@luvio/engine").PendingSnapshot<D, unknown>> | null;
1
+ import type { Adapter, AdapterRequestContext } from '@luvio/engine';
2
+ import type { AdapterReport } from './AdapterReport';
3
+ export declare function runAdapterWithReport<C, D>(adapterName: string, adapter: Adapter<C, D>, adapterConfig: C, requestContext: AdapterRequestContext, onAdapterComplete: (report: AdapterReport) => void): import("@luvio/engine").ErrorSnapshot | import("@luvio/engine").DataSnapshot<D, unknown> | Promise<import("@luvio/engine").ErrorSnapshot | import("@luvio/engine").FulfilledSnapshot<D, unknown> | import("@luvio/engine").UnfulfilledSnapshot<D, unknown> | import("@luvio/engine").StaleSnapshot<D, unknown> | import("@luvio/engine").PendingSnapshot<D, unknown>> | null;
@@ -1,3 +1,3 @@
1
- import type { Snapshot, ErrorSnapshot } from '@luvio/engine';
2
- export declare function isPromise<D>(value: D | Promise<D> | null): value is Promise<D>;
3
- export declare function isErrorSnapshot(snapshot: Snapshot<any>): snapshot is ErrorSnapshot;
1
+ import type { Snapshot, ErrorSnapshot } from '@luvio/engine';
2
+ export declare function isPromise<D>(value: D | Promise<D> | null): value is Promise<D>;
3
+ export declare function isErrorSnapshot(snapshot: Snapshot<any>): snapshot is ErrorSnapshot;
package/package.json CHANGED
@@ -1,18 +1,18 @@
1
1
  {
2
2
  "name": "@salesforce/lds-utils-adapters",
3
- "version": "1.124.1",
3
+ "version": "1.124.3",
4
4
  "license": "SEE LICENSE IN LICENSE.txt",
5
5
  "description": "LDS Adapter Utilities",
6
6
  "main": "dist/ldsAdapterUtils.js",
7
7
  "module": "dist/ldsAdapterUtils.js",
8
- "types": "dist/main.d.ts",
8
+ "types": "dist/types/main.d.ts",
9
9
  "files": [
10
10
  "dist"
11
11
  ],
12
12
  "exports": {
13
13
  ".": {
14
14
  "import": "./dist/ldsAdapterUtils.js",
15
- "types": "./dist/main.d.ts",
15
+ "types": "./dist/types/main.d.ts",
16
16
  "default": "./dist/ldsAdapterUtils.js"
17
17
  }
18
18
  },