diff options
author | Satya Rohith <me@satyarohith.com> | 2021-06-07 17:49:33 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-06-07 14:19:33 +0200 |
commit | b6400a25a0ee60467a0287d725e61c876677e103 (patch) | |
tree | 7577846005e160141ffb8bd9d861dbfe365324ff /runtime/js | |
parent | 89290741d18d9b247cefccdc95563ec688a28491 (diff) |
refactor(runtime): move performance API to timers extension (#10818)
Co-authored-by: Luca Casonato <hello@lcas.dev>
Diffstat (limited to 'runtime/js')
-rw-r--r-- | runtime/js/01_web_util.js | 60 | ||||
-rw-r--r-- | runtime/js/40_performance.js | 364 |
2 files changed, 0 insertions, 424 deletions
diff --git a/runtime/js/01_web_util.js b/runtime/js/01_web_util.js index 5960691eb..11294a9bb 100644 --- a/runtime/js/01_web_util.js +++ b/runtime/js/01_web_util.js @@ -17,65 +17,6 @@ } } - const objectCloneMemo = new WeakMap(); - - function cloneArrayBuffer( - srcBuffer, - srcByteOffset, - srcLength, - _cloneConstructor, - ) { - // this function fudges the return type but SharedArrayBuffer is disabled for a while anyway - return srcBuffer.slice( - srcByteOffset, - srcByteOffset + srcLength, - ); - } - - /** Clone a value in a similar way to structured cloning. It is similar to a - * StructureDeserialize(StructuredSerialize(...)). */ - function cloneValue(value) { - // Performance optimization for buffers, otherwise - // `serialize/deserialize` will allocate new buffer. - if (value instanceof ArrayBuffer) { - const cloned = cloneArrayBuffer( - value, - 0, - value.byteLength, - ArrayBuffer, - ); - objectCloneMemo.set(value, cloned); - return cloned; - } - if (ArrayBuffer.isView(value)) { - const clonedBuffer = cloneValue(value.buffer); - // Use DataViewConstructor type purely for type-checking, can be a - // DataView or TypedArray. They use the same constructor signature, - // only DataView has a length in bytes and TypedArrays use a length in - // terms of elements, so we adjust for that. - let length; - if (value instanceof DataView) { - length = value.byteLength; - } else { - length = value.length; - } - return new (value.constructor)( - clonedBuffer, - value.byteOffset, - length, - ); - } - - try { - return Deno.core.deserialize(Deno.core.serialize(value)); - } catch (e) { - if (e instanceof TypeError) { - throw new DOMException("Uncloneable value", "DataCloneError"); - } - throw e; - } - } - const handlerSymbol = Symbol("eventHandlers"); function makeWrappedHandler(handler) { function wrappedHandler(...args) { @@ -114,6 +55,5 @@ illegalConstructorKey, requiredArguments, defineEventHandler, - cloneValue, }; })(this); diff --git a/runtime/js/40_performance.js b/runtime/js/40_performance.js deleted file mode 100644 index 24c35b5c0..000000000 --- a/runtime/js/40_performance.js +++ /dev/null @@ -1,364 +0,0 @@ -// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license. -"use strict"; - -((window) => { - const { opNow } = window.__bootstrap.timers; - const { cloneValue, illegalConstructorKey } = window.__bootstrap.webUtil; - const { requiredArguments } = window.__bootstrap.webUtil; - - const customInspect = Symbol.for("Deno.customInspect"); - let performanceEntries = []; - - function findMostRecent( - name, - type, - ) { - return performanceEntries - .slice() - .reverse() - .find((entry) => entry.name === name && entry.entryType === type); - } - - function convertMarkToTimestamp(mark) { - if (typeof mark === "string") { - const entry = findMostRecent(mark, "mark"); - if (!entry) { - throw new DOMException( - `Cannot find mark: "${mark}".`, - "SyntaxError", - ); - } - return entry.startTime; - } - if (mark < 0) { - throw new TypeError("Mark cannot be negative."); - } - return mark; - } - - function filterByNameType( - name, - type, - ) { - return performanceEntries.filter( - (entry) => - (name ? entry.name === name : true) && - (type ? entry.entryType === type : true), - ); - } - - const now = opNow; - - class PerformanceEntry { - #name = ""; - #entryType = ""; - #startTime = 0; - #duration = 0; - - get name() { - return this.#name; - } - - get entryType() { - return this.#entryType; - } - - get startTime() { - return this.#startTime; - } - - get duration() { - return this.#duration; - } - - constructor( - name = null, - entryType = null, - startTime = null, - duration = null, - key = null, - ) { - if (key != illegalConstructorKey) { - throw new TypeError("Illegal constructor."); - } - this.#name = name; - this.#entryType = entryType; - this.#startTime = startTime; - this.#duration = duration; - } - - toJSON() { - return { - name: this.#name, - entryType: this.#entryType, - startTime: this.#startTime, - duration: this.#duration, - }; - } - - [customInspect]() { - return `${this.constructor.name} { name: "${this.name}", entryType: "${this.entryType}", startTime: ${this.startTime}, duration: ${this.duration} }`; - } - } - - class PerformanceMark extends PerformanceEntry { - [Symbol.toStringTag] = "PerformanceMark"; - - #detail = null; - - get detail() { - return this.#detail; - } - - get entryType() { - return "mark"; - } - - constructor( - name, - options = {}, - ) { - requiredArguments("PerformanceMark", arguments.length, 1); - - // ensure options is object-ish, or null-ish - switch (typeof options) { - case "object": // includes null - case "function": - case "undefined": { - break; - } - default: { - throw new TypeError("Invalid options"); - } - } - - const { detail = null, startTime = now() } = options ?? {}; - - super(name, "mark", startTime, 0, illegalConstructorKey); - if (startTime < 0) { - throw new TypeError("startTime cannot be negative"); - } - this.#detail = cloneValue(detail); - } - - toJSON() { - return { - name: this.name, - entryType: this.entryType, - startTime: this.startTime, - duration: this.duration, - detail: this.detail, - }; - } - - [customInspect]() { - return this.detail - ? `${this.constructor.name} {\n detail: ${ - JSON.stringify(this.detail, null, 2) - },\n name: "${this.name}",\n entryType: "${this.entryType}",\n startTime: ${this.startTime},\n duration: ${this.duration}\n}` - : `${this.constructor.name} { detail: ${this.detail}, name: "${this.name}", entryType: "${this.entryType}", startTime: ${this.startTime}, duration: ${this.duration} }`; - } - } - - class PerformanceMeasure extends PerformanceEntry { - [Symbol.toStringTag] = "PerformanceMeasure"; - - #detail = null; - - get detail() { - return this.#detail; - } - - get entryType() { - return "measure"; - } - - constructor( - name, - startTime, - duration, - detail = null, - key, - ) { - if (key != illegalConstructorKey) { - throw new TypeError("Illegal constructor."); - } - super(name, "measure", startTime, duration, illegalConstructorKey); - this.#detail = cloneValue(detail); - } - - toJSON() { - return { - name: this.name, - entryType: this.entryType, - startTime: this.startTime, - duration: this.duration, - detail: this.detail, - }; - } - - [customInspect]() { - return this.detail - ? `${this.constructor.name} {\n detail: ${ - JSON.stringify(this.detail, null, 2) - },\n name: "${this.name}",\n entryType: "${this.entryType}",\n startTime: ${this.startTime},\n duration: ${this.duration}\n}` - : `${this.constructor.name} { detail: ${this.detail}, name: "${this.name}", entryType: "${this.entryType}", startTime: ${this.startTime}, duration: ${this.duration} }`; - } - } - - class Performance { - constructor(key = null) { - if (key != illegalConstructorKey) { - throw new TypeError("Illegal constructor."); - } - } - - clearMarks(markName) { - if (markName == null) { - performanceEntries = performanceEntries.filter( - (entry) => entry.entryType !== "mark", - ); - } else { - performanceEntries = performanceEntries.filter( - (entry) => !(entry.name === markName && entry.entryType === "mark"), - ); - } - } - - clearMeasures(measureName) { - if (measureName == null) { - performanceEntries = performanceEntries.filter( - (entry) => entry.entryType !== "measure", - ); - } else { - performanceEntries = performanceEntries.filter( - (entry) => - !(entry.name === measureName && entry.entryType === "measure"), - ); - } - } - - getEntries() { - return filterByNameType(); - } - - getEntriesByName( - name, - type, - ) { - return filterByNameType(name, type); - } - - getEntriesByType(type) { - return filterByNameType(undefined, type); - } - - mark( - markName, - options = {}, - ) { - // 3.1.1.1 If the global object is a Window object and markName uses the - // same name as a read only attribute in the PerformanceTiming interface, - // throw a SyntaxError. - not implemented - const entry = new PerformanceMark(markName, options); - // 3.1.1.7 Queue entry - not implemented - performanceEntries.push(entry); - return entry; - } - - measure( - measureName, - startOrMeasureOptions = {}, - endMark, - ) { - if ( - startOrMeasureOptions && typeof startOrMeasureOptions === "object" && - Object.keys(startOrMeasureOptions).length > 0 - ) { - if (endMark) { - throw new TypeError("Options cannot be passed with endMark."); - } - if ( - !("start" in startOrMeasureOptions) && - !("end" in startOrMeasureOptions) - ) { - throw new TypeError( - "A start or end mark must be supplied in options.", - ); - } - if ( - "start" in startOrMeasureOptions && - "duration" in startOrMeasureOptions && - "end" in startOrMeasureOptions - ) { - throw new TypeError( - "Cannot specify start, end, and duration together in options.", - ); - } - } - let endTime; - if (endMark) { - endTime = convertMarkToTimestamp(endMark); - } else if ( - typeof startOrMeasureOptions === "object" && - "end" in startOrMeasureOptions - ) { - endTime = convertMarkToTimestamp(startOrMeasureOptions.end); - } else if ( - typeof startOrMeasureOptions === "object" && - "start" in startOrMeasureOptions && - "duration" in startOrMeasureOptions - ) { - const start = convertMarkToTimestamp(startOrMeasureOptions.start); - const duration = convertMarkToTimestamp(startOrMeasureOptions.duration); - endTime = start + duration; - } else { - endTime = now(); - } - let startTime; - if ( - typeof startOrMeasureOptions === "object" && - "start" in startOrMeasureOptions - ) { - startTime = convertMarkToTimestamp(startOrMeasureOptions.start); - } else if ( - typeof startOrMeasureOptions === "object" && - "end" in startOrMeasureOptions && - "duration" in startOrMeasureOptions - ) { - const end = convertMarkToTimestamp(startOrMeasureOptions.end); - const duration = convertMarkToTimestamp(startOrMeasureOptions.duration); - startTime = end - duration; - } else if (typeof startOrMeasureOptions === "string") { - startTime = convertMarkToTimestamp(startOrMeasureOptions); - } else { - startTime = 0; - } - const entry = new PerformanceMeasure( - measureName, - startTime, - endTime - startTime, - typeof startOrMeasureOptions === "object" - ? startOrMeasureOptions.detail ?? null - : null, - illegalConstructorKey, - ); - performanceEntries.push(entry); - return entry; - } - - now() { - return now(); - } - } - - const performance = new Performance(illegalConstructorKey); - - window.__bootstrap.performance = { - PerformanceEntry, - PerformanceMark, - PerformanceMeasure, - Performance, - performance, - }; -})(this); |