Skip to content

Commit

Permalink
Remove @stardazed/streams
Browse files Browse the repository at this point in the history
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 denoland#2608
  • Loading branch information
ry committed Aug 28, 2019
1 parent f95824a commit e01226b
Show file tree
Hide file tree
Showing 5 changed files with 3 additions and 121 deletions.
78 changes: 1 addition & 77 deletions 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
Expand All @@ -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) {
Expand All @@ -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
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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;
Expand Down
9 changes: 0 additions & 9 deletions js/request.ts
@@ -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 {
Expand Down Expand Up @@ -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,
Expand Down
34 changes: 1 addition & 33 deletions js/request_test.ts
@@ -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", {
Expand All @@ -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 change: 0 additions & 1 deletion package.json
@@ -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",
Expand Down

0 comments on commit e01226b

Please sign in to comment.