@oxyhq/services 22.12.4 → 22.12.5

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.
@@ -11,6 +11,7 @@ exports.markCrossOriginRestoreAttempted = markCrossOriginRestoreAttempted;
11
11
  exports.maybeStartSilentOAuthRestore = maybeStartSilentOAuthRestore;
12
12
  var _core = require("@oxyhq/core");
13
13
  var _isWebBrowser = require("./isWebBrowser.js");
14
+ var _oauthReturn = require("./oauthReturn.js");
14
15
  var _oauthNavigation = require("../components/oauthNavigation.js");
15
16
  function sessionStore() {
16
17
  return globalThis.sessionStorage;
@@ -131,8 +132,7 @@ function consumeSilentOAuthError() {
131
132
  // Silent restore failed, but the visitor still asked for a specific page.
132
133
  // Put them back on it rather than leaving them on the bare origin the IdP
133
134
  // redirected to.
134
- const returnPath = (0, _core.consumeOAuthReturnPath)();
135
- history.replaceState(history.state, '', returnPath ?? `${url.pathname}${url.search}${url.hash}`);
135
+ (0, _oauthReturn.replaceUrlAfterOAuthReturn)(`${url.pathname}${url.search}${url.hash}`);
136
136
  }
137
137
  return error;
138
138
  }
@@ -1 +1 @@
1
- {"version":3,"names":["_core","require","_isWebBrowser","_oauthNavigation","sessionStore","globalThis","sessionStorage","isCrossOriginRestoreBlocked","store","Boolean","getItem","OXY_CROSS_ORIGIN_RESTORE_ATTEMPTED_KEY","OXY_SILENT_OAUTH_ATTEMPTED_KEY","markCrossOriginRestoreAttempted","setItem","clearCrossOriginRestoreGuards","key","removeItem","isSilentRestoreEligibleOrigin","origin","isLoopbackOrigin","isIdpHubOrigin","isOfficialWebOrigin","maybeStartSilentOAuthRestore","opts","isWebBrowser","location","params","URLSearchParams","search","has","codeVerifier","codeChallenge","generatePkcePair","state","generateOAuthState","persistOAuthHandshake","redirectUri","normalizeOAuthRedirectUri","authorizeUrl","buildOAuthAuthorizeUrl","authorizeBaseUrl","clientId","scope","prompt","redirectToAuthorize","error","logger","warn","component","consumeSilentOAuthError","history","get","replaceState","url","URL","href","searchParams","delete","returnPath","consumeOAuthReturnPath","pathname","hash"],"sourceRoot":"../../../../src","sources":["ui/utils/crossOriginRestore.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_core","require","_isWebBrowser","_oauthReturn","_oauthNavigation","sessionStore","globalThis","sessionStorage","isCrossOriginRestoreBlocked","store","Boolean","getItem","OXY_CROSS_ORIGIN_RESTORE_ATTEMPTED_KEY","OXY_SILENT_OAUTH_ATTEMPTED_KEY","markCrossOriginRestoreAttempted","setItem","clearCrossOriginRestoreGuards","key","removeItem","isSilentRestoreEligibleOrigin","origin","isLoopbackOrigin","isIdpHubOrigin","isOfficialWebOrigin","maybeStartSilentOAuthRestore","opts","isWebBrowser","location","params","URLSearchParams","search","has","codeVerifier","codeChallenge","generatePkcePair","state","generateOAuthState","persistOAuthHandshake","redirectUri","normalizeOAuthRedirectUri","authorizeUrl","buildOAuthAuthorizeUrl","authorizeBaseUrl","clientId","scope","prompt","redirectToAuthorize","error","logger","warn","component","consumeSilentOAuthError","history","get","replaceState","url","URL","href","searchParams","delete","replaceUrlAfterOAuthReturn","pathname","hash"],"sourceRoot":"../../../../src","sources":["ui/utils/crossOriginRestore.ts"],"mappings":"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","ignoreList":[]}
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.consumeHubSyncFailure = consumeHubSyncFailure;
7
+ exports.replaceUrlAfterOAuthReturn = replaceUrlAfterOAuthReturn;
7
8
  exports.tryCompleteOAuthReturn = tryCompleteOAuthReturn;
8
9
  var _core = require("@oxyhq/core");
9
10
  var _isWebBrowser = require("./isWebBrowser.js");
@@ -37,8 +38,10 @@ async function tryCompleteOAuthReturn(opts) {
37
38
  _core.logger.warn('OAuth return ignored: missing or mismatched handshake', {
38
39
  component: 'oauthReturn'
39
40
  });
40
- (0, _core.clearOAuthHandshake)();
41
+ // Consume the return path before clearing the handshake — clearOAuthHandshake
42
+ // drops the persisted path along with the PKCE keys.
41
43
  stripOAuthParamsFromUrl();
44
+ (0, _core.clearOAuthHandshake)();
42
45
  return false;
43
46
  }
44
47
  const redirectUri = (0, _core.normalizeOAuthRedirectUri)(opts.authRedirectUri ?? location.origin);
@@ -50,8 +53,9 @@ async function tryCompleteOAuthReturn(opts) {
50
53
  codeVerifier: handshake.codeVerifier
51
54
  });
52
55
  // Strip OAuth params before commit so a stale `?code=` cannot re-enter the exchange loop.
53
- (0, _core.clearOAuthHandshake)();
56
+ // Read the return path first — clearOAuthHandshake drops it with the PKCE keys.
54
57
  stripOAuthParamsFromUrl();
58
+ (0, _core.clearOAuthHandshake)();
55
59
  await opts.commitSession({
56
60
  sessionId: result.sessionId,
57
61
  accessToken: result.accessToken,
@@ -66,11 +70,53 @@ async function tryCompleteOAuthReturn(opts) {
66
70
  _core.logger.warn('OAuth return exchange failed', {
67
71
  component: 'oauthReturn'
68
72
  }, error);
69
- (0, _core.clearOAuthHandshake)();
70
73
  stripOAuthParamsFromUrl();
74
+ (0, _core.clearOAuthHandshake)();
71
75
  return false;
72
76
  }
73
77
  }
78
+
79
+ /**
80
+ * Rewrite the address bar after an authorize round trip, and tell the router.
81
+ *
82
+ * Prefers the page the visit started on (see `persistOAuthReturnPath`) over the
83
+ * bare origin the IdP redirected to, falling back to `fallbackUrl` when nothing
84
+ * was recorded.
85
+ *
86
+ * The `popstate` dispatch is the load-bearing part. `history.replaceState`
87
+ * fires no event, and cold boot runs *inside* the mounted app — by the time
88
+ * this executes, a history-based router (React Router, Vue Router, …) has
89
+ * already read `location` and rendered the route for `/`. Without a
90
+ * notification the address bar would show the restored deep link while the page
91
+ * still displayed the home page. `popstate` is the event the History API
92
+ * defines for exactly this, and it is what those routers subscribe to.
93
+ *
94
+ * Only dispatched when the URL actually changed, so the common no-op case does
95
+ * not push a spurious event at every listener on the page.
96
+ */
97
+ function replaceUrlAfterOAuthReturn(fallbackUrl) {
98
+ const location = globalThis.location;
99
+ const history = globalThis.history;
100
+ if (!location || !history?.replaceState) return;
101
+ const current = `${location.pathname}${location.search}${location.hash}`;
102
+ const target = (0, _core.consumeOAuthReturnPath)() ?? fallbackUrl;
103
+ history.replaceState(history.state, '', target);
104
+ if (target === current) return;
105
+ const dispatch = globalThis.dispatchEvent;
106
+ if (typeof dispatch !== 'function') return;
107
+ try {
108
+ // `PopStateEvent` is web-only; plain `Event` is a good enough carrier for
109
+ // any host that lacks it (routers read `location`, not `event.state`).
110
+ const event = typeof PopStateEvent === 'function' ? new PopStateEvent('popstate', {
111
+ state: history.state
112
+ }) : new Event('popstate');
113
+ dispatch.call(globalThis, event);
114
+ } catch (error) {
115
+ _core.logger.warn('Could not notify router of restored URL', {
116
+ component: 'oauthReturn'
117
+ }, error);
118
+ }
119
+ }
74
120
  function stripOAuthParamsFromUrl() {
75
121
  const location = globalThis.location;
76
122
  const history = globalThis.history;
@@ -81,11 +127,7 @@ function stripOAuthParamsFromUrl() {
81
127
  url.searchParams.delete('error');
82
128
  url.searchParams.delete('error_description');
83
129
  url.searchParams.delete('hub_sync');
84
- // The authorize round trip lands on the registered apex origin, so restore
85
- // the page the visit started on. Applies to the success path too: signing in
86
- // from a deep link should return you to that link, not to the home page.
87
- const returnPath = (0, _core.consumeOAuthReturnPath)();
88
- history.replaceState(history.state, '', returnPath ?? `${url.pathname}${url.search}${url.hash}`);
130
+ replaceUrlAfterOAuthReturn(`${url.pathname}${url.search}${url.hash}`);
89
131
  }
90
132
 
91
133
  /**
@@ -1 +1 @@
1
- {"version":3,"names":["_core","require","_isWebBrowser","tryCompleteOAuthReturn","opts","isWebBrowser","location","globalThis","params","URLSearchParams","search","code","get","oauthError","stripOAuthParamsFromUrl","clientId","logger","warn","component","returnedState","handshake","readOAuthHandshake","state","clearOAuthHandshake","redirectUri","normalizeOAuthRedirectUri","authRedirectUri","origin","result","oxyServices","exchangeOAuthCode","codeVerifier","commitSession","sessionId","accessToken","deviceId","deviceSecret","userId","user","id","expiresAt","error","history","replaceState","url","URL","href","searchParams","delete","returnPath","consumeOAuthReturnPath","pathname","hash","consumeHubSyncFailure"],"sourceRoot":"../../../../src","sources":["ui/utils/oauthReturn.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_core","require","_isWebBrowser","tryCompleteOAuthReturn","opts","isWebBrowser","location","globalThis","params","URLSearchParams","search","code","get","oauthError","stripOAuthParamsFromUrl","clientId","logger","warn","component","returnedState","handshake","readOAuthHandshake","state","clearOAuthHandshake","redirectUri","normalizeOAuthRedirectUri","authRedirectUri","origin","result","oxyServices","exchangeOAuthCode","codeVerifier","commitSession","sessionId","accessToken","deviceId","deviceSecret","userId","user","id","expiresAt","error","replaceUrlAfterOAuthReturn","fallbackUrl","history","replaceState","current","pathname","hash","target","consumeOAuthReturnPath","dispatch","dispatchEvent","event","PopStateEvent","Event","call","url","URL","href","searchParams","delete","consumeHubSyncFailure"],"sourceRoot":"../../../../src","sources":["ui/utils/oauthReturn.ts"],"mappings":"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","ignoreList":[]}
@@ -1,7 +1,8 @@
1
1
  "use strict";
2
2
 
3
- import { buildOAuthAuthorizeUrl, generateOAuthState, generatePkcePair, isIdpHubOrigin, isLoopbackOrigin, isOfficialWebOrigin, OXY_CROSS_ORIGIN_RESTORE_ATTEMPTED_KEY, OXY_SILENT_OAUTH_ATTEMPTED_KEY, persistOAuthHandshake, consumeOAuthReturnPath, normalizeOAuthRedirectUri, logger } from '@oxyhq/core';
3
+ import { buildOAuthAuthorizeUrl, generateOAuthState, generatePkcePair, isIdpHubOrigin, isLoopbackOrigin, isOfficialWebOrigin, OXY_CROSS_ORIGIN_RESTORE_ATTEMPTED_KEY, OXY_SILENT_OAUTH_ATTEMPTED_KEY, persistOAuthHandshake, normalizeOAuthRedirectUri, logger } from '@oxyhq/core';
4
4
  import { isWebBrowser } from "./isWebBrowser.js";
5
+ import { replaceUrlAfterOAuthReturn } from "./oauthReturn.js";
5
6
  import { redirectToAuthorize } from "../components/oauthNavigation.js";
6
7
  function sessionStore() {
7
8
  return globalThis.sessionStorage;
@@ -122,8 +123,7 @@ export function consumeSilentOAuthError() {
122
123
  // Silent restore failed, but the visitor still asked for a specific page.
123
124
  // Put them back on it rather than leaving them on the bare origin the IdP
124
125
  // redirected to.
125
- const returnPath = consumeOAuthReturnPath();
126
- history.replaceState(history.state, '', returnPath ?? `${url.pathname}${url.search}${url.hash}`);
126
+ replaceUrlAfterOAuthReturn(`${url.pathname}${url.search}${url.hash}`);
127
127
  }
128
128
  return error;
129
129
  }
@@ -1 +1 @@
1
- {"version":3,"names":["buildOAuthAuthorizeUrl","generateOAuthState","generatePkcePair","isIdpHubOrigin","isLoopbackOrigin","isOfficialWebOrigin","OXY_CROSS_ORIGIN_RESTORE_ATTEMPTED_KEY","OXY_SILENT_OAUTH_ATTEMPTED_KEY","persistOAuthHandshake","consumeOAuthReturnPath","normalizeOAuthRedirectUri","logger","isWebBrowser","redirectToAuthorize","sessionStore","globalThis","sessionStorage","isCrossOriginRestoreBlocked","store","Boolean","getItem","markCrossOriginRestoreAttempted","setItem","clearCrossOriginRestoreGuards","key","removeItem","isSilentRestoreEligibleOrigin","origin","maybeStartSilentOAuthRestore","opts","location","params","URLSearchParams","search","has","codeVerifier","codeChallenge","state","redirectUri","authorizeUrl","authorizeBaseUrl","clientId","scope","prompt","error","warn","component","consumeSilentOAuthError","history","get","replaceState","url","URL","href","searchParams","delete","returnPath","pathname","hash"],"sourceRoot":"../../../../src","sources":["ui/utils/crossOriginRestore.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["buildOAuthAuthorizeUrl","generateOAuthState","generatePkcePair","isIdpHubOrigin","isLoopbackOrigin","isOfficialWebOrigin","OXY_CROSS_ORIGIN_RESTORE_ATTEMPTED_KEY","OXY_SILENT_OAUTH_ATTEMPTED_KEY","persistOAuthHandshake","normalizeOAuthRedirectUri","logger","isWebBrowser","replaceUrlAfterOAuthReturn","redirectToAuthorize","sessionStore","globalThis","sessionStorage","isCrossOriginRestoreBlocked","store","Boolean","getItem","markCrossOriginRestoreAttempted","setItem","clearCrossOriginRestoreGuards","key","removeItem","isSilentRestoreEligibleOrigin","origin","maybeStartSilentOAuthRestore","opts","location","params","URLSearchParams","search","has","codeVerifier","codeChallenge","state","redirectUri","authorizeUrl","authorizeBaseUrl","clientId","scope","prompt","error","warn","component","consumeSilentOAuthError","history","get","replaceState","url","URL","href","searchParams","delete","pathname","hash"],"sourceRoot":"../../../../src","sources":["ui/utils/crossOriginRestore.ts"],"mappings":"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","ignoreList":[]}
@@ -32,8 +32,10 @@ export async function tryCompleteOAuthReturn(opts) {
32
32
  logger.warn('OAuth return ignored: missing or mismatched handshake', {
33
33
  component: 'oauthReturn'
34
34
  });
35
- clearOAuthHandshake();
35
+ // Consume the return path before clearing the handshake — clearOAuthHandshake
36
+ // drops the persisted path along with the PKCE keys.
36
37
  stripOAuthParamsFromUrl();
38
+ clearOAuthHandshake();
37
39
  return false;
38
40
  }
39
41
  const redirectUri = normalizeOAuthRedirectUri(opts.authRedirectUri ?? location.origin);
@@ -45,8 +47,9 @@ export async function tryCompleteOAuthReturn(opts) {
45
47
  codeVerifier: handshake.codeVerifier
46
48
  });
47
49
  // Strip OAuth params before commit so a stale `?code=` cannot re-enter the exchange loop.
48
- clearOAuthHandshake();
50
+ // Read the return path first — clearOAuthHandshake drops it with the PKCE keys.
49
51
  stripOAuthParamsFromUrl();
52
+ clearOAuthHandshake();
50
53
  await opts.commitSession({
51
54
  sessionId: result.sessionId,
52
55
  accessToken: result.accessToken,
@@ -61,11 +64,53 @@ export async function tryCompleteOAuthReturn(opts) {
61
64
  logger.warn('OAuth return exchange failed', {
62
65
  component: 'oauthReturn'
63
66
  }, error);
64
- clearOAuthHandshake();
65
67
  stripOAuthParamsFromUrl();
68
+ clearOAuthHandshake();
66
69
  return false;
67
70
  }
68
71
  }
72
+
73
+ /**
74
+ * Rewrite the address bar after an authorize round trip, and tell the router.
75
+ *
76
+ * Prefers the page the visit started on (see `persistOAuthReturnPath`) over the
77
+ * bare origin the IdP redirected to, falling back to `fallbackUrl` when nothing
78
+ * was recorded.
79
+ *
80
+ * The `popstate` dispatch is the load-bearing part. `history.replaceState`
81
+ * fires no event, and cold boot runs *inside* the mounted app — by the time
82
+ * this executes, a history-based router (React Router, Vue Router, …) has
83
+ * already read `location` and rendered the route for `/`. Without a
84
+ * notification the address bar would show the restored deep link while the page
85
+ * still displayed the home page. `popstate` is the event the History API
86
+ * defines for exactly this, and it is what those routers subscribe to.
87
+ *
88
+ * Only dispatched when the URL actually changed, so the common no-op case does
89
+ * not push a spurious event at every listener on the page.
90
+ */
91
+ export function replaceUrlAfterOAuthReturn(fallbackUrl) {
92
+ const location = globalThis.location;
93
+ const history = globalThis.history;
94
+ if (!location || !history?.replaceState) return;
95
+ const current = `${location.pathname}${location.search}${location.hash}`;
96
+ const target = consumeOAuthReturnPath() ?? fallbackUrl;
97
+ history.replaceState(history.state, '', target);
98
+ if (target === current) return;
99
+ const dispatch = globalThis.dispatchEvent;
100
+ if (typeof dispatch !== 'function') return;
101
+ try {
102
+ // `PopStateEvent` is web-only; plain `Event` is a good enough carrier for
103
+ // any host that lacks it (routers read `location`, not `event.state`).
104
+ const event = typeof PopStateEvent === 'function' ? new PopStateEvent('popstate', {
105
+ state: history.state
106
+ }) : new Event('popstate');
107
+ dispatch.call(globalThis, event);
108
+ } catch (error) {
109
+ logger.warn('Could not notify router of restored URL', {
110
+ component: 'oauthReturn'
111
+ }, error);
112
+ }
113
+ }
69
114
  function stripOAuthParamsFromUrl() {
70
115
  const location = globalThis.location;
71
116
  const history = globalThis.history;
@@ -76,11 +121,7 @@ function stripOAuthParamsFromUrl() {
76
121
  url.searchParams.delete('error');
77
122
  url.searchParams.delete('error_description');
78
123
  url.searchParams.delete('hub_sync');
79
- // The authorize round trip lands on the registered apex origin, so restore
80
- // the page the visit started on. Applies to the success path too: signing in
81
- // from a deep link should return you to that link, not to the home page.
82
- const returnPath = consumeOAuthReturnPath();
83
- history.replaceState(history.state, '', returnPath ?? `${url.pathname}${url.search}${url.hash}`);
124
+ replaceUrlAfterOAuthReturn(`${url.pathname}${url.search}${url.hash}`);
84
125
  }
85
126
 
86
127
  /**
@@ -1 +1 @@
1
- {"version":3,"names":["clearOAuthHandshake","consumeOAuthReturnPath","logger","normalizeOAuthRedirectUri","readOAuthHandshake","isWebBrowser","tryCompleteOAuthReturn","opts","location","globalThis","params","URLSearchParams","search","code","get","oauthError","stripOAuthParamsFromUrl","clientId","warn","component","returnedState","handshake","state","redirectUri","authRedirectUri","origin","result","oxyServices","exchangeOAuthCode","codeVerifier","commitSession","sessionId","accessToken","deviceId","deviceSecret","userId","user","id","expiresAt","error","history","replaceState","url","URL","href","searchParams","delete","returnPath","pathname","hash","consumeHubSyncFailure"],"sourceRoot":"../../../../src","sources":["ui/utils/oauthReturn.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["clearOAuthHandshake","consumeOAuthReturnPath","logger","normalizeOAuthRedirectUri","readOAuthHandshake","isWebBrowser","tryCompleteOAuthReturn","opts","location","globalThis","params","URLSearchParams","search","code","get","oauthError","stripOAuthParamsFromUrl","clientId","warn","component","returnedState","handshake","state","redirectUri","authRedirectUri","origin","result","oxyServices","exchangeOAuthCode","codeVerifier","commitSession","sessionId","accessToken","deviceId","deviceSecret","userId","user","id","expiresAt","error","replaceUrlAfterOAuthReturn","fallbackUrl","history","replaceState","current","pathname","hash","target","dispatch","dispatchEvent","event","PopStateEvent","Event","call","url","URL","href","searchParams","delete","consumeHubSyncFailure"],"sourceRoot":"../../../../src","sources":["ui/utils/oauthReturn.ts"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"crossOriginRestore.d.ts","sourceRoot":"","sources":["../../../../../src/ui/utils/crossOriginRestore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAsB/C,8EAA8E;AAC9E,wBAAgB,2BAA2B,IAAI,OAAO,CAOrD;AAED,iFAAiF;AACjF,wBAAgB,+BAA+B,IAAI,IAAI,CAKtD;AAED,qEAAqE;AACrE,wBAAgB,6BAA6B,IAAI,IAAI,CAMpD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAIrE;AAED,MAAM,WAAW,yBAAyB;IACxC,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,yBAAyB,GAC9B,OAAO,CAAC,OAAO,CAAC,CAiDlB;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,gBAAgB,GAAG,kBAAkB,GAAG,IAAI,CA8BtF"}
1
+ {"version":3,"file":"crossOriginRestore.d.ts","sourceRoot":"","sources":["../../../../../src/ui/utils/crossOriginRestore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAsB/C,8EAA8E;AAC9E,wBAAgB,2BAA2B,IAAI,OAAO,CAOrD;AAED,iFAAiF;AACjF,wBAAgB,+BAA+B,IAAI,IAAI,CAKtD;AAED,qEAAqE;AACrE,wBAAgB,6BAA6B,IAAI,IAAI,CAMpD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAIrE;AAED,MAAM,WAAW,yBAAyB;IACxC,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,yBAAyB,GAC9B,OAAO,CAAC,OAAO,CAAC,CAiDlB;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,gBAAgB,GAAG,kBAAkB,GAAG,IAAI,CAyBtF"}
@@ -22,6 +22,25 @@ export declare function tryCompleteOAuthReturn(opts: {
22
22
  authRedirectUri?: string;
23
23
  commitSession: (input: OAuthReturnCommitInput) => Promise<void>;
24
24
  }): Promise<boolean>;
25
+ /**
26
+ * Rewrite the address bar after an authorize round trip, and tell the router.
27
+ *
28
+ * Prefers the page the visit started on (see `persistOAuthReturnPath`) over the
29
+ * bare origin the IdP redirected to, falling back to `fallbackUrl` when nothing
30
+ * was recorded.
31
+ *
32
+ * The `popstate` dispatch is the load-bearing part. `history.replaceState`
33
+ * fires no event, and cold boot runs *inside* the mounted app — by the time
34
+ * this executes, a history-based router (React Router, Vue Router, …) has
35
+ * already read `location` and rendered the route for `/`. Without a
36
+ * notification the address bar would show the restored deep link while the page
37
+ * still displayed the home page. `popstate` is the event the History API
38
+ * defines for exactly this, and it is what those routers subscribe to.
39
+ *
40
+ * Only dispatched when the URL actually changed, so the common no-op case does
41
+ * not push a spurious event at every listener on the page.
42
+ */
43
+ export declare function replaceUrlAfterOAuthReturn(fallbackUrl: string): void;
25
44
  /**
26
45
  * When auth.oxy.so hub-sync redeem fails, the IdP redirects back with
27
46
  * `?hub_sync=failed`. Strip the param and log so cold boot can continue
@@ -1 +1 @@
1
- {"version":3,"file":"oauthReturn.d.ts","sourceRoot":"","sources":["../../../../../src/ui/utils/oauthReturn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAU/C,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3D;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,EAAE;IACjD,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjE,GAAG,OAAO,CAAC,OAAO,CAAC,CA8DnB;AAuBD;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAmB/C"}
1
+ {"version":3,"file":"oauthReturn.d.ts","sourceRoot":"","sources":["../../../../../src/ui/utils/oauthReturn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAU/C,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3D;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,EAAE;IACjD,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjE,GAAG,OAAO,CAAC,OAAO,CAAC,CAiEnB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAuBpE;AAeD;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAmB/C"}
@@ -1 +1 @@
1
- {"version":3,"file":"crossOriginRestore.d.ts","sourceRoot":"","sources":["../../../../../src/ui/utils/crossOriginRestore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAsB/C,8EAA8E;AAC9E,wBAAgB,2BAA2B,IAAI,OAAO,CAOrD;AAED,iFAAiF;AACjF,wBAAgB,+BAA+B,IAAI,IAAI,CAKtD;AAED,qEAAqE;AACrE,wBAAgB,6BAA6B,IAAI,IAAI,CAMpD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAIrE;AAED,MAAM,WAAW,yBAAyB;IACxC,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,yBAAyB,GAC9B,OAAO,CAAC,OAAO,CAAC,CAiDlB;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,gBAAgB,GAAG,kBAAkB,GAAG,IAAI,CA8BtF"}
1
+ {"version":3,"file":"crossOriginRestore.d.ts","sourceRoot":"","sources":["../../../../../src/ui/utils/crossOriginRestore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAsB/C,8EAA8E;AAC9E,wBAAgB,2BAA2B,IAAI,OAAO,CAOrD;AAED,iFAAiF;AACjF,wBAAgB,+BAA+B,IAAI,IAAI,CAKtD;AAED,qEAAqE;AACrE,wBAAgB,6BAA6B,IAAI,IAAI,CAMpD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAIrE;AAED,MAAM,WAAW,yBAAyB;IACxC,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,yBAAyB,GAC9B,OAAO,CAAC,OAAO,CAAC,CAiDlB;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,gBAAgB,GAAG,kBAAkB,GAAG,IAAI,CAyBtF"}
@@ -22,6 +22,25 @@ export declare function tryCompleteOAuthReturn(opts: {
22
22
  authRedirectUri?: string;
23
23
  commitSession: (input: OAuthReturnCommitInput) => Promise<void>;
24
24
  }): Promise<boolean>;
25
+ /**
26
+ * Rewrite the address bar after an authorize round trip, and tell the router.
27
+ *
28
+ * Prefers the page the visit started on (see `persistOAuthReturnPath`) over the
29
+ * bare origin the IdP redirected to, falling back to `fallbackUrl` when nothing
30
+ * was recorded.
31
+ *
32
+ * The `popstate` dispatch is the load-bearing part. `history.replaceState`
33
+ * fires no event, and cold boot runs *inside* the mounted app — by the time
34
+ * this executes, a history-based router (React Router, Vue Router, …) has
35
+ * already read `location` and rendered the route for `/`. Without a
36
+ * notification the address bar would show the restored deep link while the page
37
+ * still displayed the home page. `popstate` is the event the History API
38
+ * defines for exactly this, and it is what those routers subscribe to.
39
+ *
40
+ * Only dispatched when the URL actually changed, so the common no-op case does
41
+ * not push a spurious event at every listener on the page.
42
+ */
43
+ export declare function replaceUrlAfterOAuthReturn(fallbackUrl: string): void;
25
44
  /**
26
45
  * When auth.oxy.so hub-sync redeem fails, the IdP redirects back with
27
46
  * `?hub_sync=failed`. Strip the param and log so cold boot can continue
@@ -1 +1 @@
1
- {"version":3,"file":"oauthReturn.d.ts","sourceRoot":"","sources":["../../../../../src/ui/utils/oauthReturn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAU/C,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3D;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,EAAE;IACjD,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjE,GAAG,OAAO,CAAC,OAAO,CAAC,CA8DnB;AAuBD;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAmB/C"}
1
+ {"version":3,"file":"oauthReturn.d.ts","sourceRoot":"","sources":["../../../../../src/ui/utils/oauthReturn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAU/C,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3D;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,EAAE;IACjD,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjE,GAAG,OAAO,CAAC,OAAO,CAAC,CAiEnB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAuBpE;AAeD;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAmB/C"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oxyhq/services",
3
- "version": "22.12.4",
3
+ "version": "22.12.5",
4
4
  "description": "OxyHQ Expo/React Native SDK — UI components, screens, and native features",
5
5
  "main": "lib/commonjs/index.js",
6
6
  "module": "lib/module/index.js",
@@ -127,7 +127,7 @@
127
127
  },
128
128
  "dependencies": {
129
129
  "@oxyhq/contracts": "0.17.0",
130
- "@oxyhq/core": "^12.10.5",
130
+ "@oxyhq/core": "^12.10.6",
131
131
  "@simplewebauthn/browser": "^13.3.0",
132
132
  "color": "^4.2.3"
133
133
  },
@@ -136,7 +136,7 @@
136
136
  "@commitlint/cli": "^17.6.5",
137
137
  "@commitlint/config-conventional": "^17.6.5",
138
138
  "@expo/vector-icons": "^15.0.3",
139
- "@oxyhq/core": "12.10.4",
139
+ "@oxyhq/core": "12.10.6",
140
140
  "@react-native-async-storage/async-storage": "^2.0.0",
141
141
  "@react-native-community/netinfo": "^11.4.1",
142
142
  "@react-native/babel-preset": "^0.86.0",
@@ -177,7 +177,7 @@
177
177
  "peerDependencies": {
178
178
  "@expo/vector-icons": "^15.0.3",
179
179
  "@oxyhq/bloom": "^0.50.2",
180
- "@oxyhq/core": "^12.10.0",
180
+ "@oxyhq/core": "^12.10.6",
181
181
  "@react-native-async-storage/async-storage": "^2.0.0",
182
182
  "@react-native-community/netinfo": "^11.4.1",
183
183
  "@tanstack/query-async-storage-persister": "^5.101",
@@ -9,11 +9,11 @@ import {
9
9
  OXY_CROSS_ORIGIN_RESTORE_ATTEMPTED_KEY,
10
10
  OXY_SILENT_OAUTH_ATTEMPTED_KEY,
11
11
  persistOAuthHandshake,
12
- consumeOAuthReturnPath,
13
12
  normalizeOAuthRedirectUri,
14
13
  logger,
15
14
  } from '@oxyhq/core';
16
15
  import { isWebBrowser } from './isWebBrowser';
16
+ import { replaceUrlAfterOAuthReturn } from './oauthReturn';
17
17
  import { redirectToAuthorize } from '../components/oauthNavigation';
18
18
 
19
19
  function sessionStore(): Storage | undefined {
@@ -161,12 +161,7 @@ export function consumeSilentOAuthError(): 'login_required' | 'consent_required'
161
161
  // Silent restore failed, but the visitor still asked for a specific page.
162
162
  // Put them back on it rather than leaving them on the bare origin the IdP
163
163
  // redirected to.
164
- const returnPath = consumeOAuthReturnPath();
165
- history.replaceState(
166
- history.state,
167
- '',
168
- returnPath ?? `${url.pathname}${url.search}${url.hash}`,
169
- );
164
+ replaceUrlAfterOAuthReturn(`${url.pathname}${url.search}${url.hash}`);
170
165
  }
171
166
  return error;
172
167
  }
@@ -54,8 +54,10 @@ export async function tryCompleteOAuthReturn(opts: {
54
54
  logger.warn('OAuth return ignored: missing or mismatched handshake', {
55
55
  component: 'oauthReturn',
56
56
  });
57
- clearOAuthHandshake();
57
+ // Consume the return path before clearing the handshake — clearOAuthHandshake
58
+ // drops the persisted path along with the PKCE keys.
58
59
  stripOAuthParamsFromUrl();
60
+ clearOAuthHandshake();
59
61
  return false;
60
62
  }
61
63
 
@@ -71,8 +73,9 @@ export async function tryCompleteOAuthReturn(opts: {
71
73
  codeVerifier: handshake.codeVerifier,
72
74
  });
73
75
  // Strip OAuth params before commit so a stale `?code=` cannot re-enter the exchange loop.
74
- clearOAuthHandshake();
76
+ // Read the return path first — clearOAuthHandshake drops it with the PKCE keys.
75
77
  stripOAuthParamsFromUrl();
78
+ clearOAuthHandshake();
76
79
  await opts.commitSession({
77
80
  sessionId: result.sessionId,
78
81
  accessToken: result.accessToken,
@@ -85,12 +88,55 @@ export async function tryCompleteOAuthReturn(opts: {
85
88
  return true;
86
89
  } catch (error) {
87
90
  logger.warn('OAuth return exchange failed', { component: 'oauthReturn' }, error);
88
- clearOAuthHandshake();
89
91
  stripOAuthParamsFromUrl();
92
+ clearOAuthHandshake();
90
93
  return false;
91
94
  }
92
95
  }
93
96
 
97
+ /**
98
+ * Rewrite the address bar after an authorize round trip, and tell the router.
99
+ *
100
+ * Prefers the page the visit started on (see `persistOAuthReturnPath`) over the
101
+ * bare origin the IdP redirected to, falling back to `fallbackUrl` when nothing
102
+ * was recorded.
103
+ *
104
+ * The `popstate` dispatch is the load-bearing part. `history.replaceState`
105
+ * fires no event, and cold boot runs *inside* the mounted app — by the time
106
+ * this executes, a history-based router (React Router, Vue Router, …) has
107
+ * already read `location` and rendered the route for `/`. Without a
108
+ * notification the address bar would show the restored deep link while the page
109
+ * still displayed the home page. `popstate` is the event the History API
110
+ * defines for exactly this, and it is what those routers subscribe to.
111
+ *
112
+ * Only dispatched when the URL actually changed, so the common no-op case does
113
+ * not push a spurious event at every listener on the page.
114
+ */
115
+ export function replaceUrlAfterOAuthReturn(fallbackUrl: string): void {
116
+ const location = (globalThis as { location?: Location }).location;
117
+ const history = (globalThis as { history?: History }).history;
118
+ if (!location || !history?.replaceState) return;
119
+
120
+ const current = `${location.pathname}${location.search}${location.hash}`;
121
+ const target = consumeOAuthReturnPath() ?? fallbackUrl;
122
+ history.replaceState(history.state, '', target);
123
+ if (target === current) return;
124
+
125
+ const dispatch = (globalThis as { dispatchEvent?: (event: Event) => boolean }).dispatchEvent;
126
+ if (typeof dispatch !== 'function') return;
127
+ try {
128
+ // `PopStateEvent` is web-only; plain `Event` is a good enough carrier for
129
+ // any host that lacks it (routers read `location`, not `event.state`).
130
+ const event =
131
+ typeof PopStateEvent === 'function'
132
+ ? new PopStateEvent('popstate', { state: history.state })
133
+ : new Event('popstate');
134
+ dispatch.call(globalThis, event);
135
+ } catch (error) {
136
+ logger.warn('Could not notify router of restored URL', { component: 'oauthReturn' }, error);
137
+ }
138
+ }
139
+
94
140
  function stripOAuthParamsFromUrl(): void {
95
141
  const location = (globalThis as { location?: Location; history?: History }).location;
96
142
  const history = (globalThis as { history?: History }).history;
@@ -101,15 +147,7 @@ function stripOAuthParamsFromUrl(): void {
101
147
  url.searchParams.delete('error');
102
148
  url.searchParams.delete('error_description');
103
149
  url.searchParams.delete('hub_sync');
104
- // The authorize round trip lands on the registered apex origin, so restore
105
- // the page the visit started on. Applies to the success path too: signing in
106
- // from a deep link should return you to that link, not to the home page.
107
- const returnPath = consumeOAuthReturnPath();
108
- history.replaceState(
109
- history.state,
110
- '',
111
- returnPath ?? `${url.pathname}${url.search}${url.hash}`,
112
- );
150
+ replaceUrlAfterOAuthReturn(`${url.pathname}${url.search}${url.hash}`);
113
151
  }
114
152
 
115
153
  /**