@nitra/vite-boot 2.1.4 → 2.1.7

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nitra/vite-boot",
3
- "version": "2.1.4",
3
+ "version": "2.1.7",
4
4
  "description": "Vite boot",
5
5
  "type": "module",
6
6
  "exports": {
package/src/apollo.js CHANGED
@@ -6,91 +6,76 @@ import { refreshToken } from './token.js'
6
6
  import { GraphQLWsLink } from '@apollo/client/link/subscriptions'
7
7
  import jwtDecode from '@nitra/jwt-decode'
8
8
 
9
+ export let apolloClient
10
+
9
11
  const consola = createLogger(import.meta.url)
10
12
 
11
13
  const token = localStorage.getItem('token')
12
14
 
13
- consola.debug('token a: ', token)
14
- console.log('token d: ', token)
15
15
  if (!token) {
16
- window.location.replace('/logout')
17
- }
16
+ consola.debug('Skip Apollo boot')
17
+ } else {
18
+ const tokenDecoded = jwtDecode(token)
18
19
 
19
- // Перевіряємо чи не старий токен знаходиться в localStorage
20
- const tokenDecoded = jwtDecode(token)
21
-
22
- if (tokenDecoded.exp < Math.floor(Date.now() / 1000)) {
23
- refreshToken()
24
- }
25
-
26
- const wsClient = createClient({
27
- url: `${import.meta.env.VITE_HASURA_PROTOCOL}://${import.meta.env.VITE_HASURA_HOST}/v1/graphql`,
28
- disablePong: true,
29
- connectionParams: () => {
30
- // const session = getSession();
31
- // if (!session) {
32
- // return {};
33
- // }
34
- return {
35
- headers: {
36
- Authorization: `Bearer ${token}`,
37
- 'x-hasura-role': import.meta.env.VITE_HASURA_ROLE
20
+ if (
21
+ !tokenDecoded['https://hasura.io/jwt/claims']['x-hasura-allowed-roles'].includes(import.meta.env.VITE_HASURA_ROLE)
22
+ ) {
23
+ // Не дозволена роль поточного користувача в поточному прикладенні
24
+ window.location.replace('/logout')
25
+ } else if (tokenDecoded.exp < Math.floor(Date.now() / 1000)) {
26
+ // Перевіряємо чи не старий токен знаходиться в localStorage
27
+ await refreshToken()
28
+ } else {
29
+ const wsClient = createClient({
30
+ url: `${import.meta.env.VITE_HASURA_PROTOCOL}://${import.meta.env.VITE_HASURA_HOST}/v1/graphql`,
31
+ disablePong: true,
32
+ connectionParams: () => {
33
+ return {
34
+ headers: {
35
+ Authorization: `Bearer ${token}`,
36
+ 'x-hasura-role': import.meta.env.VITE_HASURA_ROLE
37
+ }
38
+ }
38
39
  }
39
- }
40
- }
41
- })
40
+ })
42
41
 
43
- const wsLink = new GraphQLWsLink(wsClient)
42
+ const wsLink = new GraphQLWsLink(wsClient)
44
43
 
45
- const errorLink = onError(({ graphQLErrors, networkError, _operation, _forward }) => {
46
- if (graphQLErrors) {
47
- for (const err of graphQLErrors) {
48
- consola.debug('graphQLErrors: ', err)
44
+ const errorLink = onError(({ graphQLErrors, networkError, _operation, _forward }) => {
45
+ if (graphQLErrors) {
46
+ for (const err of graphQLErrors) {
47
+ consola.debug('graphQLErrors: ', err)
48
+ }
49
+ }
49
50
 
50
- // switch (err.extensions.code) {
51
- // // Apollo Server sets code to UNAUTHENTICATED
52
- // // when an AuthenticationError is thrown in a resolver
53
- // case 'UNAUTHENTICATED':
54
- // // Modify the operation context with a new token
55
- // const oldHeaders = operation.getContext().headers
56
- // operation.setContext({
57
- // headers: {
58
- // ...oldHeaders,
59
- // authorization: getNewToken()
60
- // }
61
- // })
62
- // // Retry the request, returning the new observable
63
- // return forward(operation)
64
- // }
65
- }
66
- }
51
+ // To retry on network errors, we recommend the RetryLink
52
+ // instead of the onError link. This just logs the error.
53
+ if (networkError) {
54
+ if (networkError?.message?.match('JWTExpired')) {
55
+ // ретрай токен
56
+ // и якщо цей користувач ще валідний в БД
57
+ // то видавати йому новий токен
58
+ // тобто ця перевірка універсальна
59
+ // не в залежності який типом авторизувався користувач
60
+ // а в залежності від того чи він валідний в БД
61
+ refreshToken()
62
+ } else {
63
+ console.log(`[Network error]: ${networkError}`)
64
+ }
65
+ }
66
+ })
67
67
 
68
- // To retry on network errors, we recommend the RetryLink
69
- // instead of the onError link. This just logs the error.
70
- if (networkError) {
71
- if (networkError?.message?.match('JWTExpired')) {
72
- // ретрай токен
73
- // и якщо цей користувач ще валідний в БД
74
- // то видавати йому новий токен
75
- // тобто ця перевірка універсальна
76
- // не в залежності який типом авторизувався користувач
77
- // а в залежності від того чи він валідний в БД
78
- refreshToken()
79
- } else {
80
- console.log(`[Network error]: ${networkError}`)
81
- }
82
- }
83
- })
68
+ // Create the apollo client
69
+ apolloClient = new ApolloClient({
70
+ link: from([errorLink, wsLink]),
71
+ cache: new InMemoryCache(),
72
+ defaultOptions: {
73
+ watchQuery: {
74
+ fetchPolicy: 'cache-and-network'
75
+ }
76
+ }
77
+ })
84
78
 
85
- // Create the apollo client
86
- export const apolloClient = new ApolloClient({
87
- link: from([errorLink, wsLink]),
88
- cache: new InMemoryCache(),
89
- defaultOptions: {
90
- watchQuery: {
91
- fetchPolicy: 'cache-and-network'
92
- }
79
+ consola.debug('End Apollo boot')
93
80
  }
94
- })
95
-
96
- consola.debug('End Apollo boot')
81
+ }
package/src/token.js CHANGED
@@ -37,7 +37,15 @@ export const refreshToken = async () => {
37
37
  // якщо токен прийшов - замінюємо його
38
38
  localStorage.setItem('token', result.token)
39
39
  // та перезавантажуємо щоб він вступив в дію
40
- window.location.reload()
40
+
41
+ // Якщо ми на сторінці логіну або логауту
42
+ const awayFrom = ['/login', '/logout']
43
+ if (awayFrom.includes(window.location.pathname)) {
44
+ // то переводимо в корінь
45
+ window.location.replace('/')
46
+ } else {
47
+ window.location.reload()
48
+ }
41
49
  } else {
42
50
  // інакше вихід
43
51
  window.location.replace('/logout')