@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.
- package/lib/commonjs/ui/utils/crossOriginRestore.js +2 -2
- package/lib/commonjs/ui/utils/crossOriginRestore.js.map +1 -1
- package/lib/commonjs/ui/utils/oauthReturn.js +50 -8
- package/lib/commonjs/ui/utils/oauthReturn.js.map +1 -1
- package/lib/module/ui/utils/crossOriginRestore.js +3 -3
- package/lib/module/ui/utils/crossOriginRestore.js.map +1 -1
- package/lib/module/ui/utils/oauthReturn.js +49 -8
- package/lib/module/ui/utils/oauthReturn.js.map +1 -1
- package/lib/typescript/commonjs/ui/utils/crossOriginRestore.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/utils/oauthReturn.d.ts +19 -0
- package/lib/typescript/commonjs/ui/utils/oauthReturn.d.ts.map +1 -1
- package/lib/typescript/module/ui/utils/crossOriginRestore.d.ts.map +1 -1
- package/lib/typescript/module/ui/utils/oauthReturn.d.ts +19 -0
- package/lib/typescript/module/ui/utils/oauthReturn.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/ui/utils/crossOriginRestore.ts +2 -7
- package/src/ui/utils/oauthReturn.ts +50 -12
|
@@ -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
|
-
|
|
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","
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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","
|
|
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,
|
|
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
|
-
|
|
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","
|
|
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
|
-
|
|
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","
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
/**
|