feat: Salesforce - add urql/retry-exchange (#24302)

* Add .env variables

* Add `urql/exchange-retry`

* Add retry mechanic to graphql client

* Only add retries if .env variables are set

* Remove console.log
This commit is contained in:
Joe Au-Yeung
2025-10-08 14:03:40 +00:00
committed by GitHub
parent 64f811ed0b
commit 4303fb8726
5 changed files with 64 additions and 2 deletions
+4
View File
@@ -482,3 +482,7 @@ DATABASE_CHUNK_SIZE=
# Service Account Encryption Key for encrypting/decrypting service account keys
# You can use: `openssl rand -base64 24` to generate one
CALCOM_SERVICE_ACCOUNT_ENCRYPTION_KEY=
SALESFORCE_GRAPHQL_DELAY_MS=500
SALESFORCE_GRAPHQL_MAX_DELAY_MS=2000
SALESFORCE_GRAPHQL_MAX_RETRIES=3
@@ -1,4 +1,5 @@
import { Client, cacheExchange, fetchExchange } from "@urql/core";
import { retryExchange } from "@urql/exchange-retry";
import logger from "@calcom/lib/logger";
import { safeStringify } from "@calcom/lib/safeStringify";
@@ -17,9 +18,27 @@ export class SalesforceGraphQLClient {
constructor({ accessToken, instanceUrl }: { accessToken: string; instanceUrl: string }) {
this.accessToken = accessToken;
const exchanges = [cacheExchange, fetchExchange];
if (
process.env.SALESFORCE_GRAPHQL_DELAY_MS &&
process.env.SALESFORCE_GRAPHQL_MAX_DELAY_MS &&
process.env.SALESFORCE_GRAPHQL_MAX_RETRIES
) {
const retryOptions = {
maxRetries: 3,
initialDelayMs: Number(process.env.SALESFORCE_GRAPHQL_DELAY_MS),
maxDelayMs: Number(process.env.SALESFORCE_GRAPHQL_MAX_DELAY_MS),
randomDelay: true,
maxNumberAttempts: Number(process.env.SALESFORCE_GRAPHQL_MAX_RETRIES),
};
exchanges.push(retryExchange(retryOptions));
}
this.client = new Client({
url: `${instanceUrl}/services/data/${this.version}/graphql`,
exchanges: [cacheExchange, fetchExchange],
exchanges,
fetchOptions: () => {
return {
headers: { authorization: `Bearer ${this.accessToken}` },
+2 -1
View File
@@ -14,7 +14,8 @@
"@calcom/prisma": "workspace:*",
"@jetstreamapp/soql-parser-js": "^6.1.0",
"@jsforce/jsforce-node": "^3.6.3",
"@urql/core": "^5.1.1"
"@urql/core": "^5.1.1",
"@urql/exchange-retry": "^2.0.0"
},
"devDependencies": {
"@calcom/types": "workspace:*",
+3
View File
@@ -165,6 +165,9 @@
"RETELL_AI_TEST_CAL_API_KEY",
"SALESFORCE_CONSUMER_KEY",
"SALESFORCE_CONSUMER_SECRET",
"SALESFORCE_GRAPHQL_DELAY_MS",
"SALESFORCE_GRAPHQL_MAX_DELAY_MS",
"SALESFORCE_GRAPHQL_MAX_RETRIES",
"SAML_ADMINS",
"SAML_CLIENT_SECRET_VERIFIER",
"SAML_DATABASE_URL",
+35
View File
@@ -5,6 +5,18 @@ __metadata:
version: 6
cacheKey: 8
"@0no-co/graphql.web@npm:^1.0.13":
version: 1.2.0
resolution: "@0no-co/graphql.web@npm:1.2.0"
peerDependencies:
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0
peerDependenciesMeta:
graphql:
optional: true
checksum: 4d5a54b93e6024b7d476e94b991e4e4ebc4ecb97e4ce886f76889741f5e419b587bedc6a00488753069534d8ae3e4de2e901ad58506ba2f74eeb8642edccc4ca
languageName: node
linkType: hard
"@0no-co/graphql.web@npm:^1.0.5":
version: 1.1.2
resolution: "@0no-co/graphql.web@npm:1.1.2"
@@ -3946,6 +3958,7 @@ __metadata:
"@jsforce/jsforce-node": ^3.6.3
"@parcel/watcher": ^2.5.1
"@urql/core": ^5.1.1
"@urql/exchange-retry": ^2.0.0
graphql-config: ^5.1.3
graphql-introspection-json-to-sdl: ^1.0.3
languageName: unknown
@@ -19345,6 +19358,28 @@ __metadata:
languageName: node
linkType: hard
"@urql/core@npm:^6.0.0":
version: 6.0.1
resolution: "@urql/core@npm:6.0.1"
dependencies:
"@0no-co/graphql.web": ^1.0.13
wonka: ^6.3.2
checksum: 6cedd18dc9f386d361991c6cbde61dc45c1cac9dfa9db60274fdd9acec91185d176a5c63bb39593152490f539441e226db32bdf88cfba0af4488d90399e58482
languageName: node
linkType: hard
"@urql/exchange-retry@npm:^2.0.0":
version: 2.0.0
resolution: "@urql/exchange-retry@npm:2.0.0"
dependencies:
"@urql/core": ^6.0.0
wonka: ^6.3.2
peerDependencies:
"@urql/core": ^6.0.0
checksum: a75b4bfa4cdf55f202d6e35201b2a8c3219e9d5d4660b43bc29bfecc373266f1bdd6adf1efd39566a8a3e6bdf1e8e506c17a7a598b6d4205cb5ab2d79c95ab21
languageName: node
linkType: hard
"@vercel/edge-config@npm:^0.1.1":
version: 0.1.1
resolution: "@vercel/edge-config@npm:0.1.1"