@openstax/ts-utils 1.1.4 → 1.1.6

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.
@@ -46,7 +46,7 @@ interface MakeApiGateway<F> {
46
46
  <Ru>(config: ConfigProviderForConfig<{
47
47
  apiBase: string;
48
48
  }>, routes: MapRoutesToConfig<Ru>, authProvider?: {
49
- getAuthorizedFetchConfig: () => ConfigForFetch<F>;
49
+ getAuthorizedFetchConfig: () => Promise<ConfigForFetch<F>>;
50
50
  }): MapRoutesToClient<Ru>;
51
51
  }
52
52
  export declare const createApiGateway: <F extends GenericFetch<import("../../fetch").FetchConfig, Response>>(initializer: {
@@ -53,7 +53,7 @@ const makeRouteClient = (initializer, config, route, authProvider) => {
53
53
  const routeClient = async ({ params, payload, query, fetchConfig }) => {
54
54
  const url = await renderUrl({ params, query });
55
55
  const body = payload ? JSON.stringify(payload) : undefined;
56
- const baseOptions = (0, __1.merge)((authProvider === null || authProvider === void 0 ? void 0 : authProvider.getAuthorizedFetchConfig()) || {}, fetchConfig || {});
56
+ const baseOptions = (0, __1.merge)((await (authProvider === null || authProvider === void 0 ? void 0 : authProvider.getAuthorizedFetchConfig())) || {}, fetchConfig || {});
57
57
  return initializer.fetch(url, (0, __1.merge)(baseOptions, {
58
58
  method: route.method,
59
59
  body,
@@ -47,20 +47,14 @@ export declare const browserAuthProvider: <C extends string = "auth">({ window,
47
47
  /**
48
48
  * gets an authorized url for an iframe src. sets params on the url and saves its
49
49
  * origin to trust releasing user identity to it
50
- *
51
- * result unreliable unless `getUser` is resolved first.
52
50
  */
53
51
  getAuthorizedEmbedUrl: (urlString: string) => string;
54
52
  /**
55
53
  * gets second argument for `fetch` that has authentication token or cookie
56
- *
57
- * result unreliable unless `getUser` is resolved first.
58
54
  */
59
- getAuthorizedFetchConfig: () => FetchConfig;
55
+ getAuthorizedFetchConfig: () => Promise<FetchConfig>;
60
56
  /**
61
57
  * loads current user identity. does not reflect changes in identity after being called the first time.
62
- *
63
- * result unreliable unless `getUser` is resolved first.
64
58
  */
65
59
  getUser: () => Promise<User | undefined>;
66
60
  };
@@ -25,8 +25,8 @@ const browserAuthProvider = ({ window, configSpace }) => (configProvider) => {
25
25
  };
26
26
  window.addEventListener('message', event => {
27
27
  if (event.data.type === PostMessageTypes.RequestUser && trustedEmbeds.has(event.origin)) {
28
- getUser().then(() => {
29
- event.source.postMessage({ type: PostMessageTypes.ReceiveUser, userData }, event.origin);
28
+ getUserData().then(data => {
29
+ event.source.postMessage({ type: PostMessageTypes.ReceiveUser, userData: data }, event.origin);
30
30
  });
31
31
  }
32
32
  });
@@ -53,10 +53,16 @@ const browserAuthProvider = ({ window, configSpace }) => (configProvider) => {
53
53
  // *note* that this does not actually prevent cookies from being sent on same-origin
54
54
  // requests, i'm not sure if its possible to stop browsers from sending cookies in
55
55
  // that case
56
- const getAuthorizedFetchConfig = () => userData.token ? {
57
- headers: { Authorization: `Bearer ${userData.token}` },
58
- } : {
59
- credentials: 'include',
56
+ const getAuthorizedFetchConfigFromData = (data) => {
57
+ const { token } = data;
58
+ return token ? {
59
+ headers: { Authorization: `Bearer ${token}` },
60
+ } : {
61
+ credentials: 'include',
62
+ };
63
+ };
64
+ const getAuthorizedFetchConfig = async () => {
65
+ return getAuthorizedFetchConfigFromData(userData.token ? userData : await getUserData());
60
66
  };
61
67
  /*
62
68
  * requests user identity from parent window via postMessage
@@ -83,16 +89,19 @@ const browserAuthProvider = ({ window, configSpace }) => (configProvider) => {
83
89
  * requests user identity from accounts api using given token or cookie
84
90
  */
85
91
  const getFetchUser = async () => {
86
- return await window.fetch((await accountsUrl).replace(/\/+$/, '') + '/accounts/api/user', getAuthorizedFetchConfig())
92
+ return await window.fetch((await accountsUrl).replace(/\/+$/, '') + '/accounts/api/user', getAuthorizedFetchConfigFromData(userData))
87
93
  .then(response => response.status === 200 ? response.json() : undefined)
88
94
  .then(user => ({ ...userData, user }));
89
95
  };
90
- const getUser = (0, __1.once)(async () => {
96
+ const getUserData = (0, __1.once)(async () => {
91
97
  userData = authQuery === embeddedQueryValue
92
98
  ? await getParentWindowUser()
93
99
  : await getFetchUser();
94
- return userData.user;
100
+ return userData;
95
101
  });
102
+ const getUser = async () => {
103
+ return (await getUserData()).user;
104
+ };
96
105
  return {
97
106
  /**
98
107
  * adds auth parameters to the url. this is only safe to use when using javascript to navigate
@@ -111,20 +120,14 @@ const browserAuthProvider = ({ window, configSpace }) => (configProvider) => {
111
120
  /**
112
121
  * gets an authorized url for an iframe src. sets params on the url and saves its
113
122
  * origin to trust releasing user identity to it
114
- *
115
- * result unreliable unless `getUser` is resolved first.
116
123
  */
117
124
  getAuthorizedEmbedUrl,
118
125
  /**
119
126
  * gets second argument for `fetch` that has authentication token or cookie
120
- *
121
- * result unreliable unless `getUser` is resolved first.
122
127
  */
123
128
  getAuthorizedFetchConfig,
124
129
  /**
125
130
  * loads current user identity. does not reflect changes in identity after being called the first time.
126
- *
127
- * result unreliable unless `getUser` is resolved first.
128
131
  */
129
132
  getUser
130
133
  };
@@ -25,8 +25,15 @@ const decryptionAuthProvider = (initializer) => (configProvider) => {
25
25
  };
26
26
  return (request) => {
27
27
  let user;
28
+ const getAuthorizedFetchConfig = async () => {
29
+ const [token, headers] = (0, _1.getAuthTokenOrCookie)(request, await cookieName);
30
+ if (!token) {
31
+ return {};
32
+ }
33
+ return { headers };
34
+ };
28
35
  const loadUser = async () => {
29
- const token = (0, _1.getAuthTokenOrCookie)(request, await cookieName);
36
+ const [token] = (0, _1.getAuthTokenOrCookie)(request, await cookieName);
30
37
  if (!token) {
31
38
  return undefined;
32
39
  }
@@ -44,6 +51,7 @@ const decryptionAuthProvider = (initializer) => (configProvider) => {
44
51
  return jwt.sub;
45
52
  };
46
53
  return {
54
+ getAuthorizedFetchConfig,
47
55
  getUser: async () => {
48
56
  if (!user) {
49
57
  user = await loadUser();
@@ -1,3 +1,4 @@
1
+ import { FetchConfig } from '../../fetch';
1
2
  import { HttpHeaders } from '../../routing';
2
3
  export interface User {
3
4
  name: string;
@@ -17,6 +18,10 @@ export interface User {
17
18
  }
18
19
  export declare type AuthProvider = {
19
20
  getUser: () => Promise<User | undefined>;
21
+ /**
22
+ * gets second argument for `fetch` that has authentication token or cookie
23
+ */
24
+ getAuthorizedFetchConfig: () => Promise<FetchConfig>;
20
25
  };
21
26
  export declare type CookieAuthProviderRequest = {
22
27
  headers: HttpHeaders;
@@ -24,14 +29,9 @@ export declare type CookieAuthProviderRequest = {
24
29
  };
25
30
  export declare type CookieAuthProvider = (request: CookieAuthProviderRequest) => AuthProvider;
26
31
  export declare type StubAuthProvider = (user: User | undefined) => AuthProvider;
27
- export declare const stubAuthProvider: (user?: User | undefined) => {
28
- getUser: () => Promise<User | undefined>;
29
- getAuthorizedFetchConfig: () => {
30
- headers: {
31
- Authorization: string;
32
- };
33
- } | {
34
- headers?: undefined;
35
- };
36
- };
37
- export declare const getAuthTokenOrCookie: (request: CookieAuthProviderRequest, cookieName: string) => string;
32
+ export declare const stubAuthProvider: (user?: User | undefined) => AuthProvider;
33
+ export declare const getAuthTokenOrCookie: (request: CookieAuthProviderRequest, cookieName: string) => [string, {
34
+ Authorization: string;
35
+ }] | [string, {
36
+ cookie: string;
37
+ }];
@@ -5,13 +5,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.getAuthTokenOrCookie = exports.stubAuthProvider = void 0;
7
7
  const cookie_1 = __importDefault(require("cookie"));
8
+ const __1 = require("../..");
8
9
  const routing_1 = require("../../routing");
9
- const stubAuthProvider = (user) => ({ getUser: () => Promise.resolve(user), getAuthorizedFetchConfig: () => (user ? { headers: { Authorization: user.uuid } } : {}) });
10
+ const stubAuthProvider = (user) => ({
11
+ getUser: () => Promise.resolve(user),
12
+ getAuthorizedFetchConfig: () => Promise.resolve(user ? { headers: { Authorization: user.uuid } } : {})
13
+ });
10
14
  exports.stubAuthProvider = stubAuthProvider;
11
15
  const getAuthTokenOrCookie = (request, cookieName) => {
12
16
  var _a;
13
17
  const authHeader = (0, routing_1.getHeader)(request.headers, 'authorization');
14
- return authHeader && authHeader.length >= 8 && authHeader.startsWith('Bearer ') ?
15
- authHeader.slice(7) : cookie_1.default.parse(((_a = request.cookies) === null || _a === void 0 ? void 0 : _a.join('; ')) || '')[cookieName];
18
+ const cookieValue = cookie_1.default.parse(((_a = request.cookies) === null || _a === void 0 ? void 0 : _a.join('; ')) || '')[cookieName];
19
+ return authHeader && authHeader.length >= 8 && authHeader.startsWith('Bearer ')
20
+ ? (0, __1.tuple)(authHeader.slice(7), { Authorization: authHeader })
21
+ : (0, __1.tuple)(cookieValue, { cookie: cookie_1.default.serialize(cookieName, cookieValue) });
16
22
  };
17
23
  exports.getAuthTokenOrCookie = getAuthTokenOrCookie;
@@ -1,10 +1,6 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.subrequestAuthProvider = void 0;
7
- const cookie_1 = __importDefault(require("cookie"));
8
4
  const config_1 = require("../../config");
9
5
  const guards_1 = require("../../guards");
10
6
  const _1 = require(".");
@@ -14,19 +10,23 @@ const subrequestAuthProvider = (initializer) => (configProvider) => {
14
10
  const accountsUrl = (0, config_1.resolveConfigValue)(config.accountsUrl);
15
11
  return (request) => {
16
12
  let user;
13
+ const getAuthorizedFetchConfig = async () => {
14
+ const [token, headers] = (0, _1.getAuthTokenOrCookie)(request, await cookieName);
15
+ if (!token) {
16
+ return {};
17
+ }
18
+ return { headers };
19
+ };
17
20
  const loadUser = async () => {
18
- const token = (0, _1.getAuthTokenOrCookie)(request, await cookieName);
21
+ const [token, headers] = (0, _1.getAuthTokenOrCookie)(request, await cookieName);
19
22
  if (!token) {
20
23
  return undefined;
21
24
  }
22
- return initializer.fetch(await accountsUrl, {
23
- headers: {
24
- cookie: cookie_1.default.serialize(await cookieName, token)
25
- }
26
- })
25
+ return initializer.fetch(await accountsUrl, { headers })
27
26
  .then(response => response.json());
28
27
  };
29
28
  return {
29
+ getAuthorizedFetchConfig,
30
30
  getUser: async () => {
31
31
  if (!user) {
32
32
  user = await loadUser();