47ng/prisma-field-encryption

Encrypted strings are becoming more and more extensive with Next.js hot reload

matheins opened this issue · 6 comments

Problem:

I started using this library a few days ago with the goal to encrypt chat messages. The max length of a message is 1000 characters. I used this tool to calculate the max cypher length of 1395, wich I used to define the size of the VarChar column.

Fist it started to work as expected and the cipher texts are looking ok. F.e. "test" has a cypher text length of 67.

After using it for a few hour in development Im starting to see that the cypher texts are growing exponentially.
To give an example:
same word: "test" becomes a cypher of 1227 characters.
Longer words are failing because of the size limit of the varchar column.

Is it possible that the middleware of this library runs encryption multiple times after multiple hot-reloads?

Quick fix

Restarting the project solves this issue BUT the encrypted messages with these huge cyphers are not getting decrypted anymore.

Setup:

Prisma Model:

model Message {
    id          String   @id @default(cuid())
    createdAt   DateTime @default(now())
    updatedAt   DateTime @updatedAt
    text        String   @db.VarChar(1395) /// @encrypted
    createdBy   User     @relation(fields: [createdById], references: [id])
    createdById String
    isRead      Boolean  @default(false)

    @@index([createdById])
}

Spec:

  • Nextjs 13.2.4
  • Prisma 4.11.0
  • prisma-field-encryption 1.4.1
  • Turbo Repo:
    • apps/web (Nextjs)
    • packages/db (Prisma)

It sounds like you're encrypting ciphertext, which would explain both your observations.

Could you detail your setup more about the "hot reload" part?

If all else fails, enabling debugging may provide more insights.

That absolutely would make sense!

Im using the standard "next dev" command wich hot reloads the project every time you change sth.

I activated debugging and spotted that one single write into db results in dozens of encryption activities.
Any clue what could cause this? Im using the standard create() method from prisma.

Logs
web:dev: 2023-04-20T13:31:33.851Z prisma-field-encryption:encryption Clear-text input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.851Z prisma-field-encryption:encryption Encrypted input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.851Z prisma-field-encryption:encryption Clear-text input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.851Z prisma-field-encryption:encryption Encrypted input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.851Z prisma-field-encryption:encryption Clear-text input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.851Z prisma-field-encryption:encryption Encrypted input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.851Z prisma-field-encryption:encryption Clear-text input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.851Z prisma-field-encryption:encryption Encrypted input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.851Z prisma-field-encryption:encryption Clear-text input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.852Z prisma-field-encryption:encryption Encrypted input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.852Z prisma-field-encryption:encryption Clear-text input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.852Z prisma-field-encryption:encryption Encrypted input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.852Z prisma-field-encryption:encryption Clear-text input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.852Z prisma-field-encryption:encryption Encrypted input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.852Z prisma-field-encryption:encryption Clear-text input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.852Z prisma-field-encryption:encryption Encrypted input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.852Z prisma-field-encryption:encryption Clear-text input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.852Z prisma-field-encryption:encryption Encrypted input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.852Z prisma-field-encryption:encryption Clear-text input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.852Z prisma-field-encryption:encryption Encrypted input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.852Z prisma-field-encryption:encryption Clear-text input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.852Z prisma-field-encryption:encryption Encrypted input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.852Z prisma-field-encryption:encryption Clear-text input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.852Z prisma-field-encryption:encryption Encrypted input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.852Z prisma-field-encryption:encryption Clear-text input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.852Z prisma-field-encryption:encryption Encrypted input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.852Z prisma-field-encryption:encryption Clear-text input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.852Z prisma-field-encryption:encryption Encrypted input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.852Z prisma-field-encryption:encryption Clear-text input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.852Z prisma-field-encryption:encryption Encrypted input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.852Z prisma-field-encryption:encryption Clear-text input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.852Z prisma-field-encryption:encryption Encrypted input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.852Z prisma-field-encryption:encryption Clear-text input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.852Z prisma-field-encryption:encryption Encrypted input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.852Z prisma-field-encryption:encryption Clear-text input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.852Z prisma-field-encryption:encryption Encrypted input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.852Z prisma-field-encryption:encryption Clear-text input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.853Z prisma-field-encryption:encryption Encrypted input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.853Z prisma-field-encryption:encryption Clear-text input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.853Z prisma-field-encryption:encryption Encrypted input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.853Z prisma-field-encryption:encryption Clear-text input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.853Z prisma-field-encryption:encryption Encrypted input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.853Z prisma-field-encryption:encryption Clear-text input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.853Z prisma-field-encryption:encryption Encrypted input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.853Z prisma-field-encryption:encryption Clear-text input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.853Z prisma-field-encryption:encryption Encrypted input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.853Z prisma-field-encryption:encryption Clear-text input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.853Z prisma-field-encryption:encryption Encrypted input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.853Z prisma-field-encryption:encryption Clear-text input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.853Z prisma-field-encryption:encryption Encrypted input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.853Z prisma-field-encryption:encryption Clear-text input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.853Z prisma-field-encryption:encryption Encrypted input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.853Z prisma-field-encryption:encryption Clear-text input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.853Z prisma-field-encryption:encryption Encrypted input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.853Z prisma-field-encryption:encryption Clear-text input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.853Z prisma-field-encryption:encryption Encrypted input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.853Z prisma-field-encryption:encryption Clear-text input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.853Z prisma-field-encryption:encryption Encrypted input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.853Z prisma-field-encryption:encryption Clear-text input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.853Z prisma-field-encryption:encryption Encrypted input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.853Z prisma-field-encryption:encryption Clear-text input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.854Z prisma-field-encryption:encryption Encrypted input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.854Z prisma-field-encryption:encryption Clear-text input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.854Z prisma-field-encryption:encryption Encrypted input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.854Z prisma-field-encryption:encryption Clear-text input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.854Z prisma-field-encryption:encryption Encrypted input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.854Z prisma-field-encryption:encryption Clear-text input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.854Z prisma-field-encryption:encryption Encrypted input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.854Z prisma-field-encryption:encryption Clear-text input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.854Z prisma-field-encryption:encryption Encrypted input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.854Z prisma-field-encryption:encryption Clear-text input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.854Z prisma-field-encryption:encryption Encrypted input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.854Z prisma-field-encryption:encryption Clear-text input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.854Z prisma-field-encryption:encryption Encrypted input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.854Z prisma-field-encryption:encryption Clear-text input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.854Z prisma-field-encryption:encryption Encrypted input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.854Z prisma-field-encryption:encryption Clear-text input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.854Z prisma-field-encryption:encryption Encrypted input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.854Z prisma-field-encryption:encryption Clear-text input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.854Z prisma-field-encryption:encryption Encrypted input: {
web:dev:   args: { where: { clientId: 'clg2cy09h0002sb6e172qpr34' } },
web:dev:   dataPath: [],
web:dev:   runInTransaction: false,
web:dev:   action: 'count',
web:dev:   model: 'Message'
web:dev: }
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Raw result from database: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Decrypted result: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Raw result from database: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Decrypted result: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Raw result from database: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Decrypted result: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Raw result from database: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Decrypted result: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Raw result from database: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Decrypted result: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Raw result from database: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Decrypted result: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Raw result from database: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Decrypted result: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Raw result from database: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Decrypted result: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Raw result from database: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Decrypted result: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Raw result from database: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Decrypted result: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Raw result from database: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Decrypted result: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Raw result from database: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Decrypted result: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Raw result from database: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Decrypted result: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Raw result from database: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Decrypted result: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Raw result from database: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Decrypted result: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Raw result from database: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Decrypted result: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Raw result from database: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Decrypted result: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Raw result from database: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Decrypted result: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Raw result from database: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Decrypted result: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Raw result from database: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Decrypted result: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Raw result from database: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Decrypted result: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Raw result from database: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Decrypted result: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Raw result from database: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Decrypted result: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Raw result from database: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Decrypted result: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Raw result from database: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Decrypted result: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Raw result from database: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Decrypted result: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Raw result from database: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Decrypted result: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Raw result from database: 3
web:dev: 2023-04-20T13:31:33.858Z prisma-field-encryption:decryption Decrypted result: 3
web:dev: 2023-04-20T13:31:33.859Z prisma-field-encryption:decryption Raw result from database: 3
web:dev: 2023-04-20T13:31:33.859Z prisma-field-encryption:decryption Decrypted result: 3
web:dev: 2023-04-20T13:31:33.859Z prisma-field-encryption:decryption Raw result from database: 3
web:dev: 2023-04-20T13:31:33.859Z prisma-field-encryption:decryption Decrypted result: 3
web:dev: 2023-04-20T13:31:33.859Z prisma-field-encryption:decryption Raw result from database: 3
web:dev: 2023-04-20T13:31:33.859Z prisma-field-encryption:decryption Decrypted result: 3
web:dev: 2023-04-20T13:31:33.859Z prisma-field-encryption:decryption Raw result from database: 3
web:dev: 2023-04-20T13:31:33.859Z prisma-field-encryption:decryption Decrypted result: 3
web:dev: 2023-04-20T13:31:33.859Z prisma-field-encryption:decryption Raw result from database: 3
web:dev: 2023-04-20T13:31:33.859Z prisma-field-encryption:decryption Decrypted result: 3
web:dev: 2023-04-20T13:31:33.859Z prisma-field-encryption:decryption Raw result from database: 3
web:dev: 2023-04-20T13:31:33.859Z prisma-field-encryption:decryption Decrypted result: 3
web:dev: 2023-04-20T13:31:33.859Z prisma-field-encryption:decryption Raw result from database: 3
web:dev: 2023-04-20T13:31:33.859Z prisma-field-encryption:decryption Decrypted result: 3
web:dev: 2023-04-20T13:31:33.859Z prisma-field-encryption:decryption Raw result from database: 3
web:dev: 2023-04-20T13:31:33.859Z prisma-field-encryption:decryption Decrypted result: 3
web:dev: 2023-04-20T13:31:33.859Z prisma-field-encryption:decryption Raw result from database: 3
web:dev: 2023-04-20T13:31:33.859Z prisma-field-encryption:decryption Decrypted result: 3
web:dev: 2023-04-20T13:31:33.859Z prisma-field-encryption:decryption Raw result from database: 3
web:dev: 2023-04-20T13:31:33.859Z prisma-field-encryption:decryption Decrypted result: 3
web:dev: 2023-04-20T13:31:33.859Z prisma-field-encryption:decryption Raw result from database: 3
web:dev: 2023-04-20T13:31:33.859Z prisma-field-encryption:decryption Decrypted result: 3
web:dev: 2023-04-20T13:31:33.859Z prisma-field-encryption:decryption Raw result from database: 3
web:dev: 2023-04-20T13:31:33.859Z prisma-field-encryption:decryption Decrypted result: 3

Could it be possible that the hot-reload mechanism somehow re-registers the middleware to the same Prisma client instance?

That would certainly explain all the observed behaviour.

There used to be tricks to use Prisma properly with Next.js (especially due to serverless environments like Vercel), how do you create your client and pass it to your app?

Awseome hint! I found a similar issue with the prisma middleware.

Fix

Add a check to make sure you are not in production and the is no prisma client initiated already:

import { PrismaClient } from "@prisma/client";
import { fieldEncryptionMiddleware } from "prisma-field-encryption";

export * from "@prisma/client";

const globalForPrisma = globalThis as unknown as { prisma: PrismaClient };

export const prisma: PrismaClient =
  globalForPrisma.prisma ||
  new PrismaClient({
    log:
      process.env.NODE_ENV === "development"
        ? ["query", "error", "warn"]
        : ["error"],
  });

// FIX of ISSUE #55
// makes sure that the middleware is only added once (in development)
if (process.env.NODE_ENV !== "production" && !globalForPrisma.prisma) {
  prisma.$use(fieldEncryptionMiddleware());
}

if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = prisma;

You may want to re-evaluate your logic for the first if statement, as it is it won't enable encryption in production (which I believe is the point of using this middleware).