1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-11-25 15:29:32 -05:00

refactor: use primordials in extensions/web (#11273)

Co-authored-by: Divy Srivastava <dj.srivastava23@gmail.com>
This commit is contained in:
Bartek Iwańczuk 2021-07-06 14:38:12 +02:00 committed by GitHub
parent f139a0cc11
commit 1aac47720b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 131 additions and 54 deletions

4
core/internal.d.ts vendored
View file

@ -834,6 +834,10 @@ declare namespace __bootstrap {
export const TypeErrorLength: typeof TypeError.length;
export const TypeErrorName: typeof TypeError.name;
export const TypeErrorPrototype: typeof TypeError.prototype;
export const TypedArrayFrom: (
constructor: Uint8ArrayConstructor,
arrayLike: ArrayLike<number>,
) => Uint8Array;
export const TypedArrayPrototypeCopyWithin: UncurryThis<
typeof Uint8Array.prototype.copyWithin
>;

View file

@ -2,6 +2,7 @@
// @ts-check
/// <reference path="../../core/lib.deno_core.d.ts" />
/// <reference path="../../core/internal.d.ts" />
/// <reference path="../web/internal.d.ts" />
/// <reference path="../web/lib.deno_web.d.ts" />
@ -10,6 +11,15 @@
((window) => {
const core = window.Deno.core;
const { DOMException } = window.__bootstrap.domException;
const {
ArrayBuffer,
ArrayBufferIsView,
DataView,
TypedArrayPrototypeSlice,
TypeError,
WeakMap,
WeakMapPrototypeSet,
} = window.__bootstrap.primordials;
const objectCloneMemo = new WeakMap();
@ -20,7 +30,8 @@
_cloneConstructor,
) {
// this function fudges the return type but SharedArrayBuffer is disabled for a while anyway
return srcBuffer.slice(
return TypedArrayPrototypeSlice(
srcBuffer,
srcByteOffset,
srcByteOffset + srcLength,
);
@ -38,10 +49,10 @@
value.byteLength,
ArrayBuffer,
);
objectCloneMemo.set(value, cloned);
WeakMapPrototypeSet(objectCloneMemo, value, cloned);
return cloned;
}
if (ArrayBuffer.isView(value)) {
if (ArrayBufferIsView(value)) {
const clonedBuffer = structuredClone(value.buffer);
// Use DataViewConstructor type purely for type-checking, can be a
// DataView or TypedArray. They use the same constructor signature,

View file

@ -1,9 +1,22 @@
// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
"use strict";
// @ts-check
/// <reference path="../../core/internal.d.ts" />
((window) => {
const webidl = window.__bootstrap.webidl;
const { setIsTrusted, defineEventHandler } = window.__bootstrap.event;
const {
Boolean,
Set,
SetPrototypeAdd,
SetPrototypeClear,
SetPrototypeDelete,
Symbol,
SymbolToStringTag,
TypeError,
} = window.__bootstrap.primordials;
const add = Symbol("add");
const signalAbort = Symbol("signalAbort");
@ -22,7 +35,7 @@
}
[add](algorithm) {
this.#abortAlgorithms.add(algorithm);
SetPrototypeAdd(this.#abortAlgorithms, algorithm);
}
[signalAbort]() {
@ -33,14 +46,14 @@
for (const algorithm of this.#abortAlgorithms) {
algorithm();
}
this.#abortAlgorithms.clear();
SetPrototypeClear(this.#abortAlgorithms);
const event = new Event("abort");
setIsTrusted(event, true);
this.dispatchEvent(event);
}
[remove](algorithm) {
this.#abortAlgorithms.delete(algorithm);
SetPrototypeDelete(this.#abortAlgorithms, algorithm);
}
constructor(key = null) {
@ -55,7 +68,7 @@
return Boolean(this.#aborted);
}
get [Symbol.toStringTag]() {
get [SymbolToStringTag]() {
return "AbortSignal";
}
}
@ -74,7 +87,7 @@
this.#signal[signalAbort]();
}
get [Symbol.toStringTag]() {
get [SymbolToStringTag]() {
return "AbortController";
}
}

View file

@ -1,7 +1,16 @@
// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
"use strict";
// @ts-check
/// <reference path="../../core/internal.d.ts" />
((window) => {
const { EventTarget } = window;
const {
Symbol,
SymbolToStringTag,
TypeError,
} = window.__bootstrap.primordials;
const illegalConstructorKey = Symbol("illegalConstructorKey");
@ -13,7 +22,7 @@
super();
}
get [Symbol.toStringTag]() {
get [SymbolToStringTag]() {
return "Window";
}
}
@ -26,7 +35,7 @@
super();
}
get [Symbol.toStringTag]() {
get [SymbolToStringTag]() {
return "WorkerGlobalScope";
}
}
@ -39,7 +48,7 @@
super();
}
get [Symbol.toStringTag]() {
get [SymbolToStringTag]() {
return "DedicatedWorkerGlobalScope";
}
}

View file

@ -1,6 +1,7 @@
// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
// @ts-check
/// <reference path="../../core/internal.d.ts" />
/// <reference path="../webidl/internal.d.ts" />
/// <reference path="../web/internal.d.ts" />
/// <reference lib="esnext" />
@ -14,6 +15,13 @@
forgivingBase64Decode,
} = window.__bootstrap.infra;
const { DOMException } = window.__bootstrap.domException;
const {
ArrayPrototypeMap,
StringPrototypeCharCodeAt,
ArrayPrototypeJoin,
StringFromCharCode,
TypedArrayFrom,
} = window.__bootstrap.primordials;
/**
* @param {string} data
@ -26,10 +34,11 @@
});
const uint8Array = forgivingBase64Decode(data);
const result = [...uint8Array]
.map((byte) => String.fromCharCode(byte))
.join("");
return result;
const result = ArrayPrototypeMap(
[...uint8Array],
(byte) => StringFromCharCode(byte),
);
return ArrayPrototypeJoin(result, "");
}
/**
@ -43,8 +52,8 @@
prefix,
context: "Argument 1",
});
const byteArray = [...data].map((char) => {
const charCode = char.charCodeAt(0);
const byteArray = ArrayPrototypeMap([...data], (char) => {
const charCode = StringPrototypeCharCodeAt(char, 0);
if (charCode > 0xff) {
throw new DOMException(
"The string to be encoded contains characters outside of the Latin1 range.",
@ -53,7 +62,7 @@
}
return charCode;
});
return forgivingBase64Encode(Uint8Array.from(byteArray));
return forgivingBase64Encode(TypedArrayFrom(Uint8Array, byteArray));
}
window.__bootstrap.base64 = {

View file

@ -2,6 +2,7 @@
// @ts-check
/// <reference path="../../core/lib.deno_core.d.ts" />
/// <reference path="../../core/internal.d.ts" />
/// <reference path="../webidl/internal.d.ts" />
/// <reference path="../fetch/lib.deno_fetch.d.ts" />
/// <reference path="../web/internal.d.ts" />
@ -13,6 +14,17 @@
((window) => {
const core = Deno.core;
const webidl = window.__bootstrap.webidl;
const {
ArrayBufferIsView,
PromiseReject,
PromiseResolve,
StringPrototypeCharCodeAt,
StringPrototypeSlice,
SymbolToStringTag,
TypedArrayPrototypeSubarray,
TypedArrayPrototypeSlice,
Uint8Array,
} = window.__bootstrap.primordials;
class TextDecoder {
/** @type {string} */
@ -95,7 +107,7 @@
}
try {
if (ArrayBuffer.isView(input)) {
if (ArrayBufferIsView(input)) {
input = new Uint8Array(
input.buffer,
input.byteOffset,
@ -116,7 +128,7 @@
}
}
get [Symbol.toStringTag]() {
get [SymbolToStringTag]() {
return "TextDecoder";
}
}
@ -172,7 +184,7 @@
return core.opSync("op_encoding_encode_into", source, destination);
}
get [Symbol.toStringTag]() {
get [SymbolToStringTag]() {
return "TextEncoder";
}
}
@ -213,9 +225,9 @@
if (decoded) {
controller.enqueue(decoded);
}
return Promise.resolve();
return PromiseResolve();
} catch (err) {
return Promise.reject(err);
return PromiseReject(err);
}
},
flush: (controller) => {
@ -224,9 +236,9 @@
if (final) {
controller.enqueue(final);
}
return Promise.resolve();
return PromiseResolve();
} catch (err) {
return Promise.reject(err);
return PromiseReject(err);
}
},
});
@ -263,7 +275,7 @@
return this.#transform.writable;
}
get [Symbol.toStringTag]() {
get [SymbolToStringTag]() {
return "TextDecoderStream";
}
}
@ -286,19 +298,22 @@
if (this.#pendingHighSurrogate !== null) {
chunk = this.#pendingHighSurrogate + chunk;
}
const lastCodeUnit = chunk.charCodeAt(chunk.length - 1);
const lastCodeUnit = StringPrototypeCharCodeAt(
chunk,
chunk.length - 1,
);
if (0xD800 <= lastCodeUnit && lastCodeUnit <= 0xDBFF) {
this.#pendingHighSurrogate = chunk.slice(-1);
chunk = chunk.slice(0, -1);
this.#pendingHighSurrogate = StringPrototypeSlice(chunk, -1);
chunk = StringPrototypeSlice(chunk, 0, -1);
} else {
this.#pendingHighSurrogate = null;
}
if (chunk) {
controller.enqueue(core.encode(chunk));
}
return Promise.resolve();
return PromiseResolve();
} catch (err) {
return Promise.reject(err);
return PromiseReject(err);
}
},
flush: (controller) => {
@ -306,9 +321,9 @@
if (this.#pendingHighSurrogate !== null) {
controller.enqueue(new Uint8Array([0xEF, 0xBF, 0xBD]));
}
return Promise.resolve();
return PromiseResolve();
} catch (err) {
return Promise.reject(err);
return PromiseReject(err);
}
},
});
@ -333,7 +348,7 @@
return this.#transform.writable;
}
get [Symbol.toStringTag]() {
get [SymbolToStringTag]() {
return "TextEncoderStream";
}
}
@ -377,14 +392,16 @@
if (BOMEncoding === "UTF-8") start = 3;
else start = 2;
}
return new TextDecoder(encoding).decode(bytes.slice(start));
return new TextDecoder(encoding).decode(
TypedArrayPrototypeSlice(bytes, start),
);
}
/**
* @param {Uint8Array} bytes
*/
function BOMSniff(bytes) {
const BOM = bytes.subarray(0, 3);
const BOM = TypedArrayPrototypeSubarray(bytes, 0, 3);
if (BOM[0] === 0xEF && BOM[1] === 0xBB && BOM[2] === 0xBF) {
return "UTF-8";
}

View file

@ -1,9 +1,23 @@
// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
"use strict";
/// <reference path="../../core/internal.d.ts" />
((window) => {
const { URL } = window.__bootstrap.url;
const { DOMException } = window.__bootstrap.domException;
const {
Error,
ObjectDefineProperties,
ReferenceError,
Symbol,
SymbolFor,
SymbolToStringTag,
TypeError,
WeakMap,
WeakMapPrototypeGet,
WeakMapPrototypeSet,
} = window.__bootstrap.primordials;
const locationConstructorKey = Symbol("locationConstuctorKey");
@ -20,7 +34,7 @@
const url = new URL(href);
url.username = "";
url.password = "";
Object.defineProperties(this, {
ObjectDefineProperties(this, {
hash: {
get() {
return url.hash;
@ -167,7 +181,7 @@
},
enumerable: true,
},
[Symbol.for("Deno.privateCustomInspect")]: {
[SymbolFor("Deno.privateCustomInspect")]: {
value: function (inspect) {
const object = {
hash: this.hash,
@ -187,8 +201,8 @@
}
}
Object.defineProperties(Location.prototype, {
[Symbol.toStringTag]: {
ObjectDefineProperties(Location.prototype, {
[SymbolToStringTag]: {
value: "Location",
configurable: true,
},
@ -204,14 +218,14 @@
const url = new URL(href);
url.username = "";
url.password = "";
workerLocationUrls.set(this, url);
WeakMapPrototypeSet(workerLocationUrls, this, url);
}
}
Object.defineProperties(WorkerLocation.prototype, {
ObjectDefineProperties(WorkerLocation.prototype, {
hash: {
get() {
const url = workerLocationUrls.get(this);
const url = WeakMapPrototypeGet(workerLocationUrls, this);
if (url == null) {
throw new TypeError("Illegal invocation.");
}
@ -222,7 +236,7 @@
},
host: {
get() {
const url = workerLocationUrls.get(this);
const url = WeakMapPrototypeGet(workerLocationUrls, this);
if (url == null) {
throw new TypeError("Illegal invocation.");
}
@ -233,7 +247,7 @@
},
hostname: {
get() {
const url = workerLocationUrls.get(this);
const url = WeakMapPrototypeGet(workerLocationUrls, this);
if (url == null) {
throw new TypeError("Illegal invocation.");
}
@ -244,7 +258,7 @@
},
href: {
get() {
const url = workerLocationUrls.get(this);
const url = WeakMapPrototypeGet(workerLocationUrls, this);
if (url == null) {
throw new TypeError("Illegal invocation.");
}
@ -255,7 +269,7 @@
},
origin: {
get() {
const url = workerLocationUrls.get(this);
const url = WeakMapPrototypeGet(workerLocationUrls, this);
if (url == null) {
throw new TypeError("Illegal invocation.");
}
@ -266,7 +280,7 @@
},
pathname: {
get() {
const url = workerLocationUrls.get(this);
const url = WeakMapPrototypeGet(workerLocationUrls, this);
if (url == null) {
throw new TypeError("Illegal invocation.");
}
@ -277,7 +291,7 @@
},
port: {
get() {
const url = workerLocationUrls.get(this);
const url = WeakMapPrototypeGet(workerLocationUrls, this);
if (url == null) {
throw new TypeError("Illegal invocation.");
}
@ -288,7 +302,7 @@
},
protocol: {
get() {
const url = workerLocationUrls.get(this);
const url = WeakMapPrototypeGet(workerLocationUrls, this);
if (url == null) {
throw new TypeError("Illegal invocation.");
}
@ -299,7 +313,7 @@
},
search: {
get() {
const url = workerLocationUrls.get(this);
const url = WeakMapPrototypeGet(workerLocationUrls, this);
if (url == null) {
throw new TypeError("Illegal invocation.");
}
@ -310,7 +324,7 @@
},
toString: {
value: function toString() {
const url = workerLocationUrls.get(this);
const url = WeakMapPrototypeGet(workerLocationUrls, this);
if (url == null) {
throw new TypeError("Illegal invocation.");
}
@ -320,11 +334,11 @@
enumerable: true,
writable: true,
},
[Symbol.toStringTag]: {
[SymbolToStringTag]: {
value: "WorkerLocation",
configurable: true,
},
[Symbol.for("Deno.privateCustomInspect")]: {
[SymbolFor("Deno.privateCustomInspect")]: {
value: function (inspect) {
const object = {
hash: this.hash,