Skip to content

Commit

Permalink
feat!(sdk): Remove 'toFile' method (#403)
Browse files Browse the repository at this point in the history
This removes a dependency on streamsaver.js. The equivalent function to this method is now viewable in the `App.tsx` file:

```ts
async function toFile(
  stream: ReadableStream<Uint8Array>,
  filepath = 'download.tdf',
  options?: {
    encoding?: BufferEncoding;
    signal?: AbortSignal;
  }
): Promise<void> {

  const fileStream = streamsaver.createWriteStream(filepath, {
    writableStrategy: { highWaterMark: 1 },
    readableStrategy: { highWaterMark: 1 },
  });

  return stream.pipeTo(fileStream, options);
}
```

Signed-off-by: Elizabeth Healy <[email protected]>
  • Loading branch information
dmihalcik-virtru authored and elizabethhealy committed Dec 13, 2024
1 parent bf53a46 commit 6194a13
Show file tree
Hide file tree
Showing 8 changed files with 32 additions and 165 deletions.
43 changes: 1 addition & 42 deletions cli/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

16 changes: 0 additions & 16 deletions lib/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 0 additions & 2 deletions lib/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -70,10 +70,8 @@
"browser-fs-access": "^0.34.1",
"buffer-crc32": "^0.2.13",
"dpop": "^1.2.0",
"eventemitter3": "^5.0.1",
"jose": "^4.14.4",
"json-canonicalize": "^1.0.6",
"streamsaver": "^2.0.6",
"uuid": "~9.0.0"
},
"devDependencies": {
Expand Down
80 changes: 2 additions & 78 deletions lib/tdf3/src/client/DecoratedReadableStream.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,5 @@
import { EventEmitter } from 'eventemitter3';
import streamSaver from 'streamsaver';
import { fileSave } from 'browser-fs-access';
import { isFirefox } from '../../../src/utils.js';

import { type Metadata } from '../tdf.js';
import { type Manifest } from '../models/index.js';
import { ConfigurationError } from '../../../src/errors.js';

export async function streamToBuffer(stream: ReadableStream<Uint8Array>): Promise<Uint8Array> {
const accumulator = await new Response(stream).arrayBuffer();
Expand All @@ -24,9 +18,6 @@ export class DecoratedReadableStream {
tdfSize: number;
fileSize: number | undefined;
stream: ReadableStream<Uint8Array>;
ee: EventEmitter;
on: EventEmitter['on'];
emit: EventEmitter['emit'];
metadata?: Metadata;
manifest: Manifest;
fileStreamServiceWorker?: string;
Expand All @@ -42,23 +33,10 @@ export class DecoratedReadableStream {
this.stream = new ReadableStream(underlyingSource, {
highWaterMark: 1,
}) as ReadableStream<Uint8Array>;
this.ee = new EventEmitter();
this.on = (...args) => this.ee.on(...args);
this.emit = (...args) => this.ee.emit(...args);
}

async getMetadata() {
return new Promise((resolve, reject) => {
if (this.metadata) {
resolve(this.metadata);
} else {
this.on('error', reject);
this.on('rewrap', (rewrapResponse: Metadata) => {
this.metadata = rewrapResponse;
resolve(rewrapResponse);
});
}
});
return this.metadata;
}

/**
Expand All @@ -82,66 +60,12 @@ export class DecoratedReadableStream {
async toString(): Promise<string> {
return new Response(this.stream).text();
}

/**
* Dump the stream content to a local file. This will consume the stream.
*
* @param filepath The path of the local file to write plaintext to.
* @param encoding The charset encoding to use. Defaults to utf-8.
*/
async toFile(
filepath = 'download.tdf',
options?: BufferEncoding | DecoratedReadableStreamSinkOptions
): Promise<void> {
if (options && typeof options === 'string') {
throw new ConfigurationError('unsupported operation: Cannot set encoding in browser');
}
if (isFirefox()) {
await fileSave(new Response(this.stream), {
fileName: filepath,
extensions: [`.${filepath.split('.').pop()}`],
});
return;
}

if (this.fileStreamServiceWorker) {
streamSaver.mitm = this.fileStreamServiceWorker;
}

const fileStream = streamSaver.createWriteStream(filepath, {
writableStrategy: { highWaterMark: 1 },
readableStrategy: { highWaterMark: 1 },
});

if (WritableStream) {
return this.stream.pipeTo(fileStream, options);
}

// Write (pipe) manually
const reader = this.stream.getReader();
const writer = fileStream.getWriter();
const pump = async (): Promise<void> => {
const res = await reader.read();

if (res.done) {
return await writer.close();
} else {
await writer.write(res.value);
return pump();
}
};
return pump();

// const pump = (): Promise<void> =>
// reader.read().then((res) => (res.done ? writer.close() : writer.write(res.value).then(pump)));
// pump();
}
}

export function isDecoratedReadableStream(s: unknown): s is DecoratedReadableStream {
return (
typeof (s as DecoratedReadableStream)?.stream !== 'undefined' &&
typeof (s as DecoratedReadableStream)?.toBuffer !== 'undefined' &&
typeof (s as DecoratedReadableStream)?.toFile !== 'undefined' &&
typeof (s as DecoratedReadableStream)?.toString !== 'undefined'
);
}
2 changes: 0 additions & 2 deletions lib/tdf3/src/tdf.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1023,8 +1023,6 @@ export async function readStream(cfg: DecryptConfiguration) {
const outputStream = new DecoratedReadableStream(underlyingSource);

outputStream.manifest = manifest;
outputStream.emit('manifest', manifest);
outputStream.metadata = metadata;
outputStream.emit('rewrap', metadata);
return outputStream;
}
28 changes: 7 additions & 21 deletions web-app/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion web-app/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@
"clsx": "^2.1.1",
"native-file-system-adapter": "^3.0.1",
"react": "^18.3.1",
"react-dom": "^18.3.1"
"react-dom": "^18.3.1",
"streamsaver": "^2.0.6"
},
"devDependencies": {
"@playwright/test": "^1.48.2",
Expand Down
Loading

0 comments on commit 6194a13

Please sign in to comment.