rsocket / rsocket-js

JavaScript implementation of RSocket

Home Page:https://github.com/rsocket/rsocket-js

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

"Unknown resume token" error

spiralgo opened this issue · comments

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'