"Unknown resume token" error
spiralgo opened this issue · comments
spiralgo commented
Expected Behavior
We use react-js on client side with this resume code:
resume: {
tokenGenerator: () => Buffer.from(clientUuid),
reconnectFunction: (attemptCount) =>
new Promise((resolve, reject) => {
if(attemptCount > 9) reject();
console.log("reconnect attempt: " + attemptCount);
setTimeout(resolve, 9 * 1000);
})
}
We use spring-boot-starter-rsocket on the server side.
We expect it resumes after the shutdown and restart the Spring server.
Actual Behavior
We get this error on the client side:
Error: Closed. Original cause [Error: Incomplete RESUME handshake. Unexpected frame 11 received].
at ClientServerInputMultiplexerDemultiplexer.close (ClientServerMultiplexerDemultiplexer.js?862d:176:1)
at eval (ClientServerMultiplexerDemultiplexer.js?862d:387:1)
at Deferred.onClose (Deferred.js?efc5:89:1)
at ResumeOkAwaitingResumableClientServerInputMultiplexerDemultiplexer.handle (ClientServerMultiplexerDemultiplexer.js?862d:386:1)
at WebsocketDuplexConnection._this.handleMessage (WebsocketDuplexConnection.js?733e:51:1)
When we debug, we also see the message: "unknown resume token".
Steps to Reproduce
export const createConnector = (url: string, clientUuid: string) => {
const connector = new RSocketConnector({
setup: {
// ms btw sending keepalive to server
keepAlive: 60000,
// ms timeout if no keepalive response
lifetime: 180000,
payload: {
data: Buffer.from(clientUuid),
metadata: Buffer.from(String.fromCharCode(clientUuid.length) + clientUuid)
},
// format of `data`
dataMimeType: 'application/json',
// format of `metadata`
metadataMimeType: 'message/x.rsocket.routing.v0',
},
transport: new WebsocketClientTransport({
url: url
}),
resume: {
tokenGenerator: () => Buffer.from(clientUuid),
reconnectFunction: (attemptCount) =>
new Promise((resolve, reject) => {
if(attemptCount > 9) reject();
console.log("reconnect attempt: " + attemptCount);
setTimeout(resolve, 9 * 1000);
})
}
});
return connector;
};
For JAVA, just use the default configuration for spring-boot-starter-rsocket with this yml:
spring:
rsocket:
server:
mapping-path: /websocket
transport: websocket
port: 8081
Possible Solution
The root cause for this error might be that the server validates token using in-memory store, Implementing a permanent store for tokens might help.
Your Environment
package.json
"rsocket-core": "^1.0.0-alpha.1",
"rsocket-types": "^0.0.27",
"rsocket-websocket-client": "^1.0.0-alpha.1",
gradle:
implementation 'org.springframework.boot:spring-boot-starter-rsocket'