New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

@jsenv/fetch

Package Overview
Dependencies
Maintainers
2
Versions
86
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@jsenv/fetch - npm Package Compare versions

Comparing version 1.1.32 to 1.1.33

6

package.json
{
"name": "@jsenv/fetch",
"version": "1.1.32",
"version": "1.1.33",
"description": "Unified url fetcher (http, http, file, data)",

@@ -13,3 +13,3 @@ "license": "MIT",

"type": "git",
"url": "https://github.com/jsenv/jsenv-core",
"url": "https://github.com/jsenv/core",
"directory": "packages/fetch"

@@ -41,5 +41,5 @@ },

"@jsenv/urls": "2.0.0",
"@jsenv/server": "15.0.2",
"@jsenv/server": "15.0.3",
"node-fetch": "2.6.7"
}
}

@@ -6,3 +6,3 @@ # fetchUrl

```js
import { fetchUrl } from "@jsenv/fetch"
import { fetchUrl } from "@jsenv/fetch";

@@ -14,3 +14,3 @@ const responseForFile = await fetchUrl("file:///Users/you/index.html", {

},
})
});

@@ -22,3 +22,3 @@ const responseForHttp = await fetchUrl("http://example.com/file.js", {

},
})
});
```
export const fetchAndEvalUsingScript = async (src) => {
return new Promise((resolve, reject) => {
const script = document.createElement("script")
const script = document.createElement("script");
const onwindowerror = (errorEvent) => {
if (errorEvent.filename === src) {
cleanup()
reject(errorEvent.error)
cleanup();
reject(errorEvent.error);
}
}
};
const onscripterror = () => {
cleanup()
reject(new Error(`Error loading ${src}`))
}
cleanup();
reject(new Error(`Error loading ${src}`));
};
const onscriptload = () => {
cleanup()
resolve()
}
cleanup();
resolve();
};
const cleanup = () => {
removeOnWindowError()
removeOnScriptError()
removeOnScriptLoad()
document.head.removeChild(script)
}
removeOnWindowError();
removeOnScriptError();
removeOnScriptLoad();
document.head.removeChild(script);
};
const removeOnWindowError = () =>
window.removeEventListener("error", onwindowerror)
window.removeEventListener("error", onwindowerror);
const removeOnScriptError = () =>
script.removeEventListener("error", onscripterror)
script.removeEventListener("error", onscripterror);
const removeOnScriptLoad = () =>
script.removeEventListener("load", onscriptload)
script.removeEventListener("load", onscriptload);
window.addEventListener("error", onwindowerror)
script.addEventListener("error", onscripterror)
script.addEventListener("load", onscriptload)
script.charset = "utf-8"
script.crossOrigin = "anonymous"
script.src = src
window.addEventListener("error", onwindowerror);
script.addEventListener("error", onscripterror);
script.addEventListener("load", onscriptload);
script.charset = "utf-8";
script.crossOrigin = "anonymous";
script.src = src;
document.head.appendChild(script)
})
}
document.head.appendChild(script);
});
};

@@ -1,12 +0,12 @@

import { fetchUrl } from "./fetch_url_browser.js"
import { fetchUrl } from "./fetch_url_browser.js";
export const fetchAndEval = async (url) => {
const response = await fetchUrl(url)
const response = await fetchUrl(url);
if (response.status >= 200 && response.status <= 299) {
const text = await response.text()
const text = await response.text();
// eslint-disable-next-line no-eval
window.eval(appendSourceURL(text, url))
window.eval(appendSourceURL(text, url));
} else {
const text = await response.text()
const text = await response.text();
throw new Error(

@@ -20,9 +20,9 @@ `Unexpected response for script.

${response.status}`,
)
);
}
}
};
const appendSourceURL = (code, sourceURL) => {
return `${code}
${"//#"} sourceURL=${sourceURL}`
}
${"//#"} sourceURL=${sourceURL}`;
};

@@ -1,7 +0,7 @@

import { fetchUrl } from "./fetch_url_browser.js"
import { fetchUrl } from "./fetch_url_browser.js";
export const fetchJson = async (url, options = {}) => {
const response = await fetchUrl(url, options)
const object = await response.json()
return object
}
const response = await fetchUrl(url, options);
const object = await response.json();
return object;
};

@@ -1,3 +0,3 @@

import { fetchUsingXHR } from "./fetch_using_xhr.js"
import { fetchUsingFetch } from "./fetch_using_fetch.js"
import { fetchUsingXHR } from "./fetch_using_xhr.js";
import { fetchUsingFetch } from "./fetch_using_fetch.js";

@@ -8,2 +8,2 @@ export const fetchUrl =

? fetchUsingFetch
: fetchUsingXHR
: fetchUsingXHR;

@@ -8,3 +8,3 @@ export const fetchUsingFetch = async (

...options,
})
});
return {

@@ -20,11 +20,11 @@ url: response.url,

formData: () => response.formData(),
}
}
};
};
const responseToHeaders = (response) => {
const headers = {}
const headers = {};
response.headers.forEach((value, name) => {
headers[name] = value
})
return headers
}
headers[name] = value;
});
return headers;
};

@@ -11,6 +11,6 @@ export const fetchUsingXHR = async (

) => {
const headersPromise = createPromiseAndHooks()
const bodyPromise = createPromiseAndHooks()
const headersPromise = createPromiseAndHooks();
const bodyPromise = createPromiseAndHooks();
const xhr = new XMLHttpRequest()
const xhr = new XMLHttpRequest();

@@ -20,80 +20,80 @@ const failure = (error) => {

if (headersPromise.settled) {
bodyPromise.reject(error)
bodyPromise.reject(error);
} else {
headersPromise.reject(error)
headersPromise.reject(error);
}
}
};
const cleanup = () => {
xhr.ontimeout = null
xhr.onerror = null
xhr.onload = null
xhr.onreadystatechange = null
}
xhr.ontimeout = null;
xhr.onerror = null;
xhr.onload = null;
xhr.onreadystatechange = null;
};
xhr.ontimeout = () => {
cleanup()
failure(new Error(`xhr request timeout on ${url}.`))
}
cleanup();
failure(new Error(`xhr request timeout on ${url}.`));
};
xhr.onerror = (error) => {
cleanup()
cleanup();
// unfortunately with have no clue why it fails
// might be cors for instance
failure(createRequestError(error, { url }))
}
failure(createRequestError(error, { url }));
};
xhr.onload = () => {
cleanup()
bodyPromise.resolve()
}
cleanup();
bodyPromise.resolve();
};
signal.addEventListener("abort", () => {
xhr.abort()
const abortError = new Error("aborted")
abortError.name = "AbortError"
failure(abortError)
})
xhr.abort();
const abortError = new Error("aborted");
abortError.name = "AbortError";
failure(abortError);
});
xhr.onreadystatechange = () => {
// https://developer.mozilla.org/fr/docs/Web/API/XMLHttpRequest/readyState
const { readyState } = xhr
const { readyState } = xhr;
if (readyState === 2) {
headersPromise.resolve()
headersPromise.resolve();
} else if (readyState === 4) {
cleanup()
bodyPromise.resolve()
cleanup();
bodyPromise.resolve();
}
}
};
xhr.open(method, url, true)
xhr.open(method, url, true);
Object.keys(headers).forEach((key) => {
xhr.setRequestHeader(key, headers[key])
})
xhr.withCredentials = computeWithCredentials({ credentials, url })
xhr.setRequestHeader(key, headers[key]);
});
xhr.withCredentials = computeWithCredentials({ credentials, url });
if ("responseType" in xhr && hasBlob) {
xhr.responseType = "blob"
xhr.responseType = "blob";
}
xhr.send(body)
xhr.send(body);
await headersPromise
await headersPromise;
// https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/responseURL
const responseUrl =
"responseURL" in xhr ? xhr.responseURL : headers["x-request-url"]
let responseStatus = xhr.status
const responseStatusText = xhr.statusText
const responseHeaders = getHeadersFromXHR(xhr)
"responseURL" in xhr ? xhr.responseURL : headers["x-request-url"];
let responseStatus = xhr.status;
const responseStatusText = xhr.statusText;
const responseHeaders = getHeadersFromXHR(xhr);
const readBody = async () => {
await bodyPromise
await bodyPromise;
const { status } = xhr
const { status } = xhr;
// in Chrome on file:/// URLs, status is 0
if (status === 0) {
responseStatus = 200
responseStatus = 200;
}
const body = "response" in xhr ? xhr.response : xhr.responseText
const body = "response" in xhr ? xhr.response : xhr.responseText;

@@ -103,19 +103,19 @@ return {

responseBodyType: detectBodyType(body),
}
}
};
};
const text = async () => {
const { responseBody, responseBodyType } = await readBody()
const { responseBody, responseBodyType } = await readBody();
if (responseBodyType === "blob") {
return blobToText(responseBody)
return blobToText(responseBody);
}
if (responseBodyType === "formData") {
throw new Error("could not read FormData body as text")
throw new Error("could not read FormData body as text");
}
if (responseBodyType === "dataView") {
return arrayBufferToText(responseBody.buffer)
return arrayBufferToText(responseBody.buffer);
}
if (responseBodyType === "arrayBuffer") {
return arrayBufferToText(responseBody)
return arrayBufferToText(responseBody);
}

@@ -125,49 +125,49 @@ // if (responseBodyType === "text" || responseBodyType === 'searchParams') {

// }
return String(responseBody)
}
return String(responseBody);
};
const json = async () => {
const responseText = await text()
return JSON.parse(responseText)
}
const responseText = await text();
return JSON.parse(responseText);
};
const blob = async () => {
if (!hasBlob) {
throw new Error(`blob not supported`)
throw new Error(`blob not supported`);
}
const { responseBody, responseBodyType } = await readBody()
const { responseBody, responseBodyType } = await readBody();
if (responseBodyType === "blob") {
return responseBody
return responseBody;
}
if (responseBodyType === "dataView") {
return new Blob([cloneBuffer(responseBody.buffer)])
return new Blob([cloneBuffer(responseBody.buffer)]);
}
if (responseBodyType === "arrayBuffer") {
return new Blob([cloneBuffer(responseBody)])
return new Blob([cloneBuffer(responseBody)]);
}
if (responseBodyType === "formData") {
throw new Error("could not read FormData body as blob")
throw new Error("could not read FormData body as blob");
}
return new Blob([String(responseBody)])
}
return new Blob([String(responseBody)]);
};
const arrayBuffer = async () => {
const { responseBody, responseBodyType } = await readBody()
const { responseBody, responseBodyType } = await readBody();
if (responseBodyType === "arrayBuffer") {
return cloneBuffer(responseBody)
return cloneBuffer(responseBody);
}
const responseBlob = await blob()
return blobToArrayBuffer(responseBlob)
}
const responseBlob = await blob();
return blobToArrayBuffer(responseBlob);
};
const formData = async () => {
if (!hasFormData) {
throw new Error(`formData not supported`)
throw new Error(`formData not supported`);
}
const responseText = await text()
return textToFormData(responseText)
}
const responseText = await text();
return textToFormData(responseText);
};

@@ -184,26 +184,26 @@ return {

formData,
}
}
};
};
const canUseBlob = () => {
if (typeof window.FileReader !== "function") return false
if (typeof window.FileReader !== "function") return false;
if (typeof window.Blob !== "function") return false
if (typeof window.Blob !== "function") return false;
try {
// eslint-disable-next-line no-new
new Blob()
return true
new Blob();
return true;
} catch (e) {
return false
return false;
}
}
};
const hasBlob = canUseBlob()
const hasBlob = canUseBlob();
const hasFormData = typeof window.FormData === "function"
const hasFormData = typeof window.FormData === "function";
const hasArrayBuffer = typeof window.ArrayBuffer === "function"
const hasArrayBuffer = typeof window.ArrayBuffer === "function";
const hasSearchParams = typeof window.URLSearchParams === "function"
const hasSearchParams = typeof window.URLSearchParams === "function";

@@ -215,22 +215,22 @@ const createRequestError = (error, { url }) => {

${error.stack}`,
)
}
);
};
const createPromiseAndHooks = () => {
let resolve
let reject
let resolve;
let reject;
const promise = new Promise((res, rej) => {
resolve = (value) => {
promise.settled = true
res(value)
}
promise.settled = true;
res(value);
};
reject = (value) => {
promise.settled = true
rej(value)
}
})
promise.resolve = resolve
promise.reject = reject
return promise
}
promise.settled = true;
rej(value);
};
});
promise.resolve = resolve;
promise.reject = reject;
return promise;
};

@@ -240,88 +240,88 @@ // https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch

if (credentials === "same-origin") {
return originSameAsGlobalOrigin(url)
return originSameAsGlobalOrigin(url);
}
return credentials === "include"
}
return credentials === "include";
};
const originSameAsGlobalOrigin = (url) => {
// if we cannot read globalOrigin from window.location.origin, let's consider it's ok
if (typeof window !== "object") return true
if (typeof window.location !== "object") return true
const globalOrigin = window.location.origin
if (globalOrigin === "null") return true
return hrefToOrigin(url) === globalOrigin
}
if (typeof window !== "object") return true;
if (typeof window.location !== "object") return true;
const globalOrigin = window.location.origin;
if (globalOrigin === "null") return true;
return hrefToOrigin(url) === globalOrigin;
};
const detectBodyType = (body) => {
if (!body) {
return ""
return "";
}
if (typeof body === "string") {
return "text"
return "text";
}
if (hasBlob && Blob.prototype.isPrototypeOf(body)) {
return "blob"
return "blob";
}
if (hasFormData && FormData.prototype.isPrototypeOf(body)) {
return "formData"
return "formData";
}
if (hasArrayBuffer) {
if (hasBlob && isDataView(body)) {
return `dataView`
return `dataView`;
}
if (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body)) {
return `arrayBuffer`
return `arrayBuffer`;
}
}
if (hasSearchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
return "searchParams"
return "searchParams";
}
return ""
}
return "";
};
// https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/getAllResponseHeaders#Example
const getHeadersFromXHR = (xhr) => {
const headerMap = {}
const headerMap = {};
const headersString = xhr.getAllResponseHeaders()
if (headersString === "") return headerMap
const headersString = xhr.getAllResponseHeaders();
if (headersString === "") return headerMap;
const lines = headersString.trim().split(/[\r\n]+/)
const lines = headersString.trim().split(/[\r\n]+/);
lines.forEach((line) => {
const parts = line.split(": ")
const name = parts.shift()
const value = parts.join(": ")
headerMap[name.toLowerCase()] = value
})
const parts = line.split(": ");
const name = parts.shift();
const value = parts.join(": ");
headerMap[name.toLowerCase()] = value;
});
return headerMap
}
return headerMap;
};
const hrefToOrigin = (href) => {
const scheme = hrefToScheme(href)
const scheme = hrefToScheme(href);
if (scheme === "file") {
return "file://"
return "file://";
}
if (scheme === "http" || scheme === "https") {
const secondProtocolSlashIndex = scheme.length + "://".length
const pathnameSlashIndex = href.indexOf("/", secondProtocolSlashIndex)
const secondProtocolSlashIndex = scheme.length + "://".length;
const pathnameSlashIndex = href.indexOf("/", secondProtocolSlashIndex);
if (pathnameSlashIndex === -1) return href
return href.slice(0, pathnameSlashIndex)
if (pathnameSlashIndex === -1) return href;
return href.slice(0, pathnameSlashIndex);
}
return href.slice(0, scheme.length + 1)
}
return href.slice(0, scheme.length + 1);
};
const hrefToScheme = (href) => {
const colonIndex = href.indexOf(":")
if (colonIndex === -1) return ""
return href.slice(0, colonIndex)
}
const colonIndex = href.indexOf(":");
if (colonIndex === -1) return "";
return href.slice(0, colonIndex);
};
const isDataView = (obj) => {
return obj && DataView.prototype.isPrototypeOf(obj)
}
return obj && DataView.prototype.isPrototypeOf(obj);
};

@@ -341,3 +341,3 @@ const isArrayBufferView =

"[object Float64Array]",
]
];

@@ -347,8 +347,8 @@ return (value) => {

value && viewClasses.includes(Object.prototype.toString.call(value))
)
}
})()
);
};
})();
const textToFormData = (text) => {
const form = new FormData()
const form = new FormData();
text

@@ -359,36 +359,36 @@ .trim()

if (bytes) {
const split = bytes.split("=")
const name = split.shift().replace(/\+/g, " ")
const value = split.join("=").replace(/\+/g, " ")
form.append(decodeURIComponent(name), decodeURIComponent(value))
const split = bytes.split("=");
const name = split.shift().replace(/\+/g, " ");
const value = split.join("=").replace(/\+/g, " ");
form.append(decodeURIComponent(name), decodeURIComponent(value));
}
})
return form
}
});
return form;
};
const blobToArrayBuffer = async (blob) => {
const reader = new FileReader()
const promise = fileReaderReady(reader)
reader.readAsArrayBuffer(blob)
return promise
}
const reader = new FileReader();
const promise = fileReaderReady(reader);
reader.readAsArrayBuffer(blob);
return promise;
};
const blobToText = (blob) => {
const reader = new FileReader()
const promise = fileReaderReady(reader)
reader.readAsText(blob)
return promise
}
const reader = new FileReader();
const promise = fileReaderReady(reader);
reader.readAsText(blob);
return promise;
};
const arrayBufferToText = (arrayBuffer) => {
const view = new Uint8Array(arrayBuffer)
const chars = new Array(view.length)
let i = 0
const view = new Uint8Array(arrayBuffer);
const chars = new Array(view.length);
let i = 0;
while (i < view.length) {
chars[i] = String.fromCharCode(view[i])
chars[i] = String.fromCharCode(view[i]);
i++
i++;
}
return chars.join("")
}
return chars.join("");
};

@@ -398,17 +398,17 @@ const fileReaderReady = (reader) => {

reader.onload = function () {
resolve(reader.result)
}
resolve(reader.result);
};
reader.onerror = function () {
reject(reader.error)
}
})
}
reject(reader.error);
};
});
};
const cloneBuffer = (buffer) => {
if (buffer.slice) {
return buffer.slice(0)
return buffer.slice(0);
}
const view = new Uint8Array(buffer.byteLength)
view.set(new Uint8Array(buffer))
return view.buffer
}
const view = new Uint8Array(buffer.byteLength);
view.set(new Uint8Array(buffer));
return view.buffer;
};
// https://github.com/node-fetch/node-fetch/blob/8c197f8982a238b3c345c64b17bfa92e16b4f7c4/src/response.js#L1
import { Agent } from "node:https"
import nodeFetch, { Response } from "node-fetch"
import { Agent } from "node:https";
import nodeFetch, { Response } from "node-fetch";
import { DATA_URL } from "@jsenv/urls"
import { fetchFileSystem } from "@jsenv/server"
import { DATA_URL } from "@jsenv/urls";
import { fetchFileSystem } from "@jsenv/server";
import {
isFileHandle,
fileHandleToReadableStream,
} from "@jsenv/server/src/interfacing_with_node/body.js"
} from "@jsenv/server/src/interfacing_with_node/body.js";

@@ -27,7 +27,7 @@ export const fetchUrl = async (

try {
url = String(new URL(url))
url = String(new URL(url));
} catch (e) {
throw new Error(
`fetchUrl first argument must be an absolute url, received ${url}`,
)
);
}

@@ -45,4 +45,4 @@

...rest,
})
const responseBody = responseProperties.body
});
const responseBody = responseProperties.body;

@@ -61,9 +61,9 @@ const response = new Response(

},
)
return response
);
return response;
}
if (url.startsWith("data:")) {
const { contentType, base64Flag, data } = DATA_URL.parse(url)
const body = base64Flag ? Buffer.from(data, "base64") : Buffer.from(data)
const { contentType, base64Flag, data } = DATA_URL.parse(url);
const body = base64Flag ? Buffer.from(data, "base64") : Buffer.from(data);
const response = new Response(body, {

@@ -75,4 +75,4 @@ url,

},
})
return response
});
return response;
}

@@ -89,3 +89,3 @@

rejectUnauthorized: false,
})
});
},

@@ -95,5 +95,5 @@ }

...rest,
})
});
return response
}
return response;
};
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc