@owlmeans/web-client 0.1.18-rc.13 → 0.1.18-rc.15

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 (58) hide show
  1. package/agent-meta/manifest.json +2 -2
  2. package/agent-meta/skills/web-client/SKILL.md +1 -1
  3. package/build/components/dispatcher/component.d.ts.map +1 -1
  4. package/build/components/dispatcher/component.js +46 -9
  5. package/build/components/dispatcher/component.js.map +1 -1
  6. package/build/i18n/auth-be.json +32 -0
  7. package/build/i18n/auth-de.json +32 -0
  8. package/build/i18n/auth-en.json +32 -0
  9. package/build/i18n/auth-es.json +32 -0
  10. package/build/i18n/auth-pl.json +32 -0
  11. package/build/i18n/auth-ru.json +32 -0
  12. package/build/i18n/auth-uk.json +32 -0
  13. package/build/login/index.d.ts +3 -0
  14. package/build/login/index.d.ts.map +1 -1
  15. package/build/login/index.js +3 -0
  16. package/build/login/index.js.map +1 -1
  17. package/build/login/pump.d.ts +20 -0
  18. package/build/login/pump.d.ts.map +1 -0
  19. package/build/login/pump.js +46 -0
  20. package/build/login/pump.js.map +1 -0
  21. package/build/login/redirect.d.ts.map +1 -1
  22. package/build/login/redirect.js +17 -1
  23. package/build/login/redirect.js.map +1 -1
  24. package/build/login/screen.d.ts +15 -0
  25. package/build/login/screen.d.ts.map +1 -0
  26. package/build/login/screen.js +97 -0
  27. package/build/login/screen.js.map +1 -0
  28. package/build/login/surrogate.d.ts.map +1 -1
  29. package/build/login/surrogate.js +109 -79
  30. package/build/login/surrogate.js.map +1 -1
  31. package/build/login/view.d.ts +26 -0
  32. package/build/login/view.d.ts.map +1 -0
  33. package/build/login/view.js +73 -0
  34. package/build/login/view.js.map +1 -0
  35. package/build/main.d.ts +9 -1
  36. package/build/main.d.ts.map +1 -1
  37. package/build/main.js +9 -1
  38. package/build/main.js.map +1 -1
  39. package/build/modules.d.ts.map +1 -1
  40. package/build/modules.js +11 -1
  41. package/build/modules.js.map +1 -1
  42. package/package.json +13 -13
  43. package/src/components/dispatcher/component.tsx +64 -8
  44. package/src/i18n/auth-be.json +32 -0
  45. package/src/i18n/auth-de.json +32 -0
  46. package/src/i18n/auth-en.json +32 -0
  47. package/src/i18n/auth-es.json +32 -0
  48. package/src/i18n/auth-pl.json +32 -0
  49. package/src/i18n/auth-ru.json +32 -0
  50. package/src/i18n/auth-uk.json +32 -0
  51. package/src/login/index.ts +3 -0
  52. package/src/login/pump.ts +53 -0
  53. package/src/login/redirect.ts +23 -2
  54. package/src/login/screen.tsx +119 -0
  55. package/src/login/surrogate.ts +136 -93
  56. package/src/login/view.tsx +94 -0
  57. package/src/main.tsx +11 -2
  58. package/src/modules.ts +12 -1
@@ -0,0 +1,97 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useState } from 'react';
3
+ import { useContext } from '@owlmeans/client';
4
+ import { useI18nLib } from '@owlmeans/client-i18n';
5
+ import { LoginIntent, LoginOutcome, LOGIN_INTENT_QUERY, LOGIN_METHOD_QUERY, LOGIN_NEXT_QUERY, } from '@owlmeans/client-auth/login';
6
+ import { LoginSurrogateView, SurrogateStage } from './view.js';
7
+ /**
8
+ * The login window an embedded application opens one level up.
9
+ *
10
+ * It is NOT wrapped in `DispatcherHOC`, and that is the point: the HOC's continuation navigates to
11
+ * `HOME` when it has nothing else to do, which is how a popup ended up rendering the whole
12
+ * application, with its navigation, inside itself. This screen has no continuation at all — it
13
+ * either hands something back and closes, or it says what it is waiting for.
14
+ *
15
+ * It also never runs the authorization machine. When there is already a session here, that is the
16
+ * answer, and it goes back to the opener immediately — no provider round trip, no PKCE exchange.
17
+ * When there is not, it forwards to the dispatcher (`next`), which owns that flow.
18
+ */
19
+ export const SurrogateScreen = () => {
20
+ const context = useContext();
21
+ const [query] = context.router().useSearchParams();
22
+ const t = useI18nLib('auth');
23
+ const intent = query.get(LOGIN_INTENT_QUERY) === LoginIntent.Logout
24
+ ? LoginIntent.Logout
25
+ : LoginIntent.Login;
26
+ const [stage, setStage] = useState(SurrogateStage.Working);
27
+ const [error, setError] = useState();
28
+ const onAction = useCallback(() => {
29
+ if (stage === SurrogateStage.Standalone) {
30
+ window.location.href = '/';
31
+ return;
32
+ }
33
+ if (stage === SurrogateStage.Gesture) {
34
+ const next = query.get(LOGIN_NEXT_QUERY);
35
+ void context.login().begin({ url: next ?? window.location.href });
36
+ return;
37
+ }
38
+ window.close();
39
+ }, [context, stage, query]);
40
+ useEffect(() => {
41
+ const login = context.service('login-service');
42
+ // First statement, unconditionally: `markSurrogate` reads `window.name`, and the browser
43
+ // clears that the moment this window's top-level context goes cross-origin. Recording it
44
+ // later means recording nothing.
45
+ login.enter();
46
+ const env = login.env();
47
+ if (!env.surrogate) {
48
+ // Somebody opened this address directly, or the window lost its marker. Never navigate on
49
+ // its behalf — offer a link and stop.
50
+ setStage(env.embedded ? SurrogateStage.Gesture : SurrogateStage.Standalone);
51
+ return;
52
+ }
53
+ const run = async () => {
54
+ const token = await context.auth().authenticated();
55
+ if (intent === LoginIntent.Logout) {
56
+ // Revoked FIRST, before anything can be awaited on a channel that may never answer: a
57
+ // window the user closes half a second later must still have ended the session it opened
58
+ // to end.
59
+ await login.revoke();
60
+ const outcome = await login.logoutComplete();
61
+ setStage(outcome === LoginOutcome.Handled ? SurrogateStage.Handing
62
+ : outcome === LoginOutcome.Orphaned ? SurrogateStage.Orphaned
63
+ : SurrogateStage.Failed);
64
+ return;
65
+ }
66
+ if (token != null && token !== '') {
67
+ // Already signed in here. The framed application is the one that asked, so the session
68
+ // goes to it rather than being displayed to this window.
69
+ const outcome = await login.resume(token);
70
+ setStage(outcome === LoginOutcome.Handled ? SurrogateStage.Handing
71
+ : outcome === LoginOutcome.Orphaned ? SurrogateStage.Orphaned
72
+ : SurrogateStage.Failed);
73
+ return;
74
+ }
75
+ // Nothing here yet — the dispatcher owns the authorization round trip, and the provider's
76
+ // callback lands there rather than on this route. The method the user already chose travels
77
+ // with it, so the dispatcher does not ask a second time in a window with no one to ask.
78
+ const next = query.get(LOGIN_NEXT_QUERY);
79
+ if (next == null || next === '') {
80
+ setStage(SurrogateStage.Gesture);
81
+ return;
82
+ }
83
+ const method = query.get(LOGIN_METHOD_QUERY);
84
+ const target = method != null && method !== ''
85
+ ? `${next}${next.includes('?') ? '&' : '?'}${LOGIN_METHOD_QUERY}=${encodeURIComponent(method)}`
86
+ : next;
87
+ window.location.href = target;
88
+ };
89
+ void run().catch((e) => {
90
+ console.error(e);
91
+ setError(e.message);
92
+ setStage(SurrogateStage.Failed);
93
+ });
94
+ }, [context, intent]);
95
+ return _jsx(LoginSurrogateView, { stage: stage, intent: intent, onAction: onAction, error: error, translate: (key, defaultValue) => t(key, { defaultValue }) });
96
+ };
97
+ //# sourceMappingURL=screen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen.js","sourceRoot":"","sources":["../../src/login/screen.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"surrogate.d.ts","sourceRoot":"","sources":["../../src/login/surrogate.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAgB,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAG5E;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,wBAAwB,QAAO,WA0G1C,CAAA"}
1
+ {"version":3,"file":"surrogate.d.ts","sourceRoot":"","sources":["../../src/login/surrogate.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAA0B,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAItF;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,wBAAwB,QAAO,WAoJ3C,CAAA"}
@@ -1,5 +1,6 @@
1
- import { adoptToken, clearSurrogate, markSurrogate, LoginOutcome, LOGIN_SURROGATE_FEATURES, LOGIN_SURROGATE_NAME, LOGIN_TOKEN_MESSAGE, LOGIN_WATCH_INTERVAL, } from '@owlmeans/client-auth/login';
1
+ import { adoptToken, clearSurrogate, markSurrogate, revokeToken, surrogatePath, LoginIntent, LoginOutcome, LOGIN_LOGOUT_MESSAGE, LOGIN_SURROGATE_FEATURES, LOGIN_SURROGATE_NAME, LOGIN_TOKEN_MESSAGE, } from '@owlmeans/client-auth/login';
2
2
  import { SURROGATE_LOGIN, SURROGATE_LOGIN_PRIORITY } from './consts.js';
3
+ import { awaitSurrogate } from './pump.js';
3
4
  /**
4
5
  * Login for a document that cannot complete the flow where it is.
5
6
  *
@@ -18,82 +19,14 @@ import { SURROGATE_LOGIN, SURROGATE_LOGIN_PRIORITY } from './consts.js';
18
19
  * top-level, so it authorizes by an ordinary redirect and differs only in what it does with the
19
20
  * token at the end.
20
21
  */
21
- export const makeSurrogateLoginPlugin = () => ({
22
- alias: SURROGATE_LOGIN,
23
- priority: SURROGATE_LOGIN_PRIORITY,
24
- mode: 'surrogate',
25
- match: env => env.hasWindow && (env.embedded || env.surrogate),
26
- enter: () => { markSurrogate(); },
27
- begin: (ctx, request, env) => {
28
- // Already one window up — nothing to open, just run the flow.
29
- if (env.surrogate) {
30
- window.location.href = request.url;
31
- return Promise.resolve(LoginOutcome.Redirected);
32
- }
33
- // Opened FIRST and synchronously: `window.open` escapes the popup blocker only while the user
34
- // gesture is still being handled, so nothing may be awaited before this line. That is why this
35
- // function is not `async`.
36
- const surrogate = window.open(request.url, LOGIN_SURROGATE_NAME, LOGIN_SURROGATE_FEATURES);
37
- if (surrogate == null) {
38
- return Promise.resolve(LoginOutcome.Failed);
39
- }
40
- return new Promise(resolve => {
41
- let settled = false;
42
- let watch;
43
- const finish = (result) => {
44
- if (settled) {
45
- return;
46
- }
47
- settled = true;
48
- window.removeEventListener('message', onMessage);
49
- if (watch != null) {
50
- clearInterval(watch);
51
- }
52
- resolve(result);
53
- };
54
- function onMessage(event) {
55
- if (event.origin !== window.location.origin) {
56
- return;
57
- }
58
- const data = event.data;
59
- if (data?.type !== LOGIN_TOKEN_MESSAGE || data.token == null || data.token === '') {
60
- return;
61
- }
62
- void adoptToken(ctx, data.token)
63
- .then(async () => {
64
- // Adopting the token is not the end of the flow — running the caller's continuation
65
- // is, exactly as the redirect plugin does before it reports `Handled`. Without it the
66
- // token lands in the auth service and nothing else happens: the framed app keeps
67
- // rendering its signed-out tree, and the user watches the login window close over a
68
- // preview that never changes. `Handled` promises the caller there is nothing left to
69
- // do, so it has to be true before it is returned.
70
- await request.navigate?.();
71
- finish(LoginOutcome.Handled);
72
- })
73
- .catch(() => finish(LoginOutcome.Failed));
74
- }
75
- window.addEventListener('message', onMessage);
76
- // A window the user simply closes announces nothing, so the only way to stop waiting on it
77
- // is to watch for it going away.
78
- watch = setInterval(() => {
79
- if (surrogate.closed) {
80
- finish(LoginOutcome.Failed);
81
- }
82
- }, LOGIN_WATCH_INTERVAL);
83
- });
84
- },
85
- authorize: async (_ctx, url, env) => {
86
- // The surrogate is top-level, so it redirects like any ordinary tab.
87
- if (env.surrogate) {
88
- window.location.href = url;
89
- return LoginOutcome.Redirected;
90
- }
91
- // Framed, and not yet one window up. A redirect from here would land in the frame and be
92
- // refused, and the window that would fix it cannot be opened without a user gesture — so the
93
- // caller is told to render a control rather than to navigate.
94
- return LoginOutcome.Gesture;
95
- },
96
- complete: async (_ctx, token, env) => {
22
+ export const makeSurrogateLoginPlugin = () => {
23
+ /**
24
+ * Give the token to whoever is entitled to it, and get out of the way.
25
+ *
26
+ * Shared by `complete` (a token was just issued here) and `resume` (one was already here),
27
+ * because what happens to it is the same in both cases and only the question differs.
28
+ */
29
+ const handBack = async (token, env) => {
97
30
  if (!env.surrogate) {
98
31
  // This document started the flow and finished it in place — it already has what it needs.
99
32
  return LoginOutcome.Passed;
@@ -109,6 +42,103 @@ export const makeSurrogateLoginPlugin = () => ({
109
42
  window.opener.postMessage({ type: LOGIN_TOKEN_MESSAGE, token }, window.location.origin);
110
43
  window.close();
111
44
  return LoginOutcome.Handled;
112
- },
113
- });
45
+ };
46
+ const plugin = {
47
+ alias: SURROGATE_LOGIN,
48
+ priority: SURROGATE_LOGIN_PRIORITY,
49
+ mode: 'surrogate',
50
+ match: env => env.hasWindow && (env.embedded || env.surrogate),
51
+ enter: () => { markSurrogate(); },
52
+ begin: (ctx, request, env) => {
53
+ // Already one window up — nothing to open, just run the flow.
54
+ if (env.surrogate) {
55
+ window.location.href = request.url;
56
+ return Promise.resolve(LoginOutcome.Redirected);
57
+ }
58
+ // Opened FIRST and synchronously: `window.open` escapes the popup blocker only while the
59
+ // user gesture is still being handled, so nothing may be awaited before this line. That is
60
+ // why this function is not `async`.
61
+ //
62
+ // The window opens on the surrogate route rather than on the dispatcher, so its very first
63
+ // paint is a bare "signing you in" panel instead of the application with its navigation. The
64
+ // dispatcher address travels as `next`, because the provider's callback still lands there and
65
+ // whatever flow parameters the caller's URL carried must survive the hop.
66
+ const path = surrogatePath(ctx, {
67
+ intent: LoginIntent.Login, next: request.url,
68
+ });
69
+ const surrogate = window.open(path ?? request.url, LOGIN_SURROGATE_NAME, LOGIN_SURROGATE_FEATURES);
70
+ if (surrogate == null) {
71
+ return Promise.resolve(LoginOutcome.Failed);
72
+ }
73
+ return awaitSurrogate(surrogate, LOGIN_TOKEN_MESSAGE, async (data) => {
74
+ if (data.token == null || data.token === '') {
75
+ return LoginOutcome.Failed;
76
+ }
77
+ await adoptToken(ctx, data.token);
78
+ // Adopting the token is not the end of the flow — running the caller's continuation is,
79
+ // exactly as the redirect plugin does before it reports `Handled`. Without it the token
80
+ // lands in the auth service and nothing else happens: the framed app keeps rendering its
81
+ // signed-out tree, and the user watches the login window close over a preview that never
82
+ // changes. `Handled` promises the caller there is nothing left to do.
83
+ await request.navigate?.();
84
+ return LoginOutcome.Handled;
85
+ });
86
+ },
87
+ authorize: async (_ctx, url, env) => {
88
+ // The surrogate is top-level, so it redirects like any ordinary tab.
89
+ if (env.surrogate) {
90
+ window.location.href = url;
91
+ return LoginOutcome.Redirected;
92
+ }
93
+ // Framed, and not yet one window up. A redirect from here would land in the frame and be
94
+ // refused, and the window that would fix it cannot be opened without a user gesture — so the
95
+ // caller is told to render a control rather than to navigate.
96
+ return LoginOutcome.Gesture;
97
+ },
98
+ complete: async (_ctx, token, env) => await handBack(token, env),
99
+ // A session that was already here is worth exactly as much as one just issued — to the window
100
+ // that asked for it. Without this the surrogate would render the signed-in application to
101
+ // itself and the framed app would stay signed out, which is the whole reported defect.
102
+ resume: async (_ctx, token, env) => await handBack(token, env),
103
+ logout: (ctx, request, env) => {
104
+ // Already one window up — end the session here and tell the opener.
105
+ if (env.surrogate) {
106
+ return revokeToken(ctx)
107
+ .then(async () => await plugin.logoutComplete(ctx, env));
108
+ }
109
+ const path = surrogatePath(ctx, { intent: LoginIntent.Logout });
110
+ // Opened first and synchronously, for the same reason `begin` does.
111
+ const surrogate = path != null
112
+ ? window.open(path, LOGIN_SURROGATE_NAME, LOGIN_SURROGATE_FEATURES)
113
+ : null;
114
+ // The local session goes next, and UNCONDITIONALLY. A blocked window, a severed opener or a
115
+ // user who closes the popup must never leave THIS document signed in: a logout that only
116
+ // half happened is bad, and one that did not happen at all is worse.
117
+ const local = revokeToken(ctx);
118
+ if (surrogate == null) {
119
+ return local.then(async () => {
120
+ await request.navigate?.();
121
+ return LoginOutcome.Failed;
122
+ });
123
+ }
124
+ return local.then(async () => await awaitSurrogate(surrogate, LOGIN_LOGOUT_MESSAGE, async () => {
125
+ await request.navigate?.();
126
+ return LoginOutcome.Handled;
127
+ }));
128
+ },
129
+ logoutComplete: async (_ctx, env) => {
130
+ if (!env.surrogate) {
131
+ return LoginOutcome.Passed;
132
+ }
133
+ if (!env.hasOpener) {
134
+ return LoginOutcome.Orphaned;
135
+ }
136
+ clearSurrogate();
137
+ window.opener.postMessage({ type: LOGIN_LOGOUT_MESSAGE, ok: true }, window.location.origin);
138
+ window.close();
139
+ return LoginOutcome.Handled;
140
+ },
141
+ };
142
+ return plugin;
143
+ };
114
144
  //# sourceMappingURL=surrogate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"surrogate.js","sourceRoot":"","sources":["../../src/login/surrogate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"surrogate.js","sourceRoot":"","sources":["../../src/login/surrogate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { FC } from 'react';
2
+ import { LoginIntent } from '@owlmeans/client-auth/login';
3
+ /** What the surrogate window is doing, from the point of view of the person watching it. */
4
+ export declare enum SurrogateStage {
5
+ /** Working. No control — there is nothing for the user to do but wait. */
6
+ Working = "working",
7
+ /** Needs a click: the flow cannot continue without a fresh gesture. */
8
+ Gesture = "gesture",
9
+ /** Done here; handing the result back and closing. */
10
+ Handing = "handing",
11
+ /** Acted, but with no channel back to the window that asked. */
12
+ Orphaned = "orphaned",
13
+ /** Ended with nothing. */
14
+ Failed = "failed",
15
+ /** Not a surrogate at all — someone opened this address directly. */
16
+ Standalone = "standalone"
17
+ }
18
+ export interface SurrogateViewProps {
19
+ stage: SurrogateStage;
20
+ intent: LoginIntent;
21
+ onAction?: () => void;
22
+ error?: string;
23
+ translate?: (key: string, defaultValue: string) => string;
24
+ }
25
+ export declare const LoginSurrogateView: FC<SurrogateViewProps>;
26
+ //# sourceMappingURL=view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../src/login/view.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,EAAE,EAAE,MAAM,OAAO,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAEzD,4FAA4F;AAC5F,oBAAY,cAAc;IACxB,0EAA0E;IAC1E,OAAO,YAAY;IACnB,uEAAuE;IACvE,OAAO,YAAY;IACnB,sDAAsD;IACtD,OAAO,YAAY;IACnB,gEAAgE;IAChE,QAAQ,aAAa;IACrB,0BAA0B;IAC1B,MAAM,WAAW;IACjB,qEAAqE;IACrE,UAAU,eAAe;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,cAAc,CAAA;IACrB,MAAM,EAAE,WAAW,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,MAAM,CAAA;CAC1D;AAoDD,eAAO,MAAM,kBAAkB,EAAE,EAAE,CAAC,kBAAkB,CAgBrD,CAAA"}
@@ -0,0 +1,73 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { LoginIntent } from '@owlmeans/client-auth/login';
3
+ /** What the surrogate window is doing, from the point of view of the person watching it. */
4
+ export var SurrogateStage;
5
+ (function (SurrogateStage) {
6
+ /** Working. No control — there is nothing for the user to do but wait. */
7
+ SurrogateStage["Working"] = "working";
8
+ /** Needs a click: the flow cannot continue without a fresh gesture. */
9
+ SurrogateStage["Gesture"] = "gesture";
10
+ /** Done here; handing the result back and closing. */
11
+ SurrogateStage["Handing"] = "handing";
12
+ /** Acted, but with no channel back to the window that asked. */
13
+ SurrogateStage["Orphaned"] = "orphaned";
14
+ /** Ended with nothing. */
15
+ SurrogateStage["Failed"] = "failed";
16
+ /** Not a surrogate at all — someone opened this address directly. */
17
+ SurrogateStage["Standalone"] = "standalone";
18
+ })(SurrogateStage || (SurrogateStage = {}));
19
+ /**
20
+ * The whole of what a login window shows.
21
+ *
22
+ * Plain elements and inline styles on purpose. This renders in a popup opened by a `web-panel` app,
23
+ * a `mui-panel` app and a generated Tailwind app alike, and none of their stylesheets is loaded
24
+ * here — a class name would simply do nothing. It is also the reason this component carries no
25
+ * dependency on a UI family at all.
26
+ */
27
+ const box = {
28
+ maxWidth: '22rem', margin: '15vh auto', padding: '1.5rem', textAlign: 'center',
29
+ fontFamily: 'system-ui, sans-serif', lineHeight: 1.5,
30
+ };
31
+ const action = {
32
+ marginTop: '1rem', padding: '.625rem 1.25rem', fontSize: '1rem',
33
+ cursor: 'pointer', borderRadius: '.375rem', border: '1px solid currentColor',
34
+ };
35
+ const COPY = {
36
+ [SurrogateStage.Working]: { key: 'working', en: 'Signing you in…' },
37
+ [SurrogateStage.Gesture]: {
38
+ key: 'gesture.title', en: 'Continue to sign in.', action: ['gesture.action', 'Sign in'],
39
+ },
40
+ [SurrogateStage.Handing]: { key: 'handing', en: 'Done. Returning to the application…' },
41
+ [SurrogateStage.Orphaned]: {
42
+ key: 'orphaned', en: 'Signed in. You can close this window and continue in the application.',
43
+ action: ['close', 'Close'],
44
+ },
45
+ [SurrogateStage.Failed]: {
46
+ key: 'failed', en: 'That did not complete. You can close this window and try again.',
47
+ action: ['close', 'Close'],
48
+ },
49
+ [SurrogateStage.Standalone]: {
50
+ key: 'standalone.title', en: 'This page is used to sign in from another window.',
51
+ action: ['standalone.action', 'Open the application'],
52
+ },
53
+ };
54
+ const LOGOUT_COPY = {
55
+ [SurrogateStage.Working]: { key: 'working', en: 'Signing you out…' },
56
+ [SurrogateStage.Gesture]: { key: 'gesture.title', en: 'Continue to sign out.' },
57
+ [SurrogateStage.Handing]: { key: 'handing', en: 'Signed out. Returning to the application…' },
58
+ [SurrogateStage.Orphaned]: {
59
+ key: 'orphaned', en: 'Signed out. You can close this window.',
60
+ },
61
+ [SurrogateStage.Failed]: {
62
+ key: 'failed', en: 'Sign-out did not complete here. You can close this window.',
63
+ },
64
+ };
65
+ export const LoginSurrogateView = ({ stage, intent, onAction, error, translate }) => {
66
+ const t = translate ?? ((_key, defaultValue) => defaultValue);
67
+ const scope = intent === LoginIntent.Logout ? 'logout' : 'login';
68
+ const base = COPY[stage];
69
+ const copy = (intent === LoginIntent.Logout ? LOGOUT_COPY[stage] : undefined) ?? base;
70
+ return _jsxs("div", { style: box, "data-surrogate-stage": stage, "data-surrogate-intent": intent, children: [_jsx("p", { children: t(`surrogate.${scope}.${copy.key}`, copy.en) }), error != null && error !== '' &&
71
+ _jsx("p", { style: { color: '#b00', fontSize: '.875rem' }, role: "alert", children: error }), base.action != null && onAction != null && _jsx("button", { type: "button", style: action, onClick: onAction, children: t(`surrogate.${scope}.${base.action[0]}`, base.action[1]) })] });
72
+ };
73
+ //# sourceMappingURL=view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.js","sourceRoot":"","sources":["../../src/login/view.tsx"],"names":[],"mappings":"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"}
package/build/main.d.ts CHANGED
@@ -1,5 +1,13 @@
1
1
  import type { ReactNode } from 'react';
2
2
  import type { AppConfig, AppContext, RenderOptions } from './types.js';
3
3
  export declare const render: (node: ReactNode, opts?: RenderOptions) => void;
4
- export declare const renderApp: <C extends AppConfig, T extends AppContext<C>>(context: T, opts?: RenderOptions) => void;
4
+ /**
5
+ * Mount the application.
6
+ *
7
+ * `children` are rendered inside the context provider and BEFORE the router, which makes them the
8
+ * app's global overlay slot: a consent dialog, a toast surface, anything that must exist on every
9
+ * route and outlive navigation. A component mounted inside a route instead is torn down and
10
+ * rebuilt on every navigation, which for a dialog means it closes itself.
11
+ */
12
+ export declare const renderApp: <C extends AppConfig, T extends AppContext<C>>(context: T, opts?: RenderOptions, children?: ReactNode) => void;
5
13
  //# sourceMappingURL=main.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGtC,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAGtE,eAAO,MAAM,MAAM,SAAU,SAAS,SAAS,aAAa,SAkB3D,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,CAAC,SAAS,SAAS,EAAE,CAAC,SAAS,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,aAAa,SAC5D,CAAA"}
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGtC,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAGtE,eAAO,MAAM,MAAM,SAAU,SAAS,SAAS,aAAa,SAkB3D,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,GAAI,CAAC,SAAS,SAAS,EAAE,CAAC,SAAS,UAAU,CAAC,CAAC,CAAC,WAC3D,CAAC,SAAS,aAAa,aAAa,SAAS,SACQ,CAAA"}
package/build/main.js CHANGED
@@ -21,5 +21,13 @@ export const render = (node, opts) => {
21
21
  };
22
22
  opts?.onReady ?? true ? window.addEventListener('DOMContentLoaded', _callback) : _callback();
23
23
  };
24
- export const renderApp = (context, opts) => render(_jsx(WebApp, { context: context }), opts);
24
+ /**
25
+ * Mount the application.
26
+ *
27
+ * `children` are rendered inside the context provider and BEFORE the router, which makes them the
28
+ * app's global overlay slot: a consent dialog, a toast surface, anything that must exist on every
29
+ * route and outlive navigation. A component mounted inside a route instead is torn down and
30
+ * rebuilt on every navigation, which for a dialog means it closes itself.
31
+ */
32
+ export const renderApp = (context, opts, children) => render(_jsx(WebApp, { context: context, children: children }), opts);
25
33
  //# sourceMappingURL=main.js.map
package/build/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAE9C,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,IAAe,EAAE,IAAoB,EAAE,EAAE;IAC9D,MAAM,SAAS,GAAG,GAAG,EAAE;QACrB,MAAM,GAAG,GAAG,IAAI,EAAE,KAAK,IAAI,YAAY,CAAA;QACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,CAAA;QACzC,IAAI,IAAI,EAAE,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,uBAAuB,GAAG,EAAE,CAAC,CAAA;QAC7C,CAAC;QACD,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,mCAAmC,GAAG,EAAE,CAAC,CAAA;QAC3D,CAAC;QACD,IAAI,IAAI,EAAE,OAAO,KAAK,IAAI,EAAE,CAAC;YAC3B,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QACzB,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAC/B,CAAC;IACH,CAAC,CAAA;IAED,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAA;AAC9F,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,CAA+C,OAAU,EAAE,IAAoB,EAAE,EAAE,CAC1G,MAAM,CAAC,KAAC,MAAM,IAAC,OAAO,EAAE,OAAO,GAAI,EAAE,IAAI,CAAC,CAAA"}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAE9C,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,IAAe,EAAE,IAAoB,EAAE,EAAE;IAC9D,MAAM,SAAS,GAAG,GAAG,EAAE;QACrB,MAAM,GAAG,GAAG,IAAI,EAAE,KAAK,IAAI,YAAY,CAAA;QACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,CAAA;QACzC,IAAI,IAAI,EAAE,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,uBAAuB,GAAG,EAAE,CAAC,CAAA;QAC7C,CAAC;QACD,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,mCAAmC,GAAG,EAAE,CAAC,CAAA;QAC3D,CAAC;QACD,IAAI,IAAI,EAAE,OAAO,KAAK,IAAI,EAAE,CAAC;YAC3B,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QACzB,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAC/B,CAAC;IACH,CAAC,CAAA;IAED,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAA;AAC9F,CAAC,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,OAAU,EAAE,IAAoB,EAAE,QAAoB,EACtD,EAAE,CAAC,MAAM,CAAC,KAAC,MAAM,IAAC,OAAO,EAAE,OAAO,YAAG,QAAQ,GAAU,EAAE,IAAI,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"modules.d.ts","sourceRoot":"","sources":["../src/modules.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,OAAO,uHAAO,CAAA"}
1
+ {"version":3,"file":"modules.d.ts","sourceRoot":"","sources":["../src/modules.ts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,OAAO,uHAAO,CAAA"}
package/build/modules.js CHANGED
@@ -1,8 +1,18 @@
1
- import { DISPATCHER } from '@owlmeans/auth';
1
+ import { DISPATCHER, DISPATCHER_SURROGATE } from '@owlmeans/auth';
2
2
  import { modules as list } from '@owlmeans/client-auth';
3
3
  import { elevate } from '@owlmeans/client-entrypoint';
4
4
  import { handler } from '@owlmeans/client';
5
5
  import { Dispatcher } from './components/dispatcher/component.js';
6
+ import { SurrogateScreen } from './login/screen.js';
6
7
  elevate(list, DISPATCHER, handler(Dispatcher), { force: true });
8
+ /**
9
+ * Elevated here rather than in a relying-party package on purpose.
10
+ *
11
+ * The surrogate mechanic is not OIDC-specific — it is "run the login route one window up and hand
12
+ * the result back" — and every web application already spreads this list. Putting the screen here
13
+ * means `web-panel`, `mui-panel` and every generated target gain a working login window with no
14
+ * edit of their own, which is the only way an application that is already deployed can get it.
15
+ */
16
+ elevate(list, DISPATCHER_SURROGATE, handler(SurrogateScreen));
7
17
  export const modules = list;
8
18
  //# sourceMappingURL=modules.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"modules.js","sourceRoot":"","sources":["../src/modules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAA;AAEjE,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;AAE/D,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,CAAA"}
1
+ {"version":3,"file":"modules.js","sourceRoot":"","sources":["../src/modules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AACjE,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAA;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAEnD,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;AAE/D;;;;;;;GAOG;AACH,OAAO,CAAC,IAAI,EAAE,oBAAoB,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC,CAAA;AAE7D,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@owlmeans/web-client",
3
- "version": "0.1.18-rc.13",
3
+ "version": "0.1.18-rc.15",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -21,22 +21,22 @@
21
21
  }
22
22
  },
23
23
  "dependencies": {
24
- "@owlmeans/auth": "^0.1.18-rc.6",
25
- "@owlmeans/auth-common": "^0.1.18-rc.8",
26
- "@owlmeans/client": "^0.1.18-rc.9",
27
- "@owlmeans/client-auth": "^0.1.18-rc.12",
28
- "@owlmeans/client-context": "^0.1.18-rc.8",
29
- "@owlmeans/client-i18n": "^0.1.18-rc.8",
30
- "@owlmeans/client-entrypoint": "^0.1.18-rc.8",
31
- "@owlmeans/client-resource": "^0.1.18-rc.8",
32
- "@owlmeans/client-route": "^0.1.18-rc.8",
33
- "@owlmeans/config": "^0.1.18-rc.7",
24
+ "@owlmeans/auth": "^0.1.18-rc.7",
25
+ "@owlmeans/auth-common": "^0.1.18-rc.9",
26
+ "@owlmeans/client": "^0.1.18-rc.11",
27
+ "@owlmeans/client-auth": "^0.1.18-rc.13",
28
+ "@owlmeans/client-context": "^0.1.18-rc.9",
29
+ "@owlmeans/client-i18n": "^0.1.18-rc.10",
30
+ "@owlmeans/client-entrypoint": "^0.1.18-rc.9",
31
+ "@owlmeans/client-resource": "^0.1.18-rc.9",
32
+ "@owlmeans/client-route": "^0.1.18-rc.9",
33
+ "@owlmeans/config": "^0.1.18-rc.8",
34
34
  "@owlmeans/context": "^0.1.18-rc.6",
35
35
  "@owlmeans/error": "^0.1.18-rc.6",
36
36
  "@owlmeans/i18n": "^0.1.18-rc.6",
37
37
  "@owlmeans/route": "^0.1.18-rc.6",
38
- "@owlmeans/web-db": "^0.1.18-rc.8",
39
- "@owlmeans/web-router": "^0.1.18-rc.8",
38
+ "@owlmeans/web-db": "^0.1.18-rc.10",
39
+ "@owlmeans/web-router": "^0.1.18-rc.9",
40
40
  "react-dropzone": "^14.3.5"
41
41
  },
42
42
  "peerDependencies": {