tfrere HF Staff commited on
Commit
b4ed27f
·
1 Parent(s): d9fd132

fix: replace y-websocket with @hocuspocus /provider for protocol compatibility

Browse files

The frontend was using y-websocket's WebsocketProvider while the backend
uses @hocuspocus /server v3, causing ERR_ENCODING_INVALID_ENCODED_DATA
errors on every WebSocket message and resulting in an empty Y.Doc
server-side (blank published articles).

Switch to @hocuspocus /provider which speaks the native Hocuspocus
protocol and sends the auth token through the WebSocket connection.

Made-with: Cursor

frontend/package-lock.json CHANGED
@@ -12,6 +12,7 @@
12
  "@emotion/react": "^11.14.0",
13
  "@emotion/styled": "^11.14.1",
14
  "@floating-ui/dom": "^1.7.6",
 
15
  "@mui/icons-material": "^9.0.0",
16
  "@mui/material": "^9.0.0",
17
  "@tiptap/core": "^3.22.3",
@@ -38,7 +39,6 @@
38
  "react": "^18.3.0",
39
  "react-dom": "^18.3.0",
40
  "tippy.js": "^6.3.7",
41
- "y-websocket": "^2.0.0",
42
  "yjs": "^13.6.0",
43
  "zod": "^4.3.6"
44
  },
@@ -1018,6 +1018,52 @@
1018
  "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==",
1019
  "license": "MIT"
1020
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1021
  "node_modules/@jridgewell/gen-mapping": {
1022
  "version": "0.3.13",
1023
  "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
@@ -1064,6 +1110,12 @@
1064
  "@jridgewell/sourcemap-codec": "^1.4.14"
1065
  }
1066
  },
 
 
 
 
 
 
1067
  "node_modules/@mui/core-downloads-tracker": {
1068
  "version": "9.0.0",
1069
  "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-9.0.0.tgz",
@@ -2461,24 +2513,6 @@
2461
  "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
2462
  }
2463
  },
2464
- "node_modules/abstract-leveldown": {
2465
- "version": "6.2.3",
2466
- "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz",
2467
- "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==",
2468
- "deprecated": "Superseded by abstract-level (https://github.com/Level/community#faq)",
2469
- "license": "MIT",
2470
- "optional": true,
2471
- "dependencies": {
2472
- "buffer": "^5.5.0",
2473
- "immediate": "^3.2.3",
2474
- "level-concat-iterator": "~2.0.0",
2475
- "level-supports": "~1.0.0",
2476
- "xtend": "~4.0.0"
2477
- },
2478
- "engines": {
2479
- "node": ">=6"
2480
- }
2481
- },
2482
  "node_modules/ai": {
2483
  "version": "6.0.158",
2484
  "resolved": "https://registry.npmjs.org/ai/-/ai-6.0.158.tgz",
@@ -2503,13 +2537,6 @@
2503
  "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
2504
  "license": "Python-2.0"
2505
  },
2506
- "node_modules/async-limiter": {
2507
- "version": "1.0.1",
2508
- "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
2509
- "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==",
2510
- "license": "MIT",
2511
- "optional": true
2512
- },
2513
  "node_modules/babel-plugin-macros": {
2514
  "version": "3.1.0",
2515
  "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
@@ -2525,27 +2552,6 @@
2525
  "npm": ">=6"
2526
  }
2527
  },
2528
- "node_modules/base64-js": {
2529
- "version": "1.5.1",
2530
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
2531
- "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
2532
- "funding": [
2533
- {
2534
- "type": "github",
2535
- "url": "https://github.com/sponsors/feross"
2536
- },
2537
- {
2538
- "type": "patreon",
2539
- "url": "https://www.patreon.com/feross"
2540
- },
2541
- {
2542
- "type": "consulting",
2543
- "url": "https://feross.org/support"
2544
- }
2545
- ],
2546
- "license": "MIT",
2547
- "optional": true
2548
- },
2549
  "node_modules/baseline-browser-mapping": {
2550
  "version": "2.10.18",
2551
  "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.18.tgz",
@@ -2594,31 +2600,6 @@
2594
  "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
2595
  }
2596
  },
2597
- "node_modules/buffer": {
2598
- "version": "5.7.1",
2599
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
2600
- "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
2601
- "funding": [
2602
- {
2603
- "type": "github",
2604
- "url": "https://github.com/sponsors/feross"
2605
- },
2606
- {
2607
- "type": "patreon",
2608
- "url": "https://www.patreon.com/feross"
2609
- },
2610
- {
2611
- "type": "consulting",
2612
- "url": "https://feross.org/support"
2613
- }
2614
- ],
2615
- "license": "MIT",
2616
- "optional": true,
2617
- "dependencies": {
2618
- "base64-js": "^1.3.1",
2619
- "ieee754": "^1.1.13"
2620
- }
2621
- },
2622
  "node_modules/callsites": {
2623
  "version": "3.1.0",
2624
  "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
@@ -2727,21 +2708,6 @@
2727
  }
2728
  }
2729
  },
2730
- "node_modules/deferred-leveldown": {
2731
- "version": "5.3.0",
2732
- "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz",
2733
- "integrity": "sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==",
2734
- "deprecated": "Superseded by abstract-level (https://github.com/Level/community#faq)",
2735
- "license": "MIT",
2736
- "optional": true,
2737
- "dependencies": {
2738
- "abstract-leveldown": "~6.2.1",
2739
- "inherits": "^2.0.3"
2740
- },
2741
- "engines": {
2742
- "node": ">=6"
2743
- }
2744
- },
2745
  "node_modules/dequal": {
2746
  "version": "2.0.3",
2747
  "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
@@ -2781,23 +2747,6 @@
2781
  "dev": true,
2782
  "license": "ISC"
2783
  },
2784
- "node_modules/encoding-down": {
2785
- "version": "6.3.0",
2786
- "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-6.3.0.tgz",
2787
- "integrity": "sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==",
2788
- "deprecated": "Superseded by abstract-level (https://github.com/Level/community#faq)",
2789
- "license": "MIT",
2790
- "optional": true,
2791
- "dependencies": {
2792
- "abstract-leveldown": "^6.2.1",
2793
- "inherits": "^2.0.3",
2794
- "level-codec": "^9.0.0",
2795
- "level-errors": "^2.0.0"
2796
- },
2797
- "engines": {
2798
- "node": ">=6"
2799
- }
2800
- },
2801
  "node_modules/entities": {
2802
  "version": "4.5.0",
2803
  "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
@@ -2810,19 +2759,6 @@
2810
  "url": "https://github.com/fb55/entities?sponsor=1"
2811
  }
2812
  },
2813
- "node_modules/errno": {
2814
- "version": "0.1.8",
2815
- "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
2816
- "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
2817
- "license": "MIT",
2818
- "optional": true,
2819
- "dependencies": {
2820
- "prr": "~1.0.1"
2821
- },
2822
- "bin": {
2823
- "errno": "cli.js"
2824
- }
2825
- },
2826
  "node_modules/error-ex": {
2827
  "version": "1.3.4",
2828
  "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz",
@@ -3018,34 +2954,6 @@
3018
  "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
3019
  "license": "MIT"
3020
  },
3021
- "node_modules/ieee754": {
3022
- "version": "1.2.1",
3023
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
3024
- "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
3025
- "funding": [
3026
- {
3027
- "type": "github",
3028
- "url": "https://github.com/sponsors/feross"
3029
- },
3030
- {
3031
- "type": "patreon",
3032
- "url": "https://www.patreon.com/feross"
3033
- },
3034
- {
3035
- "type": "consulting",
3036
- "url": "https://feross.org/support"
3037
- }
3038
- ],
3039
- "license": "BSD-3-Clause",
3040
- "optional": true
3041
- },
3042
- "node_modules/immediate": {
3043
- "version": "3.3.0",
3044
- "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz",
3045
- "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==",
3046
- "license": "MIT",
3047
- "optional": true
3048
- },
3049
  "node_modules/import-fresh": {
3050
  "version": "3.3.1",
3051
  "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
@@ -3062,13 +2970,6 @@
3062
  "url": "https://github.com/sponsors/sindresorhus"
3063
  }
3064
  },
3065
- "node_modules/inherits": {
3066
- "version": "2.0.4",
3067
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
3068
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
3069
- "license": "ISC",
3070
- "optional": true
3071
- },
3072
  "node_modules/is-arrayish": {
3073
  "version": "0.2.1",
3074
  "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
@@ -3160,156 +3061,6 @@
3160
  "katex": "cli.js"
3161
  }
3162
  },
3163
- "node_modules/level": {
3164
- "version": "6.0.1",
3165
- "resolved": "https://registry.npmjs.org/level/-/level-6.0.1.tgz",
3166
- "integrity": "sha512-psRSqJZCsC/irNhfHzrVZbmPYXDcEYhA5TVNwr+V92jF44rbf86hqGp8fiT702FyiArScYIlPSBTDUASCVNSpw==",
3167
- "license": "MIT",
3168
- "optional": true,
3169
- "dependencies": {
3170
- "level-js": "^5.0.0",
3171
- "level-packager": "^5.1.0",
3172
- "leveldown": "^5.4.0"
3173
- },
3174
- "engines": {
3175
- "node": ">=8.6.0"
3176
- },
3177
- "funding": {
3178
- "type": "opencollective",
3179
- "url": "https://opencollective.com/level"
3180
- }
3181
- },
3182
- "node_modules/level-codec": {
3183
- "version": "9.0.2",
3184
- "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz",
3185
- "integrity": "sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==",
3186
- "deprecated": "Superseded by level-transcoder (https://github.com/Level/community#faq)",
3187
- "license": "MIT",
3188
- "optional": true,
3189
- "dependencies": {
3190
- "buffer": "^5.6.0"
3191
- },
3192
- "engines": {
3193
- "node": ">=6"
3194
- }
3195
- },
3196
- "node_modules/level-concat-iterator": {
3197
- "version": "2.0.1",
3198
- "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz",
3199
- "integrity": "sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==",
3200
- "deprecated": "Superseded by abstract-level (https://github.com/Level/community#faq)",
3201
- "license": "MIT",
3202
- "optional": true,
3203
- "engines": {
3204
- "node": ">=6"
3205
- }
3206
- },
3207
- "node_modules/level-errors": {
3208
- "version": "2.0.1",
3209
- "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz",
3210
- "integrity": "sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==",
3211
- "deprecated": "Superseded by abstract-level (https://github.com/Level/community#faq)",
3212
- "license": "MIT",
3213
- "optional": true,
3214
- "dependencies": {
3215
- "errno": "~0.1.1"
3216
- },
3217
- "engines": {
3218
- "node": ">=6"
3219
- }
3220
- },
3221
- "node_modules/level-iterator-stream": {
3222
- "version": "4.0.2",
3223
- "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz",
3224
- "integrity": "sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==",
3225
- "license": "MIT",
3226
- "optional": true,
3227
- "dependencies": {
3228
- "inherits": "^2.0.4",
3229
- "readable-stream": "^3.4.0",
3230
- "xtend": "^4.0.2"
3231
- },
3232
- "engines": {
3233
- "node": ">=6"
3234
- }
3235
- },
3236
- "node_modules/level-js": {
3237
- "version": "5.0.2",
3238
- "resolved": "https://registry.npmjs.org/level-js/-/level-js-5.0.2.tgz",
3239
- "integrity": "sha512-SnBIDo2pdO5VXh02ZmtAyPP6/+6YTJg2ibLtl9C34pWvmtMEmRTWpra+qO/hifkUtBTOtfx6S9vLDjBsBK4gRg==",
3240
- "deprecated": "Superseded by browser-level (https://github.com/Level/community#faq)",
3241
- "license": "MIT",
3242
- "optional": true,
3243
- "dependencies": {
3244
- "abstract-leveldown": "~6.2.3",
3245
- "buffer": "^5.5.0",
3246
- "inherits": "^2.0.3",
3247
- "ltgt": "^2.1.2"
3248
- }
3249
- },
3250
- "node_modules/level-packager": {
3251
- "version": "5.1.1",
3252
- "resolved": "https://registry.npmjs.org/level-packager/-/level-packager-5.1.1.tgz",
3253
- "integrity": "sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==",
3254
- "deprecated": "Superseded by abstract-level (https://github.com/Level/community#faq)",
3255
- "license": "MIT",
3256
- "optional": true,
3257
- "dependencies": {
3258
- "encoding-down": "^6.3.0",
3259
- "levelup": "^4.3.2"
3260
- },
3261
- "engines": {
3262
- "node": ">=6"
3263
- }
3264
- },
3265
- "node_modules/level-supports": {
3266
- "version": "1.0.1",
3267
- "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz",
3268
- "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==",
3269
- "license": "MIT",
3270
- "optional": true,
3271
- "dependencies": {
3272
- "xtend": "^4.0.2"
3273
- },
3274
- "engines": {
3275
- "node": ">=6"
3276
- }
3277
- },
3278
- "node_modules/leveldown": {
3279
- "version": "5.6.0",
3280
- "resolved": "https://registry.npmjs.org/leveldown/-/leveldown-5.6.0.tgz",
3281
- "integrity": "sha512-iB8O/7Db9lPaITU1aA2txU/cBEXAt4vWwKQRrrWuS6XDgbP4QZGj9BL2aNbwb002atoQ/lIotJkfyzz+ygQnUQ==",
3282
- "deprecated": "Superseded by classic-level (https://github.com/Level/community#faq)",
3283
- "hasInstallScript": true,
3284
- "license": "MIT",
3285
- "optional": true,
3286
- "dependencies": {
3287
- "abstract-leveldown": "~6.2.1",
3288
- "napi-macros": "~2.0.0",
3289
- "node-gyp-build": "~4.1.0"
3290
- },
3291
- "engines": {
3292
- "node": ">=8.6.0"
3293
- }
3294
- },
3295
- "node_modules/levelup": {
3296
- "version": "4.4.0",
3297
- "resolved": "https://registry.npmjs.org/levelup/-/levelup-4.4.0.tgz",
3298
- "integrity": "sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==",
3299
- "deprecated": "Superseded by abstract-level (https://github.com/Level/community#faq)",
3300
- "license": "MIT",
3301
- "optional": true,
3302
- "dependencies": {
3303
- "deferred-leveldown": "~5.3.0",
3304
- "level-errors": "~2.0.0",
3305
- "level-iterator-stream": "~4.0.0",
3306
- "level-supports": "~1.0.0",
3307
- "xtend": "~4.0.0"
3308
- },
3309
- "engines": {
3310
- "node": ">=6"
3311
- }
3312
- },
3313
  "node_modules/lib0": {
3314
  "version": "0.2.117",
3315
  "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.117.tgz",
@@ -3352,12 +3103,6 @@
3352
  "integrity": "sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA==",
3353
  "license": "MIT"
3354
  },
3355
- "node_modules/lodash.debounce": {
3356
- "version": "4.0.8",
3357
- "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
3358
- "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
3359
- "license": "MIT"
3360
- },
3361
  "node_modules/loose-envify": {
3362
  "version": "1.4.0",
3363
  "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
@@ -3396,13 +3141,6 @@
3396
  "yallist": "^3.0.2"
3397
  }
3398
  },
3399
- "node_modules/ltgt": {
3400
- "version": "2.2.1",
3401
- "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz",
3402
- "integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==",
3403
- "license": "MIT",
3404
- "optional": true
3405
- },
3406
  "node_modules/markdown-it": {
3407
  "version": "14.1.1",
3408
  "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz",
@@ -3451,25 +3189,6 @@
3451
  "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
3452
  }
3453
  },
3454
- "node_modules/napi-macros": {
3455
- "version": "2.0.0",
3456
- "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz",
3457
- "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==",
3458
- "license": "MIT",
3459
- "optional": true
3460
- },
3461
- "node_modules/node-gyp-build": {
3462
- "version": "4.1.1",
3463
- "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.1.1.tgz",
3464
- "integrity": "sha512-dSq1xmcPDKPZ2EED2S6zw/b9NKsqzXRE6dVr8TVQnI3FJOTteUMuqF3Qqs6LZg+mLGYJWqQzMbIjMtJqTv87nQ==",
3465
- "license": "MIT",
3466
- "optional": true,
3467
- "bin": {
3468
- "node-gyp-build": "bin.js",
3469
- "node-gyp-build-optional": "optional.js",
3470
- "node-gyp-build-test": "build-test.js"
3471
- }
3472
- },
3473
  "node_modules/node-releases": {
3474
  "version": "2.0.37",
3475
  "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.37.tgz",
@@ -3801,13 +3520,6 @@
3801
  "prosemirror-transform": "^1.1.0"
3802
  }
3803
  },
3804
- "node_modules/prr": {
3805
- "version": "1.0.1",
3806
- "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
3807
- "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
3808
- "license": "MIT",
3809
- "optional": true
3810
- },
3811
  "node_modules/punycode.js": {
3812
  "version": "2.3.1",
3813
  "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz",
@@ -3876,21 +3588,6 @@
3876
  "react-dom": ">=16.6.0"
3877
  }
3878
  },
3879
- "node_modules/readable-stream": {
3880
- "version": "3.6.2",
3881
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
3882
- "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
3883
- "license": "MIT",
3884
- "optional": true,
3885
- "dependencies": {
3886
- "inherits": "^2.0.3",
3887
- "string_decoder": "^1.1.1",
3888
- "util-deprecate": "^1.0.1"
3889
- },
3890
- "engines": {
3891
- "node": ">= 6"
3892
- }
3893
- },
3894
  "node_modules/resolve": {
3895
  "version": "1.22.12",
3896
  "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz",
@@ -3972,27 +3669,6 @@
3972
  "integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==",
3973
  "license": "MIT"
3974
  },
3975
- "node_modules/safe-buffer": {
3976
- "version": "5.2.1",
3977
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
3978
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
3979
- "funding": [
3980
- {
3981
- "type": "github",
3982
- "url": "https://github.com/sponsors/feross"
3983
- },
3984
- {
3985
- "type": "patreon",
3986
- "url": "https://www.patreon.com/feross"
3987
- },
3988
- {
3989
- "type": "consulting",
3990
- "url": "https://feross.org/support"
3991
- }
3992
- ],
3993
- "license": "MIT",
3994
- "optional": true
3995
- },
3996
  "node_modules/scheduler": {
3997
  "version": "0.23.2",
3998
  "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
@@ -4031,16 +3707,6 @@
4031
  "node": ">=0.10.0"
4032
  }
4033
  },
4034
- "node_modules/string_decoder": {
4035
- "version": "1.3.0",
4036
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
4037
- "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
4038
- "license": "MIT",
4039
- "optional": true,
4040
- "dependencies": {
4041
- "safe-buffer": "~5.2.0"
4042
- }
4043
- },
4044
  "node_modules/stylis": {
4045
  "version": "4.2.0",
4046
  "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz",
@@ -4156,13 +3822,6 @@
4156
  "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
4157
  }
4158
  },
4159
- "node_modules/util-deprecate": {
4160
- "version": "1.0.2",
4161
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
4162
- "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
4163
- "license": "MIT",
4164
- "optional": true
4165
- },
4166
  "node_modules/vite": {
4167
  "version": "6.4.2",
4168
  "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.2.tgz",
@@ -4245,44 +3904,6 @@
4245
  "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==",
4246
  "license": "MIT"
4247
  },
4248
- "node_modules/ws": {
4249
- "version": "6.2.3",
4250
- "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz",
4251
- "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==",
4252
- "license": "MIT",
4253
- "optional": true,
4254
- "dependencies": {
4255
- "async-limiter": "~1.0.0"
4256
- }
4257
- },
4258
- "node_modules/xtend": {
4259
- "version": "4.0.2",
4260
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
4261
- "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
4262
- "license": "MIT",
4263
- "optional": true,
4264
- "engines": {
4265
- "node": ">=0.4"
4266
- }
4267
- },
4268
- "node_modules/y-leveldb": {
4269
- "version": "0.1.2",
4270
- "resolved": "https://registry.npmjs.org/y-leveldb/-/y-leveldb-0.1.2.tgz",
4271
- "integrity": "sha512-6ulEn5AXfXJYi89rXPEg2mMHAyyw8+ZfeMMdOtBbV8FJpQ1NOrcgi6DTAcXof0dap84NjHPT2+9d0rb6cFsjEg==",
4272
- "license": "MIT",
4273
- "optional": true,
4274
- "dependencies": {
4275
- "level": "^6.0.1",
4276
- "lib0": "^0.2.31"
4277
- },
4278
- "funding": {
4279
- "type": "GitHub Sponsors ❤",
4280
- "url": "https://github.com/sponsors/dmonad"
4281
- },
4282
- "peerDependencies": {
4283
- "yjs": "^13.0.0"
4284
- }
4285
- },
4286
  "node_modules/y-protocols": {
4287
  "version": "1.0.7",
4288
  "resolved": "https://registry.npmjs.org/y-protocols/-/y-protocols-1.0.7.tgz",
@@ -4304,36 +3925,6 @@
4304
  "yjs": "^13.0.0"
4305
  }
4306
  },
4307
- "node_modules/y-websocket": {
4308
- "version": "2.1.0",
4309
- "resolved": "https://registry.npmjs.org/y-websocket/-/y-websocket-2.1.0.tgz",
4310
- "integrity": "sha512-WHYDRqomaGkkaujtowCDwL8KYk+t1zQCGIgKyvxvchhjTQlMgWXRHJK+FDEcWmHA7I7o/4fy0eniOrtmz0e4mA==",
4311
- "license": "MIT",
4312
- "dependencies": {
4313
- "lib0": "^0.2.52",
4314
- "lodash.debounce": "^4.0.8",
4315
- "y-protocols": "^1.0.5"
4316
- },
4317
- "bin": {
4318
- "y-websocket": "bin/server.cjs",
4319
- "y-websocket-server": "bin/server.cjs"
4320
- },
4321
- "engines": {
4322
- "node": ">=16.0.0",
4323
- "npm": ">=8.0.0"
4324
- },
4325
- "funding": {
4326
- "type": "GitHub Sponsors ❤",
4327
- "url": "https://github.com/sponsors/dmonad"
4328
- },
4329
- "optionalDependencies": {
4330
- "ws": "^6.2.1",
4331
- "y-leveldb": "^0.1.0"
4332
- },
4333
- "peerDependencies": {
4334
- "yjs": "^13.5.6"
4335
- }
4336
- },
4337
  "node_modules/yallist": {
4338
  "version": "3.1.1",
4339
  "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
 
12
  "@emotion/react": "^11.14.0",
13
  "@emotion/styled": "^11.14.1",
14
  "@floating-ui/dom": "^1.7.6",
15
+ "@hocuspocus/provider": "^3.4.4",
16
  "@mui/icons-material": "^9.0.0",
17
  "@mui/material": "^9.0.0",
18
  "@tiptap/core": "^3.22.3",
 
39
  "react": "^18.3.0",
40
  "react-dom": "^18.3.0",
41
  "tippy.js": "^6.3.7",
 
42
  "yjs": "^13.6.0",
43
  "zod": "^4.3.6"
44
  },
 
1018
  "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==",
1019
  "license": "MIT"
1020
  },
1021
+ "node_modules/@hocuspocus/common": {
1022
+ "version": "3.4.4",
1023
+ "resolved": "https://registry.npmjs.org/@hocuspocus/common/-/common-3.4.4.tgz",
1024
+ "integrity": "sha512-RykIJ0tsHHMP4Xk+4UCbc7SO5LgGxGUSTdbh6anJEsaALAyqinf1Nn5HYuMjLPolAmsar1v++m9zufR09NLpXA==",
1025
+ "license": "MIT",
1026
+ "dependencies": {
1027
+ "lib0": "^0.2.87"
1028
+ }
1029
+ },
1030
+ "node_modules/@hocuspocus/provider": {
1031
+ "version": "3.4.4",
1032
+ "resolved": "https://registry.npmjs.org/@hocuspocus/provider/-/provider-3.4.4.tgz",
1033
+ "integrity": "sha512-KbsMAfdYcIJD8eMU/5QnpXcSOvIWAcCNI33FSRSaKCIpYBFtAwkYIwWnZJmPZ8a1BMAtqQc+uvy9+UQf7GHnGQ==",
1034
+ "license": "MIT",
1035
+ "dependencies": {
1036
+ "@hocuspocus/common": "^3.4.4",
1037
+ "@lifeomic/attempt": "^3.0.2",
1038
+ "lib0": "^0.2.87",
1039
+ "ws": "^8.17.1"
1040
+ },
1041
+ "peerDependencies": {
1042
+ "y-protocols": "^1.0.6",
1043
+ "yjs": "^13.6.8"
1044
+ }
1045
+ },
1046
+ "node_modules/@hocuspocus/provider/node_modules/ws": {
1047
+ "version": "8.20.0",
1048
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz",
1049
+ "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==",
1050
+ "license": "MIT",
1051
+ "engines": {
1052
+ "node": ">=10.0.0"
1053
+ },
1054
+ "peerDependencies": {
1055
+ "bufferutil": "^4.0.1",
1056
+ "utf-8-validate": ">=5.0.2"
1057
+ },
1058
+ "peerDependenciesMeta": {
1059
+ "bufferutil": {
1060
+ "optional": true
1061
+ },
1062
+ "utf-8-validate": {
1063
+ "optional": true
1064
+ }
1065
+ }
1066
+ },
1067
  "node_modules/@jridgewell/gen-mapping": {
1068
  "version": "0.3.13",
1069
  "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
 
1110
  "@jridgewell/sourcemap-codec": "^1.4.14"
1111
  }
1112
  },
1113
+ "node_modules/@lifeomic/attempt": {
1114
+ "version": "3.1.0",
1115
+ "resolved": "https://registry.npmjs.org/@lifeomic/attempt/-/attempt-3.1.0.tgz",
1116
+ "integrity": "sha512-QZqem4QuAnAyzfz+Gj5/+SLxqwCAw2qmt7732ZXodr6VDWGeYLG6w1i/vYLa55JQM9wRuBKLmXmiZ2P0LtE5rw==",
1117
+ "license": "MIT"
1118
+ },
1119
  "node_modules/@mui/core-downloads-tracker": {
1120
  "version": "9.0.0",
1121
  "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-9.0.0.tgz",
 
2513
  "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
2514
  }
2515
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2516
  "node_modules/ai": {
2517
  "version": "6.0.158",
2518
  "resolved": "https://registry.npmjs.org/ai/-/ai-6.0.158.tgz",
 
2537
  "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
2538
  "license": "Python-2.0"
2539
  },
 
 
 
 
 
 
 
2540
  "node_modules/babel-plugin-macros": {
2541
  "version": "3.1.0",
2542
  "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
 
2552
  "npm": ">=6"
2553
  }
2554
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2555
  "node_modules/baseline-browser-mapping": {
2556
  "version": "2.10.18",
2557
  "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.18.tgz",
 
2600
  "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
2601
  }
2602
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2603
  "node_modules/callsites": {
2604
  "version": "3.1.0",
2605
  "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
 
2708
  }
2709
  }
2710
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2711
  "node_modules/dequal": {
2712
  "version": "2.0.3",
2713
  "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
 
2747
  "dev": true,
2748
  "license": "ISC"
2749
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2750
  "node_modules/entities": {
2751
  "version": "4.5.0",
2752
  "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
 
2759
  "url": "https://github.com/fb55/entities?sponsor=1"
2760
  }
2761
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
2762
  "node_modules/error-ex": {
2763
  "version": "1.3.4",
2764
  "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz",
 
2954
  "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
2955
  "license": "MIT"
2956
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2957
  "node_modules/import-fresh": {
2958
  "version": "3.3.1",
2959
  "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
 
2970
  "url": "https://github.com/sponsors/sindresorhus"
2971
  }
2972
  },
 
 
 
 
 
 
 
2973
  "node_modules/is-arrayish": {
2974
  "version": "0.2.1",
2975
  "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
 
3061
  "katex": "cli.js"
3062
  }
3063
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3064
  "node_modules/lib0": {
3065
  "version": "0.2.117",
3066
  "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.117.tgz",
 
3103
  "integrity": "sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA==",
3104
  "license": "MIT"
3105
  },
 
 
 
 
 
 
3106
  "node_modules/loose-envify": {
3107
  "version": "1.4.0",
3108
  "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
 
3141
  "yallist": "^3.0.2"
3142
  }
3143
  },
 
 
 
 
 
 
 
3144
  "node_modules/markdown-it": {
3145
  "version": "14.1.1",
3146
  "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz",
 
3189
  "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
3190
  }
3191
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3192
  "node_modules/node-releases": {
3193
  "version": "2.0.37",
3194
  "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.37.tgz",
 
3520
  "prosemirror-transform": "^1.1.0"
3521
  }
3522
  },
 
 
 
 
 
 
 
3523
  "node_modules/punycode.js": {
3524
  "version": "2.3.1",
3525
  "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz",
 
3588
  "react-dom": ">=16.6.0"
3589
  }
3590
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3591
  "node_modules/resolve": {
3592
  "version": "1.22.12",
3593
  "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz",
 
3669
  "integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==",
3670
  "license": "MIT"
3671
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3672
  "node_modules/scheduler": {
3673
  "version": "0.23.2",
3674
  "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
 
3707
  "node": ">=0.10.0"
3708
  }
3709
  },
 
 
 
 
 
 
 
 
 
 
3710
  "node_modules/stylis": {
3711
  "version": "4.2.0",
3712
  "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz",
 
3822
  "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
3823
  }
3824
  },
 
 
 
 
 
 
 
3825
  "node_modules/vite": {
3826
  "version": "6.4.2",
3827
  "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.2.tgz",
 
3904
  "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==",
3905
  "license": "MIT"
3906
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3907
  "node_modules/y-protocols": {
3908
  "version": "1.0.7",
3909
  "resolved": "https://registry.npmjs.org/y-protocols/-/y-protocols-1.0.7.tgz",
 
3925
  "yjs": "^13.0.0"
3926
  }
3927
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3928
  "node_modules/yallist": {
3929
  "version": "3.1.1",
3930
  "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
frontend/package.json CHANGED
@@ -13,6 +13,7 @@
13
  "@emotion/react": "^11.14.0",
14
  "@emotion/styled": "^11.14.1",
15
  "@floating-ui/dom": "^1.7.6",
 
16
  "@mui/icons-material": "^9.0.0",
17
  "@mui/material": "^9.0.0",
18
  "@tiptap/core": "^3.22.3",
@@ -39,7 +40,6 @@
39
  "react": "^18.3.0",
40
  "react-dom": "^18.3.0",
41
  "tippy.js": "^6.3.7",
42
- "y-websocket": "^2.0.0",
43
  "yjs": "^13.6.0",
44
  "zod": "^4.3.6"
45
  },
 
13
  "@emotion/react": "^11.14.0",
14
  "@emotion/styled": "^11.14.1",
15
  "@floating-ui/dom": "^1.7.6",
16
+ "@hocuspocus/provider": "^3.4.4",
17
  "@mui/icons-material": "^9.0.0",
18
  "@mui/material": "^9.0.0",
19
  "@tiptap/core": "^3.22.3",
 
40
  "react": "^18.3.0",
41
  "react-dom": "^18.3.0",
42
  "tippy.js": "^6.3.7",
 
43
  "yjs": "^13.6.0",
44
  "zod": "^4.3.6"
45
  },
frontend/src/editor/Editor.tsx CHANGED
@@ -11,7 +11,7 @@ import "katex/dist/katex.min.css";
11
  import { all, createLowlight } from "lowlight";
12
  import * as Y from "yjs";
13
  import { UndoManager } from "yjs";
14
- import { WebsocketProvider } from "y-websocket";
15
  import { useEffect, useMemo, useRef, useState, MutableRefObject } from "react";
16
  import { BubbleToolbar } from "./BubbleToolbar";
17
  import { BlockHandle } from "./BlockHandle";
@@ -75,7 +75,15 @@ export function Editor({
75
  ? `wss://${window.location.host}/collab`
76
  : `ws://${window.location.host}/collab`;
77
 
78
- return new WebsocketProvider(wsUrl, docName, ydoc);
 
 
 
 
 
 
 
 
79
  }, [docName, ydoc]);
80
 
81
  const citationsMap = useMemo(() => ydoc.getMap("citations"), [ydoc]);
@@ -219,11 +227,9 @@ export function Editor({
219
  const timer = setTimeout(seed, 800);
220
 
221
  const onSync = () => setTimeout(seed, 100);
222
- provider.on("sync", onSync);
223
  provider.on("synced", onSync);
224
 
225
  return () => {
226
- provider.off("sync", onSync);
227
  provider.off("synced", onSync);
228
  clearTimeout(timer);
229
  };
 
11
  import { all, createLowlight } from "lowlight";
12
  import * as Y from "yjs";
13
  import { UndoManager } from "yjs";
14
+ import { HocuspocusProvider } from "@hocuspocus/provider";
15
  import { useEffect, useMemo, useRef, useState, MutableRefObject } from "react";
16
  import { BubbleToolbar } from "./BubbleToolbar";
17
  import { BlockHandle } from "./BlockHandle";
 
75
  ? `wss://${window.location.host}/collab`
76
  : `ws://${window.location.host}/collab`;
77
 
78
+ const tokenMatch = document.cookie.match(/(?:^|;\s*)hf_access_token=([^;]*)/);
79
+ const token = tokenMatch ? decodeURIComponent(tokenMatch[1]) : undefined;
80
+
81
+ return new HocuspocusProvider({
82
+ url: wsUrl,
83
+ name: docName,
84
+ document: ydoc,
85
+ token: token || "",
86
+ });
87
  }, [docName, ydoc]);
88
 
89
  const citationsMap = useMemo(() => ydoc.getMap("citations"), [ydoc]);
 
227
  const timer = setTimeout(seed, 800);
228
 
229
  const onSync = () => setTimeout(seed, 100);
 
230
  provider.on("synced", onSync);
231
 
232
  return () => {
 
233
  provider.off("synced", onSync);
234
  clearTimeout(timer);
235
  };