@luvio/environments 0.72.0 → 0.73.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.
Files changed (28) hide show
  1. package/dist/es/es2018/environments.js +62 -388
  2. package/dist/umd/es2018/environments.js +61 -387
  3. package/dist/umd/es5/environments.js +61 -398
  4. package/package.json +2 -2
  5. package/dist/es/es2018/makeDurable/cachepolicies/cache-and-network.d.ts +0 -3
  6. package/dist/es/es2018/makeDurable/cachepolicies/cache-then-network.d.ts +0 -3
  7. package/dist/es/es2018/makeDurable/cachepolicies/index.d.ts +0 -6
  8. package/dist/es/es2018/makeDurable/cachepolicies/no-cache.d.ts +0 -3
  9. package/dist/es/es2018/makeDurable/cachepolicies/only-if-cached.d.ts +0 -3
  10. package/dist/es/es2018/makeDurable/cachepolicies/stale-while-revalidate.d.ts +0 -3
  11. package/dist/es/es2018/makeDurable/cachepolicies/utils.d.ts +0 -9
  12. package/dist/es/es2018/makeDurable/cachepolicies/valid-at.d.ts +0 -3
  13. package/dist/umd/es2018/makeDurable/cachepolicies/cache-and-network.d.ts +0 -3
  14. package/dist/umd/es2018/makeDurable/cachepolicies/cache-then-network.d.ts +0 -3
  15. package/dist/umd/es2018/makeDurable/cachepolicies/index.d.ts +0 -6
  16. package/dist/umd/es2018/makeDurable/cachepolicies/no-cache.d.ts +0 -3
  17. package/dist/umd/es2018/makeDurable/cachepolicies/only-if-cached.d.ts +0 -3
  18. package/dist/umd/es2018/makeDurable/cachepolicies/stale-while-revalidate.d.ts +0 -3
  19. package/dist/umd/es2018/makeDurable/cachepolicies/utils.d.ts +0 -9
  20. package/dist/umd/es2018/makeDurable/cachepolicies/valid-at.d.ts +0 -3
  21. package/dist/umd/es5/makeDurable/cachepolicies/cache-and-network.d.ts +0 -3
  22. package/dist/umd/es5/makeDurable/cachepolicies/cache-then-network.d.ts +0 -3
  23. package/dist/umd/es5/makeDurable/cachepolicies/index.d.ts +0 -6
  24. package/dist/umd/es5/makeDurable/cachepolicies/no-cache.d.ts +0 -3
  25. package/dist/umd/es5/makeDurable/cachepolicies/only-if-cached.d.ts +0 -3
  26. package/dist/umd/es5/makeDurable/cachepolicies/stale-while-revalidate.d.ts +0 -3
  27. package/dist/umd/es5/makeDurable/cachepolicies/utils.d.ts +0 -9
  28. package/dist/umd/es5/makeDurable/cachepolicies/valid-at.d.ts +0 -3
@@ -57,297 +57,6 @@
57
57
  var keys = Object.keys, create = Object.create, assign = Object.assign, freeze = Object.freeze;
58
58
  var isArray = Array.isArray;
59
59
 
60
- function appendTTLStrategy(storeLookup, ttlStrategy) {
61
- var returnStoreLookup = function (sel, refresh) {
62
- return storeLookup(sel, refresh, ttlStrategy);
63
- };
64
- // append ttlStrategy to storeLookup function (in cases where custom adapter
65
- // wants to perform it's own lookup)
66
- returnStoreLookup.ttlStrategy = ttlStrategy;
67
- return returnStoreLookup;
68
- }
69
- function buildNetworkSnapshot(args) {
70
- var buildNetworkSnapshot = args.buildNetworkSnapshot, buildSnapshotContext = args.buildSnapshotContext, coercedAdapterRequestContext = args.coercedAdapterRequestContext;
71
- return buildNetworkSnapshot(buildSnapshotContext, coercedAdapterRequestContext).then(function (snapshot) {
72
- return snapshot.state === 'Pending' ? args.resolvePendingSnapshot(snapshot) : snapshot;
73
- });
74
- }
75
- function buildTTLStrategy(staleDurationMilliseconds) {
76
- if (staleDurationMilliseconds === void 0) { staleDurationMilliseconds = 0; }
77
- return function (timestamp, metadata, valueIsError) {
78
- if (metadata !== undefined) {
79
- var expirationTimestamp = metadata.expirationTimestamp;
80
- if (timestamp > expirationTimestamp) {
81
- if (timestamp <= expirationTimestamp + staleDurationMilliseconds &&
82
- valueIsError !== true) {
83
- return engine.StoreResolveResultState.Stale;
84
- }
85
- return engine.StoreResolveResultState.NotPresent;
86
- }
87
- }
88
- if (valueIsError === true) {
89
- return engine.StoreResolveResultState.Error;
90
- }
91
- return engine.StoreResolveResultState.Found;
92
- };
93
- }
94
- // TODO - update userland-facing APIs to return `AvailableSnapshot` instead of `Snapshot`
95
- // and then the signatures here can be updated as well
96
- function buildAvailableSnapshotFromCachedSnapshotResponse(cachedSnapshot, availableSnapshotFunc) {
97
- if (isPromise(cachedSnapshot)) {
98
- return cachedSnapshot.then(availableSnapshotFunc);
99
- }
100
- return availableSnapshotFunc(cachedSnapshot);
101
- }
102
- function isPromise(value) {
103
- if (value === undefined) {
104
- return false;
105
- }
106
- // check for Thenable due to test frameworks using custom Promise impls
107
- return value.then !== undefined;
108
- }
109
-
110
- function buildCacheAndNetworkImplementation(funcs, staleDurationSeconds) {
111
- if (staleDurationSeconds === void 0) { staleDurationSeconds = 0; }
112
- return function (args) {
113
- funcs.validateNotDisposed();
114
- var buildCachedSnapshot = args.buildCachedSnapshot, buildNetworkSnapshot$1 = args.buildNetworkSnapshot, buildSnapshotContext = args.buildSnapshotContext, storeLookup = args.storeLookup, coercedAdapterRequestContext = args.coercedAdapterRequestContext;
115
- var staleDurationMilliseconds = staleDurationSeconds * 1000;
116
- var cachePolicyStoreLookup = appendTTLStrategy(storeLookup, buildTTLStrategy(staleDurationMilliseconds));
117
- var cachedSnapshot = buildCachedSnapshot(buildSnapshotContext, cachePolicyStoreLookup);
118
- return buildAvailableSnapshotFromCachedSnapshotResponse(cachedSnapshot, function (snapshot) {
119
- if (snapshot !== undefined) {
120
- // data found in L1 cache
121
- if (snapshot.state === 'Fulfilled' ||
122
- snapshot.state === 'Error' ||
123
- snapshot.state === 'Stale') {
124
- // kick off network request, do not await it
125
- buildNetworkSnapshot$1(buildSnapshotContext, coercedAdapterRequestContext);
126
- // return the cached snapshot to caller
127
- return snapshot;
128
- }
129
- // network request outstanding
130
- if (snapshot.state === 'Pending') {
131
- // kick off another network request, do not await it
132
- buildNetworkSnapshot$1(buildSnapshotContext, coercedAdapterRequestContext);
133
- return args.resolvePendingSnapshot(snapshot);
134
- }
135
- // if unfulfilled we have enough info to do an L2 lookup
136
- if (snapshot.state === 'Unfulfilled') {
137
- return funcs
138
- .reviveSnapshotWithCachePolicy(snapshot, cachePolicyStoreLookup)
139
- .then(function (revivedSnapshot) {
140
- // data found in L2 cache
141
- if (revivedSnapshot.state === 'Fulfilled' ||
142
- revivedSnapshot.state === 'Error' ||
143
- revivedSnapshot.state === 'Stale') {
144
- // kick off network request, do not await it
145
- buildNetworkSnapshot$1(buildSnapshotContext, coercedAdapterRequestContext);
146
- // return the L2 cached snapshot to caller
147
- return revivedSnapshot;
148
- }
149
- if (revivedSnapshot.state === 'Pending') {
150
- // kick off network request, do not await it
151
- buildNetworkSnapshot$1(buildSnapshotContext, coercedAdapterRequestContext);
152
- return args.resolvePendingSnapshot(revivedSnapshot);
153
- }
154
- // data not found in L2 cache, go to the network
155
- return buildNetworkSnapshot(args);
156
- });
157
- }
158
- }
159
- return buildNetworkSnapshot(args);
160
- });
161
- };
162
- }
163
-
164
- function buildCacheThenNetworkImplementation(funcs) {
165
- return function (args) {
166
- funcs.validateNotDisposed();
167
- var buildCachedSnapshot = args.buildCachedSnapshot, buildSnapshotContext = args.buildSnapshotContext, storeLookup = args.storeLookup;
168
- var cachePolicyStoreLookup = appendTTLStrategy(storeLookup, buildTTLStrategy());
169
- var cachedSnapshot = buildCachedSnapshot(buildSnapshotContext, cachePolicyStoreLookup);
170
- return buildAvailableSnapshotFromCachedSnapshotResponse(cachedSnapshot, function (snapshot) {
171
- if (snapshot !== undefined) {
172
- // data found in L1 cache
173
- if (snapshot.state === 'Fulfilled' || snapshot.state === 'Error') {
174
- return snapshot;
175
- }
176
- if (snapshot.state === 'Pending') {
177
- return args.resolvePendingSnapshot(snapshot);
178
- }
179
- // if unfulfilled we have enough info to do an L2 lookup
180
- if (snapshot.state === 'Unfulfilled') {
181
- return funcs
182
- .reviveSnapshotWithCachePolicy(snapshot, cachePolicyStoreLookup)
183
- .then(function (revivedSnapshot) {
184
- // data found in L2 cache
185
- if (revivedSnapshot.state === 'Fulfilled' ||
186
- revivedSnapshot.state === 'Error') {
187
- return revivedSnapshot;
188
- }
189
- if (revivedSnapshot.state === 'Pending') {
190
- return args.resolvePendingSnapshot(revivedSnapshot);
191
- }
192
- // data not found in L2 cache, go to the network
193
- return buildNetworkSnapshot(args);
194
- });
195
- }
196
- }
197
- // L1 lookup could not find enough information to even construct a snapshot, go to the network
198
- return buildNetworkSnapshot(args);
199
- });
200
- };
201
- }
202
-
203
- function buildNoCacheImplementation(funcs) {
204
- return function (args) {
205
- funcs.validateNotDisposed();
206
- return buildNetworkSnapshot(args);
207
- };
208
- }
209
-
210
- function deepFreeze(value) {
211
- // No need to freeze primitives
212
- if (typeof value !== 'object' || value === null) {
213
- return;
214
- }
215
- if (isArray(value)) {
216
- for (var i = 0, len = value.length; i < len; i += 1) {
217
- deepFreeze(value[i]);
218
- }
219
- }
220
- else {
221
- var keys$1 = keys(value);
222
- for (var i = 0, len = keys$1.length; i < len; i += 1) {
223
- deepFreeze(value[keys$1[i]]);
224
- }
225
- }
226
- freeze(value);
227
- }
228
-
229
- // TODO[@W-10165595]: consolidate this code with the corresponding logic in the default environment's only-if-cached.ts
230
- function buildNotCachedErrorSnapshot() {
231
- var error = {
232
- body: undefined,
233
- headers: {},
234
- ok: false,
235
- status: engine.HttpStatusCode.GatewayTimeout,
236
- statusText: 'Gateway Timeout',
237
- };
238
- deepFreeze(error);
239
- return {
240
- error: error,
241
- state: 'Error',
242
- data: undefined,
243
- // TODO[@W-10164067]: copy refresh data from the snapshot returned by buildCachedSnapshot (if any)
244
- // refresh: ...
245
- };
246
- }
247
- function buildOnlyIfCachedImplementation(funcs) {
248
- return function (args) {
249
- funcs.validateNotDisposed();
250
- var buildCachedSnapshot = args.buildCachedSnapshot, buildSnapshotContext = args.buildSnapshotContext, storeLookup = args.storeLookup;
251
- var cachePolicyStoreLookup = appendTTLStrategy(storeLookup, buildTTLStrategy());
252
- var cachedSnapshot = buildCachedSnapshot(buildSnapshotContext, cachePolicyStoreLookup);
253
- return buildAvailableSnapshotFromCachedSnapshotResponse(cachedSnapshot, function (snapshot) {
254
- if (snapshot !== undefined) {
255
- // data found in L1 cache
256
- if (snapshot.state === 'Fulfilled' || snapshot.state === 'Error') {
257
- return snapshot;
258
- }
259
- // network request outstanding, data is not cached
260
- if (snapshot.state === 'Pending') {
261
- return buildNotCachedErrorSnapshot();
262
- }
263
- // if unfulfilled we have enough info to do an L2 lookup
264
- if (snapshot.state === 'Unfulfilled') {
265
- return funcs
266
- .reviveSnapshotWithCachePolicy(snapshot, cachePolicyStoreLookup)
267
- .then(function (revivedSnapshot) {
268
- // data found in L2 cache
269
- if (revivedSnapshot.state === 'Fulfilled' ||
270
- revivedSnapshot.state === 'Error') {
271
- return revivedSnapshot;
272
- }
273
- // data is not cached
274
- return buildNotCachedErrorSnapshot();
275
- });
276
- }
277
- }
278
- return buildNotCachedErrorSnapshot();
279
- });
280
- };
281
- }
282
-
283
- function buildStaleWhileRevalidateImplementation(funcs, staleDurationSeconds) {
284
- return function (args) {
285
- funcs.validateNotDisposed();
286
- var buildCachedSnapshot = args.buildCachedSnapshot, buildSnapshotContext = args.buildSnapshotContext, storeLookup = args.storeLookup;
287
- var cachePolicyStoreLookup = appendTTLStrategy(storeLookup, buildTTLStrategy(staleDurationSeconds * 1000));
288
- var cachedSnapshot = buildCachedSnapshot(buildSnapshotContext, cachePolicyStoreLookup);
289
- return buildAvailableSnapshotFromCachedSnapshotResponse(cachedSnapshot, function (snapshot) {
290
- if (snapshot !== undefined) {
291
- // data found in L1 cache
292
- if (snapshot.state === 'Fulfilled' || snapshot.state === 'Error') {
293
- return snapshot;
294
- }
295
- if (snapshot.state === 'Pending') {
296
- return args.resolvePendingSnapshot(snapshot);
297
- }
298
- // stale data found in L1 cache
299
- if (snapshot.state === 'Stale') {
300
- buildNetworkSnapshot(args);
301
- return snapshot;
302
- }
303
- // data not found in L1 cache, try L2 cache
304
- return funcs
305
- .reviveSnapshotWithCachePolicy(snapshot, cachePolicyStoreLookup)
306
- .then(function (revivedSnapshot) {
307
- // data found in L2 cache
308
- if (revivedSnapshot.state === 'Fulfilled' ||
309
- revivedSnapshot.state === 'Error') {
310
- return revivedSnapshot;
311
- }
312
- if (revivedSnapshot.state === 'Pending') {
313
- return args.resolvePendingSnapshot(revivedSnapshot);
314
- }
315
- // stale data found in L2 cache
316
- if (revivedSnapshot.state === 'Stale') {
317
- buildNetworkSnapshot(args);
318
- return revivedSnapshot;
319
- }
320
- // data not found in L2 cache, go to the network
321
- return buildNetworkSnapshot(args);
322
- });
323
- }
324
- // L1 lookup could not find enough information to even construct a snapshot, go to the network
325
- return buildNetworkSnapshot(args);
326
- });
327
- };
328
- }
329
-
330
- function buildValidAtImplementation(funcs, basePolicyImplementation, timestamp) {
331
- return function validAtImplementation(args) {
332
- funcs.validateNotDisposed();
333
- // This somewhat convoluted code is used to force the basePolicyImplementation's
334
- // TTLStrategy to use the the valid-at cache policy's timestamp. The flow goes:
335
- //
336
- // Environment.applyCachePolicy => validAtImplementation (this function) =>
337
- // basePolicyImplementation => adapter's buildCachedSnapshot =>
338
- // basePolicyImplementation's storeLookup => validAtStoreLookup (below) =>
339
- // Environment.applyCachePolicy's storeLookup => Store/Reader code =>
340
- // valid-at TTLStrategy (below) =>
341
- // basePolicyImplementation's TTLStrategy (with valid-at timestamp)
342
- var validAtStoreLookup = function (sel, refresh, ttlStrategy) {
343
- return args.storeLookup(sel, refresh, function (_readerTimestamp, metadata, valueIsError) { return ttlStrategy(timestamp, metadata, valueIsError); });
344
- };
345
- // let basePolicy make all the decisions, but have it use our storeLookup
346
- // so we can override the timestamp passed to the basePolicy's TTLStrategy
347
- return basePolicyImplementation(__assign(__assign({}, args), { storeLookup: validAtStoreLookup }));
348
- };
349
- }
350
-
351
60
  //Durable store error instrumentation key
352
61
  var DURABLE_STORE_ERROR = 'durable-store-error';
353
62
  /**
@@ -373,6 +82,25 @@
373
82
  };
374
83
  }
375
84
 
85
+ function deepFreeze(value) {
86
+ // No need to freeze primitives
87
+ if (typeof value !== 'object' || value === null) {
88
+ return;
89
+ }
90
+ if (isArray(value)) {
91
+ for (var i = 0, len = value.length; i < len; i += 1) {
92
+ deepFreeze(value[i]);
93
+ }
94
+ }
95
+ else {
96
+ var keys$1 = keys(value);
97
+ for (var i = 0, len = keys$1.length; i < len; i += 1) {
98
+ deepFreeze(value[keys$1[i]]);
99
+ }
100
+ }
101
+ freeze(value);
102
+ }
103
+
376
104
  var SELECTOR_PAGINATION_TOKEN = 'tokenDataKey';
377
105
  function isFragmentUnionSelection(sel) {
378
106
  return sel.union === true;
@@ -742,6 +470,15 @@
742
470
  return contextReturn();
743
471
  });
744
472
  }
473
+ function isUnfulfilledSnapshot(cachedSnapshotResult) {
474
+ if (cachedSnapshotResult === undefined) {
475
+ return false;
476
+ }
477
+ if ('then' in cachedSnapshotResult) {
478
+ return false;
479
+ }
480
+ return cachedSnapshotResult.state === 'Unfulfilled';
481
+ }
745
482
  /**
746
483
  * Configures the environment to persist data into a durable store and attempt to resolve
747
484
  * data from the persistent store before hitting the network.
@@ -853,12 +590,9 @@
853
590
  };
854
591
  var storeBroadcast = function (_rebuildSnapshot, _snapshotDataAvailable) {
855
592
  validateNotDisposed();
856
- // for our environment we basically want a broadcast to be a "durable store broadcast",
857
- // so we flush staging store to L2, which will cause the onChanged handler to fire
858
- // which will revive records to the main L1 store and call the base storeBroadcast
859
- // don't await the DS write - DS implementation will take care of R/W
860
- // synchronization
861
- publishChangesToDurableStore();
593
+ // no-op here and wait for the L2 flush to happen in handleSuccessResponse,
594
+ // that flush will cause the onChanged handler to fire which will revive
595
+ // records to the main L1 store and call the base storeBroadcast
862
596
  };
863
597
  var publishChangesToDurableStore = function () {
864
598
  validateNotDisposed();
@@ -900,30 +634,6 @@
900
634
  }
901
635
  return environment.wrapNormalizedGraphNode(normalized, ingestStagingStore);
902
636
  };
903
- var resolveSnapshot = function (snapshot, refresh) {
904
- validateNotDisposed();
905
- // if the snapshot is already pending then no need to kick off another
906
- // revive, just wait for the pending refresh to broadcast
907
- if (snapshot.state === 'Pending') {
908
- return environment.resolvePendingSnapshot(snapshot);
909
- }
910
- var resolve = refresh.resolve, config = refresh.config;
911
- var refreshFunc = function () { return resolve(config); };
912
- // if the snapshot is unfulfilled we can do an L2 lookup
913
- if (snapshot.state === 'Unfulfilled') {
914
- return reviveSnapshot(environment, durableStore, snapshot, durableStoreErrorHandler, function () {
915
- return environment.storeLookup(snapshot.select, environment.createSnapshot, snapshot.refresh);
916
- }).then(function (durableSnapshot) {
917
- if (environment.snapshotAvailable(durableSnapshot)) {
918
- // L2 cache hit
919
- return durableSnapshot;
920
- }
921
- // else have to hit network
922
- return refreshFunc();
923
- });
924
- }
925
- return refreshFunc();
926
- };
927
637
  var rebuildSnapshot = function (snapshot, records, storeMetadataMap, redirects, onAsyncRebuild) {
928
638
  validateNotDisposed();
929
639
  // try rebuilding from memory
@@ -985,77 +695,20 @@
985
695
  validateNotDisposed();
986
696
  return durableTTLStore.getDurableTTLOverrides();
987
697
  };
988
- // reviveSnapshot wrapper to let cache policies revive data from L2 and
989
- // access the revived data via their own storeLookups
990
- var reviveSnapshotWithCachePolicy = function (unavailableSnapshot, storeLookup) {
991
- return reviveSnapshot(environment, durableStore, unavailableSnapshot, durableStoreErrorHandler, function () { return storeLookup(unavailableSnapshot.select, unavailableSnapshot.refresh); });
992
- };
993
- var defaultCachePolicy = buildStaleWhileRevalidateImplementation({
994
- validateNotDisposed: validateNotDisposed,
995
- reviveSnapshotWithCachePolicy: reviveSnapshotWithCachePolicy,
996
- }, Number.MAX_SAFE_INTEGER);
997
- function resolveCachePolicy(cachePolicy) {
998
- if (cachePolicy === undefined) {
999
- return defaultCachePolicy;
1000
- }
1001
- switch (cachePolicy.type) {
1002
- case 'stale-while-revalidate':
1003
- return buildStaleWhileRevalidateImplementation({
1004
- validateNotDisposed: validateNotDisposed,
1005
- reviveSnapshotWithCachePolicy: reviveSnapshotWithCachePolicy,
1006
- }, cachePolicy.staleDurationSeconds);
1007
- case 'cache-and-network':
1008
- return buildCacheAndNetworkImplementation({
1009
- validateNotDisposed: validateNotDisposed,
1010
- reviveSnapshotWithCachePolicy: reviveSnapshotWithCachePolicy,
1011
- }, cachePolicy.staleDurationSeconds);
1012
- case 'cache-then-network':
1013
- return buildCacheThenNetworkImplementation({
1014
- validateNotDisposed: validateNotDisposed,
1015
- reviveSnapshotWithCachePolicy: reviveSnapshotWithCachePolicy,
1016
- });
1017
- case 'no-cache':
1018
- return buildNoCacheImplementation({
1019
- validateNotDisposed: validateNotDisposed,
1020
- reviveSnapshotWithCachePolicy: reviveSnapshotWithCachePolicy,
1021
- });
1022
- case 'only-if-cached':
1023
- return buildOnlyIfCachedImplementation({
1024
- validateNotDisposed: validateNotDisposed,
1025
- reviveSnapshotWithCachePolicy: reviveSnapshotWithCachePolicy,
1026
- });
1027
- case 'valid-at': {
1028
- var basePolicy = resolveCachePolicy(cachePolicy.basePolicy);
1029
- return buildValidAtImplementation({
1030
- validateNotDisposed: validateNotDisposed,
1031
- reviveSnapshotWithCachePolicy: reviveSnapshotWithCachePolicy,
1032
- }, basePolicy, cachePolicy.timestamp);
1033
- }
1034
- default: {
1035
- if (process.env.NODE_ENV !== 'production') {
1036
- throw new Error("unrecognized cache policy: ".concat(JSON.stringify(cachePolicy)));
1037
- }
1038
- return defaultCachePolicy;
1039
- }
1040
- }
1041
- }
1042
698
  var applyCachePolicy = function (adapterRequestContext, buildSnapshotContext, buildCachedSnapshot, buildNetworkSnapshot) {
1043
699
  validateNotDisposed();
1044
- var cachePolicy = adapterRequestContext.cachePolicy;
1045
- var cachePolicyImpl = resolveCachePolicy(cachePolicy);
1046
- var resolvePendingSnapshot = function (snapshot) {
1047
- return environment.resolvePendingSnapshot(snapshot);
700
+ var wrappedCacheLookup = function (buildSnapshotContext, storeLookup) {
701
+ var snapshot = buildCachedSnapshot(buildSnapshotContext, storeLookup);
702
+ // if the adapter attempted to do an L1 lookup and it was unfulfilled
703
+ // then we can attempt an L2 lookup
704
+ if (isUnfulfilledSnapshot(snapshot)) {
705
+ return reviveSnapshot(environment, durableStore, snapshot, durableStoreErrorHandler, function () { return storeLookup(snapshot.select, snapshot.refresh); });
706
+ }
707
+ // otherwise just return what buildCachedSnapshot gave us
708
+ return snapshot;
1048
709
  };
1049
- var storeLookup = function (sel, refresh, ttlStrategy) { return environment.storeLookup(sel, environment.createSnapshot, refresh, ttlStrategy); };
1050
710
  var applyCachePolicy = function () {
1051
- return cachePolicyImpl({
1052
- buildCachedSnapshot: buildCachedSnapshot,
1053
- buildNetworkSnapshot: buildNetworkSnapshot,
1054
- buildSnapshotContext: buildSnapshotContext,
1055
- resolvePendingSnapshot: resolvePendingSnapshot,
1056
- storeLookup: storeLookup,
1057
- coercedAdapterRequestContext: engine.coerceAdapterRequestContext(adapterRequestContext),
1058
- });
711
+ return environment.applyCachePolicy(adapterRequestContext, buildSnapshotContext, wrappedCacheLookup, buildNetworkSnapshot);
1059
712
  };
1060
713
  return isRevivingTTLOverrides !== undefined
1061
714
  ? isRevivingTTLOverrides.then(applyCachePolicy)
@@ -1082,17 +735,28 @@
1082
735
  ingestStagingStore.records = existingRecords;
1083
736
  }
1084
737
  var snapshotFromMemoryIngest = ingestAndBroadcastFunc();
1085
- if (snapshotFromMemoryIngest === undefined) {
1086
- return undefined;
1087
- }
1088
- if (snapshotFromMemoryIngest.state !== 'Unfulfilled') {
738
+ // now that ingestion is done flush staging store values to L2
739
+ return publishChangesToDurableStore().then(function () {
740
+ if (snapshotFromMemoryIngest === undefined) {
741
+ return undefined;
742
+ }
743
+ if (snapshotFromMemoryIngest.state !== 'Unfulfilled') {
744
+ return snapshotFromMemoryIngest;
745
+ }
746
+ // if snapshot from staging store lookup is unfulfilled then do an L2 lookup
747
+ return reviveSnapshot(environment, durableStore, snapshotFromMemoryIngest, durableStoreErrorHandler, function () {
748
+ return environment.storeLookup(snapshotFromMemoryIngest.select, environment.createSnapshot, snapshotFromMemoryIngest.refresh);
749
+ });
750
+ });
751
+ };
752
+ var handleErrorResponse = function (ingestAndBroadcastFunc) {
753
+ validateNotDisposed();
754
+ var snapshotFromMemoryIngest = ingestAndBroadcastFunc();
755
+ return publishChangesToDurableStore().then(function () {
1089
756
  return snapshotFromMemoryIngest;
1090
- }
1091
- // if snapshot from staging store lookup is unfulfilled then do an L2 lookup
1092
- return reviveSnapshot(environment, durableStore, snapshotFromMemoryIngest, durableStoreErrorHandler, function () {
1093
- return environment.storeLookup(snapshotFromMemoryIngest.select, environment.createSnapshot, snapshotFromMemoryIngest.refresh);
1094
757
  });
1095
758
  };
759
+ environment.defaultCachePolicy = engine.buildStaleWhileRevalidateImplementation(Number.MAX_SAFE_INTEGER);
1096
760
  return create(environment, {
1097
761
  publishStoreMetadata: { value: publishStoreMetadata },
1098
762
  storeIngest: { value: storeIngest },
@@ -1102,7 +766,6 @@
1102
766
  storeEvict: { value: storeEvict },
1103
767
  wrapNormalizedGraphNode: { value: wrapNormalizedGraphNode },
1104
768
  getNode: { value: getNode },
1105
- resolveSnapshot: { value: resolveSnapshot },
1106
769
  rebuildSnapshot: { value: rebuildSnapshot },
1107
770
  withContext: { value: withContext },
1108
771
  storeSetTTLOverride: { value: storeSetTTLOverride },
@@ -1112,11 +775,11 @@
1112
775
  dispose: { value: dispose },
1113
776
  publishChangesToDurableStore: { value: publishChangesToDurableStore },
1114
777
  getDurableTTLOverrides: { value: getDurableTTLOverrides },
1115
- defaultCachePolicy: { value: defaultCachePolicy },
1116
778
  applyCachePolicy: { value: applyCachePolicy },
1117
779
  getIngestStagingStoreRecords: { value: getIngestStagingStoreRecords },
1118
780
  getIngestStagingStoreMetadata: { value: getIngestStagingStoreMetadata },
1119
781
  handleSuccessResponse: { value: handleSuccessResponse },
782
+ handleErrorResponse: { value: handleErrorResponse },
1120
783
  });
1121
784
  }
1122
785
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@luvio/environments",
3
- "version": "0.72.0",
3
+ "version": "0.73.3",
4
4
  "description": "Luvio Environments",
5
5
  "main": "dist/umd/es2018/environments.js",
6
6
  "module": "dist/es/es2018/environments.js",
@@ -26,6 +26,6 @@
26
26
  "dist/"
27
27
  ],
28
28
  "dependencies": {
29
- "@luvio/engine": "0.72.0"
29
+ "@luvio/engine": "0.73.3"
30
30
  }
31
31
  }
@@ -1,3 +0,0 @@
1
- import { CachePolicyImplementationArgs, Snapshot } from '@luvio/engine';
2
- import { DurableCachePolicyFunctions } from './utils';
3
- export declare function buildCacheAndNetworkImplementation(funcs: DurableCachePolicyFunctions, staleDurationSeconds?: number): <C, D>(args: CachePolicyImplementationArgs<C, D>) => Snapshot<D, unknown> | Promise<Snapshot<D, unknown>>;
@@ -1,3 +0,0 @@
1
- import { CachePolicyImplementationArgs, Snapshot } from '@luvio/engine';
2
- import { DurableCachePolicyFunctions } from './utils';
3
- export declare function buildCacheThenNetworkImplementation(funcs: DurableCachePolicyFunctions): <C, D>(args: CachePolicyImplementationArgs<C, D>) => Snapshot<D, unknown> | Promise<Snapshot<D, unknown>>;
@@ -1,6 +0,0 @@
1
- export { buildCacheAndNetworkImplementation } from './cache-and-network';
2
- export { buildCacheThenNetworkImplementation } from './cache-then-network';
3
- export { buildNoCacheImplementation } from './no-cache';
4
- export { buildOnlyIfCachedImplementation } from './only-if-cached';
5
- export { buildStaleWhileRevalidateImplementation } from './stale-while-revalidate';
6
- export { buildValidAtImplementation } from './valid-at';
@@ -1,3 +0,0 @@
1
- import { CachePolicyImplementationArgs, Snapshot } from '@luvio/engine';
2
- import { DurableCachePolicyFunctions } from './utils';
3
- export declare function buildNoCacheImplementation(funcs: DurableCachePolicyFunctions): <C, D>(args: CachePolicyImplementationArgs<C, D>) => Snapshot<D, unknown> | Promise<Snapshot<D, unknown>>;
@@ -1,3 +0,0 @@
1
- import { CachePolicyImplementationArgs, Snapshot } from '@luvio/engine';
2
- import { DurableCachePolicyFunctions } from './utils';
3
- export declare function buildOnlyIfCachedImplementation(funcs: DurableCachePolicyFunctions): <C, D>(args: CachePolicyImplementationArgs<C, D>) => Snapshot<D, unknown> | Promise<Snapshot<D, unknown>>;
@@ -1,3 +0,0 @@
1
- import { CachePolicyImplementationArgs, Snapshot } from '@luvio/engine';
2
- import { DurableCachePolicyFunctions } from './utils';
3
- export declare function buildStaleWhileRevalidateImplementation(funcs: DurableCachePolicyFunctions, staleDurationSeconds: number): <C, D>(args: CachePolicyImplementationArgs<C, D>) => Snapshot<D, unknown> | Promise<Snapshot<D, unknown>>;
@@ -1,9 +0,0 @@
1
- import { BuildCachedSnapshot, CachePolicyImplementationArgs, Snapshot, StoreLookup, TTLStrategy, UnAvailableSnapshot } from '@luvio/engine';
2
- export declare type DurableCachePolicyFunctions = {
3
- validateNotDisposed: () => void;
4
- reviveSnapshotWithCachePolicy: <D, V>(unavailableSnapshot: UnAvailableSnapshot<D, V>, storeLookup: StoreLookup<D, V>) => Promise<Snapshot<D, V>>;
5
- };
6
- export declare function appendTTLStrategy<C, D>(storeLookup: CachePolicyImplementationArgs<C, D>['storeLookup'], ttlStrategy: TTLStrategy): Parameters<BuildCachedSnapshot<C, D>>[1];
7
- export declare function buildNetworkSnapshot<C, D>(args: CachePolicyImplementationArgs<C, D>): Promise<Snapshot<D, unknown>>;
8
- export declare function buildTTLStrategy(staleDurationMilliseconds?: number): TTLStrategy;
9
- export declare function buildAvailableSnapshotFromCachedSnapshotResponse<C, D>(cachedSnapshot: ReturnType<BuildCachedSnapshot<C, D>>, availableSnapshotFunc: (snapshot: Snapshot<D> | undefined) => Snapshot<D> | Promise<Snapshot<D>>): Snapshot<D> | Promise<Snapshot<D>>;
@@ -1,3 +0,0 @@
1
- import { CachePolicyImplementation, CachePolicyImplementationArgs, Snapshot } from '@luvio/engine';
2
- import { DurableCachePolicyFunctions } from './utils';
3
- export declare function buildValidAtImplementation<C, D>(funcs: DurableCachePolicyFunctions, basePolicyImplementation: CachePolicyImplementation<C, D>, timestamp: number): (args: CachePolicyImplementationArgs<C, D>) => Snapshot<D> | Promise<Snapshot<D>>;
@@ -1,3 +0,0 @@
1
- import { CachePolicyImplementationArgs, Snapshot } from '@luvio/engine';
2
- import { DurableCachePolicyFunctions } from './utils';
3
- export declare function buildCacheAndNetworkImplementation(funcs: DurableCachePolicyFunctions, staleDurationSeconds?: number): <C, D>(args: CachePolicyImplementationArgs<C, D>) => Snapshot<D, unknown> | Promise<Snapshot<D, unknown>>;
@@ -1,3 +0,0 @@
1
- import { CachePolicyImplementationArgs, Snapshot } from '@luvio/engine';
2
- import { DurableCachePolicyFunctions } from './utils';
3
- export declare function buildCacheThenNetworkImplementation(funcs: DurableCachePolicyFunctions): <C, D>(args: CachePolicyImplementationArgs<C, D>) => Snapshot<D, unknown> | Promise<Snapshot<D, unknown>>;
@@ -1,6 +0,0 @@
1
- export { buildCacheAndNetworkImplementation } from './cache-and-network';
2
- export { buildCacheThenNetworkImplementation } from './cache-then-network';
3
- export { buildNoCacheImplementation } from './no-cache';
4
- export { buildOnlyIfCachedImplementation } from './only-if-cached';
5
- export { buildStaleWhileRevalidateImplementation } from './stale-while-revalidate';
6
- export { buildValidAtImplementation } from './valid-at';
@@ -1,3 +0,0 @@
1
- import { CachePolicyImplementationArgs, Snapshot } from '@luvio/engine';
2
- import { DurableCachePolicyFunctions } from './utils';
3
- export declare function buildNoCacheImplementation(funcs: DurableCachePolicyFunctions): <C, D>(args: CachePolicyImplementationArgs<C, D>) => Snapshot<D, unknown> | Promise<Snapshot<D, unknown>>;
@@ -1,3 +0,0 @@
1
- import { CachePolicyImplementationArgs, Snapshot } from '@luvio/engine';
2
- import { DurableCachePolicyFunctions } from './utils';
3
- export declare function buildOnlyIfCachedImplementation(funcs: DurableCachePolicyFunctions): <C, D>(args: CachePolicyImplementationArgs<C, D>) => Snapshot<D, unknown> | Promise<Snapshot<D, unknown>>;
@@ -1,3 +0,0 @@
1
- import { CachePolicyImplementationArgs, Snapshot } from '@luvio/engine';
2
- import { DurableCachePolicyFunctions } from './utils';
3
- export declare function buildStaleWhileRevalidateImplementation(funcs: DurableCachePolicyFunctions, staleDurationSeconds: number): <C, D>(args: CachePolicyImplementationArgs<C, D>) => Snapshot<D, unknown> | Promise<Snapshot<D, unknown>>;
@@ -1,9 +0,0 @@
1
- import { BuildCachedSnapshot, CachePolicyImplementationArgs, Snapshot, StoreLookup, TTLStrategy, UnAvailableSnapshot } from '@luvio/engine';
2
- export declare type DurableCachePolicyFunctions = {
3
- validateNotDisposed: () => void;
4
- reviveSnapshotWithCachePolicy: <D, V>(unavailableSnapshot: UnAvailableSnapshot<D, V>, storeLookup: StoreLookup<D, V>) => Promise<Snapshot<D, V>>;
5
- };
6
- export declare function appendTTLStrategy<C, D>(storeLookup: CachePolicyImplementationArgs<C, D>['storeLookup'], ttlStrategy: TTLStrategy): Parameters<BuildCachedSnapshot<C, D>>[1];
7
- export declare function buildNetworkSnapshot<C, D>(args: CachePolicyImplementationArgs<C, D>): Promise<Snapshot<D, unknown>>;
8
- export declare function buildTTLStrategy(staleDurationMilliseconds?: number): TTLStrategy;
9
- export declare function buildAvailableSnapshotFromCachedSnapshotResponse<C, D>(cachedSnapshot: ReturnType<BuildCachedSnapshot<C, D>>, availableSnapshotFunc: (snapshot: Snapshot<D> | undefined) => Snapshot<D> | Promise<Snapshot<D>>): Snapshot<D> | Promise<Snapshot<D>>;
@@ -1,3 +0,0 @@
1
- import { CachePolicyImplementation, CachePolicyImplementationArgs, Snapshot } from '@luvio/engine';
2
- import { DurableCachePolicyFunctions } from './utils';
3
- export declare function buildValidAtImplementation<C, D>(funcs: DurableCachePolicyFunctions, basePolicyImplementation: CachePolicyImplementation<C, D>, timestamp: number): (args: CachePolicyImplementationArgs<C, D>) => Snapshot<D> | Promise<Snapshot<D>>;