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:
Ryan Dahl 2019-08-28 14:57:37 -04:00
parent 2b79552dd1
commit 8f919465b0
5 changed files with 3 additions and 121 deletions

View File

@ -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;

View File

@ -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,

View File

@ -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);
});

View File

@ -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