Skip to content
This repository was archived by the owner on Nov 16, 2023. It is now read-only.

Commit c8fbd30

Browse files
author
Alexey Reznichenko
committed
Remove redundant FileReaders
Don't create new FileReader for each binary message to service (doesn't seem to work well on Safari, either readers are not gc-ed fast enough or there's a limit on how many can be created). Also, no need to use use fancy async ops to convert a string to byte array.
1 parent b828786 commit c8fbd30

File tree

4 files changed

+36
-44
lines changed

4 files changed

+36
-44
lines changed

package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

samples/browser/sample-server.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ for (let j = 0; j < process.argv.length; j++) {
1515
var keyFile = __dirname+'/speech.key';
1616
if (fs.existsSync(keyFile)) {
1717
var key = fs.readFileSync(keyFile, 'utf8');
18+
key = key.replace(/\s/g, "");
1819
if (!!key) {
1920
var before = "value=\"YOUR_BING_SPEECH_API_KEY\"";
2021
var after = " disabled value=\"Using token-based auth mechanism.\"";

src/common.browser/WebsocketMessageAdapter.ts

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ export class WebsocketMessageAdapter {
7979
this.connectionState = ConnectionState.Connecting;
8080

8181
this.websocketClient = new WebSocket(this.uri);
82+
this.websocketClient.binaryType = "arraybuffer";
8283
this.receivingMessageQueue = new Queue<ConnectionMessage>();
8384
this.disconnectDeferral = new Deferred<boolean>();
8485
this.sendMessageQueue = new Queue<ISendItem>();
@@ -118,26 +119,17 @@ export class WebsocketMessageAdapter {
118119
const deferred = new Deferred<ConnectionMessage>();
119120
// let id = ++this.idCounter;
120121
this.receivingMessageQueue.EnqueueFromPromise(deferred.Promise());
121-
if (e.data instanceof Blob) {
122-
const fileReader = new FileReader();
123-
fileReader.onload = (le: Event) => {
124-
const rawMessage = new RawWebsocketMessage(MessageType.Binary, fileReader.result);
125-
this.messageFormatter
126-
.ToConnectionMessage(rawMessage)
127-
.On((connectionMessage: ConnectionMessage) => {
128-
this.OnEvent(new ConnectionMessageReceivedEvent(this.connectionId, networkReceivedTime, connectionMessage));
129-
deferred.Resolve(connectionMessage);
130-
}, (error: string) => {
131-
// TODO: Events for these ?
132-
deferred.Reject(`Invalid binary message format. Error: ${error}`);
133-
});
134-
};
135-
fileReader.onerror = (ev: Event) => {
136-
// TODO: Events for these ?
137-
deferred.Reject("Binary message parse error");
138-
};
139-
140-
fileReader.readAsArrayBuffer(e.data);
122+
if (e.data instanceof ArrayBuffer) {
123+
const rawMessage = new RawWebsocketMessage(MessageType.Binary, e.data);
124+
this.messageFormatter
125+
.ToConnectionMessage(rawMessage)
126+
.On((connectionMessage: ConnectionMessage) => {
127+
this.OnEvent(new ConnectionMessageReceivedEvent(this.connectionId, networkReceivedTime, connectionMessage));
128+
deferred.Resolve(connectionMessage);
129+
}, (error: string) => {
130+
// TODO: Events for these ?
131+
deferred.Reject(`Invalid binary message format. Error: ${error}`);
132+
});
141133
} else {
142134
const rawMessage = new RawWebsocketMessage(MessageType.Text, e.data);
143135
this.messageFormatter

src/sdk/speech/WebsocketMessageFormatter.ts

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -81,35 +81,25 @@ export class WebsocketMessageFormatter implements IWebsocketMessageFormatter {
8181
const headersString = this.MakeHeaders(message);
8282
const content = message.BinaryBody;
8383

84-
const fr = new FileReader();
84+
const headerInt8Array = new Int8Array(this.StringToArrayBuffer(headersString));
8585

86-
fr.onload = () => {
87-
const headerInt8Array = new Int8Array(fr.result);
86+
const payload = new ArrayBuffer(2 + headerInt8Array.byteLength + (content ? content.byteLength : 0));
87+
const dataView = new DataView(payload);
8888

89-
const payload = new ArrayBuffer(2 + headerInt8Array.byteLength + (content ? content.byteLength : 0));
90-
const dataView = new DataView(payload);
89+
dataView.setInt16(0, headerInt8Array.length);
9190

92-
dataView.setInt16(0, headerInt8Array.length);
91+
for (let i = 0; i < headerInt8Array.byteLength; i++) {
92+
dataView.setInt8(2 + i, headerInt8Array[i]);
93+
}
9394

94-
for (let i = 0; i < headerInt8Array.byteLength; i++) {
95-
dataView.setInt8(2 + i, headerInt8Array[i]);
95+
if (content) {
96+
const bodyInt8Array = new Int8Array(content);
97+
for (let i = 0; i < bodyInt8Array.byteLength; i++) {
98+
dataView.setInt8(2 + headerInt8Array.byteLength + i, bodyInt8Array[i]);
9699
}
100+
}
97101

98-
if (content) {
99-
const bodyInt8Array = new Int8Array(content);
100-
for (let i = 0; i < bodyInt8Array.byteLength; i++) {
101-
dataView.setInt8(2 + headerInt8Array.byteLength + i, bodyInt8Array[i]);
102-
}
103-
}
104-
105-
deferral.Resolve(new RawWebsocketMessage(MessageType.Binary, payload, message.Id));
106-
};
107-
108-
fr.onerror = () => {
109-
deferral.Reject("failed to load headers into file reader");
110-
};
111-
112-
fr.readAsArrayBuffer(new Blob([headersString]));
102+
deferral.Resolve(new RawWebsocketMessage(MessageType.Binary, payload, message.Id));
113103
}
114104
} catch (e) {
115105
deferral.Reject(`Error formatting the message. ${e}`);
@@ -155,4 +145,13 @@ export class WebsocketMessageFormatter implements IWebsocketMessageFormatter {
155145

156146
return headers;
157147
}
148+
149+
private StringToArrayBuffer = (str: string): ArrayBuffer => {
150+
const buffer = new ArrayBuffer(str.length);
151+
const view = new DataView(buffer);
152+
for (let i = 0; i < str.length; i++) {
153+
view.setUint8(i, str.charCodeAt(i));
154+
}
155+
return buffer;
156+
}
158157
}

0 commit comments

Comments
 (0)