Seamlessly integrates a Hocuspocus backend with Laravel.
You can install the package via composer:
composer require ueberdosis/hocuspocus-laravelYou can publish and run the migrations with:
php artisan vendor:publish --provider="Hocuspocus\HocuspocusServiceProvider" --tag="hocuspocus-laravel-migrations"
php artisan migrateYou can publish the config file with:
php artisan vendor:publish --provider="Hocuspocus\HocuspocusServiceProvider" --tag="hocuspocus-laravel-config"Add the CanCollaborate trait to your user model:
use Illuminate\Foundation\Auth\User as Authenticatable;
use Hocuspocus\Traits\CanCollaborate;
class User extends Authenticatable {
use CanCollaborate;
}Add the Collaborative interface and IsCollaborative trait to your documents and configure the collaborativeAttributes:
use Illuminate\Database\Eloquent\Model;
use Hocuspocus\Contracts\Collaborative;
use Hocuspocus\Traits\IsCollaborative;
class TextDocument extends Model implements Collaborative {
use IsCollaborative;
protected array $collaborativeAttributes = [
'title', 'body',
];
}Add policies to your app that handle authorization for your models. The name of the policy method is configurable inside the hocuspocus-laravel.php config file. An example:
use App\Models\TextDocument;
use App\Models\User;
use Illuminate\Auth\Access\HandlesAuthorization;
class TextDocumentPolicy
{
use HandlesAuthorization;
public function update(User $user, TextDocument $document)
{
return true;
}
}In the frontend, add the collaborationAccessToken and collaborationDocumentName to your WebSocket provider:
<script>
window.collaborationAccessToken = '{{ optional(auth()->user())->getCollaborationAccessToken() }}';
window.collaborationDocumentName = '{{ $yourTextDocument->getCollaborationDocumentName() }}'
</script>import { HocuspocusProvider } from '@hocuspocus/provider'
import * as Y from 'yjs'
const provider = new HocuspocusProvider({
document: new Y.Doc(),
url: 'ws://localhost:1234',
name: window.collaborationDocumentName,
parameters: {
access_token: window.collaborationAccessToken,
},
})Configure a random secret key in your .env:
HOCUSPOCUS_SECRET="459824aaffa928e05f5b1caec411ae5f"Finally set up Hocuspocus with the webhook extension:
import { Server } from '@hocuspocus/server'
import { Webhook, Events } from '@hocuspocus/extension-webhook'
import { TiptapTransformer } from '@hocuspocus/transformer'
const server = Server.configure({
extensions: [
new Webhook({
// url to your application
url: 'https://example.com/api/documents',
// the same secret you configured earlier in your .env
secret: '459824aaffa928e05f5b1caec411ae5f',
transformer: TiptapTransformer,
}),
],
})
server.listen()The MIT License (MIT). Please see License File for more information.