session icon indicating copy to clipboard operation
session copied to clipboard

Type definition of callback arguments for `SessionStore.get`

Open rktyt opened this issue 3 years ago • 6 comments

Prerequisites

  • [X] I have written a descriptive issue title
  • [X] I have searched existing issues to ensure the feature has not already been requested

🚀 Feature Proposal

  1. I would like to have the result value to be optional and allow null or undefined.
  2. I would like to have the method removed from the type definition of the result value. Probably only sessionId, encryptedSessionId and user-defined values are needed for the result value.
get(sessionId, callback) {
  getSessionDataFromCustomDatabase(sessionId)
    .then((data) => {
      if (!data) {
        // If the data simply does not exist, I want to do the following
        callback(null, null) // ❌ TS2345: Argument of type 'null' is not assignable to parameter of type 'Session'.
        // or 
        callback(null) // ❌ TS2554: Expected 2 arguments, but got 1.
        // or
        callback() // ❌ TS2554: Expected 2 arguments, but got 0.
        return
      }
      callback(null, data) // ⚠ If you want to follow the type definition, you need to implement touch, save, regenerate, and other methods on the data.
    })
    .catch((error: Error) => {
      // If the process fails, I want to do the following
      callback(error) // ❌ TS2554: Expected 2 arguments, but got 1.
      // or 
      callback(error, null) // ❌ TS2345: Argument of type 'null' is not assignable to parameter of type 'Session'.
    })
}

Currently, I have to do the following, but I feel it is because the original type definition is bad.

get(sessionId, callback) {
  getSessinDataFromCustomDatabase(sessionId)
    .then((data) => {
      if (!data) {
        callback(null, null as unknown as Fastify.Session) // Not at all type-safe.
        return
      }
      callback(null, data as Fastify.Session) // Not at all type-safe.
    })
    .catch((error: Error) => {
      callback(error, null as unknown as Fastify.Session) // Not at all type-safe.
    })
}

Motivation

No response

Example

No response

rktyt avatar Sep 02 '22 04:09 rktyt

A PR is welcome. Dont forget to also adding typings tests.

It is planned to publish on friday a new version.

Uzlopak avatar Sep 06 '22 12:09 Uzlopak

Released in v10

https://github.com/fastify/session/blob/16ef7eb6c79ecc2342b0611c3aebb2512ca0c24c/types/types.d.ts#L84

Eomm avatar Sep 11 '22 13:09 Eomm

I think what he wants ie that CallbackSession needs to have FastifySession and null as second param

Uzlopak avatar Sep 11 '22 13:09 Uzlopak

Thanks.

I think what he wants ie that CallbackSession needs to have FastifySession and null as second param

Yes. And omit unnessary methods or properties.

Like this

// Note: I am not sure if the cookie property is necessary.
type UnnessaryRestoreSessionKeys = 'touch' | 'regenerate' | 'destroy' | 'reload' | 'save' | 'set' | 'get' | 'isModified' | 'cookie';
type CallbackSession = (err: Error | null, result: Omit<Fastify.Session, UnnessaryRestoreSessionKeys> | null) => void;

rktyt avatar Sep 12 '22 01:09 rktyt

+1 for this.

kgoedecke avatar Nov 01 '22 08:11 kgoedecke

@kgoedecke

Can you provide a PR?

Uzlopak avatar Nov 01 '22 08:11 Uzlopak