@salesforce/lds-runtime-aura 1.402.0 → 1.404.0-dev1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ldsEngineCreator.js +412 -393
- package/dist/types/__mocks__/instrumentation/service.d.ts +2 -2
- package/dist/types/fetch-service-descriptors/lex-fetch-service.d.ts +1 -1
- package/dist/types/finally-interceptors/third-party-tracker-finish.d.ts +2 -0
- package/dist/types/finally-interceptors/transport-receive.d.ts +3 -0
- package/dist/types/instrumentation-utils.d.ts +4 -0
- package/dist/types/locker-wire-bindings.d.ts +3 -0
- package/dist/types/request-interceptors/third-party-tracker-register.d.ts +2 -0
- package/dist/types/request-interceptors/transport-send.d.ts +5 -0
- package/package.json +13 -13
- package/dist/types/request-interceptors/request-id.d.ts +0 -4
package/dist/ldsEngineCreator.js
CHANGED
|
@@ -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 {
|
|
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.
|
|
2669
|
+
// version: 1.404.0-dev1-9582436c8f
|
|
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.
|
|
3007
|
+
// version: 1.404.0-dev1-9582436c8f
|
|
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.
|
|
4710
|
+
// version: 1.404.0-dev1-9582436c8f
|
|
4869
4711
|
|
|
4870
4712
|
/**
|
|
4871
4713
|
* Observability / Critical Availability Program (230+)
|
|
@@ -5689,35 +5531,338 @@ function buildLuvioPageScopedCacheRequestInterceptor() {
|
|
|
5689
5531
|
};
|
|
5690
5532
|
}
|
|
5691
5533
|
|
|
5692
|
-
|
|
5693
|
-
|
|
5694
|
-
|
|
5695
|
-
|
|
5696
|
-
|
|
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
|
|
5700
|
-
return (
|
|
5701
|
-
|
|
5702
|
-
|
|
5703
|
-
|
|
5704
|
-
|
|
5705
|
-
|
|
5706
|
-
|
|
5707
|
-
resourceRequest.headers[REQUEST_ID_KEY] = generateRequestId$1();
|
|
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
|
+
}
|
|
5708
5562
|
}
|
|
5709
|
-
return
|
|
5563
|
+
return response;
|
|
5710
5564
|
};
|
|
5711
5565
|
}
|
|
5712
5566
|
|
|
5713
|
-
|
|
5714
|
-
|
|
5715
|
-
|
|
5716
|
-
|
|
5717
|
-
|
|
5718
|
-
|
|
5719
|
-
|
|
5720
|
-
|
|
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
|
+
}
|
|
5585
|
+
}
|
|
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;
|
|
5715
|
+
};
|
|
5716
|
+
}
|
|
5717
|
+
|
|
5718
|
+
const API_PATHS = [
|
|
5719
|
+
// getLookupActions
|
|
5720
|
+
// '/ui-api/actions/lookup/{objectApiNames}',
|
|
5721
|
+
// getRecordActions
|
|
5722
|
+
// '/ui-api/actions/record/{recordIds}',
|
|
5723
|
+
// getRelatedListActions
|
|
5724
|
+
// '/ui-api/actions/record/{recordIds}/related-list/{relatedListId}',
|
|
5725
|
+
// getDuplicateConfiguration
|
|
5726
|
+
// '/ui-api/duplicates/{objectApiName}',
|
|
5727
|
+
// getListInfosByObjectName
|
|
5728
|
+
// '/ui-api/list-info/{objectApiName}',
|
|
5729
|
+
// getLookupRecords
|
|
5730
|
+
// '/ui-api/lookups/{objectApiName}/{fieldApiName}',
|
|
5731
|
+
// getObjectInfo
|
|
5732
|
+
'/ui-api/object-info/{objectApiName}',
|
|
5733
|
+
// getObjectInfos
|
|
5734
|
+
// '/ui-api/object-info/batch/{objectApiNames}',
|
|
5735
|
+
// getPicklistValuesByRecordType
|
|
5736
|
+
// '/ui-api/object-info/{objectApiName}/picklist-values/{recordTypeId}',
|
|
5737
|
+
// getDuplicates
|
|
5738
|
+
// '/ui-api/predupe',
|
|
5739
|
+
// getRecord
|
|
5740
|
+
// '/ui-api/records/{recordId}',
|
|
5741
|
+
// getRecordUi
|
|
5742
|
+
// '/ui-api/record-ui/{recordIds}',
|
|
5743
|
+
// getRelatedListInfo
|
|
5744
|
+
// '/ui-api/related-list-info/{parentObjectApiName}/{relatedListId}',
|
|
5745
|
+
// getRelatedListRecords
|
|
5746
|
+
// '/ui-api/related-list-records/{parentRecordId}/{relatedListId}',
|
|
5747
|
+
];
|
|
5748
|
+
const API_PATH_MATCHERS = API_PATHS.map((path) => {
|
|
5749
|
+
const regexString = path.replace(/\{.+?\}/g, '[^/]+');
|
|
5750
|
+
return new RegExp(`^${regexString}$`);
|
|
5751
|
+
});
|
|
5752
|
+
const requestTracker = {
|
|
5753
|
+
hasTracker: () => ThirdPartyTracker !== undefined,
|
|
5754
|
+
registerHandler: (request, name, loadedCheck) => {
|
|
5755
|
+
ThirdPartyTracker.registerHandler(request, name, loadedCheck);
|
|
5756
|
+
},
|
|
5757
|
+
markFinished: (request) => {
|
|
5758
|
+
ThirdPartyTracker.markLoaded(request);
|
|
5759
|
+
},
|
|
5760
|
+
};
|
|
5761
|
+
const instrumentationTracker = requestTracker && requestTracker.hasTracker() ? requestTracker : internalRequestTracker;
|
|
5762
|
+
const requestLogger = {
|
|
5763
|
+
resolve: (request, response = {}) => {
|
|
5764
|
+
checkAndLogCrudInteraction(request, true, null, response);
|
|
5765
|
+
},
|
|
5766
|
+
reject: (request, error) => {
|
|
5767
|
+
checkAndLogCrudInteraction(request, false, error);
|
|
5768
|
+
},
|
|
5769
|
+
};
|
|
5770
|
+
const composedFetchNetworkAdapter = {
|
|
5771
|
+
shouldHandleRequest(resourceRequest) {
|
|
5772
|
+
let path = resourceRequest.basePath.trim();
|
|
5773
|
+
if (path.endsWith('/')) {
|
|
5774
|
+
path = path.substring(0, path.length - 1);
|
|
5775
|
+
}
|
|
5776
|
+
return API_PATH_MATCHERS.some((matcher) => matcher.test(path));
|
|
5777
|
+
},
|
|
5778
|
+
adapter: setupLexNetworkAdapter(requestTracker, requestLogger, {
|
|
5779
|
+
request: [buildLuvioPageScopedCacheRequestInterceptor()],
|
|
5780
|
+
response: [
|
|
5781
|
+
buildLexRuntimeLuvio5xxStatusResponseInterceptor(),
|
|
5782
|
+
buildLexRuntimeLuvioAuthExpirationRedirectResponseInterceptor(),
|
|
5783
|
+
],
|
|
5784
|
+
}),
|
|
5785
|
+
};
|
|
5786
|
+
|
|
5787
|
+
function buildThirdPartyTrackerFinishInterceptor() {
|
|
5788
|
+
return async (context) => {
|
|
5789
|
+
if (context && context.instrumentationId) {
|
|
5790
|
+
instrumentationTracker.markFinished(context.instrumentationId);
|
|
5791
|
+
}
|
|
5792
|
+
};
|
|
5793
|
+
}
|
|
5794
|
+
|
|
5795
|
+
function buildThirdPartyTrackerRegisterInterceptor() {
|
|
5796
|
+
return async (fetchArgs, context) => {
|
|
5797
|
+
if (context && context.instrumentationId) {
|
|
5798
|
+
instrumentationTracker.registerHandler(context.instrumentationId, 'onestore-inflight-network-request', () => {
|
|
5799
|
+
// return false until we signal we are finished
|
|
5800
|
+
return false;
|
|
5801
|
+
});
|
|
5802
|
+
}
|
|
5803
|
+
return resolvedPromiseLike$2(fetchArgs);
|
|
5804
|
+
};
|
|
5805
|
+
}
|
|
5806
|
+
|
|
5807
|
+
function createInstrumentationIdContext() {
|
|
5808
|
+
return () => ({
|
|
5809
|
+
instrumentationId: generateRequestId$1(),
|
|
5810
|
+
});
|
|
5811
|
+
}
|
|
5812
|
+
function createStartMark(requestId) {
|
|
5813
|
+
const startMark = markStart('transport', 'request');
|
|
5814
|
+
startMark.context = {
|
|
5815
|
+
auraXHRId: requestId,
|
|
5816
|
+
background: false,
|
|
5817
|
+
actionDefs: ['lds-fetch'],
|
|
5818
|
+
requestId,
|
|
5819
|
+
requestLength: -1, // not known
|
|
5820
|
+
};
|
|
5821
|
+
}
|
|
5822
|
+
|
|
5823
|
+
function buildPageScopedCacheRequestInterceptor() {
|
|
5824
|
+
return async (fetchArgs) => {
|
|
5825
|
+
const pageScopedCacheHeaders = {};
|
|
5826
|
+
// Allow the instrumentation util to set up the header value on our "dummy" header object
|
|
5827
|
+
pageScopedCache.addHeader(pageScopedCacheHeaders);
|
|
5828
|
+
let returnedFetchArgs = fetchArgs;
|
|
5829
|
+
// If it set a value, add it to our fetchParams
|
|
5830
|
+
Object.entries(pageScopedCacheHeaders).forEach(([key, value]) => {
|
|
5831
|
+
returnedFetchArgs = setHeader(key, value, returnedFetchArgs);
|
|
5832
|
+
});
|
|
5833
|
+
return resolvedPromiseLike$2(returnedFetchArgs);
|
|
5834
|
+
};
|
|
5835
|
+
}
|
|
5836
|
+
|
|
5837
|
+
const SFDC_REQUEST_ID_KEY = 'X-SFDC-Request-Id';
|
|
5838
|
+
function buildTransportMarksSendInterceptor() {
|
|
5839
|
+
return async (fetchArgs, context) => {
|
|
5840
|
+
// 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
|
|
5841
|
+
if (context && context.instrumentationId) {
|
|
5842
|
+
const requestId = context.instrumentationId;
|
|
5843
|
+
fetchArgs = setHeader(SFDC_REQUEST_ID_KEY, requestId, fetchArgs);
|
|
5844
|
+
createStartMark(requestId);
|
|
5845
|
+
}
|
|
5846
|
+
return resolvedPromiseLike$2(fetchArgs);
|
|
5847
|
+
};
|
|
5848
|
+
}
|
|
5849
|
+
|
|
5850
|
+
function buildTransportMarksReceiveInterceptor() {
|
|
5851
|
+
return async (context) => {
|
|
5852
|
+
if (context && context.instrumentationId) {
|
|
5853
|
+
markEnd('transport', 'request', { auraXHRId: context.instrumentationId });
|
|
5854
|
+
}
|
|
5855
|
+
};
|
|
5856
|
+
}
|
|
5857
|
+
|
|
5858
|
+
const CSRF_TOKEN_KEY = 'salesforce_csrf_token';
|
|
5859
|
+
const CSRF_STORAGE_NAME = 'ldsCSRFToken';
|
|
5860
|
+
const CSRF_STORAGE_CONFIG = {
|
|
5861
|
+
name: CSRF_STORAGE_NAME,
|
|
5862
|
+
persistent: true,
|
|
5863
|
+
secure: true,
|
|
5864
|
+
maxSize: 1024,
|
|
5865
|
+
expiration: 24 * 60 * 60,
|
|
5721
5866
|
clearOnInit: false,
|
|
5722
5867
|
debugLogging: false,
|
|
5723
5868
|
};
|
|
@@ -5824,154 +5969,6 @@ class CsrfTokenManager {
|
|
|
5824
5969
|
}
|
|
5825
5970
|
CsrfTokenManager.instance = null;
|
|
5826
5971
|
|
|
5827
|
-
const CSRF_TOKEN_HEADER = 'X-CSRF-Token';
|
|
5828
|
-
/**
|
|
5829
|
-
* Determines if the HTTP method requires CSRF protection.
|
|
5830
|
-
* Only mutating operations (POST, PUT, PATCH, DELETE) require CSRF tokens.
|
|
5831
|
-
*
|
|
5832
|
-
* @param method - The HTTP method to check
|
|
5833
|
-
* @returns true if the method requires CSRF protection
|
|
5834
|
-
*/
|
|
5835
|
-
function isCsrfMethod(method) {
|
|
5836
|
-
if (!method) {
|
|
5837
|
-
return false;
|
|
5838
|
-
}
|
|
5839
|
-
const normalizedMethod = method.toLowerCase();
|
|
5840
|
-
return (normalizedMethod === 'post' ||
|
|
5841
|
-
normalizedMethod === 'put' ||
|
|
5842
|
-
normalizedMethod === 'patch' ||
|
|
5843
|
-
normalizedMethod === 'delete');
|
|
5844
|
-
}
|
|
5845
|
-
/**
|
|
5846
|
-
* Builds a request interceptor that adds CSRF token headers to mutating requests.
|
|
5847
|
-
* The CSRF token is fetched once and cached for subsequent requests.
|
|
5848
|
-
* Only POST, PUT, PATCH, and DELETE requests will have the CSRF token added.
|
|
5849
|
-
*
|
|
5850
|
-
* @returns A RequestInterceptor function for FetchParameters
|
|
5851
|
-
*/
|
|
5852
|
-
function buildCsrfTokenInterceptor() {
|
|
5853
|
-
const csrfTokenManager = CsrfTokenManager.getInstance();
|
|
5854
|
-
return async (fetchArgs) => {
|
|
5855
|
-
const [urlOrRequest, options] = fetchArgs;
|
|
5856
|
-
// Determine the method from either Request object or options
|
|
5857
|
-
let method;
|
|
5858
|
-
if (typeof urlOrRequest !== 'string' && 'method' in urlOrRequest) {
|
|
5859
|
-
method = urlOrRequest.method;
|
|
5860
|
-
}
|
|
5861
|
-
else if (options && 'method' in options) {
|
|
5862
|
-
method = options.method;
|
|
5863
|
-
}
|
|
5864
|
-
// Only add CSRF token for mutating operations
|
|
5865
|
-
if (isCsrfMethod(method)) {
|
|
5866
|
-
const token = await csrfTokenManager.getToken();
|
|
5867
|
-
if (token) {
|
|
5868
|
-
fetchArgs = setHeader(CSRF_TOKEN_HEADER, token, fetchArgs);
|
|
5869
|
-
}
|
|
5870
|
-
}
|
|
5871
|
-
return resolvedPromiseLike$2(fetchArgs);
|
|
5872
|
-
};
|
|
5873
|
-
}
|
|
5874
|
-
/**
|
|
5875
|
-
* Builds a Luvio request interceptor that adds CSRF token headers to mutating requests.
|
|
5876
|
-
* The CSRF token is fetched once and cached for subsequent requests.
|
|
5877
|
-
* Only POST, PUT, PATCH, and DELETE requests will have the CSRF token added.
|
|
5878
|
-
*
|
|
5879
|
-
* @returns A request interceptor function for Luvio ResourceRequest objects
|
|
5880
|
-
*/
|
|
5881
|
-
function buildLuvioCsrfTokenInterceptor() {
|
|
5882
|
-
const csrfTokenManager = CsrfTokenManager.getInstance();
|
|
5883
|
-
return async (resourceRequest) => {
|
|
5884
|
-
// Ensure headers object exists
|
|
5885
|
-
if (!resourceRequest.headers) {
|
|
5886
|
-
resourceRequest.headers = {};
|
|
5887
|
-
}
|
|
5888
|
-
// Only add CSRF token for mutating operations
|
|
5889
|
-
if (isCsrfMethod(resourceRequest.method)) {
|
|
5890
|
-
// Don't overwrite existing CSRF token header if it already exists
|
|
5891
|
-
if (!resourceRequest.headers[CSRF_TOKEN_HEADER]) {
|
|
5892
|
-
const token = await csrfTokenManager.getToken();
|
|
5893
|
-
if (token) {
|
|
5894
|
-
resourceRequest.headers[CSRF_TOKEN_HEADER] = token;
|
|
5895
|
-
}
|
|
5896
|
-
}
|
|
5897
|
-
}
|
|
5898
|
-
return resolvedPromiseLike$2(resourceRequest);
|
|
5899
|
-
};
|
|
5900
|
-
}
|
|
5901
|
-
|
|
5902
|
-
const API_PATHS = [
|
|
5903
|
-
// getLookupActions
|
|
5904
|
-
// '/ui-api/actions/lookup/{objectApiNames}',
|
|
5905
|
-
// getRecordActions
|
|
5906
|
-
// '/ui-api/actions/record/{recordIds}',
|
|
5907
|
-
// getRelatedListActions
|
|
5908
|
-
// '/ui-api/actions/record/{recordIds}/related-list/{relatedListId}',
|
|
5909
|
-
// getDuplicateConfiguration
|
|
5910
|
-
// '/ui-api/duplicates/{objectApiName}',
|
|
5911
|
-
// getListInfosByObjectName
|
|
5912
|
-
// '/ui-api/list-info/{objectApiName}',
|
|
5913
|
-
// getLookupRecords
|
|
5914
|
-
// '/ui-api/lookups/{objectApiName}/{fieldApiName}',
|
|
5915
|
-
// getObjectInfo
|
|
5916
|
-
'/ui-api/object-info/{objectApiName}',
|
|
5917
|
-
// getObjectInfos
|
|
5918
|
-
// '/ui-api/object-info/batch/{objectApiNames}',
|
|
5919
|
-
// getPicklistValuesByRecordType
|
|
5920
|
-
// '/ui-api/object-info/{objectApiName}/picklist-values/{recordTypeId}',
|
|
5921
|
-
// getDuplicates
|
|
5922
|
-
// '/ui-api/predupe',
|
|
5923
|
-
// getRecord
|
|
5924
|
-
// '/ui-api/records/{recordId}',
|
|
5925
|
-
// getRecordUi
|
|
5926
|
-
// '/ui-api/record-ui/{recordIds}',
|
|
5927
|
-
// getRelatedListInfo
|
|
5928
|
-
// '/ui-api/related-list-info/{parentObjectApiName}/{relatedListId}',
|
|
5929
|
-
// getRelatedListRecords
|
|
5930
|
-
// '/ui-api/related-list-records/{parentRecordId}/{relatedListId}',
|
|
5931
|
-
];
|
|
5932
|
-
const API_PATH_MATCHERS = API_PATHS.map((path) => {
|
|
5933
|
-
const regexString = path.replace(/\{.+?\}/g, '[^/]+');
|
|
5934
|
-
return new RegExp(`^${regexString}$`);
|
|
5935
|
-
});
|
|
5936
|
-
const requestTracker = {
|
|
5937
|
-
hasTracker: () => ThirdPartyTracker !== undefined,
|
|
5938
|
-
registerHandler: (request, name, loadedCheck) => {
|
|
5939
|
-
ThirdPartyTracker.registerHandler(request, name, loadedCheck);
|
|
5940
|
-
},
|
|
5941
|
-
markFinished: (request) => {
|
|
5942
|
-
ThirdPartyTracker.markLoaded(request);
|
|
5943
|
-
},
|
|
5944
|
-
};
|
|
5945
|
-
const instrumentationTracker = requestTracker && requestTracker.hasTracker() ? requestTracker : internalRequestTracker;
|
|
5946
|
-
const requestLogger = {
|
|
5947
|
-
resolve: (request, response = {}) => {
|
|
5948
|
-
checkAndLogCrudInteraction(request, true, null, response);
|
|
5949
|
-
},
|
|
5950
|
-
reject: (request, error) => {
|
|
5951
|
-
checkAndLogCrudInteraction(request, false, error);
|
|
5952
|
-
},
|
|
5953
|
-
};
|
|
5954
|
-
const composedFetchNetworkAdapter = {
|
|
5955
|
-
shouldHandleRequest(resourceRequest) {
|
|
5956
|
-
let path = resourceRequest.basePath.trim();
|
|
5957
|
-
if (path.endsWith('/')) {
|
|
5958
|
-
path = path.substring(0, path.length - 1);
|
|
5959
|
-
}
|
|
5960
|
-
return API_PATH_MATCHERS.some((matcher) => matcher.test(path));
|
|
5961
|
-
},
|
|
5962
|
-
adapter: setupLexNetworkAdapter(requestTracker, requestLogger, {
|
|
5963
|
-
request: [
|
|
5964
|
-
buildLuvioPageScopedCacheRequestInterceptor(),
|
|
5965
|
-
buildLuvioRequestIdInterceptor(),
|
|
5966
|
-
buildLuvioCsrfTokenInterceptor(),
|
|
5967
|
-
],
|
|
5968
|
-
response: [
|
|
5969
|
-
buildLexRuntimeLuvio5xxStatusResponseInterceptor(),
|
|
5970
|
-
buildLexRuntimeLuvioAuthExpirationRedirectResponseInterceptor(),
|
|
5971
|
-
],
|
|
5972
|
-
}),
|
|
5973
|
-
};
|
|
5974
|
-
|
|
5975
5972
|
const DEFAULT_CONFIG$1 = {
|
|
5976
5973
|
maxRetries: 1, // Only retry once after token refresh
|
|
5977
5974
|
};
|
|
@@ -6075,15 +6072,20 @@ async function isCsrfError(response) {
|
|
|
6075
6072
|
|
|
6076
6073
|
function buildLexRuntimeDefaultFetchServiceDescriptor(logger, retryService) {
|
|
6077
6074
|
const fetchService = buildLexConnectFetchServiceDescriptor({
|
|
6075
|
+
createContext: createInstrumentationIdContext(),
|
|
6078
6076
|
request: [
|
|
6077
|
+
buildThirdPartyTrackerRegisterInterceptor(),
|
|
6079
6078
|
buildPageScopedCacheRequestInterceptor(),
|
|
6080
|
-
|
|
6081
|
-
buildCsrfTokenInterceptor(),
|
|
6079
|
+
buildTransportMarksSendInterceptor(),
|
|
6082
6080
|
],
|
|
6083
6081
|
response: [
|
|
6084
6082
|
buildLexRuntime5xxStatusResponseInterceptor(logger),
|
|
6085
6083
|
buildLexRuntimeAuthExpirationRedirectResponseInterceptor(logger),
|
|
6086
6084
|
],
|
|
6085
|
+
finally: [
|
|
6086
|
+
buildTransportMarksReceiveInterceptor(),
|
|
6087
|
+
buildThirdPartyTrackerFinishInterceptor(),
|
|
6088
|
+
],
|
|
6087
6089
|
}, retryService);
|
|
6088
6090
|
return {
|
|
6089
6091
|
...fetchService,
|
|
@@ -6091,30 +6093,33 @@ function buildLexRuntimeDefaultFetchServiceDescriptor(logger, retryService) {
|
|
|
6091
6093
|
}
|
|
6092
6094
|
function buildLexRuntimeAllow5xxFetchServiceDescriptor(logger, retryService) {
|
|
6093
6095
|
const fetchService = buildLexConnectFetchServiceDescriptor({
|
|
6096
|
+
createContext: createInstrumentationIdContext(),
|
|
6094
6097
|
request: [
|
|
6098
|
+
buildThirdPartyTrackerRegisterInterceptor(),
|
|
6095
6099
|
buildPageScopedCacheRequestInterceptor(),
|
|
6096
|
-
|
|
6097
|
-
buildCsrfTokenInterceptor(),
|
|
6100
|
+
buildTransportMarksSendInterceptor(),
|
|
6098
6101
|
],
|
|
6099
6102
|
response: [buildLexRuntimeAuthExpirationRedirectResponseInterceptor(logger)],
|
|
6103
|
+
finally: [
|
|
6104
|
+
buildTransportMarksReceiveInterceptor(),
|
|
6105
|
+
buildThirdPartyTrackerFinishInterceptor(),
|
|
6106
|
+
],
|
|
6100
6107
|
}, retryService);
|
|
6101
6108
|
return {
|
|
6102
6109
|
...fetchService,
|
|
6103
6110
|
tags: { interceptors: 'allow_500s' },
|
|
6104
6111
|
};
|
|
6105
6112
|
}
|
|
6106
|
-
|
|
6113
|
+
// Temporarily cloned from conduit fetch until the retry service is updated there
|
|
6114
|
+
function buildLexConnectFetchServiceDescriptor(interceptors = { request: [], response: [], finally: [] }, retryService) {
|
|
6107
6115
|
return {
|
|
6108
6116
|
type: 'fetch',
|
|
6109
6117
|
version: '1.0',
|
|
6110
6118
|
service: function (...args) {
|
|
6111
|
-
|
|
6112
|
-
const
|
|
6113
|
-
const
|
|
6114
|
-
|
|
6115
|
-
// return false until we signal we are finished
|
|
6116
|
-
return false;
|
|
6117
|
-
});
|
|
6119
|
+
// Create context per request if factory is provided
|
|
6120
|
+
const context = interceptors.createContext?.();
|
|
6121
|
+
const { request: requestInterceptors = [], response: responseInterceptors = [], finally: finallyInterceptors = [], } = interceptors;
|
|
6122
|
+
const pending = requestInterceptors.reduce((previousPromise, interceptor) => previousPromise.then((args) => interceptor(args, context)), resolvedPromiseLike$2(args));
|
|
6118
6123
|
return Promise.resolve(pending)
|
|
6119
6124
|
.then((interceptedArgs) => {
|
|
6120
6125
|
if (retryService) {
|
|
@@ -6141,10 +6146,15 @@ function buildLexConnectFetchServiceDescriptor(interceptors = { request: [], res
|
|
|
6141
6146
|
return fetch(...interceptedArgs);
|
|
6142
6147
|
})
|
|
6143
6148
|
.then((response) => {
|
|
6144
|
-
|
|
6149
|
+
// Success path - run response interceptors
|
|
6150
|
+
return responseInterceptors.reduce((previousPromise, interceptor) => previousPromise.then((response) => interceptor(response, context)), resolvedPromiseLike$2(response));
|
|
6145
6151
|
})
|
|
6146
6152
|
.finally(() => {
|
|
6147
|
-
|
|
6153
|
+
// Always run finally interceptors for cleanup
|
|
6154
|
+
if (finallyInterceptors.length > 0) {
|
|
6155
|
+
// Run all finally interceptors sequentially
|
|
6156
|
+
return finallyInterceptors.reduce((previousPromise, interceptor) => previousPromise.then(() => interceptor(context)), Promise.resolve());
|
|
6157
|
+
}
|
|
6148
6158
|
});
|
|
6149
6159
|
},
|
|
6150
6160
|
};
|
|
@@ -6155,7 +6165,9 @@ const sfapJwtRepository = new JwtRepository();
|
|
|
6155
6165
|
const sfapJwtManager = new JwtManager(sfapJwtRepository, platformSfapJwtResolver);
|
|
6156
6166
|
function buildJwtAuthorizedSfapFetchServiceDescriptor(logger) {
|
|
6157
6167
|
const jwtAuthorizedFetchService = buildLexConnectFetchServiceDescriptor({
|
|
6158
|
-
|
|
6168
|
+
createContext: createInstrumentationIdContext(),
|
|
6169
|
+
request: [buildThirdPartyTrackerRegisterInterceptor(), buildJwtRequestInterceptor(logger)],
|
|
6170
|
+
finally: [buildThirdPartyTrackerFinishInterceptor()],
|
|
6159
6171
|
});
|
|
6160
6172
|
return {
|
|
6161
6173
|
...jwtAuthorizedFetchService,
|
|
@@ -6174,7 +6186,9 @@ function buildCopilotFetchServiceDescriptor(logger) {
|
|
|
6174
6186
|
// Interceptor here with the logic in buildJwtAuthorizedSfapFetchServiceDescriptor()
|
|
6175
6187
|
// above.
|
|
6176
6188
|
...buildLexConnectFetchServiceDescriptor({
|
|
6189
|
+
createContext: createInstrumentationIdContext(),
|
|
6177
6190
|
request: [
|
|
6191
|
+
buildThirdPartyTrackerRegisterInterceptor(),
|
|
6178
6192
|
// Note that this function is VERY closely tied to the fetchParams generated
|
|
6179
6193
|
// by copilotStartSessionCommand. Any changes to those parameters will require
|
|
6180
6194
|
// corresponding updates to the logic below.
|
|
@@ -6214,12 +6228,17 @@ function buildCopilotFetchServiceDescriptor(logger) {
|
|
|
6214
6228
|
},
|
|
6215
6229
|
buildJwtRequestInterceptor(logger),
|
|
6216
6230
|
],
|
|
6231
|
+
finally: [buildThirdPartyTrackerFinishInterceptor()],
|
|
6217
6232
|
}),
|
|
6218
6233
|
tags: { specialHacksFor: 'copilot' },
|
|
6219
6234
|
};
|
|
6220
6235
|
}
|
|
6221
6236
|
function buildUnauthorizedFetchServiceDescriptor() {
|
|
6222
|
-
const fetchService = buildLexConnectFetchServiceDescriptor(
|
|
6237
|
+
const fetchService = buildLexConnectFetchServiceDescriptor({
|
|
6238
|
+
createContext: createInstrumentationIdContext(),
|
|
6239
|
+
request: [buildThirdPartyTrackerRegisterInterceptor()],
|
|
6240
|
+
finally: [buildThirdPartyTrackerFinishInterceptor()],
|
|
6241
|
+
});
|
|
6223
6242
|
return {
|
|
6224
6243
|
...fetchService,
|
|
6225
6244
|
tags: { authenticationScopes: '' },
|
|
@@ -9664,8 +9683,8 @@ function initializeOneStore(luvio) {
|
|
|
9664
9683
|
buildServiceDescriptor$2$1(),
|
|
9665
9684
|
buildServiceDescriptor$1$1(),
|
|
9666
9685
|
buildServiceDescriptor$7(),
|
|
9667
|
-
|
|
9668
|
-
|
|
9686
|
+
buildLWCWireBindingsServiceDescriptor(),
|
|
9687
|
+
buildLWCGraphQLWireBindingsServiceDescriptor(),
|
|
9669
9688
|
];
|
|
9670
9689
|
setServices(services);
|
|
9671
9690
|
}
|
|
@@ -9685,4 +9704,4 @@ function ldsEngineCreator() {
|
|
|
9685
9704
|
}
|
|
9686
9705
|
|
|
9687
9706
|
export { LexRequestStrategy, PdlRequestPriority, buildPredictorForContext, ldsEngineCreator as default, initializeLDS, initializeOneStore, notifyUpdateAvailableFactory, registerRequestStrategy, saveRequestAsPrediction, unregisterRequestStrategy, whenPredictionsReady };
|
|
9688
|
-
// version: 1.
|
|
9707
|
+
// version: 1.404.0-dev1-48073cfce6
|
|
@@ -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():
|
|
14
|
-
export declare function markEnd():
|
|
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
|
|
6
|
+
export declare function buildLexConnectFetchServiceDescriptor<Context = any>(interceptors?: Interceptors<Context>, retryService?: RetryService<Response>): FetchServiceDescriptor;
|
|
@@ -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,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.
|
|
3
|
+
"version": "1.404.0-dev1",
|
|
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.
|
|
40
|
-
"@salesforce/lds-adapters-uiapi": "^1.
|
|
41
|
-
"@salesforce/lds-ads-bridge": "^1.
|
|
42
|
-
"@salesforce/lds-aura-storage": "^1.
|
|
43
|
-
"@salesforce/lds-bindings": "^1.
|
|
44
|
-
"@salesforce/lds-instrumentation": "^1.
|
|
45
|
-
"@salesforce/lds-network-aura": "^1.
|
|
46
|
-
"@salesforce/lds-network-fetch": "^1.
|
|
39
|
+
"@salesforce/lds-adapters-apex": "^1.404.0-dev1",
|
|
40
|
+
"@salesforce/lds-adapters-uiapi": "^1.404.0-dev1",
|
|
41
|
+
"@salesforce/lds-ads-bridge": "^1.404.0-dev1",
|
|
42
|
+
"@salesforce/lds-aura-storage": "^1.404.0-dev1",
|
|
43
|
+
"@salesforce/lds-bindings": "^1.404.0-dev1",
|
|
44
|
+
"@salesforce/lds-instrumentation": "^1.404.0-dev1",
|
|
45
|
+
"@salesforce/lds-network-aura": "^1.404.0-dev1",
|
|
46
|
+
"@salesforce/lds-network-fetch": "^1.404.0-dev1",
|
|
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.
|
|
75
|
-
"@salesforce/lds-adapters-uiapi-lex": "^1.
|
|
76
|
-
"@salesforce/lds-luvio-service": "^1.
|
|
77
|
-
"@salesforce/lds-luvio-uiapi-records-service": "^1.
|
|
74
|
+
"@salesforce/lds-adapters-onestore-graphql": "^1.404.0-dev1",
|
|
75
|
+
"@salesforce/lds-adapters-uiapi-lex": "^1.404.0-dev1",
|
|
76
|
+
"@salesforce/lds-luvio-service": "^1.404.0-dev1",
|
|
77
|
+
"@salesforce/lds-luvio-uiapi-records-service": "^1.404.0-dev1"
|
|
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>;
|