@salesforce/lds-runtime-aura 1.402.0 → 1.403.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.
@@ -33,13 +33,13 @@ import { dispatchGlobalEvent, unstable_loadComponentDefs, executeGlobalControlle
33
33
  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';
34
34
  import { ThirdPartyTracker } from 'instrumentation:thirdPartyTracker';
35
35
  import { markStart, markEnd, counter, registerCacheStats, perfStart, perfEnd, registerPeriodicLogger, interaction, timer } from 'instrumentation/service';
36
- import { pageScopedCache } from 'instrumentation/utility';
37
- import { instrument as instrument$2, generateRequestId as generateRequestId$1, setupLexNetworkAdapter, internalRequestTracker } from 'force/ldsNetworkFetch';
36
+ import { instrument as instrument$2, setupLexNetworkAdapter, internalRequestTracker, generateRequestId as generateRequestId$1 } from 'force/ldsNetworkFetch';
38
37
  import { REFRESH_ADAPTER_EVENT, ADAPTER_UNFULFILLED_ERROR, instrument as instrument$3 } from 'force/ldsBindings';
39
38
  import { LRUCache, instrumentAdapter, instrumentLuvio, setupInstrumentation as setupInstrumentation$1, logObjectInfoChanged as logObjectInfoChanged$1, updatePercentileHistogramMetric, incrementCounterMetric, incrementGetRecordNotifyChangeAllowCount, incrementGetRecordNotifyChangeDropCount, incrementNotifyRecordUpdateAvailableAllowCount, incrementNotifyRecordUpdateAvailableDropCount, setLdsAdaptersUiapiInstrumentation, logError as logError$2, setLdsNetworkAdapterInstrumentation, incrementStateCreatedCount, executeAsyncActivity, METRIC_KEYS, onIdleDetected } from 'force/ldsInstrumentation';
40
39
  import { instrument as instrument$4 } from 'force/adsBridge';
41
40
  import { instrument as instrument$5 } from '@lwc/state';
42
41
  import { withRegistration, register, setDefaultLuvio } from 'force/ldsEngine';
42
+ import { pageScopedCache } from 'instrumentation/utility';
43
43
  import { createStorage, clearStorages } from 'force/ldsStorage';
44
44
  import useHotspotLimit from '@salesforce/gate/lds.pdl.useHotspotLimit';
45
45
  import useHttpUiapiOneApp from '@salesforce/gate/lds.useHttpUiapiOneApp';
@@ -2666,7 +2666,7 @@ function buildServiceDescriptor$d(luvio) {
2666
2666
  },
2667
2667
  };
2668
2668
  }
2669
- // version: 1.402.0-566b6c5389
2669
+ // version: 1.403.0-5476a05446
2670
2670
 
2671
2671
  /*!
2672
2672
  * Copyright (c) 2022, Salesforce, Inc.,
@@ -3004,7 +3004,7 @@ function buildServiceDescriptor$9(notifyRecordUpdateAvailable, getNormalizedLuvi
3004
3004
  },
3005
3005
  };
3006
3006
  }
3007
- // version: 1.402.0-566b6c5389
3007
+ // version: 1.403.0-5476a05446
3008
3008
 
3009
3009
  /*!
3010
3010
  * Copyright (c) 2022, Salesforce, Inc.,
@@ -3935,6 +3935,46 @@ function buildServiceDescriptor$2() {
3935
3935
  };
3936
3936
  }
3937
3937
 
3938
+ function createLockerCompatibleWireConstructor(DelegateCtor) {
3939
+ function Constructor(callback, sourceContext, options) {
3940
+ const delegate = new DelegateCtor(callback, sourceContext, options);
3941
+ this.connect = () => delegate.connect();
3942
+ this.disconnect = () => delegate.disconnect();
3943
+ this.update = (config, context) => delegate.update(config, context);
3944
+ }
3945
+ return Constructor;
3946
+ }
3947
+ function buildLWCWireBindingsServiceDescriptor() {
3948
+ const base = buildServiceDescriptor$1();
3949
+ const originalBind = base.service.bind.bind(base.service);
3950
+ const bind = (...args) => {
3951
+ const ctor = originalBind(...args);
3952
+ return createLockerCompatibleWireConstructor(ctor);
3953
+ };
3954
+ return {
3955
+ ...base,
3956
+ service: {
3957
+ ...base.service,
3958
+ bind,
3959
+ },
3960
+ };
3961
+ }
3962
+ function buildLWCGraphQLWireBindingsServiceDescriptor() {
3963
+ const base = buildServiceDescriptor$2();
3964
+ const originalBind = base.service.bind.bind(base.service);
3965
+ const bind = (...args) => {
3966
+ const ctor = originalBind(...args);
3967
+ return createLockerCompatibleWireConstructor(ctor);
3968
+ };
3969
+ return {
3970
+ ...base,
3971
+ service: {
3972
+ ...base.service,
3973
+ bind,
3974
+ },
3975
+ };
3976
+ }
3977
+
3938
3978
  /*!
3939
3979
  * Copyright (c) 2022, Salesforce, Inc.,
3940
3980
  * All rights reserved.
@@ -4629,204 +4669,6 @@ function generateRequestId() {
4629
4669
 
4630
4670
  function e(e){this.message=e;}e.prototype=new Error,e.prototype.name="InvalidCharacterError";"undefined"!=typeof window&&window.atob&&window.atob.bind(window)||function(r){var t=String(r).replace(/=+$/,"");if(t.length%4==1)throw new e("'atob' failed: The string to be decoded is not correctly encoded.");for(var n,o,a=0,i=0,c="";o=t.charAt(i++);~o&&(n=a%4?64*n+o:o,a++%4)?c+=String.fromCharCode(255&n>>(-2*a&6)):0)o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(o);return c};function n(e){this.message=e;}n.prototype=new Error,n.prototype.name="InvalidTokenError";
4631
4671
 
4632
- function buildLexRuntimeAuthExpirationRedirectResponseInterceptor(logger) {
4633
- return async (response) => {
4634
- if (response.status === 401) {
4635
- try {
4636
- const coercedResponse = (await coerceResponseToFetchResponse(response.clone()));
4637
- if (coercedResponse.body.errorCode === 'INVALID_SESSION_ID') {
4638
- logger.warn(`Received ${response.status} status code from LEX runtime service`);
4639
- // Fire the event asynchronously, similar to the legacy setTimeout pattern
4640
- window.setTimeout(() => {
4641
- dispatchGlobalEvent('aura:invalidSession');
4642
- }, 0);
4643
- }
4644
- }
4645
- catch (error) {
4646
- logger.warn(`Error parsing response from LEX runtime service: ${error}`);
4647
- }
4648
- }
4649
- return response;
4650
- };
4651
- }
4652
- function buildLexRuntimeLuvioAuthExpirationRedirectResponseInterceptor() {
4653
- return async (response) => {
4654
- if (response.status === 401) {
4655
- if (response.body.errorCode === 'INVALID_SESSION_ID') {
4656
- window.setTimeout(() => {
4657
- dispatchGlobalEvent('aura:invalidSession');
4658
- }, 0);
4659
- }
4660
- }
4661
- return response;
4662
- };
4663
- }
4664
-
4665
- /**
4666
- * Extracts the ErrorId from a server error response message.
4667
- * Looks for pattern: "ErrorId if you contact support: 1033627214-37969 (-1272663771)"
4668
- * Returns the numeric value in parentheses.
4669
- *
4670
- * @param responseBody The response body text to parse.
4671
- * @returns The extracted error ID, or null if not found.
4672
- */
4673
- function extractErrorIdFromResponse(responseBody) {
4674
- try {
4675
- const parsed = JSON.parse(responseBody);
4676
- if (Array.isArray(parsed) && parsed.length > 0 && parsed[0].message) {
4677
- const message = parsed[0].message;
4678
- // Look for pattern: "ErrorId if you contact support: XXXXXX-XXXXX (YYYYY)"
4679
- const match = message.match(/ErrorId[^:]*:\s*[\d-]+\s*\((-?\d+)\)/);
4680
- if (match && match[1]) {
4681
- return parseInt(match[1], 10);
4682
- }
4683
- }
4684
- }
4685
- catch (e) {
4686
- // If parsing fails, return null to use fallback
4687
- }
4688
- return null;
4689
- }
4690
- /**
4691
- * Generates a unique error ID for tracking specific error occurrences.
4692
- * Used as fallback when server doesn't provide an ErrorId.
4693
- *
4694
- * @param idInput The input value to hash.
4695
- * @returns A unique error ID in Salesforce-compatible numeric format.
4696
- */
4697
- function generateErrorId(idInput) {
4698
- let hash = 0;
4699
- if (!idInput || idInput.length === 0) {
4700
- return hash;
4701
- }
4702
- let i, chr;
4703
- for (i = 0; i < idInput.length; i++) {
4704
- chr = idInput.charCodeAt(i);
4705
- hash = (hash << 5) - hash + chr;
4706
- hash |= 0; // Convert to 32bit integer
4707
- }
4708
- return hash;
4709
- }
4710
- /**
4711
- * Gets error ID from response body or generates a fallback.
4712
- * Tries to extract server-provided ErrorId first, falls back to generated hash.
4713
- *
4714
- * @param responseBody The response body to parse.
4715
- * @param status The HTTP status code (for fallback).
4716
- * @param statusText The HTTP status text (for fallback, optional).
4717
- * @returns A numeric error ID.
4718
- */
4719
- function getOrGenerateErrorId(responseBody, status, statusText) {
4720
- const extractedId = extractErrorIdFromResponse(responseBody);
4721
- if (extractedId !== null) {
4722
- return extractedId;
4723
- }
4724
- // Fallback to generated error ID using status and timestamp
4725
- // statusText is optional and may not always be present
4726
- const context = [status, statusText || '', Date.now()].join('|');
4727
- return generateErrorId(context);
4728
- }
4729
- function buildLexRuntime5xxStatusResponseInterceptor(logger) {
4730
- return async (response) => {
4731
- if (response.status >= 500 && response.status < 600) {
4732
- const internalLogMessage = `LEX runtime 5xx: ${response.status} ${response.statusText || ''}`.trim();
4733
- logger.warn(internalLogMessage);
4734
- const userMessage = 'A server error occurred. Please try again later.';
4735
- // Try to extract ErrorId from response body, fallback to generated ID
4736
- let errorId;
4737
- try {
4738
- const responseText = await response.clone().text();
4739
- errorId = getOrGenerateErrorId(responseText, response.status, response.statusText);
4740
- }
4741
- catch (e) {
4742
- // If reading response fails, use fallback
4743
- const context = [response.status, response.statusText, Date.now()].join('|');
4744
- errorId = generateErrorId(context);
4745
- }
4746
- // Create an error object similar to Aura's current shape for system errors
4747
- const error = {
4748
- message: userMessage,
4749
- severity: 'ALERT',
4750
- name: 'LEXRuntimeError',
4751
- stack: null,
4752
- handled: false,
4753
- reported: false,
4754
- id: errorId,
4755
- };
4756
- const evtArgs = {
4757
- message: error.message,
4758
- error: null,
4759
- auraError: error,
4760
- };
4761
- // Fire the event asynchronously, similar to the legacy setTimeout pattern
4762
- window.setTimeout(() => {
4763
- dispatchGlobalEvent('markup://aura:systemError', evtArgs);
4764
- }, 0);
4765
- // Throw a simple error to terminate the request completely
4766
- // The consumer has NOT opted in to handle 5xx errors, so we don't return any response
4767
- // The systemError event above will handle showing the gack dialog
4768
- throw new Error(error.message);
4769
- }
4770
- return response;
4771
- };
4772
- }
4773
- function buildLexRuntimeLuvio5xxStatusResponseInterceptor() {
4774
- return async (response) => {
4775
- if (response.status >= 500 && response.status < 600) {
4776
- const userMessage = 'A server error occurred. Please try again later.';
4777
- // Try to extract ErrorId from response body, fallback to generated ID
4778
- let errorId;
4779
- try {
4780
- const responseBody = response.body ? JSON.stringify(response.body) : '';
4781
- errorId = getOrGenerateErrorId(responseBody, response.status, response.statusText);
4782
- }
4783
- catch (e) {
4784
- // If reading response fails, use fallback
4785
- const context = [response.status, response.statusText, Date.now()].join('|');
4786
- errorId = generateErrorId(context);
4787
- }
4788
- // Create an error object similar to Aura's current shape for system errors
4789
- const error = {
4790
- message: userMessage,
4791
- severity: 'ALERT',
4792
- name: 'LEXRuntimeError',
4793
- stack: null,
4794
- handled: false,
4795
- reported: false,
4796
- id: errorId,
4797
- };
4798
- const evtArgs = {
4799
- message: error.message,
4800
- error: null,
4801
- auraError: error,
4802
- };
4803
- // Fire the event asynchronously, similar to the legacy setTimeout pattern
4804
- window.setTimeout(() => {
4805
- dispatchGlobalEvent('markup://aura:systemError', evtArgs);
4806
- }, 0);
4807
- // Throw a simple error to terminate the request completely
4808
- // The consumer has NOT opted in to handle 5xx errors, so we don't return any response
4809
- // The systemError event above will handle showing the gack dialog
4810
- throw new Error(error.message);
4811
- }
4812
- return response;
4813
- };
4814
- }
4815
-
4816
- function buildPageScopedCacheRequestInterceptor() {
4817
- return async (fetchArgs) => {
4818
- const pageScopedCacheHeaders = {};
4819
- // Allow the instrumentation util to set up the header value on our "dummy" header object
4820
- pageScopedCache.addHeader(pageScopedCacheHeaders);
4821
- let returnedFetchArgs = fetchArgs;
4822
- // If it set a value, add it to our fetchParams
4823
- Object.entries(pageScopedCacheHeaders).forEach(([key, value]) => {
4824
- returnedFetchArgs = setHeader(key, value, returnedFetchArgs);
4825
- });
4826
- return resolvedPromiseLike$2(returnedFetchArgs);
4827
- };
4828
- }
4829
-
4830
4672
  /**
4831
4673
  * Copyright (c) 2022, Salesforce, Inc.,
4832
4674
  * All rights reserved.
@@ -4865,7 +4707,7 @@ function getEnvironmentSetting(name) {
4865
4707
  }
4866
4708
  return undefined;
4867
4709
  }
4868
- // version: 1.402.0-566b6c5389
4710
+ // version: 1.403.0-5476a05446
4869
4711
 
4870
4712
  /**
4871
4713
  * Observability / Critical Availability Program (230+)
@@ -5689,24 +5531,187 @@ function buildLuvioPageScopedCacheRequestInterceptor() {
5689
5531
  };
5690
5532
  }
5691
5533
 
5692
- const REQUEST_ID_KEY = 'X-SFDC-Request-Id';
5693
- function buildRequestIdInterceptor() {
5694
- return async (fetchArgs) => {
5695
- fetchArgs = setHeader(REQUEST_ID_KEY, generateRequestId$1(), fetchArgs);
5696
- return resolvedPromiseLike$2(fetchArgs);
5534
+ function buildLexRuntimeAuthExpirationRedirectResponseInterceptor(logger) {
5535
+ return async (response) => {
5536
+ if (response.status === 401) {
5537
+ try {
5538
+ const coercedResponse = (await coerceResponseToFetchResponse(response.clone()));
5539
+ if (coercedResponse.body.errorCode === 'INVALID_SESSION_ID') {
5540
+ logger.warn(`Received ${response.status} status code from LEX runtime service`);
5541
+ // Fire the event asynchronously, similar to the legacy setTimeout pattern
5542
+ window.setTimeout(() => {
5543
+ dispatchGlobalEvent('aura:invalidSession');
5544
+ }, 0);
5545
+ }
5546
+ }
5547
+ catch (error) {
5548
+ logger.warn(`Error parsing response from LEX runtime service: ${error}`);
5549
+ }
5550
+ }
5551
+ return response;
5697
5552
  };
5698
5553
  }
5699
- function buildLuvioRequestIdInterceptor() {
5700
- return (resourceRequest) => {
5701
- // Ensure headers object exists
5702
- if (!resourceRequest.headers) {
5703
- resourceRequest.headers = {};
5554
+ function buildLexRuntimeLuvioAuthExpirationRedirectResponseInterceptor() {
5555
+ return async (response) => {
5556
+ if (response.status === 401) {
5557
+ if (response.body.errorCode === 'INVALID_SESSION_ID') {
5558
+ window.setTimeout(() => {
5559
+ dispatchGlobalEvent('aura:invalidSession');
5560
+ }, 0);
5561
+ }
5704
5562
  }
5705
- // Don't overwrite request id header if it already exists
5706
- if (!resourceRequest.headers[REQUEST_ID_KEY]) {
5707
- resourceRequest.headers[REQUEST_ID_KEY] = generateRequestId$1();
5563
+ return response;
5564
+ };
5565
+ }
5566
+
5567
+ /**
5568
+ * Extracts the ErrorId from a server error response message.
5569
+ * Looks for pattern: "ErrorId if you contact support: 1033627214-37969 (-1272663771)"
5570
+ * Returns the numeric value in parentheses.
5571
+ *
5572
+ * @param responseBody The response body text to parse.
5573
+ * @returns The extracted error ID, or null if not found.
5574
+ */
5575
+ function extractErrorIdFromResponse(responseBody) {
5576
+ try {
5577
+ const parsed = JSON.parse(responseBody);
5578
+ if (Array.isArray(parsed) && parsed.length > 0 && parsed[0].message) {
5579
+ const message = parsed[0].message;
5580
+ // Look for pattern: "ErrorId if you contact support: XXXXXX-XXXXX (YYYYY)"
5581
+ const match = message.match(/ErrorId[^:]*:\s*[\d-]+\s*\((-?\d+)\)/);
5582
+ if (match && match[1]) {
5583
+ return parseInt(match[1], 10);
5584
+ }
5708
5585
  }
5709
- return resolvedPromiseLike$2(resourceRequest);
5586
+ }
5587
+ catch (e) {
5588
+ // If parsing fails, return null to use fallback
5589
+ }
5590
+ return null;
5591
+ }
5592
+ /**
5593
+ * Generates a unique error ID for tracking specific error occurrences.
5594
+ * Used as fallback when server doesn't provide an ErrorId.
5595
+ *
5596
+ * @param idInput The input value to hash.
5597
+ * @returns A unique error ID in Salesforce-compatible numeric format.
5598
+ */
5599
+ function generateErrorId(idInput) {
5600
+ let hash = 0;
5601
+ if (!idInput || idInput.length === 0) {
5602
+ return hash;
5603
+ }
5604
+ let i, chr;
5605
+ for (i = 0; i < idInput.length; i++) {
5606
+ chr = idInput.charCodeAt(i);
5607
+ hash = (hash << 5) - hash + chr;
5608
+ hash |= 0; // Convert to 32bit integer
5609
+ }
5610
+ return hash;
5611
+ }
5612
+ /**
5613
+ * Gets error ID from response body or generates a fallback.
5614
+ * Tries to extract server-provided ErrorId first, falls back to generated hash.
5615
+ *
5616
+ * @param responseBody The response body to parse.
5617
+ * @param status The HTTP status code (for fallback).
5618
+ * @param statusText The HTTP status text (for fallback, optional).
5619
+ * @returns A numeric error ID.
5620
+ */
5621
+ function getOrGenerateErrorId(responseBody, status, statusText) {
5622
+ const extractedId = extractErrorIdFromResponse(responseBody);
5623
+ if (extractedId !== null) {
5624
+ return extractedId;
5625
+ }
5626
+ // Fallback to generated error ID using status and timestamp
5627
+ // statusText is optional and may not always be present
5628
+ const context = [status, statusText || '', Date.now()].join('|');
5629
+ return generateErrorId(context);
5630
+ }
5631
+ function buildLexRuntime5xxStatusResponseInterceptor(logger) {
5632
+ return async (response) => {
5633
+ if (response.status >= 500 && response.status < 600) {
5634
+ const internalLogMessage = `LEX runtime 5xx: ${response.status} ${response.statusText || ''}`.trim();
5635
+ logger.warn(internalLogMessage);
5636
+ const userMessage = 'A server error occurred. Please try again later.';
5637
+ // Try to extract ErrorId from response body, fallback to generated ID
5638
+ let errorId;
5639
+ try {
5640
+ const responseText = await response.clone().text();
5641
+ errorId = getOrGenerateErrorId(responseText, response.status, response.statusText);
5642
+ }
5643
+ catch (e) {
5644
+ // If reading response fails, use fallback
5645
+ const context = [response.status, response.statusText, Date.now()].join('|');
5646
+ errorId = generateErrorId(context);
5647
+ }
5648
+ // Create an error object similar to Aura's current shape for system errors
5649
+ const error = {
5650
+ message: userMessage,
5651
+ severity: 'ALERT',
5652
+ name: 'LEXRuntimeError',
5653
+ stack: null,
5654
+ handled: false,
5655
+ reported: false,
5656
+ id: errorId,
5657
+ };
5658
+ const evtArgs = {
5659
+ message: error.message,
5660
+ error: null,
5661
+ auraError: error,
5662
+ };
5663
+ // Fire the event asynchronously, similar to the legacy setTimeout pattern
5664
+ window.setTimeout(() => {
5665
+ dispatchGlobalEvent('markup://aura:systemError', evtArgs);
5666
+ }, 0);
5667
+ // Throw a simple error to terminate the request completely
5668
+ // The consumer has NOT opted in to handle 5xx errors, so we don't return any response
5669
+ // The systemError event above will handle showing the gack dialog
5670
+ throw new Error(error.message);
5671
+ }
5672
+ return response;
5673
+ };
5674
+ }
5675
+ function buildLexRuntimeLuvio5xxStatusResponseInterceptor() {
5676
+ return async (response) => {
5677
+ if (response.status >= 500 && response.status < 600) {
5678
+ const userMessage = 'A server error occurred. Please try again later.';
5679
+ // Try to extract ErrorId from response body, fallback to generated ID
5680
+ let errorId;
5681
+ try {
5682
+ const responseBody = response.body ? JSON.stringify(response.body) : '';
5683
+ errorId = getOrGenerateErrorId(responseBody, response.status, response.statusText);
5684
+ }
5685
+ catch (e) {
5686
+ // If reading response fails, use fallback
5687
+ const context = [response.status, response.statusText, Date.now()].join('|');
5688
+ errorId = generateErrorId(context);
5689
+ }
5690
+ // Create an error object similar to Aura's current shape for system errors
5691
+ const error = {
5692
+ message: userMessage,
5693
+ severity: 'ALERT',
5694
+ name: 'LEXRuntimeError',
5695
+ stack: null,
5696
+ handled: false,
5697
+ reported: false,
5698
+ id: errorId,
5699
+ };
5700
+ const evtArgs = {
5701
+ message: error.message,
5702
+ error: null,
5703
+ auraError: error,
5704
+ };
5705
+ // Fire the event asynchronously, similar to the legacy setTimeout pattern
5706
+ window.setTimeout(() => {
5707
+ dispatchGlobalEvent('markup://aura:systemError', evtArgs);
5708
+ }, 0);
5709
+ // Throw a simple error to terminate the request completely
5710
+ // The consumer has NOT opted in to handle 5xx errors, so we don't return any response
5711
+ // The systemError event above will handle showing the gack dialog
5712
+ throw new Error(error.message);
5713
+ }
5714
+ return response;
5710
5715
  };
5711
5716
  }
5712
5717
 
@@ -5960,11 +5965,7 @@ const composedFetchNetworkAdapter = {
5960
5965
  return API_PATH_MATCHERS.some((matcher) => matcher.test(path));
5961
5966
  },
5962
5967
  adapter: setupLexNetworkAdapter(requestTracker, requestLogger, {
5963
- request: [
5964
- buildLuvioPageScopedCacheRequestInterceptor(),
5965
- buildLuvioRequestIdInterceptor(),
5966
- buildLuvioCsrfTokenInterceptor(),
5967
- ],
5968
+ request: [buildLuvioPageScopedCacheRequestInterceptor(), buildLuvioCsrfTokenInterceptor()],
5968
5969
  response: [
5969
5970
  buildLexRuntimeLuvio5xxStatusResponseInterceptor(),
5970
5971
  buildLexRuntimeLuvioAuthExpirationRedirectResponseInterceptor(),
@@ -5972,6 +5973,77 @@ const composedFetchNetworkAdapter = {
5972
5973
  }),
5973
5974
  };
5974
5975
 
5976
+ function buildThirdPartyTrackerFinishInterceptor() {
5977
+ return async (context) => {
5978
+ if (context && context.instrumentationId) {
5979
+ instrumentationTracker.markFinished(context.instrumentationId);
5980
+ }
5981
+ };
5982
+ }
5983
+
5984
+ function buildThirdPartyTrackerRegisterInterceptor() {
5985
+ return async (fetchArgs, context) => {
5986
+ if (context && context.instrumentationId) {
5987
+ instrumentationTracker.registerHandler(context.instrumentationId, 'onestore-inflight-network-request', () => {
5988
+ // return false until we signal we are finished
5989
+ return false;
5990
+ });
5991
+ }
5992
+ return resolvedPromiseLike$2(fetchArgs);
5993
+ };
5994
+ }
5995
+
5996
+ function createInstrumentationIdContext() {
5997
+ return () => ({
5998
+ instrumentationId: generateRequestId$1(),
5999
+ });
6000
+ }
6001
+ function createStartMark(requestId) {
6002
+ const startMark = markStart('transport', 'request');
6003
+ startMark.context = {
6004
+ auraXHRId: requestId,
6005
+ background: false,
6006
+ actionDefs: ['lds-fetch'],
6007
+ requestId,
6008
+ requestLength: -1, // not known
6009
+ };
6010
+ }
6011
+
6012
+ function buildPageScopedCacheRequestInterceptor() {
6013
+ return async (fetchArgs) => {
6014
+ const pageScopedCacheHeaders = {};
6015
+ // Allow the instrumentation util to set up the header value on our "dummy" header object
6016
+ pageScopedCache.addHeader(pageScopedCacheHeaders);
6017
+ let returnedFetchArgs = fetchArgs;
6018
+ // If it set a value, add it to our fetchParams
6019
+ Object.entries(pageScopedCacheHeaders).forEach(([key, value]) => {
6020
+ returnedFetchArgs = setHeader(key, value, returnedFetchArgs);
6021
+ });
6022
+ return resolvedPromiseLike$2(returnedFetchArgs);
6023
+ };
6024
+ }
6025
+
6026
+ const SFDC_REQUEST_ID_KEY = 'X-SFDC-Request-Id';
6027
+ function buildTransportMarksSendInterceptor() {
6028
+ return async (fetchArgs, context) => {
6029
+ // First set the requestId header. If there's not context, it means we won't be able to track the mark and something is hosed, and so not worth even trying
6030
+ if (context && context.instrumentationId) {
6031
+ const requestId = context.instrumentationId;
6032
+ fetchArgs = setHeader(SFDC_REQUEST_ID_KEY, requestId, fetchArgs);
6033
+ createStartMark(requestId);
6034
+ }
6035
+ return resolvedPromiseLike$2(fetchArgs);
6036
+ };
6037
+ }
6038
+
6039
+ function buildTransportMarksReceiveInterceptor() {
6040
+ return async (context) => {
6041
+ if (context && context.instrumentationId) {
6042
+ markEnd('transport', 'request', { auraXHRId: context.instrumentationId });
6043
+ }
6044
+ };
6045
+ }
6046
+
5975
6047
  const DEFAULT_CONFIG$1 = {
5976
6048
  maxRetries: 1, // Only retry once after token refresh
5977
6049
  };
@@ -6075,15 +6147,21 @@ async function isCsrfError(response) {
6075
6147
 
6076
6148
  function buildLexRuntimeDefaultFetchServiceDescriptor(logger, retryService) {
6077
6149
  const fetchService = buildLexConnectFetchServiceDescriptor({
6150
+ createContext: createInstrumentationIdContext(),
6078
6151
  request: [
6152
+ buildThirdPartyTrackerRegisterInterceptor(),
6079
6153
  buildPageScopedCacheRequestInterceptor(),
6080
- buildRequestIdInterceptor(),
6154
+ buildTransportMarksSendInterceptor(),
6081
6155
  buildCsrfTokenInterceptor(),
6082
6156
  ],
6083
6157
  response: [
6084
6158
  buildLexRuntime5xxStatusResponseInterceptor(logger),
6085
6159
  buildLexRuntimeAuthExpirationRedirectResponseInterceptor(logger),
6086
6160
  ],
6161
+ finally: [
6162
+ buildTransportMarksReceiveInterceptor(),
6163
+ buildThirdPartyTrackerFinishInterceptor(),
6164
+ ],
6087
6165
  }, retryService);
6088
6166
  return {
6089
6167
  ...fetchService,
@@ -6091,30 +6169,34 @@ function buildLexRuntimeDefaultFetchServiceDescriptor(logger, retryService) {
6091
6169
  }
6092
6170
  function buildLexRuntimeAllow5xxFetchServiceDescriptor(logger, retryService) {
6093
6171
  const fetchService = buildLexConnectFetchServiceDescriptor({
6172
+ createContext: createInstrumentationIdContext(),
6094
6173
  request: [
6174
+ buildThirdPartyTrackerRegisterInterceptor(),
6095
6175
  buildPageScopedCacheRequestInterceptor(),
6096
- buildRequestIdInterceptor(),
6176
+ buildTransportMarksSendInterceptor(),
6097
6177
  buildCsrfTokenInterceptor(),
6098
6178
  ],
6099
6179
  response: [buildLexRuntimeAuthExpirationRedirectResponseInterceptor(logger)],
6180
+ finally: [
6181
+ buildTransportMarksReceiveInterceptor(),
6182
+ buildThirdPartyTrackerFinishInterceptor(),
6183
+ ],
6100
6184
  }, retryService);
6101
6185
  return {
6102
6186
  ...fetchService,
6103
6187
  tags: { interceptors: 'allow_500s' },
6104
6188
  };
6105
6189
  }
6106
- function buildLexConnectFetchServiceDescriptor(interceptors = { request: [], response: [] }, retryService) {
6190
+ // Temporarily cloned from conduit fetch until the retry service is updated there
6191
+ function buildLexConnectFetchServiceDescriptor(interceptors = { request: [], response: [], finally: [] }, retryService) {
6107
6192
  return {
6108
6193
  type: 'fetch',
6109
6194
  version: '1.0',
6110
6195
  service: function (...args) {
6111
- const { request: requestInterceptors = [], response: responseInterceptors = [] } = interceptors;
6112
- const pending = requestInterceptors.reduce((previousPromise, interceptor) => previousPromise.then(interceptor), resolvedPromiseLike$2(args));
6113
- const trackerId = generateRequestId$1();
6114
- instrumentationTracker.registerHandler(trackerId, 'onestore-inflight-network-request', () => {
6115
- // return false until we signal we are finished
6116
- return false;
6117
- });
6196
+ // Create context per request if factory is provided
6197
+ const context = interceptors.createContext?.();
6198
+ const { request: requestInterceptors = [], response: responseInterceptors = [], finally: finallyInterceptors = [], } = interceptors;
6199
+ const pending = requestInterceptors.reduce((previousPromise, interceptor) => previousPromise.then((args) => interceptor(args, context)), resolvedPromiseLike$2(args));
6118
6200
  return Promise.resolve(pending)
6119
6201
  .then((interceptedArgs) => {
6120
6202
  if (retryService) {
@@ -6141,10 +6223,15 @@ function buildLexConnectFetchServiceDescriptor(interceptors = { request: [], res
6141
6223
  return fetch(...interceptedArgs);
6142
6224
  })
6143
6225
  .then((response) => {
6144
- return responseInterceptors.reduce((previousPromise, interceptor) => previousPromise.then(interceptor), resolvedPromiseLike$2(response));
6226
+ // Success path - run response interceptors
6227
+ return responseInterceptors.reduce((previousPromise, interceptor) => previousPromise.then((response) => interceptor(response, context)), resolvedPromiseLike$2(response));
6145
6228
  })
6146
6229
  .finally(() => {
6147
- instrumentationTracker.markFinished(trackerId);
6230
+ // Always run finally interceptors for cleanup
6231
+ if (finallyInterceptors.length > 0) {
6232
+ // Run all finally interceptors sequentially
6233
+ return finallyInterceptors.reduce((previousPromise, interceptor) => previousPromise.then(() => interceptor(context)), Promise.resolve());
6234
+ }
6148
6235
  });
6149
6236
  },
6150
6237
  };
@@ -6155,7 +6242,9 @@ const sfapJwtRepository = new JwtRepository();
6155
6242
  const sfapJwtManager = new JwtManager(sfapJwtRepository, platformSfapJwtResolver);
6156
6243
  function buildJwtAuthorizedSfapFetchServiceDescriptor(logger) {
6157
6244
  const jwtAuthorizedFetchService = buildLexConnectFetchServiceDescriptor({
6158
- request: [buildJwtRequestInterceptor(logger)],
6245
+ createContext: createInstrumentationIdContext(),
6246
+ request: [buildThirdPartyTrackerRegisterInterceptor(), buildJwtRequestInterceptor(logger)],
6247
+ finally: [buildThirdPartyTrackerFinishInterceptor()],
6159
6248
  });
6160
6249
  return {
6161
6250
  ...jwtAuthorizedFetchService,
@@ -6174,7 +6263,9 @@ function buildCopilotFetchServiceDescriptor(logger) {
6174
6263
  // Interceptor here with the logic in buildJwtAuthorizedSfapFetchServiceDescriptor()
6175
6264
  // above.
6176
6265
  ...buildLexConnectFetchServiceDescriptor({
6266
+ createContext: createInstrumentationIdContext(),
6177
6267
  request: [
6268
+ buildThirdPartyTrackerRegisterInterceptor(),
6178
6269
  // Note that this function is VERY closely tied to the fetchParams generated
6179
6270
  // by copilotStartSessionCommand. Any changes to those parameters will require
6180
6271
  // corresponding updates to the logic below.
@@ -6214,12 +6305,17 @@ function buildCopilotFetchServiceDescriptor(logger) {
6214
6305
  },
6215
6306
  buildJwtRequestInterceptor(logger),
6216
6307
  ],
6308
+ finally: [buildThirdPartyTrackerFinishInterceptor()],
6217
6309
  }),
6218
6310
  tags: { specialHacksFor: 'copilot' },
6219
6311
  };
6220
6312
  }
6221
6313
  function buildUnauthorizedFetchServiceDescriptor() {
6222
- const fetchService = buildLexConnectFetchServiceDescriptor();
6314
+ const fetchService = buildLexConnectFetchServiceDescriptor({
6315
+ createContext: createInstrumentationIdContext(),
6316
+ request: [buildThirdPartyTrackerRegisterInterceptor()],
6317
+ finally: [buildThirdPartyTrackerFinishInterceptor()],
6318
+ });
6223
6319
  return {
6224
6320
  ...fetchService,
6225
6321
  tags: { authenticationScopes: '' },
@@ -9664,8 +9760,8 @@ function initializeOneStore(luvio) {
9664
9760
  buildServiceDescriptor$2$1(),
9665
9761
  buildServiceDescriptor$1$1(),
9666
9762
  buildServiceDescriptor$7(),
9667
- buildServiceDescriptor$1(),
9668
- buildServiceDescriptor$2(),
9763
+ buildLWCWireBindingsServiceDescriptor(),
9764
+ buildLWCGraphQLWireBindingsServiceDescriptor(),
9669
9765
  ];
9670
9766
  setServices(services);
9671
9767
  }
@@ -9685,4 +9781,4 @@ function ldsEngineCreator() {
9685
9781
  }
9686
9782
 
9687
9783
  export { LexRequestStrategy, PdlRequestPriority, buildPredictorForContext, ldsEngineCreator as default, initializeLDS, initializeOneStore, notifyUpdateAvailableFactory, registerRequestStrategy, saveRequestAsPrediction, unregisterRequestStrategy, whenPredictionsReady };
9688
- // version: 1.402.0-bf9ae185ef
9784
+ // version: 1.403.0-bc09fbc54b
@@ -10,8 +10,8 @@ export declare function gauge(): {
10
10
  reset(): void;
11
11
  };
12
12
  export declare function mark(): void;
13
- export declare function markStart(): void;
14
- export declare function markEnd(): void;
13
+ export declare function markStart(): {};
14
+ export declare function markEnd(): {};
15
15
  export declare function perfStart(): void;
16
16
  export declare function perfEnd(): void;
17
17
  export declare function percentileHistogram(): {
@@ -3,4 +3,4 @@ import { Interceptors, type FetchServiceDescriptor } from '@conduit-client/servi
3
3
  import { RetryService } from '@conduit-client/service-retry/v1';
4
4
  export declare function buildLexRuntimeDefaultFetchServiceDescriptor(logger: LoggerService, retryService?: RetryService<Response>): FetchServiceDescriptor;
5
5
  export declare function buildLexRuntimeAllow5xxFetchServiceDescriptor(logger: LoggerService, retryService?: RetryService<Response>): FetchServiceDescriptor;
6
- export declare function buildLexConnectFetchServiceDescriptor(interceptors?: Interceptors, retryService?: RetryService<Response>): FetchServiceDescriptor;
6
+ export declare function buildLexConnectFetchServiceDescriptor<Context = any>(interceptors?: Interceptors<Context>, retryService?: RetryService<Response>): FetchServiceDescriptor;
@@ -0,0 +1,2 @@
1
+ import { FinallyInterceptor } from '@conduit-client/service-fetch-network/v1';
2
+ export declare function buildThirdPartyTrackerFinishInterceptor(): FinallyInterceptor;
@@ -0,0 +1,3 @@
1
+ import { FinallyInterceptor } from '@conduit-client/service-fetch-network/v1';
2
+ export declare function buildTransportMarksReceiveInterceptor(): FinallyInterceptor;
3
+ export declare function buildLuvioTransportMarksReceiveInterceptor(): FinallyInterceptor;
@@ -0,0 +1,4 @@
1
+ export declare function createInstrumentationIdContext(): () => {
2
+ instrumentationId: string;
3
+ };
4
+ export declare function createStartMark(requestId: string): void;
@@ -0,0 +1,3 @@
1
+ import type { LWCWireBindingsServiceDescriptor, LWCGraphQLWireBindingsServiceDescriptor } from '@conduit-client/service-bindings-lwc/v1';
2
+ export declare function buildLWCWireBindingsServiceDescriptor(): LWCWireBindingsServiceDescriptor;
3
+ export declare function buildLWCGraphQLWireBindingsServiceDescriptor(): LWCGraphQLWireBindingsServiceDescriptor;
@@ -0,0 +1,2 @@
1
+ import { RequestInterceptor } from '@conduit-client/service-fetch-network/v1';
2
+ export declare function buildThirdPartyTrackerRegisterInterceptor(): RequestInterceptor;
@@ -0,0 +1,5 @@
1
+ import { RequestInterceptor } from '@conduit-client/service-fetch-network/v1';
2
+ import { ResourceRequest } from '@luvio/engine';
3
+ export declare const SFDC_REQUEST_ID_KEY = "X-SFDC-Request-Id";
4
+ export declare function buildTransportMarksSendInterceptor(): RequestInterceptor;
5
+ export declare function buildLuvioTransportMarksSendInterceptor(): (resourceRequest: ResourceRequest, context?: any) => PromiseLike<ResourceRequest>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salesforce/lds-runtime-aura",
3
- "version": "1.402.0",
3
+ "version": "1.403.0",
4
4
  "license": "SEE LICENSE IN LICENSE.txt",
5
5
  "description": "LDS engine for Aura runtime",
6
6
  "main": "dist/ldsEngineCreator.js",
@@ -36,14 +36,14 @@
36
36
  "devDependencies": {
37
37
  "@conduit-client/service-provisioner": "3.2.0",
38
38
  "@conduit-client/tools-core": "3.2.0",
39
- "@salesforce/lds-adapters-apex": "^1.402.0",
40
- "@salesforce/lds-adapters-uiapi": "^1.402.0",
41
- "@salesforce/lds-ads-bridge": "^1.402.0",
42
- "@salesforce/lds-aura-storage": "^1.402.0",
43
- "@salesforce/lds-bindings": "^1.402.0",
44
- "@salesforce/lds-instrumentation": "^1.402.0",
45
- "@salesforce/lds-network-aura": "^1.402.0",
46
- "@salesforce/lds-network-fetch": "^1.402.0",
39
+ "@salesforce/lds-adapters-apex": "^1.403.0",
40
+ "@salesforce/lds-adapters-uiapi": "^1.403.0",
41
+ "@salesforce/lds-ads-bridge": "^1.403.0",
42
+ "@salesforce/lds-aura-storage": "^1.403.0",
43
+ "@salesforce/lds-bindings": "^1.403.0",
44
+ "@salesforce/lds-instrumentation": "^1.403.0",
45
+ "@salesforce/lds-network-aura": "^1.403.0",
46
+ "@salesforce/lds-network-fetch": "^1.403.0",
47
47
  "jwt-encode": "1.0.1"
48
48
  },
49
49
  "dependencies": {
@@ -71,10 +71,10 @@
71
71
  "@luvio/network-adapter-composable": "0.158.7",
72
72
  "@luvio/network-adapter-fetch": "0.158.7",
73
73
  "@lwc/state": "^0.23.0",
74
- "@salesforce/lds-adapters-onestore-graphql": "^1.402.0",
75
- "@salesforce/lds-adapters-uiapi-lex": "^1.402.0",
76
- "@salesforce/lds-luvio-service": "^1.402.0",
77
- "@salesforce/lds-luvio-uiapi-records-service": "^1.402.0"
74
+ "@salesforce/lds-adapters-onestore-graphql": "^1.403.0",
75
+ "@salesforce/lds-adapters-uiapi-lex": "^1.403.0",
76
+ "@salesforce/lds-luvio-service": "^1.403.0",
77
+ "@salesforce/lds-luvio-uiapi-records-service": "^1.403.0"
78
78
  },
79
79
  "luvioBundlesize": [
80
80
  {
@@ -1,4 +0,0 @@
1
- import { RequestInterceptor } from '@conduit-client/service-fetch-network/v1';
2
- import { ResourceRequest } from '@luvio/engine';
3
- export declare function buildRequestIdInterceptor(): RequestInterceptor;
4
- export declare function buildLuvioRequestIdInterceptor(): (resourceRequest: ResourceRequest) => PromiseLike<ResourceRequest>;