@cloudcare/browser-core 3.2.22 → 3.2.24

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 (51) hide show
  1. package/cjs/browser/addEventListener.js +4 -2
  2. package/cjs/browser/addEventListener.js.map +1 -1
  3. package/cjs/browser/asyncClocks.js +68 -0
  4. package/cjs/browser/asyncClocks.js.map +1 -0
  5. package/cjs/dataMap.js +1 -0
  6. package/cjs/dataMap.js.map +1 -1
  7. package/cjs/helper/deviceInfo.js +6 -1
  8. package/cjs/helper/deviceInfo.js.map +1 -1
  9. package/cjs/helper/getZoneJsOriginalValue.js +2 -1
  10. package/cjs/helper/getZoneJsOriginalValue.js.map +1 -1
  11. package/cjs/helper/valueHistory.js +19 -6
  12. package/cjs/helper/valueHistory.js.map +1 -1
  13. package/cjs/session/sessionStore.js +1 -1
  14. package/cjs/session/sessionStore.js.map +1 -1
  15. package/cjs/session/sessionStoreOperations.js +4 -4
  16. package/cjs/session/sessionStoreOperations.js.map +1 -1
  17. package/cjs/tracekit/computeStackTrace.js +1 -1
  18. package/cjs/tracekit/computeStackTrace.js.map +1 -1
  19. package/cjs/transport/eventBridge.js +8 -1
  20. package/cjs/transport/eventBridge.js.map +1 -1
  21. package/esm/browser/addEventListener.js +4 -2
  22. package/esm/browser/addEventListener.js.map +1 -1
  23. package/esm/browser/asyncClocks.js +60 -0
  24. package/esm/browser/asyncClocks.js.map +1 -0
  25. package/esm/dataMap.js +1 -0
  26. package/esm/dataMap.js.map +1 -1
  27. package/esm/helper/deviceInfo.js +6 -1
  28. package/esm/helper/deviceInfo.js.map +1 -1
  29. package/esm/helper/getZoneJsOriginalValue.js +2 -1
  30. package/esm/helper/getZoneJsOriginalValue.js.map +1 -1
  31. package/esm/helper/valueHistory.js +19 -6
  32. package/esm/helper/valueHistory.js.map +1 -1
  33. package/esm/session/sessionStore.js +1 -1
  34. package/esm/session/sessionStore.js.map +1 -1
  35. package/esm/session/sessionStoreOperations.js +4 -4
  36. package/esm/session/sessionStoreOperations.js.map +1 -1
  37. package/esm/tracekit/computeStackTrace.js +1 -1
  38. package/esm/tracekit/computeStackTrace.js.map +1 -1
  39. package/esm/transport/eventBridge.js +8 -1
  40. package/esm/transport/eventBridge.js.map +1 -1
  41. package/package.json +2 -2
  42. package/src/browser/addEventListener.js +7 -2
  43. package/src/browser/asyncClocks.js +69 -0
  44. package/src/dataMap.js +1 -0
  45. package/src/helper/deviceInfo.js +6 -1
  46. package/src/helper/getZoneJsOriginalValue.js +2 -1
  47. package/src/helper/valueHistory.js +18 -6
  48. package/src/session/sessionStore.js +1 -1
  49. package/src/session/sessionStoreOperations.js +4 -16
  50. package/src/tracekit/computeStackTrace.js +2 -1
  51. package/src/transport/eventBridge.js +19 -2
@@ -1 +1 @@
1
- {"version":3,"file":"eventBridge.js","names":["getGlobalObject","getEventBridgeGlobal","FTWebViewJavascriptBridge","getEventBridge","eventBridgeGlobal","getCapabilities","JSON","parse","getPrivacyLevel","getAllowedWebViewHosts","send","eventType","event","viewId","view","id","undefined","sendEvent","stringify","name","data","BridgeCapability","RECORDS","bridgeSupports","capability","bridge","includes","canUseEventBridge","_getGlobalObject$loca","currentHost","arguments","length","location","hostname","some","allowedHost","endsWith","concat"],"sources":["../../src/transport/eventBridge.js"],"sourcesContent":["import { getGlobalObject } from '../init'\n\nfunction getEventBridgeGlobal() {\n return getGlobalObject().FTWebViewJavascriptBridge\n}\nexport function getEventBridge() {\n var eventBridgeGlobal = getEventBridgeGlobal()\n\n if (!eventBridgeGlobal) {\n return\n }\n\n return {\n getCapabilities() {\n return JSON.parse(\n (eventBridgeGlobal.getCapabilities &&\n eventBridgeGlobal.getCapabilities()) ||\n '[]'\n )\n },\n getPrivacyLevel() {\n return (\n eventBridgeGlobal.getPrivacyLevel && eventBridgeGlobal.getPrivacyLevel()\n )\n },\n getAllowedWebViewHosts() {\n return JSON.parse(eventBridgeGlobal.getAllowedWebViewHosts())\n },\n send(eventType, event, viewId) {\n const view = viewId ? { id: viewId } : undefined\n eventBridgeGlobal.sendEvent(\n JSON.stringify({ name: eventType, data: event, view })\n )\n }\n }\n}\nexport const BridgeCapability = {\n RECORDS: 'records'\n}\nexport function bridgeSupports(capability) {\n const bridge = getEventBridge()\n\n return !!bridge && bridge.getCapabilities().includes(capability)\n}\nexport function canUseEventBridge(\n currentHost = getGlobalObject().location?.hostname\n) {\n var bridge = getEventBridge()\n\n return (\n !!bridge &&\n bridge\n .getAllowedWebViewHosts()\n .some(\n (allowedHost) =>\n currentHost === allowedHost || currentHost.endsWith(`.${allowedHost}`)\n )\n )\n}\n"],"mappings":"AAAA,SAASA,eAAe,QAAQ,SAAS;AAEzC,SAASC,oBAAoBA,CAAA,EAAG;EAC9B,OAAOD,eAAe,CAAC,CAAC,CAACE,yBAAyB;AACpD;AACA,OAAO,SAASC,cAAcA,CAAA,EAAG;EAC/B,IAAIC,iBAAiB,GAAGH,oBAAoB,CAAC,CAAC;EAE9C,IAAI,CAACG,iBAAiB,EAAE;IACtB;EACF;EAEA,OAAO;IACLC,eAAe,WAAfA,eAAeA,CAAA,EAAG;MAChB,OAAOC,IAAI,CAACC,KAAK,CACdH,iBAAiB,CAACC,eAAe,IAChCD,iBAAiB,CAACC,eAAe,CAAC,CAAC,IACnC,IACJ,CAAC;IACH,CAAC;IACDG,eAAe,WAAfA,eAAeA,CAAA,EAAG;MAChB,OACEJ,iBAAiB,CAACI,eAAe,IAAIJ,iBAAiB,CAACI,eAAe,CAAC,CAAC;IAE5E,CAAC;IACDC,sBAAsB,WAAtBA,sBAAsBA,CAAA,EAAG;MACvB,OAAOH,IAAI,CAACC,KAAK,CAACH,iBAAiB,CAACK,sBAAsB,CAAC,CAAC,CAAC;IAC/D,CAAC;IACDC,IAAI,WAAJA,IAAIA,CAACC,SAAS,EAAEC,KAAK,EAAEC,MAAM,EAAE;MAC7B,IAAMC,IAAI,GAAGD,MAAM,GAAG;QAAEE,EAAE,EAAEF;MAAO,CAAC,GAAGG,SAAS;MAChDZ,iBAAiB,CAACa,SAAS,CACzBX,IAAI,CAACY,SAAS,CAAC;QAAEC,IAAI,EAAER,SAAS;QAAES,IAAI,EAAER,KAAK;QAAEE,IAAI,EAAJA;MAAK,CAAC,CACvD,CAAC;IACH;EACF,CAAC;AACH;AACA,OAAO,IAAMO,gBAAgB,GAAG;EAC9BC,OAAO,EAAE;AACX,CAAC;AACD,OAAO,SAASC,cAAcA,CAACC,UAAU,EAAE;EACzC,IAAMC,MAAM,GAAGtB,cAAc,CAAC,CAAC;EAE/B,OAAO,CAAC,CAACsB,MAAM,IAAIA,MAAM,CAACpB,eAAe,CAAC,CAAC,CAACqB,QAAQ,CAACF,UAAU,CAAC;AAClE;AACA,OAAO,SAASG,iBAAiBA,CAAA,EAE/B;EAAA,IAAAC,qBAAA;EAAA,IADAC,WAAW,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAd,SAAA,GAAAc,SAAA,OAAAF,qBAAA,GAAG5B,eAAe,CAAC,CAAC,CAACgC,QAAQ,cAAAJ,qBAAA,uBAA1BA,qBAAA,CAA4BK,QAAQ;EAElD,IAAIR,MAAM,GAAGtB,cAAc,CAAC,CAAC;EAE7B,OACE,CAAC,CAACsB,MAAM,IACRA,MAAM,CACHhB,sBAAsB,CAAC,CAAC,CACxByB,IAAI,CACH,UAACC,WAAW;IAAA,OACVN,WAAW,KAAKM,WAAW,IAAIN,WAAW,CAACO,QAAQ,KAAAC,MAAA,CAAKF,WAAW,CAAE,CAAC;EAAA,CAC1E,CAAC;AAEP","ignoreList":[]}
1
+ {"version":3,"file":"eventBridge.js","names":["getGlobalObject","getEventBridgeGlobal","FTWebViewJavascriptBridge","getEventBridge","eventBridgeGlobal","getCapabilities","JSON","parse","getPrivacyLevel","getAllowedWebViewHosts","send","eventType","event","viewId","view","id","undefined","sendEvent","stringify","name","data","BridgeCapability","RECORDS","bridgeSupports","capability","bridge","includes","canUseEventBridge","_getGlobalObject$loca","currentHost","arguments","length","location","hostname","some","allowedHost","endsWith","concat"],"sources":["../../src/transport/eventBridge.js"],"sourcesContent":["import { getGlobalObject } from '../init'\n\nfunction getEventBridgeGlobal() {\n return getGlobalObject().FTWebViewJavascriptBridge\n}\nexport function getEventBridge() {\n var eventBridgeGlobal = getEventBridgeGlobal()\n\n if (!eventBridgeGlobal) {\n return\n }\n\n return {\n getCapabilities() {\n return JSON.parse(\n (eventBridgeGlobal.getCapabilities &&\n eventBridgeGlobal.getCapabilities()) ||\n '[]'\n )\n },\n getPrivacyLevel() {\n return (\n eventBridgeGlobal.getPrivacyLevel && eventBridgeGlobal.getPrivacyLevel()\n )\n },\n getAllowedWebViewHosts() {\n return JSON.parse(\n (eventBridgeGlobal.getAllowedWebViewHosts &&\n eventBridgeGlobal.getAllowedWebViewHosts()) ||\n '[]'\n )\n },\n send(eventType, event, viewId) {\n const view = viewId ? { id: viewId } : undefined\n eventBridgeGlobal.sendEvent(\n JSON.stringify({ name: eventType, data: event, view })\n )\n }\n }\n}\nexport const BridgeCapability = {\n RECORDS: 'records'\n}\nexport function bridgeSupports(capability) {\n const bridge = getEventBridge()\n\n return !!bridge && bridge.getCapabilities().includes(capability)\n}\nexport function canUseEventBridge(\n currentHost = getGlobalObject().location?.hostname\n) {\n const eventBridgeGlobal = getEventBridgeGlobal()\n if (\n eventBridgeGlobal &&\n eventBridgeGlobal.getAllowedWebViewHosts === undefined\n ) {\n return true\n }\n if (\n eventBridgeGlobal &&\n eventBridgeGlobal.getAllowedWebViewHosts &&\n eventBridgeGlobal.getAllowedWebViewHosts() === null\n ) {\n return true\n }\n var bridge = getEventBridge()\n return (\n !!bridge &&\n bridge\n .getAllowedWebViewHosts()\n .some(\n (allowedHost) =>\n currentHost === allowedHost || currentHost.endsWith(`.${allowedHost}`)\n )\n )\n}\n"],"mappings":"AAAA,SAASA,eAAe,QAAQ,SAAS;AAEzC,SAASC,oBAAoBA,CAAA,EAAG;EAC9B,OAAOD,eAAe,CAAC,CAAC,CAACE,yBAAyB;AACpD;AACA,OAAO,SAASC,cAAcA,CAAA,EAAG;EAC/B,IAAIC,iBAAiB,GAAGH,oBAAoB,CAAC,CAAC;EAE9C,IAAI,CAACG,iBAAiB,EAAE;IACtB;EACF;EAEA,OAAO;IACLC,eAAe,WAAfA,eAAeA,CAAA,EAAG;MAChB,OAAOC,IAAI,CAACC,KAAK,CACdH,iBAAiB,CAACC,eAAe,IAChCD,iBAAiB,CAACC,eAAe,CAAC,CAAC,IACnC,IACJ,CAAC;IACH,CAAC;IACDG,eAAe,WAAfA,eAAeA,CAAA,EAAG;MAChB,OACEJ,iBAAiB,CAACI,eAAe,IAAIJ,iBAAiB,CAACI,eAAe,CAAC,CAAC;IAE5E,CAAC;IACDC,sBAAsB,WAAtBA,sBAAsBA,CAAA,EAAG;MACvB,OAAOH,IAAI,CAACC,KAAK,CACdH,iBAAiB,CAACK,sBAAsB,IACvCL,iBAAiB,CAACK,sBAAsB,CAAC,CAAC,IAC1C,IACJ,CAAC;IACH,CAAC;IACDC,IAAI,WAAJA,IAAIA,CAACC,SAAS,EAAEC,KAAK,EAAEC,MAAM,EAAE;MAC7B,IAAMC,IAAI,GAAGD,MAAM,GAAG;QAAEE,EAAE,EAAEF;MAAO,CAAC,GAAGG,SAAS;MAChDZ,iBAAiB,CAACa,SAAS,CACzBX,IAAI,CAACY,SAAS,CAAC;QAAEC,IAAI,EAAER,SAAS;QAAES,IAAI,EAAER,KAAK;QAAEE,IAAI,EAAJA;MAAK,CAAC,CACvD,CAAC;IACH;EACF,CAAC;AACH;AACA,OAAO,IAAMO,gBAAgB,GAAG;EAC9BC,OAAO,EAAE;AACX,CAAC;AACD,OAAO,SAASC,cAAcA,CAACC,UAAU,EAAE;EACzC,IAAMC,MAAM,GAAGtB,cAAc,CAAC,CAAC;EAE/B,OAAO,CAAC,CAACsB,MAAM,IAAIA,MAAM,CAACpB,eAAe,CAAC,CAAC,CAACqB,QAAQ,CAACF,UAAU,CAAC;AAClE;AACA,OAAO,SAASG,iBAAiBA,CAAA,EAE/B;EAAA,IAAAC,qBAAA;EAAA,IADAC,WAAW,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAd,SAAA,GAAAc,SAAA,OAAAF,qBAAA,GAAG5B,eAAe,CAAC,CAAC,CAACgC,QAAQ,cAAAJ,qBAAA,uBAA1BA,qBAAA,CAA4BK,QAAQ;EAElD,IAAM7B,iBAAiB,GAAGH,oBAAoB,CAAC,CAAC;EAChD,IACEG,iBAAiB,IACjBA,iBAAiB,CAACK,sBAAsB,KAAKO,SAAS,EACtD;IACA,OAAO,IAAI;EACb;EACA,IACEZ,iBAAiB,IACjBA,iBAAiB,CAACK,sBAAsB,IACxCL,iBAAiB,CAACK,sBAAsB,CAAC,CAAC,KAAK,IAAI,EACnD;IACA,OAAO,IAAI;EACb;EACA,IAAIgB,MAAM,GAAGtB,cAAc,CAAC,CAAC;EAC7B,OACE,CAAC,CAACsB,MAAM,IACRA,MAAM,CACHhB,sBAAsB,CAAC,CAAC,CACxByB,IAAI,CACH,UAACC,WAAW;IAAA,OACVN,WAAW,KAAKM,WAAW,IAAIN,WAAW,CAACO,QAAQ,KAAAC,MAAA,CAAKF,WAAW,CAAE,CAAC;EAAA,CAC1E,CAAC;AAEP","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cloudcare/browser-core",
3
- "version": "3.2.22",
3
+ "version": "3.2.24",
4
4
  "main": "cjs/index.js",
5
5
  "module": "esm/index.js",
6
6
  "types": "types/index.d.ts",
@@ -22,5 +22,5 @@
22
22
  "author": "dataflux",
23
23
  "license": "MIT",
24
24
  "description": "DataFlux RUM Web 端数据指标监控",
25
- "gitHead": "b2098679ee0435c9d35ac9596680c9084a32f936"
25
+ "gitHead": "b4fef0dff2ae1cf18c7b1e35333c3dc23cc79243"
26
26
  }
@@ -34,13 +34,18 @@ export function addEventListeners(eventTarget, eventNames, listener, options) {
34
34
  options && options.passive
35
35
  ? { capture: options.capture, passive: options.passive }
36
36
  : options && options.capture
37
- var add = getZoneJsOriginalValue(eventTarget, 'addEventListener')
37
+ // Use the window.EventTarget.prototype when possible to avoid wrong overrides (e.g: https://github.com/salesforce/lwc/issues/1824)
38
+ const listenerTarget =
39
+ window.EventTarget && eventTarget instanceof EventTarget
40
+ ? window.EventTarget.prototype
41
+ : eventTarget
42
+ var add = getZoneJsOriginalValue(listenerTarget, 'addEventListener')
38
43
 
39
44
  each(eventNames, function (eventName) {
40
45
  add.call(eventTarget, eventName, wrappedListener, options)
41
46
  })
42
47
  var stop = function () {
43
- var remove = getZoneJsOriginalValue(eventTarget, 'removeEventListener')
48
+ var remove = getZoneJsOriginalValue(listenerTarget, 'removeEventListener')
44
49
  each(eventNames, function (eventName) {
45
50
  remove.call(eventTarget, eventName, wrappedListener, options)
46
51
  })
@@ -0,0 +1,69 @@
1
+ import { addEventListener } from './addEventListener'
2
+ import { display } from '../helper/display'
3
+ import { trim } from '../configuration/transportConfiguration'
4
+ let timeOffset
5
+ export function fetchAndApplyRemoteClocks(initConfiguration, callback) {
6
+ const start = performance.now()
7
+ fetchRemoteClocks(initConfiguration, (serverTimestamp) => {
8
+ const end = performance.now()
9
+ const rtt = end - start
10
+ callback(applyRemoteClocks(serverTimestamp, rtt))
11
+ })
12
+ }
13
+ function applyRemoteClocks(serverTimestamp, rtt) {
14
+ const estimatedClientTime =
15
+ performance.timing.navigationStart + start + rtt / 2
16
+
17
+ // 计算时间偏移
18
+ const offset = serverTimestamp - estimatedClientTime
19
+ return offset
20
+ }
21
+ export function fetchRemoteClocks(configuration, callback) {
22
+ const xhr = new XMLHttpRequest()
23
+
24
+ addEventListener(xhr, 'load', function () {
25
+ if (xhr.status === 200) {
26
+ const remoteConfiguration = JSON.parse(xhr.responseText)
27
+ callback(remoteConfiguration.content)
28
+ } else {
29
+ displayRemoteClocksFetchingError()
30
+ }
31
+ })
32
+
33
+ addEventListener(xhr, 'error', function () {
34
+ callback({})
35
+ displayRemoteClocksFetchingError()
36
+ })
37
+
38
+ xhr.open('GET', buildEndpoint(configuration))
39
+ xhr.send()
40
+ }
41
+
42
+ export function buildEndpoint(configuration) {
43
+ var url =
44
+ configuration.datakitOrigin ||
45
+ configuration.datakitUrl ||
46
+ configuration.site
47
+ if (url.indexOf('/') === 0) {
48
+ // 绝对路径这种 /xxx
49
+ url = location.origin + trim(url)
50
+ }
51
+ var endpoint = url
52
+ if (url.lastIndexOf('/') === url.length - 1) {
53
+ endpoint = trim(url) + 'v1/env_variable'
54
+ } else {
55
+ endpoint = trim(url) + '/v1/env_variable'
56
+ }
57
+ // 这里需要加上token和app_id
58
+ endpoint += '?app_id=' + configuration.applicationId
59
+ //testing-openway.dataflux.cn/v1/env_variable?token=a47fb0cdddaa4561a90d941317cdbc0b&app_id=d1b454d0_22eb_11ef_9b66_95ca11aa2c6c&to_headless=true
60
+ if (configuration.site && configuration.clientToken) {
61
+ endpoint =
62
+ endpoint + '&token=' + configuration.clientToken + '&to_headless=true'
63
+ }
64
+ return endpoint
65
+ }
66
+
67
+ function displayRemoteClocksFetchingError() {
68
+ display.error('Error fetching the remote configuration.')
69
+ }
package/src/dataMap.js CHANGED
@@ -22,6 +22,7 @@ export var commonTags = {
22
22
  browser_version_major: 'device.browser_version_major',
23
23
  screen_size: 'device.screen_size',
24
24
  network_type: 'device.network_type',
25
+ time_zone: 'device.time_zone',
25
26
  device: 'device.device',
26
27
  view_id: 'view.id',
27
28
  view_referrer: 'view.referrer',
@@ -307,6 +307,10 @@ var MethodLibrary = {
307
307
  })()
308
308
  return _this.language
309
309
  }),
310
+ getTimeZone: monitor(function () {
311
+ const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone
312
+ return timeZone
313
+ }),
310
314
  // 浏览器信息
311
315
  getBrowserInfo: monitor(function () {
312
316
  var _this = this
@@ -619,7 +623,8 @@ if (typeof window !== 'undefined') {
619
623
  browserVersionMajor: MethodLibrary.getBrowserInfo().browserMajor,
620
624
  screenSize: window.screen.width + '*' + window.screen.height,
621
625
  networkType: MethodLibrary.getNetwork(),
622
- device: MethodLibrary.getDeviceType()
626
+ device: MethodLibrary.getDeviceType(),
627
+ timeZone: MethodLibrary.getTimeZone()
623
628
  }
624
629
  }
625
630
  export var deviceInfo = _deviceInfo
@@ -1,3 +1,4 @@
1
+ import { getGlobalObject } from '../init'
1
2
  /**
2
3
  * Gets the original value for a DOM API that was potentially patched by Zone.js.
3
4
  *
@@ -12,7 +13,7 @@
12
13
  * [1]: https://github.com/angular/angular/tree/main/packages/zone.js
13
14
  */
14
15
  export function getZoneJsOriginalValue(target, name) {
15
- var browserWindow = window
16
+ var browserWindow = getGlobalObject()
16
17
  var original
17
18
  if (
18
19
  browserWindow.Zone &&
@@ -3,7 +3,13 @@ import { setInterval, clearInterval } from './timer'
3
3
  var END_OF_TIMES = Infinity
4
4
 
5
5
  export var CLEAR_OLD_VALUES_INTERVAL = ONE_MINUTE
6
+ let cleanupHistoriesInterval = null
6
7
 
8
+ const cleanupTasks = new Set()
9
+
10
+ function cleanupHistories() {
11
+ cleanupTasks.forEach((task) => task())
12
+ }
7
13
  /**
8
14
  *
9
15
  * @param {expireDelay,maxEntries } params
@@ -14,11 +20,13 @@ export function createValueHistory(params) {
14
20
  var maxEntries = params.maxEntries
15
21
 
16
22
  var entries = []
17
- var clearOldValuesInterval = setInterval(function () {
18
- return clearOldValues()
19
- }, CLEAR_OLD_VALUES_INTERVAL)
23
+ if (cleanupHistoriesInterval) {
24
+ cleanupHistoriesInterval = setInterval(function () {
25
+ return clearExpiredValues()
26
+ }, CLEAR_OLD_VALUES_INTERVAL)
27
+ }
20
28
 
21
- function clearOldValues() {
29
+ function clearExpiredValues() {
22
30
  var oldTimeThreshold = relativeNow() - expireDelay
23
31
  while (
24
32
  entries.length > 0 &&
@@ -27,7 +35,7 @@ export function createValueHistory(params) {
27
35
  entries.pop()
28
36
  }
29
37
  }
30
-
38
+ cleanupTasks.add(clearExpiredValues)
31
39
  function add(value, startTime) {
32
40
  var entry = {
33
41
  value: value,
@@ -103,7 +111,11 @@ export function createValueHistory(params) {
103
111
  * Stop internal garbage collection of past entries.
104
112
  */
105
113
  function stop() {
106
- clearInterval(clearOldValuesInterval)
114
+ cleanupTasks.delete(clearExpiredValues)
115
+ if (cleanupTasks.size === 0 && cleanupHistoriesInterval) {
116
+ clearInterval(cleanupHistoriesInterval)
117
+ cleanupHistoriesInterval = null
118
+ }
107
119
  }
108
120
 
109
121
  return {
@@ -206,7 +206,7 @@ export function startSessionStore(
206
206
  expandOrRenewSession: throttledExpandOrRenewSession,
207
207
  expandSession,
208
208
  getSession: function () {
209
- return sessionCache || {}
209
+ return sessionCache
210
210
  },
211
211
  renewObservable,
212
212
  expireObservable,
@@ -48,10 +48,7 @@ export function processSessionStoreOperations(
48
48
  let currentStore = retrieveStore()
49
49
  if (isLockEnabled) {
50
50
  // if someone has lock, retry later
51
- if (
52
- currentStore.lock &&
53
- !isSessionInNotStartedState(currentStore.session)
54
- ) {
51
+ if (currentStore.lock) {
55
52
  retryLater(operations, sessionStoreStrategy, numberOfRetries)
56
53
  return
57
54
  }
@@ -60,10 +57,7 @@ export function processSessionStoreOperations(
60
57
  persistWithLock(currentStore.session)
61
58
  // if lock is not acquired, retry later
62
59
  currentStore = retrieveStore()
63
- if (
64
- currentStore.lock !== currentLock &&
65
- !isSessionInNotStartedState(currentStore.session)
66
- ) {
60
+ if (currentStore.lock !== currentLock) {
67
61
  retryLater(operations, sessionStoreStrategy, numberOfRetries)
68
62
  return
69
63
  }
@@ -72,10 +66,7 @@ export function processSessionStoreOperations(
72
66
  if (isLockEnabled) {
73
67
  // if lock corrupted after process, retry later
74
68
  currentStore = retrieveStore()
75
- if (
76
- currentStore.lock !== currentLock &&
77
- !isSessionInNotStartedState(currentStore.session)
78
- ) {
69
+ if (currentStore.lock !== currentLock) {
79
70
  retryLater(operations, sessionStoreStrategy, numberOfRetries)
80
71
  return
81
72
  }
@@ -96,10 +87,7 @@ export function processSessionStoreOperations(
96
87
  if (!(processedSession && isSessionInExpiredState(processedSession))) {
97
88
  // if lock corrupted after persist, retry later
98
89
  currentStore = retrieveStore()
99
- if (
100
- currentStore.lock !== currentLock &&
101
- !isSessionInNotStartedState(currentStore.session)
102
- ) {
90
+ if (currentStore.lock !== currentLock) {
103
91
  retryLater(operations, sessionStoreStrategy, numberOfRetries)
104
92
  return
105
93
  }
@@ -36,6 +36,7 @@ export function computeStackTrace(ex) {
36
36
  }
37
37
  var fileUrl =
38
38
  '((?:file|https?|blob|chrome-extension|electron|native|eval|webpack|<anonymous>|\\w+\\.|\\/).*?)'
39
+
39
40
  var filePosition = '(?::(\\d+))'
40
41
  var CHROME_LINE_RE = new RegExp(
41
42
  '^\\s*at (.*?) ?\\(' +
@@ -117,7 +118,7 @@ function parseWinLine(line) {
117
118
  }
118
119
 
119
120
  var GECKO_LINE_RE =
120
- /^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|capacitor|\[native).*?|[^@]*bundle)(?::(\d+))?(?::(\d+))?\s*$/i
121
+ /^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|capacitor|\[native).*?|[^@]*bundle|\[wasm code\])(?::(\d+))?(?::(\d+))?\s*$/i
121
122
  var GECKO_EVAL_RE = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i
122
123
 
123
124
  function parseGeckoLine(line) {
@@ -24,7 +24,11 @@ export function getEventBridge() {
24
24
  )
25
25
  },
26
26
  getAllowedWebViewHosts() {
27
- return JSON.parse(eventBridgeGlobal.getAllowedWebViewHosts())
27
+ return JSON.parse(
28
+ (eventBridgeGlobal.getAllowedWebViewHosts &&
29
+ eventBridgeGlobal.getAllowedWebViewHosts()) ||
30
+ '[]'
31
+ )
28
32
  },
29
33
  send(eventType, event, viewId) {
30
34
  const view = viewId ? { id: viewId } : undefined
@@ -45,8 +49,21 @@ export function bridgeSupports(capability) {
45
49
  export function canUseEventBridge(
46
50
  currentHost = getGlobalObject().location?.hostname
47
51
  ) {
52
+ const eventBridgeGlobal = getEventBridgeGlobal()
53
+ if (
54
+ eventBridgeGlobal &&
55
+ eventBridgeGlobal.getAllowedWebViewHosts === undefined
56
+ ) {
57
+ return true
58
+ }
59
+ if (
60
+ eventBridgeGlobal &&
61
+ eventBridgeGlobal.getAllowedWebViewHosts &&
62
+ eventBridgeGlobal.getAllowedWebViewHosts() === null
63
+ ) {
64
+ return true
65
+ }
48
66
  var bridge = getEventBridge()
49
-
50
67
  return (
51
68
  !!bridge &&
52
69
  bridge