@salesforce/lds-runtime-one-app 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 { dispatchGlobalEvent as dispatchGlobalEvent$1, executeGlobalControllerRa
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';
@@ -1446,10 +1446,23 @@ const _FetchNetworkCommand = class _FetchNetworkCommand extends NetworkCommand {
1446
1446
  this.services = services;
1447
1447
  this.additionalNullResponses = [];
1448
1448
  }
1449
+ /**
1450
+ * The command's operation type. Generated command subclasses override this
1451
+ * getter with their concrete operation (see the generator's
1452
+ * `generateOperationType`); the base returns `undefined` for commands that
1453
+ * don't declare one (e.g. hand-written commands). Transport-layer
1454
+ * interceptors use it to tell a read (`query`) apart from a write — see
1455
+ * `fetch`, which folds it into the context seed.
1456
+ */
1457
+ get operationType() {
1458
+ return void 0;
1459
+ }
1449
1460
  fetch(contextSeed) {
1450
1461
  try {
1451
1462
  const [input, init] = this.fetchParams;
1452
- const initWithSeed = contextSeed === void 0 ? init : { ...init, __contextSeed: contextSeed };
1463
+ const operationType = this.operationType;
1464
+ const seed = operationType === void 0 ? contextSeed : { operationType, ...contextSeed };
1465
+ const initWithSeed = seed === void 0 ? init : { ...init, __contextSeed: seed };
1453
1466
  const fetchCall = initWithSeed === void 0 ? this.services.fetch(input) : this.services.fetch(input, initWithSeed);
1454
1467
  return this.convertFetchResponseToData(fetchCall);
1455
1468
  } catch (reason) {
@@ -2588,7 +2601,7 @@ function buildServiceDescriptor$d(luvio) {
2588
2601
  },
2589
2602
  };
2590
2603
  }
2591
- // version: 1.456.0-cef836b978
2604
+ // version: 1.458.0-5aef0572f2
2592
2605
 
2593
2606
  class AuraGraphQLNormalizedCacheControlCommand extends AuraNormalizedCacheControlCommand {
2594
2607
  constructor(config, documentRootType, services) {
@@ -2927,7 +2940,7 @@ function buildServiceDescriptor$9(notifyRecordUpdateAvailable, getNormalizedLuvi
2927
2940
  },
2928
2941
  };
2929
2942
  }
2930
- // version: 1.456.0-cef836b978
2943
+ // version: 1.458.0-5aef0572f2
2931
2944
 
2932
2945
  class RetryService {
2933
2946
  constructor(defaultRetryPolicy) {
@@ -5849,7 +5862,7 @@ function getEnvironmentSetting(name) {
5849
5862
  }
5850
5863
  return undefined;
5851
5864
  }
5852
- // version: 1.456.0-6ed480b93c
5865
+ // version: 1.458.0-6d15707ed2
5853
5866
 
5854
5867
  /**
5855
5868
  * Helpers for reaching the Aura framework from the LDS Aura runtime.
@@ -6422,45 +6435,6 @@ function getCsrfTokenManager() {
6422
6435
  return cached;
6423
6436
  }
6424
6437
 
6425
- /**
6426
- * Extracts the HTTP method from FetchParameters, matching the Fetch API's own
6427
- * precedence: an options.method override wins over a Request object's method
6428
- * (e.g. `fetch(new Request(url, { method: 'GET' }), { method: 'POST' })`
6429
- * resolves to `POST`).
6430
- */
6431
- function getFetchMethod([urlOrRequest, options]) {
6432
- if (options && 'method' in options) {
6433
- return options.method;
6434
- }
6435
- if (typeof urlOrRequest !== 'string' && 'method' in urlOrRequest) {
6436
- return urlOrRequest.method;
6437
- }
6438
- return undefined;
6439
- }
6440
- /**
6441
- * Only GET requests are safe to replay automatically on 429/503 — replaying a
6442
- * write (POST/PUT/PATCH/DELETE) risks executing a mutation more than once.
6443
- * Shared by both the Luvio and generic-fetch throttling retry policies so the
6444
- * write-guard rule lives in exactly one place.
6445
- */
6446
- function isRetryableMethod(method) {
6447
- return method?.toLowerCase() === 'get';
6448
- }
6449
- /**
6450
- * Determines if the HTTP method requires CSRF protection.
6451
- * Only mutating operations (POST, PUT, PATCH, DELETE) require CSRF tokens.
6452
- */
6453
- function isCsrfMethod(method) {
6454
- if (!method) {
6455
- return false;
6456
- }
6457
- const normalizedMethod = method.toLowerCase();
6458
- return (normalizedMethod === 'post' ||
6459
- normalizedMethod === 'put' ||
6460
- normalizedMethod === 'patch' ||
6461
- normalizedMethod === 'delete');
6462
- }
6463
-
6464
6438
  const CSRF_TOKEN_HEADER = 'X-CSRF-Token';
6465
6439
  /**
6466
6440
  * Resolves the CSRF token manager and returns the current token. Returns
@@ -6915,13 +6889,22 @@ const DEFAULT_CONFIG$2 = {
6915
6889
  jitterPercent: 0.5,
6916
6890
  };
6917
6891
  class LuvioFetchThrottlingRetryPolicy extends RetryPolicy {
6918
- constructor(config = DEFAULT_CONFIG$2, method) {
6892
+ // The request is read-only here: `shouldRetry` only inspects its `method` and
6893
+ // `basePath` to decide replay safety, and neither changes across retries. This
6894
+ // is why we take the plain `ResourceRequest` rather than the mutable-container
6895
+ // pattern the CSRF policy uses — that policy rewrites the request (new token)
6896
+ // between attempts; this one never mutates it.
6897
+ constructor(config = DEFAULT_CONFIG$2, request) {
6919
6898
  super();
6920
6899
  this.config = config;
6921
- this.method = method;
6900
+ this.request = request;
6922
6901
  }
6923
6902
  async shouldRetry(result, context) {
6924
- return (isRetryableMethod(this.method) &&
6903
+ // A request is safe to replay when it's a GET or when its path is a known
6904
+ // read issued over POST (e.g. GraphQL, aggregate-ui, search). Writes stay
6905
+ // non-retryable.
6906
+ return ((isRetryableMethod(this.request?.method) ||
6907
+ isRetryableReadPost(this.request?.basePath)) &&
6925
6908
  (result.status === 429 || result.status === 503) &&
6926
6909
  context.attempt < this.config.maxRetries &&
6927
6910
  context.totalElapsedMs <= this.config.maxTimeToRetry);
@@ -6985,7 +6968,7 @@ function buildLuvioFetchRetryInterceptor() {
6985
6968
  return (request, doFetch) => {
6986
6969
  const csrfPolicy = new LuvioCsrfTokenRetryPolicy();
6987
6970
  const composedPolicy = new ComposedRetryPolicy([
6988
- new LuvioFetchThrottlingRetryPolicy(undefined, request.method),
6971
+ new LuvioFetchThrottlingRetryPolicy(undefined, request),
6989
6972
  csrfPolicy,
6990
6973
  ]);
6991
6974
  const retryService = new RetryService(composedPolicy);
@@ -7096,189 +7079,6 @@ function buildLuvioActionMarksSendInterceptor() {
7096
7079
  };
7097
7080
  }
7098
7081
 
7099
- /**
7100
- * Public UIAPI url paths verified for HTTP transport.
7101
- *
7102
- * Inclusion criteria:
7103
- * 1. The path's underlying Connect resource does NOT carry
7104
- * `clientFilters=@ConnectClientFilters({@ConnectClientFilter(key = "UiTier")...})`.
7105
- * 2. LDS actually invokes this URL via a Luvio adapter wired into
7106
- * `ldsEngineCreator.js` (i.e. there is a corresponding `*AdapterFactory`
7107
- * import). Connect resources with no LDS adapter are intentionally
7108
- * excluded — adding them produces no traffic and just bloats the matcher.
7109
- *
7110
- * Where a single Connect resource exposes multiple URL shapes (e.g. a 4-segment
7111
- * GET form alongside a 3-segment POST form), all forms LDS adapters can hit at
7112
- * runtime are registered.
7113
- */
7114
- const UIAPI_PUBLIC_PATHS = [
7115
- // ----- Object Info -----
7116
- // getObjectInfo — IObjectInfoResource
7117
- '/ui-api/object-info/{objectApiName}',
7118
- // getObjectInfos (batch) — IObjectInfoBatchResource
7119
- '/ui-api/object-info/batch/{objectApiNames}',
7120
- // getPicklistValues — IPicklistValuesResource
7121
- '/ui-api/object-info/{objectApiName}/picklist-values/{recordTypeId}/{fieldApiName}',
7122
- // getPicklistValuesByRecordType — IPicklistValuesByRecordTypeResource
7123
- '/ui-api/object-info/{objectApiName}/picklist-values/{recordTypeId}',
7124
- // ----- Records -----
7125
- // createRecord (POST) — IRecordDataCollectionResource
7126
- '/ui-api/records',
7127
- // getRecord / updateRecord (PATCH) / deleteRecord (DELETE) — IRecordDataResource
7128
- '/ui-api/records/{recordId}',
7129
- // getRecords (batch GET) — IBatchRecordDataResource
7130
- '/ui-api/records/batch/{recordIds}',
7131
- // executeBatchRecordOperations (POST, no recordIds segment) — IBatchRecordResource
7132
- '/ui-api/records/batch',
7133
- // getRecordUi — IRecordUiResource
7134
- '/ui-api/record-ui/{recordIds}',
7135
- // ----- Layout -----
7136
- // getLayout — ILayoutResource
7137
- '/ui-api/layout/{objectApiName}',
7138
- // getPathLayout — IPathLayoutResource
7139
- '/ui-api/path/layout/{objectApiName}',
7140
- // ----- Record Defaults -----
7141
- // getRecordCreateDefaults — IRecordCreateDefaultsResource
7142
- '/ui-api/record-defaults/create/{objectApiName}',
7143
- // getRecordDefaultsTemplateForCreate — IRecordDefaultsTemplateCreateResource
7144
- '/ui-api/record-defaults/template/create/{objectApiName}',
7145
- // getRecordDefaultsTemplateClone — IRecordDefaultsTemplateCloneResource
7146
- '/ui-api/record-defaults/template/clone/{recordId}',
7147
- // ----- Duplicates -----
7148
- // getDuplicateConfig — IDuplicateConfigResource
7149
- '/ui-api/duplicates/{objectApiName}',
7150
- // findDuplicates (POST) — IPredupeResource
7151
- '/ui-api/predupe',
7152
- // ----- GraphQL -----
7153
- // executeGraphQL (POST) — IGraphQLResource (no /ui-api prefix)
7154
- '/graphql',
7155
- // ----- List UI -----
7156
- // getListUiByName (2-segment form) — IListUiResource212
7157
- '/ui-api/list-ui/{objectApiName}/{listViewApiName}',
7158
- // 1-segment form covers both:
7159
- // /ui-api/list-ui/{listViewId} — IListUiResource
7160
- // /ui-api/list-ui/{objectApiName} — IListCollectionResource
7161
- '/ui-api/list-ui/{objectApiNameOrListViewId}',
7162
- // getListInfoByName (GET) / updateListInfoByApiName (PATCH) / deleteListInfo (DELETE) — IListInfoResource
7163
- // (Also covers /ui-api/list-info/{listViewId} via shape collision.)
7164
- '/ui-api/list-info/{objectApiName}/{listViewApiName}',
7165
- // getListInfosByObjectName (GET) / createListInfo (POST) — IListInfoCreationAndCollectionResource
7166
- // (Also covers /ui-api/list-info/batch — IListInfoBatchResource — via shape collision.)
7167
- '/ui-api/list-info/{objectApiName}',
7168
- // getListObjectInfo — IListObjectInfoResource
7169
- '/ui-api/list-object-info/{objectApiName}',
7170
- // postListRecordsByName (POST) — IListRecordsResource
7171
- '/ui-api/list-records/{objectApiName}/{listViewApiName}',
7172
- // getListPreferences (GET) / updateListPreferences (PATCH) — IListPreferencesResource
7173
- '/ui-api/list-preferences/{objectApiName}/{listViewApiName}',
7174
- // ----- Related List UI -----
7175
- // getRelatedListInfo (GET) / updateRelatedListInfo (PATCH) — IRelatedListInfoResource
7176
- // (Also covers /ui-api/related-list-info/{parentRecordId}/{relatedListId} via shape collision.)
7177
- '/ui-api/related-list-info/{parentObjectApiName}/{relatedListId}',
7178
- // getRelatedListInfoBatch — IRelatedListInfoBatchResource
7179
- '/ui-api/related-list-info/batch/{parentObjectApiName}/{relatedListNames}',
7180
- // getRelatedListsInfo (collection) — IRelatedListInfoCollectionResource
7181
- '/ui-api/related-list-info/{parentObjectApiName}',
7182
- // postRelatedListRecords (POST) — IRelatedListRecordsResource
7183
- '/ui-api/related-list-records/{parentRecordId}/{relatedListId}',
7184
- // postRelatedListRecordsBatch (POST, 3-segment form) — IRelatedListRecordsBatchResource
7185
- '/ui-api/related-list-records/batch/{parentRecordId}',
7186
- // getRelatedListRecordsBatch (GET, 4-segment form) — IRelatedListRecordsBatchResource [newly added]
7187
- '/ui-api/related-list-records/batch/{parentRecordId}/{relatedListIds}',
7188
- // getRelatedListCount — IRelatedListRecordCountResource
7189
- '/ui-api/related-list-count/{parentRecordId}/{relatedListId}',
7190
- // getRelatedListsCount (batch) — IRelatedListRecordCountBatchResource
7191
- '/ui-api/related-list-count/batch/{parentRecordId}/{relatedListNames}',
7192
- // getRelatedListPreferences (GET) / updateRelatedListPreferences (PATCH) — IRelatedListPreferencesResource
7193
- '/ui-api/related-list-preferences/{preferencesId}',
7194
- // getRelatedListPreferencesBatch — IRelatedListPreferencesBatchResource
7195
- '/ui-api/related-list-preferences/batch/{preferencesIds}',
7196
- // ----- Actions -----
7197
- // getGlobalActions — IActionGlobalResource
7198
- '/ui-api/actions/global',
7199
- // getActionLayout — IActionLayoutResource
7200
- '/ui-api/actions/layout/{actionApiName}',
7201
- // getLookupActions — IActionLookupResource
7202
- '/ui-api/actions/lookup/{objectApiNames}',
7203
- // getObjectCreateActions — IActionObjectResource
7204
- '/ui-api/actions/object/{objectApiName}/record-create',
7205
- // getActionOverrides — IActionOverrideResource
7206
- '/ui-api/actions/overrides/{objectApiName}',
7207
- // performQuickAction (POST) / performUpdateRecordQuickAction (PATCH) — IActionPerformQuickActionResource
7208
- '/ui-api/actions/perform-quick-action/{actionApiName}',
7209
- // getQuickActionInfo — IActionQuickActionInfoResource
7210
- '/ui-api/actions/quick-action-info/{actionApiName}',
7211
- // getRecordActions — IActionRecordResource
7212
- '/ui-api/actions/record/{recordIds}',
7213
- // getRecordEditActions — IActionRecordEditResource
7214
- '/ui-api/actions/record/{recordIds}/record-edit',
7215
- // getAllRelatedListActionsForRecord (4-segment form) — IActionRelatedListResource [newly added]
7216
- '/ui-api/actions/record/{recordIds}/related-list',
7217
- // postRelatedListActions (POST) — IActionRelatedListResource
7218
- '/ui-api/actions/record/{recordIds}/related-list/{relatedListId}',
7219
- // postRelatedListsActions (POST) / getRelatedListsActions (GET, 5-segment form) — IActionRelatedListBatchResource
7220
- '/ui-api/actions/record/{recordIds}/related-list/batch',
7221
- // getRelatedListsActions (GET, 6-segment form) — IActionRelatedListBatchResource [newly added]
7222
- '/ui-api/actions/record/{recordIds}/related-list/batch/{relatedListIds}',
7223
- // getRelatedListRecordActions — IActionRelatedListRecordResource
7224
- '/ui-api/actions/record/{recordIds}/related-list-record/{relatedListRecordIds}',
7225
- // getQuickActionDefaults — IActionQuickActionDefaultsResource
7226
- '/ui-api/actions/record-defaults/{actionApiName}',
7227
- // getFlexipageFormulaOverrides — IActionFlexipageFormulaActivationResource
7228
- '/ui-api/actions/formula-activation/{actionFeature}',
7229
- // ----- Lookup / Search -----
7230
- // lookup (POST) — ILookupEntityResource
7231
- '/ui-api/lookups/{objectApiName}/{keyPrefix}/{targetApiName}',
7232
- // searchResults (POST) — ISearchResultsResource
7233
- '/ui-api/search/results',
7234
- // searchKeywordResults (POST) — IKeywordSearchResultsResource
7235
- '/ui-api/search/results/keyword',
7236
- // getSearchFilterMetadata — ISearchInfoFilterMetadataCollectionResource
7237
- '/ui-api/search-info/{objectApiName}/filters',
7238
- // getSearchFilterOptions — ISearchInfoFilterOptionsResource
7239
- '/ui-api/search-info/{objectApiName}/filters/{filterApiName}/options',
7240
- // getLookupMetadata — ILookupMetadataResource
7241
- '/ui-api/search-info/{objectApiName}/lookup/{fieldApiName}',
7242
- // ----- MRU Lists -----
7243
- // getMruListUi — IMruListUiResource
7244
- '/ui-api/mru-list-ui/{objectApiName}',
7245
- // getMruListRecords — IMruListRecordsResource
7246
- '/ui-api/mru-list-records/{objectApiName}',
7247
- // ----- Apps / Nav -----
7248
- // getNavItems — INavItemsResource
7249
- '/ui-api/nav-items',
7250
- // getAllApps — IAppsResource
7251
- '/ui-api/apps',
7252
- // getAppDetails — IAppResource
7253
- '/ui-api/apps/{appId}',
7254
- ];
7255
- /**
7256
- * Private UIAPI url paths gated by the private-endpoint gates per runtime.
7257
- *
7258
- * Inclusion criteria:
7259
- * 1. The path's underlying Connect resource carries
7260
- * `clientFilters=@ConnectClientFilters({@ConnectClientFilter(key = "UiTier")...})`,
7261
- * which restricts callers to the UI tier (one.app / UISDK runtime) and
7262
- * excludes the public REST API.
7263
- * 2. LDS actually invokes this URL via a Luvio adapter wired into
7264
- * `ldsEngineCreator.js`.
7265
- */
7266
- const UIAPI_PRIVATE_PATHS = [
7267
- // ----- Record Avatars -----
7268
- // getRecordAvatars (batch) — IRecordAvatarsBatchResource
7269
- '/ui-api/record-avatars/batch/{recordIds}',
7270
- // updateRecordAvatar (POST) — IRecordAvatarsAssociationResource
7271
- '/ui-api/record-avatars/{recordId}/association',
7272
- // ----- Layout -----
7273
- // getLayoutUserState (GET) / updateLayoutUserState (PATCH) — ILayoutUserStateResource
7274
- '/ui-api/layout/{objectApiName}/user-state',
7275
- // ----- GraphQL -----
7276
- // executeGraphQLBatch (POST) — IGraphQLBatchResource (no /ui-api prefix)
7277
- '/graphql/batch',
7278
- // ----- Aggregate UI -----
7279
- // executeAggregateUi (POST) — IAggregateUiResource
7280
- '/ui-api/aggregate-ui',
7281
- ];
7282
7082
  /**
7283
7083
  * Single content documents version URL enabled/disabled by killswitch.
7284
7084
  * Exported for reuse in tests.
@@ -7337,14 +7137,8 @@ function getEnabledPaths() {
7337
7137
  }
7338
7138
  return Array.from(enabled);
7339
7139
  }
7340
- function buildMatchers(paths) {
7341
- return paths.map((path) => {
7342
- const regexString = path.replace(/\{.+?\}/g, '[^/]+');
7343
- return new RegExp(`^${regexString}$`);
7344
- });
7345
- }
7346
7140
  // Precompute enabled path matchers at module load to avoid per-request rebuild
7347
- const ENABLED_PATH_MATCHERS = buildMatchers(getEnabledPaths());
7141
+ const ENABLED_PATH_MATCHERS = compilePathMatchers(getEnabledPaths());
7348
7142
  /**
7349
7143
  * Indicates whether any predicate-enabled path sets are active.
7350
7144
  * Used by adapter composition to decide whether to include the fetch adapter.
@@ -7544,13 +7338,17 @@ const DEFAULT_CONFIG = {
7544
7338
  jitterPercent: 0.5,
7545
7339
  };
7546
7340
  class FetchThrottlingRetryPolicy extends RetryPolicy {
7547
- constructor(config = DEFAULT_CONFIG, method) {
7341
+ constructor(config = DEFAULT_CONFIG, method, operationType) {
7548
7342
  super();
7549
7343
  this.config = config;
7550
7344
  this.method = method;
7345
+ this.operationType = operationType;
7551
7346
  }
7552
7347
  async shouldRetry(result, context) {
7553
- return (isRetryableMethod(this.method) &&
7348
+ // A request is safe to replay when it's a GET or when OneStore has
7349
+ // flagged it as a read (operationType === 'query'), covering reads
7350
+ // issued over a non-GET method. Writes stay non-retryable.
7351
+ return ((isRetryableMethod(this.method) || isRetryableOperationType(this.operationType)) &&
7554
7352
  (result.status === 429 || result.status === 503) &&
7555
7353
  context.attempt < this.config.maxRetries &&
7556
7354
  context.totalElapsedMs <= this.config.maxTimeToRetry);
@@ -7616,19 +7414,21 @@ function buildCsrfPolicy(mutableRequest) {
7616
7414
  }
7617
7415
  /**
7618
7416
  * Built fresh per request so the write-guard check sees this request's own
7619
- * HTTP method, rather than one method baked in for the life of the service.
7417
+ * HTTP method and operationType, rather than values baked in for the life of
7418
+ * the service.
7620
7419
  */
7621
- function buildThrottlingPolicy(fetchArgs) {
7622
- return new FetchThrottlingRetryPolicy(undefined, getFetchMethod(fetchArgs));
7420
+ function buildThrottlingPolicy(fetchArgs, context) {
7421
+ return new FetchThrottlingRetryPolicy(undefined, getFetchMethod(fetchArgs), context?.operationType);
7623
7422
  }
7624
7423
  /**
7625
7424
  * Builds the retry interceptor used by the generic Conduit fetch service.
7626
7425
  *
7627
7426
  * Composes two independent per-request retry policies — throttling (429/503,
7628
- * GET-only) and CSRF (401 token refresh) — built fresh per request rather
7629
- * than reused off a shared defaultRetryPolicy. This keeps concurrent requests
7630
- * from sharing mutable CSRF request-context state, and lets the throttling
7631
- * policy see this request's own HTTP method.
7427
+ * retryable when the method is GET or the operationType is `query`) and CSRF
7428
+ * (401 token refresh) — built fresh per request rather than reused off a
7429
+ * shared defaultRetryPolicy. This keeps concurrent requests from sharing
7430
+ * mutable CSRF request-context state, and lets the throttling policy see this
7431
+ * request's own HTTP method and operationType.
7632
7432
  *
7633
7433
  * The `retryService` handed in by the framework is used only as the runner for
7634
7434
  * `applyRetry` — the real policy is always the per-request `composedPolicy`
@@ -7637,11 +7437,11 @@ function buildThrottlingPolicy(fetchArgs) {
7637
7437
  * intentionally opt out of retries), we fall through to a plain fetch.
7638
7438
  */
7639
7439
  function buildFetchRetryInterceptor() {
7640
- return async (fetchArgs, retryService, _context) => {
7440
+ return async (fetchArgs, retryService, context) => {
7641
7441
  if (retryService) {
7642
7442
  const mutableRequest = { args: fetchArgs };
7643
7443
  const composedPolicy = new ComposedRetryPolicy([
7644
- buildThrottlingPolicy(fetchArgs),
7444
+ buildThrottlingPolicy(fetchArgs, context),
7645
7445
  buildCsrfPolicy(mutableRequest),
7646
7446
  ]);
7647
7447
  return retryService.applyRetry(async () => {
@@ -10724,7 +10524,7 @@ function buildLexRuntimeCompressedFetchServiceDescriptor(logger, retryService) {
10724
10524
 
10725
10525
  const CSRF_TOKEN_KEY = 'salesforce_csrf_token';
10726
10526
  const CSRF_STORAGE_NAME = 'ldsCSRFToken';
10727
- const BASE_URI = '/services/data/v68.0';
10527
+ const BASE_URI = '/services/data/v69.0';
10728
10528
  const UI_API_BASE_URI = `${BASE_URI}/ui-api`;
10729
10529
  const CSRF_TOKEN_ENDPOINT = `${UI_API_BASE_URI}/session/csrf`;
10730
10530
  const CSRF_STORAGE_CONFIG = {
@@ -11579,4 +11379,4 @@ function ldsEngineCreator() {
11579
11379
  }
11580
11380
 
11581
11381
  export { LexRequestStrategy, PDL_ENGINE_REGISTRATION_ID, PdlPrefetcherEventType, PdlRequestPriority, buildPredictorForContext, configService, ldsEngineCreator as default, initializeLDS, initializeOneStore, notifyUpdateAvailableFactory, registerRequestStrategy, saveRequestAsPrediction, subscribeToPrefetcherEvents, unregisterRequestStrategy, whenPredictionsReady };
11582
- // version: 1.456.0-cef836b978
11382
+ // 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,10 +3,11 @@ 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
  * The `retryService` handed in by the framework is used only as the runner for
12
13
  * `applyRetry` — the real policy is always the per-request `composedPolicy`
@@ -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-one-app",
3
- "version": "1.456.0",
3
+ "version": "1.458.0",
4
4
  "license": "SEE LICENSE IN LICENSE.txt",
5
5
  "description": "LDS engine for the one.app (LEX) runtime.",
6
6
  "main": "dist/oneAppLdsEngineCreator.js",
@@ -34,61 +34,61 @@
34
34
  "release:corejar": "yarn build && ../core-build/scripts/core.js --name=lds-runtime-one-app"
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/oneAppLdsEngineCreator.js",
88
88
  "maxSize": {
89
- "none": "418 kB",
89
+ "none": "425 kB",
90
90
  "min": "190 kB",
91
- "compressed": "74 kB"
91
+ "compressed": "76 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;