Skip to content

Commit fee6722

Browse files
Add timestamps to cache entries and server events (#19976)
1 parent 7f2d515 commit fee6722

File tree

8 files changed

+43
-21
lines changed

8 files changed

+43
-21
lines changed

src/Umbraco.Web.UI.Client/src/packages/data-type/repository/detail/server-data-source/data-type-detail.server.request-manager.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@ import {
99
} from '@umbraco-cms/backoffice/external/backend-api';
1010
import {
1111
UmbManagementApiDetailDataRequestManager,
12-
UmbManagementApiInflightRequestCache,
12+
UmbManagementApiInFlightRequestCache,
1313
} from '@umbraco-cms/backoffice/management-api';
1414

1515
export class UmbManagementApiDataTypeDetailDataRequestManager extends UmbManagementApiDetailDataRequestManager<
1616
DataTypeResponseModel,
1717
UpdateDataTypeRequestModel,
1818
CreateDataTypeRequestModel
1919
> {
20-
static #inflightRequestCache = new UmbManagementApiInflightRequestCache<DataTypeResponseModel>();
20+
static #inflightRequestCache = new UmbManagementApiInFlightRequestCache<DataTypeResponseModel>();
2121

2222
constructor(host: UmbControllerHost) {
2323
super(host, {

src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/detail/server-data-source/document-type-detail.server.request-manager.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@ import {
99
} from '@umbraco-cms/backoffice/external/backend-api';
1010
import {
1111
UmbManagementApiDetailDataRequestManager,
12-
UmbManagementApiInflightRequestCache,
12+
UmbManagementApiInFlightRequestCache,
1313
} from '@umbraco-cms/backoffice/management-api';
1414

1515
export class UmbManagementApiDocumentTypeDetailDataRequestManager extends UmbManagementApiDetailDataRequestManager<
1616
DocumentTypeResponseModel,
1717
UpdateDocumentTypeRequestModel,
1818
CreateDocumentTypeRequestModel
1919
> {
20-
static #inflightRequestCache = new UmbManagementApiInflightRequestCache<DocumentTypeResponseModel>();
20+
static #inflightRequestCache = new UmbManagementApiInFlightRequestCache<DocumentTypeResponseModel>();
2121

2222
constructor(host: UmbControllerHost) {
2323
super(host, {

src/Umbraco.Web.UI.Client/src/packages/management-api/detail/cache.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
// Keep internal
2-
interface UmbCacheEntryModel<DetailDataModelType> {
2+
interface UmbDetailCacheEntryModel<DetailDataModelType> {
33
id: string;
44
data: DetailDataModelType;
5+
timestamp: string;
56
}
67

78
/**
@@ -10,7 +11,7 @@ interface UmbCacheEntryModel<DetailDataModelType> {
1011
* @template DetailDataModelType
1112
*/
1213
export class UmbManagementApiDetailDataCache<DetailDataModelType> {
13-
#entries: Map<string, UmbCacheEntryModel<DetailDataModelType>> = new Map();
14+
#entries: Map<string, UmbDetailCacheEntryModel<DetailDataModelType>> = new Map();
1415

1516
/**
1617
* Checks if an entry exists in the cache
@@ -29,9 +30,10 @@ export class UmbManagementApiDetailDataCache<DetailDataModelType> {
2930
* @memberof UmbManagementApiDetailDataCache
3031
*/
3132
set(id: string, data: DetailDataModelType): void {
32-
const cacheEntry: UmbCacheEntryModel<DetailDataModelType> = {
33+
const cacheEntry: UmbDetailCacheEntryModel<DetailDataModelType> = {
3334
id: id,
3435
data,
36+
timestamp: new Date().toISOString(),
3537
};
3638

3739
this.#entries.set(id, cacheEntry);

src/Umbraco.Web.UI.Client/src/packages/management-api/detail/detail-data.request-manager.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { UMB_MANAGEMENT_API_SERVER_EVENT_CONTEXT } from '../server-event/constants.js';
2-
import type { UmbManagementApiInflightRequestCache } from '../inflight-request/cache.js';
2+
import type { UmbManagementApiInFlightRequestCache } from '../inflight-request/cache.js';
33
import type { UmbManagementApiDetailDataCache } from './cache.js';
44
import {
55
tryExecute,
@@ -21,7 +21,7 @@ export interface UmbManagementApiDetailDataRequestManagerArgs<
2121
update: (id: string, data: UpdateRequestModelType) => Promise<UmbApiResponse<{ data: unknown }>>;
2222
delete: (id: string) => Promise<UmbApiResponse<{ data: unknown }>>;
2323
dataCache: UmbManagementApiDetailDataCache<DetailResponseModelType>;
24-
inflightRequestCache: UmbManagementApiInflightRequestCache<DetailResponseModelType>;
24+
inflightRequestCache: UmbManagementApiInFlightRequestCache<DetailResponseModelType>;
2525
}
2626

2727
export class UmbManagementApiDetailDataRequestManager<
@@ -30,7 +30,7 @@ export class UmbManagementApiDetailDataRequestManager<
3030
UpdateRequestModelType,
3131
> extends UmbControllerBase {
3232
#dataCache: UmbManagementApiDetailDataCache<DetailResponseModelType>;
33-
#inflightRequestCache: UmbManagementApiInflightRequestCache<DetailResponseModelType>;
33+
#inflightRequestCache: UmbManagementApiInFlightRequestCache<DetailResponseModelType>;
3434

3535
#create;
3636
#read;
@@ -86,11 +86,13 @@ export class UmbManagementApiDetailDataRequestManager<
8686
const hasInflightRequest = this.#inflightRequestCache.has(inflightCacheKey);
8787

8888
const request = hasInflightRequest
89-
? this.#inflightRequestCache.get(inflightCacheKey)
89+
? this.#inflightRequestCache.get(inflightCacheKey)?.requestPromise
9090
: tryExecute(this, this.#read(id));
9191

9292
if (!request) {
93-
throw new Error(`Failed to create or retrieve 'read' request for ID: ${id} (cache key: ${inflightCacheKey}). Aborting read.`);
93+
throw new Error(
94+
`Failed to create or retrieve 'read' request for ID: ${id} (cache key: ${inflightCacheKey}). Aborting read.`,
95+
);
9496
}
9597

9698
this.#inflightRequestCache.set(inflightCacheKey, request);

src/Umbraco.Web.UI.Client/src/packages/management-api/inflight-request/cache.ts

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
import type { UmbApiResponse } from '@umbraco-cms/backoffice/resources';
22

3+
interface UmbInFlightRequestCacheEntryModel<ResponseModelType> {
4+
key: string;
5+
requestPromise: Promise<RequestResolvedType<ResponseModelType>>;
6+
timestamp: string;
7+
}
8+
39
// Keep internal
410
type RequestResolvedType<ResponseModelType> = UmbApiResponse<{ data?: ResponseModelType }>;
511

@@ -8,8 +14,8 @@ type RequestResolvedType<ResponseModelType> = UmbApiResponse<{ data?: ResponseMo
814
* @class UmbManagementApiInflightRequestCache
915
* @template ResponseModelType
1016
*/
11-
export class UmbManagementApiInflightRequestCache<ResponseModelType> {
12-
#entries = new Map<string, Promise<RequestResolvedType<ResponseModelType>>>();
17+
export class UmbManagementApiInFlightRequestCache<ResponseModelType> {
18+
#entries = new Map<string, UmbInFlightRequestCacheEntryModel<ResponseModelType>>();
1319

1420
/**
1521
* Checks if an entry exists in the cache
@@ -28,7 +34,11 @@ export class UmbManagementApiInflightRequestCache<ResponseModelType> {
2834
* @memberof UmbManagementApiInflightRequestCache
2935
*/
3036
set(key: string, promise: Promise<RequestResolvedType<ResponseModelType>>): void {
31-
this.#entries.set(key, promise);
37+
this.#entries.set(key, {
38+
key,
39+
requestPromise: promise,
40+
timestamp: new Date().toISOString(),
41+
});
3242
}
3343

3444
/**
@@ -37,7 +47,7 @@ export class UmbManagementApiInflightRequestCache<ResponseModelType> {
3747
* @returns {Promise<RequestResolvedType<ResponseModelType>> | undefined} - The cached promise or undefined if not found
3848
* @memberof UmbManagementApiInflightRequestCache
3949
*/
40-
get(key: string): Promise<RequestResolvedType<ResponseModelType>> | undefined {
50+
get(key: string): UmbInFlightRequestCacheEntryModel<ResponseModelType> | undefined {
4151
return this.#entries.get(key);
4252
}
4353

src/Umbraco.Web.UI.Client/src/packages/management-api/item/cache.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
// Keep internal
2-
interface UmbCacheEntryModel<ItemDataModelType> {
2+
interface UmbItemCacheEntryModel<ItemDataModelType> {
33
id: string;
44
data: ItemDataModelType;
5+
timestamp: string;
56
}
67

78
/**
@@ -10,7 +11,7 @@ interface UmbCacheEntryModel<ItemDataModelType> {
1011
* @template ItemDataModelType
1112
*/
1213
export class UmbManagementApiItemDataCache<ItemDataModelType> {
13-
#entries: Map<string, UmbCacheEntryModel<ItemDataModelType>> = new Map();
14+
#entries: Map<string, UmbItemCacheEntryModel<ItemDataModelType>> = new Map();
1415

1516
/**
1617
* Checks if an entry exists in the cache
@@ -29,9 +30,10 @@ export class UmbManagementApiItemDataCache<ItemDataModelType> {
2930
* @memberof UmbManagementApiItemDataCache
3031
*/
3132
set(id: string, data: ItemDataModelType): void {
32-
const cacheEntry: UmbCacheEntryModel<ItemDataModelType> = {
33+
const cacheEntry: UmbItemCacheEntryModel<ItemDataModelType> = {
3334
id: id,
3435
data,
36+
timestamp: new Date().toISOString(),
3537
};
3638

3739
this.#entries.set(id, cacheEntry);

src/Umbraco.Web.UI.Client/src/packages/management-api/server-event/global-context/server-event.context.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,13 @@ export class UmbManagementApiServerEventContext extends UmbContextBase {
9494
})
9595
.build();
9696

97-
this.#connection.on('notify', (payload: UmbManagementApiServerEventModel) => {
98-
this.#events.next(payload);
97+
this.#connection.on('notify', (payload) => {
98+
const event: UmbManagementApiServerEventModel = {
99+
...payload,
100+
clientTimestamp: new Date().toISOString(),
101+
};
102+
103+
this.#events.next(event);
99104
});
100105

101106
this.#connection

src/Umbraco.Web.UI.Client/src/packages/management-api/server-event/global-context/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@ export interface UmbManagementApiServerEventModel {
22
eventSource: string;
33
eventType: string;
44
key: string;
5+
clientTimestamp: string;
56
}

0 commit comments

Comments
 (0)