From f4f8332f96b34f288c75645229ad6df465505932 Mon Sep 17 00:00:00 2001 From: Danny Coates Date: Fri, 13 Jul 2018 17:05:19 -0700 Subject: [PATCH] WIP on shimming streams in firefox --- app/ece.js | 12 ++++++++++-- app/serviceWorker.js | 5 +++-- app/transformStream.js | 25 +++++++++++++++++++++++++ package-lock.json | 11 ++++++----- package.json | 4 ++-- 5 files changed, 46 insertions(+), 11 deletions(-) create mode 100644 app/transformStream.js diff --git a/app/ece.js b/app/ece.js index 9dbc6948..631116a9 100644 --- a/app/ece.js +++ b/app/ece.js @@ -1,4 +1,12 @@ -require('buffer'); +import 'buffer'; +import TransformStream from './transformStream'; +import { ReadableStream as ReadableStreamPony } from 'web-streams-ponyfill'; +try { + new ReadableStream().pipeThrough(new TransformStream()); +} catch (e) { + // eslint-disable-next-line no-global-assign + ReadableStream = ReadableStreamPony; +} const NONCE_LENGTH = 12; const TAG_LENGTH = 16; @@ -316,7 +324,7 @@ class StreamSlicer { /* input: a blob or a ReadableStream containing data to be transformed -key: Uint8Array containing key of size KEY_LENGTH +key: Uint8Array containing key of size KEY_LENGTH mode: string, either 'encrypt' or 'decrypt' rs: int containing record size, optional salt: ArrayBuffer containing salt of KEY_LENGTH length, optional diff --git a/app/serviceWorker.js b/app/serviceWorker.js index e590abe3..f017e433 100644 --- a/app/serviceWorker.js +++ b/app/serviceWorker.js @@ -1,5 +1,6 @@ import Keychain from './keychain'; import { downloadStream } from './api'; +import TransformStream from './transformStream'; let noSave = false; const map = new Map(); @@ -37,8 +38,8 @@ async function decryptStream(request) { 'Content-Type': file.type, 'Content-Length': file.size }; - - return new Response(decrypted, { headers }); + const body = decrypted.local ? decrypted.nativeReadable : decrypted; + return new Response(body, { headers }); } catch (e) { if (noSave) { return new Response(null, { status: e.message }); diff --git a/app/transformStream.js b/app/transformStream.js new file mode 100644 index 00000000..f0dc1605 --- /dev/null +++ b/app/transformStream.js @@ -0,0 +1,25 @@ +/* global TransformStream */ +import { createReadableStreamWrapper } from '@mattiasbuelens/web-streams-adapter'; +import { TransformStream as TransformStreamPony } from 'web-streams-ponyfill'; + +const toNative = createReadableStreamWrapper(ReadableStream); + +class TransformStreamLocal { + constructor(transformer) { + this.stream = new TransformStreamPony(transformer); + this.local = true; + } + get nativeReadable() { + return toNative(this.stream.readable); + } + get readable() { + return this.stream.readable; + } + get writable() { + return this.stream.writable; + } +} + +export default (typeof TransformStream === 'function' + ? TransformStream + : TransformStreamLocal); diff --git a/package-lock.json b/package-lock.json index a141807d..86861d71 100644 --- a/package-lock.json +++ b/package-lock.json @@ -91,7 +91,8 @@ "@mattiasbuelens/web-streams-adapter": { "version": "0.1.0-alpha.1", "resolved": "https://registry.npmjs.org/@mattiasbuelens/web-streams-adapter/-/web-streams-adapter-0.1.0-alpha.1.tgz", - "integrity": "sha512-8YK2ZY6CAgrzFGfW2uPyNDMYvh7OmWjrlbdP+GeHiMJhzPF3XwrQaHyLQ4IZqGTj8NW879ttfbcqbLqQxWvtsw==" + "integrity": "sha512-8YK2ZY6CAgrzFGfW2uPyNDMYvh7OmWjrlbdP+GeHiMJhzPF3XwrQaHyLQ4IZqGTj8NW879ttfbcqbLqQxWvtsw==", + "dev": true }, "@mrmlnc/readdir-enhanced": { "version": "2.2.1", @@ -16276,10 +16277,10 @@ "minimalistic-assert": "1.0.1" } }, - "web-streams-polyfill": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-1.3.2.tgz", - "integrity": "sha1-NxkkXpCSgtk5Z4JfRLzVUOnAOZU=", + "web-streams-ponyfill": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/web-streams-ponyfill/-/web-streams-ponyfill-1.4.2.tgz", + "integrity": "sha512-LCHW+fE2UBJ2vjhqJujqmoxh1ytEDEr0dPO3CabMdMDJPKmsaxzS90V1Ar6LtNE5VHLqxR4YMEj1i4lzMAccIA==", "dev": true }, "webpack": { diff --git a/package.json b/package.json index 0fb687ff..f7f9bb87 100644 --- a/package.json +++ b/package.json @@ -57,6 +57,7 @@ }, "devDependencies": { "@dannycoates/webpack-dev-server": "^3.1.4", + "@mattiasbuelens/web-streams-adapter": "0.1.0-alpha.1", "asmcrypto.js": "^0.22.0", "babel-core": "^6.26.3", "babel-loader": "^7.1.4", @@ -112,7 +113,7 @@ "svgo-loader": "^2.1.0", "testpilot-ga": "^0.3.0", "val-loader": "^1.1.1", - "web-streams-polyfill": "^1.3.2", + "web-streams-ponyfill": "^1.4.2", "webpack": "^4.15.1", "webpack-cli": "^3.0.8", "webpack-dev-middleware": "^3.1.3", @@ -120,7 +121,6 @@ "webpack-unassert-loader": "^1.2.0" }, "dependencies": { - "@mattiasbuelens/web-streams-adapter": "0.1.0-alpha.1", "aws-sdk": "^2.266.1", "babel-polyfill": "^6.26.0", "choo": "^6.12.1",