@salesforce/lds-runtime-aura 1.456.0 → 1.458.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.
@@ -28,7 +28,7 @@ import { assertIsValid, JsonSchemaViolationError, MissingRequiredPropertyError }
28
28
  import auraNetworkAdapter, { dispatchAuraAction, defaultActionConfig, instrument as instrument$1, forceRecordTransactionsDisabled as forceRecordTransactionsDisabled$1, ldsNetworkAdapterInstrument, CrudEventState, CrudEventType, UIAPI_RECORDS_PATH, UIAPI_RELATED_LIST_RECORDS_BATCH_PATH, UIAPI_RELATED_LIST_RECORDS_PATH } from 'force/ldsNetwork';
29
29
  import { ThirdPartyTracker } from 'instrumentation:thirdPartyTracker';
30
30
  import { markStart, markEnd, counter, registerCacheStats, perfStart, perfEnd, registerPeriodicLogger, interaction, timer, mark } from 'instrumentation/service';
31
- import { instrument as instrument$2, setupLexNetworkAdapter } from 'force/ldsNetworkFetch';
31
+ import { instrument as instrument$2, isCsrfMethod, getFetchMethod, isRetryableMethod, isRetryableReadPost, compilePathMatchers, setupLexNetworkAdapter, UIAPI_PUBLIC_PATHS, UIAPI_PRIVATE_PATHS, isRetryableOperationType } from 'force/ldsNetworkFetch';
32
32
  import { REFRESH_ADAPTER_EVENT, ADAPTER_UNFULFILLED_ERROR, instrument as instrument$3 } from 'force/ldsBindings';
33
33
  import { stateManagerInstrumentation, OperationTypeValue, LRUCache, instrumentAdapter, instrumentLuvio, logMessage as logMessage$1, setupInstrumentation as setupInstrumentation$1, logObjectInfoChanged as logObjectInfoChanged$1, updatePercentileHistogramMetric, incrementCounterMetric, incrementGetRecordNotifyChangeAllowCount, incrementGetRecordNotifyChangeDropCount, incrementNotifyRecordUpdateAvailableAllowCount, incrementNotifyRecordUpdateAvailableDropCount, setLdsAdaptersUiapiInstrumentation, logError as logError$2, setLdsNetworkAdapterInstrumentation, executeAsyncActivity, METRIC_KEYS, onIdleDetected } from 'force/ldsInstrumentation';
34
34
  import { instrument as instrument$4 } from 'force/adsBridge';
@@ -1447,10 +1447,23 @@ const _FetchNetworkCommand = class _FetchNetworkCommand extends NetworkCommand {
1447
1447
  this.services = services;
1448
1448
  this.additionalNullResponses = [];
1449
1449
  }
1450
+ /**
1451
+ * The command's operation type. Generated command subclasses override this
1452
+ * getter with their concrete operation (see the generator's
1453
+ * `generateOperationType`); the base returns `undefined` for commands that
1454
+ * don't declare one (e.g. hand-written commands). Transport-layer
1455
+ * interceptors use it to tell a read (`query`) apart from a write — see
1456
+ * `fetch`, which folds it into the context seed.
1457
+ */
1458
+ get operationType() {
1459
+ return void 0;
1460
+ }
1450
1461
  fetch(contextSeed) {
1451
1462
  try {
1452
1463
  const [input, init] = this.fetchParams;
1453
- const initWithSeed = contextSeed === void 0 ? init : { ...init, __contextSeed: contextSeed };
1464
+ const operationType = this.operationType;
1465
+ const seed = operationType === void 0 ? contextSeed : { operationType, ...contextSeed };
1466
+ const initWithSeed = seed === void 0 ? init : { ...init, __contextSeed: seed };
1454
1467
  const fetchCall = initWithSeed === void 0 ? this.services.fetch(input) : this.services.fetch(input, initWithSeed);
1455
1468
  return this.convertFetchResponseToData(fetchCall);
1456
1469
  } catch (reason) {
@@ -2589,7 +2602,7 @@ function buildServiceDescriptor$d(luvio) {
2589
2602
  },
2590
2603
  };
2591
2604
  }
2592
- // version: 1.456.0-cef836b978
2605
+ // version: 1.458.0-5aef0572f2
2593
2606
 
2594
2607
  class AuraGraphQLNormalizedCacheControlCommand extends AuraNormalizedCacheControlCommand {
2595
2608
  constructor(config, documentRootType, services) {
@@ -2928,7 +2941,7 @@ function buildServiceDescriptor$9(notifyRecordUpdateAvailable, getNormalizedLuvi
2928
2941
  },
2929
2942
  };
2930
2943
  }
2931
- // version: 1.456.0-cef836b978
2944
+ // version: 1.458.0-5aef0572f2
2932
2945
 
2933
2946
  class RetryService {
2934
2947
  constructor(defaultRetryPolicy) {
@@ -5934,7 +5947,7 @@ function getEnvironmentSetting(name) {
5934
5947
  }
5935
5948
  return undefined;
5936
5949
  }
5937
- // version: 1.456.0-6ed480b93c
5950
+ // version: 1.458.0-6d15707ed2
5938
5951
 
5939
5952
  const auraClientService = getAuraClientService();
5940
5953
  const defaultConfig = {
@@ -6471,45 +6484,6 @@ function getCsrfTokenManager() {
6471
6484
  return cached;
6472
6485
  }
6473
6486
 
6474
- /**
6475
- * Extracts the HTTP method from FetchParameters, matching the Fetch API's own
6476
- * precedence: an options.method override wins over a Request object's method
6477
- * (e.g. `fetch(new Request(url, { method: 'GET' }), { method: 'POST' })`
6478
- * resolves to `POST`).
6479
- */
6480
- function getFetchMethod([urlOrRequest, options]) {
6481
- if (options && 'method' in options) {
6482
- return options.method;
6483
- }
6484
- if (typeof urlOrRequest !== 'string' && 'method' in urlOrRequest) {
6485
- return urlOrRequest.method;
6486
- }
6487
- return undefined;
6488
- }
6489
- /**
6490
- * Only GET requests are safe to replay automatically on 429/503 — replaying a
6491
- * write (POST/PUT/PATCH/DELETE) risks executing a mutation more than once.
6492
- * Shared by both the Luvio and generic-fetch throttling retry policies so the
6493
- * write-guard rule lives in exactly one place.
6494
- */
6495
- function isRetryableMethod(method) {
6496
- return method?.toLowerCase() === 'get';
6497
- }
6498
- /**
6499
- * Determines if the HTTP method requires CSRF protection.
6500
- * Only mutating operations (POST, PUT, PATCH, DELETE) require CSRF tokens.
6501
- */
6502
- function isCsrfMethod(method) {
6503
- if (!method) {
6504
- return false;
6505
- }
6506
- const normalizedMethod = method.toLowerCase();
6507
- return (normalizedMethod === 'post' ||
6508
- normalizedMethod === 'put' ||
6509
- normalizedMethod === 'patch' ||
6510
- normalizedMethod === 'delete');
6511
- }
6512
-
6513
6487
  const CSRF_TOKEN_HEADER = 'X-CSRF-Token';
6514
6488
  /**
6515
6489
  * Resolves the CSRF token manager and returns the current token. Returns
@@ -6964,13 +6938,22 @@ const DEFAULT_CONFIG$2 = {
6964
6938
  jitterPercent: 0.5,
6965
6939
  };
6966
6940
  class LuvioFetchThrottlingRetryPolicy extends RetryPolicy {
6967
- constructor(config = DEFAULT_CONFIG$2, method) {
6941
+ // The request is read-only here: `shouldRetry` only inspects its `method` and
6942
+ // `basePath` to decide replay safety, and neither changes across retries. This
6943
+ // is why we take the plain `ResourceRequest` rather than the mutable-container
6944
+ // pattern the CSRF policy uses — that policy rewrites the request (new token)
6945
+ // between attempts; this one never mutates it.
6946
+ constructor(config = DEFAULT_CONFIG$2, request) {
6968
6947
  super();
6969
6948
  this.config = config;
6970
- this.method = method;
6949
+ this.request = request;
6971
6950
  }
6972
6951
  async shouldRetry(result, context) {
6973
- return (isRetryableMethod(this.method) &&
6952
+ // A request is safe to replay when it's a GET or when its path is a known
6953
+ // read issued over POST (e.g. GraphQL, aggregate-ui, search). Writes stay
6954
+ // non-retryable.
6955
+ return ((isRetryableMethod(this.request?.method) ||
6956
+ isRetryableReadPost(this.request?.basePath)) &&
6974
6957
  (result.status === 429 || result.status === 503) &&
6975
6958
  context.attempt < this.config.maxRetries &&
6976
6959
  context.totalElapsedMs <= this.config.maxTimeToRetry);
@@ -7034,7 +7017,7 @@ function buildLuvioFetchRetryInterceptor() {
7034
7017
  return (request, doFetch) => {
7035
7018
  const csrfPolicy = new LuvioCsrfTokenRetryPolicy();
7036
7019
  const composedPolicy = new ComposedRetryPolicy([
7037
- new LuvioFetchThrottlingRetryPolicy(undefined, request.method),
7020
+ new LuvioFetchThrottlingRetryPolicy(undefined, request),
7038
7021
  csrfPolicy,
7039
7022
  ]);
7040
7023
  const retryService = new RetryService(composedPolicy);
@@ -7148,189 +7131,6 @@ function buildLuvioActionMarksSendInterceptor() {
7148
7131
  function isOneRuntime() {
7149
7132
  return !!globalThis.LWR;
7150
7133
  }
7151
- /**
7152
- * Public UIAPI url paths verified for HTTP transport.
7153
- *
7154
- * Inclusion criteria:
7155
- * 1. The path's underlying Connect resource does NOT carry
7156
- * `clientFilters=@ConnectClientFilters({@ConnectClientFilter(key = "UiTier")...})`.
7157
- * 2. LDS actually invokes this URL via a Luvio adapter wired into
7158
- * `ldsEngineCreator.js` (i.e. there is a corresponding `*AdapterFactory`
7159
- * import). Connect resources with no LDS adapter are intentionally
7160
- * excluded — adding them produces no traffic and just bloats the matcher.
7161
- *
7162
- * Where a single Connect resource exposes multiple URL shapes (e.g. a 4-segment
7163
- * GET form alongside a 3-segment POST form), all forms LDS adapters can hit at
7164
- * runtime are registered.
7165
- */
7166
- const UIAPI_PUBLIC_PATHS = [
7167
- // ----- Object Info -----
7168
- // getObjectInfo — IObjectInfoResource
7169
- '/ui-api/object-info/{objectApiName}',
7170
- // getObjectInfos (batch) — IObjectInfoBatchResource
7171
- '/ui-api/object-info/batch/{objectApiNames}',
7172
- // getPicklistValues — IPicklistValuesResource
7173
- '/ui-api/object-info/{objectApiName}/picklist-values/{recordTypeId}/{fieldApiName}',
7174
- // getPicklistValuesByRecordType — IPicklistValuesByRecordTypeResource
7175
- '/ui-api/object-info/{objectApiName}/picklist-values/{recordTypeId}',
7176
- // ----- Records -----
7177
- // createRecord (POST) — IRecordDataCollectionResource
7178
- '/ui-api/records',
7179
- // getRecord / updateRecord (PATCH) / deleteRecord (DELETE) — IRecordDataResource
7180
- '/ui-api/records/{recordId}',
7181
- // getRecords (batch GET) — IBatchRecordDataResource
7182
- '/ui-api/records/batch/{recordIds}',
7183
- // executeBatchRecordOperations (POST, no recordIds segment) — IBatchRecordResource
7184
- '/ui-api/records/batch',
7185
- // getRecordUi — IRecordUiResource
7186
- '/ui-api/record-ui/{recordIds}',
7187
- // ----- Layout -----
7188
- // getLayout — ILayoutResource
7189
- '/ui-api/layout/{objectApiName}',
7190
- // getPathLayout — IPathLayoutResource
7191
- '/ui-api/path/layout/{objectApiName}',
7192
- // ----- Record Defaults -----
7193
- // getRecordCreateDefaults — IRecordCreateDefaultsResource
7194
- '/ui-api/record-defaults/create/{objectApiName}',
7195
- // getRecordDefaultsTemplateForCreate — IRecordDefaultsTemplateCreateResource
7196
- '/ui-api/record-defaults/template/create/{objectApiName}',
7197
- // getRecordDefaultsTemplateClone — IRecordDefaultsTemplateCloneResource
7198
- '/ui-api/record-defaults/template/clone/{recordId}',
7199
- // ----- Duplicates -----
7200
- // getDuplicateConfig — IDuplicateConfigResource
7201
- '/ui-api/duplicates/{objectApiName}',
7202
- // findDuplicates (POST) — IPredupeResource
7203
- '/ui-api/predupe',
7204
- // ----- GraphQL -----
7205
- // executeGraphQL (POST) — IGraphQLResource (no /ui-api prefix)
7206
- '/graphql',
7207
- // ----- List UI -----
7208
- // getListUiByName (2-segment form) — IListUiResource212
7209
- '/ui-api/list-ui/{objectApiName}/{listViewApiName}',
7210
- // 1-segment form covers both:
7211
- // /ui-api/list-ui/{listViewId} — IListUiResource
7212
- // /ui-api/list-ui/{objectApiName} — IListCollectionResource
7213
- '/ui-api/list-ui/{objectApiNameOrListViewId}',
7214
- // getListInfoByName (GET) / updateListInfoByApiName (PATCH) / deleteListInfo (DELETE) — IListInfoResource
7215
- // (Also covers /ui-api/list-info/{listViewId} via shape collision.)
7216
- '/ui-api/list-info/{objectApiName}/{listViewApiName}',
7217
- // getListInfosByObjectName (GET) / createListInfo (POST) — IListInfoCreationAndCollectionResource
7218
- // (Also covers /ui-api/list-info/batch — IListInfoBatchResource — via shape collision.)
7219
- '/ui-api/list-info/{objectApiName}',
7220
- // getListObjectInfo — IListObjectInfoResource
7221
- '/ui-api/list-object-info/{objectApiName}',
7222
- // postListRecordsByName (POST) — IListRecordsResource
7223
- '/ui-api/list-records/{objectApiName}/{listViewApiName}',
7224
- // getListPreferences (GET) / updateListPreferences (PATCH) — IListPreferencesResource
7225
- '/ui-api/list-preferences/{objectApiName}/{listViewApiName}',
7226
- // ----- Related List UI -----
7227
- // getRelatedListInfo (GET) / updateRelatedListInfo (PATCH) — IRelatedListInfoResource
7228
- // (Also covers /ui-api/related-list-info/{parentRecordId}/{relatedListId} via shape collision.)
7229
- '/ui-api/related-list-info/{parentObjectApiName}/{relatedListId}',
7230
- // getRelatedListInfoBatch — IRelatedListInfoBatchResource
7231
- '/ui-api/related-list-info/batch/{parentObjectApiName}/{relatedListNames}',
7232
- // getRelatedListsInfo (collection) — IRelatedListInfoCollectionResource
7233
- '/ui-api/related-list-info/{parentObjectApiName}',
7234
- // postRelatedListRecords (POST) — IRelatedListRecordsResource
7235
- '/ui-api/related-list-records/{parentRecordId}/{relatedListId}',
7236
- // postRelatedListRecordsBatch (POST, 3-segment form) — IRelatedListRecordsBatchResource
7237
- '/ui-api/related-list-records/batch/{parentRecordId}',
7238
- // getRelatedListRecordsBatch (GET, 4-segment form) — IRelatedListRecordsBatchResource [newly added]
7239
- '/ui-api/related-list-records/batch/{parentRecordId}/{relatedListIds}',
7240
- // getRelatedListCount — IRelatedListRecordCountResource
7241
- '/ui-api/related-list-count/{parentRecordId}/{relatedListId}',
7242
- // getRelatedListsCount (batch) — IRelatedListRecordCountBatchResource
7243
- '/ui-api/related-list-count/batch/{parentRecordId}/{relatedListNames}',
7244
- // getRelatedListPreferences (GET) / updateRelatedListPreferences (PATCH) — IRelatedListPreferencesResource
7245
- '/ui-api/related-list-preferences/{preferencesId}',
7246
- // getRelatedListPreferencesBatch — IRelatedListPreferencesBatchResource
7247
- '/ui-api/related-list-preferences/batch/{preferencesIds}',
7248
- // ----- Actions -----
7249
- // getGlobalActions — IActionGlobalResource
7250
- '/ui-api/actions/global',
7251
- // getActionLayout — IActionLayoutResource
7252
- '/ui-api/actions/layout/{actionApiName}',
7253
- // getLookupActions — IActionLookupResource
7254
- '/ui-api/actions/lookup/{objectApiNames}',
7255
- // getObjectCreateActions — IActionObjectResource
7256
- '/ui-api/actions/object/{objectApiName}/record-create',
7257
- // getActionOverrides — IActionOverrideResource
7258
- '/ui-api/actions/overrides/{objectApiName}',
7259
- // performQuickAction (POST) / performUpdateRecordQuickAction (PATCH) — IActionPerformQuickActionResource
7260
- '/ui-api/actions/perform-quick-action/{actionApiName}',
7261
- // getQuickActionInfo — IActionQuickActionInfoResource
7262
- '/ui-api/actions/quick-action-info/{actionApiName}',
7263
- // getRecordActions — IActionRecordResource
7264
- '/ui-api/actions/record/{recordIds}',
7265
- // getRecordEditActions — IActionRecordEditResource
7266
- '/ui-api/actions/record/{recordIds}/record-edit',
7267
- // getAllRelatedListActionsForRecord (4-segment form) — IActionRelatedListResource [newly added]
7268
- '/ui-api/actions/record/{recordIds}/related-list',
7269
- // postRelatedListActions (POST) — IActionRelatedListResource
7270
- '/ui-api/actions/record/{recordIds}/related-list/{relatedListId}',
7271
- // postRelatedListsActions (POST) / getRelatedListsActions (GET, 5-segment form) — IActionRelatedListBatchResource
7272
- '/ui-api/actions/record/{recordIds}/related-list/batch',
7273
- // getRelatedListsActions (GET, 6-segment form) — IActionRelatedListBatchResource [newly added]
7274
- '/ui-api/actions/record/{recordIds}/related-list/batch/{relatedListIds}',
7275
- // getRelatedListRecordActions — IActionRelatedListRecordResource
7276
- '/ui-api/actions/record/{recordIds}/related-list-record/{relatedListRecordIds}',
7277
- // getQuickActionDefaults — IActionQuickActionDefaultsResource
7278
- '/ui-api/actions/record-defaults/{actionApiName}',
7279
- // getFlexipageFormulaOverrides — IActionFlexipageFormulaActivationResource
7280
- '/ui-api/actions/formula-activation/{actionFeature}',
7281
- // ----- Lookup / Search -----
7282
- // lookup (POST) — ILookupEntityResource
7283
- '/ui-api/lookups/{objectApiName}/{keyPrefix}/{targetApiName}',
7284
- // searchResults (POST) — ISearchResultsResource
7285
- '/ui-api/search/results',
7286
- // searchKeywordResults (POST) — IKeywordSearchResultsResource
7287
- '/ui-api/search/results/keyword',
7288
- // getSearchFilterMetadata — ISearchInfoFilterMetadataCollectionResource
7289
- '/ui-api/search-info/{objectApiName}/filters',
7290
- // getSearchFilterOptions — ISearchInfoFilterOptionsResource
7291
- '/ui-api/search-info/{objectApiName}/filters/{filterApiName}/options',
7292
- // getLookupMetadata — ILookupMetadataResource
7293
- '/ui-api/search-info/{objectApiName}/lookup/{fieldApiName}',
7294
- // ----- MRU Lists -----
7295
- // getMruListUi — IMruListUiResource
7296
- '/ui-api/mru-list-ui/{objectApiName}',
7297
- // getMruListRecords — IMruListRecordsResource
7298
- '/ui-api/mru-list-records/{objectApiName}',
7299
- // ----- Apps / Nav -----
7300
- // getNavItems — INavItemsResource
7301
- '/ui-api/nav-items',
7302
- // getAllApps — IAppsResource
7303
- '/ui-api/apps',
7304
- // getAppDetails — IAppResource
7305
- '/ui-api/apps/{appId}',
7306
- ];
7307
- /**
7308
- * Private UIAPI url paths gated by the private-endpoint gates per runtime.
7309
- *
7310
- * Inclusion criteria:
7311
- * 1. The path's underlying Connect resource carries
7312
- * `clientFilters=@ConnectClientFilters({@ConnectClientFilter(key = "UiTier")...})`,
7313
- * which restricts callers to the UI tier (one.app / UISDK runtime) and
7314
- * excludes the public REST API.
7315
- * 2. LDS actually invokes this URL via a Luvio adapter wired into
7316
- * `ldsEngineCreator.js`.
7317
- */
7318
- const UIAPI_PRIVATE_PATHS = [
7319
- // ----- Record Avatars -----
7320
- // getRecordAvatars (batch) — IRecordAvatarsBatchResource
7321
- '/ui-api/record-avatars/batch/{recordIds}',
7322
- // updateRecordAvatar (POST) — IRecordAvatarsAssociationResource
7323
- '/ui-api/record-avatars/{recordId}/association',
7324
- // ----- Layout -----
7325
- // getLayoutUserState (GET) / updateLayoutUserState (PATCH) — ILayoutUserStateResource
7326
- '/ui-api/layout/{objectApiName}/user-state',
7327
- // ----- GraphQL -----
7328
- // executeGraphQLBatch (POST) — IGraphQLBatchResource (no /ui-api prefix)
7329
- '/graphql/batch',
7330
- // ----- Aggregate UI -----
7331
- // executeAggregateUi (POST) — IAggregateUiResource
7332
- '/ui-api/aggregate-ui',
7333
- ];
7334
7134
  /**
7335
7135
  * Single content documents version URL enabled/disabled by killswitch.
7336
7136
  * Exported for reuse in tests.
@@ -7408,14 +7208,8 @@ function getEnabledPaths() {
7408
7208
  }
7409
7209
  return Array.from(enabled);
7410
7210
  }
7411
- function buildMatchers(paths) {
7412
- return paths.map((path) => {
7413
- const regexString = path.replace(/\{.+?\}/g, '[^/]+');
7414
- return new RegExp(`^${regexString}$`);
7415
- });
7416
- }
7417
7211
  // Precompute enabled path matchers at module load to avoid per-request rebuild
7418
- const ENABLED_PATH_MATCHERS = buildMatchers(getEnabledPaths());
7212
+ const ENABLED_PATH_MATCHERS = compilePathMatchers(getEnabledPaths());
7419
7213
  /**
7420
7214
  * Indicates whether any predicate-enabled path sets are active.
7421
7215
  * Used by adapter composition to decide whether to include the fetch adapter.
@@ -7615,13 +7409,17 @@ const DEFAULT_CONFIG = {
7615
7409
  jitterPercent: 0.5,
7616
7410
  };
7617
7411
  class FetchThrottlingRetryPolicy extends RetryPolicy {
7618
- constructor(config = DEFAULT_CONFIG, method) {
7412
+ constructor(config = DEFAULT_CONFIG, method, operationType) {
7619
7413
  super();
7620
7414
  this.config = config;
7621
7415
  this.method = method;
7416
+ this.operationType = operationType;
7622
7417
  }
7623
7418
  async shouldRetry(result, context) {
7624
- return (isRetryableMethod(this.method) &&
7419
+ // A request is safe to replay when it's a GET or when OneStore has
7420
+ // flagged it as a read (operationType === 'query'), covering reads
7421
+ // issued over a non-GET method. Writes stay non-retryable.
7422
+ return ((isRetryableMethod(this.method) || isRetryableOperationType(this.operationType)) &&
7625
7423
  (result.status === 429 || result.status === 503) &&
7626
7424
  context.attempt < this.config.maxRetries &&
7627
7425
  context.totalElapsedMs <= this.config.maxTimeToRetry);
@@ -7687,26 +7485,28 @@ function buildCsrfPolicy(mutableRequest) {
7687
7485
  }
7688
7486
  /**
7689
7487
  * Built fresh per request so the write-guard check sees this request's own
7690
- * HTTP method, rather than one method baked in for the life of the service.
7488
+ * HTTP method and operationType, rather than values baked in for the life of
7489
+ * the service.
7691
7490
  */
7692
- function buildThrottlingPolicy(fetchArgs) {
7693
- return new FetchThrottlingRetryPolicy(undefined, getFetchMethod(fetchArgs));
7491
+ function buildThrottlingPolicy(fetchArgs, context) {
7492
+ return new FetchThrottlingRetryPolicy(undefined, getFetchMethod(fetchArgs), context?.operationType);
7694
7493
  }
7695
7494
  /**
7696
7495
  * Builds the retry interceptor used by the generic Conduit fetch service.
7697
7496
  *
7698
7497
  * Composes two independent per-request retry policies — throttling (429/503,
7699
- * GET-only) and CSRF (401 token refresh) built fresh per request rather
7700
- * than reused off a shared defaultRetryPolicy. This keeps concurrent requests
7701
- * from sharing mutable CSRF request-context state, and lets the throttling
7702
- * policy see this request's own HTTP method.
7498
+ * retryable when the method is GET or the operationType is `query`) and CSRF
7499
+ * (401 token refresh) built fresh per request rather than reused off a
7500
+ * shared defaultRetryPolicy. This keeps concurrent requests from sharing
7501
+ * mutable CSRF request-context state, and lets the throttling policy see this
7502
+ * request's own HTTP method and operationType.
7703
7503
  */
7704
7504
  function buildFetchRetryInterceptor() {
7705
- return async (fetchArgs, retryService, _context) => {
7505
+ return async (fetchArgs, retryService, context) => {
7706
7506
  if (retryService) {
7707
7507
  const mutableRequest = { args: fetchArgs };
7708
7508
  const composedPolicy = new ComposedRetryPolicy([
7709
- buildThrottlingPolicy(fetchArgs),
7509
+ buildThrottlingPolicy(fetchArgs, context),
7710
7510
  buildCsrfPolicy(mutableRequest),
7711
7511
  ]);
7712
7512
  return retryService.applyRetry(async () => {
@@ -10789,7 +10589,7 @@ function buildLexRuntimeCompressedFetchServiceDescriptor(logger, retryService) {
10789
10589
 
10790
10590
  const CSRF_TOKEN_KEY = 'salesforce_csrf_token';
10791
10591
  const CSRF_STORAGE_NAME = 'ldsCSRFToken';
10792
- const BASE_URI = '/services/data/v68.0';
10592
+ const BASE_URI = '/services/data/v69.0';
10793
10593
  const UI_API_BASE_URI = `${BASE_URI}/ui-api`;
10794
10594
  const CSRF_TOKEN_ENDPOINT = `${UI_API_BASE_URI}/session/csrf`;
10795
10595
  const CSRF_STORAGE_CONFIG = {
@@ -11657,4 +11457,4 @@ function ldsEngineCreator() {
11657
11457
  }
11658
11458
 
11659
11459
  export { LexRequestStrategy, PDL_ENGINE_REGISTRATION_ID, PdlPrefetcherEventType, PdlRequestPriority, buildPredictorForContext, configService, ldsEngineCreator as default, initializeLDS, initializeOneStore, notifyUpdateAvailableFactory, registerRequestStrategy, saveRequestAsPrediction, subscribeToPrefetcherEvents, unregisterRequestStrategy, whenPredictionsReady };
11660
- // version: 1.456.0-cef836b978
11460
+ // version: 1.458.0-5aef0572f2
@@ -1,34 +1,8 @@
1
1
  import { type ResourceRequest } from '@luvio/engine';
2
+ import { UIAPI_PUBLIC_PATHS, UIAPI_PRIVATE_PATHS } from '@salesforce/lds-network-fetch';
2
3
  import type { RequestLogger } from '@salesforce/lds-network-fetch';
3
4
  import type { RequestTracker } from './instrumentation-utils';
4
- /**
5
- * Public UIAPI url paths verified for HTTP transport.
6
- *
7
- * Inclusion criteria:
8
- * 1. The path's underlying Connect resource does NOT carry
9
- * `clientFilters=@ConnectClientFilters({@ConnectClientFilter(key = "UiTier")...})`.
10
- * 2. LDS actually invokes this URL via a Luvio adapter wired into
11
- * `ldsEngineCreator.js` (i.e. there is a corresponding `*AdapterFactory`
12
- * import). Connect resources with no LDS adapter are intentionally
13
- * excluded — adding them produces no traffic and just bloats the matcher.
14
- *
15
- * Where a single Connect resource exposes multiple URL shapes (e.g. a 4-segment
16
- * GET form alongside a 3-segment POST form), all forms LDS adapters can hit at
17
- * runtime are registered.
18
- */
19
- export declare const UIAPI_PUBLIC_PATHS: string[];
20
- /**
21
- * Private UIAPI url paths gated by the private-endpoint gates per runtime.
22
- *
23
- * Inclusion criteria:
24
- * 1. The path's underlying Connect resource carries
25
- * `clientFilters=@ConnectClientFilters({@ConnectClientFilter(key = "UiTier")...})`,
26
- * which restricts callers to the UI tier (one.app / UISDK runtime) and
27
- * excludes the public REST API.
28
- * 2. LDS actually invokes this URL via a Luvio adapter wired into
29
- * `ldsEngineCreator.js`.
30
- */
31
- export declare const UIAPI_PRIVATE_PATHS: string[];
5
+ export { UIAPI_PUBLIC_PATHS, UIAPI_PRIVATE_PATHS };
32
6
  /**
33
7
  * Single content documents version URL enabled/disabled by killswitch.
34
8
  * Exported for reuse in tests.
@@ -3,9 +3,10 @@ import type { RetryInterceptor } from '@conduit-client/service-fetch-network/v1'
3
3
  * Builds the retry interceptor used by the generic Conduit fetch service.
4
4
  *
5
5
  * Composes two independent per-request retry policies — throttling (429/503,
6
- * GET-only) and CSRF (401 token refresh) built fresh per request rather
7
- * than reused off a shared defaultRetryPolicy. This keeps concurrent requests
8
- * from sharing mutable CSRF request-context state, and lets the throttling
9
- * policy see this request's own HTTP method.
6
+ * retryable when the method is GET or the operationType is `query`) and CSRF
7
+ * (401 token refresh) built fresh per request rather than reused off a
8
+ * shared defaultRetryPolicy. This keeps concurrent requests from sharing
9
+ * mutable CSRF request-context state, and lets the throttling policy see this
10
+ * request's own HTTP method and operationType.
10
11
  */
11
12
  export declare function buildFetchRetryInterceptor(): RetryInterceptor;
@@ -11,7 +11,8 @@ type FetchThrottlingRetryPolicyConfig = {
11
11
  export declare class FetchThrottlingRetryPolicy extends RetryPolicy<Response> {
12
12
  private config;
13
13
  private method?;
14
- constructor(config?: FetchThrottlingRetryPolicyConfig, method?: string | undefined);
14
+ private operationType?;
15
+ constructor(config?: FetchThrottlingRetryPolicyConfig, method?: string | undefined, operationType?: string | undefined);
15
16
  shouldRetry(result: Response, context: RetryContext<Response>): Promise<boolean>;
16
17
  calculateDelay(result: Response, context: RetryContext<Response>): Promise<number>;
17
18
  parseRetryAfterHeader(result: Response): number | undefined;
@@ -1,5 +1,5 @@
1
1
  import { RetryPolicy, type RetryContext } from '@conduit-client/service-retry/v1';
2
- import type { FetchResponse } from '@luvio/engine';
2
+ import type { FetchResponse, ResourceRequest } from '@luvio/engine';
3
3
  type LuvioFetchThrottlingRetryPolicyConfig = {
4
4
  maxRetries: number;
5
5
  maxTimeToRetry: number;
@@ -10,8 +10,8 @@ type LuvioFetchThrottlingRetryPolicyConfig = {
10
10
  };
11
11
  export declare class LuvioFetchThrottlingRetryPolicy extends RetryPolicy<FetchResponse<any>> {
12
12
  private config;
13
- private method?;
14
- constructor(config?: LuvioFetchThrottlingRetryPolicyConfig, method?: string | undefined);
13
+ private request?;
14
+ constructor(config?: LuvioFetchThrottlingRetryPolicyConfig, request?: ResourceRequest | undefined);
15
15
  shouldRetry(result: FetchResponse<any>, context: RetryContext<FetchResponse<any>>): Promise<boolean>;
16
16
  calculateDelay(result: FetchResponse<any>, context: RetryContext<FetchResponse<any>>): Promise<number>;
17
17
  parseRetryAfterHeader(result: FetchResponse<any>): number | undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salesforce/lds-runtime-aura",
3
- "version": "1.456.0",
3
+ "version": "1.458.0",
4
4
  "license": "SEE LICENSE IN LICENSE.txt",
5
5
  "description": "LDS engine for Aura runtime.",
6
6
  "main": "dist/ldsEngineCreator.js",
@@ -34,61 +34,61 @@
34
34
  "release:corejar": "yarn build && ../core-build/scripts/core.js --name=lds-runtime-aura"
35
35
  },
36
36
  "devDependencies": {
37
- "@conduit-client/service-provisioner": "3.26.5",
38
- "@conduit-client/tools-core": "3.26.5",
39
- "@salesforce/lds-adapters-apex": "^1.456.0",
40
- "@salesforce/lds-adapters-uiapi": "^1.456.0",
41
- "@salesforce/lds-ads-bridge": "^1.456.0",
42
- "@salesforce/lds-aura-storage": "^1.456.0",
43
- "@salesforce/lds-bindings": "^1.456.0",
44
- "@salesforce/lds-instrumentation": "^1.456.0",
45
- "@salesforce/lds-network-adapter": "^1.456.0",
46
- "@salesforce/lds-network-aura": "^1.456.0",
47
- "@salesforce/lds-network-fetch": "^1.456.0",
37
+ "@conduit-client/service-provisioner": "3.27.1",
38
+ "@conduit-client/tools-core": "3.27.1",
39
+ "@salesforce/lds-adapters-apex": "^1.458.0",
40
+ "@salesforce/lds-adapters-uiapi": "^1.458.0",
41
+ "@salesforce/lds-ads-bridge": "^1.458.0",
42
+ "@salesforce/lds-aura-storage": "^1.458.0",
43
+ "@salesforce/lds-bindings": "^1.458.0",
44
+ "@salesforce/lds-instrumentation": "^1.458.0",
45
+ "@salesforce/lds-network-adapter": "^1.458.0",
46
+ "@salesforce/lds-network-aura": "^1.458.0",
47
+ "@salesforce/lds-network-fetch": "^1.458.0",
48
48
  "jwt-encode": "1.0.1"
49
49
  },
50
50
  "dependencies": {
51
- "@conduit-client/command-aura-graphql-normalized-cache-control": "3.26.5",
52
- "@conduit-client/command-aura-network": "3.26.5",
53
- "@conduit-client/command-aura-normalized-cache-control": "3.26.5",
54
- "@conduit-client/command-fetch-network": "3.26.5",
55
- "@conduit-client/command-http-graphql-normalized-cache-control": "3.26.5",
56
- "@conduit-client/command-http-normalized-cache-control": "3.26.5",
57
- "@conduit-client/command-ndjson": "3.26.5",
58
- "@conduit-client/command-network": "3.26.5",
59
- "@conduit-client/command-sse": "3.26.5",
60
- "@conduit-client/command-streaming": "3.26.5",
61
- "@conduit-client/jwt-manager": "3.26.5",
62
- "@conduit-client/service-aura-network": "3.26.5",
63
- "@conduit-client/service-bindings-imperative": "3.26.5",
64
- "@conduit-client/service-bindings-lwc": "3.26.5",
65
- "@conduit-client/service-cache": "3.26.5",
66
- "@conduit-client/service-cache-control": "3.26.5",
67
- "@conduit-client/service-cache-inclusion-policy": "3.26.5",
68
- "@conduit-client/service-config": "3.26.5",
69
- "@conduit-client/service-feature-flags": "3.26.5",
70
- "@conduit-client/service-fetch-network": "3.26.5",
71
- "@conduit-client/service-instrument-command": "3.26.5",
72
- "@conduit-client/service-pubsub": "3.26.5",
73
- "@conduit-client/service-renewable-resource-manager": "3.26.5",
74
- "@conduit-client/service-store": "3.26.5",
75
- "@conduit-client/utils": "3.26.5",
51
+ "@conduit-client/command-aura-graphql-normalized-cache-control": "3.27.1",
52
+ "@conduit-client/command-aura-network": "3.27.1",
53
+ "@conduit-client/command-aura-normalized-cache-control": "3.27.1",
54
+ "@conduit-client/command-fetch-network": "3.27.1",
55
+ "@conduit-client/command-http-graphql-normalized-cache-control": "3.27.1",
56
+ "@conduit-client/command-http-normalized-cache-control": "3.27.1",
57
+ "@conduit-client/command-ndjson": "3.27.1",
58
+ "@conduit-client/command-network": "3.27.1",
59
+ "@conduit-client/command-sse": "3.27.1",
60
+ "@conduit-client/command-streaming": "3.27.1",
61
+ "@conduit-client/jwt-manager": "3.27.1",
62
+ "@conduit-client/service-aura-network": "3.27.1",
63
+ "@conduit-client/service-bindings-imperative": "3.27.1",
64
+ "@conduit-client/service-bindings-lwc": "3.27.1",
65
+ "@conduit-client/service-cache": "3.27.1",
66
+ "@conduit-client/service-cache-control": "3.27.1",
67
+ "@conduit-client/service-cache-inclusion-policy": "3.27.1",
68
+ "@conduit-client/service-config": "3.27.1",
69
+ "@conduit-client/service-feature-flags": "3.27.1",
70
+ "@conduit-client/service-fetch-network": "3.27.1",
71
+ "@conduit-client/service-instrument-command": "3.27.1",
72
+ "@conduit-client/service-pubsub": "3.27.1",
73
+ "@conduit-client/service-renewable-resource-manager": "3.27.1",
74
+ "@conduit-client/service-store": "3.27.1",
75
+ "@conduit-client/utils": "3.27.1",
76
76
  "@luvio/network-adapter-composable": "0.161.2",
77
77
  "@luvio/network-adapter-fetch": "0.161.2",
78
78
  "@lwc/state": "^0.29.0",
79
- "@salesforce/lds-adapters-onestore-graphql": "^1.456.0",
79
+ "@salesforce/lds-adapters-onestore-graphql": "^1.458.0",
80
80
  "@salesforce/lds-adapters-uiapi-lex": "^1.415.0",
81
- "@salesforce/lds-durable-storage": "^1.456.0",
82
- "@salesforce/lds-luvio-service": "^1.456.0",
83
- "@salesforce/lds-luvio-uiapi-records-service": "^1.456.0"
81
+ "@salesforce/lds-durable-storage": "^1.458.0",
82
+ "@salesforce/lds-luvio-service": "^1.458.0",
83
+ "@salesforce/lds-luvio-uiapi-records-service": "^1.458.0"
84
84
  },
85
85
  "luvioBundlesize": [
86
86
  {
87
87
  "path": "./dist/ldsEngineCreator.js",
88
88
  "maxSize": {
89
- "none": "421 kB",
89
+ "none": "428 kB",
90
90
  "min": "190 kB",
91
- "compressed": "75 kB"
91
+ "compressed": "77 kB"
92
92
  }
93
93
  }
94
94
  ],
@@ -1,2 +0,0 @@
1
- export default function (): void;
2
- export declare function instrument(): void;
@@ -1,5 +0,0 @@
1
- /// <reference types="jest" />
2
- export declare const createStorage: jest.Mock<any, any, any>;
3
- export declare const clearStorages: jest.Mock<any, any, any>;
4
- export declare const setDurableStorageImplementation: jest.Mock<any, any, any>;
5
- export declare const getDurableStorageImplementation: jest.Mock<any, any, any>;
@@ -1,2 +0,0 @@
1
- export declare function getEnvironmentSetting(): boolean;
2
- export declare const EnvironmentSettings: {};
@@ -1,15 +0,0 @@
1
- export declare function setupInstrumentation(): void;
2
- export declare function LRUCache(): Map<any, any>;
3
- export declare function incrementCounterMetric(): void;
4
- export declare function updatePercentileHistogramMetric(): void;
5
- export declare function instrumentAdapter<_C, _D>(adapter: any, _metadata: any): any;
6
- export declare function instrumentLuvio(): void;
7
- export declare function instrumentStoreMethods(): void;
8
- export declare function setLdsAdaptersUiapiInstrumentation(): void;
9
- export declare function setLdsNetworkAdapterInstrumentation(): void;
10
- export declare function logObjectInfoChanged(): void;
11
- export declare function executeAsyncActivity(_name: string, execute: (act: any) => Promise<void>, _options?: any): Promise<void>;
12
- export declare const METRIC_KEYS: {
13
- PREDICTIVE_DATA_LOADING_PREDICT: string;
14
- PREDICTIVE_DATA_LOADING_SAVE_REQUEST: string;
15
- };
@@ -1,4 +0,0 @@
1
- export default function (): void;
2
- export declare function instrument(): void;
3
- export declare function ldsNetworkAdapterInstrument(): void;
4
- export declare const forceRecordTransactionsDisabled = false;
@@ -1,2 +0,0 @@
1
- export declare function setupLexNetworkAdapter(): void;
2
- export declare function instrument(): void;
@@ -1,3 +0,0 @@
1
- /// <reference types="jest" />
2
- declare const executeGlobalControllerRawResponse: jest.Mock<any, any, any>;
3
- export { executeGlobalControllerRawResponse };
@@ -1,3 +0,0 @@
1
- /// <reference types="jest" />
2
- declare const astResolver: jest.Mock<any, any, any>;
3
- export { astResolver };
@@ -1,33 +0,0 @@
1
- export declare function counter(): {
2
- increment(): void;
3
- decrement(): void;
4
- getValue(): void;
5
- reset(): void;
6
- };
7
- export declare function gauge(): {
8
- setValue(): void;
9
- getValue(): void;
10
- reset(): void;
11
- };
12
- export declare function mark(): {};
13
- export declare function markStart(): {};
14
- export declare function markEnd(): {};
15
- export declare function perfStart(): void;
16
- export declare function perfEnd(): void;
17
- export declare function percentileHistogram(): {
18
- update(): void;
19
- getValue(): void;
20
- reset(): void;
21
- };
22
- export declare function time(): void;
23
- export declare function timer(): {
24
- addDuration(): void;
25
- getValue(): void;
26
- time(): void;
27
- };
28
- export declare function registerCacheStats(): {
29
- logHits(): void;
30
- logMisses(): void;
31
- };
32
- export declare function registerPlugin(): void;
33
- export declare function registerPeriodicLogger(): void;
@@ -1,4 +0,0 @@
1
- export declare const ThirdPartyTracker: {
2
- registerHandler: jest.Mock<void, [_cmp: any, _name: string, _loadedCheck: () => boolean], any>;
3
- markLoaded: jest.Mock<void, [_cmp: any], any>;
4
- };
@@ -1,6 +0,0 @@
1
- /// <reference types="jest" />
2
- export declare const setTrustedSignalSet: jest.Mock<any, any, any>;
3
- export declare const setTrustedContextSet: jest.Mock<any, any, any>;
4
- export declare const setContextKeys: jest.Mock<any, any, any>;
5
- export declare const __dangerous_do_not_use_addTrustedContext: jest.Mock<any, any, any>;
6
- export declare const isTrustedSignal: jest.Mock<any, any, any>;
@@ -1,12 +0,0 @@
1
- declare function stop(_userSchemaOrText?: any | string, _userData?: any): void;
2
- declare function error(_error: Error, _userSchemaOrText?: any | string, _userData?: any): void;
3
- declare function discard(): void;
4
- declare function terminate(): void;
5
- export declare const activity: {
6
- stop: typeof stop;
7
- error: typeof error;
8
- discard: typeof discard;
9
- terminate: typeof terminate;
10
- getId: () => string;
11
- };
12
- export {};
@@ -1,11 +0,0 @@
1
- export { activity } from './activity';
2
- export { instrumentation } from './instrumentation';
3
- export { idleDetector } from './idleDetector';
4
- export declare function getInstrumentation(_name: string): {
5
- log: (_schema: any, _data?: any) => void;
6
- error: (_error: unknown, _userSchemaOrText?: any, _userData?: any) => void;
7
- startActivity: (_name: string) => any;
8
- incrementCounter: (_operation: string, _increment?: number | undefined, _hasError?: boolean | undefined, _tags?: any) => void;
9
- trackValue: (_operation: string, _value: number, _hasError?: boolean | undefined, _tags?: any) => void;
10
- bucketValue: (_operation: string, _value: number, _buckets: number[]) => void;
11
- };
@@ -1,18 +0,0 @@
1
- declare function requestIdleDetectedCallback(_callback: any): void;
2
- declare function declareNotifierTaskSingle(_name: string): {
3
- isBusy: boolean;
4
- done: () => void;
5
- };
6
- declare function declareNotifierTaskMulti(_name: string, _existingBusyCount?: number): {
7
- isBusy: boolean;
8
- add: () => void;
9
- done: () => void;
10
- };
11
- declare function declarePollableTaskMulti(_name: string, _isBusyChecker: any): void;
12
- export declare const idleDetector: {
13
- requestIdleDetectedCallback: typeof requestIdleDetectedCallback;
14
- declareNotifierTaskSingle: typeof declareNotifierTaskSingle;
15
- declareNotifierTaskMulti: typeof declareNotifierTaskMulti;
16
- declarePollableTaskMulti: typeof declarePollableTaskMulti;
17
- };
18
- export {};
@@ -1,15 +0,0 @@
1
- declare function log(_schema: any, _data?: any): void;
2
- declare function error(_error: unknown, _userSchemaOrText?: any | string, _userData?: any): void;
3
- declare function startActivity(_name: string): any;
4
- declare function incrementCounter(_operation: string, _increment?: number, _hasError?: boolean, _tags?: any): void;
5
- declare function trackValue(_operation: string, _value: number, _hasError?: boolean, _tags?: any): void;
6
- declare function bucketValue(_operation: string, _value: number, _buckets: number[]): void;
7
- export declare const instrumentation: {
8
- log: typeof log;
9
- error: typeof error;
10
- startActivity: typeof startActivity;
11
- incrementCounter: typeof incrementCounter;
12
- trackValue: typeof trackValue;
13
- bucketValue: typeof bucketValue;
14
- };
15
- export {};
@@ -1 +0,0 @@
1
- export declare const adapterUnfulfilledErrorSchema: {};
@@ -1,20 +0,0 @@
1
- import type { FetchParameters } from '@conduit-client/service-fetch-network/v1';
2
- /**
3
- * Extracts the HTTP method from FetchParameters, matching the Fetch API's own
4
- * precedence: an options.method override wins over a Request object's method
5
- * (e.g. `fetch(new Request(url, { method: 'GET' }), { method: 'POST' })`
6
- * resolves to `POST`).
7
- */
8
- export declare function getFetchMethod([urlOrRequest, options]: FetchParameters): string | undefined;
9
- /**
10
- * Only GET requests are safe to replay automatically on 429/503 — replaying a
11
- * write (POST/PUT/PATCH/DELETE) risks executing a mutation more than once.
12
- * Shared by both the Luvio and generic-fetch throttling retry policies so the
13
- * write-guard rule lives in exactly one place.
14
- */
15
- export declare function isRetryableMethod(method: string | undefined): boolean;
16
- /**
17
- * Determines if the HTTP method requires CSRF protection.
18
- * Only mutating operations (POST, PUT, PATCH, DELETE) require CSRF tokens.
19
- */
20
- export declare function isCsrfMethod(method: string | undefined): boolean;