mirror of
https://github.com/denoland/deno.git
synced 2024-11-25 15:29:32 -05:00
Remove @stardazed/streams
This is a regression on several some features in the fetch API. To bring these back @stardazed/streams simply needs to be ported to TS and included in the //js directory. Towards #2608
This commit is contained in:
parent
2b79552dd1
commit
8f919465b0
5 changed files with 3 additions and 121 deletions
78
js/body.ts
78
js/body.ts
|
@ -1,27 +1,17 @@
|
|||
import * as streams from "@stardazed/streams";
|
||||
import * as formData from "./form_data";
|
||||
import * as blob from "./blob";
|
||||
import * as encoding from "./text_encoding";
|
||||
import * as headers from "./headers";
|
||||
|
||||
import * as domTypes from "./dom_types";
|
||||
|
||||
const { Headers } = headers;
|
||||
|
||||
// only namespace imports work for now, plucking out what we need
|
||||
const { ReadableStream } = streams;
|
||||
const { FormData } = formData;
|
||||
const { TextEncoder, TextDecoder } = encoding;
|
||||
const Blob = blob.DenoBlob;
|
||||
const DenoBlob = blob.DenoBlob;
|
||||
|
||||
type ReadableStreamReader = domTypes.ReadableStreamReader;
|
||||
|
||||
interface ReadableStreamController {
|
||||
enqueue(chunk: string | ArrayBuffer): void;
|
||||
close(): void;
|
||||
}
|
||||
|
||||
export type BodySource =
|
||||
| domTypes.Blob
|
||||
| domTypes.BufferSource
|
||||
|
@ -47,8 +37,6 @@ function validateBodyType(owner: Body, bodySource: BodySource): boolean {
|
|||
return true;
|
||||
} else if (typeof bodySource === "string") {
|
||||
return true;
|
||||
} else if (bodySource instanceof ReadableStream) {
|
||||
return true;
|
||||
} else if (bodySource instanceof FormData) {
|
||||
return true;
|
||||
} else if (!bodySource) {
|
||||
|
@ -59,58 +47,6 @@ function validateBodyType(owner: Body, bodySource: BodySource): boolean {
|
|||
);
|
||||
}
|
||||
|
||||
function concatenate(...arrays: Uint8Array[]): ArrayBuffer {
|
||||
let totalLength = 0;
|
||||
for (const arr of arrays) {
|
||||
totalLength += arr.length;
|
||||
}
|
||||
const result = new Uint8Array(totalLength);
|
||||
let offset = 0;
|
||||
for (const arr of arrays) {
|
||||
result.set(arr, offset);
|
||||
offset += arr.length;
|
||||
}
|
||||
return result.buffer as ArrayBuffer;
|
||||
}
|
||||
|
||||
function bufferFromStream(stream: ReadableStreamReader): Promise<ArrayBuffer> {
|
||||
return new Promise(
|
||||
(resolve, reject): void => {
|
||||
const parts: Uint8Array[] = [];
|
||||
const encoder = new TextEncoder();
|
||||
// recurse
|
||||
(function pump(): void {
|
||||
stream
|
||||
.read()
|
||||
.then(
|
||||
({ done, value }): void => {
|
||||
if (done) {
|
||||
return resolve(concatenate(...parts));
|
||||
}
|
||||
|
||||
if (typeof value === "string") {
|
||||
parts.push(encoder.encode(value));
|
||||
} else if (value instanceof ArrayBuffer) {
|
||||
parts.push(new Uint8Array(value));
|
||||
} else if (!value) {
|
||||
// noop for undefined
|
||||
} else {
|
||||
reject("unhandled type on stream read");
|
||||
}
|
||||
|
||||
return pump();
|
||||
}
|
||||
)
|
||||
.catch(
|
||||
(err): void => {
|
||||
reject(err);
|
||||
}
|
||||
);
|
||||
})();
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
function getHeaderValueParams(value: string): Map<string, string> {
|
||||
const params = new Map();
|
||||
// Forced to do so for some Map constructor param mismatch
|
||||
|
@ -145,17 +81,8 @@ export class Body implements domTypes.Body {
|
|||
if (this._stream) {
|
||||
return this._stream;
|
||||
}
|
||||
if (this._bodySource instanceof ReadableStream) {
|
||||
// @ts-ignore
|
||||
this._stream = this._bodySource;
|
||||
}
|
||||
if (typeof this._bodySource === "string") {
|
||||
this._stream = new ReadableStream({
|
||||
start(controller: ReadableStreamController): void {
|
||||
controller.enqueue(this._bodySource);
|
||||
controller.close();
|
||||
}
|
||||
});
|
||||
throw Error("not implemented");
|
||||
}
|
||||
return this._stream;
|
||||
}
|
||||
|
@ -332,9 +259,6 @@ export class Body implements domTypes.Body {
|
|||
} else if (typeof this._bodySource === "string") {
|
||||
const enc = new TextEncoder();
|
||||
return enc.encode(this._bodySource).buffer as ArrayBuffer;
|
||||
} else if (this._bodySource instanceof ReadableStream) {
|
||||
// @ts-ignore
|
||||
return bufferFromStream(this._bodySource.getReader());
|
||||
} else if (this._bodySource instanceof FormData) {
|
||||
const enc = new TextEncoder();
|
||||
return enc.encode(this._bodySource.toString()).buffer as ArrayBuffer;
|
||||
|
|
|
@ -1,13 +1,9 @@
|
|||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||
import * as headers from "./headers";
|
||||
import * as body from "./body";
|
||||
|
||||
import * as streams from "@stardazed/streams";
|
||||
|
||||
import * as domTypes from "./dom_types";
|
||||
|
||||
const { Headers } = headers;
|
||||
const { ReadableStream } = streams;
|
||||
|
||||
function byteUpperCase(s: string): string {
|
||||
return String(s).replace(/[a-z]/g, function byteUpperCaseReplace(c): string {
|
||||
|
@ -144,11 +140,6 @@ export class Request extends body.Body implements domTypes.Request {
|
|||
|
||||
let body2 = this._bodySource;
|
||||
|
||||
if (this._bodySource instanceof ReadableStream) {
|
||||
const tees = (this._bodySource as domTypes.ReadableStream).tee();
|
||||
this._stream = this._bodySource = tees[0];
|
||||
body2 = tees[1];
|
||||
}
|
||||
const cloned = new Request(this.url, {
|
||||
body: body2,
|
||||
method: this.method,
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||
import { test, assertEquals, assert } from "./test_util.ts";
|
||||
import { test, assertEquals } from "./test_util.ts";
|
||||
|
||||
test(function fromInit(): void {
|
||||
const req = new Request("https://example.com", {
|
||||
|
@ -15,35 +15,3 @@ test(function fromInit(): void {
|
|||
assertEquals(req.url, "https://example.com");
|
||||
assertEquals(req.headers.get("test-header"), "value");
|
||||
});
|
||||
|
||||
test(function fromRequest(): void {
|
||||
const r = new Request("https://example.com");
|
||||
// @ts-ignore
|
||||
r._bodySource = "ahoyhoy";
|
||||
r.headers.set("test-header", "value");
|
||||
|
||||
const req = new Request(r);
|
||||
|
||||
// @ts-ignore
|
||||
assertEquals(req._bodySource, r._bodySource);
|
||||
assertEquals(req.url, r.url);
|
||||
assertEquals(req.headers.get("test-header"), r.headers.get("test-header"));
|
||||
});
|
||||
|
||||
test(async function cloneRequestBodyStream(): Promise<void> {
|
||||
// hack to get a stream
|
||||
const stream = new Request("", { body: "a test body" }).body;
|
||||
const r1 = new Request("https://example.com", {
|
||||
body: stream
|
||||
});
|
||||
|
||||
const r2 = r1.clone();
|
||||
|
||||
const b1 = await r1.text();
|
||||
const b2 = await r2.text();
|
||||
|
||||
assertEquals(b1, b2);
|
||||
|
||||
// @ts-ignore
|
||||
assert(r1._bodySource !== r2._bodySource);
|
||||
});
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
{
|
||||
"name": "deno",
|
||||
"devDependencies": {
|
||||
"@stardazed/streams": "3.0.0",
|
||||
"@types/prettier": "1.16.1",
|
||||
"@typescript-eslint/eslint-plugin": "1.6.0",
|
||||
"@typescript-eslint/parser": "1.6.0",
|
||||
|
|
|
@ -1 +1 @@
|
|||
Subproject commit f034aeb0b9a5ba6503cad1186df7e2eae402b352
|
||||
Subproject commit 47a8f150bcbe3b78f174ae79dcc07a12adb0d5b5
|
Loading…
Reference in a new issue