@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.
- package/dist/ldsAdapterUtils.js +375 -375
- package/dist/{AdapterReport.d.ts → types/AdapterReport.d.ts} +71 -71
- package/dist/{AsyncWorkerPool.d.ts → types/AsyncWorkerPool.d.ts} +18 -18
- package/dist/{LdsAbortController.d.ts → types/LdsAbortController.d.ts} +10 -10
- package/dist/{language.d.ts → types/language.d.ts} +5 -5
- package/dist/{main.d.ts → types/main.d.ts} +4 -4
- package/dist/{runAdapterWithReport.d.ts → types/runAdapterWithReport.d.ts} +3 -3
- package/dist/{utils.d.ts → types/utils.d.ts} +3 -3
- package/package.json +3 -3
package/dist/ldsAdapterUtils.js
CHANGED
|
@@ -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.
|
|
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
|
},
|