Skip to content

Commit 3e9ca5e

Browse files
committed
feat: add fast header support
1 parent e9bf58a commit 3e9ca5e

File tree

8 files changed

+273
-218
lines changed

8 files changed

+273
-218
lines changed

Diff for: src/event/event-handler.js

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
const messageBuilder = require('../message/message-builder')
2-
const messageParser = require('../message/message-parser')
31
const C = require('../constants/constants')
42
const MulticastListener = require('../utils/multicast-listener')
53
const UnicastListener = require('../utils/unicast-listener')
64
const EventEmitter = require('component-emitter2')
5+
const Message = require('../message/message')
76
const rxjs = require('rxjs')
87

98
const EventHandler = function (options, connection, client) {
@@ -105,7 +104,7 @@ EventHandler.prototype.emit = function (name, data) {
105104
throw new Error('invalid argument name')
106105
}
107106

108-
this._connection.sendMsg(C.TOPIC.EVENT, C.ACTIONS.EVENT, [name, messageBuilder.typed(data)])
107+
this._connection.sendMsg(C.TOPIC.EVENT, C.ACTIONS.EVENT, [name, Message.encodeTyped(data)])
109108
this._emitter.emit(name, data)
110109
this._stats.emitted += 1
111110
}
@@ -143,7 +142,7 @@ EventHandler.prototype._$handle = function (message) {
143142

144143
if (message.action === C.ACTIONS.EVENT) {
145144
if (message.data && message.data.length === 2) {
146-
this._emitter.emit(name, messageParser.convertTyped(data, this._client))
145+
this._emitter.emit(name, Message.decodeTyped(data, this._client))
147146
} else {
148147
this._emitter.emit(name)
149148
}

Diff for: src/message/connection.js

+41-49
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
const BrowserWebSocket = globalThis.WebSocket || globalThis.MozWebSocket
22
const utils = require('../utils/utils')
33
const NodeWebSocket = utils.isNode ? require('ws') : null
4-
const messageParser = require('./message-parser')
5-
const messageBuilder = require('./message-builder')
4+
const Message = require('./message')
65
const C = require('../constants/constants')
76
const pkg = require('../../package.json')
87
const xxhash = require('xxhash-wasm')
@@ -79,15 +78,15 @@ Connection.prototype.authenticate = function (authParams, callback) {
7978
}
8079

8180
Connection.prototype.sendMsg = function (topic, action, data) {
82-
return this.send(messageBuilder.getMsg(topic, action, data))
81+
return this.send(Message.encode(topic, action, data))
8382
}
8483

8584
Connection.prototype.sendMsg1 = function (topic, action, p0) {
86-
return this.send(messageBuilder.getMsg1(topic, action, p0))
85+
return this.send(Message.encode(topic, action, [p0]))
8786
}
8887

8988
Connection.prototype.sendMsg2 = function (topic, action, p0, p1) {
90-
return this.send(messageBuilder.getMsg2(topic, action, p0, p1))
89+
return this.send(Message.encode(topic, action, [p0, p1]))
9190
}
9291

9392
Connection.prototype.close = function () {
@@ -101,19 +100,22 @@ Connection.prototype.close = function () {
101100
}
102101

103102
Connection.prototype._createEndpoint = function () {
104-
this._endpoint = NodeWebSocket
105-
? new NodeWebSocket(this._url, {
106-
generateMask() {},
107-
})
108-
: new BrowserWebSocket(this._url)
103+
if (NodeWebSocket) {
104+
this._endpoint = new NodeWebSocket(this._url, {
105+
generateMask() {},
106+
})
107+
} else {
108+
this._endpoint = new BrowserWebSocket(this._url)
109+
this._endpoint.binaryType = 'arraybuffer'
110+
}
109111
this._corked = false
110112

111113
this._endpoint.onopen = this._onOpen.bind(this)
112114
this._endpoint.onerror = this._onError.bind(this)
113115
this._endpoint.onclose = this._onClose.bind(this)
114116
this._endpoint.onmessage = BrowserWebSocket
115-
? ({ data }) => this._onMessage(typeof data === 'string' ? data : Buffer.from(data).toString())
116-
: ({ data }) => this._onMessage(typeof data === 'string' ? data : data.toString())
117+
? ({ data }) => this._onMessage(Buffer.from(data))
118+
: ({ data }) => this._onMessage(data)
117119
}
118120

119121
Connection.prototype.send = function (message) {
@@ -125,7 +127,10 @@ Connection.prototype.send = function (message) {
125127
C.TOPIC.CONNECTION,
126128
C.EVENT.CONNECTION_ERROR,
127129
err,
128-
message.split(C.MESSAGE_PART_SEPERATOR).map((x) => x.slice(0, 256))
130+
message
131+
.toString()
132+
.split(C.MESSAGE_PART_SEPERATOR)
133+
.map((x) => x.slice(0, 256))
129134
)
130135
return false
131136
}
@@ -172,14 +177,15 @@ Connection.prototype._submit = function (message) {
172177

173178
Connection.prototype._sendAuthParams = function () {
174179
this._setState(C.CONNECTION_STATE.AUTHENTICATING)
175-
const authMessage = messageBuilder.getMsg(C.TOPIC.AUTH, C.ACTIONS.REQUEST, [
176-
this._authParams,
177-
pkg.version,
178-
utils.isNode
179-
? `Node/${process.version}`
180-
: globalThis.navigator && globalThis.navigator.userAgent,
181-
])
182-
this._submit(authMessage)
180+
this._submit(
181+
Message.encode(C.TOPIC.AUTH, C.ACTIONS.REQUEST, [
182+
this._authParams,
183+
pkg.version,
184+
utils.isNode
185+
? `Node/${process.version}`
186+
: globalThis.navigator && globalThis.navigator.userAgent,
187+
])
188+
)
183189
}
184190

185191
Connection.prototype._onOpen = function () {
@@ -219,13 +225,11 @@ Connection.prototype._onClose = function () {
219225
}
220226
}
221227

222-
Connection.prototype._onMessage = function (data) {
223-
// Remove MESSAGE_SEPERATOR if exists.
224-
if (data.charCodeAt(data.length - 1) === 30) {
225-
data = data.slice(0, -1)
228+
Connection.prototype._onMessage = function (raw) {
229+
if (raw.length <= 2) {
230+
return
226231
}
227-
228-
this._recvQueue.push(data)
232+
this._recvQueue.push(Message.decode(raw))
229233
if (!this._processingRecv) {
230234
this._processingRecv = true
231235
this._schedule(this._recvMessages)
@@ -245,24 +249,14 @@ Connection.prototype._recvMessages = function (deadline) {
245249
return
246250
}
247251

248-
if (message.length <= 2) {
249-
continue
250-
}
251-
252-
if (this._logger) {
253-
this._logger.trace(message, 'receive')
254-
}
255-
256-
messageParser.parseMessage(message, this._client, this._message)
252+
this.emit('recv', message)
257253

258-
this.emit('recv', this._message)
259-
260-
if (this._message.topic === C.TOPIC.CONNECTION) {
261-
this._handleConnectionResponse(this._message)
262-
} else if (this._message.topic === C.TOPIC.AUTH) {
263-
this._handleAuthResponse(this._message)
254+
if (message.topic === C.TOPIC.CONNECTION) {
255+
this._handleConnectionResponse(message)
256+
} else if (message.topic === C.TOPIC.AUTH) {
257+
this._handleAuthResponse(message)
264258
} else {
265-
this._client._$onMessage(this._message)
259+
this._client._$onMessage(message)
266260
}
267261
}
268262

@@ -271,17 +265,15 @@ Connection.prototype._recvMessages = function (deadline) {
271265

272266
Connection.prototype._handleConnectionResponse = function (message) {
273267
if (message.action === C.ACTIONS.PING) {
274-
this._submit(messageBuilder.getMsg(C.TOPIC.CONNECTION, C.ACTIONS.PONG))
268+
this._submit(Message.encode(C.TOPIC.CONNECTION, C.ACTIONS.PONG))
275269
} else if (message.action === C.ACTIONS.ACK) {
276270
this._setState(C.CONNECTION_STATE.AWAITING_AUTHENTICATION)
277271
if (this._authParams) {
278272
this._sendAuthParams()
279273
}
280274
} else if (message.action === C.ACTIONS.CHALLENGE) {
281275
this._setState(C.CONNECTION_STATE.CHALLENGING)
282-
this._submit(
283-
messageBuilder.getMsg(C.TOPIC.CONNECTION, C.ACTIONS.CHALLENGE_RESPONSE, [this._url])
284-
)
276+
this._submit(Message.encode(C.TOPIC.CONNECTION, C.ACTIONS.CHALLENGE_RESPONSE, [this._url]))
285277
} else if (message.action === C.ACTIONS.REJECTION) {
286278
this._challengeDenied = true
287279
this.close()
@@ -316,10 +308,10 @@ Connection.prototype._handleAuthResponse = function (message) {
316308
}
317309

318310
Connection.prototype._getAuthData = function (data) {
319-
if (data === undefined) {
311+
if (!data) {
320312
return null
321313
} else {
322-
return messageParser.convertTyped(data, this._client)
314+
return Message.decodeTyped(data, this._client)
323315
}
324316
}
325317

Diff for: src/message/message-builder.js

-65
This file was deleted.

Diff for: src/message/message-parser.js

-91
This file was deleted.

0 commit comments

Comments
 (0)