@sanity/sdk 2.15.0 → 2.16.0
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/_chunks-dts/createGroqSearchFilter.d.ts +5 -4
- package/dist/_chunks-dts/createGroqSearchFilter.d.ts.map +1 -1
- package/dist/_chunks-es/createGroqSearchFilter.js +152 -148
- package/dist/_chunks-es/createGroqSearchFilter.js.map +1 -1
- package/dist/_chunks-es/version.js +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/package.json +12 -12
- package/src/auth/authStore.test.ts +1 -1
- package/src/auth/handleAuthCallback.test.ts +1 -1
- package/src/auth/refreshStampedToken.test.ts +199 -477
- package/src/auth/refreshStampedToken.ts +67 -195
- package/src/client/liveEvents.test.ts +151 -0
- package/src/client/liveEvents.ts +107 -0
- package/src/document/sharedListener.test.ts +1 -0
- package/src/document/sharedListener.ts +2 -0
- package/src/query/queryStore.test.ts +232 -38
- package/src/query/queryStore.ts +47 -47
- package/src/query/reducers.test.ts +0 -42
- package/src/query/reducers.ts +0 -16
- package/src/releases/getPerspectiveState.test.ts +3 -8
- package/src/releases/getPerspectiveState.ts +6 -19
- package/src/releases/observeReleases.test.ts +127 -0
- package/src/releases/observeReleases.ts +102 -0
- package/src/releases/releasesStore.test.ts +51 -53
- package/src/releases/releasesStore.ts +32 -32
- package/src/releases/utils/sortReleases.test.ts +36 -0
- package/src/releases/utils/sortReleases.ts +14 -9
|
@@ -787,13 +787,14 @@ declare function getQueryState(instance: SanityInstance, queryOptions: QueryOpti
|
|
|
787
787
|
* Resolves the result of a query without registering a lasting subscriber.
|
|
788
788
|
*
|
|
789
789
|
* This function fetches the result of a GROQ query and returns a promise that resolves with the query result.
|
|
790
|
-
*
|
|
791
|
-
*
|
|
792
|
-
*
|
|
790
|
+
* It registers a temporary subscriber for the lifetime of the resolution (released shortly after the promise
|
|
791
|
+
* settles), so the query state participates in normal cleanup even when no lasting subscriber ever attaches —
|
|
792
|
+
* e.g. when a suspended component errors before committing. This makes it ideal for use with React Suspense,
|
|
793
|
+
* where the returned promise is thrown to delay rendering until the query result becomes available.
|
|
793
794
|
* Once the promise resolves, it is expected that a real subscriber will be added via `getQueryState` to manage ongoing updates.
|
|
794
795
|
*
|
|
795
796
|
* Additionally, an optional AbortSignal can be provided to cancel the query and immediately clear the associated state
|
|
796
|
-
* if there are no active subscribers.
|
|
797
|
+
* if there are no other active subscribers.
|
|
797
798
|
*
|
|
798
799
|
* @beta
|
|
799
800
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createGroqSearchFilter.d.ts","names":[],"sources":["../../src/config/authConfig.ts","../../src/config/sanityConfig.ts","../../src/auth/authMode.ts","../../src/store/createSanityInstance.ts","../../src/store/createStoreState.ts","../../src/store/defineStore.ts","../../src/store/createActionBinder.ts","../../src/auth/authStateType.ts","../../src/auth/authStore.ts","../../src/auth/utils.ts","../../src/preview/previewConstants.ts","../../src/projection/types.ts","../../src/preview/types.ts","../../src/preview/previewProjectionUtils.ts","../../src/store/createStateSourceAction.ts","../../src/query/queryStore.ts","../../src/users/types.ts","../../src/users/reducers.ts","../../src/utils/createGroqSearchFilter.ts"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"createGroqSearchFilter.d.ts","names":[],"sources":["../../src/config/authConfig.ts","../../src/config/sanityConfig.ts","../../src/auth/authMode.ts","../../src/store/createSanityInstance.ts","../../src/store/createStoreState.ts","../../src/store/defineStore.ts","../../src/store/createActionBinder.ts","../../src/auth/authStateType.ts","../../src/auth/authStore.ts","../../src/auth/utils.ts","../../src/preview/previewConstants.ts","../../src/projection/types.ts","../../src/preview/types.ts","../../src/preview/previewProjectionUtils.ts","../../src/store/createStateSourceAction.ts","../../src/query/queryStore.ts","../../src/users/types.ts","../../src/users/reducers.ts","../../src/utils/createGroqSearchFilter.ts"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createImageUrlBuilder } from "@sanity/image-url";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { Observable, map, distinctUntilChanged, shareReplay, skip, defer, finalize, filter, exhaustMap, timer, switchMap, takeWhile, catchError, EMPTY, fromEvent, retry, BehaviorSubject, combineLatest, startWith, tap, NEVER, first, firstValueFrom, race, pairwise, mergeMap, groupBy, of, share } from "rxjs";
|
|
3
|
+
import { createClient, CorsOriginError, DisconnectError, ConnectionFailedError } from "@sanity/client";
|
|
4
4
|
import { devtools } from "zustand/middleware";
|
|
5
5
|
import { createStore } from "zustand/vanilla";
|
|
6
6
|
import { createSelector } from "reselect";
|
|
@@ -361,27 +361,7 @@ function getAuthLogger(instance) {
|
|
|
361
361
|
}
|
|
362
362
|
}), loggers.set(instance, logger)), logger;
|
|
363
363
|
}
|
|
364
|
-
const REFRESH_INTERVAL = 720 * 60 * 1e3
|
|
365
|
-
function getLastRefreshTime(storageArea, storageKey) {
|
|
366
|
-
try {
|
|
367
|
-
const data = storageArea?.getItem(`${storageKey}_last_refresh`), parsed = data ? parseInt(data, 10) : 0;
|
|
368
|
-
return isNaN(parsed) ? 0 : parsed;
|
|
369
|
-
} catch {
|
|
370
|
-
return 0;
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
function setLastRefreshTime(storageArea, storageKey) {
|
|
374
|
-
try {
|
|
375
|
-
storageArea?.setItem(`${storageKey}_last_refresh`, Date.now().toString());
|
|
376
|
-
} catch {
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
function getNextRefreshDelay(storageArea, storageKey) {
|
|
380
|
-
const lastRefresh = getLastRefreshTime(storageArea, storageKey);
|
|
381
|
-
if (!lastRefresh) return 0;
|
|
382
|
-
const now = Date.now(), nextRefreshTime = lastRefresh + REFRESH_INTERVAL;
|
|
383
|
-
return Math.max(0, nextRefreshTime - now);
|
|
384
|
-
}
|
|
364
|
+
const REFRESH_INTERVAL = 720 * 60 * 1e3;
|
|
385
365
|
function createTokenRefreshStream(token, clientFactory, apiHost) {
|
|
386
366
|
return new Observable((subscriber) => {
|
|
387
367
|
const subscription = clientFactory({
|
|
@@ -403,27 +383,6 @@ function createTokenRefreshStream(token, clientFactory, apiHost) {
|
|
|
403
383
|
return () => subscription.unsubscribe();
|
|
404
384
|
});
|
|
405
385
|
}
|
|
406
|
-
async function acquireTokenRefreshLock(refreshFn, storageArea, storageKey) {
|
|
407
|
-
if (!navigator.locks)
|
|
408
|
-
return console.warn("Web Locks API not supported. Proceeding with uncoordinated refresh."), await refreshFn(), setLastRefreshTime(storageArea, storageKey), !0;
|
|
409
|
-
try {
|
|
410
|
-
return await navigator.locks.request(LOCK_NAME, { mode: "exclusive" }, async (lock) => {
|
|
411
|
-
if (!lock) return !1;
|
|
412
|
-
for (; ; ) {
|
|
413
|
-
const delay = getNextRefreshDelay(storageArea, storageKey);
|
|
414
|
-
delay > 0 && await new Promise((resolve) => setTimeout(resolve, delay));
|
|
415
|
-
try {
|
|
416
|
-
await refreshFn(), setLastRefreshTime(storageArea, storageKey);
|
|
417
|
-
} catch (error) {
|
|
418
|
-
console.error("Token refresh failed within lock:", error);
|
|
419
|
-
}
|
|
420
|
-
await new Promise((resolve) => setTimeout(resolve, REFRESH_INTERVAL));
|
|
421
|
-
}
|
|
422
|
-
}) === !0;
|
|
423
|
-
} catch (error) {
|
|
424
|
-
return console.error("Failed to request token refresh lock:", error), !1;
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
386
|
function shouldRefreshToken(lastRefresh) {
|
|
428
387
|
return lastRefresh ? Date.now() - lastRefresh >= REFRESH_INTERVAL : !0;
|
|
429
388
|
}
|
|
@@ -433,35 +392,15 @@ const refreshStampedToken = ({
|
|
|
433
392
|
}) => {
|
|
434
393
|
const logger = getAuthLogger(instance), { clientFactory, apiHost, storageArea, storageKey } = state.get().options;
|
|
435
394
|
return state.observable.pipe(
|
|
436
|
-
map((storeState) =>
|
|
437
|
-
authState: storeState.authState,
|
|
438
|
-
dashboardContext: storeState.dashboardContext
|
|
439
|
-
})),
|
|
395
|
+
map((storeState) => storeState.authState),
|
|
440
396
|
filter(
|
|
441
|
-
(
|
|
442
|
-
),
|
|
443
|
-
distinctUntilChanged(
|
|
444
|
-
(prev, curr) => prev.authState.type === curr.authState.type && prev.authState.token === curr.authState.token && // Only care about token for distinctness here
|
|
445
|
-
prev.dashboardContext === curr.dashboardContext
|
|
397
|
+
(authState) => authState.type === AuthStateType.LOGGED_IN
|
|
446
398
|
),
|
|
447
|
-
|
|
448
|
-
filter((
|
|
399
|
+
distinctUntilChanged((prev, curr) => prev.token === curr.token),
|
|
400
|
+
filter((authState) => authState.token.includes("-st")),
|
|
449
401
|
// Ensure we only try to refresh stamped tokens
|
|
450
|
-
exhaustMap(
|
|
451
|
-
|
|
452
|
-
const currentState = state.get();
|
|
453
|
-
if (currentState.authState.type !== AuthStateType.LOGGED_IN)
|
|
454
|
-
throw logger.debug("Token refresh aborted - user logged out"), new Error("User logged out before refresh could complete");
|
|
455
|
-
const currentToken = currentState.authState.token;
|
|
456
|
-
logger.debug("Refreshing stamped token");
|
|
457
|
-
const response = await firstValueFrom(
|
|
458
|
-
createTokenRefreshStream(currentToken, clientFactory, apiHost)
|
|
459
|
-
);
|
|
460
|
-
logger.info("Token refreshed successfully"), state.set("setRefreshStampedToken", (prev) => ({
|
|
461
|
-
authState: prev.authState.type === AuthStateType.LOGGED_IN ? { ...prev.authState, token: response.token } : prev.authState
|
|
462
|
-
})), storageArea?.setItem(storageKey, JSON.stringify({ token: response.token }));
|
|
463
|
-
};
|
|
464
|
-
return storeState.dashboardContext ? new Observable((subscriber) => {
|
|
402
|
+
exhaustMap(
|
|
403
|
+
() => new Observable((subscriber) => {
|
|
465
404
|
const visibilityHandler = () => {
|
|
466
405
|
const currentState = state.get();
|
|
467
406
|
document.visibilityState === "visible" && currentState.authState.type === AuthStateType.LOGGED_IN && shouldRefreshToken(currentState.authState.lastTokenRefresh) && createTokenRefreshStream(
|
|
@@ -506,16 +445,8 @@ const refreshStampedToken = ({
|
|
|
506
445
|
}).pipe(
|
|
507
446
|
takeWhile(() => state.get().authState.type === AuthStateType.LOGGED_IN),
|
|
508
447
|
map((response) => ({ token: response.token }))
|
|
509
|
-
)
|
|
510
|
-
|
|
511
|
-
map(() => {
|
|
512
|
-
const currentState = state.get().authState;
|
|
513
|
-
if (currentState.type !== AuthStateType.LOGGED_IN)
|
|
514
|
-
throw new Error("User logged out before refresh could complete");
|
|
515
|
-
return { token: currentState.token };
|
|
516
|
-
})
|
|
517
|
-
);
|
|
518
|
-
})
|
|
448
|
+
)
|
|
449
|
+
)
|
|
519
450
|
).subscribe({
|
|
520
451
|
next: (response) => {
|
|
521
452
|
logger.debug("Token refresh completed, updating state"), state.set("setRefreshStampedToken", (prev) => ({
|
|
@@ -1161,22 +1092,95 @@ function transformProjectionToPreview(instance, projectionResult, resource) {
|
|
|
1161
1092
|
...projectionResult._status && { _status: projectionResult._status }
|
|
1162
1093
|
};
|
|
1163
1094
|
}
|
|
1095
|
+
const LIVE_EVENTS_API_VERSION = "v2025-05-06", LIVE_EVENTS_RETRY_DELAY = 1e3;
|
|
1096
|
+
function observeLiveEvents(instance, { resource, onCorsError }) {
|
|
1097
|
+
return getClientState(instance, {
|
|
1098
|
+
apiVersion: LIVE_EVENTS_API_VERSION,
|
|
1099
|
+
resource
|
|
1100
|
+
}).observable.pipe(
|
|
1101
|
+
switchMap(
|
|
1102
|
+
(client) => defer(
|
|
1103
|
+
() => client.live.events({ includeDrafts: !!client.config().token, tag: "live-events" })
|
|
1104
|
+
).pipe(
|
|
1105
|
+
catchError((error) => {
|
|
1106
|
+
if (error instanceof CorsOriginError)
|
|
1107
|
+
return onCorsError(error), EMPTY;
|
|
1108
|
+
if (error instanceof DisconnectError)
|
|
1109
|
+
return EMPTY;
|
|
1110
|
+
if (error instanceof ConnectionFailedError && typeof error.status == "number" && error.status >= 400 && error.status < 500)
|
|
1111
|
+
return EMPTY;
|
|
1112
|
+
throw error;
|
|
1113
|
+
}),
|
|
1114
|
+
// Server-initiated live errors (e.g. ChannelError, MessageError) are
|
|
1115
|
+
// retried, not surfaced. Dropped connections are already reconnected
|
|
1116
|
+
// inside @sanity/client.
|
|
1117
|
+
retry({ delay: LIVE_EVENTS_RETRY_DELAY })
|
|
1118
|
+
)
|
|
1119
|
+
),
|
|
1120
|
+
filter((e) => e.type === "message")
|
|
1121
|
+
);
|
|
1122
|
+
}
|
|
1123
|
+
const RELEASES_QUERY = "releases::all()", RELEASES_API_VERSION = "v2025-05-06";
|
|
1124
|
+
function observeReleases(instance, { resource, onCorsError }) {
|
|
1125
|
+
return getClientState(instance, {
|
|
1126
|
+
apiVersion: RELEASES_API_VERSION,
|
|
1127
|
+
resource
|
|
1128
|
+
}).observable.pipe(
|
|
1129
|
+
switchMap((client) => {
|
|
1130
|
+
const syncTags$ = new BehaviorSubject(void 0);
|
|
1131
|
+
return combineLatest([
|
|
1132
|
+
observeLiveEvents(instance, { resource, onCorsError }).pipe(startWith(void 0)),
|
|
1133
|
+
syncTags$
|
|
1134
|
+
]).pipe(
|
|
1135
|
+
filter(
|
|
1136
|
+
([message, syncTags]) => message === void 0 || message.tags.some((tag) => syncTags?.includes(tag))
|
|
1137
|
+
),
|
|
1138
|
+
map(([message]) => message?.id),
|
|
1139
|
+
distinctUntilChanged()
|
|
1140
|
+
).pipe(
|
|
1141
|
+
switchMap(
|
|
1142
|
+
(lastLiveEventId) => client.observable.fetch(
|
|
1143
|
+
RELEASES_QUERY,
|
|
1144
|
+
{},
|
|
1145
|
+
{
|
|
1146
|
+
perspective: "raw",
|
|
1147
|
+
filterResponse: !1,
|
|
1148
|
+
returnQuery: !1,
|
|
1149
|
+
lastLiveEventId,
|
|
1150
|
+
tag: "releases"
|
|
1151
|
+
}
|
|
1152
|
+
)
|
|
1153
|
+
),
|
|
1154
|
+
tap((response) => {
|
|
1155
|
+
syncTags$.next(response.syncTags);
|
|
1156
|
+
}),
|
|
1157
|
+
map((response) => response.result)
|
|
1158
|
+
);
|
|
1159
|
+
}),
|
|
1160
|
+
// Emit synchronously on subscribe (mirroring StateSource semantics, which
|
|
1161
|
+
// the releases store previously consumed) so the store can immediately
|
|
1162
|
+
// record an empty list: consumers distinguish "no releases yet" from
|
|
1163
|
+
// "never loaded", and the React hooks don't suspend on first load.
|
|
1164
|
+
startWith(void 0)
|
|
1165
|
+
);
|
|
1166
|
+
}
|
|
1164
1167
|
function sortReleases(releases = []) {
|
|
1165
1168
|
return [...releases].sort((a, b) => {
|
|
1166
|
-
|
|
1169
|
+
const aType = a.metadata?.releaseType, bType = b.metadata?.releaseType;
|
|
1170
|
+
if (aType === "undecided" && bType !== "undecided")
|
|
1167
1171
|
return -1;
|
|
1168
|
-
if (
|
|
1172
|
+
if (aType !== "undecided" && bType === "undecided")
|
|
1169
1173
|
return 1;
|
|
1170
|
-
if (
|
|
1174
|
+
if (aType === "undecided" && bType === "undecided")
|
|
1171
1175
|
return new Date(b._createdAt).getTime() - new Date(a._createdAt).getTime();
|
|
1172
|
-
if (
|
|
1173
|
-
const aPublishAt = a.publishAt || a.metadata
|
|
1176
|
+
if (aType === "scheduled" && bType === "scheduled") {
|
|
1177
|
+
const aPublishAt = a.publishAt || a.metadata?.intendedPublishAt;
|
|
1174
1178
|
if (!aPublishAt)
|
|
1175
1179
|
return 1;
|
|
1176
|
-
const bPublishAt = b.publishAt || b.metadata
|
|
1180
|
+
const bPublishAt = b.publishAt || b.metadata?.intendedPublishAt;
|
|
1177
1181
|
return bPublishAt ? new Date(bPublishAt).getTime() - new Date(aPublishAt).getTime() : -1;
|
|
1178
1182
|
}
|
|
1179
|
-
return
|
|
1183
|
+
return aType === "asap" && bType !== "asap" ? 1 : aType !== "asap" && bType === "asap" ? -1 : aType === "asap" && bType === "asap" ? new Date(b._createdAt).getTime() - new Date(a._createdAt).getTime() : 0;
|
|
1180
1184
|
});
|
|
1181
1185
|
}
|
|
1182
1186
|
const ARCHIVED_RELEASE_STATES = ["archived", "published"], STABLE_EMPTY_RELEASES = [], releasesStore = {
|
|
@@ -1192,7 +1196,10 @@ const ARCHIVED_RELEASE_STATES = ["archived", "published"], STABLE_EMPTY_RELEASES
|
|
|
1192
1196
|
}, _getActiveReleasesState = bindActionByResource(
|
|
1193
1197
|
releasesStore,
|
|
1194
1198
|
createStateSourceAction({
|
|
1195
|
-
selector: ({ state }
|
|
1199
|
+
selector: ({ state }) => {
|
|
1200
|
+
if (state.error) throw state.error;
|
|
1201
|
+
return state.activeReleases;
|
|
1202
|
+
}
|
|
1196
1203
|
})
|
|
1197
1204
|
), getActiveReleasesState = (instance, options) => (
|
|
1198
1205
|
// bindActionByResource keyFn destructures { resource } from the first param, so pass {} when no options
|
|
@@ -1200,31 +1207,31 @@ const ARCHIVED_RELEASE_STATES = ["archived", "published"], STABLE_EMPTY_RELEASES
|
|
|
1200
1207
|
), _getAllReleasesState = bindActionByResource(
|
|
1201
1208
|
releasesStore,
|
|
1202
1209
|
createStateSourceAction({
|
|
1203
|
-
selector: ({ state }
|
|
1210
|
+
selector: ({ state }) => {
|
|
1211
|
+
if (state.error) throw state.error;
|
|
1212
|
+
return state.allReleases;
|
|
1213
|
+
}
|
|
1204
1214
|
})
|
|
1205
|
-
), getAllReleasesState = (instance, options) => _getAllReleasesState(instance, options ?? {}),
|
|
1215
|
+
), getAllReleasesState = (instance, options) => _getAllReleasesState(instance, options ?? {}), subscribeToReleases = ({
|
|
1206
1216
|
instance,
|
|
1207
1217
|
state,
|
|
1208
1218
|
key: { resource }
|
|
1209
|
-
}) => {
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
})
|
|
1226
|
-
).subscribe({ error: (error) => state.set("setError", { error }) });
|
|
1227
|
-
}, DEFAULT_PERSPECTIVE = "drafts", optionsCache = /* @__PURE__ */ new Map(), selectInstancePerspective = (context, _) => context.instance.config.perspective, selectActiveReleases = (context) => context.state.activeReleases, selectOptions = (_context, options) => options, memoizedOptionsSelector = createSelector(
|
|
1219
|
+
}) => observeReleases(instance, {
|
|
1220
|
+
resource,
|
|
1221
|
+
// Surface CORS errors as store state instead of erroring the stream so
|
|
1222
|
+
// they can be handled by the Cors Error component
|
|
1223
|
+
onCorsError: (error) => state.set("setError", { error })
|
|
1224
|
+
}).pipe(
|
|
1225
|
+
map((releases) => {
|
|
1226
|
+
const sorted = sortReleases(releases ?? STABLE_EMPTY_RELEASES).reverse();
|
|
1227
|
+
state.set("setReleases", {
|
|
1228
|
+
allReleases: sorted,
|
|
1229
|
+
activeReleases: sorted.filter(
|
|
1230
|
+
(release) => !ARCHIVED_RELEASE_STATES.includes(release.state)
|
|
1231
|
+
)
|
|
1232
|
+
});
|
|
1233
|
+
})
|
|
1234
|
+
).subscribe({ error: (error) => state.set("setError", { error }) }), DEFAULT_PERSPECTIVE = "drafts", optionsCache = /* @__PURE__ */ new Map(), selectInstancePerspective = (context, _) => context.instance.config.perspective, selectActiveReleases = (context) => context.state.activeReleases, selectOptions = (_context, options) => options, memoizedOptionsSelector = createSelector(
|
|
1228
1235
|
[selectActiveReleases, selectOptions],
|
|
1229
1236
|
(activeReleases, options) => {
|
|
1230
1237
|
if (!options || !activeReleases) return options;
|
|
@@ -1248,12 +1255,13 @@ const ARCHIVED_RELEASE_STATES = ["archived", "published"], STABLE_EMPTY_RELEASES
|
|
|
1248
1255
|
return ["drafts", ...releaseNames.slice(0, index + 1)].filter((name) => !perspective.excludedPerspectives?.includes(name)).reverse();
|
|
1249
1256
|
}
|
|
1250
1257
|
)
|
|
1251
|
-
})
|
|
1252
|
-
let _boundGetPerspectiveState;
|
|
1253
|
-
const getPerspectiveState = (instance, ...rest) => (_boundGetPerspectiveState || (_boundGetPerspectiveState = bindActionByResource(
|
|
1258
|
+
}), _boundGetPerspectiveState = bindActionByResource(
|
|
1254
1259
|
releasesStore,
|
|
1255
1260
|
_getPerspectiveStateSelector
|
|
1256
|
-
)
|
|
1261
|
+
), getPerspectiveState = (instance, ...rest) => (
|
|
1262
|
+
// bindActionByResource keyFn destructures { resource } from the first param, so pass {} when no options
|
|
1263
|
+
_boundGetPerspectiveState(instance, ...rest.length ? rest : [{}])
|
|
1264
|
+
);
|
|
1257
1265
|
function setCleanupTimeout(fn, delay) {
|
|
1258
1266
|
const timer2 = setTimeout(fn, delay), t = timer2;
|
|
1259
1267
|
return typeof t == "object" && t !== null && "unref" in t && typeof t.unref == "function" && t.unref(), timer2;
|
|
@@ -1278,10 +1286,7 @@ const QUERY_STATE_CLEAR_DELAY = 1e3, QUERY_STORE_API_VERSION = "v2025-05-06", QU
|
|
|
1278
1286
|
if (!prevQuery) return prev;
|
|
1279
1287
|
const subscribers = prevQuery.subscribers.filter((id) => id !== subscriptionId);
|
|
1280
1288
|
return subscribers.length ? { ...prev, queries: { ...prev.queries, [key]: { ...prevQuery, subscribers } } } : { ...prev, queries: omitProperty(prev.queries, key) };
|
|
1281
|
-
},
|
|
1282
|
-
const prevQuery = prev.queries[key];
|
|
1283
|
-
return !prevQuery || prevQuery.subscribers.length ? prev : { ...prev, queries: omitProperty(prev.queries, key) };
|
|
1284
|
-
}, initializeQuery = (key) => (prev) => prev.queries[key] ? prev : { ...prev, queries: { ...prev.queries, [key]: { subscribers: [] } } }, EMPTY_ARRAY = [], getQueryKey = (options) => JSON.stringify(options), parseQueryKey = (key) => JSON.parse(key);
|
|
1289
|
+
}, EMPTY_ARRAY = [], getQueryKey = (options) => JSON.stringify(options), parseQueryKey = (key) => JSON.parse(key);
|
|
1285
1290
|
function normalizeOptionsWithPerspective(instance, options) {
|
|
1286
1291
|
if (options.perspective !== void 0) return options;
|
|
1287
1292
|
const instancePerspective = instance.config.perspective;
|
|
@@ -1333,7 +1338,8 @@ const queryStore = {
|
|
|
1333
1338
|
perspective: perspectiveFromOptions,
|
|
1334
1339
|
...restOptions
|
|
1335
1340
|
} = parseQueryKey(group$.key), perspective$ = isReleasePerspective(perspectiveFromOptions) ? getPerspectiveState(instance, {
|
|
1336
|
-
perspective: perspectiveFromOptions
|
|
1341
|
+
perspective: perspectiveFromOptions,
|
|
1342
|
+
resource
|
|
1337
1343
|
}).observable.pipe(filter(Boolean)) : of(perspectiveFromOptions ?? QUERY_STORE_DEFAULT_PERSPECTIVE), client$ = getClientState(instance, {
|
|
1338
1344
|
apiVersion: QUERY_STORE_API_VERSION,
|
|
1339
1345
|
projectId,
|
|
@@ -1354,12 +1360,16 @@ const queryStore = {
|
|
|
1354
1360
|
lastLiveEventId,
|
|
1355
1361
|
tag
|
|
1356
1362
|
})
|
|
1357
|
-
)
|
|
1363
|
+
),
|
|
1364
|
+
tap(({ result, syncTags }) => {
|
|
1365
|
+
state.set("setQueryData", setQueryData(group$.key, result, syncTags));
|
|
1366
|
+
}),
|
|
1367
|
+
// Catch inside the per-event stream: erroring the group pipe would
|
|
1368
|
+
// complete the group's subscription, and since `groupBy` above never
|
|
1369
|
+
// removes its group subjects, re-adding the key would emit into a
|
|
1370
|
+
// subject with no subscribers — the key could never be fetched again.
|
|
1371
|
+
catchError((error) => (state.set("setQueryError", setQueryError(group$.key, error)), EMPTY))
|
|
1358
1372
|
);
|
|
1359
|
-
}),
|
|
1360
|
-
catchError((error) => (state.set("setQueryError", setQueryError(group$.key, error)), EMPTY)),
|
|
1361
|
-
tap(({ result, syncTags }) => {
|
|
1362
|
-
state.set("setQueryData", setQueryData(group$.key, result, syncTags));
|
|
1363
1373
|
})
|
|
1364
1374
|
)
|
|
1365
1375
|
)
|
|
@@ -1368,24 +1378,14 @@ const queryStore = {
|
|
|
1368
1378
|
instance,
|
|
1369
1379
|
key: { resource }
|
|
1370
1380
|
}) => {
|
|
1371
|
-
const liveMessages$ =
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
catchError((error) => {
|
|
1380
|
-
if (error instanceof CorsOriginError)
|
|
1381
|
-
return state.set("setError", { error }), EMPTY;
|
|
1382
|
-
throw error;
|
|
1383
|
-
})
|
|
1384
|
-
)
|
|
1385
|
-
),
|
|
1386
|
-
share(),
|
|
1387
|
-
filter((e) => e.type === "message")
|
|
1388
|
-
);
|
|
1381
|
+
const liveMessages$ = observeLiveEvents(instance, {
|
|
1382
|
+
resource,
|
|
1383
|
+
// Surface CORS errors as store state (handled by the Cors Error
|
|
1384
|
+
// component) instead of erroring the stream: a stream error here would
|
|
1385
|
+
// reach the outer subscription's errorHandler, set the store-wide
|
|
1386
|
+
// `state.error`, and permanently brick every query selector.
|
|
1387
|
+
onCorsError: (error) => state.set("setError", { error })
|
|
1388
|
+
}).pipe(share());
|
|
1389
1389
|
return state.observable.pipe(
|
|
1390
1390
|
mergeMap((s) => Object.entries(s.queries)),
|
|
1391
1391
|
groupBy(([key]) => key),
|
|
@@ -1433,7 +1433,9 @@ function resolveQuery(...args) {
|
|
|
1433
1433
|
const _resolveQuery = bindActionByResource(
|
|
1434
1434
|
queryStore,
|
|
1435
1435
|
({ state, instance }, { signal, ...options }) => {
|
|
1436
|
-
const normalized = normalizeOptionsWithPerspective(instance, options), { getCurrent } = getQueryState(instance, normalized), key = getQueryKey(normalized),
|
|
1436
|
+
const normalized = normalizeOptionsWithPerspective(instance, options), { getCurrent } = getQueryState(instance, normalized), key = getQueryKey(normalized), subscriptionId = insecureRandomId();
|
|
1437
|
+
state.set("addSubscriber", addSubscriber(key, subscriptionId));
|
|
1438
|
+
const aborted$ = signal ? new Observable((observer) => {
|
|
1437
1439
|
const cleanup = () => {
|
|
1438
1440
|
signal.removeEventListener("abort", listener);
|
|
1439
1441
|
}, listener = () => {
|
|
@@ -1442,15 +1444,17 @@ const _resolveQuery = bindActionByResource(
|
|
|
1442
1444
|
return signal.addEventListener("abort", listener), cleanup;
|
|
1443
1445
|
}).pipe(
|
|
1444
1446
|
catchError((error) => {
|
|
1445
|
-
throw error instanceof Error && error.name === "AbortError" && state.set("
|
|
1447
|
+
throw error instanceof Error && error.name === "AbortError" && state.set("removeSubscriber", removeSubscriber(key, subscriptionId)), error;
|
|
1446
1448
|
})
|
|
1447
|
-
) : NEVER
|
|
1448
|
-
state.set("initializeQuery", initializeQuery(key));
|
|
1449
|
-
const resolved$ = state.observable.pipe(
|
|
1449
|
+
) : NEVER, resolved$ = state.observable.pipe(
|
|
1450
1450
|
map(getCurrent),
|
|
1451
1451
|
first((i) => i !== void 0)
|
|
1452
|
-
)
|
|
1453
|
-
|
|
1452
|
+
), promise = firstValueFrom(race([resolved$, aborted$])), releaseSubscriber = () => {
|
|
1453
|
+
setCleanupTimeout(() => {
|
|
1454
|
+
state.set("removeSubscriber", removeSubscriber(key, subscriptionId));
|
|
1455
|
+
}, QUERY_STATE_CLEAR_DELAY);
|
|
1456
|
+
};
|
|
1457
|
+
return promise.then(releaseSubscriber, releaseSubscriber), promise;
|
|
1454
1458
|
}
|
|
1455
1459
|
), API_VERSION = "vX", PROJECT_API_VERSION = "2025-07-18", USERS_STATE_CLEAR_DELAY = 5e3, DEFAULT_USERS_BATCH_SIZE = 100, getUsersKey = (instance, {
|
|
1456
1460
|
resourceType,
|