Skip to content

Commit 67cc51c

Browse files
committed
client: fix file push on safari
refs #84
1 parent 1949b41 commit 67cc51c

File tree

2 files changed

+16
-4
lines changed

2 files changed

+16
-4
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ available from the outside. Select `proxy over adb` from the list of interfaces.
128128
* TinyH264Player may fail to start, try to reload the page.
129129
* MsePlayer reports too many dropped frames in quality statistics: needs
130130
further investigation.
131+
* On Safari file upload does not show progress (it works in one piece).
131132

132133
## Security warning
133134
Be advised and keep in mind:

src/app/googDevice/FilePushHandler.ts

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,15 @@ export default class FilePushHandler implements DragEventListener {
5555
this.sendUpdate({ pushId, fileName, logString: `error: "${msg}"`, error: true });
5656
}
5757

58+
private static async getStreamReader(
59+
file: File,
60+
): Promise<{ reader: ReadableStreamDefaultReader<Uint8Array>; result: ReadableStreamReadResult<Uint8Array> }> {
61+
const blob = await new Response(file).blob();
62+
const reader = blob.stream().getReader() as ReadableStreamDefaultReader<Uint8Array>;
63+
const result = await reader.read();
64+
return { reader, result };
65+
}
66+
5867
private async pushFile(file: File): Promise<void> {
5968
const start = Date.now();
6069
const { name: fileName, size: fileSize } = file;
@@ -65,7 +74,7 @@ export default class FilePushHandler implements DragEventListener {
6574
return;
6675
}
6776
const id = FilePushHandler.REQUEST_NEW_PUSH_ID;
68-
this.sendUpdate({ pushId: id, fileName, logString: 'begin...', error: false });
77+
this.sendUpdate({ pushId: id, fileName, logString: 'begins...', error: false });
6978
const newParams = { id, state: FilePushState.NEW };
7079
this.streamReceiver.sendEvent(CommandControlMessage.createPushFileCommand(newParams));
7180
const pushId: number = await this.waitForResponse(id);
@@ -74,10 +83,12 @@ export default class FilePushHandler implements DragEventListener {
7483
}
7584

7685
const startParams = { id: pushId, fileName, fileSize, state: FilePushState.START };
86+
const waitPromise = this.waitForResponse(pushId);
7787
this.streamReceiver.sendEvent(CommandControlMessage.createPushFileCommand(startParams));
78-
const stream = file.stream();
79-
const reader = stream.getReader();
80-
const [startResponseCode, result] = await Promise.all([this.waitForResponse(pushId), reader.read()]);
88+
const [startResponseCode, { reader, result }] = await Promise.all([
89+
waitPromise,
90+
FilePushHandler.getStreamReader(file),
91+
]);
8192
if (startResponseCode !== 0) {
8293
this.logError(pushId, fileName, startResponseCode);
8394
return;

0 commit comments

Comments
 (0)