@cobaltio/cobalt-js 9.0.0 → 9.2.0-beta.1
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/cobalt.d.ts +56 -8
- package/cobalt.js +363 -358
- package/cobalt.ts +129 -19
- package/docs/assets/hierarchy.js +1 -1
- package/docs/assets/navigation.js +1 -1
- package/docs/assets/search.js +1 -1
- package/docs/classes/Cobalt.html +36 -23
- package/docs/enums/AuthStatus.html +2 -2
- package/docs/enums/AuthType.html +2 -2
- package/docs/interfaces/Application.html +15 -14
- package/docs/interfaces/CobaltOptions.html +3 -3
- package/docs/interfaces/Config.html +2 -2
- package/docs/interfaces/ConfigField.html +4 -4
- package/docs/interfaces/ConfigPayload.html +4 -4
- package/docs/interfaces/ConfigWorkflow.html +2 -2
- package/docs/interfaces/ExecuteWorkflowPayload.html +9 -0
- package/docs/interfaces/Execution.html +2 -2
- package/docs/interfaces/InputField.html +9 -9
- package/docs/interfaces/KeyBasedParams.html +7 -0
- package/docs/interfaces/Label.html +3 -3
- package/docs/interfaces/OAuthParams.html +7 -0
- package/docs/interfaces/PublicWorkflow.html +8 -8
- package/docs/interfaces/PublicWorkflowPayload.html +4 -4
- package/docs/interfaces/PublicWorkflowsPayload.html +2 -2
- package/docs/interfaces/RuleOptions.html +2 -2
- package/docs/interfaces/UpdateConfigPayload.html +5 -5
- package/docs/interfaces/WorkflowPayload.html +4 -4
- package/docs/interfaces/WorkflowPayloadResponse.html +4 -0
- package/docs/llms.txt +256 -159
- package/docs/modules.html +1 -1
- package/package.json +1 -1
- package/tsconfig.json +12 -12
package/cobalt.ts
CHANGED
|
@@ -38,6 +38,8 @@ export interface Application {
|
|
|
38
38
|
};
|
|
39
39
|
/** The list of connected accounts for this application */
|
|
40
40
|
connected_accounts?: {
|
|
41
|
+
/** The connection identifier of the auth config. */
|
|
42
|
+
connection_id: string;
|
|
41
43
|
/** The identifier (username, email, etc.) of the connected account. */
|
|
42
44
|
identifier: unknown;
|
|
43
45
|
/** The auth type used to connect the account. */
|
|
@@ -92,6 +94,24 @@ export interface InputField {
|
|
|
92
94
|
}[];
|
|
93
95
|
}
|
|
94
96
|
|
|
97
|
+
export interface OAuthParams {
|
|
98
|
+
/** The application slug. */
|
|
99
|
+
slug: string;
|
|
100
|
+
/** The connection identifier. */
|
|
101
|
+
connection?: string;
|
|
102
|
+
/** The key value pairs of auth data. */
|
|
103
|
+
payload?: Record<string, string>;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export interface KeyBasedParams {
|
|
107
|
+
/** The application slug. */
|
|
108
|
+
slug: string;
|
|
109
|
+
/** The connection identifier. */
|
|
110
|
+
connection?: string;
|
|
111
|
+
/** The key value pairs of auth data. */
|
|
112
|
+
payload?: Record<string, string>;
|
|
113
|
+
}
|
|
114
|
+
|
|
95
115
|
/** The payload object for config. */
|
|
96
116
|
export interface ConfigPayload {
|
|
97
117
|
/** The application slug. */
|
|
@@ -252,6 +272,23 @@ export interface ConfigWorkflow {
|
|
|
252
272
|
fields?: ConfigField[];
|
|
253
273
|
}
|
|
254
274
|
|
|
275
|
+
export interface WorkflowPayloadResponse {
|
|
276
|
+
payload: Record<string, any>;
|
|
277
|
+
schema?: unknown;
|
|
278
|
+
schema_interpreted?: unknown;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
export interface ExecuteWorkflowPayload {
|
|
282
|
+
/**The workflow id or alias. */
|
|
283
|
+
worklfow: string;
|
|
284
|
+
/** The application's slug this workflow belongs to. */
|
|
285
|
+
slug?: string;
|
|
286
|
+
/** The payload to execute the workflow. */
|
|
287
|
+
payload?: Record<string, any>;
|
|
288
|
+
/** Whether to execute the workflow synchronously. */
|
|
289
|
+
sync_execution?: boolean;
|
|
290
|
+
}
|
|
291
|
+
|
|
255
292
|
export interface Execution {
|
|
256
293
|
_id: string;
|
|
257
294
|
id?: string;
|
|
@@ -426,12 +463,22 @@ class Cobalt {
|
|
|
426
463
|
* Returns the auth URL that users can use to authenticate themselves to the
|
|
427
464
|
* specified application.
|
|
428
465
|
* @private
|
|
429
|
-
* @param {
|
|
430
|
-
* @param {Object.<string, string>} [params] The key value pairs of auth data.
|
|
466
|
+
* @param {OAuthParams} params The OAuth parameters.
|
|
431
467
|
* @returns {Promise<String>} The auth URL where users can authenticate themselves.
|
|
432
468
|
*/
|
|
433
|
-
private async getOAuthUrl(
|
|
434
|
-
|
|
469
|
+
private async getOAuthUrl({
|
|
470
|
+
slug,
|
|
471
|
+
connection,
|
|
472
|
+
payload,
|
|
473
|
+
}: OAuthParams): Promise<string> {
|
|
474
|
+
const queryParams = new URLSearchParams();
|
|
475
|
+
if (connection) queryParams.append("connection", connection);
|
|
476
|
+
if (typeof payload === "object") {
|
|
477
|
+
for (const [ key, value ] of Object.entries(payload)) {
|
|
478
|
+
queryParams.append(key, value);
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
const res = await fetch(`${this.baseUrl}/api/v1/${slug}/integrate?${queryParams.toString()}`, {
|
|
435
482
|
headers: {
|
|
436
483
|
authorization: `Bearer ${this.token}`,
|
|
437
484
|
},
|
|
@@ -449,13 +496,16 @@ class Cobalt {
|
|
|
449
496
|
/**
|
|
450
497
|
* Handle OAuth for the specified application.
|
|
451
498
|
* @private
|
|
452
|
-
* @param {
|
|
453
|
-
* @param {Object.<string, string>} [params] The key value pairs of auth data.
|
|
499
|
+
* @param {OAuthParams} params The OAuth parameters.
|
|
454
500
|
* @returns {Promise<Boolean>} Whether the user authenticated.
|
|
455
501
|
*/
|
|
456
|
-
private async oauth(
|
|
502
|
+
private async oauth({
|
|
503
|
+
slug,
|
|
504
|
+
connection,
|
|
505
|
+
payload,
|
|
506
|
+
}: OAuthParams): Promise<boolean> {
|
|
457
507
|
return new Promise((resolve, reject) => {
|
|
458
|
-
this.getOAuthUrl(slug,
|
|
508
|
+
this.getOAuthUrl({ slug, connection, payload })
|
|
459
509
|
.then(oauthUrl => {
|
|
460
510
|
const connectWindow = window.open(oauthUrl);
|
|
461
511
|
|
|
@@ -463,7 +513,8 @@ class Cobalt {
|
|
|
463
513
|
const interval = setInterval(() => {
|
|
464
514
|
this.getApp(slug)
|
|
465
515
|
.then(app => {
|
|
466
|
-
|
|
516
|
+
const oauthAccounts = app.connected_accounts?.filter(a => a.auth_type === AuthType.OAuth2 && a.status === AuthStatus.Active);
|
|
517
|
+
if (app && oauthAccounts?.some(a => connection ? a.connection_id === connection : true)) {
|
|
467
518
|
// close auth window
|
|
468
519
|
connectWindow && connectWindow.close();
|
|
469
520
|
// clear interval
|
|
@@ -494,12 +545,15 @@ class Cobalt {
|
|
|
494
545
|
|
|
495
546
|
/**
|
|
496
547
|
* Save auth data for the specified keybased application.
|
|
497
|
-
* @param {
|
|
498
|
-
* @param {Object.<string, string>} [payload] The key value pairs of auth data.
|
|
548
|
+
* @param {KeyBasedParams} params The key based parameters.
|
|
499
549
|
* @returns {Promise<Boolean>} Whether the auth data was saved successfully.
|
|
500
550
|
*/
|
|
501
|
-
private async keybased(
|
|
502
|
-
|
|
551
|
+
private async keybased({
|
|
552
|
+
slug,
|
|
553
|
+
connection,
|
|
554
|
+
payload,
|
|
555
|
+
}: KeyBasedParams): Promise<boolean> {
|
|
556
|
+
const res = await fetch(`${this.baseUrl}/api/v2/app/${slug}/save?connection=${connection}`, {
|
|
503
557
|
method: "POST",
|
|
504
558
|
headers: {
|
|
505
559
|
authorization: `Bearer ${this.token}`,
|
|
@@ -523,6 +577,7 @@ class Cobalt {
|
|
|
523
577
|
* Connects the specified application using the provided authentication type and optional auth data.
|
|
524
578
|
* @param params - The parameters for connecting the application.
|
|
525
579
|
* @param params.slug - The application slug.
|
|
580
|
+
* @param params.connection - The connection identifier of the auth config.
|
|
526
581
|
* @param params.type - The authentication type to use. If not provided, it defaults to `keybased` if payload is provided, otherwise `oauth2`.
|
|
527
582
|
* @param params.payload - key-value pairs of authentication data required for the specified auth type.
|
|
528
583
|
* @returns A promise that resolves to true if the connection was successful, otherwise false.
|
|
@@ -530,21 +585,23 @@ class Cobalt {
|
|
|
530
585
|
*/
|
|
531
586
|
public async connect({
|
|
532
587
|
slug,
|
|
588
|
+
connection,
|
|
533
589
|
type,
|
|
534
590
|
payload,
|
|
535
591
|
}: {
|
|
536
592
|
slug: string;
|
|
593
|
+
connection?: string;
|
|
537
594
|
type?: AuthType;
|
|
538
595
|
payload?: Record<string, string>;
|
|
539
596
|
}): Promise<boolean> {
|
|
540
597
|
switch (type) {
|
|
541
598
|
case AuthType.OAuth2:
|
|
542
|
-
return this.oauth(slug, payload);
|
|
599
|
+
return this.oauth({ slug, connection, payload });
|
|
543
600
|
case AuthType.KeyBased:
|
|
544
|
-
return this.keybased(slug, payload);
|
|
601
|
+
return this.keybased({ slug, connection, payload });
|
|
545
602
|
default:
|
|
546
|
-
if (payload) return this.keybased(slug, payload);
|
|
547
|
-
return this.oauth(slug);
|
|
603
|
+
if (payload) return this.keybased({ slug, connection, payload });
|
|
604
|
+
return this.oauth({ slug, connection });
|
|
548
605
|
}
|
|
549
606
|
}
|
|
550
607
|
|
|
@@ -552,10 +609,15 @@ class Cobalt {
|
|
|
552
609
|
* Disconnect the specified application and remove any associated data from Cobalt.
|
|
553
610
|
* @param {String} slug The application slug.
|
|
554
611
|
* @param {AuthType} [type] The authentication type to use. If not provided, it'll remove all the connected accounts.
|
|
612
|
+
* @param {String} [connection] The connection identifier of the auth config.
|
|
555
613
|
* @returns {Promise<unknown>}
|
|
556
614
|
*/
|
|
557
|
-
public async disconnect(slug: string, type?: AuthType): Promise<unknown> {
|
|
558
|
-
const
|
|
615
|
+
public async disconnect(slug: string, type?: AuthType, connection?: string): Promise<unknown> {
|
|
616
|
+
const queryParams = new URLSearchParams();
|
|
617
|
+
if (type) queryParams.append("auth_type", type);
|
|
618
|
+
if (connection) queryParams.append("connection", connection);
|
|
619
|
+
|
|
620
|
+
const res = await fetch(`${this.baseUrl}/api/v1/linked-acc/integration/${slug}?${queryParams.toString()}`, {
|
|
559
621
|
method: "DELETE",
|
|
560
622
|
headers: {
|
|
561
623
|
authorization: `Bearer ${this.token}`,
|
|
@@ -861,6 +923,54 @@ class Cobalt {
|
|
|
861
923
|
return await res.json();
|
|
862
924
|
}
|
|
863
925
|
|
|
926
|
+
/**
|
|
927
|
+
* Returns the execution payload for the specified public workflow.
|
|
928
|
+
* @param {String} workflowId The workflow ID.
|
|
929
|
+
* @returns {Promise<WorkflowPayloadResponse>} The workflow payload response.
|
|
930
|
+
*/
|
|
931
|
+
async getWorkflowPayload(workflowId: string): Promise<WorkflowPayloadResponse> {
|
|
932
|
+
const res = await fetch(`${this.baseUrl}/api/v2/public/workflow/request-structure/${workflowId}`, {
|
|
933
|
+
headers: {
|
|
934
|
+
authorization: `Bearer ${this.token}`,
|
|
935
|
+
},
|
|
936
|
+
});
|
|
937
|
+
|
|
938
|
+
if (res.status >= 400 && res.status < 600) {
|
|
939
|
+
const error = await res.json();
|
|
940
|
+
throw error;
|
|
941
|
+
}
|
|
942
|
+
|
|
943
|
+
return await res.json();
|
|
944
|
+
}
|
|
945
|
+
|
|
946
|
+
/**
|
|
947
|
+
* Execute the specified public workflow.
|
|
948
|
+
* @param {ExecuteWorkflowPayload} options The execution payload.
|
|
949
|
+
* @param {String} options.worklfow The workflow id or alias.
|
|
950
|
+
* @param {String} [options.slug] The application's slug this workflow belongs to. Slug is required if you're using workflow alias.
|
|
951
|
+
* @param {Record<string, any>} [options.payload] The execution payload.
|
|
952
|
+
* @returns {Promise<unknown>}
|
|
953
|
+
*/
|
|
954
|
+
async executeWorkflow(options: ExecuteWorkflowPayload): Promise<unknown> {
|
|
955
|
+
const res = await fetch(`${this.baseUrl}/api/v2/public/workflow/${options?.worklfow}/execute`, {
|
|
956
|
+
method: "POST",
|
|
957
|
+
headers: {
|
|
958
|
+
authorization: `Bearer ${this.token}`,
|
|
959
|
+
"content-type": "application/json",
|
|
960
|
+
slug: options?.slug || "",
|
|
961
|
+
sync_execution: options?.sync_execution ? "true" : "false",
|
|
962
|
+
},
|
|
963
|
+
body: JSON.stringify(options?.payload),
|
|
964
|
+
});
|
|
965
|
+
|
|
966
|
+
if (res.status >= 400 && res.status < 600) {
|
|
967
|
+
const error = await res.json();
|
|
968
|
+
throw error;
|
|
969
|
+
}
|
|
970
|
+
|
|
971
|
+
return await res.json();
|
|
972
|
+
}
|
|
973
|
+
|
|
864
974
|
/**
|
|
865
975
|
* Returns the workflow execution logs for the linked account.
|
|
866
976
|
* @param {Object} [params]
|
package/docs/assets/hierarchy.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
window.hierarchyData = "
|
|
1
|
+
window.hierarchyData = "eJyrVirKzy8pVrKKjtVRKkpNy0lNLsnMzytWsqqurQUAmx4Kpg=="
|
|
@@ -1 +1 @@
|
|
|
1
|
-
window.navigationData = "
|
|
1
|
+
window.navigationData = "eJyVlNFKwzAUht8l18PhQJHdqSgMhZWpeCFenLWnNixLQ88JbojvLp3OLi49jbf5v/9rOEn68qEYN6ym6tJz9cDAntRIOeBKTRVav6Zxl5xUvDZqpFbaFmp68TkK2o9bh7Fuu97fvK6XYLjr5QaIkMbf62HvdBJ80zmjc2Bd266uLWNTQo40PshDzeTs/GgDc9dyFBUFhKyypX7rcbTRcPlWoykEwy4f1mSwNTVIoh9iWPVcN6vS1O+Ca49IspsN5p5xj0objKPD8r6L8JtKipl1nvun38WS5A63V0BYZNDAOn6ZQkSS3cMSTdSxS6TqvH13wiYOckmT+aXRuXgBQiRdJp1/lExXU7qbEuQLb1D6OxzkkubJFcA4/DojnKRNmec/JvkHXSC52hKmaPfssf71C1D9NS0="
|
package/docs/assets/search.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
window.searchData = "
|
|
1
|
+
window.searchData = "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";
|