@party-stack/salesforce-ontology 0.4.0 → 0.4.2

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.
Files changed (166) hide show
  1. package/README.md +22 -31
  2. package/lib/actionMetadata.d.ts +11 -9
  3. package/lib/actionMetadata.d.ts.map +1 -1
  4. package/lib/actionMetadata.js +19 -30
  5. package/lib/actionMetadata.js.map +1 -1
  6. package/lib/adapter/convertLoadSubsetOptions.d.ts +10 -8
  7. package/lib/adapter/convertLoadSubsetOptions.d.ts.map +1 -1
  8. package/lib/adapter/convertLoadSubsetOptions.js +110 -173
  9. package/lib/adapter/convertLoadSubsetOptions.js.map +1 -1
  10. package/lib/adapter/createSalesforceOntologyBackendAdapter.d.ts +14 -12
  11. package/lib/adapter/createSalesforceOntologyBackendAdapter.d.ts.map +1 -1
  12. package/lib/adapter/createSalesforceOntologyBackendAdapter.js +124 -191
  13. package/lib/adapter/createSalesforceOntologyBackendAdapter.js.map +1 -1
  14. package/lib/adapter/index.d.ts +5 -5
  15. package/lib/adapter/index.js +5 -5
  16. package/lib/adapter/objectCollectionOptions.d.ts +22 -22
  17. package/lib/adapter/objectCollectionOptions.d.ts.map +1 -1
  18. package/lib/adapter/objectCollectionOptions.js +198 -280
  19. package/lib/adapter/objectCollectionOptions.js.map +1 -1
  20. package/lib/adapter/salesforceCodec.d.ts +6 -4
  21. package/lib/adapter/salesforceCodec.d.ts.map +1 -1
  22. package/lib/adapter/salesforceCodec.js +126 -190
  23. package/lib/adapter/salesforceCodec.js.map +1 -1
  24. package/lib/config/index.d.ts +20 -18
  25. package/lib/config/index.d.ts.map +1 -1
  26. package/lib/config/index.js +148 -192
  27. package/lib/config/index.js.map +1 -1
  28. package/lib/connection.d.ts +35 -33
  29. package/lib/connection.d.ts.map +1 -1
  30. package/lib/connection.js +243 -299
  31. package/lib/connection.js.map +1 -1
  32. package/lib/crud.d.ts +5 -3
  33. package/lib/crud.d.ts.map +1 -1
  34. package/lib/crud.js +0 -1
  35. package/lib/index.d.ts +10 -5
  36. package/lib/index.js +10 -5
  37. package/lib/installation/createSalesforceBackendInstallation.d.ts +28 -26
  38. package/lib/installation/createSalesforceBackendInstallation.d.ts.map +1 -1
  39. package/lib/installation/createSalesforceBackendInstallation.js +75 -85
  40. package/lib/installation/createSalesforceBackendInstallation.js.map +1 -1
  41. package/lib/installation/index.d.ts +2 -2
  42. package/lib/installation/index.js +1 -2
  43. package/lib/meta/actionTypeCollectionOptions.d.ts +10 -8
  44. package/lib/meta/actionTypeCollectionOptions.d.ts.map +1 -1
  45. package/lib/meta/actionTypeCollectionOptions.js +105 -212
  46. package/lib/meta/actionTypeCollectionOptions.js.map +1 -1
  47. package/lib/meta/convertMetaActionType.d.ts +4 -2
  48. package/lib/meta/convertMetaActionType.d.ts.map +1 -1
  49. package/lib/meta/convertMetaActionType.js +32 -32
  50. package/lib/meta/convertMetaActionType.js.map +1 -1
  51. package/lib/meta/convertMetaLinkType.d.ts +4 -2
  52. package/lib/meta/convertMetaLinkType.d.ts.map +1 -1
  53. package/lib/meta/convertMetaLinkType.js +39 -45
  54. package/lib/meta/convertMetaLinkType.js.map +1 -1
  55. package/lib/meta/convertMetaLoadSubsetOptions.d.ts +12 -10
  56. package/lib/meta/convertMetaLoadSubsetOptions.d.ts.map +1 -1
  57. package/lib/meta/convertMetaLoadSubsetOptions.js +42 -58
  58. package/lib/meta/convertMetaLoadSubsetOptions.js.map +1 -1
  59. package/lib/meta/convertMetaObjectType.d.ts +4 -2
  60. package/lib/meta/convertMetaObjectType.d.ts.map +1 -1
  61. package/lib/meta/convertMetaObjectType.js +36 -40
  62. package/lib/meta/convertMetaObjectType.js.map +1 -1
  63. package/lib/meta/convertMetaQueryFunctionType.d.ts +4 -2
  64. package/lib/meta/convertMetaQueryFunctionType.d.ts.map +1 -1
  65. package/lib/meta/convertMetaQueryFunctionType.js +27 -25
  66. package/lib/meta/convertMetaQueryFunctionType.js.map +1 -1
  67. package/lib/meta/convertMetaTypeDef.d.ts +10 -8
  68. package/lib/meta/convertMetaTypeDef.d.ts.map +1 -1
  69. package/lib/meta/convertMetaTypeDef.js +196 -188
  70. package/lib/meta/convertMetaTypeDef.js.map +1 -1
  71. package/lib/meta/createSalesforceMetaOntologyBackendAdapter.d.ts +19 -17
  72. package/lib/meta/createSalesforceMetaOntologyBackendAdapter.d.ts.map +1 -1
  73. package/lib/meta/createSalesforceMetaOntologyBackendAdapter.js +38 -40
  74. package/lib/meta/createSalesforceMetaOntologyBackendAdapter.js.map +1 -1
  75. package/lib/meta/entityCollectionOptions.d.ts +10 -8
  76. package/lib/meta/entityCollectionOptions.d.ts.map +1 -1
  77. package/lib/meta/entityCollectionOptions.js +73 -82
  78. package/lib/meta/entityCollectionOptions.js.map +1 -1
  79. package/lib/meta/index.d.ts +7 -7
  80. package/lib/meta/index.js +7 -7
  81. package/lib/meta/queryFunctionTypeCollectionOptions.d.ts +7 -5
  82. package/lib/meta/queryFunctionTypeCollectionOptions.d.ts.map +1 -1
  83. package/lib/meta/queryFunctionTypeCollectionOptions.js +53 -91
  84. package/lib/meta/queryFunctionTypeCollectionOptions.js.map +1 -1
  85. package/lib/meta/synthesizeCrudActionTypes.d.ts +4 -2
  86. package/lib/meta/synthesizeCrudActionTypes.d.ts.map +1 -1
  87. package/lib/meta/synthesizeCrudActionTypes.js +77 -116
  88. package/lib/meta/synthesizeCrudActionTypes.js.map +1 -1
  89. package/lib/standardActions.d.ts +2 -0
  90. package/lib/standardActions.d.ts.map +1 -1
  91. package/lib/standardActions.js +22 -20
  92. package/lib/standardActions.js.map +1 -1
  93. package/lib/utils/AsyncIterable.d.ts +2 -0
  94. package/lib/utils/AsyncIterable.d.ts.map +1 -1
  95. package/lib/utils/AsyncIterable.js +20 -23
  96. package/lib/utils/AsyncIterable.js.map +1 -1
  97. package/lib/utils/ids.d.ts +2 -0
  98. package/lib/utils/ids.d.ts.map +1 -1
  99. package/lib/utils/ids.js +23 -19
  100. package/lib/utils/ids.js.map +1 -1
  101. package/package.json +18 -24
  102. package/lib/adapter/convertLoadSubsetOptions.test.d.ts +0 -2
  103. package/lib/adapter/convertLoadSubsetOptions.test.d.ts.map +0 -1
  104. package/lib/adapter/convertLoadSubsetOptions.test.js +0 -80
  105. package/lib/adapter/convertLoadSubsetOptions.test.js.map +0 -1
  106. package/lib/adapter/createSalesforceOntologyBackendAdapter.test.d.ts +0 -2
  107. package/lib/adapter/createSalesforceOntologyBackendAdapter.test.d.ts.map +0 -1
  108. package/lib/adapter/createSalesforceOntologyBackendAdapter.test.js +0 -394
  109. package/lib/adapter/createSalesforceOntologyBackendAdapter.test.js.map +0 -1
  110. package/lib/adapter/index.d.ts.map +0 -1
  111. package/lib/adapter/index.js.map +0 -1
  112. package/lib/adapter/objectCollectionOptions.test.d.ts +0 -2
  113. package/lib/adapter/objectCollectionOptions.test.d.ts.map +0 -1
  114. package/lib/adapter/objectCollectionOptions.test.js +0 -160
  115. package/lib/adapter/objectCollectionOptions.test.js.map +0 -1
  116. package/lib/adapter/salesforceCodec.test.d.ts +0 -2
  117. package/lib/adapter/salesforceCodec.test.d.ts.map +0 -1
  118. package/lib/adapter/salesforceCodec.test.js +0 -57
  119. package/lib/adapter/salesforceCodec.test.js.map +0 -1
  120. package/lib/config/index.test.d.ts +0 -2
  121. package/lib/config/index.test.d.ts.map +0 -1
  122. package/lib/config/index.test.js +0 -177
  123. package/lib/config/index.test.js.map +0 -1
  124. package/lib/connection.test.d.ts +0 -2
  125. package/lib/connection.test.d.ts.map +0 -1
  126. package/lib/connection.test.js +0 -189
  127. package/lib/connection.test.js.map +0 -1
  128. package/lib/crud.js.map +0 -1
  129. package/lib/index.d.ts.map +0 -1
  130. package/lib/index.js.map +0 -1
  131. package/lib/installation/createSalesforceBackendInstallation.test.d.ts +0 -2
  132. package/lib/installation/createSalesforceBackendInstallation.test.d.ts.map +0 -1
  133. package/lib/installation/createSalesforceBackendInstallation.test.js +0 -55
  134. package/lib/installation/createSalesforceBackendInstallation.test.js.map +0 -1
  135. package/lib/installation/index.d.ts.map +0 -1
  136. package/lib/installation/index.js.map +0 -1
  137. package/lib/meta/actionTypeCollectionOptions.test.d.ts +0 -2
  138. package/lib/meta/actionTypeCollectionOptions.test.d.ts.map +0 -1
  139. package/lib/meta/actionTypeCollectionOptions.test.js +0 -192
  140. package/lib/meta/actionTypeCollectionOptions.test.js.map +0 -1
  141. package/lib/meta/convertMetaActionType.test.d.ts +0 -2
  142. package/lib/meta/convertMetaActionType.test.d.ts.map +0 -1
  143. package/lib/meta/convertMetaActionType.test.js +0 -185
  144. package/lib/meta/convertMetaActionType.test.js.map +0 -1
  145. package/lib/meta/convertMetaObjectType.test.d.ts +0 -2
  146. package/lib/meta/convertMetaObjectType.test.d.ts.map +0 -1
  147. package/lib/meta/convertMetaObjectType.test.js +0 -187
  148. package/lib/meta/convertMetaObjectType.test.js.map +0 -1
  149. package/lib/meta/convertMetaQueryFunctionType.test.d.ts +0 -2
  150. package/lib/meta/convertMetaQueryFunctionType.test.d.ts.map +0 -1
  151. package/lib/meta/convertMetaQueryFunctionType.test.js +0 -58
  152. package/lib/meta/convertMetaQueryFunctionType.test.js.map +0 -1
  153. package/lib/meta/entityCollectionOptions.test.d.ts +0 -2
  154. package/lib/meta/entityCollectionOptions.test.d.ts.map +0 -1
  155. package/lib/meta/entityCollectionOptions.test.js +0 -120
  156. package/lib/meta/entityCollectionOptions.test.js.map +0 -1
  157. package/lib/meta/index.d.ts.map +0 -1
  158. package/lib/meta/index.js.map +0 -1
  159. package/lib/meta/queryFunctionTypeCollectionOptions.test.d.ts +0 -2
  160. package/lib/meta/queryFunctionTypeCollectionOptions.test.d.ts.map +0 -1
  161. package/lib/meta/queryFunctionTypeCollectionOptions.test.js +0 -71
  162. package/lib/meta/queryFunctionTypeCollectionOptions.test.js.map +0 -1
  163. package/lib/meta/synthesizeCrudActionTypes.test.d.ts +0 -2
  164. package/lib/meta/synthesizeCrudActionTypes.test.d.ts.map +0 -1
  165. package/lib/meta/synthesizeCrudActionTypes.test.js +0 -153
  166. package/lib/meta/synthesizeCrudActionTypes.test.js.map +0 -1
package/lib/connection.js CHANGED
@@ -1,314 +1,258 @@
1
- import { withHttpAuthenticationErrorHandling, withHttpRetryHandling, } from "@party-stack/connections";
1
+ import { withHttpAuthenticationErrorHandling, withHttpRetryHandling } from "@party-stack/connections";
2
2
  import { unauthenticated } from "@party-stack/errors";
3
- import { createClientCredentialsOAuthClient, createPublicOAuthClient, } from "@party-stack/oauth";
4
- import { createSalesforceClient, } from "@party-stack/salesforce-client";
5
- const DEFAULT_SCOPES = ["api", "refresh_token", "openid"];
3
+ import { createClientCredentialsOAuthClient, createPublicOAuthClient } from "@party-stack/oauth";
4
+ import { createSalesforceClient } from "@party-stack/salesforce-client";
5
+ //#region src/connection.ts
6
+ const DEFAULT_SCOPES = [
7
+ "api",
8
+ "refresh_token",
9
+ "openid"
10
+ ];
6
11
  function normalizeUrl(value) {
7
- return value.replace(/\/+$/, "");
12
+ return value.replace(/\/+$/, "");
8
13
  }
9
14
  function activeState(expiresAt, refreshable) {
10
- return expiresAt === undefined
11
- ? { status: "active" }
12
- : {
13
- status: "active",
14
- expiration: {
15
- expiresAt,
16
- refreshable,
17
- },
18
- };
15
+ return expiresAt === void 0 ? { status: "active" } : {
16
+ status: "active",
17
+ expiration: {
18
+ expiresAt,
19
+ refreshable
20
+ }
21
+ };
19
22
  }
20
23
  async function resolveSalesforceUserId(options) {
21
- const response = await options.fetch(`${options.loginUrl}/services/oauth2/userinfo`, {
22
- headers: {
23
- Authorization: `Bearer ${options.token}`,
24
- Accept: "application/json",
25
- },
26
- });
27
- if (response.status === 401) {
28
- throw unauthenticated("Salesforce access token is invalid or expired.");
29
- }
30
- if (!response.ok) {
31
- throw new Error(`Salesforce userinfo failed with status ${response.status}: ${await response.text()}`);
32
- }
33
- const user = (await response.json());
34
- const userId = user.user_id ?? user.sub;
35
- if (!userId) {
36
- throw new Error("Salesforce userinfo did not return user_id or sub.");
37
- }
38
- return userId;
24
+ const response = await options.fetch(`${options.loginUrl}/services/oauth2/userinfo`, { headers: {
25
+ Authorization: `Bearer ${options.token}`,
26
+ Accept: "application/json"
27
+ } });
28
+ if (response.status === 401) throw unauthenticated("Salesforce access token is invalid or expired.");
29
+ if (!response.ok) throw new Error(`Salesforce userinfo failed with status ${response.status}: ${await response.text()}`);
30
+ const user = await response.json();
31
+ const userId = user.user_id ?? user.sub;
32
+ if (!userId) throw new Error("Salesforce userinfo did not return user_id or sub.");
33
+ return userId;
39
34
  }
40
35
  function assertSalesforceOrigin(request, instanceUrl) {
41
- const actual = new URL(request.url).origin;
42
- const expected = new URL(instanceUrl).origin;
43
- if (actual !== expected) {
44
- throw new Error(`Salesforce egress not allowed for origin "${actual}".`);
45
- }
36
+ const actual = new URL(request.url).origin;
37
+ if (actual !== new URL(instanceUrl).origin) throw new Error(`Salesforce egress not allowed for origin "${actual}".`);
46
38
  }
47
39
  function createSalesforceEgressWrapper(options) {
48
- return (handlers) => withHttpAuthenticationErrorHandling(withHttpRetryHandling({
49
- ...handlers,
50
- async fetch(request) {
51
- assertSalesforceOrigin(request, options.instanceUrl);
52
- const retryRequest = request.clone();
53
- const send = async (current) => {
54
- const headers = new Headers(current.headers);
55
- headers.set("Authorization", `Bearer ${await options.tokenProvider()}`);
56
- return handlers.fetch(new Request(current, {
57
- headers,
58
- }));
59
- };
60
- let response = await send(request);
61
- if (response.status === 401 &&
62
- options.refresh) {
63
- await options.refresh();
64
- response =
65
- await send(retryRequest);
66
- }
67
- return response;
68
- },
69
- }));
40
+ return (handlers) => withHttpAuthenticationErrorHandling(withHttpRetryHandling({
41
+ ...handlers,
42
+ async fetch(request) {
43
+ assertSalesforceOrigin(request, options.instanceUrl);
44
+ const retryRequest = request.clone();
45
+ const send = async (current) => {
46
+ const headers = new Headers(current.headers);
47
+ headers.set("Authorization", `Bearer ${await options.tokenProvider()}`);
48
+ return handlers.fetch(new Request(current, { headers }));
49
+ };
50
+ let response = await send(request);
51
+ if (response.status === 401 && options.refresh) {
52
+ await options.refresh();
53
+ response = await send(retryRequest);
54
+ }
55
+ return response;
56
+ }
57
+ }));
70
58
  }
71
59
  async function createSalesforceConnectionAdapterInstance(options, context) {
72
- const instanceUrl = normalizeUrl(options.instanceUrl);
73
- const apiVersion = options.apiVersion ?? "65.0";
74
- const loginUrl = normalizeUrl(options.oauth?.loginUrl ??
75
- options.clientCredentials?.loginUrl ??
76
- instanceUrl);
77
- const fetchImpl = options.oauth?.fetch ??
78
- options.clientCredentials?.fetch ??
79
- globalThis.fetch.bind(globalThis);
80
- let tokenActive = Boolean(options.token);
81
- const tokenProviders = new Map();
82
- const publicOauth = options.oauth
83
- ? await createPublicOAuthClient({
84
- clientId: options.oauth.clientId,
85
- redirectUrl: options.oauth.redirectUrl,
86
- scopes: [
87
- ...new Set(options.oauth.scopes ??
88
- DEFAULT_SCOPES),
89
- ],
90
- authorizationServer: {
91
- issuer: loginUrl,
92
- authorizationEndpoint: `${loginUrl}/services/oauth2/authorize`,
93
- tokenEndpoint: `${loginUrl}/services/oauth2/token`,
94
- revocationEndpoint: `${loginUrl}/services/oauth2/revoke`,
95
- },
96
- runtime: context.runtime,
97
- fetch: options.oauth.fetch,
98
- dangerouslyPersistSecrets: options.oauth
99
- .dangerouslyPersistSecrets,
100
- resolveUserId: (token) => resolveSalesforceUserId({
101
- loginUrl,
102
- token,
103
- fetch: fetchImpl,
104
- }),
105
- })
106
- : undefined;
107
- const clientCredentialsOauth = options.clientCredentials
108
- ? createClientCredentialsOAuthClient({
109
- clientId: options.clientCredentials.clientId,
110
- clientSecret: options.clientCredentials
111
- .clientSecret,
112
- tokenEndpoint: `${loginUrl}/services/oauth2/token`,
113
- scopes: options.clientCredentials.scopes,
114
- fetch: options.clientCredentials.fetch,
115
- resolveUserId: (token) => resolveSalesforceUserId({
116
- loginUrl,
117
- token,
118
- fetch: fetchImpl,
119
- }),
120
- })
121
- : undefined;
122
- const createTokenSession = async (authenticationOptions = {}) => {
123
- const token = authenticationOptions.token ?? options.token;
124
- if (!token) {
125
- throw new Error("Salesforce access-token connections are not configured.");
126
- }
127
- const userId = authenticationOptions.userId ??
128
- options.userId ??
129
- (await resolveSalesforceUserId({
130
- loginUrl,
131
- token,
132
- fetch: fetchImpl,
133
- }));
134
- const connection = {
135
- userId,
136
- state: { status: "active" },
137
- };
138
- tokenProviders.set(userId, () => Promise.resolve(token));
139
- const session = {
140
- disconnect() {
141
- tokenProviders.delete(userId);
142
- if (token === options.token) {
143
- tokenActive = false;
144
- }
145
- return Promise.resolve();
146
- },
147
- egress: createSalesforceEgressWrapper({
148
- instanceUrl,
149
- tokenProvider: () => Promise.resolve(token),
150
- }),
151
- };
152
- return { connection, session };
153
- };
154
- const createPublicSession = (oauthSession) => {
155
- const userId = oauthSession.userId;
156
- const connection = {
157
- userId,
158
- state: activeState(oauthSession.expiration?.expiresAt, oauthSession.expiration?.refreshable ?? false),
159
- };
160
- const tokenProvider = () => {
161
- if (!publicOauth) {
162
- throw unauthenticated("Salesforce public OAuth is not configured.");
163
- }
164
- return publicOauth.getAccessToken(userId);
165
- };
166
- tokenProviders.set(userId, tokenProvider);
167
- const session = {
168
- async refresh() {
169
- if (!publicOauth) {
170
- throw unauthenticated("Salesforce public OAuth is not configured.");
171
- }
172
- return createPublicSession(await publicOauth.refresh(userId));
173
- },
174
- async disconnect() {
175
- tokenProviders.delete(userId);
176
- await publicOauth?.revoke(userId);
177
- },
178
- egress: createSalesforceEgressWrapper({
179
- instanceUrl,
180
- tokenProvider,
181
- refresh: async () => {
182
- if (!publicOauth) {
183
- throw unauthenticated("Salesforce public OAuth is not configured.");
184
- }
185
- await publicOauth.refresh(userId);
186
- },
187
- }),
188
- };
189
- return { connection, session };
190
- };
191
- const createClientCredentialsSession = async (forceRefresh = false) => {
192
- if (!clientCredentialsOauth) {
193
- throw new Error("Salesforce client credentials are not configured.");
194
- }
195
- const oauthSession = forceRefresh
196
- ? await clientCredentialsOauth.refresh()
197
- : await clientCredentialsOauth.getSession();
198
- const userId = oauthSession.userId;
199
- const tokenProvider = () => clientCredentialsOauth.getAccessToken();
200
- tokenProviders.set(userId, tokenProvider);
201
- return {
202
- connection: {
203
- userId,
204
- state: activeState(oauthSession.expiration
205
- ?.expiresAt, true),
206
- },
207
- session: {
208
- refresh: () => createClientCredentialsSession(true),
209
- disconnect() {
210
- tokenProviders.delete(userId);
211
- return Promise.resolve();
212
- },
213
- egress: createSalesforceEgressWrapper({
214
- instanceUrl,
215
- tokenProvider,
216
- refresh: () => clientCredentialsOauth
217
- .refresh()
218
- .then(() => undefined),
219
- }),
220
- },
221
- };
222
- };
223
- return {
224
- name: "salesforce",
225
- createAuthenticationClient(controller) {
226
- return {
227
- async subscribeToChangeEvents(userId, sObjectName, listener, subscriptionOptions) {
228
- const tokenProvider = tokenProviders.get(userId);
229
- if (!tokenProvider) {
230
- throw unauthenticated(`Salesforce connection for user "${userId}" is unavailable.`);
231
- }
232
- const client = createSalesforceClient({
233
- instanceUrl,
234
- apiVersion,
235
- cometdUrl: options.cometdUrl,
236
- tokenProvider,
237
- });
238
- return client.subscribeToChangeEvents(sObjectName, listener, subscriptionOptions);
239
- },
240
- async completeOAuthRedirect(url) {
241
- if (!publicOauth)
242
- return;
243
- const session = await publicOauth.completeRedirect(url);
244
- if (!session)
245
- return;
246
- const connectionSession = createPublicSession(session);
247
- await controller.connect(connectionSession);
248
- return connectionSession.connection;
249
- },
250
- signIn: {
251
- async oauth(authenticationOptions = {}) {
252
- if (!publicOauth) {
253
- throw new Error("Salesforce public OAuth is not configured.");
254
- }
255
- const session = await publicOauth.signIn({
256
- browserPresentation: authenticationOptions.browserPresentation,
257
- });
258
- const connectionSession = createPublicSession(session);
259
- await controller.connect(connectionSession);
260
- return connectionSession.connection;
261
- },
262
- async clientCredentials() {
263
- if (!clientCredentialsOauth) {
264
- throw new Error("Salesforce client credentials are not configured.");
265
- }
266
- if (typeof window !==
267
- "undefined") {
268
- throw new Error("Salesforce client credentials cannot run in a browser.");
269
- }
270
- const connectionSession = await createClientCredentialsSession();
271
- await controller.connect(connectionSession);
272
- return connectionSession.connection;
273
- },
274
- async accessToken(authenticationOptions = {}) {
275
- const connectionSession = await createTokenSession(authenticationOptions);
276
- if (authenticationOptions.token === undefined && options.token) {
277
- tokenActive = true;
278
- }
279
- await controller.connect(connectionSession);
280
- return connectionSession.connection;
281
- },
282
- },
283
- };
284
- },
285
- async restoreConnections() {
286
- const restored = new Map();
287
- if (tokenActive && options.token) {
288
- const session = await createTokenSession();
289
- restored.set(session.connection.userId, session);
290
- }
291
- if (publicOauth) {
292
- for (const oauthSession of await publicOauth.restoreSessions()) {
293
- const session = createPublicSession(oauthSession);
294
- restored.set(session.connection.userId, session);
295
- }
296
- }
297
- if (clientCredentialsOauth &&
298
- typeof window === "undefined") {
299
- const session = await createClientCredentialsSession();
300
- restored.set(session.connection.userId, session);
301
- }
302
- return [...restored.values()];
303
- },
304
- async cleanup() {
305
- tokenProviders.clear();
306
- await publicOauth?.cleanup();
307
- clientCredentialsOauth?.cleanup();
308
- },
309
- };
60
+ const instanceUrl = normalizeUrl(options.instanceUrl);
61
+ const apiVersion = options.apiVersion ?? "65.0";
62
+ const loginUrl = normalizeUrl(options.oauth?.loginUrl ?? options.clientCredentials?.loginUrl ?? instanceUrl);
63
+ const fetchImpl = options.oauth?.fetch ?? options.clientCredentials?.fetch ?? globalThis.fetch.bind(globalThis);
64
+ let tokenActive = Boolean(options.token);
65
+ const tokenProviders = /* @__PURE__ */ new Map();
66
+ const publicOauth = options.oauth ? await createPublicOAuthClient({
67
+ clientId: options.oauth.clientId,
68
+ redirectUrl: options.oauth.redirectUrl,
69
+ scopes: [...new Set(options.oauth.scopes ?? DEFAULT_SCOPES)],
70
+ authorizationServer: {
71
+ issuer: loginUrl,
72
+ authorizationEndpoint: `${loginUrl}/services/oauth2/authorize`,
73
+ tokenEndpoint: `${loginUrl}/services/oauth2/token`,
74
+ revocationEndpoint: `${loginUrl}/services/oauth2/revoke`
75
+ },
76
+ runtime: context.runtime,
77
+ fetch: options.oauth.fetch,
78
+ dangerouslyPersistSecrets: options.oauth.dangerouslyPersistSecrets,
79
+ resolveUserId: (token) => resolveSalesforceUserId({
80
+ loginUrl,
81
+ token,
82
+ fetch: fetchImpl
83
+ })
84
+ }) : void 0;
85
+ const clientCredentialsOauth = options.clientCredentials ? createClientCredentialsOAuthClient({
86
+ clientId: options.clientCredentials.clientId,
87
+ clientSecret: options.clientCredentials.clientSecret,
88
+ tokenEndpoint: `${loginUrl}/services/oauth2/token`,
89
+ scopes: options.clientCredentials.scopes,
90
+ fetch: options.clientCredentials.fetch,
91
+ resolveUserId: (token) => resolveSalesforceUserId({
92
+ loginUrl,
93
+ token,
94
+ fetch: fetchImpl
95
+ })
96
+ }) : void 0;
97
+ const createTokenSession = async (authenticationOptions = {}) => {
98
+ const token = authenticationOptions.token ?? options.token;
99
+ if (!token) throw new Error("Salesforce access-token connections are not configured.");
100
+ const userId = authenticationOptions.userId ?? options.userId ?? await resolveSalesforceUserId({
101
+ loginUrl,
102
+ token,
103
+ fetch: fetchImpl
104
+ });
105
+ const connection = {
106
+ userId,
107
+ state: { status: "active" }
108
+ };
109
+ tokenProviders.set(userId, () => Promise.resolve(token));
110
+ return {
111
+ connection,
112
+ session: {
113
+ disconnect() {
114
+ tokenProviders.delete(userId);
115
+ if (token === options.token) tokenActive = false;
116
+ return Promise.resolve();
117
+ },
118
+ egress: createSalesforceEgressWrapper({
119
+ instanceUrl,
120
+ tokenProvider: () => Promise.resolve(token)
121
+ })
122
+ }
123
+ };
124
+ };
125
+ const createPublicSession = (oauthSession) => {
126
+ const userId = oauthSession.userId;
127
+ const connection = {
128
+ userId,
129
+ state: activeState(oauthSession.expiration?.expiresAt, oauthSession.expiration?.refreshable ?? false)
130
+ };
131
+ const tokenProvider = () => {
132
+ if (!publicOauth) throw unauthenticated("Salesforce public OAuth is not configured.");
133
+ return publicOauth.getAccessToken(userId);
134
+ };
135
+ tokenProviders.set(userId, tokenProvider);
136
+ return {
137
+ connection,
138
+ session: {
139
+ async refresh() {
140
+ if (!publicOauth) throw unauthenticated("Salesforce public OAuth is not configured.");
141
+ return createPublicSession(await publicOauth.refresh(userId));
142
+ },
143
+ async disconnect() {
144
+ tokenProviders.delete(userId);
145
+ await publicOauth?.revoke(userId);
146
+ },
147
+ egress: createSalesforceEgressWrapper({
148
+ instanceUrl,
149
+ tokenProvider,
150
+ refresh: async () => {
151
+ if (!publicOauth) throw unauthenticated("Salesforce public OAuth is not configured.");
152
+ await publicOauth.refresh(userId);
153
+ }
154
+ })
155
+ }
156
+ };
157
+ };
158
+ const createClientCredentialsSession = async (forceRefresh = false) => {
159
+ if (!clientCredentialsOauth) throw new Error("Salesforce client credentials are not configured.");
160
+ const oauthSession = forceRefresh ? await clientCredentialsOauth.refresh() : await clientCredentialsOauth.getSession();
161
+ const userId = oauthSession.userId;
162
+ const tokenProvider = () => clientCredentialsOauth.getAccessToken();
163
+ tokenProviders.set(userId, tokenProvider);
164
+ return {
165
+ connection: {
166
+ userId,
167
+ state: activeState(oauthSession.expiration?.expiresAt, true)
168
+ },
169
+ session: {
170
+ refresh: () => createClientCredentialsSession(true),
171
+ disconnect() {
172
+ tokenProviders.delete(userId);
173
+ return Promise.resolve();
174
+ },
175
+ egress: createSalesforceEgressWrapper({
176
+ instanceUrl,
177
+ tokenProvider,
178
+ refresh: () => clientCredentialsOauth.refresh().then(() => void 0)
179
+ })
180
+ }
181
+ };
182
+ };
183
+ return {
184
+ name: "salesforce",
185
+ createAuthenticationClient(controller) {
186
+ return {
187
+ async subscribeToChangeEvents(userId, sObjectName, listener, subscriptionOptions) {
188
+ const tokenProvider = tokenProviders.get(userId);
189
+ if (!tokenProvider) throw unauthenticated(`Salesforce connection for user "${userId}" is unavailable.`);
190
+ return createSalesforceClient({
191
+ instanceUrl,
192
+ apiVersion,
193
+ cometdUrl: options.cometdUrl,
194
+ tokenProvider
195
+ }).subscribeToChangeEvents(sObjectName, listener, subscriptionOptions);
196
+ },
197
+ async completeOAuthRedirect(url) {
198
+ if (!publicOauth) return;
199
+ const session = await publicOauth.completeRedirect(url);
200
+ if (!session) return;
201
+ const connectionSession = createPublicSession(session);
202
+ await controller.connect(connectionSession);
203
+ return connectionSession.connection;
204
+ },
205
+ signIn: {
206
+ async oauth(authenticationOptions = {}) {
207
+ if (!publicOauth) throw new Error("Salesforce public OAuth is not configured.");
208
+ const session = await publicOauth.signIn({ browserPresentation: authenticationOptions.browserPresentation });
209
+ const connectionSession = createPublicSession(session);
210
+ await controller.connect(connectionSession);
211
+ return connectionSession.connection;
212
+ },
213
+ async clientCredentials() {
214
+ if (!clientCredentialsOauth) throw new Error("Salesforce client credentials are not configured.");
215
+ if (typeof window !== "undefined") throw new Error("Salesforce client credentials cannot run in a browser.");
216
+ const connectionSession = await createClientCredentialsSession();
217
+ await controller.connect(connectionSession);
218
+ return connectionSession.connection;
219
+ },
220
+ async accessToken(authenticationOptions = {}) {
221
+ const connectionSession = await createTokenSession(authenticationOptions);
222
+ if (authenticationOptions.token === void 0 && options.token) tokenActive = true;
223
+ await controller.connect(connectionSession);
224
+ return connectionSession.connection;
225
+ }
226
+ }
227
+ };
228
+ },
229
+ async restoreConnections() {
230
+ const restored = /* @__PURE__ */ new Map();
231
+ if (tokenActive && options.token) {
232
+ const session = await createTokenSession();
233
+ restored.set(session.connection.userId, session);
234
+ }
235
+ if (publicOauth) for (const oauthSession of await publicOauth.restoreSessions()) {
236
+ const session = createPublicSession(oauthSession);
237
+ restored.set(session.connection.userId, session);
238
+ }
239
+ if (clientCredentialsOauth && typeof window === "undefined") {
240
+ const session = await createClientCredentialsSession();
241
+ restored.set(session.connection.userId, session);
242
+ }
243
+ return [...restored.values()];
244
+ },
245
+ async cleanup() {
246
+ tokenProviders.clear();
247
+ await publicOauth?.cleanup();
248
+ clientCredentialsOauth?.cleanup();
249
+ }
250
+ };
310
251
  }
311
- export function createSalesforceConnectionAdapter(options) {
312
- return (context) => createSalesforceConnectionAdapterInstance(options, context);
252
+ function createSalesforceConnectionAdapter(options) {
253
+ return (context) => createSalesforceConnectionAdapterInstance(options, context);
313
254
  }
255
+ //#endregion
256
+ export { createSalesforceConnectionAdapter };
257
+
314
258
  //# sourceMappingURL=connection.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"connection.js","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"connection.js","names":[],"sources":["../src/connection.ts"],"sourcesContent":["import {\n type BackendConnectionAdapter,\n type BackendConnectionAdapterContext,\n type BackendConnectionAdapterProvider,\n type Connection,\n type ConnectionEgressHandlers,\n type ConnectionSession,\n type EstablishedConnection,\n withHttpAuthenticationErrorHandling,\n withHttpRetryHandling,\n} from \"@party-stack/connections\";\nimport { unauthenticated } from \"@party-stack/errors\";\nimport {\n createClientCredentialsOAuthClient,\n createPublicOAuthClient,\n type ClientCredentialsOAuthClient,\n type OAuthSession,\n type PublicOAuthClient,\n} from \"@party-stack/oauth\";\nimport {\n createSalesforceClient,\n type SalesforceChangeEvent,\n type SalesforceChangeEventSubscription,\n type SalesforceChangeEventSubscriptionOptions,\n} from \"@party-stack/salesforce-client\";\nimport type { BrowserAuthenticationPresentation } from \"@party-stack/runtime\";\n\nexport interface SalesforceOAuthConnectionOptions {\n clientId: string;\n redirectUrl: string;\n loginUrl?: string;\n scopes?: string[];\n fetch?: typeof globalThis.fetch;\n dangerouslyPersistSecrets?: boolean;\n}\n\nexport interface SalesforceClientCredentialsConnectionOptions {\n clientId: string;\n clientSecret: string;\n loginUrl?: string;\n scopes?: string[];\n fetch?: typeof globalThis.fetch;\n}\n\nexport interface CreateSalesforceConnectionAdapterOptions {\n instanceUrl: string;\n apiVersion?: string;\n cometdUrl?: string;\n oauth?: SalesforceOAuthConnectionOptions;\n clientCredentials?: SalesforceClientCredentialsConnectionOptions;\n token?: string;\n userId?: string;\n}\n\nexport interface SalesforceAuthenticationClient {\n completeOAuthRedirect(url: string): Promise<Connection<\"active\"> | undefined>;\n subscribeToChangeEvents(\n userId: string,\n sObjectName: string,\n listener: (event: SalesforceChangeEvent) => void,\n options?: SalesforceChangeEventSubscriptionOptions\n ): Promise<SalesforceChangeEventSubscription>;\n signIn: {\n oauth(options?: {\n browserPresentation?: BrowserAuthenticationPresentation;\n }): Promise<Connection<\"active\">>;\n clientCredentials(): Promise<Connection<\"active\">>;\n accessToken(options?: { token?: string; userId?: string }): Promise<Connection<\"active\">>;\n };\n}\n\ninterface SalesforceUserInfo {\n user_id?: string;\n sub?: string;\n}\n\nconst DEFAULT_SCOPES = [\"api\", \"refresh_token\", \"openid\"];\n\nfunction normalizeUrl(value: string): string {\n return value.replace(/\\/+$/, \"\");\n}\n\nfunction activeState(expiresAt: number | undefined, refreshable: boolean): Connection<\"active\">[\"state\"] {\n return expiresAt === undefined\n ? { status: \"active\" }\n : {\n status: \"active\",\n expiration: {\n expiresAt,\n refreshable,\n },\n };\n}\n\nasync function resolveSalesforceUserId(options: {\n loginUrl: string;\n token: string;\n fetch: typeof globalThis.fetch;\n}): Promise<string> {\n const response = await options.fetch(`${options.loginUrl}/services/oauth2/userinfo`, {\n headers: {\n Authorization: `Bearer ${options.token}`,\n Accept: \"application/json\",\n },\n });\n if (response.status === 401) {\n throw unauthenticated(\"Salesforce access token is invalid or expired.\");\n }\n if (!response.ok) {\n throw new Error(\n `Salesforce userinfo failed with status ${response.status}: ${await response.text()}`\n );\n }\n const user = (await response.json()) as SalesforceUserInfo;\n const userId = user.user_id ?? user.sub;\n if (!userId) {\n throw new Error(\"Salesforce userinfo did not return user_id or sub.\");\n }\n return userId;\n}\n\nfunction assertSalesforceOrigin(request: Request, instanceUrl: string): void {\n const actual = new URL(request.url).origin;\n const expected = new URL(instanceUrl).origin;\n if (actual !== expected) {\n throw new Error(`Salesforce egress not allowed for origin \"${actual}\".`);\n }\n}\n\nfunction createSalesforceEgressWrapper(options: {\n instanceUrl: string;\n tokenProvider: () => Promise<string>;\n refresh?: () => Promise<void>;\n}): (handlers: ConnectionEgressHandlers) => ConnectionEgressHandlers {\n return (handlers) =>\n withHttpAuthenticationErrorHandling(\n withHttpRetryHandling({\n ...handlers,\n async fetch(request) {\n assertSalesforceOrigin(request, options.instanceUrl);\n const retryRequest = request.clone();\n const send = async (current: Request) => {\n const headers = new Headers(current.headers);\n headers.set(\"Authorization\", `Bearer ${await options.tokenProvider()}`);\n return handlers.fetch(\n new Request(current, {\n headers,\n })\n );\n };\n let response = await send(request);\n if (response.status === 401 && options.refresh) {\n await options.refresh();\n response = await send(retryRequest);\n }\n return response;\n },\n })\n );\n}\n\nasync function createSalesforceConnectionAdapterInstance(\n options: CreateSalesforceConnectionAdapterOptions,\n context: BackendConnectionAdapterContext\n): Promise<BackendConnectionAdapter<SalesforceAuthenticationClient>> {\n const instanceUrl = normalizeUrl(options.instanceUrl);\n const apiVersion = options.apiVersion ?? \"65.0\";\n const loginUrl = normalizeUrl(\n options.oauth?.loginUrl ?? options.clientCredentials?.loginUrl ?? instanceUrl\n );\n const fetchImpl =\n options.oauth?.fetch ?? options.clientCredentials?.fetch ?? globalThis.fetch.bind(globalThis);\n let tokenActive = Boolean(options.token);\n const tokenProviders = new Map<string, () => Promise<string>>();\n const publicOauth: PublicOAuthClient | undefined = options.oauth\n ? await createPublicOAuthClient({\n clientId: options.oauth.clientId,\n redirectUrl: options.oauth.redirectUrl,\n scopes: [...new Set(options.oauth.scopes ?? DEFAULT_SCOPES)],\n authorizationServer: {\n issuer: loginUrl,\n authorizationEndpoint: `${loginUrl}/services/oauth2/authorize`,\n tokenEndpoint: `${loginUrl}/services/oauth2/token`,\n revocationEndpoint: `${loginUrl}/services/oauth2/revoke`,\n },\n runtime: context.runtime,\n fetch: options.oauth.fetch,\n dangerouslyPersistSecrets: options.oauth.dangerouslyPersistSecrets,\n resolveUserId: (token) =>\n resolveSalesforceUserId({\n loginUrl,\n token,\n fetch: fetchImpl,\n }),\n })\n : undefined;\n const clientCredentialsOauth: ClientCredentialsOAuthClient | undefined = options.clientCredentials\n ? createClientCredentialsOAuthClient({\n clientId: options.clientCredentials.clientId,\n clientSecret: options.clientCredentials.clientSecret,\n tokenEndpoint: `${loginUrl}/services/oauth2/token`,\n scopes: options.clientCredentials.scopes,\n fetch: options.clientCredentials.fetch,\n resolveUserId: (token) =>\n resolveSalesforceUserId({\n loginUrl,\n token,\n fetch: fetchImpl,\n }),\n })\n : undefined;\n\n const createTokenSession = async (\n authenticationOptions: {\n token?: string;\n userId?: string;\n } = {}\n ): Promise<EstablishedConnection> => {\n const token = authenticationOptions.token ?? options.token;\n if (!token) {\n throw new Error(\"Salesforce access-token connections are not configured.\");\n }\n const userId =\n authenticationOptions.userId ??\n options.userId ??\n (await resolveSalesforceUserId({\n loginUrl,\n token,\n fetch: fetchImpl,\n }));\n const connection: Connection<\"active\"> = {\n userId,\n state: { status: \"active\" },\n };\n tokenProviders.set(userId, () => Promise.resolve(token));\n const session: ConnectionSession = {\n disconnect() {\n tokenProviders.delete(userId);\n if (token === options.token) {\n tokenActive = false;\n }\n return Promise.resolve();\n },\n egress: createSalesforceEgressWrapper({\n instanceUrl,\n tokenProvider: () => Promise.resolve(token),\n }),\n };\n return { connection, session };\n };\n\n const createPublicSession = (oauthSession: OAuthSession): EstablishedConnection => {\n const userId = oauthSession.userId;\n const connection: Connection<\"active\"> = {\n userId,\n state: activeState(\n oauthSession.expiration?.expiresAt,\n oauthSession.expiration?.refreshable ?? false\n ),\n };\n const tokenProvider = () => {\n if (!publicOauth) {\n throw unauthenticated(\"Salesforce public OAuth is not configured.\");\n }\n return publicOauth.getAccessToken(userId);\n };\n tokenProviders.set(userId, tokenProvider);\n const session: ConnectionSession = {\n async refresh() {\n if (!publicOauth) {\n throw unauthenticated(\"Salesforce public OAuth is not configured.\");\n }\n return createPublicSession(await publicOauth.refresh(userId));\n },\n async disconnect() {\n tokenProviders.delete(userId);\n await publicOauth?.revoke(userId);\n },\n egress: createSalesforceEgressWrapper({\n instanceUrl,\n tokenProvider,\n refresh: async () => {\n if (!publicOauth) {\n throw unauthenticated(\"Salesforce public OAuth is not configured.\");\n }\n await publicOauth.refresh(userId);\n },\n }),\n };\n return { connection, session };\n };\n\n const createClientCredentialsSession = async (forceRefresh = false): Promise<EstablishedConnection> => {\n if (!clientCredentialsOauth) {\n throw new Error(\"Salesforce client credentials are not configured.\");\n }\n const oauthSession = forceRefresh\n ? await clientCredentialsOauth.refresh()\n : await clientCredentialsOauth.getSession();\n const userId = oauthSession.userId;\n const tokenProvider = () => clientCredentialsOauth.getAccessToken();\n tokenProviders.set(userId, tokenProvider);\n return {\n connection: {\n userId,\n state: activeState(oauthSession.expiration?.expiresAt, true),\n },\n session: {\n refresh: () => createClientCredentialsSession(true),\n disconnect() {\n tokenProviders.delete(userId);\n return Promise.resolve();\n },\n egress: createSalesforceEgressWrapper({\n instanceUrl,\n tokenProvider,\n refresh: () => clientCredentialsOauth.refresh().then(() => undefined),\n }),\n },\n };\n };\n\n return {\n name: \"salesforce\",\n createAuthenticationClient(controller) {\n return {\n async subscribeToChangeEvents(userId, sObjectName, listener, subscriptionOptions) {\n const tokenProvider = tokenProviders.get(userId);\n if (!tokenProvider) {\n throw unauthenticated(`Salesforce connection for user \"${userId}\" is unavailable.`);\n }\n const client = createSalesforceClient({\n instanceUrl,\n apiVersion,\n cometdUrl: options.cometdUrl,\n tokenProvider,\n });\n return client.subscribeToChangeEvents(sObjectName, listener, subscriptionOptions);\n },\n async completeOAuthRedirect(url) {\n if (!publicOauth) return;\n const session = await publicOauth.completeRedirect(url);\n if (!session) return;\n const connectionSession = createPublicSession(session);\n await controller.connect(connectionSession);\n return connectionSession.connection;\n },\n signIn: {\n async oauth(authenticationOptions = {}) {\n if (!publicOauth) {\n throw new Error(\"Salesforce public OAuth is not configured.\");\n }\n const session = await publicOauth.signIn({\n browserPresentation: authenticationOptions.browserPresentation,\n });\n const connectionSession = createPublicSession(session);\n await controller.connect(connectionSession);\n return connectionSession.connection;\n },\n async clientCredentials() {\n if (!clientCredentialsOauth) {\n throw new Error(\"Salesforce client credentials are not configured.\");\n }\n if (typeof window !== \"undefined\") {\n throw new Error(\"Salesforce client credentials cannot run in a browser.\");\n }\n const connectionSession = await createClientCredentialsSession();\n await controller.connect(connectionSession);\n return connectionSession.connection;\n },\n async accessToken(authenticationOptions = {}) {\n const connectionSession = await createTokenSession(authenticationOptions);\n if (authenticationOptions.token === undefined && options.token) {\n tokenActive = true;\n }\n await controller.connect(connectionSession);\n return connectionSession.connection;\n },\n },\n };\n },\n async restoreConnections() {\n const restored = new Map<string, EstablishedConnection>();\n if (tokenActive && options.token) {\n const session = await createTokenSession();\n restored.set(session.connection.userId, session);\n }\n if (publicOauth) {\n for (const oauthSession of await publicOauth.restoreSessions()) {\n const session = createPublicSession(oauthSession);\n restored.set(session.connection.userId, session);\n }\n }\n if (clientCredentialsOauth && typeof window === \"undefined\") {\n const session = await createClientCredentialsSession();\n restored.set(session.connection.userId, session);\n }\n return [...restored.values()];\n },\n async cleanup() {\n tokenProviders.clear();\n await publicOauth?.cleanup();\n clientCredentialsOauth?.cleanup();\n },\n };\n}\n\nexport function createSalesforceConnectionAdapter(\n options: CreateSalesforceConnectionAdapterOptions\n): BackendConnectionAdapterProvider<SalesforceAuthenticationClient> {\n return (context) => createSalesforceConnectionAdapterInstance(options, context);\n}\n"],"mappings":"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"}