@openreplay/tracker 7.0.3 → 8.0.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.
Files changed (94) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/cjs/app/index.d.ts +10 -0
  3. package/cjs/app/index.js +56 -5
  4. package/cjs/app/messages.gen.d.ts +2 -0
  5. package/cjs/app/messages.gen.js +15 -1
  6. package/cjs/app/observer/observer.js +2 -2
  7. package/cjs/app/sanitizer.d.ts +1 -0
  8. package/cjs/app/sanitizer.js +6 -4
  9. package/cjs/app/session.d.ts +4 -0
  10. package/cjs/app/session.js +18 -0
  11. package/cjs/common/interaction.d.ts +1 -0
  12. package/cjs/common/messages.gen.d.ts +12 -2
  13. package/cjs/index.d.ts +1 -0
  14. package/cjs/index.js +9 -1
  15. package/cjs/modules/attributeSender.d.ts +14 -0
  16. package/cjs/modules/attributeSender.js +44 -0
  17. package/cjs/modules/img.js +4 -4
  18. package/cjs/modules/tabs.d.ts +2 -0
  19. package/cjs/modules/tabs.js +13 -0
  20. package/cjs/utils.d.ts +1 -1
  21. package/cjs/utils.js +13 -11
  22. package/coverage/clover.xml +683 -620
  23. package/coverage/coverage-final.json +13 -12
  24. package/coverage/lcov-report/index.html +47 -47
  25. package/coverage/lcov-report/main/app/guards.ts.html +42 -42
  26. package/coverage/lcov-report/main/app/index.html +34 -34
  27. package/coverage/lcov-report/main/app/index.ts.html +62 -8
  28. package/coverage/lcov-report/main/app/logger.ts.html +1 -1
  29. package/coverage/lcov-report/main/app/messages.gen.ts.html +1 -1
  30. package/coverage/lcov-report/main/app/observer/iframe_observer.ts.html +1 -1
  31. package/coverage/lcov-report/main/app/observer/iframe_offsets.ts.html +1 -1
  32. package/coverage/lcov-report/main/app/observer/index.html +1 -1
  33. package/coverage/lcov-report/main/app/observer/shadow_root_observer.ts.html +1 -1
  34. package/coverage/lcov-report/main/app/observer/top_observer.ts.html +1 -1
  35. package/coverage/lcov-report/main/app/sanitizer.ts.html +98 -98
  36. package/coverage/lcov-report/main/app/session.ts.html +1 -1
  37. package/coverage/lcov-report/main/app/ticker.ts.html +1 -1
  38. package/coverage/lcov-report/main/index.html +24 -24
  39. package/coverage/lcov-report/main/index.ts.html +126 -6
  40. package/coverage/lcov-report/main/modules/attributeSender.ts.html +217 -0
  41. package/coverage/lcov-report/main/modules/axiosSpy.ts.html +1 -1
  42. package/coverage/lcov-report/main/modules/connection.ts.html +1 -1
  43. package/coverage/lcov-report/main/modules/console.ts.html +1 -1
  44. package/coverage/lcov-report/main/modules/constructedStyleSheets.ts.html +1 -1
  45. package/coverage/lcov-report/main/modules/cssrules.ts.html +1 -1
  46. package/coverage/lcov-report/main/modules/exception.ts.html +1 -1
  47. package/coverage/lcov-report/main/{app/nodes.ts.html → modules/featureFlags.ts.html} +124 -127
  48. package/coverage/lcov-report/main/modules/focus.ts.html +1 -1
  49. package/coverage/lcov-report/main/modules/fonts.ts.html +1 -1
  50. package/coverage/lcov-report/main/modules/img.ts.html +6 -6
  51. package/coverage/lcov-report/main/modules/index.html +38 -8
  52. package/coverage/lcov-report/main/modules/input.ts.html +1 -1
  53. package/coverage/lcov-report/main/modules/mouse.ts.html +1 -1
  54. package/coverage/lcov-report/main/modules/network.ts.html +1 -1
  55. package/coverage/lcov-report/main/modules/performance.ts.html +1 -1
  56. package/coverage/lcov-report/main/modules/scroll.ts.html +1 -1
  57. package/coverage/lcov-report/main/modules/selection.ts.html +1 -1
  58. package/coverage/lcov-report/main/modules/tabs.ts.html +1 -1
  59. package/coverage/lcov-report/main/modules/timing.ts.html +1 -1
  60. package/coverage/lcov-report/main/modules/viewport.ts.html +1 -1
  61. package/coverage/lcov-report/main/utils.ts.html +112 -112
  62. package/coverage/lcov-report/webworker/BatchWriter.ts.html +125 -176
  63. package/coverage/lcov-report/webworker/MessageEncoder.gen.ts.html +88 -88
  64. package/coverage/lcov-report/webworker/PrimitiveEncoder.ts.html +110 -110
  65. package/coverage/lcov-report/webworker/QueueSender.ts.html +140 -110
  66. package/coverage/lcov-report/webworker/index.html +56 -71
  67. package/coverage/lcov-report/webworker/index.ts.html +34 -10
  68. package/coverage/lcov.info +1232 -1092
  69. package/lib/app/index.d.ts +10 -0
  70. package/lib/app/index.js +57 -6
  71. package/lib/app/messages.gen.d.ts +2 -0
  72. package/lib/app/messages.gen.js +12 -0
  73. package/lib/app/observer/observer.js +3 -3
  74. package/lib/app/sanitizer.d.ts +1 -0
  75. package/lib/app/sanitizer.js +4 -3
  76. package/lib/app/session.d.ts +4 -0
  77. package/lib/app/session.js +18 -0
  78. package/lib/common/interaction.d.ts +1 -0
  79. package/lib/common/messages.gen.d.ts +12 -2
  80. package/lib/common/tsconfig.tsbuildinfo +1 -1
  81. package/lib/index.d.ts +1 -0
  82. package/lib/index.js +9 -1
  83. package/lib/modules/attributeSender.d.ts +14 -0
  84. package/lib/modules/attributeSender.js +39 -0
  85. package/lib/modules/img.js +5 -5
  86. package/lib/modules/tabs.d.ts +2 -0
  87. package/lib/modules/tabs.js +10 -0
  88. package/lib/utils.d.ts +1 -1
  89. package/lib/utils.js +11 -9
  90. package/package.json +5 -2
  91. package/coverage/lcov-report/main/app/observer/observer.ts.html +0 -1282
  92. package/coverage/lcov-report/main/vendors/finder/finder.ts.html +0 -1381
  93. package/coverage/lcov-report/main/vendors/finder/index.html +0 -116
  94. package/coverage/lcov-report/webworker/StringDictionary.ts.html +0 -124
@@ -3,7 +3,7 @@
3
3
  <html lang="en">
4
4
 
5
5
  <head>
6
- <title>Code coverage report for main/app/nodes.ts</title>
6
+ <title>Code coverage report for main/modules/featureFlags.ts</title>
7
7
  <meta charset="utf-8" />
8
8
  <link rel="stylesheet" href="../../prettify.css" />
9
9
  <link rel="stylesheet" href="../../base.css" />
@@ -19,34 +19,34 @@
19
19
  <body>
20
20
  <div class='wrapper'>
21
21
  <div class='pad1'>
22
- <h1><a href="../../index.html">All files</a> / <a href="index.html">main/app</a> nodes.ts</h1>
22
+ <h1><a href="../../index.html">All files</a> / <a href="index.html">main/modules</a> featureFlags.ts</h1>
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">0% </span>
26
+ <span class="strong">34.37% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>0/52</span>
28
+ <span class='fraction'>11/32</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
33
  <span class="strong">0% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>0/10</span>
35
+ <span class='fraction'>0/11</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">0% </span>
40
+ <span class="strong">41.66% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>0/13</span>
42
+ <span class='fraction'>5/12</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">0% </span>
47
+ <span class="strong">29.62% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>0/49</span>
49
+ <span class='fraction'>8/27</span>
50
50
  </div>
51
51
 
52
52
 
@@ -156,62 +156,41 @@
156
156
  <a name='L91'></a><a href='#L91'>91</a>
157
157
  <a name='L92'></a><a href='#L92'>92</a>
158
158
  <a name='L93'></a><a href='#L93'>93</a>
159
- <a name='L94'></a><a href='#L94'>94</a>
160
- <a name='L95'></a><a href='#L95'>95</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
159
+ <a name='L94'></a><a href='#L94'>94</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
161
160
  <span class="cline-any cline-neutral">&nbsp;</span>
162
161
  <span class="cline-any cline-neutral">&nbsp;</span>
163
- <span class="cline-any cline-no">&nbsp;</span>
164
- <span class="cline-any cline-no">&nbsp;</span>
165
- <span class="cline-any cline-no">&nbsp;</span>
166
- <span class="cline-any cline-no">&nbsp;</span>
167
- <span class="cline-any cline-no">&nbsp;</span>
168
162
  <span class="cline-any cline-neutral">&nbsp;</span>
169
- <span class="cline-any cline-no">&nbsp;</span>
170
163
  <span class="cline-any cline-neutral">&nbsp;</span>
171
164
  <span class="cline-any cline-neutral">&nbsp;</span>
172
165
  <span class="cline-any cline-neutral">&nbsp;</span>
173
- <span class="cline-any cline-no">&nbsp;</span>
174
166
  <span class="cline-any cline-neutral">&nbsp;</span>
175
167
  <span class="cline-any cline-neutral">&nbsp;</span>
176
- <span class="cline-any cline-no">&nbsp;</span>
177
- <span class="cline-any cline-no">&nbsp;</span>
178
- <span class="cline-any cline-no">&nbsp;</span>
179
168
  <span class="cline-any cline-neutral">&nbsp;</span>
180
- <span class="cline-any cline-no">&nbsp;</span>
181
- <span class="cline-any cline-no">&nbsp;</span>
182
- <span class="cline-any cline-no">&nbsp;</span>
183
- <span class="cline-any cline-no">&nbsp;</span>
184
- <span class="cline-any cline-no">&nbsp;</span>
185
169
  <span class="cline-any cline-neutral">&nbsp;</span>
186
- <span class="cline-any cline-no">&nbsp;</span>
187
170
  <span class="cline-any cline-neutral">&nbsp;</span>
188
171
  <span class="cline-any cline-neutral">&nbsp;</span>
189
172
  <span class="cline-any cline-neutral">&nbsp;</span>
190
- <span class="cline-any cline-no">&nbsp;</span>
191
- <span class="cline-any cline-no">&nbsp;</span>
192
- <span class="cline-any cline-no">&nbsp;</span>
193
- <span class="cline-any cline-no">&nbsp;</span>
194
- <span class="cline-any cline-no">&nbsp;</span>
195
- <span class="cline-any cline-no">&nbsp;</span>
196
- <span class="cline-any cline-no">&nbsp;</span>
173
+ <span class="cline-any cline-yes">1x</span>
197
174
  <span class="cline-any cline-neutral">&nbsp;</span>
198
- <span class="cline-any cline-no">&nbsp;</span>
175
+ <span class="cline-any cline-yes">1x</span>
176
+ <span class="cline-any cline-neutral">&nbsp;</span>
177
+ <span class="cline-any cline-neutral">&nbsp;</span>
178
+ <span class="cline-any cline-yes">1x</span>
199
179
  <span class="cline-any cline-neutral">&nbsp;</span>
200
180
  <span class="cline-any cline-neutral">&nbsp;</span>
201
181
  <span class="cline-any cline-no">&nbsp;</span>
182
+ <span class="cline-any cline-neutral">&nbsp;</span>
183
+ <span class="cline-any cline-neutral">&nbsp;</span>
184
+ <span class="cline-any cline-neutral">&nbsp;</span>
202
185
  <span class="cline-any cline-no">&nbsp;</span>
203
- <span class="cline-any cline-no">&nbsp;</span>
204
- <span class="cline-any cline-no">&nbsp;</span>
205
- <span class="cline-any cline-no">&nbsp;</span>
206
- <span class="cline-any cline-no">&nbsp;</span>
207
- <span class="cline-any cline-no">&nbsp;</span>
186
+ <span class="cline-any cline-neutral">&nbsp;</span>
187
+ <span class="cline-any cline-neutral">&nbsp;</span>
188
+ <span class="cline-any cline-neutral">&nbsp;</span>
208
189
  <span class="cline-any cline-no">&nbsp;</span>
209
190
  <span class="cline-any cline-no">&nbsp;</span>
210
191
  <span class="cline-any cline-neutral">&nbsp;</span>
211
192
  <span class="cline-any cline-neutral">&nbsp;</span>
212
- <span class="cline-any cline-no">&nbsp;</span>
213
193
  <span class="cline-any cline-neutral">&nbsp;</span>
214
- <span class="cline-any cline-no">&nbsp;</span>
215
194
  <span class="cline-any cline-neutral">&nbsp;</span>
216
195
  <span class="cline-any cline-neutral">&nbsp;</span>
217
196
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -219,130 +198,148 @@
219
198
  <span class="cline-any cline-neutral">&nbsp;</span>
220
199
  <span class="cline-any cline-neutral">&nbsp;</span>
221
200
  <span class="cline-any cline-neutral">&nbsp;</span>
222
- <span class="cline-any cline-no">&nbsp;</span>
223
- <span class="cline-any cline-no">&nbsp;</span>
224
- <span class="cline-any cline-no">&nbsp;</span>
225
- <span class="cline-any cline-no">&nbsp;</span>
226
201
  <span class="cline-any cline-neutral">&nbsp;</span>
227
202
  <span class="cline-any cline-neutral">&nbsp;</span>
228
203
  <span class="cline-any cline-neutral">&nbsp;</span>
229
204
  <span class="cline-any cline-neutral">&nbsp;</span>
230
- <span class="cline-any cline-no">&nbsp;</span>
231
205
  <span class="cline-any cline-neutral">&nbsp;</span>
232
206
  <span class="cline-any cline-neutral">&nbsp;</span>
233
- <span class="cline-any cline-no">&nbsp;</span>
207
+ <span class="cline-any cline-neutral">&nbsp;</span>
234
208
  <span class="cline-any cline-neutral">&nbsp;</span>
235
209
  <span class="cline-any cline-neutral">&nbsp;</span>
236
210
  <span class="cline-any cline-no">&nbsp;</span>
237
211
  <span class="cline-any cline-neutral">&nbsp;</span>
238
212
  <span class="cline-any cline-neutral">&nbsp;</span>
239
213
  <span class="cline-any cline-neutral">&nbsp;</span>
214
+ <span class="cline-any cline-neutral">&nbsp;</span>
215
+ <span class="cline-any cline-neutral">&nbsp;</span>
216
+ <span class="cline-any cline-neutral">&nbsp;</span>
217
+ <span class="cline-any cline-neutral">&nbsp;</span>
240
218
  <span class="cline-any cline-no">&nbsp;</span>
219
+ <span class="cline-any cline-no">&nbsp;</span>
220
+ <span class="cline-any cline-no">&nbsp;</span>
221
+ <span class="cline-any cline-neutral">&nbsp;</span>
241
222
  <span class="cline-any cline-neutral">&nbsp;</span>
242
223
  <span class="cline-any cline-neutral">&nbsp;</span>
243
224
  <span class="cline-any cline-neutral">&nbsp;</span>
244
225
  <span class="cline-any cline-no">&nbsp;</span>
245
226
  <span class="cline-any cline-no">&nbsp;</span>
246
227
  <span class="cline-any cline-no">&nbsp;</span>
228
+ <span class="cline-any cline-neutral">&nbsp;</span>
229
+ <span class="cline-any cline-no">&nbsp;</span>
230
+ <span class="cline-any cline-no">&nbsp;</span>
231
+ <span class="cline-any cline-no">&nbsp;</span>
247
232
  <span class="cline-any cline-no">&nbsp;</span>
248
233
  <span class="cline-any cline-neutral">&nbsp;</span>
234
+ <span class="cline-any cline-neutral">&nbsp;</span>
235
+ <span class="cline-any cline-no">&nbsp;</span>
236
+ <span class="cline-any cline-no">&nbsp;</span>
249
237
  <span class="cline-any cline-no">&nbsp;</span>
250
238
  <span class="cline-any cline-neutral">&nbsp;</span>
239
+ <span class="cline-any cline-neutral">&nbsp;</span>
240
+ <span class="cline-any cline-neutral">&nbsp;</span>
251
241
  <span class="cline-any cline-no">&nbsp;</span>
252
242
  <span class="cline-any cline-neutral">&nbsp;</span>
253
243
  <span class="cline-any cline-neutral">&nbsp;</span>
254
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">type NodeCallback = (node: Node, isStart: boolean) =&gt; void
255
- type ElementListener = [string, EventListener, boolean]
244
+ <span class="cline-any cline-neutral">&nbsp;</span>
245
+ <span class="cline-any cline-yes">1x</span>
246
+ <span class="cline-any cline-yes">1x</span>
247
+ <span class="cline-any cline-yes">1x</span>
248
+ <span class="cline-any cline-yes">2x</span>
249
+ <span class="cline-any cline-yes">5x</span>
250
+ <span class="cline-any cline-neutral">&nbsp;</span>
251
+ <span class="cline-any cline-neutral">&nbsp;</span>
252
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import App from '../app/index.js'
256
253
  &nbsp;
257
- <span class="cstat-no" title="statement not covered" >export default class N</span>odes {
258
- private <span class="cstat-no" title="statement not covered" >nodes: Array&lt;Node | void&gt; = []</span>
259
- private <span class="cstat-no" title="statement not covered" >totalNodeAmount = 0</span>
260
- private readonly <span class="cstat-no" title="statement not covered" >nodeCallbacks: Array&lt;NodeCallback&gt; = []</span>
261
- private readonly <span class="cstat-no" title="statement not covered" >elementListeners: Map&lt;number, Array&lt;ElementListener&gt;&gt; = new Map()</span>
254
+ export interface IFeatureFlag {
255
+ key: string
256
+ is_persist: boolean
257
+ value: string | boolean
258
+ payload: string
259
+ }
262
260
  &nbsp;
263
- <span class="fstat-no" title="function not covered" > constructor(private readonly <span class="cstat-no" title="statement not covered" >n</span>ode_id: string)</span> {}
261
+ export interface PersistFlagsData {
262
+ key: string
263
+ value: string | boolean
264
+ }
264
265
  &nbsp;
265
- // Attached once per Tracker instance
266
- <span class="fstat-no" title="function not covered" > attachNodeCallback(</span>nodeCallback: NodeCallback): void {
267
- <span class="cstat-no" title="statement not covered" > this.nodeCallbacks.push(nodeCallback)</span>
268
- }
269
- <span class="fstat-no" title="function not covered" > attachNodeListener(</span>node: Node, type: string, listener: EventListener, useCapture = <span class="branch-0 cbranch-no" title="branch not covered" >true)</span>: void {
270
- const id = <span class="cstat-no" title="statement not covered" >this.getID(node)</span>
271
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (id === undefined) {</span>
272
- <span class="cstat-no" title="statement not covered" > return</span>
273
- }
274
- <span class="cstat-no" title="statement not covered" > node.addEventListener(type, listener, useCapture)</span>
275
- let listeners = <span class="cstat-no" title="statement not covered" >this.elementListeners.get(id)</span>
276
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (listeners === undefined) {</span>
277
- <span class="cstat-no" title="statement not covered" > listeners = []</span>
278
- <span class="cstat-no" title="statement not covered" > this.elementListeners.set(id, listeners)</span>
279
- }
280
- <span class="cstat-no" title="statement not covered" > listeners.push([type, listener, useCapture])</span>
266
+ export default class FeatureFlags {
267
+ flags: Record&lt;string, any&gt;
268
+ storageKey = '__openreplay_flags'
269
+ onFlagsCb: (flags: Record&lt;string, any&gt;) =&gt; void
270
+ &nbsp;
271
+ constructor(private readonly app: App) {}
272
+ &nbsp;
273
+ <span class="fstat-no" title="function not covered" > isFlagEnabled(</span>flagName: string): boolean {
274
+ <span class="cstat-no" title="statement not covered" > return this.flags[flagName] &amp;&amp; this.flags[flagName].enabled</span>
281
275
  }
282
276
  &nbsp;
283
- <span class="fstat-no" title="function not covered" > registerNode(</span>node: Node): [/*id:*/ number, /*isNew:*/ boolean] {
284
- let id: number = (<span class="cstat-no" title="statement not covered" >node as any)[this.node_id]</span>
285
- const isNew = <span class="cstat-no" title="statement not covered" >id === undefined</span>
286
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (isNew) {</span>
287
- <span class="cstat-no" title="statement not covered" > this.totalNodeAmount++</span>
288
- <span class="cstat-no" title="statement not covered" > id = this.nodes.length</span>
289
- <span class="cstat-no" title="statement not covered" > this.nodes[id] = node</span>
290
- ;(<span class="cstat-no" title="statement not covered" >node as any)[this.node_id] = id</span>
291
- }
292
- <span class="cstat-no" title="statement not covered" > return [id, isNew]</span>
277
+ <span class="fstat-no" title="function not covered" > onFlagsLoad(</span>cb: (flags: IFeatureFlag[]) =&gt; void) {
278
+ <span class="cstat-no" title="statement not covered" > return (this.onFlagsCb = cb)</span>
293
279
  }
294
- <span class="fstat-no" title="function not covered" > unregisterNode(</span>node: Node): number | undefined {
295
- const id = (<span class="cstat-no" title="statement not covered" >node as any)[this.node_id]</span>
296
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (id !== undefined) {</span>
297
- <span class="cstat-no" title="statement not covered" > delete (node as any)[this.node_id]</span>
298
- <span class="cstat-no" title="statement not covered" > delete this.nodes[id]</span>
299
- const listeners = <span class="cstat-no" title="statement not covered" >this.elementListeners.get(id)</span>
300
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (listeners !== undefined) {</span>
301
- <span class="cstat-no" title="statement not covered" > this.elementListeners.delete(id)</span>
302
- <span class="cstat-no" title="statement not covered" > listeners.forEach(<span class="fstat-no" title="function not covered" >(l</span>istener) =&gt;</span>
303
- <span class="cstat-no" title="statement not covered" > node.removeEventListener(listener[0], listener[1], listener[2]),</span>
304
- )
305
- }
306
- <span class="cstat-no" title="statement not covered" > this.totalNodeAmount--</span>
280
+ &nbsp;
281
+ async <span class="fstat-no" title="function not covered" >reloadFlags(</span>) {
282
+ const sessionInfo = <span class="cstat-no" title="statement not covered" >this.app.session.getInfo()</span>
283
+ const requestObject = <span class="cstat-no" title="statement not covered" >{</span>
284
+ projectID: sessionInfo.projectID,
285
+ userID: sessionInfo.userID,
286
+ metadata: sessionInfo.metadata,
287
+ referrer: document.referrer,
288
+ featureFlags: this.flags,
289
+ // todo: get from backend
290
+ os: 'test',
291
+ osVersion: 'test',
292
+ device: 'test',
293
+ country: 'test',
294
+ state: 'test',
295
+ city: 'test',
296
+ ua: 'test',
297
+ browser: 'test',
298
+ browserVersion: 'test',
299
+ deviceType: 'test',
300
+ persistFlags: this.app.localStorage.getItem(this.storageKey) || [],
307
301
  }
308
- <span class="cstat-no" title="statement not covered" > return id</span>
309
- }
310
302
  &nbsp;
311
- <span class="fstat-no" title="function not covered" > cleanTree(</span>) {
312
- // sadly we keep empty items in array here resulting in some memory still being used
313
- // but its still better than keeping dead nodes or undef elements
314
- // plus we keep our index positions for new/alive nodes
315
- // performance test: 3ms for 30k nodes with 17k dead ones
316
- <span class="cstat-no" title="statement not covered" > for (let i = <span class="cstat-no" title="statement not covered" >0;</span> i &lt; this.nodes.length; i++) {</span>
317
- const node = <span class="cstat-no" title="statement not covered" >this.nodes[i]</span>
318
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (node &amp;&amp; !document.contains(node)) {</span>
319
- <span class="cstat-no" title="statement not covered" > this.unregisterNode(node)</span>
320
- }
303
+ const resp = <span class="cstat-no" title="statement not covered" >await fetch(this.app.options.ingestPoint + '/v1/web/feature-flags', {</span>
304
+ method: 'POST',
305
+ headers: {
306
+ 'Content-Type': 'application/json',
307
+ Authorization: `Bearer ${this.app.session.getSessionToken() as string}`,
308
+ },
309
+ body: JSON.stringify(requestObject),
310
+ })
311
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (resp.status === 200) {</span>
312
+ const data: { flags: IFeatureFlag[] } = <span class="cstat-no" title="statement not covered" >await resp.json()</span>
313
+ <span class="cstat-no" title="statement not covered" > return this.handleFlags(data.flags)</span>
321
314
  }
322
315
  }
323
- <span class="fstat-no" title="function not covered" > callNodeCallbacks(</span>node: Node, isStart: boolean): void {
324
- <span class="cstat-no" title="statement not covered" > this.nodeCallbacks.forEach(<span class="fstat-no" title="function not covered" >(c</span>b) =&gt; <span class="cstat-no" title="statement not covered" >cb(node, isStart))</span></span>
325
- }
326
- <span class="fstat-no" title="function not covered" > getID(</span>node: Node): number | undefined {
327
- <span class="cstat-no" title="statement not covered" > return (node as any)[this.node_id]</span>
328
- }
329
- <span class="fstat-no" title="function not covered" > getNode(</span>id: number) {
330
- <span class="cstat-no" title="statement not covered" > return this.nodes[id]</span>
316
+ &nbsp;
317
+ <span class="fstat-no" title="function not covered" > handleFlags(</span>flags: IFeatureFlag[]) {
318
+ const persistFlags: PersistFlagsData[] = <span class="cstat-no" title="statement not covered" >[]</span>
319
+ <span class="cstat-no" title="statement not covered" > Object.values(flags).forEach(<span class="fstat-no" title="function not covered" >(f</span>lag) =&gt; {</span>
320
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (flag.is_persist) <span class="cstat-no" title="statement not covered" >persistFlags.push({ key: flag.key, value: flag.value })</span></span>
321
+ })
322
+ let str = <span class="cstat-no" title="statement not covered" >''</span>
323
+ const uniqueFlags = <span class="cstat-no" title="statement not covered" >this.diffPersist(persistFlags)</span>
324
+ <span class="cstat-no" title="statement not covered" > uniqueFlags.forEach(<span class="fstat-no" title="function not covered" >(f</span>lag) =&gt; {</span>
325
+ <span class="cstat-no" title="statement not covered" > str += `${JSON.stringify(flag)};`</span>
326
+ })
327
+ &nbsp;
328
+ <span class="cstat-no" title="statement not covered" > this.app.localStorage.setItem(this.storageKey, str)</span>
329
+ <span class="cstat-no" title="statement not covered" > this.flags = flags</span>
330
+ <span class="cstat-no" title="statement not covered" > return this.onFlagsCb?.(flags)</span>
331
331
  }
332
332
  &nbsp;
333
- <span class="fstat-no" title="function not covered" > getNodeCount(</span>) {
334
- <span class="cstat-no" title="statement not covered" > return this.totalNodeAmount</span>
333
+ <span class="fstat-no" title="function not covered" > clearPersistFlags(</span>) {
334
+ <span class="cstat-no" title="statement not covered" > this.app.localStorage.removeItem(this.storageKey)</span>
335
335
  }
336
336
  &nbsp;
337
- <span class="fstat-no" title="function not covered" > clear(</span>): void {
338
- <span class="cstat-no" title="statement not covered" > for (let id = <span class="cstat-no" title="statement not covered" >0;</span> id &lt; this.nodes.length; id++) {</span>
339
- const node = <span class="cstat-no" title="statement not covered" >this.nodes[id]</span>
340
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (node === undefined) {</span>
341
- <span class="cstat-no" title="statement not covered" > continue</span>
342
- }
343
- <span class="cstat-no" title="statement not covered" > this.unregisterNode(node)</span>
344
- }
345
- <span class="cstat-no" title="statement not covered" > this.nodes.length = 0</span>
337
+ diffPersist(flags: PersistFlagsData[]) {
338
+ const persistFlags = this.app.localStorage.getItem(this.storageKey)
339
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!persistFlags) <span class="cstat-no" title="statement not covered" >return flags</span>
340
+ const persistFlagsStrArr = persistFlags.split(';')
341
+ const persistFlagsArr = persistFlagsStrArr.map((flag) =&gt; JSON.parse(flag))
342
+ return flags.filter((flag) =&gt; persistFlagsArr.findIndex((pf) =&gt; pf.key === flag.key) === -1)
346
343
  }
347
344
  }
348
345
  &nbsp;</pre></td></tr></table></pre>
@@ -352,7 +349,7 @@ type ElementListener = [string, EventListener, boolean]
352
349
  <div class='footer quiet pad2 space-top1 center small'>
353
350
  Code coverage generated by
354
351
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
355
- at 2023-05-31T11:17:20.525Z
352
+ at 2023-06-15T15:49:15.198Z
356
353
  </div>
357
354
  <script src="../../prettify.js"></script>
358
355
  <script>
@@ -205,7 +205,7 @@
205
205
  <div class='footer quiet pad2 space-top1 center small'>
206
206
  Code coverage generated by
207
207
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
208
- at 2023-05-31T15:51:28.464Z
208
+ at 2023-06-15T15:49:15.198Z
209
209
  </div>
210
210
  <script src="../../prettify.js"></script>
211
211
  <script>
@@ -274,7 +274,7 @@ type FFData = [string, string, string]
274
274
  <div class='footer quiet pad2 space-top1 center small'>
275
275
  Code coverage generated by
276
276
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
277
- at 2023-05-31T15:51:28.464Z
277
+ at 2023-06-15T15:49:15.198Z
278
278
  </div>
279
279
  <script src="../../prettify.js"></script>
280
280
  <script>
@@ -297,7 +297,7 @@
297
297
  <span class="cline-any cline-neutral">&nbsp;</span>
298
298
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import type App from '../app/index.js'
299
299
  <span class="cstat-no" title="statement not covered" >import { isURL, IS_FIREFOX, MAX_STR_LEN } from '../utils.js'</span>
300
- <span class="cstat-no" title="statement not covered" >import { ResourceTiming, SetNodeAttributeURLBased, SetNodeAttribute } from '../app/messages.gen.js'</span>
300
+ <span class="cstat-no" title="statement not covered" >import { ResourceTiming, SetNodeAttributeURLBased } from '../app/messages.gen.js'</span>
301
301
  <span class="cstat-no" title="statement not covered" >import { hasTag } from '../app/guards.js'</span>
302
302
  &nbsp;
303
303
  function <span class="fstat-no" title="function not covered" >resolveURL(</span>url: string, location: Location = <span class="branch-0 cbranch-no" title="branch not covered" >document.location)</span> {
@@ -325,13 +325,13 @@ const PLACEHOLDER_SRC = <span class="cstat-no" title="statement not covered" >'h
325
325
  &nbsp;
326
326
  <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export default function (a</span></span>pp: App): void {
327
327
  function <span class="fstat-no" title="function not covered" >sendPlaceholder(</span>id: number, node: HTMLImageElement): void {
328
- <span class="cstat-no" title="statement not covered" > app.send(SetNodeAttribute(id, 'src', PLACEHOLDER_SRC))</span>
328
+ <span class="cstat-no" title="statement not covered" > app.attributeSender.sendSetAttribute(id, 'src', PLACEHOLDER_SRC)</span>
329
329
  const { width, height } = <span class="cstat-no" title="statement not covered" >node.getBoundingClientRect()</span>
330
330
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!node.hasAttribute('width')) {</span>
331
- <span class="cstat-no" title="statement not covered" > app.send(SetNodeAttribute(id, 'width', String(width)))</span>
331
+ <span class="cstat-no" title="statement not covered" > app.attributeSender.sendSetAttribute(id, 'width', String(width))</span>
332
332
  }
333
333
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!node.hasAttribute('height')) {</span>
334
- <span class="cstat-no" title="statement not covered" > app.send(SetNodeAttribute(id, 'height', String(height)))</span>
334
+ <span class="cstat-no" title="statement not covered" > app.attributeSender.sendSetAttribute(id, 'height', String(height))</span>
335
335
  }
336
336
  }
337
337
  &nbsp;
@@ -344,7 +344,7 @@ const PLACEHOLDER_SRC = <span class="cstat-no" title="statement not covered" >'h
344
344
  .split(',')
345
345
  .map(<span class="fstat-no" title="function not covered" >(s</span>tr) =&gt; <span class="cstat-no" title="statement not covered" >resolveURL(str))</span>
346
346
  .join(',')
347
- <span class="cstat-no" title="statement not covered" > app.send(SetNodeAttribute(id, 'srcset', resolvedSrcset))</span>
347
+ <span class="cstat-no" title="statement not covered" > app.attributeSender.sendSetAttribute(id, 'srcset', resolvedSrcset)</span>
348
348
  }
349
349
  &nbsp;
350
350
  const sendSrc = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function (i</span>d: number, img: HTMLImageElement): void {</span>
@@ -418,7 +418,7 @@ const PLACEHOLDER_SRC = <span class="cstat-no" title="statement not covered" >'h
418
418
  <div class='footer quiet pad2 space-top1 center small'>
419
419
  Code coverage generated by
420
420
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
421
- at 2023-05-31T15:51:28.464Z
421
+ at 2023-06-15T15:49:15.198Z
422
422
  </div>
423
423
  <script src="../../prettify.js"></script>
424
424
  <script>
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">0% </span>
26
+ <span class="strong">0.99% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>0/1059</span>
28
+ <span class='fraction'>11/1109</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
33
  <span class="strong">0% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>0/555</span>
35
+ <span class='fraction'>0/568</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">0% </span>
40
+ <span class="strong">2.4% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>0/190</span>
42
+ <span class='fraction'>5/208</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">0% </span>
47
+ <span class="strong">0.74% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>0/1027</span>
49
+ <span class='fraction'>8/1072</span>
50
50
  </div>
51
51
 
52
52
 
@@ -79,6 +79,21 @@
79
79
  </tr>
80
80
  </thead>
81
81
  <tbody><tr>
82
+ <td class="file low" data-value="attributeSender.ts"><a href="attributeSender.ts.html">attributeSender.ts</a></td>
83
+ <td data-value="0" class="pic low">
84
+ <div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
85
+ </td>
86
+ <td data-value="0" class="pct low">0%</td>
87
+ <td data-value="18" class="abs low">0/18</td>
88
+ <td data-value="0" class="pct low">0%</td>
89
+ <td data-value="2" class="abs low">0/2</td>
90
+ <td data-value="0" class="pct low">0%</td>
91
+ <td data-value="6" class="abs low">0/6</td>
92
+ <td data-value="0" class="pct low">0%</td>
93
+ <td data-value="18" class="abs low">0/18</td>
94
+ </tr>
95
+
96
+ <tr>
82
97
  <td class="file low" data-value="axiosSpy.ts"><a href="axiosSpy.ts.html">axiosSpy.ts</a></td>
83
98
  <td data-value="0" class="pic low">
84
99
  <div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
@@ -168,6 +183,21 @@
168
183
  <td data-value="35" class="abs low">0/35</td>
169
184
  </tr>
170
185
 
186
+ <tr>
187
+ <td class="file low" data-value="featureFlags.ts"><a href="featureFlags.ts.html">featureFlags.ts</a></td>
188
+ <td data-value="34.37" class="pic low">
189
+ <div class="chart"><div class="cover-fill" style="width: 34%"></div><div class="cover-empty" style="width: 66%"></div></div>
190
+ </td>
191
+ <td data-value="34.37" class="pct low">34.37%</td>
192
+ <td data-value="32" class="abs low">11/32</td>
193
+ <td data-value="0" class="pct low">0%</td>
194
+ <td data-value="11" class="abs low">0/11</td>
195
+ <td data-value="41.66" class="pct low">41.66%</td>
196
+ <td data-value="12" class="abs low">5/12</td>
197
+ <td data-value="29.62" class="pct low">29.62%</td>
198
+ <td data-value="27" class="abs low">8/27</td>
199
+ </tr>
200
+
171
201
  <tr>
172
202
  <td class="file low" data-value="focus.ts"><a href="focus.ts.html">focus.ts</a></td>
173
203
  <td data-value="0" class="pic low">
@@ -356,7 +386,7 @@
356
386
  <div class='footer quiet pad2 space-top1 center small'>
357
387
  Code coverage generated by
358
388
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
359
- at 2023-05-31T15:51:28.464Z
389
+ at 2023-06-15T15:49:15.198Z
360
390
  </div>
361
391
  <script src="../../prettify.js"></script>
362
392
  <script>
@@ -796,7 +796,7 @@ export interface Options {
796
796
  <div class='footer quiet pad2 space-top1 center small'>
797
797
  Code coverage generated by
798
798
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
799
- at 2023-05-31T15:51:28.464Z
799
+ at 2023-06-15T15:49:15.198Z
800
800
  </div>
801
801
  <script src="../../prettify.js"></script>
802
802
  <script>
@@ -811,7 +811,7 @@ export interface MouseHandlerOptions {
811
811
  <div class='footer quiet pad2 space-top1 center small'>
812
812
  Code coverage generated by
813
813
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
814
- at 2023-05-31T15:51:28.464Z
814
+ at 2023-06-15T15:49:15.198Z
815
815
  </div>
816
816
  <script src="../../prettify.js"></script>
817
817
  <script>
@@ -1114,7 +1114,7 @@ export interface Options {
1114
1114
  <div class='footer quiet pad2 space-top1 center small'>
1115
1115
  Code coverage generated by
1116
1116
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1117
- at 2023-05-31T15:51:28.464Z
1117
+ at 2023-06-15T15:49:15.198Z
1118
1118
  </div>
1119
1119
  <script src="../../prettify.js"></script>
1120
1120
  <script>
@@ -352,7 +352,7 @@ export interface Options {
352
352
  <div class='footer quiet pad2 space-top1 center small'>
353
353
  Code coverage generated by
354
354
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
355
- at 2023-05-31T15:51:28.464Z
355
+ at 2023-06-15T15:49:15.198Z
356
356
  </div>
357
357
  <script src="../../prettify.js"></script>
358
358
  <script>
@@ -349,7 +349,7 @@ function <span class="fstat-no" title="function not covered" >getDocumentScroll(
349
349
  <div class='footer quiet pad2 space-top1 center small'>
350
350
  Code coverage generated by
351
351
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
352
- at 2023-05-31T15:51:28.464Z
352
+ at 2023-06-15T15:49:15.198Z
353
353
  </div>
354
354
  <script src="../../prettify.js"></script>
355
355
  <script>
@@ -187,7 +187,7 @@ function <span class="fstat-no" title="function not covered" >selection(</span>a
187
187
  <div class='footer quiet pad2 space-top1 center small'>
188
188
  Code coverage generated by
189
189
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
190
- at 2023-05-31T15:51:28.464Z
190
+ at 2023-06-15T15:49:15.198Z
191
191
  </div>
192
192
  <script src="../../prettify.js"></script>
193
193
  <script>
@@ -109,7 +109,7 @@
109
109
  <div class='footer quiet pad2 space-top1 center small'>
110
110
  Code coverage generated by
111
111
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
112
- at 2023-05-31T15:51:28.464Z
112
+ at 2023-06-15T15:49:15.198Z
113
113
  </div>
114
114
  <script src="../../prettify.js"></script>
115
115
  <script>