@mmstack/resource 20.2.5 → 20.2.7
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/fesm2022/mmstack-resource.mjs +62 -27
- package/fesm2022/mmstack-resource.mjs.map +1 -1
- package/index.d.ts +578 -1
- package/package.json +4 -4
- package/lib/mutation-resource.d.ts +0 -88
- package/lib/public_api.d.ts +0 -3
- package/lib/query-resource.d.ts +0 -119
- package/lib/util/cache/cache.d.ts +0 -188
- package/lib/util/cache/cache.interceptor.d.ts +0 -42
- package/lib/util/cache/index.d.ts +0 -2
- package/lib/util/cache/public_api.d.ts +0 -2
- package/lib/util/catch-value-error.d.ts +0 -2
- package/lib/util/circuit-breaker.d.ts +0 -103
- package/lib/util/dedupe.interceptor.d.ts +0 -50
- package/lib/util/equality.d.ts +0 -3
- package/lib/util/has-slow-connection.d.ts +0 -1
- package/lib/util/index.d.ts +0 -11
- package/lib/util/persist.d.ts +0 -3
- package/lib/util/public_api.d.ts +0 -3
- package/lib/util/refresh.d.ts +0 -3
- package/lib/util/retry-on-error.d.ts +0 -6
- package/lib/util/to-resource-object.d.ts +0 -2
- package/lib/util/url-with-params.d.ts +0 -2
|
@@ -60,7 +60,7 @@ class Cache {
|
|
|
60
60
|
}
|
|
61
61
|
/** @internal */
|
|
62
62
|
getInternal(key) {
|
|
63
|
-
const keySignal = computed(() => key());
|
|
63
|
+
const keySignal = computed(() => key(), ...(ngDevMode ? [{ debugName: "keySignal" }] : []));
|
|
64
64
|
return computed(() => {
|
|
65
65
|
const key = keySignal();
|
|
66
66
|
if (!key)
|
|
@@ -471,15 +471,15 @@ const DEFAULT_OPTIONS = {
|
|
|
471
471
|
};
|
|
472
472
|
/** @internal */
|
|
473
473
|
function internalCeateCircuitBreaker(treshold = 5, resetTimeout = 30000, shouldFail = () => true, shouldFailForever = () => false) {
|
|
474
|
-
const halfOpen = signal(false);
|
|
475
|
-
const failureCount = signal(0);
|
|
474
|
+
const halfOpen = signal(false, ...(ngDevMode ? [{ debugName: "halfOpen" }] : []));
|
|
475
|
+
const failureCount = signal(0, ...(ngDevMode ? [{ debugName: "failureCount" }] : []));
|
|
476
476
|
const status = computed(() => {
|
|
477
477
|
if (failureCount() >= treshold)
|
|
478
478
|
return 'OPEN';
|
|
479
479
|
return halfOpen() ? 'HALF_OPEN' : 'CLOSED';
|
|
480
|
-
});
|
|
481
|
-
const isClosed = computed(() => status() !== 'OPEN');
|
|
482
|
-
const isOpen = computed(() => status() !== 'CLOSED');
|
|
480
|
+
}, ...(ngDevMode ? [{ debugName: "status" }] : []));
|
|
481
|
+
const isClosed = computed(() => status() !== 'OPEN', ...(ngDevMode ? [{ debugName: "isClosed" }] : []));
|
|
482
|
+
const isOpen = computed(() => status() !== 'CLOSED', ...(ngDevMode ? [{ debugName: "isOpen" }] : []));
|
|
483
483
|
const success = () => {
|
|
484
484
|
failureCount.set(0);
|
|
485
485
|
halfOpen.set(false);
|
|
@@ -500,7 +500,7 @@ function internalCeateCircuitBreaker(treshold = 5, resetTimeout = 30000, shouldF
|
|
|
500
500
|
clearTimeout(timeout);
|
|
501
501
|
failForeverResetId = null;
|
|
502
502
|
});
|
|
503
|
-
});
|
|
503
|
+
}, ...(ngDevMode ? [{ debugName: "effectRef" }] : []));
|
|
504
504
|
const failInternal = () => {
|
|
505
505
|
failureCount.set(failureCount() + 1);
|
|
506
506
|
halfOpen.set(false);
|
|
@@ -904,7 +904,7 @@ function retryOnError(res, opt) {
|
|
|
904
904
|
case 'resolved':
|
|
905
905
|
return onSuccess();
|
|
906
906
|
}
|
|
907
|
-
});
|
|
907
|
+
}, ...(ngDevMode ? [{ debugName: "ref" }] : []));
|
|
908
908
|
return {
|
|
909
909
|
...res,
|
|
910
910
|
destroy: () => {
|
|
@@ -967,11 +967,13 @@ function queryResource(request, options) {
|
|
|
967
967
|
if (cb.isOpen())
|
|
968
968
|
return undefined;
|
|
969
969
|
return request() ?? undefined;
|
|
970
|
-
}, {
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
:
|
|
974
|
-
|
|
970
|
+
}, ...(ngDevMode ? [{ debugName: "stableRequest", equal: options?.triggerOnSameRequest
|
|
971
|
+
? undefined
|
|
972
|
+
: createEqualRequest(options?.equal) }] : [{
|
|
973
|
+
equal: options?.triggerOnSameRequest
|
|
974
|
+
? undefined
|
|
975
|
+
: createEqualRequest(options?.equal),
|
|
976
|
+
}]));
|
|
975
977
|
const hashFn = typeof options?.cache === 'object'
|
|
976
978
|
? (options.cache.hash ?? urlWithParams)
|
|
977
979
|
: urlWithParams;
|
|
@@ -982,7 +984,7 @@ function queryResource(request, options) {
|
|
|
982
984
|
if (!r)
|
|
983
985
|
return null;
|
|
984
986
|
return hashFn(r);
|
|
985
|
-
});
|
|
987
|
+
}, ...(ngDevMode ? [{ debugName: "cacheKey" }] : []));
|
|
986
988
|
const bustBrowserCache = typeof options?.cache === 'object' &&
|
|
987
989
|
options.cache.bustBrowserCache === true;
|
|
988
990
|
const ignoreCacheControl = typeof options?.cache === 'object' &&
|
|
@@ -1048,7 +1050,7 @@ function queryResource(request, options) {
|
|
|
1048
1050
|
const err = resource.error();
|
|
1049
1051
|
if (err)
|
|
1050
1052
|
onError(err);
|
|
1051
|
-
});
|
|
1053
|
+
}, ...(ngDevMode ? [{ debugName: "onErrorRef" }] : []));
|
|
1052
1054
|
// cleanup on manual destroy, I'm comfortable setting these props in-line as we have yet to 'release' the object out of this lexical scope
|
|
1053
1055
|
const destroyRest = resource.destroy;
|
|
1054
1056
|
resource.destroy = () => {
|
|
@@ -1063,7 +1065,7 @@ function queryResource(request, options) {
|
|
|
1063
1065
|
cb.fail(untracked(resource.error));
|
|
1064
1066
|
else if (status === 'resolved')
|
|
1065
1067
|
cb.success();
|
|
1066
|
-
});
|
|
1068
|
+
}, ...(ngDevMode ? [{ debugName: "cbEffectRef" }] : []));
|
|
1067
1069
|
const set = (value) => {
|
|
1068
1070
|
resource.value.set(value);
|
|
1069
1071
|
const k = untracked(cacheKey);
|
|
@@ -1117,6 +1119,11 @@ function queryResource(request, options) {
|
|
|
1117
1119
|
try {
|
|
1118
1120
|
await firstValueFrom(client.request(prefetchRequest.method ?? 'GET', prefetchRequest.url, {
|
|
1119
1121
|
...prefetchRequest,
|
|
1122
|
+
credentials: prefetchRequest.credentials,
|
|
1123
|
+
priority: prefetchRequest.priority,
|
|
1124
|
+
cache: prefetchRequest.cache,
|
|
1125
|
+
mode: prefetchRequest.mode,
|
|
1126
|
+
redirect: prefetchRequest.redirect,
|
|
1120
1127
|
context: setCacheContext(prefetchRequest.context, {
|
|
1121
1128
|
staleTime,
|
|
1122
1129
|
ttl,
|
|
@@ -1164,25 +1171,51 @@ function mutationResource(request, options = {}) {
|
|
|
1164
1171
|
const { onMutate, onError, onSuccess, onSettled, equal, ...rest } = options;
|
|
1165
1172
|
const requestEqual = createEqualRequest(equal);
|
|
1166
1173
|
const eq = equal ?? Object.is;
|
|
1167
|
-
const next = signal(null, {
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
return
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1174
|
+
const next = signal(null, ...(ngDevMode ? [{ debugName: "next", equal: (a, b) => {
|
|
1175
|
+
if (!a && !b)
|
|
1176
|
+
return true;
|
|
1177
|
+
if (!a || !b)
|
|
1178
|
+
return false;
|
|
1179
|
+
return eq(a, b);
|
|
1180
|
+
} }] : [{
|
|
1181
|
+
equal: (a, b) => {
|
|
1182
|
+
if (!a && !b)
|
|
1183
|
+
return true;
|
|
1184
|
+
if (!a || !b)
|
|
1185
|
+
return false;
|
|
1186
|
+
return eq(a, b);
|
|
1187
|
+
},
|
|
1188
|
+
}]));
|
|
1176
1189
|
const req = computed(() => {
|
|
1177
1190
|
const nr = next();
|
|
1178
1191
|
if (!nr)
|
|
1179
1192
|
return;
|
|
1180
1193
|
return request(nr) ?? undefined;
|
|
1181
|
-
}, {
|
|
1182
|
-
|
|
1194
|
+
}, ...(ngDevMode ? [{ debugName: "req", equal: requestEqual }] : [{
|
|
1195
|
+
equal: requestEqual,
|
|
1196
|
+
}]));
|
|
1197
|
+
const lastValue = linkedSignal({
|
|
1198
|
+
source: next,
|
|
1199
|
+
computation: (next, prev) => {
|
|
1200
|
+
if (next === null && !!prev)
|
|
1201
|
+
return prev.value;
|
|
1202
|
+
return next;
|
|
1203
|
+
},
|
|
1183
1204
|
});
|
|
1205
|
+
const lastValueRequest = computed(() => {
|
|
1206
|
+
const nr = lastValue();
|
|
1207
|
+
if (!nr)
|
|
1208
|
+
return;
|
|
1209
|
+
return request(nr) ?? undefined;
|
|
1210
|
+
}, ...(ngDevMode ? [{ debugName: "lastValueRequest", equal: requestEqual }] : [{
|
|
1211
|
+
equal: requestEqual,
|
|
1212
|
+
}]));
|
|
1213
|
+
const cb = createCircuitBreaker(options?.circuitBreaker === true
|
|
1214
|
+
? undefined
|
|
1215
|
+
: (options?.circuitBreaker ?? false), options?.injector);
|
|
1184
1216
|
const resource = queryResource(req, {
|
|
1185
1217
|
...rest,
|
|
1218
|
+
circuitBreaker: cb,
|
|
1186
1219
|
defaultValue: null, // doesnt matter since .value is not accessible
|
|
1187
1220
|
});
|
|
1188
1221
|
let ctx = undefined;
|
|
@@ -1227,6 +1260,8 @@ function mutationResource(request, options = {}) {
|
|
|
1227
1260
|
next.set(value);
|
|
1228
1261
|
},
|
|
1229
1262
|
current: next,
|
|
1263
|
+
// redeclare disabled with last value so that it is not affected by the resource's internal disablement logic
|
|
1264
|
+
disabled: computed(() => cb.isOpen() || lastValueRequest() === undefined),
|
|
1230
1265
|
};
|
|
1231
1266
|
}
|
|
1232
1267
|
|