@hocuspocus/extension-s3 3.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +167 -0
- package/dist/hocuspocus-s3.cjs +129 -0
- package/dist/hocuspocus-s3.cjs.map +1 -0
- package/dist/hocuspocus-s3.esm.js +127 -0
- package/dist/hocuspocus-s3.esm.js.map +1 -0
- package/dist/node_modules/@tiptap/pm/model/index.d.ts +1 -0
- package/dist/node_modules/@tiptap/pm/state/index.d.ts +1 -0
- package/dist/node_modules/@tiptap/pm/transform/index.d.ts +1 -0
- package/dist/node_modules/@tiptap/pm/view/index.d.ts +1 -0
- package/dist/packages/common/src/CloseEvents.d.ts +29 -0
- package/dist/packages/common/src/auth.d.ts +6 -0
- package/dist/packages/common/src/awarenessStatesToArray.d.ts +3 -0
- package/dist/packages/common/src/index.d.ts +4 -0
- package/dist/packages/common/src/types.d.ts +10 -0
- package/dist/packages/extension-database/src/Database.d.ts +30 -0
- package/dist/packages/extension-database/src/index.d.ts +1 -0
- package/dist/packages/extension-logger/src/Logger.d.ts +67 -0
- package/dist/packages/extension-logger/src/index.d.ts +1 -0
- package/dist/packages/extension-redis/src/Redis.d.ts +129 -0
- package/dist/packages/extension-redis/src/index.d.ts +1 -0
- package/dist/packages/extension-s3/src/S3.d.ts +44 -0
- package/dist/packages/extension-s3/src/index.d.ts +1 -0
- package/dist/packages/extension-sqlite/src/SQLite.d.ts +27 -0
- package/dist/packages/extension-sqlite/src/index.d.ts +1 -0
- package/dist/packages/extension-throttle/src/index.d.ts +30 -0
- package/dist/packages/extension-webhook/src/index.d.ts +56 -0
- package/dist/packages/provider/src/EventEmitter.d.ts +9 -0
- package/dist/packages/provider/src/HocuspocusProvider.d.ts +115 -0
- package/dist/packages/provider/src/HocuspocusProviderWebsocket.d.ts +114 -0
- package/dist/packages/provider/src/IncomingMessage.d.ts +17 -0
- package/dist/packages/provider/src/MessageReceiver.d.ts +12 -0
- package/dist/packages/provider/src/MessageSender.d.ts +9 -0
- package/dist/packages/provider/src/OutgoingMessage.d.ts +9 -0
- package/dist/packages/provider/src/OutgoingMessages/AuthenticationMessage.d.ts +8 -0
- package/dist/packages/provider/src/OutgoingMessages/AwarenessMessage.d.ts +9 -0
- package/dist/packages/provider/src/OutgoingMessages/CloseMessage.d.ts +9 -0
- package/dist/packages/provider/src/OutgoingMessages/QueryAwarenessMessage.d.ts +9 -0
- package/dist/packages/provider/src/OutgoingMessages/StatelessMessage.d.ts +8 -0
- package/dist/packages/provider/src/OutgoingMessages/SyncStepOneMessage.d.ts +9 -0
- package/dist/packages/provider/src/OutgoingMessages/SyncStepTwoMessage.d.ts +9 -0
- package/dist/packages/provider/src/OutgoingMessages/UpdateMessage.d.ts +8 -0
- package/dist/packages/provider/src/index.d.ts +3 -0
- package/dist/packages/provider/src/types.d.ts +92 -0
- package/dist/packages/server/src/ClientConnection.d.ts +63 -0
- package/dist/packages/server/src/Connection.d.ts +62 -0
- package/dist/packages/server/src/DirectConnection.d.ts +14 -0
- package/dist/packages/server/src/Document.d.ts +89 -0
- package/dist/packages/server/src/Hocuspocus.d.ts +77 -0
- package/dist/packages/server/src/IncomingMessage.d.ts +25 -0
- package/dist/packages/server/src/MessageReceiver.d.ts +11 -0
- package/dist/packages/server/src/OutgoingMessage.d.ts +22 -0
- package/dist/packages/server/src/Server.d.ts +32 -0
- package/dist/packages/server/src/index.d.ts +9 -0
- package/dist/packages/server/src/types.d.ts +328 -0
- package/dist/packages/server/src/util/debounce.d.ts +5 -0
- package/dist/packages/server/src/util/getParameters.d.ts +6 -0
- package/dist/packages/transformer/src/Prosemirror.d.ts +11 -0
- package/dist/packages/transformer/src/Tiptap.d.ts +10 -0
- package/dist/packages/transformer/src/index.d.ts +3 -0
- package/dist/packages/transformer/src/types.d.ts +5 -0
- package/dist/playground/backend/src/default.d.ts +1 -0
- package/dist/playground/backend/src/deno.d.ts +1 -0
- package/dist/playground/backend/src/express.d.ts +1 -0
- package/dist/playground/backend/src/hono.d.ts +1 -0
- package/dist/playground/backend/src/koa.d.ts +1 -0
- package/dist/playground/backend/src/load-document.d.ts +1 -0
- package/dist/playground/backend/src/redis.d.ts +1 -0
- package/dist/playground/backend/src/s3-redis.d.ts +1 -0
- package/dist/playground/backend/src/s3.d.ts +1 -0
- package/dist/playground/backend/src/slow.d.ts +1 -0
- package/dist/playground/backend/src/tiptapcollab.d.ts +1 -0
- package/dist/playground/backend/src/webhook.d.ts +1 -0
- package/dist/playground/frontend/app/SocketContext1.d.ts +2 -0
- package/dist/playground/frontend/app/SocketContext2.d.ts +2 -0
- package/dist/playground/frontend/next.config.d.ts +3 -0
- package/dist/tests/extension-database/fetch.d.ts +1 -0
- package/dist/tests/extension-logger/onListen.d.ts +1 -0
- package/dist/tests/extension-redis/onAwarenessChange.d.ts +1 -0
- package/dist/tests/extension-redis/onChange.d.ts +1 -0
- package/dist/tests/extension-redis/onStateless.d.ts +1 -0
- package/dist/tests/extension-redis/onStoreDocument.d.ts +1 -0
- package/dist/tests/extension-s3/fetch.d.ts +1 -0
- package/dist/tests/extension-throttle/banning.d.ts +1 -0
- package/dist/tests/extension-throttle/configuration.d.ts +1 -0
- package/dist/tests/provider/hasUnsyncedChanges.d.ts +1 -0
- package/dist/tests/provider/observe.d.ts +1 -0
- package/dist/tests/provider/observeDeep.d.ts +1 -0
- package/dist/tests/provider/onAuthenticated.d.ts +1 -0
- package/dist/tests/provider/onAuthenticationFailed.d.ts +1 -0
- package/dist/tests/provider/onAwarenessChange.d.ts +1 -0
- package/dist/tests/provider/onAwarenessUpdate.d.ts +1 -0
- package/dist/tests/provider/onClose.d.ts +1 -0
- package/dist/tests/provider/onConnect.d.ts +1 -0
- package/dist/tests/provider/onDisconnect.d.ts +1 -0
- package/dist/tests/provider/onMessage.d.ts +1 -0
- package/dist/tests/provider/onOpen.d.ts +1 -0
- package/dist/tests/provider/onStateless.d.ts +1 -0
- package/dist/tests/provider/onSynced.d.ts +1 -0
- package/dist/tests/providerwebsocket/configuration.d.ts +1 -0
- package/dist/tests/server/address.d.ts +1 -0
- package/dist/tests/server/afterLoadDocument.d.ts +1 -0
- package/dist/tests/server/afterStoreDocument.d.ts +1 -0
- package/dist/tests/server/afterUnloadDocument.d.ts +1 -0
- package/dist/tests/server/beforeBroadcastStateless.d.ts +1 -0
- package/dist/tests/server/beforeHandleMessage.d.ts +1 -0
- package/dist/tests/server/beforeSync.d.ts +1 -0
- package/dist/tests/server/beforeUnloadDocument.d.ts +1 -0
- package/dist/tests/server/closeConnections.d.ts +1 -0
- package/dist/tests/server/getConnectionsCount.d.ts +1 -0
- package/dist/tests/server/getDocumentsCount.d.ts +1 -0
- package/dist/tests/server/listen.d.ts +1 -0
- package/dist/tests/server/onAuthenticate.d.ts +1 -0
- package/dist/tests/server/onAwarenessUpdate.d.ts +1 -0
- package/dist/tests/server/onChange.d.ts +1 -0
- package/dist/tests/server/onClose.d.ts +1 -0
- package/dist/tests/server/onConfigure.d.ts +1 -0
- package/dist/tests/server/onConnect.d.ts +1 -0
- package/dist/tests/server/onDestroy.d.ts +1 -0
- package/dist/tests/server/onDisconnect.d.ts +1 -0
- package/dist/tests/server/onListen.d.ts +1 -0
- package/dist/tests/server/onLoadDocument.d.ts +1 -0
- package/dist/tests/server/onRequest.d.ts +1 -0
- package/dist/tests/server/onStateless.d.ts +1 -0
- package/dist/tests/server/onStoreDocument.d.ts +1 -0
- package/dist/tests/server/onUpgrade.d.ts +1 -0
- package/dist/tests/server/openDirectConnection.d.ts +1 -0
- package/dist/tests/server/websocketError.d.ts +1 -0
- package/dist/tests/transformer/TiptapTransformer.d.ts +1 -0
- package/dist/tests/utils/createDirectory.d.ts +1 -0
- package/dist/tests/utils/flushRedis.d.ts +1 -0
- package/dist/tests/utils/index.d.ts +9 -0
- package/dist/tests/utils/newHocuspocus.d.ts +2 -0
- package/dist/tests/utils/newHocuspocusProvider.d.ts +3 -0
- package/dist/tests/utils/newHocuspocusProviderWebsocket.d.ts +4 -0
- package/dist/tests/utils/randomInteger.d.ts +1 -0
- package/dist/tests/utils/redisConnectionSettings.d.ts +4 -0
- package/dist/tests/utils/removeDirectory.d.ts +1 -0
- package/dist/tests/utils/retryableAssertion.d.ts +2 -0
- package/dist/tests/utils/sleep.d.ts +1 -0
- package/package.json +39 -0
- package/src/S3.ts +178 -0
- package/src/index.ts +1 -0
package/README.md
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# @hocuspocus/extension-s3
|
|
2
|
+
|
|
3
|
+
A S3-compatible persistence driver for Hocuspocus that stores Y.js documents in Amazon S3 or S3-compatible storage services like MinIO, DigitalOcean Spaces, etc.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @hocuspocus/extension-s3
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Quick Start
|
|
12
|
+
|
|
13
|
+
### Basic AWS S3 Configuration
|
|
14
|
+
|
|
15
|
+
```javascript
|
|
16
|
+
import { Server } from '@hocuspocus/server'
|
|
17
|
+
import { S3 } from '@hocuspocus/extension-s3'
|
|
18
|
+
|
|
19
|
+
const server = new Server({
|
|
20
|
+
extensions: [
|
|
21
|
+
new S3({
|
|
22
|
+
bucket: 'my-documents-bucket',
|
|
23
|
+
region: 'us-east-1',
|
|
24
|
+
credentials: {
|
|
25
|
+
accessKeyId: 'your-access-key',
|
|
26
|
+
secretAccessKey: 'your-secret-key'
|
|
27
|
+
}
|
|
28
|
+
}),
|
|
29
|
+
],
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
server.listen()
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### MinIO Configuration
|
|
36
|
+
|
|
37
|
+
For local development with MinIO, ensure you set `forcePathStyle: true`:
|
|
38
|
+
|
|
39
|
+
```javascript
|
|
40
|
+
const server = new Server({
|
|
41
|
+
extensions: [
|
|
42
|
+
new S3({
|
|
43
|
+
bucket: 'hocuspocus-documents',
|
|
44
|
+
endpoint: 'http://localhost:9000',
|
|
45
|
+
forcePathStyle: true,
|
|
46
|
+
credentials: {
|
|
47
|
+
accessKeyId: 'minioadmin',
|
|
48
|
+
secretAccessKey: 'minioadmin'
|
|
49
|
+
}
|
|
50
|
+
}),
|
|
51
|
+
],
|
|
52
|
+
})
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Configuration Options
|
|
56
|
+
|
|
57
|
+
- **bucket** (required): S3 bucket name where documents will be stored
|
|
58
|
+
- **region**: AWS region (default: 'us-east-1')
|
|
59
|
+
- **prefix**: Key prefix for documents (default: 'hocuspocus-documents/')
|
|
60
|
+
- **credentials**: AWS credentials object with accessKeyId and secretAccessKey
|
|
61
|
+
- **endpoint**: S3 endpoint URL (for S3-compatible services)
|
|
62
|
+
- **forcePathStyle**: Use path-style URLs (required for MinIO, default: false)
|
|
63
|
+
- **s3Client**: Custom S3Client instance
|
|
64
|
+
|
|
65
|
+
## Document Storage
|
|
66
|
+
|
|
67
|
+
Documents are stored as binary files in S3 with the naming convention:
|
|
68
|
+
`{prefix}{documentName}.bin`
|
|
69
|
+
|
|
70
|
+
## Scaling with Redis
|
|
71
|
+
|
|
72
|
+
For horizontal scaling, combine S3 with the Redis extension. Redis handles real-time synchronization while S3 provides persistent storage.
|
|
73
|
+
|
|
74
|
+
```javascript
|
|
75
|
+
import { Server } from '@hocuspocus/server'
|
|
76
|
+
import { Logger } from '@hocuspocus/extension-logger'
|
|
77
|
+
import { Redis } from '@hocuspocus/extension-redis'
|
|
78
|
+
import { S3 } from '@hocuspocus/extension-s3'
|
|
79
|
+
|
|
80
|
+
// Server 1
|
|
81
|
+
const server1 = new Server({
|
|
82
|
+
name: "server-1",
|
|
83
|
+
port: 8001,
|
|
84
|
+
extensions: [
|
|
85
|
+
new Logger(),
|
|
86
|
+
new Redis({
|
|
87
|
+
host: "127.0.0.1",
|
|
88
|
+
port: 6379,
|
|
89
|
+
}),
|
|
90
|
+
new S3({
|
|
91
|
+
bucket: 'hocuspocus-documents',
|
|
92
|
+
endpoint: 'http://localhost:9000', // MinIO
|
|
93
|
+
forcePathStyle: true,
|
|
94
|
+
credentials: {
|
|
95
|
+
accessKeyId: 'minioadmin',
|
|
96
|
+
secretAccessKey: 'minioadmin'
|
|
97
|
+
}
|
|
98
|
+
}),
|
|
99
|
+
],
|
|
100
|
+
})
|
|
101
|
+
|
|
102
|
+
// Server 2 - same configuration with different name/port
|
|
103
|
+
const server2 = new Server({
|
|
104
|
+
name: "server-2",
|
|
105
|
+
port: 8002,
|
|
106
|
+
extensions: [/* same extensions */],
|
|
107
|
+
})
|
|
108
|
+
|
|
109
|
+
server1.listen()
|
|
110
|
+
server2.listen()
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## CLI Usage
|
|
114
|
+
|
|
115
|
+
You can also use the S3 extension with the Hocuspocus CLI:
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
# Basic usage
|
|
119
|
+
hocuspocus --s3 --s3-bucket my-documents
|
|
120
|
+
|
|
121
|
+
# MinIO setup (forcePathStyle automatically enabled)
|
|
122
|
+
hocuspocus --s3 --s3-bucket hocuspocus-documents --s3-endpoint http://localhost:9000
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Development
|
|
126
|
+
|
|
127
|
+
### Quick Start
|
|
128
|
+
|
|
129
|
+
For local development with MinIO (S3-compatible storage):
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
# Set up development environment
|
|
133
|
+
npm run dev:setup
|
|
134
|
+
|
|
135
|
+
# Test S3 configuration
|
|
136
|
+
npm run dev:test-s3
|
|
137
|
+
|
|
138
|
+
# Run S3 playground examples
|
|
139
|
+
npm run playground:s3
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## Complete Documentation
|
|
143
|
+
|
|
144
|
+
For detailed documentation, examples, best practices, and troubleshooting, see:
|
|
145
|
+
[📚 S3 Extension Documentation](https://tiptap.dev/docs/hocuspocus/server/extensions/s3)
|
|
146
|
+
|
|
147
|
+
## IAM Permissions
|
|
148
|
+
|
|
149
|
+
Your AWS credentials or IAM role needs the following permissions:
|
|
150
|
+
|
|
151
|
+
```json
|
|
152
|
+
{
|
|
153
|
+
"Version": "2012-10-17",
|
|
154
|
+
"Statement": [
|
|
155
|
+
{
|
|
156
|
+
"Effect": "Allow",
|
|
157
|
+
"Action": ["s3:GetObject", "s3:PutObject", "s3:HeadObject"],
|
|
158
|
+
"Resource": "arn:aws:s3:::your-bucket-name/*"
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
"Effect": "Allow",
|
|
162
|
+
"Action": ["s3:HeadBucket"],
|
|
163
|
+
"Resource": "arn:aws:s3:::your-bucket-name"
|
|
164
|
+
}
|
|
165
|
+
]
|
|
166
|
+
}
|
|
167
|
+
```
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var extensionDatabase = require('@hocuspocus/extension-database');
|
|
4
|
+
var clientS3 = require('@aws-sdk/client-s3');
|
|
5
|
+
var kleur = require('kleur');
|
|
6
|
+
|
|
7
|
+
class S3 extends extensionDatabase.Database {
|
|
8
|
+
constructor(configuration) {
|
|
9
|
+
super({});
|
|
10
|
+
this.configuration = {
|
|
11
|
+
region: "us-east-1",
|
|
12
|
+
bucket: "",
|
|
13
|
+
prefix: "hocuspocus-documents/",
|
|
14
|
+
forcePathStyle: false,
|
|
15
|
+
fetch: async ({ documentName }) => {
|
|
16
|
+
var _a;
|
|
17
|
+
const key = this.getObjectKey(documentName);
|
|
18
|
+
try {
|
|
19
|
+
const command = new clientS3.GetObjectCommand({
|
|
20
|
+
Bucket: this.configuration.bucket,
|
|
21
|
+
Key: key,
|
|
22
|
+
});
|
|
23
|
+
const response = await this.s3Client.send(command);
|
|
24
|
+
if (response.Body) {
|
|
25
|
+
// Convert stream to Uint8Array
|
|
26
|
+
const chunks = [];
|
|
27
|
+
const reader = response.Body.transformToWebStream().getReader();
|
|
28
|
+
while (true) {
|
|
29
|
+
const { done, value } = await reader.read();
|
|
30
|
+
if (done)
|
|
31
|
+
break;
|
|
32
|
+
chunks.push(value);
|
|
33
|
+
}
|
|
34
|
+
// Combine all chunks into a single Uint8Array
|
|
35
|
+
const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);
|
|
36
|
+
const result = new Uint8Array(totalLength);
|
|
37
|
+
let offset = 0;
|
|
38
|
+
for (const chunk of chunks) {
|
|
39
|
+
result.set(chunk, offset);
|
|
40
|
+
offset += chunk.length;
|
|
41
|
+
}
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
if (error.name === 'NoSuchKey' || ((_a = error.$metadata) === null || _a === void 0 ? void 0 : _a.httpStatusCode) === 404) {
|
|
48
|
+
// Document doesn't exist yet, return null
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
throw error;
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
store: async ({ documentName, state }) => {
|
|
55
|
+
const key = this.getObjectKey(documentName);
|
|
56
|
+
const command = new clientS3.PutObjectCommand({
|
|
57
|
+
Bucket: this.configuration.bucket,
|
|
58
|
+
Key: key,
|
|
59
|
+
Body: state,
|
|
60
|
+
ContentType: "application/octet-stream",
|
|
61
|
+
});
|
|
62
|
+
await this.s3Client.send(command);
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
this.configuration = {
|
|
66
|
+
...this.configuration,
|
|
67
|
+
...configuration,
|
|
68
|
+
};
|
|
69
|
+
// Validate required configuration
|
|
70
|
+
if (!this.configuration.bucket) {
|
|
71
|
+
throw new Error("S3 bucket name is required");
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
getObjectKey(documentName) {
|
|
75
|
+
const prefix = this.configuration.prefix || "";
|
|
76
|
+
return `${prefix}${documentName}.bin`;
|
|
77
|
+
}
|
|
78
|
+
async onConfigure() {
|
|
79
|
+
var _a, _b;
|
|
80
|
+
// Use custom S3 client if provided, otherwise create one
|
|
81
|
+
if (this.configuration.s3Client) {
|
|
82
|
+
this.s3Client = this.configuration.s3Client;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
const clientConfig = {
|
|
86
|
+
region: this.configuration.region,
|
|
87
|
+
};
|
|
88
|
+
if (this.configuration.credentials) {
|
|
89
|
+
clientConfig.credentials = this.configuration.credentials;
|
|
90
|
+
}
|
|
91
|
+
if (this.configuration.endpoint) {
|
|
92
|
+
clientConfig.endpoint = this.configuration.endpoint;
|
|
93
|
+
clientConfig.forcePathStyle = this.configuration.forcePathStyle;
|
|
94
|
+
}
|
|
95
|
+
this.s3Client = new clientS3.S3Client(clientConfig);
|
|
96
|
+
}
|
|
97
|
+
// Test S3 connection by checking if bucket exists
|
|
98
|
+
try {
|
|
99
|
+
const command = new clientS3.HeadObjectCommand({
|
|
100
|
+
Bucket: this.configuration.bucket,
|
|
101
|
+
Key: "test-connection", // This will likely return 404, but that's fine
|
|
102
|
+
});
|
|
103
|
+
await this.s3Client.send(command);
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
// 404 is expected for the test key, any other error indicates connection issues
|
|
107
|
+
if (((_a = error.$metadata) === null || _a === void 0 ? void 0 : _a.httpStatusCode) !== 404) {
|
|
108
|
+
// Don't show credential errors as connection failures in development
|
|
109
|
+
if ((_b = error.message) === null || _b === void 0 ? void 0 : _b.includes('Could not load credentials')) {
|
|
110
|
+
console.warn(` ${kleur.yellow("S3 warning:")} ${error.message}`);
|
|
111
|
+
console.warn(` ${kleur.yellow("Note:")} Ensure AWS credentials are properly configured for production use`);
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
console.error(` ${kleur.red("S3 connection failed:")} ${error.message}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
async onListen() {
|
|
120
|
+
const endpoint = this.configuration.endpoint || `https://s3.${this.configuration.region}.amazonaws.com`;
|
|
121
|
+
console.log(` ${kleur.green("S3 extension configured:")} bucket=${this.configuration.bucket}, endpoint=${endpoint}`);
|
|
122
|
+
if (this.configuration.prefix) {
|
|
123
|
+
console.log(` ${kleur.blue("S3 key prefix:")} ${this.configuration.prefix}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
exports.S3 = S3;
|
|
129
|
+
//# sourceMappingURL=hocuspocus-s3.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hocuspocus-s3.cjs","sources":["../src/S3.ts"],"sourcesContent":[null],"names":["Database","GetObjectCommand","PutObjectCommand","S3Client","HeadObjectCommand"],"mappings":"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"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { Database } from '@hocuspocus/extension-database';
|
|
2
|
+
import { PutObjectCommand, GetObjectCommand, S3Client, HeadObjectCommand } from '@aws-sdk/client-s3';
|
|
3
|
+
import kleur from 'kleur';
|
|
4
|
+
|
|
5
|
+
class S3 extends Database {
|
|
6
|
+
constructor(configuration) {
|
|
7
|
+
super({});
|
|
8
|
+
this.configuration = {
|
|
9
|
+
region: "us-east-1",
|
|
10
|
+
bucket: "",
|
|
11
|
+
prefix: "hocuspocus-documents/",
|
|
12
|
+
forcePathStyle: false,
|
|
13
|
+
fetch: async ({ documentName }) => {
|
|
14
|
+
var _a;
|
|
15
|
+
const key = this.getObjectKey(documentName);
|
|
16
|
+
try {
|
|
17
|
+
const command = new GetObjectCommand({
|
|
18
|
+
Bucket: this.configuration.bucket,
|
|
19
|
+
Key: key,
|
|
20
|
+
});
|
|
21
|
+
const response = await this.s3Client.send(command);
|
|
22
|
+
if (response.Body) {
|
|
23
|
+
// Convert stream to Uint8Array
|
|
24
|
+
const chunks = [];
|
|
25
|
+
const reader = response.Body.transformToWebStream().getReader();
|
|
26
|
+
while (true) {
|
|
27
|
+
const { done, value } = await reader.read();
|
|
28
|
+
if (done)
|
|
29
|
+
break;
|
|
30
|
+
chunks.push(value);
|
|
31
|
+
}
|
|
32
|
+
// Combine all chunks into a single Uint8Array
|
|
33
|
+
const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);
|
|
34
|
+
const result = new Uint8Array(totalLength);
|
|
35
|
+
let offset = 0;
|
|
36
|
+
for (const chunk of chunks) {
|
|
37
|
+
result.set(chunk, offset);
|
|
38
|
+
offset += chunk.length;
|
|
39
|
+
}
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
if (error.name === 'NoSuchKey' || ((_a = error.$metadata) === null || _a === void 0 ? void 0 : _a.httpStatusCode) === 404) {
|
|
46
|
+
// Document doesn't exist yet, return null
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
throw error;
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
store: async ({ documentName, state }) => {
|
|
53
|
+
const key = this.getObjectKey(documentName);
|
|
54
|
+
const command = new PutObjectCommand({
|
|
55
|
+
Bucket: this.configuration.bucket,
|
|
56
|
+
Key: key,
|
|
57
|
+
Body: state,
|
|
58
|
+
ContentType: "application/octet-stream",
|
|
59
|
+
});
|
|
60
|
+
await this.s3Client.send(command);
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
this.configuration = {
|
|
64
|
+
...this.configuration,
|
|
65
|
+
...configuration,
|
|
66
|
+
};
|
|
67
|
+
// Validate required configuration
|
|
68
|
+
if (!this.configuration.bucket) {
|
|
69
|
+
throw new Error("S3 bucket name is required");
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
getObjectKey(documentName) {
|
|
73
|
+
const prefix = this.configuration.prefix || "";
|
|
74
|
+
return `${prefix}${documentName}.bin`;
|
|
75
|
+
}
|
|
76
|
+
async onConfigure() {
|
|
77
|
+
var _a, _b;
|
|
78
|
+
// Use custom S3 client if provided, otherwise create one
|
|
79
|
+
if (this.configuration.s3Client) {
|
|
80
|
+
this.s3Client = this.configuration.s3Client;
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
const clientConfig = {
|
|
84
|
+
region: this.configuration.region,
|
|
85
|
+
};
|
|
86
|
+
if (this.configuration.credentials) {
|
|
87
|
+
clientConfig.credentials = this.configuration.credentials;
|
|
88
|
+
}
|
|
89
|
+
if (this.configuration.endpoint) {
|
|
90
|
+
clientConfig.endpoint = this.configuration.endpoint;
|
|
91
|
+
clientConfig.forcePathStyle = this.configuration.forcePathStyle;
|
|
92
|
+
}
|
|
93
|
+
this.s3Client = new S3Client(clientConfig);
|
|
94
|
+
}
|
|
95
|
+
// Test S3 connection by checking if bucket exists
|
|
96
|
+
try {
|
|
97
|
+
const command = new HeadObjectCommand({
|
|
98
|
+
Bucket: this.configuration.bucket,
|
|
99
|
+
Key: "test-connection", // This will likely return 404, but that's fine
|
|
100
|
+
});
|
|
101
|
+
await this.s3Client.send(command);
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
// 404 is expected for the test key, any other error indicates connection issues
|
|
105
|
+
if (((_a = error.$metadata) === null || _a === void 0 ? void 0 : _a.httpStatusCode) !== 404) {
|
|
106
|
+
// Don't show credential errors as connection failures in development
|
|
107
|
+
if ((_b = error.message) === null || _b === void 0 ? void 0 : _b.includes('Could not load credentials')) {
|
|
108
|
+
console.warn(` ${kleur.yellow("S3 warning:")} ${error.message}`);
|
|
109
|
+
console.warn(` ${kleur.yellow("Note:")} Ensure AWS credentials are properly configured for production use`);
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
console.error(` ${kleur.red("S3 connection failed:")} ${error.message}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
async onListen() {
|
|
118
|
+
const endpoint = this.configuration.endpoint || `https://s3.${this.configuration.region}.amazonaws.com`;
|
|
119
|
+
console.log(` ${kleur.green("S3 extension configured:")} bucket=${this.configuration.bucket}, endpoint=${endpoint}`);
|
|
120
|
+
if (this.configuration.prefix) {
|
|
121
|
+
console.log(` ${kleur.blue("S3 key prefix:")} ${this.configuration.prefix}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export { S3 };
|
|
127
|
+
//# sourceMappingURL=hocuspocus-s3.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hocuspocus-s3.esm.js","sources":["../src/S3.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from 'prosemirror-model';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from 'prosemirror-state';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from 'prosemirror-transform';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from 'prosemirror-view';
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface CloseEvent {
|
|
2
|
+
code: number;
|
|
3
|
+
reason: string;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* The server is terminating the connection because a data frame was received
|
|
7
|
+
* that is too large.
|
|
8
|
+
* See: https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent/code
|
|
9
|
+
*/
|
|
10
|
+
export declare const MessageTooBig: CloseEvent;
|
|
11
|
+
/**
|
|
12
|
+
* The server successfully processed the request, asks that the requester reset
|
|
13
|
+
* its document view, and is not returning any content.
|
|
14
|
+
*/
|
|
15
|
+
export declare const ResetConnection: CloseEvent;
|
|
16
|
+
/**
|
|
17
|
+
* Similar to Forbidden, but specifically for use when authentication is required and has
|
|
18
|
+
* failed or has not yet been provided.
|
|
19
|
+
*/
|
|
20
|
+
export declare const Unauthorized: CloseEvent;
|
|
21
|
+
/**
|
|
22
|
+
* The request contained valid data and was understood by the server, but the server
|
|
23
|
+
* is refusing action.
|
|
24
|
+
*/
|
|
25
|
+
export declare const Forbidden: CloseEvent;
|
|
26
|
+
/**
|
|
27
|
+
* The server timed out waiting for the request.
|
|
28
|
+
*/
|
|
29
|
+
export declare const ConnectionTimeout: CloseEvent;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import * as encoding from "lib0/encoding";
|
|
2
|
+
import * as decoding from "lib0/decoding";
|
|
3
|
+
export declare const writeAuthentication: (encoder: encoding.Encoder, auth: string) => void;
|
|
4
|
+
export declare const writePermissionDenied: (encoder: encoding.Encoder, reason: string) => void;
|
|
5
|
+
export declare const writeAuthenticated: (encoder: encoding.Encoder, scope: "readonly" | "read-write") => void;
|
|
6
|
+
export declare const readAuthMessage: (decoder: decoding.Decoder, permissionDeniedHandler: (reason: string) => void, authenticatedHandler: (scope: string) => void) => void;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Extension, onChangePayload, onLoadDocumentPayload, storePayload, fetchPayload } from "@hocuspocus/server";
|
|
2
|
+
export interface DatabaseConfiguration {
|
|
3
|
+
/**
|
|
4
|
+
* Pass a Promise to retrieve updates from your database. The Promise should resolve to
|
|
5
|
+
* an array of items with Y.js-compatible binary data.
|
|
6
|
+
*/
|
|
7
|
+
fetch: (data: fetchPayload) => Promise<Uint8Array | null>;
|
|
8
|
+
/**
|
|
9
|
+
* Pass a function to store updates in your database.
|
|
10
|
+
*/
|
|
11
|
+
store: (data: storePayload) => Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
export declare class Database implements Extension {
|
|
14
|
+
/**
|
|
15
|
+
* Default configuration
|
|
16
|
+
*/
|
|
17
|
+
configuration: DatabaseConfiguration;
|
|
18
|
+
/**
|
|
19
|
+
* Constructor
|
|
20
|
+
*/
|
|
21
|
+
constructor(configuration: Partial<DatabaseConfiguration>);
|
|
22
|
+
/**
|
|
23
|
+
* Get stored data from the database.
|
|
24
|
+
*/
|
|
25
|
+
onLoadDocument(data: onLoadDocumentPayload): Promise<any>;
|
|
26
|
+
/**
|
|
27
|
+
* Store new updates in the database.
|
|
28
|
+
*/
|
|
29
|
+
onStoreDocument(data: onChangePayload): Promise<void>;
|
|
30
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./Database.ts";
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { Extension, onChangePayload, onConfigurePayload, onConnectPayload, onLoadDocumentPayload, onDestroyPayload, onDisconnectPayload, onRequestPayload, onUpgradePayload } from "@hocuspocus/server";
|
|
2
|
+
export interface LoggerConfiguration {
|
|
3
|
+
/**
|
|
4
|
+
* Prepend all logging message with a string.
|
|
5
|
+
*
|
|
6
|
+
* @deprecated
|
|
7
|
+
*/
|
|
8
|
+
prefix: null | string;
|
|
9
|
+
/**
|
|
10
|
+
* Whether to log something for the `onLoadDocument` hook.
|
|
11
|
+
*/
|
|
12
|
+
onLoadDocument: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Whether to log something for the `onChange` hook.
|
|
15
|
+
*/
|
|
16
|
+
onChange: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Whether to log something for the `onStoreDocument` hook.
|
|
19
|
+
*/
|
|
20
|
+
onStoreDocument: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Whether to log something for the `onConnect` hook.
|
|
23
|
+
*/
|
|
24
|
+
onConnect: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Whether to log something for the `onDisconnect` hook.
|
|
27
|
+
*/
|
|
28
|
+
onDisconnect: boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Whether to log something for the `onUpgrade` hook.
|
|
31
|
+
*/
|
|
32
|
+
onUpgrade: boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Whether to log something for the `onRequest` hook.
|
|
35
|
+
*/
|
|
36
|
+
onRequest: boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Whether to log something for the `onDestroy` hook.
|
|
39
|
+
*/
|
|
40
|
+
onDestroy: boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Whether to log something for the `onConfigure` hook.
|
|
43
|
+
*/
|
|
44
|
+
onConfigure: boolean;
|
|
45
|
+
/**
|
|
46
|
+
* A log function, if none is provided output will go to console
|
|
47
|
+
*/
|
|
48
|
+
log: (...args: any[]) => void;
|
|
49
|
+
}
|
|
50
|
+
export declare class Logger implements Extension {
|
|
51
|
+
name: string | null;
|
|
52
|
+
configuration: LoggerConfiguration;
|
|
53
|
+
/**
|
|
54
|
+
* Constructor
|
|
55
|
+
*/
|
|
56
|
+
constructor(configuration?: Partial<LoggerConfiguration>);
|
|
57
|
+
onConfigure(data: onConfigurePayload): Promise<void>;
|
|
58
|
+
onLoadDocument(data: onLoadDocumentPayload): Promise<void>;
|
|
59
|
+
onChange(data: onChangePayload): Promise<void>;
|
|
60
|
+
onStoreDocument(data: onDisconnectPayload): Promise<void>;
|
|
61
|
+
onConnect(data: onConnectPayload): Promise<void>;
|
|
62
|
+
onDisconnect(data: onDisconnectPayload): Promise<void>;
|
|
63
|
+
onUpgrade(data: onUpgradePayload): Promise<void>;
|
|
64
|
+
onRequest(data: onRequestPayload): Promise<void>;
|
|
65
|
+
onDestroy(data: onDestroyPayload): Promise<void>;
|
|
66
|
+
private log;
|
|
67
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./Logger.ts";
|