@cloudcare/browser-core 3.2.4 → 3.2.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.
Files changed (67) hide show
  1. package/cjs/browser/cookie.js +14 -9
  2. package/cjs/browser/cookie.js.map +1 -1
  3. package/cjs/configuration/configuration.js +3 -24
  4. package/cjs/configuration/configuration.js.map +1 -1
  5. package/cjs/index.js +90 -41
  6. package/cjs/index.js.map +1 -1
  7. package/cjs/init.js +0 -19
  8. package/cjs/init.js.map +1 -1
  9. package/cjs/session/sessionConstants.js +3 -1
  10. package/cjs/session/sessionConstants.js.map +1 -1
  11. package/cjs/session/sessionInCookie.js +59 -0
  12. package/cjs/session/sessionInCookie.js.map +1 -0
  13. package/cjs/session/sessionInLocalStorage.js +44 -0
  14. package/cjs/session/sessionInLocalStorage.js.map +1 -0
  15. package/cjs/session/sessionManagement.js +38 -31
  16. package/cjs/session/sessionManagement.js.map +1 -1
  17. package/cjs/session/sessionState.js +73 -0
  18. package/cjs/session/sessionState.js.map +1 -0
  19. package/cjs/session/sessionStore.js +113 -90
  20. package/cjs/session/sessionStore.js.map +1 -1
  21. package/cjs/session/sessionStoreOperations.js +117 -0
  22. package/cjs/session/sessionStoreOperations.js.map +1 -0
  23. package/esm/browser/cookie.js +15 -8
  24. package/esm/browser/cookie.js.map +1 -1
  25. package/esm/configuration/configuration.js +3 -23
  26. package/esm/configuration/configuration.js.map +1 -1
  27. package/esm/index.js +3 -4
  28. package/esm/index.js.map +1 -1
  29. package/esm/init.js +0 -19
  30. package/esm/init.js.map +1 -1
  31. package/esm/session/sessionConstants.js +1 -0
  32. package/esm/session/sessionConstants.js.map +1 -1
  33. package/esm/session/sessionInCookie.js +51 -0
  34. package/esm/session/sessionInCookie.js.map +1 -0
  35. package/esm/session/sessionInLocalStorage.js +37 -0
  36. package/esm/session/sessionInLocalStorage.js.map +1 -0
  37. package/esm/session/sessionManagement.js +35 -28
  38. package/esm/session/sessionManagement.js.map +1 -1
  39. package/esm/session/sessionState.js +59 -0
  40. package/esm/session/sessionState.js.map +1 -0
  41. package/esm/session/sessionStore.js +113 -90
  42. package/esm/session/sessionStore.js.map +1 -1
  43. package/esm/session/sessionStoreOperations.js +108 -0
  44. package/esm/session/sessionStoreOperations.js.map +1 -0
  45. package/package.json +2 -2
  46. package/src/browser/cookie.js +23 -11
  47. package/src/configuration/configuration.js +8 -32
  48. package/src/index.js +9 -4
  49. package/src/init.js +0 -19
  50. package/src/session/sessionConstants.js +1 -0
  51. package/src/session/sessionInCookie.js +87 -0
  52. package/src/session/sessionInLocalStorage.js +45 -0
  53. package/src/session/sessionManagement.js +48 -36
  54. package/src/session/sessionState.js +72 -0
  55. package/src/session/sessionStore.js +163 -108
  56. package/src/session/sessionStoreOperations.js +134 -0
  57. package/types/index.d.ts +4 -0
  58. package/cjs/session/sessionCookieStore.js +0 -156
  59. package/cjs/session/sessionCookieStore.js.map +0 -1
  60. package/cjs/synthetics/usr.js +0 -26
  61. package/cjs/synthetics/usr.js.map +0 -1
  62. package/esm/session/sessionCookieStore.js +0 -142
  63. package/esm/session/sessionCookieStore.js.map +0 -1
  64. package/esm/synthetics/usr.js +0 -17
  65. package/esm/synthetics/usr.js.map +0 -1
  66. package/src/session/sessionCookieStore.js +0 -169
  67. package/src/synthetics/usr.js +0 -18
@@ -1,3 +1,4 @@
1
1
  import { ONE_HOUR, ONE_MINUTE } from '../helper/tools'
2
2
  export var SESSION_TIME_OUT_DELAY = 4 * ONE_HOUR
3
3
  export var SESSION_EXPIRATION_DELAY = 15 * ONE_MINUTE
4
+ export var SESSION_STORE_KEY = '_gc_s'
@@ -0,0 +1,87 @@
1
+ import { isChromium } from '../helper/tools'
2
+ import {
3
+ getCurrentSite,
4
+ areCookiesAuthorized,
5
+ getCookie,
6
+ setCookie
7
+ } from '../browser/cookie'
8
+ import {
9
+ SESSION_EXPIRATION_DELAY,
10
+ SESSION_TIME_OUT_DELAY,
11
+ SESSION_STORE_KEY
12
+ } from './sessionConstants'
13
+ import {
14
+ toSessionString,
15
+ toSessionState,
16
+ getExpiredSessionState
17
+ } from './sessionState'
18
+
19
+ export function selectCookieStrategy(initConfiguration) {
20
+ const cookieOptions = buildCookieOptions(initConfiguration)
21
+ return areCookiesAuthorized(cookieOptions)
22
+ ? { type: 'Cookie', cookieOptions }
23
+ : undefined
24
+ }
25
+
26
+ export function initCookieStrategy(cookieOptions) {
27
+ const cookieStore = {
28
+ /**
29
+ * Lock strategy allows mitigating issues due to concurrent access to cookie.
30
+ * This issue concerns only chromium browsers and enabling this on firefox increases cookie write failures.
31
+ */
32
+ isLockEnabled: isChromium(),
33
+ persistSession: persistSessionCookie(cookieOptions),
34
+ retrieveSession: retrieveSessionCookie(cookieOptions),
35
+ expireSession: function () {
36
+ return expireSessionCookie(cookieOptions)
37
+ }
38
+ }
39
+ return cookieStore
40
+ }
41
+
42
+ function persistSessionCookie(options) {
43
+ return function (session) {
44
+ setCookie(
45
+ SESSION_STORE_KEY,
46
+ toSessionString(session),
47
+ SESSION_EXPIRATION_DELAY,
48
+ options
49
+ )
50
+ }
51
+ }
52
+
53
+ function expireSessionCookie(options) {
54
+ setCookie(
55
+ SESSION_STORE_KEY,
56
+ toSessionString(getExpiredSessionState()),
57
+ SESSION_TIME_OUT_DELAY,
58
+ options
59
+ )
60
+ }
61
+
62
+ function retrieveSessionCookie(options) {
63
+ return function () {
64
+ var sessionString = getCookie(SESSION_STORE_KEY, options)
65
+ return toSessionState(sessionString)
66
+ }
67
+ }
68
+
69
+ export function buildCookieOptions(initConfiguration) {
70
+ const cookieOptions = {}
71
+
72
+ cookieOptions.secure =
73
+ !!initConfiguration.useSecureSessionCookie ||
74
+ !!initConfiguration.usePartitionedCrossSiteSessionCookie ||
75
+ !!initConfiguration.useCrossSiteSessionCookie
76
+ cookieOptions.crossSite =
77
+ !!initConfiguration.usePartitionedCrossSiteSessionCookie ||
78
+ !!initConfiguration.useCrossSiteSessionCookie
79
+ cookieOptions.partitioned =
80
+ !!initConfiguration.usePartitionedCrossSiteSessionCookie
81
+
82
+ if (initConfiguration.trackSessionAcrossSubdomains) {
83
+ cookieOptions.domain = getCurrentSite()
84
+ }
85
+
86
+ return cookieOptions
87
+ }
@@ -0,0 +1,45 @@
1
+ import { UUID } from '../helper/tools'
2
+ import {
3
+ toSessionString,
4
+ toSessionState,
5
+ getExpiredSessionState
6
+ } from './sessionState'
7
+
8
+ import { SESSION_STORE_KEY } from './sessionConstants'
9
+
10
+ const LOCAL_STORAGE_TEST_KEY = '_gc_test_'
11
+
12
+ export function selectLocalStorageStrategy() {
13
+ try {
14
+ const id = UUID()
15
+ const testKey = `${LOCAL_STORAGE_TEST_KEY}${id}`
16
+ localStorage.setItem(testKey, id)
17
+ const retrievedId = localStorage.getItem(testKey)
18
+ localStorage.removeItem(testKey)
19
+ return id === retrievedId ? { type: 'LocalStorage' } : undefined
20
+ } catch (e) {
21
+ return undefined
22
+ }
23
+ }
24
+
25
+ export function initLocalStorageStrategy() {
26
+ return {
27
+ isLockEnabled: false,
28
+ persistSession: persistInLocalStorage,
29
+ retrieveSession: retrieveSessionFromLocalStorage,
30
+ expireSession: expireSessionFromLocalStorage
31
+ }
32
+ }
33
+
34
+ function persistInLocalStorage(sessionState) {
35
+ localStorage.setItem(SESSION_STORE_KEY, toSessionString(sessionState))
36
+ }
37
+
38
+ function retrieveSessionFromLocalStorage() {
39
+ const sessionString = localStorage.getItem(SESSION_STORE_KEY)
40
+ return toSessionState(sessionString)
41
+ }
42
+
43
+ function expireSessionFromLocalStorage() {
44
+ persistInLocalStorage(getExpiredSessionState())
45
+ }
@@ -1,31 +1,37 @@
1
- import { relativeNow, clocksOrigin, ONE_MINUTE, each } from '../helper/tools'
2
- import {
3
- addEventListeners,
4
- addEventListener
5
- } from '../browser/addEventListener'
1
+ import { Observable } from '../helper/observable'
6
2
  import { createValueHistory } from '../helper/valueHistory'
7
- import { startSessionStore } from './sessionStore'
8
- import { SESSION_TIME_OUT_DELAY } from './sessionConstants'
3
+ import { relativeNow, clocksOrigin, ONE_MINUTE } from '../helper/tools'
9
4
  import { DOM_EVENT } from '../helper/enums'
5
+ import {
6
+ addEventListener,
7
+ addEventListeners
8
+ } from '../browser/addEventListener'
10
9
  import { clearInterval, setInterval } from '../helper/timer'
11
- import { Observable } from '../helper/observable'
12
- export var VISIBILITY_CHECK_DELAY = ONE_MINUTE
13
- var SESSION_CONTEXT_TIMEOUT_DELAY = SESSION_TIME_OUT_DELAY
14
- var stopCallbacks = []
10
+ import { SESSION_TIME_OUT_DELAY } from './sessionConstants'
11
+ import { startSessionStore } from './sessionStore'
15
12
 
16
- export var startSessionManager = function (
17
- options,
13
+ export const VISIBILITY_CHECK_DELAY = ONE_MINUTE
14
+ const SESSION_CONTEXT_TIMEOUT_DELAY = SESSION_TIME_OUT_DELAY
15
+ let stopCallbacks = []
16
+
17
+ export function startSessionManager(
18
+ configuration,
18
19
  productKey,
19
20
  computeSessionState
20
21
  ) {
21
- var renewObservable = new Observable()
22
- var expireObservable = new Observable()
23
- var sessionStore = startSessionStore(options, productKey, computeSessionState)
22
+ const renewObservable = new Observable()
23
+ const expireObservable = new Observable()
24
+
25
+ const sessionStore = startSessionStore(
26
+ configuration.sessionStoreStrategyType,
27
+ productKey,
28
+ computeSessionState
29
+ )
24
30
  stopCallbacks.push(function () {
25
31
  return sessionStore.stop()
26
32
  })
27
33
 
28
- var sessionContextHistory = createValueHistory({
34
+ const sessionContextHistory = createValueHistory({
29
35
  expireDelay: SESSION_CONTEXT_TIMEOUT_DELAY
30
36
  })
31
37
  stopCallbacks.push(function () {
@@ -41,18 +47,20 @@ export var startSessionManager = function (
41
47
  sessionContextHistory.closeActive(relativeNow())
42
48
  })
43
49
 
50
+ // We expand/renew session unconditionally as tracking consent is always granted when the session
51
+ // manager is started.
44
52
  sessionStore.expandOrRenewSession()
45
53
  sessionContextHistory.add(buildSessionContext(), clocksOrigin().relative)
46
54
 
47
55
  trackActivity(function () {
48
- return sessionStore.expandOrRenewSession()
56
+ sessionStore.expandOrRenewSession()
49
57
  })
50
58
  trackVisibility(function () {
51
59
  return sessionStore.expandSession()
52
60
  })
53
- // trackResume(function () {
54
- // return sessionStore.expandSession()
55
- // })
61
+ trackResume(function () {
62
+ sessionStore.restartSession()
63
+ })
56
64
 
57
65
  function buildSessionContext() {
58
66
  return {
@@ -62,24 +70,26 @@ export var startSessionManager = function (
62
70
  }
63
71
 
64
72
  return {
65
- findActiveSession: function (startTime) {
66
- return sessionContextHistory.find(startTime)
73
+ findSession: function (startTime, options) {
74
+ return sessionContextHistory.find(startTime, options)
67
75
  },
68
- renewObservable: renewObservable,
69
- expireObservable: expireObservable,
70
- expire: sessionStore.expire
76
+ renewObservable,
77
+ expireObservable,
78
+ sessionStateUpdateObservable: sessionStore.sessionStateUpdateObservable,
79
+ expire: sessionStore.expire,
80
+ updateSessionState: sessionStore.updateSessionState
71
81
  }
72
82
  }
73
83
 
74
84
  export function stopSessionManager() {
75
- each(stopCallbacks, function (e) {
76
- return e()
85
+ stopCallbacks.forEach(function (e) {
86
+ e()
77
87
  })
78
88
  stopCallbacks = []
79
89
  }
80
90
 
81
91
  function trackActivity(expandOrRenewSession) {
82
- var _addEventListeners = addEventListeners(
92
+ const { stop } = addEventListeners(
83
93
  window,
84
94
  [
85
95
  DOM_EVENT.CLICK,
@@ -90,23 +100,24 @@ function trackActivity(expandOrRenewSession) {
90
100
  expandOrRenewSession,
91
101
  { capture: true, passive: true }
92
102
  )
93
- stopCallbacks.push(_addEventListeners.stop)
103
+ stopCallbacks.push(stop)
94
104
  }
95
105
 
96
106
  function trackVisibility(expandSession) {
97
- var expandSessionWhenVisible = function () {
107
+ const expandSessionWhenVisible = function () {
98
108
  if (document.visibilityState === 'visible') {
99
109
  expandSession()
100
110
  }
101
111
  }
102
- var _addEventListener = addEventListener(
112
+
113
+ const { stop } = addEventListener(
103
114
  document,
104
115
  DOM_EVENT.VISIBILITY_CHANGE,
105
116
  expandSessionWhenVisible
106
117
  )
107
- stopCallbacks.push(_addEventListener.stop)
118
+ stopCallbacks.push(stop)
108
119
 
109
- var visibilityCheckInterval = setInterval(
120
+ const visibilityCheckInterval = setInterval(
110
121
  expandSessionWhenVisible,
111
122
  VISIBILITY_CHECK_DELAY
112
123
  )
@@ -114,9 +125,10 @@ function trackVisibility(expandSession) {
114
125
  clearInterval(visibilityCheckInterval)
115
126
  })
116
127
  }
128
+
117
129
  function trackResume(cb) {
118
- var _addEventListener = addEventListener(window, DOM_EVENT.RESUME, cb, {
130
+ const { stop } = addEventListener(window, DOM_EVENT.RESUME, cb, {
119
131
  capture: true
120
132
  })
121
- stopCallbacks.push(_addEventListener.stop)
133
+ stopCallbacks.push(stop)
122
134
  }
@@ -0,0 +1,72 @@
1
+ import { isEmptyObject, objectEntries, dateNow, map } from '../helper/tools'
2
+ import {
3
+ SESSION_EXPIRATION_DELAY,
4
+ SESSION_TIME_OUT_DELAY
5
+ } from './sessionConstants'
6
+
7
+ const SESSION_ENTRY_REGEXP = /^([a-zA-Z]+)=([a-z0-9-]+)$/
8
+ const SESSION_ENTRY_SEPARATOR = '&'
9
+
10
+ export const EXPIRED = '1'
11
+
12
+ export function getExpiredSessionState() {
13
+ return {
14
+ isExpired: EXPIRED
15
+ }
16
+ }
17
+
18
+ export function isSessionInNotStartedState(session) {
19
+ return isEmptyObject(session)
20
+ }
21
+
22
+ export function isSessionStarted(session) {
23
+ return !isSessionInNotStartedState(session)
24
+ }
25
+
26
+ export function isSessionInExpiredState(session) {
27
+ return session.isExpired !== undefined || !isActiveSession(session)
28
+ }
29
+
30
+ // An active session is a session in either `Tracked` or `NotTracked` state
31
+ function isActiveSession(sessionState) {
32
+ // created and expire can be undefined for versions which was not storing them
33
+ // these checks could be removed when older versions will not be available/live anymore
34
+ return (
35
+ (sessionState.created === undefined ||
36
+ dateNow() - Number(sessionState.created) < SESSION_TIME_OUT_DELAY) &&
37
+ (sessionState.expire === undefined ||
38
+ dateNow() < Number(sessionState.expire))
39
+ )
40
+ }
41
+
42
+ export function expandSessionState(session) {
43
+ session.expire = String(dateNow() + SESSION_EXPIRATION_DELAY)
44
+ }
45
+
46
+ export function toSessionString(session) {
47
+ return map(objectEntries(session), function (item) {
48
+ return item[0] + '=' + item[1]
49
+ }).join(SESSION_ENTRY_SEPARATOR)
50
+ }
51
+
52
+ export function toSessionState(sessionString) {
53
+ const session = {}
54
+ if (isValidSessionString(sessionString)) {
55
+ sessionString.split(SESSION_ENTRY_SEPARATOR).forEach(function (entry) {
56
+ const matches = SESSION_ENTRY_REGEXP.exec(entry)
57
+ if (matches !== null) {
58
+ const [, key, value] = matches
59
+ session[key] = value
60
+ }
61
+ })
62
+ }
63
+ return session
64
+ }
65
+
66
+ function isValidSessionString(sessionString) {
67
+ return (
68
+ !!sessionString &&
69
+ (sessionString.indexOf(SESSION_ENTRY_SEPARATOR) !== -1 ||
70
+ SESSION_ENTRY_REGEXP.test(sessionString))
71
+ )
72
+ }