@globus/sdk 6.0.0-rc.7 → 6.0.0-rc.8

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 (32) hide show
  1. package/dist/cjs/core/authorization/index.js +139 -15
  2. package/dist/cjs/core/authorization/index.js.map +3 -3
  3. package/dist/cjs/index.js +322 -142
  4. package/dist/cjs/index.js.map +4 -4
  5. package/dist/esm/core/authorization/AuthorizationManager.d.ts +14 -8
  6. package/dist/esm/core/authorization/AuthorizationManager.d.ts.map +1 -1
  7. package/dist/esm/core/authorization/AuthorizationManager.js +13 -5
  8. package/dist/esm/core/authorization/AuthorizationManager.js.map +1 -1
  9. package/dist/esm/core/authorization/PopupTransport.d.ts +25 -0
  10. package/dist/esm/core/authorization/PopupTransport.d.ts.map +1 -0
  11. package/dist/esm/core/authorization/PopupTransport.js +161 -0
  12. package/dist/esm/core/authorization/PopupTransport.js.map +1 -0
  13. package/dist/esm/core/authorization/RedirectTransport.d.ts +3 -9
  14. package/dist/esm/core/authorization/RedirectTransport.d.ts.map +1 -1
  15. package/dist/esm/core/authorization/RedirectTransport.js +6 -17
  16. package/dist/esm/core/authorization/RedirectTransport.js.map +1 -1
  17. package/dist/esm/core/authorization/pkce.d.ts +15 -0
  18. package/dist/esm/core/authorization/pkce.d.ts.map +1 -1
  19. package/dist/esm/core/authorization/pkce.js +18 -0
  20. package/dist/esm/core/authorization/pkce.js.map +1 -1
  21. package/dist/esm/package.json +1 -1
  22. package/dist/esm/services/transfer/index.d.ts +1 -0
  23. package/dist/esm/services/transfer/index.d.ts.map +1 -1
  24. package/dist/esm/services/transfer/index.js +1 -0
  25. package/dist/esm/services/transfer/index.js.map +1 -1
  26. package/dist/esm/services/transfer/service/roles.d.ts +75 -0
  27. package/dist/esm/services/transfer/service/roles.d.ts.map +1 -0
  28. package/dist/esm/services/transfer/service/roles.js +49 -0
  29. package/dist/esm/services/transfer/service/roles.js.map +1 -0
  30. package/dist/umd/globus.production.js +2 -2
  31. package/dist/umd/globus.production.js.map +4 -4
  32. package/package.json +1 -1
@@ -647,16 +647,23 @@ async function generateCodeChallenge(verifier) {
647
647
  function generateState() {
648
648
  return Array.from(getCrypto().getRandomValues(new Uint8Array(16))).map((v) => CHARSET[v % CHARSET.length]).join("");
649
649
  }
650
-
651
- // src/core/authorization/RedirectTransport.ts
652
650
  var KEYS = {
653
651
  PKCE_STATE: "pkce_state",
654
652
  PKCE_CODE_VERIFIER: "pkce_code_verifier"
655
653
  };
656
- function resetPKCE() {
657
- sessionStorage.removeItem(KEYS.PKCE_STATE);
658
- sessionStorage.removeItem(KEYS.PKCE_CODE_VERIFIER);
659
- }
654
+ var store = {
655
+ getKey(key) {
656
+ return key === "state" ? KEYS.PKCE_STATE : KEYS.PKCE_CODE_VERIFIER;
657
+ },
658
+ get: (entry) => sessionStorage.getItem(store.getKey(entry)),
659
+ set: (entry, value) => sessionStorage.setItem(store.getKey(entry), value),
660
+ reset: () => {
661
+ sessionStorage.removeItem(KEYS.PKCE_STATE);
662
+ sessionStorage.removeItem(KEYS.PKCE_CODE_VERIFIER);
663
+ }
664
+ };
665
+
666
+ // src/core/authorization/RedirectTransport.ts
660
667
  var RedirectTransport = class _RedirectTransport {
661
668
  #options;
662
669
  constructor(options) {
@@ -673,8 +680,8 @@ var RedirectTransport = class _RedirectTransport {
673
680
  const verifier = generateCodeVerifier();
674
681
  const challenge = await generateCodeChallenge(verifier);
675
682
  const state = this.#options.params?.["state"] ?? generateState();
676
- sessionStorage.setItem(KEYS.PKCE_CODE_VERIFIER, verifier);
677
- sessionStorage.setItem(KEYS.PKCE_STATE, state);
683
+ store.set("code_verifier", verifier);
684
+ store.set("state", state);
678
685
  const params = {
679
686
  response_type: "code",
680
687
  client_id: this.#options.client,
@@ -703,9 +710,9 @@ var RedirectTransport = class _RedirectTransport {
703
710
  }
704
711
  const code = params.get("code");
705
712
  if (!code) return void 0;
706
- const state = sessionStorage.getItem(KEYS.PKCE_STATE);
707
- const verifier = sessionStorage.getItem(KEYS.PKCE_CODE_VERIFIER);
708
- resetPKCE();
713
+ const state = store.get("state");
714
+ const verifier = store.get("code_verifier");
715
+ store.reset();
709
716
  if (params.get("state") !== state) {
710
717
  throw new Error(
711
718
  'Invalid State. The received "state" parameter does not match the expected state.'
@@ -870,10 +877,119 @@ var MemoryStorage = class {
870
877
  }
871
878
  };
872
879
 
880
+ // src/core/authorization/PopupTransport.ts
881
+ var MESSAGE_SOURCE = "globus-sdk";
882
+ var PopupTransport = class _PopupTransport {
883
+ #options;
884
+ #window = null;
885
+ constructor(options) {
886
+ this.#options = options;
887
+ if (_PopupTransport.supported === false) {
888
+ throw new Error("PopupTransport is not supported in this environment.");
889
+ }
890
+ }
891
+ /**
892
+ * The `PopupTransport` is supported in environments where the `window` object is available.
893
+ */
894
+ static supported = isSupported() && "window" in globalThis && typeof globalThis.window.open === "function";
895
+ /**
896
+ * For the redirect transport, sending the request will redirect the user to the authorization endpoint, initiating the OAuth flow.
897
+ */
898
+ async send() {
899
+ const verifier = generateCodeVerifier();
900
+ const challenge = await generateCodeChallenge(verifier);
901
+ const state = this.#options.params?.["state"] ?? generateState();
902
+ store.set("code_verifier", verifier);
903
+ store.set("state", state);
904
+ const params = {
905
+ response_type: "code",
906
+ client_id: this.#options.client,
907
+ scope: this.#options.scopes || "",
908
+ redirect_uri: this.#options.redirect,
909
+ state,
910
+ code_challenge: challenge,
911
+ code_challenge_method: "S256",
912
+ ...this.#options.params || {}
913
+ };
914
+ const url = new URL(getAuthorizationEndpoint());
915
+ url.search = new URLSearchParams(params).toString();
916
+ const promise = new Promise((resolve) => {
917
+ window.addEventListener(
918
+ "message",
919
+ async (e) => {
920
+ const { data } = e;
921
+ if (e.origin !== window.location.origin || data?.source !== MESSAGE_SOURCE) {
922
+ return;
923
+ }
924
+ this.#window?.close();
925
+ const response = await this.#getToken(data.url);
926
+ resolve(response);
927
+ },
928
+ false
929
+ );
930
+ });
931
+ this.#window = window.open(url.toString(), "_blank", "width=800,height=600");
932
+ if (!this.#window) {
933
+ throw new Error("Unable to open window for PopupTransport.");
934
+ }
935
+ this.#window.focus();
936
+ return promise;
937
+ }
938
+ async #getToken(href) {
939
+ const url = new URL(href);
940
+ const params = new URLSearchParams(url.search);
941
+ if (params.get("error")) {
942
+ throw new Error(
943
+ params.get("error_description") || "An error occurred during the authorization process."
944
+ );
945
+ }
946
+ const code = params.get("code");
947
+ if (!code) return void 0;
948
+ const state = store.get("state");
949
+ const verifier = store.get("code_verifier");
950
+ store.reset();
951
+ if (params.get("state") !== state) {
952
+ throw new Error(
953
+ 'Invalid State. The received "state" parameter does not match the expected state.'
954
+ );
955
+ }
956
+ if (!verifier) {
957
+ throw new Error("Invalid Code Verifier");
958
+ }
959
+ const payload = {
960
+ code,
961
+ client_id: this.#options.client,
962
+ /**
963
+ * Retrieve the code verifier from session storage.
964
+ */
965
+ code_verifier: verifier,
966
+ redirect_uri: this.#options.redirect,
967
+ grant_type: "authorization_code"
968
+ };
969
+ const response = await (await oauth2_exports.token.exchange({
970
+ payload
971
+ })).json();
972
+ return response;
973
+ }
974
+ // eslint-disable-next-line class-methods-use-this
975
+ getToken() {
976
+ if (!window.opener) {
977
+ return;
978
+ }
979
+ window.opener.postMessage(
980
+ {
981
+ source: MESSAGE_SOURCE,
982
+ url: window.location.href
983
+ },
984
+ window.location.origin
985
+ );
986
+ }
987
+ };
988
+
873
989
  // src/core/authorization/AuthorizationManager.ts
874
990
  var TRANSPORTS = {
875
- redirect: RedirectTransport
876
- // popup: PopupTransport,
991
+ redirect: RedirectTransport,
992
+ popup: PopupTransport
877
993
  };
878
994
  var DEFAULT_CONFIGURATION = {
879
995
  useRefreshTokens: false,
@@ -1085,7 +1201,11 @@ var AuthorizationManager = class {
1085
1201
  log("debug", "AuthorizationManager.login");
1086
1202
  this.reset();
1087
1203
  const transport = this.#buildTransport({ params: options?.additionalParams });
1088
- await transport.send();
1204
+ const result = await transport.send();
1205
+ if (isGlobusAuthTokenResponse(result)) {
1206
+ this.addTokenResponse(result);
1207
+ }
1208
+ return result;
1089
1209
  }
1090
1210
  /**
1091
1211
  * Prompt the user to authenticate with Globus Auth.
@@ -1093,7 +1213,11 @@ var AuthorizationManager = class {
1093
1213
  async prompt(options) {
1094
1214
  log("debug", "AuthorizationManager.prompt");
1095
1215
  const transport = this.#buildTransport(options);
1096
- await transport.send();
1216
+ const result = await transport.send();
1217
+ if (isGlobusAuthTokenResponse(result)) {
1218
+ this.addTokenResponse(result);
1219
+ }
1220
+ return result;
1097
1221
  }
1098
1222
  /**
1099
1223
  * This method will attempt to complete the PKCE protocol flow.