diff --git a/extensions/op-blocknote-hocuspocus/package-lock.json b/extensions/op-blocknote-hocuspocus/package-lock.json index c62fcceda857..be585d0e6f5d 100644 --- a/extensions/op-blocknote-hocuspocus/package-lock.json +++ b/extensions/op-blocknote-hocuspocus/package-lock.json @@ -10,8 +10,8 @@ "license": "GPLv3", "dependencies": { "@blocknote/server-util": "^0.51.3", - "@hocuspocus/extension-logger": "^3.4.4", - "@hocuspocus/server": "^3.4.0", + "@hocuspocus/extension-logger": "^4.2.0", + "@hocuspocus/server": "^4.2.0", "op-blocknote-extensions": "https://github.com/opf/op-blocknote-extensions/releases/download/v0.1.4/op-blocknote-extensions-0.1.4.tgz", "tsx": "^4.21.0" }, @@ -971,35 +971,37 @@ } }, "node_modules/@hocuspocus/common": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/@hocuspocus/common/-/common-3.4.4.tgz", - "integrity": "sha512-RykIJ0tsHHMP4Xk+4UCbc7SO5LgGxGUSTdbh6anJEsaALAyqinf1Nn5HYuMjLPolAmsar1v++m9zufR09NLpXA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@hocuspocus/common/-/common-4.2.0.tgz", + "integrity": "sha512-031clELz+rW7MpmpFUFN7+vE52Gtk1wkrSVHyqydZgKSLf5AtrorliCf38cH65mGGltLR2/JrydzqOk2bVQhjw==", "license": "MIT", "dependencies": { "lib0": "^0.2.87" } }, "node_modules/@hocuspocus/extension-logger": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/@hocuspocus/extension-logger/-/extension-logger-3.4.4.tgz", - "integrity": "sha512-GEnjmvQlrDlr5hoTQ8NHStZkzpL42wkwZ5XOBMkEX/TgqcnEtKCK1SOK0xj+px9tEHaflDLtCq6f5oy4gOCkPQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@hocuspocus/extension-logger/-/extension-logger-4.2.0.tgz", + "integrity": "sha512-zLJJnl+5WR2wg5PSVPPdTrHOsV+7P8uZrF7Y1AnvOp48CAK+PjRJ5N/K07Rpbzx6GwWQKOUAcdnqeJ+n0a1jRw==", "license": "MIT", "dependencies": { - "@hocuspocus/server": "^3.4.4" + "@hocuspocus/server": "^4.2.0" } }, "node_modules/@hocuspocus/server": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/@hocuspocus/server/-/server-3.4.4.tgz", - "integrity": "sha512-UV+oaONAejOzeYgUygNcgsc8RdZvSokVvAxluZJIisLACpRO/VsseQ5lWKDRwLd7Fn6+rHWDH3hGuQ1fdX1Ycg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@hocuspocus/server/-/server-4.2.0.tgz", + "integrity": "sha512-D3OjjH/62G2M6FDfJMJDtAgV3VdUcq1V4MNLjuVaUpdhWkRy5OdzC6Zwo9hfFmtoolDzAy+WUK+xFPN/FljtYw==", "license": "MIT", "dependencies": { - "@hocuspocus/common": "^3.4.4", - "async-lock": "^1.3.1", + "@hocuspocus/common": "^4.2.0", "async-mutex": "^0.5.0", + "crossws": "^0.4.4", "kleur": "^4.1.4", - "lib0": "^0.2.47", - "ws": "^8.5.0" + "lib0": "^0.2.47" + }, + "engines": { + "node": ">=22" }, "peerDependencies": { "y-protocols": "^1.0.6", @@ -2428,12 +2430,6 @@ "node": ">=12" } }, - "node_modules/async-lock": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", - "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", - "license": "MIT" - }, "node_modules/async-mutex": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.5.0.tgz", @@ -2626,6 +2622,20 @@ "node": ">= 8" } }, + "node_modules/crossws": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.4.6.tgz", + "integrity": "sha512-/Wxe9Z007EbJ496j88nToZEvyPZ8PY/wjZJ18Agh/GCA9cYHyLbxtrpdFlFzAw3TV20F0SUYGl0g6PzChbwUrg==", + "license": "MIT", + "peerDependencies": { + "srvx": ">=0.11.5" + }, + "peerDependenciesMeta": { + "srvx": { + "optional": true + } + } + }, "node_modules/css-color-keywords": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", diff --git a/extensions/op-blocknote-hocuspocus/package.json b/extensions/op-blocknote-hocuspocus/package.json index 6b5a397e5ff2..80399d8a0bd7 100644 --- a/extensions/op-blocknote-hocuspocus/package.json +++ b/extensions/op-blocknote-hocuspocus/package.json @@ -24,8 +24,8 @@ }, "dependencies": { "@blocknote/server-util": "^0.51.3", - "@hocuspocus/extension-logger": "^3.4.4", - "@hocuspocus/server": "^3.4.0", + "@hocuspocus/extension-logger": "^4.2.0", + "@hocuspocus/server": "^4.2.0", "op-blocknote-extensions": "https://github.com/opf/op-blocknote-extensions/releases/download/v0.1.4/op-blocknote-extensions-0.1.4.tgz", "tsx": "^4.21.0" }, diff --git a/extensions/op-blocknote-hocuspocus/src/extensions/openProjectApi.ts b/extensions/op-blocknote-hocuspocus/src/extensions/openProjectApi.ts index 316773c1efb5..d3cab31b48fa 100644 --- a/extensions/op-blocknote-hocuspocus/src/extensions/openProjectApi.ts +++ b/extensions/op-blocknote-hocuspocus/src/extensions/openProjectApi.ts @@ -41,7 +41,7 @@ export class OpenProjectApi implements Extension { throw new Error('Unauthorized: Missing auth params'); } - const requestOrigin = data.request?.headers?.origin; + const requestOrigin = data.requestHeaders?.get("origin") ?? undefined; const result = await decryptAndValidateToken(token, resourceUrl, requestOrigin); const tokenExpiresAtDate = new Date(result.tokenExpiresAt); @@ -103,7 +103,7 @@ export class OpenProjectApi implements Extension { * Store data to the API. The data is a YDoc update */ async onStoreDocument(data: onStoreDocumentPayload): Promise { - const { resourceUrl, readonly } = data.context; + const { resourceUrl, readonly } = data.lastContext; if (!resourceUrl) { console.warn("Missing parameters in context. Skipping store."); @@ -124,7 +124,7 @@ export class OpenProjectApi implements Extension { const editorData = editor.yXmlFragmentToBlocks(tempFragment); const markdownData = await editor.blocksToMarkdownLossy(editorData); - const response = await fetchResource(resourceUrl, data.context.token, { + const response = await fetchResource(resourceUrl, data.lastContext.token, { method: "PATCH", body: JSON.stringify({ content_binary: base64Data, @@ -137,7 +137,7 @@ export class OpenProjectApi implements Extension { return; } - data.document.connections.forEach(({ connection }) => connection.sendStateless("storeEvent")); + data.document.broadcastStateless("storeEvent"); } /** diff --git a/extensions/op-blocknote-hocuspocus/test/extensions/openProjectApi.test.ts b/extensions/op-blocknote-hocuspocus/test/extensions/openProjectApi.test.ts index 91ddfca17151..1f5e2bd646d2 100644 --- a/extensions/op-blocknote-hocuspocus/test/extensions/openProjectApi.test.ts +++ b/extensions/op-blocknote-hocuspocus/test/extensions/openProjectApi.test.ts @@ -37,11 +37,9 @@ describe("OpenProjectApi", () => { new OpenProjectApi().onAuthenticate({ token: "Yjo1x80JGIjrK8J6IDOuRn5kIOGvaAUw8C1so+dJJq7cgkllf3dQnw6d8bgiKbHXw8ZaMYE4IyOI1KQgX2ZRmx1mKBkxtb/fc7eCpGyTKGTA2Y1r/q7VJYiJZlpX7gx3nu569joEl/k=--mUkLaPiK0E82vGT9--gj1ZnTNlydL9j+Xw8+YFAA==", documentName: "https://test.api/api/v3/documents/1", - request: { - headers: { - origin: "https://different.origin", - }, - }, + requestHeaders: new Headers({ + origin: "https://different.origin", + }), } as unknown as onAuthenticatePayload) ).rejects.toThrowError("Unauthorized: Token origin does not match request origin."); }); @@ -269,20 +267,22 @@ describe("OpenProjectApi", () => { // @ts-expect-error BlockNote types are complicated editor.blocksToYXmlFragment(blocks, fragment); + const broadcastStateless = vi.fn(); const data = { - context: { + lastContext: { token: "superValidToken", resourceUrl: "https://test.api/api/v3/documents/121", readonly: false, tokenExpiresAt: new Date(Date.now() + 5 * 60 * 1000), // 5 min from now }, - document: { ...document, connections: [] } as unknown as Document, - } as onStoreDocumentPayload; + document: { ...document, broadcastStateless } as unknown as Document, + } as unknown as onStoreDocumentPayload; const api = new OpenProjectApi(); await api.onStoreDocument(data); await expect(body).resolves.toContain("content_binary"); + expect(broadcastStateless).toHaveBeenCalledWith("storeEvent"); }); }); diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 0cacdd49d9e2..63650e6ddb9f 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -45,7 +45,7 @@ "@fullcalendar/resource-timeline": "^6.1.20", "@fullcalendar/timegrid": "^6.1.20", "@github/webauthn-json": "^2.1.1", - "@hocuspocus/provider": "^4.1.0", + "@hocuspocus/provider": "^4.2.0", "@hotwired/stimulus": "^3.2.2", "@hotwired/turbo": "^8.0.23", "@hotwired/turbo-rails": "^8.0.23", @@ -3539,12 +3539,12 @@ } }, "node_modules/@hocuspocus/provider": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@hocuspocus/provider/-/provider-4.1.0.tgz", - "integrity": "sha512-K80V2yX4AMdpqgjIkexJioyI2Oq8pu8hjdFqY0INXKSpH8TQv9NMaDzJmlrZMYmUeKyRO2t7VhGyFK9jZQPnNw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@hocuspocus/provider/-/provider-4.2.0.tgz", + "integrity": "sha512-w38vvgYBs4NDonMkxb4R//n+CgBJ+K/03RMXcr8yHx1I3TY8HYpTlRqOUWdIJpmgw2ZyuM9EdbJwwRPrZF7iEA==", "license": "MIT", "dependencies": { - "@hocuspocus/common": "^4.1.0", + "@hocuspocus/common": "^4.2.0", "@lifeomic/attempt": "^3.0.2", "lib0": "^0.2.87" }, diff --git a/frontend/package.json b/frontend/package.json index 7363e0ba5513..e78a9e89f414 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -91,7 +91,7 @@ "@fullcalendar/resource-timeline": "^6.1.20", "@fullcalendar/timegrid": "^6.1.20", "@github/webauthn-json": "^2.1.1", - "@hocuspocus/provider": "^4.1.0", + "@hocuspocus/provider": "^4.2.0", "@hotwired/stimulus": "^3.2.2", "@hotwired/turbo": "^8.0.23", "@hotwired/turbo-rails": "^8.0.23",