You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
52 lines
1.6 KiB
52 lines
1.6 KiB
import { globalThisShim as globalThis } from "./globalThis.js"; |
|
export function pick(obj, ...attr) { |
|
return attr.reduce((acc, k) => { |
|
if (obj.hasOwnProperty(k)) { |
|
acc[k] = obj[k]; |
|
} |
|
return acc; |
|
}, {}); |
|
} |
|
// Keep a reference to the real timeout functions so they can be used when overridden |
|
const NATIVE_SET_TIMEOUT = setTimeout; |
|
const NATIVE_CLEAR_TIMEOUT = clearTimeout; |
|
export function installTimerFunctions(obj, opts) { |
|
if (opts.useNativeTimers) { |
|
obj.setTimeoutFn = NATIVE_SET_TIMEOUT.bind(globalThis); |
|
obj.clearTimeoutFn = NATIVE_CLEAR_TIMEOUT.bind(globalThis); |
|
} |
|
else { |
|
obj.setTimeoutFn = setTimeout.bind(globalThis); |
|
obj.clearTimeoutFn = clearTimeout.bind(globalThis); |
|
} |
|
} |
|
// base64 encoded buffers are about 33% bigger (https://en.wikipedia.org/wiki/Base64) |
|
const BASE64_OVERHEAD = 1.33; |
|
// we could also have used `new Blob([obj]).size`, but it isn't supported in IE9 |
|
export function byteLength(obj) { |
|
if (typeof obj === "string") { |
|
return utf8Length(obj); |
|
} |
|
// arraybuffer or blob |
|
return Math.ceil((obj.byteLength || obj.size) * BASE64_OVERHEAD); |
|
} |
|
function utf8Length(str) { |
|
let c = 0, length = 0; |
|
for (let i = 0, l = str.length; i < l; i++) { |
|
c = str.charCodeAt(i); |
|
if (c < 0x80) { |
|
length += 1; |
|
} |
|
else if (c < 0x800) { |
|
length += 2; |
|
} |
|
else if (c < 0xd800 || c >= 0xe000) { |
|
length += 3; |
|
} |
|
else { |
|
i++; |
|
length += 4; |
|
} |
|
} |
|
return length; |
|
}
|
|
|