-
Notifications
You must be signed in to change notification settings - Fork 43
/
index.js
103 lines (98 loc) · 2.65 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import perf from './performance'
import now from './now'
function throwIfEmpty (name) {
if (!name) {
throw new Error('name must be non-empty')
}
}
// simple binary sort insertion
function insertSorted (arr, item) {
let low = 0
let high = arr.length
let mid
while (low < high) {
mid = (low + high) >>> 1 // like (num / 2) but faster
if (arr[mid].startTime < item.startTime) {
low = mid + 1
} else {
high = mid
}
}
arr.splice(low, 0, item)
}
let mark
let stop
let getEntries
let clear
if (
perf &&
perf.mark &&
perf.measure &&
perf.getEntriesByName &&
perf.getEntriesByType &&
perf.clearMarks &&
perf.clearMeasures &&
// In Node, we want to detect that this perf/correctness fix [1] is available, which
// landed in Node 16.15.0, 17.6.0, and 18.0.0. However, it's not observable, and
// we don't want to rely on fragile version checks.
// So we can rely on this observable change [2] to add clearResourceTimings, which
// landed a bit later (18.2.0), but is close enough for our purposes.
// [1]: https://github.com/nodejs/node/pull/42032
// [2]: https://github.com/nodejs/node/pull/42725
(process.browser || perf.clearResourceTimings)
) {
mark = name => {
throwIfEmpty(name)
perf.mark(`start ${name}`)
}
stop = name => {
throwIfEmpty(name)
perf.mark(`end ${name}`)
const measure = perf.measure(name, `start ${name}`, `end ${name}`)
if (measure) {
// return value from performance.measure not supported in all browsers
// https://developer.mozilla.org/en-US/docs/Web/API/Performance/measure#browser_compatibility
return measure
}
const entries = perf.getEntriesByName(name)
return entries[entries.length - 1]
}
getEntries = () => perf.getEntriesByType('measure')
clear = () => {
perf.clearMarks()
perf.clearMeasures()
}
} else {
let marks = {}
let entries = []
mark = name => {
throwIfEmpty(name)
const startTime = now()
marks['$' + name] = startTime
}
stop = name => {
throwIfEmpty(name)
const endTime = now()
const startTime = marks['$' + name]
if (!startTime) {
throw new Error(`no known mark: ${name}`)
}
const entry = {
startTime,
name,
duration: endTime - startTime,
entryType: 'measure'
}
// per the spec this should be at least 150:
// https://www.w3.org/TR/resource-timing-1/#extensions-performance-interface
// we just have no limit, per Chrome and Edge's de-facto behavior
insertSorted(entries, entry)
return entry
}
getEntries = () => entries
clear = () => {
marks = {}
entries = []
}
}
export { mark, stop, getEntries, clear }