diff --git a/packages/backend/server/package.json b/packages/backend/server/package.json index 332192e9f..5f8546a22 100644 --- a/packages/backend/server/package.json +++ b/packages/backend/server/package.json @@ -65,8 +65,8 @@ "@opentelemetry/sdk-node": "^0.57.0", "@opentelemetry/sdk-trace-node": "^1.29.0", "@opentelemetry/semantic-conventions": "^1.28.0", - "@prisma/client": "^5.22.0", - "@prisma/instrumentation": "^5.22.0", + "@prisma/client": "^6.6.0", + "@prisma/instrumentation": "^6.6.0", "@react-email/components": "0.0.36", "@socket.io/redis-adapter": "^8.3.0", "ai": "^4.3.4", @@ -97,7 +97,7 @@ "nodemailer": "^6.9.16", "on-headers": "^1.0.2", "piscina": "^5.0.0-alpha.0", - "prisma": "^5.22.0", + "prisma": "^6.6.0", "react": "19.1.0", "react-dom": "19.1.0", "reflect-metadata": "^0.2.2", diff --git a/packages/backend/server/schema.prisma b/packages/backend/server/schema.prisma index d91469652..59c708dcb 100644 --- a/packages/backend/server/schema.prisma +++ b/packages/backend/server/schema.prisma @@ -1,5 +1,6 @@ generator client { provider = "prisma-client-js" + output = "./node_modules/.prisma/client" binaryTargets = ["native", "debian-openssl-3.0.x", "linux-arm64-openssl-3.0.x"] previewFeatures = ["metrics", "relationJoins", "nativeDistinct", "postgresqlExtensions"] } diff --git a/packages/backend/server/src/__tests__/doc/history.spec.ts b/packages/backend/server/src/__tests__/doc/history.spec.ts index ad280de67..8600863ed 100644 --- a/packages/backend/server/src/__tests__/doc/history.spec.ts +++ b/packages/backend/server/src/__tests__/doc/history.spec.ts @@ -39,8 +39,8 @@ test.after.always(async () => { const snapshot: Snapshot = { workspaceId: '1', id: 'doc1', - blob: Buffer.from([1, 0]), - state: Buffer.from([0]), + blob: Uint8Array.from([1, 0]), + state: Uint8Array.from([0]), seq: 0, updatedAt: new Date(), createdAt: new Date(), @@ -276,5 +276,5 @@ test('should be able to recover from history', async t => { t.is(history2.timestamp.getTime(), snapshot.updatedAt.getTime()); // new history data force created with snapshot state before recovered - t.deepEqual(history2.blob, Buffer.from([1, 1])); + t.deepEqual(history2.blob, Uint8Array.from([1, 1])); }); diff --git a/packages/backend/server/src/__tests__/models/doc.spec.ts b/packages/backend/server/src/__tests__/models/doc.spec.ts index 55a4b231a..91dfd37d1 100644 --- a/packages/backend/server/src/__tests__/models/doc.spec.ts +++ b/packages/backend/server/src/__tests__/models/doc.spec.ts @@ -101,22 +101,22 @@ test('should find updates by spaceId and docId', async t => { { spaceId: workspace.id, docId, - blob: Buffer.from('blob1'), + blob: Uint8Array.from([1, 2, 3]), timestamp: Date.now(), editorId: user.id, }, { spaceId: workspace.id, docId, - blob: Buffer.from('blob2'), + blob: Uint8Array.from([4, 5, 6]), timestamp: Date.now() + 1000, editorId: user.id, }, ]); const foundUpdates = await t.context.doc.findUpdates(workspace.id, docId); t.is(foundUpdates.length, 2); - t.deepEqual(foundUpdates[0].blob, Buffer.from('blob1')); - t.deepEqual(foundUpdates[1].blob, Buffer.from('blob2')); + t.deepEqual(foundUpdates[0].blob, Uint8Array.from([1, 2, 3])); + t.deepEqual(foundUpdates[1].blob, Uint8Array.from([4, 5, 6])); let count = await t.context.doc.getUpdateCount(workspace.id, docId); t.is(count, 2); @@ -199,7 +199,7 @@ test('should upsert a doc', async t => { const snapshot = { spaceId: workspace.id, docId: randomUUID(), - blob: Buffer.from('blob1'), + blob: Uint8Array.from([1, 2, 3]), timestamp: Date.now(), editorId: user.id, }; diff --git a/packages/backend/server/src/__tests__/models/user-doc.spec.ts b/packages/backend/server/src/__tests__/models/user-doc.spec.ts index 9e213c0ea..73b42ac3f 100644 --- a/packages/backend/server/src/__tests__/models/user-doc.spec.ts +++ b/packages/backend/server/src/__tests__/models/user-doc.spec.ts @@ -81,7 +81,7 @@ test('should get a doc', async t => { const doc = await t.context.doc.upsert({ spaceId: user.id, docId, - blob: Buffer.from('hello'), + blob: Uint8Array.from([1, 2, 3]), timestamp: Date.now(), editorId: user.id, }); @@ -89,7 +89,7 @@ test('should get a doc', async t => { const doc2 = await t.context.doc.get(user.id, docId); t.truthy(doc2); t.is(doc2!.docId, docId); - t.deepEqual(doc2!.blob, Buffer.from('hello')); + t.deepEqual(doc2!.blob, Uint8Array.from([1, 2, 3])); // get a non-exist doc const doc3 = await t.context.doc.get(user.id, randomUUID()); t.is(doc3, null); diff --git a/packages/backend/server/src/core/doc/__tests__/reader-from-database.spec.ts b/packages/backend/server/src/core/doc/__tests__/reader-from-database.spec.ts index a4d738534..1554d9313 100644 --- a/packages/backend/server/src/core/doc/__tests__/reader-from-database.spec.ts +++ b/packages/backend/server/src/core/doc/__tests__/reader-from-database.spec.ts @@ -73,7 +73,7 @@ test('should return doc when found', async t => { const doc = await docReader.getDoc(workspace.id, docId); t.truthy(doc); - t.is(doc!.bin.toString(), 'blob1 data'); + t.is(Buffer.from(doc!.bin).toString('utf8'), 'blob1 data'); t.is(doc!.timestamp, timestamp); t.is(doc!.editor, user.id); }); diff --git a/packages/backend/server/src/core/doc/__tests__/reader-from-rpc.spec.ts b/packages/backend/server/src/core/doc/__tests__/reader-from-rpc.spec.ts index 9f7eb8773..5ae92beeb 100644 --- a/packages/backend/server/src/core/doc/__tests__/reader-from-rpc.spec.ts +++ b/packages/backend/server/src/core/doc/__tests__/reader-from-rpc.spec.ts @@ -137,7 +137,7 @@ test('should fallback to database doc reader when endpoint network error', async const doc = await docReader.getDoc(workspace.id, docId); t.truthy(doc); - t.is(doc!.bin.toString(), 'blob1 data'); + t.is(Buffer.from(doc!.bin).toString('utf8'), 'blob1 data'); t.is(doc!.timestamp, timestamp); t.is(doc!.editor, user.id); }); diff --git a/packages/backend/server/src/core/notification/service.ts b/packages/backend/server/src/core/notification/service.ts index d699bd5f7..4a13ab392 100644 --- a/packages/backend/server/src/core/notification/service.ts +++ b/packages/backend/server/src/core/notification/service.ts @@ -1,5 +1,5 @@ import { Injectable, Logger } from '@nestjs/common'; -import { PrismaClientKnownRequestError } from '@prisma/client/runtime/library'; +import { Prisma } from '@prisma/client'; import { NotificationNotFound, PaginationInput, URLHelper } from '../../base'; import { @@ -335,7 +335,7 @@ export class NotificationService { await this.models.notification.markAsRead(notificationId, userId); } catch (err) { if ( - err instanceof PrismaClientKnownRequestError && + err instanceof Prisma.PrismaClientKnownRequestError && err.code === 'P2025' ) { // https://www.prisma.io/docs/orm/reference/error-reference#p2025 diff --git a/packages/backend/server/src/models/__tests__/history.spec.ts b/packages/backend/server/src/models/__tests__/history.spec.ts index f1db7ecfa..2a26c1ec4 100644 --- a/packages/backend/server/src/models/__tests__/history.spec.ts +++ b/packages/backend/server/src/models/__tests__/history.spec.ts @@ -50,7 +50,7 @@ test('should create a history record', async t => { const snapshot = { spaceId: workspace.id, docId: randomUUID(), - blob: Buffer.from('blob1'), + blob: Uint8Array.from([1, 2, 3]), timestamp: Date.now(), editorId: user.id, }; diff --git a/packages/backend/server/src/models/common/doc.ts b/packages/backend/server/src/models/common/doc.ts index 5259df201..e25c79df1 100644 --- a/packages/backend/server/src/models/common/doc.ts +++ b/packages/backend/server/src/models/common/doc.ts @@ -6,7 +6,7 @@ export interface Doc { */ spaceId: string; docId: string; - blob: Buffer; + blob: Uint8Array; timestamp: number; editorId?: string; } diff --git a/packages/backend/server/src/models/history.ts b/packages/backend/server/src/models/history.ts index d0dffb6a4..65b2dd00d 100644 --- a/packages/backend/server/src/models/history.ts +++ b/packages/backend/server/src/models/history.ts @@ -9,7 +9,7 @@ export interface DocHistorySimple { } export interface DocHistory { - blob: Buffer; + blob: Uint8Array; timestamp: number; editor: DocEditor | null; } diff --git a/yarn.lock b/yarn.lock index a98bacf62..d870c37eb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -911,8 +911,8 @@ __metadata: "@opentelemetry/sdk-node": "npm:^0.57.0" "@opentelemetry/sdk-trace-node": "npm:^1.29.0" "@opentelemetry/semantic-conventions": "npm:^1.28.0" - "@prisma/client": "npm:^5.22.0" - "@prisma/instrumentation": "npm:^5.22.0" + "@prisma/client": "npm:^6.6.0" + "@prisma/instrumentation": "npm:^6.6.0" "@react-email/components": "npm:0.0.36" "@socket.io/redis-adapter": "npm:^8.3.0" "@types/cookie-parser": "npm:^1.4.8" @@ -963,7 +963,7 @@ __metadata: nodemon: "npm:^3.1.7" on-headers: "npm:^1.0.2" piscina: "npm:^5.0.0-alpha.0" - prisma: "npm:^5.22.0" + prisma: "npm:^6.6.0" react: "npm:19.1.0" react-dom: "npm:19.1.0" react-email: "npm:4.0.7" @@ -9500,15 +9500,6 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/api-logs@npm:0.53.0": - version: 0.53.0 - resolution: "@opentelemetry/api-logs@npm:0.53.0" - dependencies: - "@opentelemetry/api": "npm:^1.0.0" - checksum: 10/347b4554d6ee01afb29bd39e8f9cbbccd80abb0883fe6a84e3bcce8ab4dbfe357a2729246d2f66de0de6272846fd1bb2d71e286e18ad2690d9e7f46f02f00f73 - languageName: node - linkType: hard - "@opentelemetry/api-logs@npm:0.57.2": version: 0.57.2 resolution: "@opentelemetry/api-logs@npm:0.57.2" @@ -9518,7 +9509,7 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/api@npm:1.9.0, @opentelemetry/api@npm:^1.0.0, @opentelemetry/api@npm:^1.3.0, @opentelemetry/api@npm:^1.8, @opentelemetry/api@npm:^1.9.0": +"@opentelemetry/api@npm:1.9.0, @opentelemetry/api@npm:^1.3.0, @opentelemetry/api@npm:^1.9.0": version: 1.9.0 resolution: "@opentelemetry/api@npm:1.9.0" checksum: 10/a607f0eef971893c4f2ee2a4c2069aade6ec3e84e2a1f5c2aac19f65c5d9eeea41aa72db917c1029faafdd71789a1a040bdc18f40d63690e22ccae5d7070f194 @@ -10059,22 +10050,6 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/instrumentation@npm:^0.49 || ^0.50 || ^0.51 || ^0.52.0 || ^0.53.0": - version: 0.53.0 - resolution: "@opentelemetry/instrumentation@npm:0.53.0" - dependencies: - "@opentelemetry/api-logs": "npm:0.53.0" - "@types/shimmer": "npm:^1.2.0" - import-in-the-middle: "npm:^1.8.1" - require-in-the-middle: "npm:^7.1.1" - semver: "npm:^7.5.2" - shimmer: "npm:^1.2.1" - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 10/4b994c8568a503a15655cba249b1dbdef3f67dfda37938abba6267ba75b6d72a9aa276be4b0c8874e86f98ab89d92877e1874e0565a7e67f062c43dfcbbb16a5 - languageName: node - linkType: hard - "@opentelemetry/otlp-exporter-base@npm:0.57.2": version: 0.57.2 resolution: "@opentelemetry/otlp-exporter-base@npm:0.57.2" @@ -10214,7 +10189,7 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/sdk-trace-base@npm:1.30.1, @opentelemetry/sdk-trace-base@npm:^1.22, @opentelemetry/sdk-trace-base@npm:^1.30.1": +"@opentelemetry/sdk-trace-base@npm:1.30.1, @opentelemetry/sdk-trace-base@npm:^1.30.1": version: 1.30.1 resolution: "@opentelemetry/sdk-trace-base@npm:1.30.1" dependencies: @@ -10472,61 +10447,74 @@ __metadata: languageName: node linkType: hard -"@prisma/client@npm:^5.22.0": - version: 5.22.0 - resolution: "@prisma/client@npm:5.22.0" +"@prisma/client@npm:^6.6.0": + version: 6.6.0 + resolution: "@prisma/client@npm:6.6.0" peerDependencies: prisma: "*" + typescript: ">=5.1.0" peerDependenciesMeta: prisma: optional: true - checksum: 10/991d7410ded2d6c824303ac222ae94df4f1bf42240dda97c710cfee3a3bc59fef65c73e1ee55177e38d12f4d7dfc0a047748f98b4e3026dddd65f462684cd2d1 + typescript: + optional: true + checksum: 10/5093062b45597f25ebdd84e86ac29e38fdac2a35809267a69181f97842cf54877d9cb35954a0368509373cd4b4d9062039b8adad400d764f5ca1cf39e8f6de36 languageName: node linkType: hard -"@prisma/debug@npm:5.22.0": - version: 5.22.0 - resolution: "@prisma/debug@npm:5.22.0" - checksum: 10/e4c425fde57f83c1a3df44d3f9088684a3e1d764022d2378f981209e57b7f421bc773d7f4fc23daa3936aa3e3772fa99fef81d2f2ec9673269f06efe822e3b53 - languageName: node - linkType: hard - -"@prisma/engines-version@npm:5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2": - version: 5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2 - resolution: "@prisma/engines-version@npm:5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2" - checksum: 10/e9e3563d75482591ca482dfc26afaf8a727796f48bfcc9b550652ca9c66176f5841944d00f8a4cb60a7fd58b117d8e28b1c6b84fc7316123738f7290c91c291d - languageName: node - linkType: hard - -"@prisma/engines@npm:5.22.0": - version: 5.22.0 - resolution: "@prisma/engines@npm:5.22.0" +"@prisma/config@npm:6.6.0": + version: 6.6.0 + resolution: "@prisma/config@npm:6.6.0" dependencies: - "@prisma/debug": "npm:5.22.0" - "@prisma/engines-version": "npm:5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2" - "@prisma/fetch-engine": "npm:5.22.0" - "@prisma/get-platform": "npm:5.22.0" - checksum: 10/887381d8be0acc713159ef70cdc5c4b2ca5af6f3a5d2f6ae73b63c6cf31b74e5c41a9c2dbccb02b1a49bbda19a3d0a75cd1bcc86d76e98991c3a3978e61b622b + esbuild: "npm:>=0.12 <1" + esbuild-register: "npm:3.6.0" + checksum: 10/0793c4d8facfee8eda59fbdab33f46beff2031bcaa18738ecf502d5a444cfef894d41f2cbe95d1f220e204f617050255860839989abbcfee9349d74d06bf0fa1 languageName: node linkType: hard -"@prisma/fetch-engine@npm:5.22.0": - version: 5.22.0 - resolution: "@prisma/fetch-engine@npm:5.22.0" - dependencies: - "@prisma/debug": "npm:5.22.0" - "@prisma/engines-version": "npm:5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2" - "@prisma/get-platform": "npm:5.22.0" - checksum: 10/512ce722e582a72429c90d438a63c730b230faa1235300215ab6cd1c5a0dfb2aa63704a66ee72c57222d9c094477ea198b1c154b9779dcab78ebf36e09f79161 +"@prisma/debug@npm:6.6.0": + version: 6.6.0 + resolution: "@prisma/debug@npm:6.6.0" + checksum: 10/55c9817a43aaa34eac8388b866a75a113dc2109b45bbb735a82ad2b74ee312d840df95058fed1225f48ba21aa8f0b2b441bbc9e50eaea0329ed5b614d71d54b5 languageName: node linkType: hard -"@prisma/get-platform@npm:5.22.0": - version: 5.22.0 - resolution: "@prisma/get-platform@npm:5.22.0" +"@prisma/engines-version@npm:6.6.0-53.f676762280b54cd07c770017ed3711ddde35f37a": + version: 6.6.0-53.f676762280b54cd07c770017ed3711ddde35f37a + resolution: "@prisma/engines-version@npm:6.6.0-53.f676762280b54cd07c770017ed3711ddde35f37a" + checksum: 10/4e14e15b463729db4bee268477c13e7d2e23d0de1e6756acb801cf8e0df99c250b4326d4512c8ef1b7727be4acc301041cd3477cf528b3f62fbc4c81367b9ff4 + languageName: node + linkType: hard + +"@prisma/engines@npm:6.6.0": + version: 6.6.0 + resolution: "@prisma/engines@npm:6.6.0" dependencies: - "@prisma/debug": "npm:5.22.0" - checksum: 10/15db9f38933a59a1b0f3a1d6284a50261803677516d6eedec2f7caaa1767c1c6e94e6465aca9239766b1cc363002476da21f7eeab55cc5329937d6d6d57a5f67 + "@prisma/debug": "npm:6.6.0" + "@prisma/engines-version": "npm:6.6.0-53.f676762280b54cd07c770017ed3711ddde35f37a" + "@prisma/fetch-engine": "npm:6.6.0" + "@prisma/get-platform": "npm:6.6.0" + checksum: 10/032b7b3ba7acc664a4022c5018a70aafc5f9ee416db548c27a255ff3871b72b58691dd98ccbc5ceae606c7a1f5bd8b13b1f4f6075fed5a0f07a04e48ac779dd2 + languageName: node + linkType: hard + +"@prisma/fetch-engine@npm:6.6.0": + version: 6.6.0 + resolution: "@prisma/fetch-engine@npm:6.6.0" + dependencies: + "@prisma/debug": "npm:6.6.0" + "@prisma/engines-version": "npm:6.6.0-53.f676762280b54cd07c770017ed3711ddde35f37a" + "@prisma/get-platform": "npm:6.6.0" + checksum: 10/d63b20ed7ad0e930882c5831c3d3984a26e858c1bc6c97d2443e8c64f1720d2ccc1233d69fb7c825632ec27b8513b17ce115eef70208114fa90b42c7499e1639 + languageName: node + linkType: hard + +"@prisma/get-platform@npm:6.6.0": + version: 6.6.0 + resolution: "@prisma/get-platform@npm:6.6.0" + dependencies: + "@prisma/debug": "npm:6.6.0" + checksum: 10/e4fd0975298251b80dcf2b71cc46274b6e9d0ac3a5288b70b6e3623057df8cc0cf55ceb5e68db3b2809535e77ba62125ab5345a359a6e5b4087b142aeeb4fc1d languageName: node linkType: hard @@ -10541,14 +10529,14 @@ __metadata: languageName: node linkType: hard -"@prisma/instrumentation@npm:^5.22.0": - version: 5.22.0 - resolution: "@prisma/instrumentation@npm:5.22.0" +"@prisma/instrumentation@npm:^6.6.0": + version: 6.6.0 + resolution: "@prisma/instrumentation@npm:6.6.0" dependencies: - "@opentelemetry/api": "npm:^1.8" - "@opentelemetry/instrumentation": "npm:^0.49 || ^0.50 || ^0.51 || ^0.52.0 || ^0.53.0" - "@opentelemetry/sdk-trace-base": "npm:^1.22" - checksum: 10/f48fc6b56e17538013033b5cab651d5d8df8bd0a0695ac3bc0d0cc6619a262a280ffe55aab0acade146928c6c2dfdf5532155a792818c5aea15efced67cc19c1 + "@opentelemetry/instrumentation": "npm:^0.52.0 || ^0.53.0 || ^0.54.0 || ^0.55.0 || ^0.56.0 || ^0.57.0" + peerDependencies: + "@opentelemetry/api": ^1.8 + checksum: 10/18480c9dfb2592aeae5b7d43449af7e88e47cf177d58d4ab147d01a90477f4abc91a900f345c22cf0c381171db94c20a2fa74f519cfa775dba060fd9a3eed220 languageName: node linkType: hard @@ -20380,7 +20368,7 @@ __metadata: languageName: node linkType: hard -"esbuild-register@npm:^3.5.0": +"esbuild-register@npm:3.6.0, esbuild-register@npm:^3.5.0": version: 3.6.0 resolution: "esbuild-register@npm:3.6.0" dependencies: @@ -20477,7 +20465,7 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0, esbuild@npm:^0.25.0, esbuild@npm:esbuild@>=0.17.6 <0.26.0, esbuild@npm:~0.25.0": +"esbuild@npm:>=0.12 <1, esbuild@npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0, esbuild@npm:^0.25.0, esbuild@npm:esbuild@>=0.17.6 <0.26.0, esbuild@npm:~0.25.0": version: 0.25.2 resolution: "esbuild@npm:0.25.2" dependencies: @@ -29029,18 +29017,24 @@ __metadata: languageName: node linkType: hard -"prisma@npm:^5.22.0": - version: 5.22.0 - resolution: "prisma@npm:5.22.0" +"prisma@npm:^6.6.0": + version: 6.6.0 + resolution: "prisma@npm:6.6.0" dependencies: - "@prisma/engines": "npm:5.22.0" + "@prisma/config": "npm:6.6.0" + "@prisma/engines": "npm:6.6.0" fsevents: "npm:2.3.3" + peerDependencies: + typescript: ">=5.1.0" dependenciesMeta: fsevents: optional: true + peerDependenciesMeta: + typescript: + optional: true bin: prisma: build/index.js - checksum: 10/7d7a47491b6b5fb6fe23358af4ab36c1b85e837bf439c6994cfb20e98627dd15e7bc9e1be40f9620170fc587e6d0b5c6b871f44e5a380b15b7b684eb89e21037 + checksum: 10/a0df0eb4595e02cfd20fe5c9cecc5a4e6cae7c850c3adf94afc499314ab2a02e9aab7fdeb8fc0fc5cd5953b3d54d29e0aa3f1c5be07e54f3c9870c26b43c0218 languageName: node linkType: hard