Skip to content

Commit c83df0b

Browse files
committed
- Switched to sending handshake messages via the socket's send() method to bypass the messageQueue.
- Handles reconnecting/handshaking better with event listeners - Updated .gitignore
1 parent 98e24ff commit c83df0b

File tree

4 files changed

+75
-32
lines changed

4 files changed

+75
-32
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
sibelius-session.json
2+
dorico-session.json
3+
obs-identify.json
24

35
# Logs
46
logs

DoricoRemote.js

Lines changed: 56 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1+
// const fs = nativeRequire('fs');
2+
13
const WebSocketClient = require('./WebSocketClient.js')
24

5+
const DOR_SESSION_FILE = 'dorico-session.json'
6+
37
class DoricoRemote extends WebSocketClient {
48
constructor({ appName = 'Dorico Remote', callbackAddress = '/DoricoCallback' } = {}) {
59
super('ws://127.0.0.1:4560');
@@ -10,15 +14,11 @@ class DoricoRemote extends WebSocketClient {
1014
}
1115

1216
onOpen(resolve) {
13-
let savedMessageQueue = this.messageQueue;
14-
this.messageQueue = [];
17+
this.on('handshakeDone', () => super.onOpen(resolve));
1518

1619
this._sendHandshake();
1720

18-
// this.messageQueue = savedMessageQueue;
19-
// savedMessageQueue = []
20-
21-
super.onOpen(resolve);
21+
// super.onOpen(resolve);
2222
}
2323

2424
_sendHandshake() {
@@ -27,16 +27,22 @@ class DoricoRemote extends WebSocketClient {
2727
clientName: this.appName,
2828
handshakeVersion: '1.0',
2929
};
30+
31+
const sessionData = loadJSON(DOR_SESSION_FILE, (e) => {
32+
console.log(`${DOR_SESSION_FILE} not found - starting new session`)
33+
});
34+
this.sessionToken = sessionData?.sessionToken;
3035

3136
if (this.sessionToken) {
3237
message.sessionToken = this.sessionToken;
3338
}
3439

35-
super.send(message);
40+
// use the socket's send method to avoid the messageQueue
41+
this.socket.send(JSON.stringify(message));
42+
console.log("Message sent:", message);
3643
}
3744

3845
_processHandshake(data) {
39-
console.log(data);
4046
if (data.message === 'sessiontoken' && data.sessionToken) {
4147
this.sessionToken = data.sessionToken;
4248
console.log(`Received sessiontoken: ${this.sessionToken} - completing handshake`);
@@ -46,39 +52,72 @@ class DoricoRemote extends WebSocketClient {
4652
sessionToken: this.sessionToken
4753
}
4854

49-
super.send(message);
55+
this.socket.send(JSON.stringify(message));
56+
console.log("Message sent:", message);
5057
}
5158
else if (data.message === 'response' && data.code === 'kConnected') {
5259
console.log(`Handshake complete for ${this.appName}`);
53-
this.handshakeDone = true; // Handshake is now complete
54-
this._processQueue(); // Now safe to send queued messages
60+
saveJSON(DOR_SESSION_FILE, { sessionToken: this.sessionToken }, (e) => console.log("unable to save sessionToken", e));
61+
this.handshakeDone = true;
62+
this.emit('handshakeDone');
5563
}
5664
}
5765

5866
onMessage(event) {
5967
const data = JSON.parse(event.data);
6068

61-
if (!this.handshakeDone && data.message === 'sessiontoken') {
69+
if (!this.handshakeDone) {
6270
this._processHandshake(data);
71+
console.log("Message received:", data);
72+
}
73+
else {
74+
super.onMessage(event);
6375
}
64-
65-
super.onMessage(event);
6676

6777
if (this.callbackAddress && this.callbackAddress.length > 0) {
6878
receive(this.callbackAddress, data)
6979
}
7080
}
7181

72-
async send(message) {
82+
onClose(event) {
83+
if (event.code === 1000) {
84+
console.log('Connection closing cleanly - will attempt a fresh connection');
85+
// this.sessionToken = null;
86+
// this.handshakeDone = false;
87+
this.cleanupSocket();
88+
// this.shouldReconnect = true;
89+
90+
// this._removeSessionFile(`${__dirname}/${DOR_SESSION_FILE}`);
91+
}
92+
93+
super.onClose(event)
94+
}
95+
96+
// _removeSessionFile(file) {
97+
// if (!fs.existsSync(file)) {
98+
// return;
99+
// }
100+
// fs.unlink(file, (error) => {
101+
// if (error) {
102+
// console.warn(`Error removing ${file}`, error);
103+
// this.shouldReconnect = false;
104+
// return;
105+
// }
106+
107+
// console.log(`Removed ${file}`);
108+
// })
109+
// }
110+
111+
send(message) {
73112
if (!this.socket) {
74113
this.connect();
75114
}
76115

77116
try {
78-
await super.send(message);
117+
super.send(message);
79118
}
80119
catch (e) {
81-
console.error('caught error', e)
120+
console.error(e.message)
82121
}
83122
}
84123
}

SibeliusConnect.js

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,11 @@ class SibeliusConnect extends WebSocketClient {
1515
}
1616

1717
onOpen(resolve) {
18-
let savedMessageQueue = this.messageQueue;
19-
this.messageQueue = [];
18+
this.on('handshakeDone', () => super.onOpen(resolve));
2019

2120
this._sendHandshake();
22-
23-
this.messageQueue = savedMessageQueue;
24-
savedMessageQueue = []
2521

26-
super.onOpen(resolve);
22+
// super.onOpen(resolve);
2723
}
2824

2925
_sendHandshake() {
@@ -45,7 +41,9 @@ class SibeliusConnect extends WebSocketClient {
4541
message.plugins = this.plugins;
4642
}
4743

48-
super.send(message);
44+
// use the socket's send method to avoid the messageQueue
45+
this.socket.send(JSON.stringify(message));
46+
console.log("Message sent:", message);
4947

5048
if (message.sessionToken) {
5149
// Sibelius doesn't send a response if reconnecting with a sessionToken,
@@ -60,6 +58,7 @@ class SibeliusConnect extends WebSocketClient {
6058
console.log('Received sessionToken:', this.sessionToken);
6159
saveJSON(SIB_SESSION_FILE, data, (e) => console.log("unable to save sessionToken", e));
6260
this.handshakeDone = true;
61+
this.emit('handshakeDone');
6362
}
6463
else {
6564
console.error("Handshake failed");
@@ -71,9 +70,11 @@ class SibeliusConnect extends WebSocketClient {
7170

7271
if (!this.handshakeDone && data.sessionToken) {
7372
this._processHandshake(data);
73+
console.log("Message received:", data);
74+
}
75+
else {
76+
super.onMessage(event);
7477
}
75-
76-
super.onMessage(event);
7778

7879
if (this.callbackAddress && this.callbackAddress.length > 0) {
7980
receive(this.callbackAddress, data);
@@ -109,16 +110,16 @@ class SibeliusConnect extends WebSocketClient {
109110
})
110111
}
111112

112-
async send(message) {
113+
send(message) {
113114
if (!this.socket) {
114115
this.connect();
115116
}
116117

117118
try {
118-
await super.send(message);
119+
super.send(message);
119120
}
120121
catch (e) {
121-
console.error('caught error', e)
122+
console.error(e.message)
122123
}
123124
}
124125
}

WebSocketClient.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ class WebSocketClient extends EventEmitter {
77
this.url = url;
88
this.reconnectInterval = options.reconnectInterval || 2000;
99
this.maxReconnectAttempts = options.maxReconnectAttempts || 10;
10-
this.responseTimeout = options.responseTimeout || 10000;
10+
this.responseTimeout = options.responseTimeout || 5000;
1111

1212
this.socket = null;
1313
this.reconnectAttempts = 0;
@@ -18,7 +18,7 @@ class WebSocketClient extends EventEmitter {
1818
this.processingQueue = false;
1919
}
2020

21-
async connect() {
21+
connect() {
2222
return new Promise((resolve, reject) => {
2323
this.socket = new WebSocket(this.url)
2424

@@ -91,7 +91,7 @@ class WebSocketClient extends EventEmitter {
9191
// Reject pending promises in the message queue
9292
while (this.messageQueue.length) {
9393
const { reject } = this.messageQueue.shift();
94-
reject(new Error("WebSocket closed during message queue processing"));
94+
reject(new Error("WebSocket closed during message queue processing - dumping message"));
9595
}
9696

9797
// Emit a cleanup or failure event, if necessary
@@ -104,6 +104,7 @@ class WebSocketClient extends EventEmitter {
104104
this.emit("open");
105105
resolve();
106106
this.processingQueue = false;
107+
console.log(this.messageQueue);
107108
this._processQueue();
108109
}
109110

0 commit comments

Comments
 (0)