@cobaltio/cobalt-js 9.1.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.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. */
@@ -443,12 +463,22 @@ class Cobalt {
443
463
  * Returns the auth URL that users can use to authenticate themselves to the
444
464
  * specified application.
445
465
  * @private
446
- * @param {String} slug The application slug.
447
- * @param {Object.<string, string>} [params] The key value pairs of auth data.
466
+ * @param {OAuthParams} params The OAuth parameters.
448
467
  * @returns {Promise<String>} The auth URL where users can authenticate themselves.
449
468
  */
450
- private async getOAuthUrl(slug: string, params?: Record<string, string>): Promise<string> {
451
- const res = await fetch(`${this.baseUrl}/api/v1/${slug}/integrate?${new URLSearchParams(params).toString()}`, {
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()}`, {
452
482
  headers: {
453
483
  authorization: `Bearer ${this.token}`,
454
484
  },
@@ -466,13 +496,16 @@ class Cobalt {
466
496
  /**
467
497
  * Handle OAuth for the specified application.
468
498
  * @private
469
- * @param {String} slug The application slug.
470
- * @param {Object.<string, string>} [params] The key value pairs of auth data.
499
+ * @param {OAuthParams} params The OAuth parameters.
471
500
  * @returns {Promise<Boolean>} Whether the user authenticated.
472
501
  */
473
- private async oauth(slug: string, params?: Record<string, string>): Promise<boolean> {
502
+ private async oauth({
503
+ slug,
504
+ connection,
505
+ payload,
506
+ }: OAuthParams): Promise<boolean> {
474
507
  return new Promise((resolve, reject) => {
475
- this.getOAuthUrl(slug, params)
508
+ this.getOAuthUrl({ slug, connection, payload })
476
509
  .then(oauthUrl => {
477
510
  const connectWindow = window.open(oauthUrl);
478
511
 
@@ -480,7 +513,8 @@ class Cobalt {
480
513
  const interval = setInterval(() => {
481
514
  this.getApp(slug)
482
515
  .then(app => {
483
- if (app && app.connected_accounts?.filter(a => a.auth_type === AuthType.OAuth2).some(a => a.status === AuthStatus.Active)) {
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)) {
484
518
  // close auth window
485
519
  connectWindow && connectWindow.close();
486
520
  // clear interval
@@ -511,12 +545,15 @@ class Cobalt {
511
545
 
512
546
  /**
513
547
  * Save auth data for the specified keybased application.
514
- * @param {String} slug The application slug.
515
- * @param {Object.<string, string>} [payload] The key value pairs of auth data.
548
+ * @param {KeyBasedParams} params The key based parameters.
516
549
  * @returns {Promise<Boolean>} Whether the auth data was saved successfully.
517
550
  */
518
- private async keybased(slug: string, payload?: Record<string, string>): Promise<boolean> {
519
- const res = await fetch(`${this.baseUrl}/api/v2/app/${slug}/save`, {
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}`, {
520
557
  method: "POST",
521
558
  headers: {
522
559
  authorization: `Bearer ${this.token}`,
@@ -540,6 +577,7 @@ class Cobalt {
540
577
  * Connects the specified application using the provided authentication type and optional auth data.
541
578
  * @param params - The parameters for connecting the application.
542
579
  * @param params.slug - The application slug.
580
+ * @param params.connection - The connection identifier of the auth config.
543
581
  * @param params.type - The authentication type to use. If not provided, it defaults to `keybased` if payload is provided, otherwise `oauth2`.
544
582
  * @param params.payload - key-value pairs of authentication data required for the specified auth type.
545
583
  * @returns A promise that resolves to true if the connection was successful, otherwise false.
@@ -547,21 +585,23 @@ class Cobalt {
547
585
  */
548
586
  public async connect({
549
587
  slug,
588
+ connection,
550
589
  type,
551
590
  payload,
552
591
  }: {
553
592
  slug: string;
593
+ connection?: string;
554
594
  type?: AuthType;
555
595
  payload?: Record<string, string>;
556
596
  }): Promise<boolean> {
557
597
  switch (type) {
558
598
  case AuthType.OAuth2:
559
- return this.oauth(slug, payload);
599
+ return this.oauth({ slug, connection, payload });
560
600
  case AuthType.KeyBased:
561
- return this.keybased(slug, payload);
601
+ return this.keybased({ slug, connection, payload });
562
602
  default:
563
- if (payload) return this.keybased(slug, payload);
564
- return this.oauth(slug);
603
+ if (payload) return this.keybased({ slug, connection, payload });
604
+ return this.oauth({ slug, connection });
565
605
  }
566
606
  }
567
607
 
@@ -569,10 +609,15 @@ class Cobalt {
569
609
  * Disconnect the specified application and remove any associated data from Cobalt.
570
610
  * @param {String} slug The application slug.
571
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.
572
613
  * @returns {Promise<unknown>}
573
614
  */
574
- public async disconnect(slug: string, type?: AuthType): Promise<unknown> {
575
- const res = await fetch(`${this.baseUrl}/api/v1/linked-acc/integration/${slug}${type ? `?auth_type=${type}` : ""}`, {
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()}`, {
576
621
  method: "DELETE",
577
622
  headers: {
578
623
  authorization: `Bearer ${this.token}`,
@@ -1 +1 @@
1
- window.navigationData = "eJyVk1FLwzAUhf9LnovFgSJ9E1EQBMc28UF8SNtbG5YlYfcGN8T/Lp3WLi69ja853/kaDs3LhyDYkSjEtad2SZI8ikw4Sa0oBBi/wXxIzlraaJGJtTK1KK4+s6C92juIdbvz8eaNLaWmoVdpiQiYf5+HvfNZ8E3ntKokKWuGujIE20ZWgPlRHmpmF5cnF3h0HYdRUUDwKtOotxFHF02X7xTomjEc8mnNXO61lZzoh5hWPdvtutH2nXH1CCe73UHlCXqUu2AcnZaP/Qi/Kae4N87T+PpDzEkeZAk62j8kXHXuS60qduwQSZdxW0fJdDWmuzFBvvAauJd4lHOaJ1dLgumXEOE4bcqe/1jyD7oAdNYgpGh79lT/+gV47gL5"
1
+ window.navigationData = "eJyVlNFKwzAUht8l18PhQJHdqSgMhZWpeCFenLWnNixLQ88JbojvLp3OLi49jbf5v/9rOEn68qEYN6ym6tJz9cDAntRIOeBKTRVav6Zxl5xUvDZqpFbaFmp68TkK2o9bh7Fuu97fvK6XYLjr5QaIkMbf62HvdBJ80zmjc2Bd266uLWNTQo40PshDzeTs/GgDc9dyFBUFhKyypX7rcbTRcPlWoykEwy4f1mSwNTVIoh9iWPVcN6vS1O+Ca49IspsN5p5xj0objKPD8r6L8JtKipl1nvun38WS5A63V0BYZNDAOn6ZQkSS3cMSTdSxS6TqvH13wiYOckmT+aXRuXgBQiRdJp1/lExXU7qbEuQLb1D6OxzkkubJFcA4/DojnKRNmec/JvkHXSC52hKmaPfssf71C1D9NS0="
@@ -1 +1 @@
1
- window.searchData = "eJytnd+P27gRx/8X7asvESlSEvftergChxa4w7XXPhjBwrGVXSNe27Xl/ECQ/70gJVkz5JAay3lKsCbnS1EfDocztvQtOx0+n7PH5bfs43a/yR7rRbZfvTbZY/bzpX35V7tqL+dskV1Ou+wxa/aX1/Pb8YM3L+3rLltk693qfG7O2WOWfV8MlkQ5mlq3209N2szDamgErC2y4+rU7Fs8HFLj1y/H7anZTIg011Y3qOA5+ffXI3Up9s/c+fhH8/VvqzM52KuZh4/N1/d9o/hY3WBIjd/txzKpcFj1Tfj25TgXvxzer3btVaC38bb7c3ImtJBXK+vD/tyeLuv2cEqZesDt6AH3IwLDzaW6KrWHj80+qTG0YFqXuarhdXzYPk9dQtdkpv19s05O98PYZpbCqVm1zX8Pp48fdofPaSHX9PPYdI7eptk1bfPL9Lx1De+aPaj1922z27AFP/St56uyZrRreu+Mbs8cTFCzOTrNl2Z9YV5Y3/bOK3tu2p+Px6TQc9OuXJP59s8MgfN8BQbqz017F+dXlWnIr1L3EH7Vm5y69bXZTJ1fHUjbQ9qFPzdtAxreqzV5WQ1sOVPN3avfjyw9d7MOxzsVh5X7x+rr7rCa5GRYvMdr8zt1Jy/zM2g4R+ty3KxYe0vX8K41B7Wmlx0UvHXlaRBRH4+77XqF1sN23zanD6t1c34LPk7HpDBAWh2PT9sNx9zDtWkkcgSji4ld2pen7f54aZ9eV0eeqN/lPvEWxvGTun3r+yWfDt5KZ0k/Ta15xhD6Tb/h3WLY+n7Jp9V6fbjsW95lk91mD2LTnNen7ZG7Vh5w+9my2zVTr284W8j9wxHqG84WOjWOx1Pzvws6aqc0wz6z5c+7yzNLs284W6hdPfM47RvOF+K6oBneB+4W3VbihxhAEDXg7xg2P/HXacez+GBbX067iQ1vGCXrFJ8W5JznQzk8cSiCQHL2E/5UdTt+ZH8Fxh5gw9jA3aAiQi6oeGpOp8MpcqtHLa/tbDme0FyJ2LqHAsklnzb/OQhKIxqcoNQTClnCEWKg5D6+IWQ7nw/r7crulMfVM+lLfLsPYZ/UxXTjTbIW82KBMmo+W/Sl2R2f2uZLy9KEredLbjebmNfx9Yams8VSLgIITTqIpMhu9b7ZJYgHQtems8VeL7t2e9zxIAGNZwvGIqJALBkRMYQSsXygNX1qn5Tr23LUrk3ni+1W6+blsNs0J54iaj9bNhVdBpqTYSVD8NNqd+HRMrS8RSrcAfykS6DYN/ihsQW0yQ4xhpHO9CFIk+VFJgTTgQCSY8QDoVh4r4IUd6A6tODfrYnjKGGWdSL1BhwRb/ar97vU4sLCY/N7RKdiRKzJihWnJFNrActNroIpqfRmg8UY+w0hB7n8FddeEs6Ebsnn9DjL9MNUkjhyATcu+dQIkmv/Rvmv+/VTE1QeuAPxe/+IIdlTyO4D7ZJSgwH9Zg4jxDA5JzflniObF7b0kNqyxhFNn5VW6ey5pxrteP9Amk/NvuVdO93r/iG0p+3zc3OaPye0gfsH9jmx98ZHM1lonhzC+vB63DW2xdOxOa2bfRs5WXuDiPWbPYxEUBdITwV003LuKx2bn8nThS/XtV3FjxfTcpdze3iFzDCvNNLvvmEMCN8yBNRnpnyz/7Q9HfavkUOdJ4xbz5RkXeI917Tb7j+OhRvelFJ9ZsrHojFPMRmITYscNg0Zz/oqfbuZMocTc/1fG84UOuOvecaFrg1nChF7RbebMbRTffnDgUHMb7aWHE3Ijp/yw5hkbtIzyEhNggGmzuAcsaHhXKFUDs/XmkzhTcvFlrEvlVzH0zKJ/J2vNJW+mxabSKj5gpx82rRoKp3mK05m06blYrUAXypZBCBl4ML9Z4x69wF/ucYoG82kAevGcWteEVhPZxR983AK/ri8323XqfwUbnH3UYwwlzyPeQOcE3ZSktOxJ094IgtHSXOycDzxGHeUahJAntzRtjq/0E6A0oQd7hGOZW8ozWTWhifXfbfuBpj6DnNgiq/FREqObPjDMsdx6zPQnchC8QhGY7gB5JlJwYT4DXSlE1+47Zl9s8833+3d9nXLIPmMyyx9p9F8e978tD3/tN2/NKdt93W+yIWfJ6Y99g2D1HiCbxj8uOHwKDjPxYCQhxz8edk1iS9UgY9vquNttrbPave0Pmyap3O7OVxIBnz7D/G+9MXC8ceyE/Z7QSzxoeVsqdNl1zytD7vLK+nZAkHc/hZZeA//At/cTixkotkPqs3GLDMSetTYby6/RfUnanA3iMdWaVQ6uURvEE5+rSuqPv0dr/QQIF6MgGB2KJCo45L731Qhl7nzxlEiVScwYorSa4cUTCwY3vbutfqzOR8P+zO57UWa/pACa8r2ZIU1dg2xFbp+aV5XN4/i2u0HDuLJiR9PTeRHCowBeSZuHNy7Rbbdb5ov2eO37FNzOtt4+TGTb4o3JlsM9D8uh/B3fXjts/Gbw/ri/vuub/afxv5U2TbuWr/Ns8UyXyj9pqrFu3eL5dDZfeD+MNgY/+I6imyxFFRHEXQUqKPMFktJdZRBR4k6FtliWVAdi6BjgTqqbLFUVEcVdFSoo84WS0111EFHjTqW2WJZUh3LoGOJOlbZYllRHaugY4U61tliWS9U/qasCtSxDjrWqKPJFktDdTRBR4MBsDwIkh0RwiM8ehw+ND8EQJggYbkQJEMihEhgioRlQ5AciRAkgUkSlg9BsiRCmASmSVhGBMmTCIESmChhOREkUyKESmCqhGVFkFyJECyByRKWF1GTnUO4BKZLWGaEITuHgAlMmLTMSJIwGRImMWHSMiNJwmRImPR8lHNStJci3BQmTFpmJEmYDAmTmDBpmZEkYTIkTGLCpGVGkoTJkDCJCZOWGUkSJkPCJCZMWmYkSZgMCZOYMGmZkSRhMiRMYsKkZUaShMmQMIkJKywzBUlYERJWYMIKy0xBElaEhBWYsMIyU5CEFSFhhbcTuq2Q3guJzRATVlhmCpKwIiSswIQVlpmCJKwICSswYYVlpigXhXpTGY07h4QVmLDCMlOQhBUhYQUmrLDMFPVC1m9U4SmHhBWYsMIyU5CEFSFhBSZMWWZUTimrkDCFCVOWGUUSpkLCFCZMWWaUpLZ2FRKmMGHKMqNIwlRImPLiLRdw0REXEXJhwpSORTIqBExhwFQZC2ZUyJfCfClLjNIUnCrkS2G+lCVGkb5ThXwpzJeyxKiKVA75UpgvHedLh3xpzJd2fJGTrUO+NOZLO77IZaFDvjTmS1tiNOl4dciXxnxpS4wml4UO+dJeTO+CenJZaCKsx4Bpy4wml4UOCdOYMG2Z0Yq6zzokTGPCtGVGa3LYIWEaE6YtM7okO4eEaUxYmUd9ZxkSVmLCSsuMrijlMiSsxISVlhlNxgVlSFiJCSsdYaQzKEPCSkxYaZkpc7JzSFiJCSstM6UgO4eEld7J0R0dybigJA6PmLAy7sPKkLASE1bGCStDwkpMWGmibqgMCSsxYZVlpiRXVRUSVmHCKhENKqqQsAoTVllmSkVdcxUSVmHCqiLqt6uQsAoTVqmoM6hCwipMWKWjS7IKCaswYZUjjAzhqpCwystPWGZK0pNURIoCE1bVUUiqkLAKE1ZZZko6NxISVmHCakcY6UnqkLAaE1ZbZkpyo6tDwmpMWG2ZqUhPUoeE1Ziw2jJTkRtdHRJWY8Jqy0xFepI6JKzGhNWWmYpcknVIWI0Jqy0zFRn/1SFhNSasdikwEs86JKz2smB11AHWRCIME1ZbZiqS7TokrMaEGctMReJpQsIMJsxYZioSTxMSZjBhxhFG4mlCwgwmzBRRN2RCwgwmzFhmajKIMyFhBhNm4j7MhIQZTJixzNTkwjAhYQYTZiwzNbkwTEiYwYQZl2glF4YJCTNertUyU5MLwxDpVj/faqGp6fxhTmVcvZRrLqKRb/eZ39/LuuYWnZpcH91nfn8v8ZoX0Si0+8zv7+VecxUlpvvM7++lX3MdjUW7z/z+XgY2L6MRZfeZ399LwuZVNKjsPvP7e3nYvI4e6LvP/P5eKjY3iftHJGNzjz8RPwgIKuMfpPxFNC4WZNLf488l8ms6i03l/f3Ev8vl01uxoFL/fu7fpfPp/UFQ2X8//e8y+nSkKqgCgF8BcEn92PwT/PlFAJfXr+lEPlUG8OsAIh6+CaoS4JcCXHa/pmsBVDHAqwYIl+A3dMGJqAcIryAgZPykIIiSgPBqAsKl+SPzT1QFhFcWEC7TH5k/ojAgvMqAcMl+Q9fMiNqA8IoDwuX7TaRsRvDn1QeES/kbunJGVAiEVyIQLusfu36CP69KIFzi39DFN6JOILxCgXC5f0Pvn0SpQHi1AuHS/4YuwRHVAuGVC4SrABjafxEFA+FVDIQrAhh6/RI1A+EVDYSrA9DBsSDKBsKrGwhXCqDPu4KoHAivdCBcNSBy/4nigfCqB8IVBOhspSDqB8IrIAhXEzC0/yFKCMKrIQhXFqCTBYKoIgivjCCKeJ5XEIUE4VUShCsO0LG6IGoJwismCFcfEDntQIl6gvAKCsLVCOjDvyBKCsKrKQhXJhA57cGIsoLw6grClQpETrsworQw/M19f+ZTc2qbzW/d92iWy+4HJd+yp/6bNVU+fOvnW1bL7PHb90VmQ4DHb9+/j1+pcX8e7LvPrODwjojRmhiNCZ6J/tG1o4kCDKjIuUbG37qPlqQZLUnDsxR5uACYL3CJNXOaqGcFAIsSWFS3Wuy+0j1a02D69M3jI58eAIZagKHqW42PDwMAFhWwWPIseg8eBuiAe1Mw+RufJgzsgDtSyNvsjI8GBvbAtBXMe3JpX4af946GwL1lroxL+xJcHRgMy8j1SaGjDQVum+Ixu+5fUDIaKUcbvDvfmSAmWIFrUryLijwfApCpAZkV02bkW/+jVQOsCqZTGp6HDqyMRkzXSXFn8PpNdjB7YEyq6nqW/b913W8JTG7Ro9SBBBix5q2oztL127UAG7A6y1sum/I/JSCn4q2p69s6wLYHFqa4yUqD9z6wrArusgofzg0Mgltb8Bw2erUPWA5gnnh2xp+GAitgzddmiDaYV+q95gZMPww7eH4/8uQSMFJwwYZ5S8NHkQB7NbDHGyN+0w64XAl9yM2mgsUpwBpgRn7+C3KAMYAw88ain0MCdgErRdn1rcTAjO7/I5lzCd6yAwYLvTFveVx/ugF8CLjkagihi5ppDjxFBtACPTzvFve/+gKbRAlvKw/h4P1AYK6gOZ7b9axRvhzcgOoWox4rJZivmkfE9d1z4MAAzgssG/iJ3WC7A3OleCDApzGDaB54Ns1bTcOvfMBogCtTvdOtioFTNfyHF4wML3YCYADzgrc3XF/eBKwA/yh4UwZezwTsABIE+5IinlGCfV3yVhB8uRIwBO4j02PhdycBU5BSHqbem5GALeD5Jc/zB289AtaAH5Q8WKnXGQGDwDtInnvGbysCpsCKlDxHAx4IBBYkmH097EE5744ODyMH1sD8a96outeTgF0SrL6Ct/pwYKLBXdN91F/1TsEMXkLx4Hen8mAV1XCXzXmWxtdtAj8G3BjLSP+UJTASuIflw1ad89zE8MxkMHXgwnR/UCp5vqt/MgDYrVFQx4OdeFAbuFbguwxvvsYnRYFrBFOmh4g95/kK1w+yCnx8McxX3iPXLyZzXVTDxiTy4T/lEPPx3F7/vDcwJcALG95yG17KCiYEzAfPROgpNVi05RDS5kxzJ//8XgN0DM8F+FlDA48ATP84PNMeXBa4vyXvHlExISCuqgYHxDQHn9IFBgaCgnLwaTnzMt1zKKiIuIaBD/Mghq0RV29gKoEZc2CjZ8oqPCEz92bw2CFwzTBMY0Z7wUungEcAN4YZgFJmSjBp5eA3cubo4MMrwIzBm8tMJltTxGo38EgsefvD8HtumGOC95CZ5aR+hQ1Nwk2HmcftnggBdmUw96p31br/txxOG0MWUQz/kcMqlMMKZ6anwqR4DXyXYc6u9yhwQBLMc/GA7F47BiYE3CfFA6d/NRa4JnCc7foo3vQkHssJrAMgDfMivYOpAuSoayDFm338lk8Qo4O5l7zFS7y/E9gDs8hcdtAe5Uah92NWhsBTzcAdgKdU5jH1U/d0QsAqAK0cwiZm/jO1A8GxMY8UnrnT9UEd0NnAnY25MMiznAJ3QQ/RU8Hbzcfn7oN5hKuNseO+W2TH7bHZbfdN9rh89/37/wEBMvxq";
1
+ window.searchData = "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";