@iaurelius/accounts-expo 0.4.1 → 0.5.0

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/README.md CHANGED
@@ -82,10 +82,12 @@ page's bot check (Turnstile) cannot run on a native screen: the per-address and
82
82
  apply.
83
83
 
84
84
  - Both steps throw an `OAuthError`. A refusal keeps the application's code (`INVALID_OTP`,
85
- `ACCOUNT_LOCKED`, `ACCOUNT_OTP_LIMITED`, `organization_required`…). A limit without a code of its own
85
+ `ACCOUNT_LOCKED`, `ACCOUNT_OTP_LIMITED`, `sign_in_page_required`…). A limit without a code of its own
86
86
  is `too_many_requests` (`status` 429), and a `5xx` or no answer `temporarily_unavailable`; both carry
87
87
  `retryAfter` in seconds when the application says how long to wait. None of them touches the session
88
88
  the device already had.
89
+ - `sign_in_page_required` is an account with a step your screen cannot show (a passkey the application
90
+ requires, an invitation to accept): open the hosted page with `signIn()`.
89
91
  - The code for the session waits up to a minute, like the hosted sign-in's code exchange, and is sent
90
92
  once: the application spends it (and issues a refresh token) as soon as it arrives, so giving up after
91
93
  10 seconds would waste it and sending it again would only be refused.
@@ -94,6 +96,63 @@ apply.
94
96
  - Signing in while already signed in ("use another account") replaces the session: once the new one is on the
95
97
  device, the refresh token of the one before is revoked, so it does not stay alive at your application.
96
98
 
99
+ ### Organizations
100
+
101
+ Where the application has organizations, a person who belongs to several chooses one when signing in,
102
+ and can change it later. Both happen on your own screens, with no browser. The organizations are the
103
+ ones the person can use your app in: those that have your API (your `audience`) and where they have a
104
+ role in it. Pass `audience` to `<AccountsProvider>`: without it there is no list.
105
+
106
+ **Choosing one to sign in.** `signInWithEmailCode` does not sign in yet: it resolves with
107
+ `isSignedIn: false` and the list in `organizationChoice`. Show it and call `chooseOrganization`:
108
+
109
+ ```tsx
110
+ const { organizationChoice, signInWithEmailCode, chooseOrganization } = useAuth();
111
+
112
+ await signInWithEmailCode(email, code);
113
+ // organizationChoice: [{ slug: "acme", name: "Acme", role: "editor", orgRole: "member" }, …] or null
114
+
115
+ {organizationChoice?.map((o) => (
116
+ <Button key={o.slug} title={o.name} onPress={() => chooseOrganization(o.slug)} />
117
+ ))}
118
+ ```
119
+
120
+ - The person has 5 minutes to choose, and each sign-in takes one choice. A refusal
121
+ (`organization_not_available`, `invalid_continuation` once the time is up) ends that sign-in and
122
+ `organizationChoice` goes back to `null`: start again with a new code. A `429`, a `5xx` or no answer
123
+ leave the choice open to try again; if the application had already taken the choice (its answer was
124
+ lost, or it failed on the way), that second try is refused (`invalid_continuation`), nothing of the
125
+ first is left alive, and the person starts again.
126
+ - With one organization, or none, `signInWithEmailCode` signs in as before.
127
+ - `signOut()` drops a choice that is waiting. The list is kept in memory only, never on the device.
128
+ - An application that does not offer the choice yet answers as it did: `signInWithEmailCode` throws
129
+ `organization_required`, and the hosted page (`signIn()`) is where to choose.
130
+
131
+ **Changing it later.** `organization` is the one the session is in, `listOrganizations()` the ones to
132
+ offer, and `switchOrganization(slug)` changes to another:
133
+
134
+ ```tsx
135
+ const { organization, listOrganizations, switchOrganization } = useAuth();
136
+
137
+ const all = await listOrganizations(); // [{ slug, name, role, orgRole }, …]
138
+ await switchOrganization("globex"); // new tokens; getToken() gives one for globex from now on
139
+ ```
140
+
141
+ - The device gets new tokens for that organization, and the ones it had stop working. The person and
142
+ their profile are the same. Asking for the organization the session is already in asks nothing.
143
+ A `getToken({ forceRefresh: true })` within 30 seconds of the change gives the token the change
144
+ brought, as after a refresh: a 401 for a request sent just before it is not a reason to renew again.
145
+ - A refusal (`organization_not_available`: not one of theirs with your app; `sign_in_page_required`)
146
+ throws and changes nothing.
147
+ - If no answer comes, or the application asks to wait (`429`, `5xx`), it throws
148
+ `temporarily_unavailable` (or `too_many_requests`) and the person stays signed in where they were.
149
+ The change stays asked for, because the application may have made it already: the SDK finishes it at
150
+ the next `getToken()`, the next `switchOrganization` or the next start of the app, with the tokens the
151
+ device has. Until then `getToken()` gives the token it has while it lasts.
152
+ - `signOut()` during a change, or after one that never got its answer, leaves the person signed out and
153
+ nothing of the change alive: revoking the token the device has ends, in the application, what it made
154
+ instead of it. Signing in over such a session does the same, once the new session is kept.
155
+
97
156
  ### Tokens and the network
98
157
 
99
158
  - `getToken()` gives a token for your `audience`, refreshed a minute before it expires. While the token still
@@ -129,6 +188,7 @@ apply.
129
188
  - **On the device:** tokens stay in SecureStore, split in parts because Android is unreliable past 2 KB.
130
189
  - **Revocation:** a person who is banned or signed out everywhere is out at the next refresh. Sign-out revokes the refresh token.
131
190
  - **Refresh:** only a refusal for good signs the person out: a `4xx` with an OAuth error, such as `invalid_grant` (revoked, banned), `invalid_client`, `invalid_scope` or `invalid_target` (your `audience` changed). A `429` (many phones behind one carrier IP), a `5xx`, no answer or a `4xx` without an OAuth error (a firewall's page) keeps the session and its refresh token; the access token serves while it lasts, and no refresh is tried again before the server's `Retry-After`. A refreshed ID token must be the same person (`iss`, `sub`, `aud`), and userinfo's `sub` must match.
191
+ - **Organizations:** the list comes only after the emailed code is verified. What finishes a sign-in that had one to choose is used once, lasts 5 minutes, and is kept in memory, never on the device. A change of organization is a new sign-in of the app, and the one it replaces ends: the refresh token the device had no longer refreshes. Its new ID token must be the same person (`iss`, `sub`, `aud`).
132
192
  - **Sign-out during a refresh or a sign-in:** a refresh that was on its way when the person signed out (or signed in again) does not bring the old session back, and a sign-in (hosted page or your own screen) that was on its way when they signed out does not sign them in: its answer is dropped and its refresh token revoked. A sign-in answer whose ID token is not for that sign-in is refused, and its refresh token revoked too.
133
193
  - **Bundle size:** the package uses no Node APIs and no WebCrypto (`expo-crypto` instead), and does not pull jose into your bundle.
134
194
 
package/dist/core.d.ts CHANGED
@@ -18,11 +18,22 @@ export type Crypto = {
18
18
  randomString(bytes: number): string;
19
19
  sha256Base64Url(input: string): Promise<string>;
20
20
  };
21
+ /** An organization the person can use this app in: `role` is theirs in the app's product, `orgRole` in the organization. */
22
+ export type Organization = {
23
+ slug: string;
24
+ name: string;
25
+ role: string;
26
+ orgRole: string;
27
+ };
21
28
  export type AccountsState = {
22
29
  isLoaded: boolean;
23
30
  isSignedIn: boolean;
24
31
  user: SessionUser | null;
25
32
  sessionId: string | null;
33
+ /** The organization the session is in (its slug), when the access token says so: one for your `audience`. */
34
+ organization: string | null;
35
+ /** A sign-in on your own screen that has an organization left to choose: the ones to offer (chooseOrganization). */
36
+ organizationChoice: Organization[] | null;
26
37
  };
27
38
  export type ClientOptions = {
28
39
  publishableKey: string;
@@ -54,24 +65,20 @@ export declare function createAccountsClient(o: ClientOptions): {
54
65
  load(): Promise<AccountsState>;
55
66
  /** Opens the hosted page; resolves once the person is back (signed in, or unchanged if they closed it). */
56
67
  signIn: () => Promise<AccountsState>;
57
- /** Your own sign-in screen instead of the hosted page: a code to the email, then the code. */
68
+ /** Your own sign-in screen instead of the hosted page: a code to the email, then the code, then (in several organizations) which one. */
58
69
  sendEmailCode: (email: string) => Promise<{
59
70
  waitlist: boolean;
60
71
  }>;
61
72
  signInWithEmailCode: (email: string, code: string) => Promise<AccountsState>;
73
+ chooseOrganization: (slug: string) => Promise<AccountsState>;
62
74
  /** The same, on "create an account". */
63
75
  signUp: () => Promise<AccountsState>;
64
- /**
65
- * An access token for your API; null when signed out. One about to expire is refreshed: while it still lasts it
66
- * is given at once and the refresh goes on in the background; once expired, the call waits for the refresh.
67
- * forceRefresh: a new one even if this one still lasts (your API just refused it). Compare-and-refresh: several
68
- * refusals of the same token make one refresh, and a token a refresh (forced or not) gave less than 30 s ago is given
69
- * again instead of rotating once more. If no new token can be had now (no answer, a 429), it throws an
70
- * OAuthError (temporarily_unavailable) and the session stays; it resolves to null only when the session is over.
71
- */
72
- getToken(opts?: {
76
+ getToken: (opts?: {
73
77
  forceRefresh?: boolean;
74
- }): Promise<string | null>;
78
+ }) => Promise<string | null>;
79
+ /** The person's organizations for this app, and the session in another of them, without the hosted page. */
80
+ listOrganizations: () => Promise<Organization[]>;
81
+ switchOrganization: (slug: string) => Promise<AccountsState>;
75
82
  /** Out here (the refresh token revoked) and, unless told otherwise, on the hosted pages too. */
76
83
  signOut(opts?: {
77
84
  endSession?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAIA,OAAO,EAeL,KAAK,SAAS,EACd,KAAK,WAAW,EAEjB,MAAM,0BAA0B,CAAC;AAElC,YAAY,EAAE,WAAW,EAAE,CAAC;AAE5B,MAAM,MAAM,OAAO,GAAG;IAAE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAAC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC;AACvJ,MAAM,MAAM,iBAAiB,GAAG;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAA;CAAE,CAAC;AACxH,MAAM,MAAM,OAAO,GAAG;IAAE,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;CAAE,CAAC;AACxG,MAAM,MAAM,MAAM,GAAG;IAAE,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;CAAE,CAAC;AAE9G,MAAM,MAAM,aAAa,GAAG;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAI3H,MAAM,MAAM,aAAa,GAAG;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,kIAAkI;IAClI,WAAW,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,4EAA4E;IAC5E,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;;oDAGgD;IAChD,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAkDF,+GAA+G;AAC/G,wBAAgB,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,SAAO,GAAG,OAAO,CAqB9D;AAED,uGAAuG;AACvG,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAU3D;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,aAAa;;iBA0PpC,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI;IAMvC,0GAA0G;;IAgB1G,2GAA2G;;IAE3G,8FAA8F;2BAnG5D,MAAM;;;iCASA,MAAM,QAAQ,MAAM;IA6F5D,wCAAwC;;IAExC;;;;;;;OAOG;oBACkB;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE;IAW/C,gGAAgG;mBAC5E;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE;EAS/C;AAED,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC"}
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}
package/dist/core.js CHANGED
@@ -1,7 +1,8 @@
1
1
  // The Expo SDK's logic, without Expo: sign-in on the hosted page in an authentication session (PKCE
2
- // S256, state, nonce, RFC 9207's iss), the session kept in a secure store, an access token that refreshes
3
- // itself, and sign-out. The platform's parts (store, browser, crypto) are passed in: src/expo.ts gives
4
- // Expo's; the tests give Node's and the platform's own server.
2
+ // S256, state, nonce, RFC 9207's iss) or on the app's own screens (a code to the email, an organization to
3
+ // choose), the session kept in a secure store, an access token that refreshes itself, changing organization,
4
+ // and sign-out. The platform's parts (store, browser, crypto) are passed in: src/expo.ts gives Expo's; the
5
+ // tests give Node's and the platform's own server.
5
6
  import { OAuthError, authorizationUrl, endSessionUrl, exchangeCode, fetchUserInfo, issuerFromPublishableKey, readIdToken, refreshBackoff, refreshTokens, retryAfterOf, revokeToken, sameIdentity, sessionEnded, userFromClaims, } from "@iaurelius/accounts/oidc";
6
7
  const now = () => Math.floor(Date.now() / 1000);
7
8
  /**
@@ -89,6 +90,41 @@ export function queryOf(url) {
89
90
  }
90
91
  return out;
91
92
  }
93
+ /** "Not now": no answer, a limit, a failure of the application, a change already under way. Anything else it refused for good. */
94
+ const notNow = (e) => e instanceof OAuthError && (e.status === 429 || e.status === 408 || e.status >= 500 || e.error === "switch_in_progress");
95
+ /** The organizations of an answer of the application (the sign-in's list, userinfo's `orgs`). */
96
+ function organizationsOf(v) {
97
+ if (!Array.isArray(v))
98
+ return [];
99
+ const out = [];
100
+ for (const x of v) {
101
+ if (!x || typeof x.slug !== "string" || !x.slug)
102
+ continue;
103
+ out.push({ slug: x.slug, name: typeof x.name === "string" && x.name ? x.name : x.slug, role: typeof x.role === "string" ? x.role : "", orgRole: typeof x.org_role === "string" ? x.org_role : "" });
104
+ }
105
+ return out;
106
+ }
107
+ /** The organization an access token is for (`org_slug`), if it is a JWT that says so. */
108
+ function organizationOf(accessToken) {
109
+ try {
110
+ const slug = readIdToken(accessToken).org_slug;
111
+ return typeof slug === "string" && slug ? slug : null;
112
+ }
113
+ catch {
114
+ return null;
115
+ }
116
+ }
117
+ /** The token endpoint's answer, as the application's native routes relay it. */
118
+ function tokenSet(t) {
119
+ if (typeof t.access_token !== "string")
120
+ throw new OAuthError("invalid_response", "No access token.");
121
+ return {
122
+ accessToken: t.access_token,
123
+ expiresAt: now() + (typeof t.expires_in === "number" ? t.expires_in : 300),
124
+ ...(typeof t.refresh_token === "string" && { refreshToken: t.refresh_token }),
125
+ ...(typeof t.id_token === "string" && { idToken: t.id_token }),
126
+ };
127
+ }
92
128
  export function createAccountsClient(o) {
93
129
  const issuer = issuerFromPublishableKey(o.publishableKey);
94
130
  const fetch = withTimeout(o.fetch, o.requestTimeoutMs ?? 10_000);
@@ -100,8 +136,13 @@ export function createAccountsClient(o) {
100
136
  const codeCreds = { ...creds, fetch: sentTwiceIfUnanswered(longest, longest) };
101
137
  const store = chunked(o.storage);
102
138
  const key = `accounts.${o.clientId.replace(/[^A-Za-z0-9._-]/g, "_")}`;
139
+ // A change of organization that is not settled yet (below, switchOrganization): the one asked for.
140
+ const switchKey = `${key}.switch`;
141
+ let switchTo = null;
142
+ // A sign-in on the app's own screen with an organization left to choose: in memory only (it lasts 5 minutes).
143
+ let choice = null;
103
144
  let session = null;
104
- let state = { isLoaded: false, isSignedIn: false, user: null, sessionId: null };
145
+ let state = { isLoaded: false, isSignedIn: false, user: null, sessionId: null, organization: null, organizationChoice: null };
105
146
  const listeners = new Set();
106
147
  function publish(loaded = true) {
107
148
  let user = null;
@@ -111,7 +152,7 @@ export function createAccountsClient(o) {
111
152
  user = userFromClaims({ ...c, ...session.u, sub: c.sub });
112
153
  sid = typeof c.sid === "string" ? c.sid : null;
113
154
  }
114
- state = { isLoaded: loaded, isSignedIn: !!session, user, sessionId: sid };
155
+ state = { isLoaded: loaded, isSignedIn: !!session, user, sessionId: sid, organization: session ? organizationOf(session.at) : null, organizationChoice: choice ? choice.organizations : null };
115
156
  for (const l of listeners)
116
157
  l(state);
117
158
  }
@@ -124,8 +165,18 @@ export function createAccountsClient(o) {
124
165
  const write = writing.then(() => (s ? store.set(key, JSON.stringify(s)) : store.remove(key)));
125
166
  writing = write.catch(() => undefined); // a write that fails is its caller's error, not the next write's
126
167
  await write;
168
+ // No session, no change of organization to settle.
169
+ if (!s)
170
+ await noteSwitch(null);
127
171
  publish();
128
172
  }
173
+ /** The change of organization asked for and not settled yet, on record on the device: a write like any other, in its turn. */
174
+ async function noteSwitch(slug) {
175
+ switchTo = slug;
176
+ const write = writing.then(() => (slug ? o.storage.set(switchKey, slug) : o.storage.remove(switchKey)));
177
+ writing = write.catch(() => undefined);
178
+ await write;
179
+ }
129
180
  /** The profile from userinfo, only if it is about `sub` (the ID token's person). */
130
181
  async function profile(accessToken, sub) {
131
182
  const c = await fetchUserInfo({ issuer, accessToken, fetch, sub });
@@ -245,14 +296,15 @@ export function createAccountsClient(o) {
245
296
  throw new OAuthError("invalid_id_token", "The ID token is not for this sign-in.");
246
297
  }
247
298
  /**
248
- * A request to the application's native sign-in (no browser); its errors keep the application's code. The code for
249
- * the session waits as long as a code exchange (TOKEN_TIMEOUT_MS), and is sent once: the application spends it on
250
- * the first request that reaches it, so a second one would only be refused.
299
+ * A request to the application's native routes (no browser). The code for the session, the organization chosen
300
+ * and a change of organization wait as long as a code exchange (TOKEN_TIMEOUT_MS), and are sent once: the
301
+ * application spends the code (and the continuation) on the first request that reaches it, so a second one would
302
+ * only be refused. Asking for the code to be mailed has the ordinary wait.
251
303
  */
252
- async function nativeCall(path, body) {
304
+ async function nativeRequest(path, body) {
253
305
  let res;
254
306
  try {
255
- res = await (path === "token" ? longest : fetch)(`${issuer}/api/native/${path}`, {
307
+ res = await (path === "email-code" ? fetch : longest)(`${issuer}/api/native/${path}`, {
256
308
  method: "POST",
257
309
  headers: { "content-type": "application/json", accept: "application/json" },
258
310
  body: JSON.stringify({ client_id: o.clientId, ...body }),
@@ -261,18 +313,24 @@ export function createAccountsClient(o) {
261
313
  catch (e) {
262
314
  throw new OAuthError("temporarily_unavailable", `Could not reach ${issuer}: ${e?.message ?? e}`, 503);
263
315
  }
264
- const data = (await res.json().catch(() => ({})));
265
- if (!res.ok) {
266
- // A 429 or a 5xx without the application's code (Better Auth's limiter answers {"message": …}) is "not now", with
267
- // its Retry-After: too_many_requests (the application's own code for a limit) or temporarily_unavailable.
268
- const code = typeof data.code === "string" ? data.code
269
- : typeof data.error === "string" ? data.error
270
- : res.status === 429 ? "too_many_requests"
271
- : res.status >= 500 ? "temporarily_unavailable"
272
- : "invalid_response";
273
- const message = typeof data.message === "string" ? data.message : typeof data.error_description === "string" ? data.error_description : undefined;
274
- throw new OAuthError(code, message, res.status, retryAfterOf(res.headers));
275
- }
316
+ return { res, data: (await res.json().catch(() => ({}))) };
317
+ }
318
+ /** A refusal of those routes, with the application's code. Never anything else of the answer: it may carry a continuation. */
319
+ function nativeError(res, data) {
320
+ // A 429 or a 5xx without the application's code (Better Auth's limiter answers {"message": …}) is "not now", with
321
+ // its Retry-After: too_many_requests (the application's own code for a limit) or temporarily_unavailable.
322
+ const code = typeof data.code === "string" ? data.code
323
+ : typeof data.error === "string" ? data.error
324
+ : res.status === 429 ? "too_many_requests"
325
+ : res.status >= 500 ? "temporarily_unavailable"
326
+ : "invalid_response";
327
+ const message = typeof data.message === "string" ? data.message : typeof data.error_description === "string" ? data.error_description : undefined;
328
+ return new OAuthError(code, message, res.status, retryAfterOf(res.headers));
329
+ }
330
+ async function nativeCall(path, body) {
331
+ const { res, data } = await nativeRequest(path, body);
332
+ if (!res.ok)
333
+ throw nativeError(res, data);
276
334
  return data;
277
335
  }
278
336
  /** The app's own sign-in screen, step 1: a code to that email. `waitlist` when the application takes
@@ -283,21 +341,67 @@ export function createAccountsClient(o) {
283
341
  }
284
342
  /**
285
343
  * Step 2: the code, for the session. Someone new signs up the same way where the application is public. A refusal,
286
- * a 429, a 5xx or no answer throws and leaves whatever session the device had as it was.
344
+ * a 429, a 5xx or no answer throws and leaves whatever session the device had as it was. A person in several
345
+ * organizations is not signed in yet: `organizationChoice` (in the state this resolves to) lists them, and
346
+ * chooseOrganization finishes the sign-in.
287
347
  */
288
348
  async function signInWithEmailCode(email, code) {
289
349
  const started = epoch;
290
350
  const nonce = o.crypto.randomString(24);
291
- const t = await nativeCall("token", { email, code, nonce, resource: o.audience });
292
- if (typeof t.access_token !== "string")
293
- throw new OAuthError("invalid_response", "No access token.");
294
- const tokens = {
295
- accessToken: t.access_token,
296
- expiresAt: now() + (typeof t.expires_in === "number" ? t.expires_in : 300),
297
- ...(typeof t.refresh_token === "string" && { refreshToken: t.refresh_token }),
298
- ...(typeof t.id_token === "string" && { idToken: t.id_token }),
299
- };
300
- return adopt(started, tokens, nonce);
351
+ const { res, data } = await nativeRequest("token", { email, code, nonce, resource: o.audience });
352
+ const offered = res.status === 409 && data.code === "organization_required" ? organizationsOf(data.organizations) : [];
353
+ if (offered.length && typeof data.continuation === "string" && data.continuation) {
354
+ // Signed out, or signed in, while the code was on its way: that stands (the application forgets this one by itself).
355
+ if (started !== epoch)
356
+ return state;
357
+ choice = { continuation: data.continuation, nonce, organizations: offered };
358
+ publish();
359
+ return state;
360
+ }
361
+ if (!res.ok)
362
+ throw nativeError(res, data);
363
+ return adopt(started, tokenSet(data), nonce);
364
+ }
365
+ // One request per continuation: the application takes it once, and a second one ends what the first got.
366
+ let choosing = null;
367
+ /**
368
+ * Step 3, only with `organizationChoice`: the organization (its slug), for the session. A refusal throws and the
369
+ * sign-in is over (the application takes each choice once: start again with a new code); a 429, a 5xx or no
370
+ * answer throws and leaves the choice open for another try.
371
+ */
372
+ function chooseOrganization(slug) {
373
+ const c = choice;
374
+ if (!c)
375
+ return Promise.reject(new OAuthError("invalid_request", "There is no sign-in waiting for an organization."));
376
+ choosing ??= (async () => {
377
+ const started = epoch;
378
+ try {
379
+ const { res, data } = await nativeRequest("token", { continuation: c.continuation, organization: slug });
380
+ if (!res.ok) {
381
+ const e = nativeError(res, data);
382
+ if (notNow(e))
383
+ throw e;
384
+ // Refused for good: that continuation is spent.
385
+ if (choice === c)
386
+ choice = null;
387
+ publish();
388
+ throw e;
389
+ }
390
+ if (choice === c)
391
+ choice = null;
392
+ try {
393
+ return await adopt(started, tokenSet(data), c.nonce);
394
+ }
395
+ catch (e) {
396
+ publish();
397
+ throw e;
398
+ }
399
+ }
400
+ finally {
401
+ choosing = null;
402
+ }
403
+ })();
404
+ return choosing;
301
405
  }
302
406
  /**
303
407
  * A sign-in's tokens become the device's session. Their ID token has to be for this sign-in; if not, the refresh
@@ -320,12 +424,20 @@ export function createAccountsClient(o) {
320
424
  if (!(await sameEpoch(started, t)))
321
425
  return state;
322
426
  epoch++;
427
+ // Another sign-in: nothing of the one before is left to finish (an organization to choose, a change of it).
428
+ choice = null;
323
429
  // The session this one takes the place of ("use another account", an app that signs in again) ends at
324
430
  // the application too, once the new one is on the device: its refresh token would stay alive there, on
325
431
  // no device, for as long as its sign-in (30 days). A refresh of it still on its way revokes what it gets
326
432
  // (sameEpoch); this is for the token already stored, the one a refresh had just saved included.
327
433
  const replaced = session;
328
- await save({ at: t.accessToken, rt: t.refreshToken, it: t.idToken, exp: t.expiresAt, u });
434
+ // Nothing is waited for between the check of the epoch above and the session below: a sign-out that
435
+ // landed in between would find the session of before, and this one would then be kept over it (NAT-01).
436
+ // Both writes are only queued here, the record of an unsettled change first: on the device it goes
437
+ // before the new session does.
438
+ const cleared = switchTo ? noteSwitch(null) : undefined;
439
+ const saved = save({ at: t.accessToken, rt: t.refreshToken, it: t.idToken, exp: t.expiresAt, u });
440
+ await Promise.all([cleared, saved]);
329
441
  if (replaced?.rt && replaced.rt !== t.refreshToken)
330
442
  await revokeToken(creds, { token: replaced.rt, hint: "refresh_token" });
331
443
  return state;
@@ -355,6 +467,161 @@ export function createAccountsClient(o) {
355
467
  const t = await exchangeCode(codeCreds, { code: q.code, redirectUri: o.redirectUri, codeVerifier: verifier, resource: o.audience });
356
468
  return adopt(started, t, nonce);
357
469
  }
470
+ // ---- changing organization
471
+ // The application gives the device a new sign-in for the organization asked for and ends the one it replaces as
472
+ // soon as the new one exists. If its answer never arrives, the refresh token on the device is one the token endpoint
473
+ // no longer takes: only the change itself, asked again with that token, gets the new one (the application keeps it
474
+ // for whoever presents the old one). So a change is on record on the device before it is sent, and until it is
475
+ // settled nothing else presents that refresh token: no refresh (getToken gives the token it has while it lasts),
476
+ // and at the next start the change goes first.
477
+ let switching = null;
478
+ const switchBackoff = refreshBackoff();
479
+ /** Sends the change on record and takes its answer. Rejects when it could not be settled now, or was refused. */
480
+ function settleSwitch() {
481
+ switching ??= (async () => {
482
+ try {
483
+ // A refresh on its way rotates the token this presents: after it.
484
+ while (refreshing)
485
+ await refreshing.catch(() => undefined);
486
+ const s = session;
487
+ const slug = switchTo;
488
+ if (!slug)
489
+ return;
490
+ if (!s?.rt)
491
+ return void (await noteSwitch(null));
492
+ const started = epoch;
493
+ let t;
494
+ try {
495
+ t = tokenSet(await nativeCall("switch", { refresh_token: s.rt, organization: slug, resource: o.audience }));
496
+ }
497
+ catch (e) {
498
+ if (notNow(e))
499
+ switchBackoff.failed(e);
500
+ else if (started === epoch) {
501
+ // Refused for good: nothing changed. The application rotates the refresh token it is shown before it
502
+ // looks at the organization, so the one on the device is renewed now, while the application still
503
+ // answers it (and if the session is over, this is what says so).
504
+ await noteSwitch(null);
505
+ await fresh(true).catch(() => undefined);
506
+ }
507
+ throw e;
508
+ }
509
+ switchBackoff.succeeded();
510
+ if (!(await sameEpoch(started, t)))
511
+ return;
512
+ // The same person, for this app, from this application (as a refresh's ID token); else the session ends here.
513
+ if (!t.idToken || !sameIdentity(s.it, t.idToken, { issuer, clientId: o.clientId })) {
514
+ if (t.refreshToken)
515
+ await revokeToken(creds, { token: t.refreshToken, hint: "refresh_token" });
516
+ await save(null);
517
+ throw new OAuthError("invalid_id_token", "The answer is not for this session.");
518
+ }
519
+ epoch++;
520
+ // As a refresh's (fresh()): this token takes the place of the one the app was using, and an API that
521
+ // refuses that one right after the change (a request of the organization before) is asking for this one.
522
+ latest = { to: t.accessToken, at: Date.now() };
523
+ // The new sign-in on the device first, then the record of the change: an app ended in between asks again
524
+ // at its next start with a token that works, never with one that does not.
525
+ await save({ at: t.accessToken, rt: t.refreshToken, it: t.idToken, exp: t.expiresAt, u: s.u });
526
+ await noteSwitch(null);
527
+ publish();
528
+ }
529
+ finally {
530
+ switching = null;
531
+ }
532
+ })();
533
+ return switching;
534
+ }
535
+ /**
536
+ * The session, in another of the person's organizations (its slug, from listOrganizations): new tokens for it, and
537
+ * the ones the device had stop working. A refusal throws and changes nothing. If no answer comes (or a 429, a
538
+ * 5xx), it throws `temporarily_unavailable` and the change stays asked for: it is finished by the next getToken(),
539
+ * the next call here or the next start of the app, whichever comes first.
540
+ */
541
+ async function switchOrganization(slug) {
542
+ if (switching)
543
+ await switching.catch(() => undefined);
544
+ if (!session)
545
+ throw new OAuthError("login_required", "Not signed in.", 401);
546
+ // Already there, with nothing left to settle (a second tap): nothing to ask.
547
+ if (!switchTo && organizationOf(session.at) === slug)
548
+ return state;
549
+ const before = switchTo;
550
+ try {
551
+ await noteSwitch(slug);
552
+ }
553
+ catch (e) {
554
+ // Not on record on the device: not asked for, and never sent without its record. What was asked for
555
+ // before stays as it was: a change still to settle keeps being the one (its record is what the device
556
+ // has, and the refresh token may be one only that change can present). Unless something else has
557
+ // changed it meanwhile (a sign-out, another change asked for).
558
+ if (switchTo === slug)
559
+ switchTo = before;
560
+ throw e;
561
+ }
562
+ await settleSwitch();
563
+ return state;
564
+ }
565
+ /**
566
+ * An access token for your API; null when signed out. One about to expire is refreshed: while it still lasts it
567
+ * is given at once and the refresh goes on in the background; once expired, the call waits for the refresh.
568
+ * forceRefresh: a new one even if this one still lasts (your API just refused it). Compare-and-refresh: several
569
+ * refusals of the same token make one refresh, and a token a refresh (forced or not) gave less than 30 s ago is given
570
+ * again instead of rotating once more. If no new token can be had now (no answer, a 429), it throws an
571
+ * OAuthError (temporarily_unavailable) and the session stays; it resolves to null only when the session is over.
572
+ */
573
+ async function getToken(opts = {}) {
574
+ if (switchTo) {
575
+ // A change of organization to settle first: until then the refresh token is the change's to present.
576
+ const before = session;
577
+ const lasting = (x) => (x && x.exp > now() ? x.at : null);
578
+ const mayAsk = !!switching || !switchBackoff.waiting;
579
+ if (mayAsk && opts.forceRefresh !== true && lasting(before)) {
580
+ settleSwitch().catch(() => undefined); // in the background: the token in hand is good meanwhile (R-03)
581
+ return lasting(before);
582
+ }
583
+ if (mayAsk)
584
+ await settleSwitch().catch(() => undefined);
585
+ if (switchTo) {
586
+ if (opts.forceRefresh === true && session)
587
+ throw new OAuthError("temporarily_unavailable", "Could not get a new token now; the person is still signed in. Try again in a moment.", 503, switchBackoff.waiting ? Math.ceil(switchBackoff.waiting / 1000) : undefined);
588
+ return lasting(session);
589
+ }
590
+ // Settled: the new sign-in's token (refused for good: the session as it was, below).
591
+ if (session !== before)
592
+ return session?.at ?? null;
593
+ }
594
+ if (opts.forceRefresh !== true)
595
+ return (await fresh())?.at ?? null;
596
+ const s = session;
597
+ if (!s)
598
+ return null;
599
+ if (s.at === latest.to && Date.now() - latest.at < FORCE_COOLDOWN_MS)
600
+ return s.at;
601
+ await fresh(true);
602
+ const after = session;
603
+ if (!after)
604
+ return null;
605
+ if (after.at === s.at)
606
+ throw new OAuthError("temporarily_unavailable", "Could not get a new token now; the person is still signed in. Try again in a moment.", 503, backoff.waiting ? Math.ceil(backoff.waiting / 1000) : undefined);
607
+ return after.at;
608
+ }
609
+ /**
610
+ * The organizations the person can use this app in (those with your API's product), for a switcher: what the
611
+ * application's userinfo says for a token of your `audience`. `state.organization` is the one the session is in.
612
+ */
613
+ async function listOrganizations() {
614
+ const accessToken = await getToken();
615
+ // No token now (expired, and no way to renew it at the moment) is not "signed out".
616
+ if (!accessToken && session)
617
+ throw new OAuthError("temporarily_unavailable", "Could not read the organizations now. Try again in a moment.", 503);
618
+ if (!accessToken)
619
+ throw new OAuthError("login_required", "Not signed in.", 401);
620
+ const claims = await fetchUserInfo({ issuer, accessToken, fetch });
621
+ if (!claims)
622
+ throw new OAuthError("temporarily_unavailable", "Could not read the organizations now. Try again in a moment.", 503);
623
+ return organizationsOf(claims.orgs);
624
+ }
358
625
  return {
359
626
  get state() {
360
627
  return state;
@@ -377,48 +644,41 @@ export function createAccountsClient(o) {
377
644
  catch {
378
645
  session = null;
379
646
  }
647
+ // A change of organization the app was ended in the middle of: before anything else presents the refresh token.
648
+ const unsettled = await Promise.resolve(o.storage.get(switchKey)).catch(() => null);
649
+ if (unsettled && !session)
650
+ await noteSwitch(null);
651
+ else
652
+ switchTo = unsettled || null;
380
653
  // What the device has, at once (offline, or on a slow network, the app does not wait); then fresh.
381
654
  publish();
382
- await fresh(false, true);
655
+ if (switchTo)
656
+ await settleSwitch().catch(() => undefined);
657
+ if (!switchTo)
658
+ await fresh(false, true);
383
659
  publish();
384
660
  return state;
385
661
  },
386
662
  /** Opens the hosted page; resolves once the person is back (signed in, or unchanged if they closed it). */
387
663
  signIn: () => signIn(),
388
- /** Your own sign-in screen instead of the hosted page: a code to the email, then the code. */
664
+ /** Your own sign-in screen instead of the hosted page: a code to the email, then the code, then (in several organizations) which one. */
389
665
  sendEmailCode,
390
666
  signInWithEmailCode,
667
+ chooseOrganization,
391
668
  /** The same, on "create an account". */
392
669
  signUp: () => signIn("create"),
393
- /**
394
- * An access token for your API; null when signed out. One about to expire is refreshed: while it still lasts it
395
- * is given at once and the refresh goes on in the background; once expired, the call waits for the refresh.
396
- * forceRefresh: a new one even if this one still lasts (your API just refused it). Compare-and-refresh: several
397
- * refusals of the same token make one refresh, and a token a refresh (forced or not) gave less than 30 s ago is given
398
- * again instead of rotating once more. If no new token can be had now (no answer, a 429), it throws an
399
- * OAuthError (temporarily_unavailable) and the session stays; it resolves to null only when the session is over.
400
- */
401
- async getToken(opts = {}) {
402
- if (opts.forceRefresh !== true)
403
- return (await fresh())?.at ?? null;
404
- const s = session;
405
- if (!s)
406
- return null;
407
- if (s.at === latest.to && Date.now() - latest.at < FORCE_COOLDOWN_MS)
408
- return s.at;
409
- await fresh(true);
410
- const after = session;
411
- if (!after)
412
- return null;
413
- if (after.at === s.at)
414
- throw new OAuthError("temporarily_unavailable", "Could not get a new token now; the person is still signed in. Try again in a moment.", 503, backoff.waiting ? Math.ceil(backoff.waiting / 1000) : undefined);
415
- return after.at;
416
- },
670
+ getToken,
671
+ /** The person's organizations for this app, and the session in another of them, without the hosted page. */
672
+ listOrganizations,
673
+ switchOrganization,
417
674
  /** Out here (the refresh token revoked) and, unless told otherwise, on the hosted pages too. */
418
675
  async signOut(opts = {}) {
419
676
  const s = session;
420
677
  epoch++; // a refresh on its way now will not bring the session back
678
+ choice = null; // nor is a sign-in waiting for its organization left to finish
421
679
  await save(null);
680
+ // With a change of organization that was never settled too: revoking the token the device has ends, in the
681
+ // application, whatever it made instead of it (a sign-in whose answer never arrived).
422
682
  if (s?.rt)
423
683
  await revokeToken(creds, { token: s.rt, hint: "refresh_token" });
424
684
  if (s && opts.endSession !== false)
package/dist/core.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA,oGAAoG;AACpG,0GAA0G;AAC1G,uGAAuG;AACvG,+DAA+D;AAC/D,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,aAAa,EACb,wBAAwB,EACxB,WAAW,EACX,cAAc,EACd,aAAa,EACb,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,cAAc,GAIf,MAAM,0BAA0B,CAAC;AAiClC,MAAM,GAAG,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;AAEhD;;;;;;GAMG;AACH,MAAM,oBAAoB,GAAG,KAAK,CAAC;AACnC;;;;;;GAMG;AACH,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAChC,uIAAuI;AACvI,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAEjC,iFAAiF;AACjF,SAAS,WAAW,CAAC,CAAwB,EAAE,EAAU;IACvD,MAAM,IAAI,GAAc,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IAC9E,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,EAAE,GAAG,IAAI,eAAe,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/C,IAAI,EAAE,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;IACxF,CAAC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAS,qBAAqB,CAAC,KAAgB,EAAE,KAAgB;IAC/D,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAC3B,IAAI,CAAC;YACH,OAAO,MAAM,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,+GAA+G;AAC/G,MAAM,UAAU,OAAO,CAAC,OAAgB,EAAE,IAAI,GAAG,IAAI;IACnD,OAAO;QACL,KAAK,CAAC,GAAG,CAAC,GAAG;YACX,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;YAChD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC/C,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACjG,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/D,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK;YAClB,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;YACvD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YACnI,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE;gBAAE,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAC1E,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;YACpD,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE;gBAAE,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/E,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,GAAG;YACd,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;YACrD,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;YACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;gBAAE,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;QAClE,CAAC;KACF,CAAC;AACJ,CAAC;AAED,uGAAuG;AACvG,MAAM,UAAU,OAAO,CAAC,GAAW;IACjC,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACjD,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;QACpF,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IACnG,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,CAAgB;IACnD,MAAM,MAAM,GAAG,wBAAwB,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,gBAAgB,IAAI,MAAM,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC;IACtD,kHAAkH;IAClH,kGAAkG;IAClG,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,gBAAgB,IAAI,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAC/F,MAAM,YAAY,GAAG,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,qBAAqB,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,EAAE,oBAAoB,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC;IACrH,MAAM,SAAS,GAAG,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,qBAAqB,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;IAC/E,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACjC,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,EAAE,CAAC;IACtE,IAAI,OAAO,GAAkB,IAAI,CAAC;IAClC,IAAI,KAAK,GAAkB,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC/F,MAAM,SAAS,GAAG,IAAI,GAAG,EAA8B,CAAC;IAExD,SAAS,OAAO,CAAC,MAAM,GAAG,IAAI;QAC5B,IAAI,IAAI,GAAuB,IAAI,CAAC;QACpC,IAAI,GAAG,GAAkB,IAAI,CAAC;QAC9B,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAClC,IAAI,GAAG,cAAc,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;YAC1D,GAAG,GAAG,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;QACjD,CAAC;QACD,KAAK,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;QAC1E,KAAK,MAAM,CAAC,IAAI,SAAS;YAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IACD,0GAA0G;IAC1G,0GAA0G;IAC1G,8FAA8F;IAC9F,IAAI,OAAO,GAAqB,OAAO,CAAC,OAAO,EAAE,CAAC;IAClD,KAAK,UAAU,IAAI,CAAC,CAAgB;QAClC,OAAO,GAAG,CAAC,CAAC;QACZ,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC9F,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,iEAAiE;QACzG,MAAM,KAAK,CAAC;QACZ,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,oFAAoF;IACpF,KAAK,UAAU,OAAO,CAAC,WAAmB,EAAE,GAAW;QACrD,MAAM,CAAC,GAAG,MAAM,aAAa,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC,CAAC;YAAE,OAAO,SAAS,CAAC;QACzB,MAAM,CAAC,GAAY,EAAE,CAAC;QACtB,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ;YAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;QACnD,IAAI,OAAO,CAAC,CAAC,cAAc,KAAK,SAAS;YAAE,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,cAAc,CAAC;QAC/E,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI;YAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;QAC1D,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO;YAAE,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;QACtE,OAAO,CAAC,CAAC;IACX,CAAC;IAED,4GAA4G;IAC5G,yGAAyG;IACzG,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,2GAA2G;IAC3G,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,MAAM,SAAS,GAAG,KAAK,EAAE,OAAe,EAAE,CAA4B,EAAE,EAAE;QACxE,IAAI,OAAO,KAAK,KAAK;YAAE,OAAO,IAAI,CAAC;QACnC,IAAI,CAAC,CAAC,YAAY;YAAE,MAAM,WAAW,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;QAC/F,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,4GAA4G;IAC5G,2GAA2G;IAC3G,sDAAsD;IACtD,IAAI,MAAM,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;IAE/B,sGAAsG;IACtG,IAAI,UAAU,GAAkC,IAAI,CAAC;IACrD;;;;;OAKG;IACH,KAAK,UAAU,KAAK,CAAC,KAAK,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK;QAC9C,MAAM,CAAC,GAAG,OAAO,CAAC;QAClB,IAAI,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QACpB,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,oBAAoB,IAAI,EAAE,CAAC;YAAE,OAAO,CAAC,CAAC;QACvE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACV,IAAI,CAAC,CAAC,GAAG,GAAG,GAAG,EAAE;gBAAE,OAAO,CAAC,CAAC;YAC5B,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,OAAO,CAAC,OAAO;YAAE,OAAO,CAAC,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACrD,MAAM,OAAO,GAAG,KAAK,CAAC;QACtB,UAAU,KAAK,CAAC,KAAK,IAAI,EAAE;YACzB,IAAI,CAAC;gBACH,IAAI,CAAC,CAAC;gBACN,IAAI,CAAC;oBACH,CAAC,GAAG,MAAM,aAAa,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,EAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACvF,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,oGAAoG;oBACpG,4FAA4F;oBAC5F,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;wBACpB,IAAI,OAAO,KAAK,KAAK;4BAAE,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;wBACxC,OAAO,OAAO,CAAC;oBACjB,CAAC;oBACD,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;oBAClB,OAAO,CAAC,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAClC,CAAC;gBACD,OAAO,CAAC,SAAS,EAAE,CAAC;gBACpB,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;oBAAE,OAAO,OAAO,CAAC;gBACnD,oGAAoG;gBACpG,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC;oBAClF,IAAI,CAAC,CAAC,YAAY;wBAAE,MAAM,WAAW,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;oBAC/F,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;oBACjB,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC;gBAC7B,8FAA8F;gBAC9F,mGAAmG;gBACnG,wFAAwF;gBACxF,MAAM,IAAI,GAAW,EAAE,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrG,iGAAiG;gBACjG,6FAA6F;gBAC7F,MAAM,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;gBACzC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjB,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;gBAC5D,mGAAmG;gBACnG,IAAI,OAAO,KAAK,KAAK,IAAI,OAAO,KAAK,IAAI;oBAAE,OAAO,OAAO,CAAC;gBAC1D,IAAI,CAAC,CAAC;oBAAE,OAAO,IAAI,CAAC;gBACpB,MAAM,KAAK,GAAW,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC;gBACrC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClB,OAAO,KAAK,CAAC;YACf,CAAC;oBAAS,CAAC;gBACT,UAAU,GAAG,IAAI,CAAC;YACpB,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;QACL,MAAM,IAAI,GAAG,UAAU,CAAC;QACxB,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,GAAG,EAAE;YAAE,OAAO,IAAI,CAAC;QACjD,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,sEAAsE;QACnG,OAAO,CAAC,CAAC;IACX,CAAC;IAED,0GAA0G;IAC1G,SAAS,YAAY,CAAC,KAAa,EAAE,KAAa;QAChD,MAAM,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QAC7B,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACnD,IAAI,CAAC,CAAC,GAAG,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,IAAI,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ;YACnJ,MAAM,IAAI,UAAU,CAAC,kBAAkB,EAAE,uCAAuC,CAAC,CAAC;IACtF,CAAC;IAED;;;;OAIG;IACH,KAAK,UAAU,UAAU,CAAI,IAA4B,EAAE,IAA6B;QACtF,IAAI,GAAa,CAAC;QAClB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,MAAM,eAAe,IAAI,EAAE,EAAE;gBAC/E,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,EAAE,kBAAkB,EAAE;gBAC3E,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,QAAQ,EAAE,GAAG,IAAI,EAAE,CAAC;aACzD,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,IAAI,UAAU,CAAC,yBAAyB,EAAE,mBAAmB,MAAM,KAAM,CAAW,EAAE,OAAO,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACnH,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAA4B,CAAC;QAC7E,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,kHAAkH;YAClH,0GAA0G;YAC1G,MAAM,IAAI,GACR,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI;gBACzC,CAAC,CAAC,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK;oBAC7C,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,mBAAmB;wBAC1C,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,yBAAyB;4BAC/C,CAAC,CAAC,kBAAkB,CAAC;YACvB,MAAM,OAAO,GAAG,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,iBAAiB,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC;YAClJ,MAAM,IAAI,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO,IAAS,CAAC;IACnB,CAAC;IAED;yEACqE;IACrE,KAAK,UAAU,aAAa,CAAC,KAAa;QACxC,MAAM,CAAC,GAAG,MAAM,UAAU,CAAyB,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5E,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;IAC3C,CAAC;IAED;;;OAGG;IACH,KAAK,UAAU,mBAAmB,CAAC,KAAa,EAAE,IAAY;QAC5D,MAAM,OAAO,GAAG,KAAK,CAAC;QACtB,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACxC,MAAM,CAAC,GAAG,MAAM,UAAU,CAA0B,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC3G,IAAI,OAAO,CAAC,CAAC,YAAY,KAAK,QAAQ;YAAE,MAAM,IAAI,UAAU,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC;QACrG,MAAM,MAAM,GAAa;YACvB,WAAW,EAAE,CAAC,CAAC,YAAY;YAC3B,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC;YAC1E,GAAG,CAAC,OAAO,CAAC,CAAC,aAAa,KAAK,QAAQ,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC;YAC7E,GAAG,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;SAC/D,CAAC;QACF,OAAO,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC;IAED;;;;;OAKG;IACH,KAAK,UAAU,KAAK,CAAC,OAAe,EAAE,CAAW,EAAE,KAAa;QAC9D,IAAI,CAAC;YACH,IAAI,CAAC,CAAC,CAAC,OAAO;gBAAE,MAAM,IAAI,UAAU,CAAC,kBAAkB,EAAE,8CAA8C,CAAC,CAAC;YACzG,YAAY,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,CAAC,YAAY;gBAAE,MAAM,WAAW,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;YAC/F,MAAM,CAAC,CAAC;QACV,CAAC;QACD,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC;QACnE,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QACjD,KAAK,EAAE,CAAC;QACR,sGAAsG;QACtG,uGAAuG;QACvG,yGAAyG;QACzG,gGAAgG;QAChG,MAAM,QAAQ,GAAG,OAAO,CAAC;QACzB,MAAM,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1F,IAAI,QAAQ,EAAE,EAAE,IAAI,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC,YAAY;YAAE,MAAM,WAAW,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;QAC5H,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,UAAU,MAAM,CAAC,MAAiB;QACrC,MAAM,OAAO,GAAG,KAAK,CAAC;QACtB,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC3D,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,gBAAgB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QAC3K,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC;QAC9D,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC,CAAC,0BAA0B;QAClE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,CAAC,KAAK,KAAK,QAAQ;YAAE,MAAM,IAAI,UAAU,CAAC,eAAe,EAAE,6CAA6C,CAAC,CAAC;QAC/G,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;YACZ,IAAI,CAAC,CAAC,KAAK,KAAK,eAAe;gBAAE,OAAO,KAAK,CAAC;YAC9C,MAAM,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,iBAAiB,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,CAAC,CAAC,GAAG,KAAK,MAAM;YAAE,MAAM,IAAI,UAAU,CAAC,gBAAgB,EAAE,kDAAkD,CAAC,CAAC;QACjH,IAAI,CAAC,CAAC,CAAC,IAAI;YAAE,MAAM,IAAI,UAAU,CAAC,iBAAiB,EAAE,yBAAyB,CAAC,CAAC;QAChF,MAAM,CAAC,GAAG,MAAM,YAAY,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QACpI,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;IAClC,CAAC;IAED,OAAO;QACL,IAAI,KAAK;YACP,OAAO,KAAK,CAAC;QACf,CAAC;QACD,SAAS,CAAC,CAA6B;YACrC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACjB,OAAO,GAAG,EAAE;gBACV,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACtB,CAAC,CAAC;QACJ,CAAC;QACD,0GAA0G;QAC1G,KAAK,CAAC,IAAI;YACR,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACjC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC,CAAC,CAAC,IAAI,CAAC;gBACnD,OAAO,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC5G,IAAI,OAAO;oBAAE,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACvC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,GAAG,IAAI,CAAC;YACjB,CAAC;YACD,mGAAmG;YACnG,OAAO,EAAE,CAAC;YACV,MAAM,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACzB,OAAO,EAAE,CAAC;YACV,OAAO,KAAK,CAAC;QACf,CAAC;QACD,2GAA2G;QAC3G,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE;QACtB,8FAA8F;QAC9F,aAAa;QACb,mBAAmB;QACnB,wCAAwC;QACxC,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC9B;;;;;;;WAOG;QACH,KAAK,CAAC,QAAQ,CAAC,IAAI,GAA+B,EAAE;YAClD,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI;gBAAE,OAAO,CAAC,MAAM,KAAK,EAAE,CAAC,EAAE,EAAE,IAAI,IAAI,CAAC;YACnE,MAAM,CAAC,GAAG,OAAO,CAAC;YAClB,IAAI,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC;YACpB,IAAI,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,EAAE,GAAG,iBAAiB;gBAAE,OAAO,CAAC,CAAC,EAAE,CAAC;YAClF,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;YAClB,MAAM,KAAK,GAAG,OAAwB,CAAC;YACvC,IAAI,CAAC,KAAK;gBAAE,OAAO,IAAI,CAAC;YACxB,IAAI,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE;gBAAE,MAAM,IAAI,UAAU,CAAC,yBAAyB,EAAE,sFAAsF,EAAE,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACrO,OAAO,KAAK,CAAC,EAAE,CAAC;QAClB,CAAC;QACD,gGAAgG;QAChG,KAAK,CAAC,OAAO,CAAC,IAAI,GAA6B,EAAE;YAC/C,MAAM,CAAC,GAAG,OAAO,CAAC;YAClB,KAAK,EAAE,CAAC,CAAC,2DAA2D;YACpE,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;YACjB,IAAI,CAAC,EAAE,EAAE;gBAAE,MAAM,WAAW,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;YAC5E,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,KAAK,KAAK;gBAChC,MAAM,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,qBAAqB,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACpL,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -4,5 +4,5 @@ export { SignedIn, SignedOut, useAuth, useUser, type AccountsProviderProps } fro
4
4
  export { completeSignIn };
5
5
  /** What getToken({ forceRefresh: true }) throws when no new token can be had now (error "temporarily_unavailable"). */
6
6
  export { OAuthError } from "@iaurelius/accounts/oidc";
7
- export type { AccountsState, SessionUser } from "./core.js";
7
+ export type { AccountsState, Organization, SessionUser } from "./core.js";
8
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAsB,cAAc,EAA6C,MAAM,WAAW,CAAC;AAG1G,eAAO,MAAM,gBAAgB,oKAA4G,CAAC;AAC1I,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAC/F,OAAO,EAAE,cAAc,EAAE,CAAC;AAC1B,uHAAuH;AACvH,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAsB,cAAc,EAA6C,MAAM,WAAW,CAAC;AAG1G,eAAO,MAAM,gBAAgB,oKAA4G,CAAC;AAC1I,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAC/F,OAAO,EAAE,cAAc,EAAE,CAAC;AAC1B,uHAAuH;AACvH,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC"}
package/dist/react.d.ts CHANGED
@@ -28,6 +28,10 @@ export declare function useAuth(): {
28
28
  isSignedIn: boolean;
29
29
  userId: string | null;
30
30
  sessionId: string | null;
31
+ /** The organization the session is in (its slug), when your API's token says so. */
32
+ organization: string | null;
33
+ /** Signing in on your own screen with an organization left to choose: the ones to offer. Null otherwise. */
34
+ organizationChoice: import("./core.js").Organization[] | null;
31
35
  getToken: (opts?: {
32
36
  forceRefresh?: boolean;
33
37
  }) => Promise<string | null>;
@@ -37,6 +41,9 @@ export declare function useAuth(): {
37
41
  waitlist: boolean;
38
42
  }>;
39
43
  signInWithEmailCode: (email: string, code: string) => Promise<AccountsState>;
44
+ chooseOrganization: (slug: string) => Promise<AccountsState>;
45
+ listOrganizations: () => Promise<import("./core.js").Organization[]>;
46
+ switchOrganization: (slug: string) => Promise<AccountsState>;
40
47
  signOut: (opts?: {
41
48
  endSession?: boolean;
42
49
  }) => Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../src/react.tsx"],"names":[],"mappings":"AACA,OAAO,EAA2D,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAChG,OAAO,EAA6C,KAAK,aAAa,EAAE,KAAK,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAInI,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,oHAAoH;IACpH,cAAc,EAAE,MAAM,CAAC;IACvB,qEAAqE;IACrE,QAAQ,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6FAA6F;IAC7F,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,+EAA+E;IAC/E,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,oFAAoF;AACpF,MAAM,MAAM,QAAQ,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;CAAE,CAAC;AAEnJ,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,2FACmF,qBAAqB,iCActJ;AAQD,wBAAgB,OAAO;IAGnB,QAAQ;IACR,UAAU;IACV,MAAM;IACN,SAAS;IACT,QAAQ;;;IACR,MAAM;IACN,MAAM;IACN,aAAa;;;IACb,mBAAmB;IACnB,OAAO;;;EAEV;AAED,wBAAgB,OAAO;IAEZ,QAAQ;IAAkB,UAAU;IAAoB,IAAI;EACtE;AAED,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,sCAG9D;AAED,wBAAgB,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,sCAG/D"}
1
+ {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../src/react.tsx"],"names":[],"mappings":"AACA,OAAO,EAA2D,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAChG,OAAO,EAA6C,KAAK,aAAa,EAAE,KAAK,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAInI,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,oHAAoH;IACpH,cAAc,EAAE,MAAM,CAAC;IACvB,qEAAqE;IACrE,QAAQ,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6FAA6F;IAC7F,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,+EAA+E;IAC/E,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,oFAAoF;AACpF,MAAM,MAAM,QAAQ,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;CAAE,CAAC;AAEnJ,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,2FACmF,qBAAqB,iCActJ;AAQD,wBAAgB,OAAO;IAGnB,QAAQ;IACR,UAAU;IACV,MAAM;IACN,SAAS;IACT,oFAAoF;IACpF,YAAY;IACZ,4GAA4G;IAC5G,kBAAkB;IAClB,QAAQ;;;IACR,MAAM;IACN,MAAM;IACN,aAAa;;;IACb,mBAAmB;IACnB,kBAAkB;IAClB,iBAAiB;IACjB,kBAAkB;IAClB,OAAO;;;EAEV;AAED,wBAAgB,OAAO;IAEZ,QAAQ;IAAkB,UAAU;IAAoB,IAAI;EACtE;AAED,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,sCAG9D;AAED,wBAAgB,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,sCAG/D"}
package/dist/react.js CHANGED
@@ -28,11 +28,18 @@ export function useAuth() {
28
28
  isSignedIn: state.isSignedIn,
29
29
  userId: state.user?.id ?? null,
30
30
  sessionId: state.sessionId,
31
+ /** The organization the session is in (its slug), when your API's token says so. */
32
+ organization: state.organization,
33
+ /** Signing in on your own screen with an organization left to choose: the ones to offer. Null otherwise. */
34
+ organizationChoice: state.organizationChoice,
31
35
  getToken: client.getToken,
32
36
  signIn: client.signIn,
33
37
  signUp: client.signUp,
34
38
  sendEmailCode: client.sendEmailCode,
35
39
  signInWithEmailCode: client.signInWithEmailCode,
40
+ chooseOrganization: client.chooseOrganization,
41
+ listOrganizations: client.listOrganizations,
42
+ switchOrganization: client.switchOrganization,
36
43
  signOut: client.signOut,
37
44
  };
38
45
  }
package/dist/react.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"react.js","sourceRoot":"","sources":["../src/react.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"react.js","sourceRoot":"","sources":["../src/react.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iaurelius/accounts-expo",
3
- "version": "0.4.1",
3
+ "version": "0.5.0",
4
4
  "description": "Accounts by iAurelius for Expo: sign-in on the hosted page in an authentication session, tokens in SecureStore, useAuth() and getToken() that refreshes itself.",
5
5
  "keywords": [
6
6
  "auth",
@@ -35,7 +35,7 @@
35
35
  "typecheck": "tsc -p tsconfig.json --noEmit"
36
36
  },
37
37
  "dependencies": {
38
- "@iaurelius/accounts": "^0.4.1"
38
+ "@iaurelius/accounts": "^0.5.0"
39
39
  },
40
40
  "peerDependencies": {
41
41
  "expo-crypto": "*",