@adonis-agora/collaboration 0.1.4 → 0.2.1
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/CHANGELOG.md +24 -0
- package/README.md +172 -0
- package/dist/commands/collaboration_init.d.ts +26 -0
- package/dist/commands/collaboration_init.d.ts.map +1 -0
- package/dist/commands/collaboration_init.js +83 -0
- package/dist/commands/collaboration_init.js.map +1 -0
- package/dist/commands/commands.json +1 -0
- package/dist/commands/main.d.ts +16 -0
- package/dist/commands/main.d.ts.map +1 -0
- package/dist/commands/main.js +20 -0
- package/dist/commands/main.js.map +1 -0
- package/dist/commands/make_collab_document.d.ts +23 -0
- package/dist/commands/make_collab_document.d.ts.map +1 -0
- package/dist/commands/make_collab_document.js +75 -0
- package/dist/commands/make_collab_document.js.map +1 -0
- package/dist/configure.d.ts +3 -1
- package/dist/configure.d.ts.map +1 -1
- package/dist/configure.js +6 -1
- package/dist/configure.js.map +1 -1
- package/dist/providers/collaboration_provider.d.ts +6 -2
- package/dist/providers/collaboration_provider.d.ts.map +1 -1
- package/dist/providers/collaboration_provider.js +36 -17
- package/dist/providers/collaboration_provider.js.map +1 -1
- package/dist/src/auth/token.d.ts +59 -0
- package/dist/src/auth/token.d.ts.map +1 -0
- package/dist/src/auth/token.js +91 -0
- package/dist/src/auth/token.js.map +1 -0
- package/dist/src/codegen/documents_registry.d.ts +28 -0
- package/dist/src/codegen/documents_registry.d.ts.map +1 -0
- package/dist/src/codegen/documents_registry.js +50 -0
- package/dist/src/codegen/documents_registry.js.map +1 -0
- package/dist/src/codegen_init.d.ts +3 -0
- package/dist/src/codegen_init.d.ts.map +1 -0
- package/dist/src/codegen_init.js +45 -0
- package/dist/src/codegen_init.js.map +1 -0
- package/dist/src/collaboration_manager.d.ts +20 -11
- package/dist/src/collaboration_manager.d.ts.map +1 -1
- package/dist/src/collaboration_manager.js +46 -17
- package/dist/src/collaboration_manager.js.map +1 -1
- package/dist/src/define_config.d.ts +25 -6
- package/dist/src/define_config.d.ts.map +1 -1
- package/dist/src/define_config.js +2 -2
- package/dist/src/define_config.js.map +1 -1
- package/dist/src/driver.d.ts +26 -32
- package/dist/src/driver.d.ts.map +1 -1
- package/dist/src/drivers/automerge/automerge_driver.d.ts +7 -12
- package/dist/src/drivers/automerge/automerge_driver.d.ts.map +1 -1
- package/dist/src/drivers/automerge/automerge_driver.js +37 -75
- package/dist/src/drivers/automerge/automerge_driver.js.map +1 -1
- package/dist/src/drivers/partykit/partykit_driver.d.ts +54 -0
- package/dist/src/drivers/partykit/partykit_driver.d.ts.map +1 -0
- package/dist/src/drivers/partykit/partykit_driver.js +162 -0
- package/dist/src/drivers/partykit/partykit_driver.js.map +1 -0
- package/dist/src/drivers/shared.d.ts +17 -0
- package/dist/src/drivers/shared.d.ts.map +1 -0
- package/dist/src/drivers/shared.js +46 -0
- package/dist/src/drivers/shared.js.map +1 -0
- package/dist/src/drivers/yjs/yjs_driver.d.ts +18 -12
- package/dist/src/drivers/yjs/yjs_driver.d.ts.map +1 -1
- package/dist/src/drivers/yjs/yjs_driver.js +50 -94
- package/dist/src/drivers/yjs/yjs_driver.js.map +1 -1
- package/dist/src/http/types.d.ts +79 -0
- package/dist/src/http/types.d.ts.map +1 -0
- package/dist/src/http/types.js +8 -0
- package/dist/src/http/types.js.map +1 -0
- package/dist/src/index.d.ts +7 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +7 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/routes.d.ts +29 -0
- package/dist/src/routes.d.ts.map +1 -0
- package/dist/src/routes.js +189 -0
- package/dist/src/routes.js.map +1 -0
- package/dist/src/services/booted_app.js +1 -1
- package/dist/src/services/booted_app.js.map +1 -1
- package/dist/src/services/comment_service.d.ts +5 -4
- package/dist/src/services/comment_service.d.ts.map +1 -1
- package/dist/src/services/comment_service.js +5 -4
- package/dist/src/services/comment_service.js.map +1 -1
- package/dist/src/services/main.js +2 -2
- package/dist/src/services/main.js.map +1 -1
- package/dist/src/storage/file_system_storage.d.ts +2 -2
- package/dist/src/storage/file_system_storage.js +2 -2
- package/dist/src/storage/in_memory_storage.d.ts +3 -3
- package/dist/src/storage/in_memory_storage.js +3 -3
- package/dist/src/storage/lucid_storage.d.ts +9 -8
- package/dist/src/storage/lucid_storage.d.ts.map +1 -1
- package/dist/src/storage/lucid_storage.js +13 -12
- package/dist/src/storage/lucid_storage.js.map +1 -1
- package/dist/src/types.d.ts +62 -35
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +5 -6
- package/dist/src/types.js.map +1 -1
- package/dist/src/versioning.d.ts +3 -3
- package/dist/src/versioning.d.ts.map +1 -1
- package/dist/src/versioning.js +3 -3
- package/dist/src/versioning.js.map +1 -1
- package/dist/stubs/collaboration/document_types.stub +41 -0
- package/dist/stubs/collaboration/documents_dir.stub +3 -0
- package/dist/stubs/collaboration/migrations/collab_comments.stub +29 -0
- package/dist/stubs/collaboration/migrations/collab_documents.stub +23 -0
- package/dist/stubs/collaboration/migrations/collab_versions.stub +26 -0
- package/dist/stubs/partykit/worker/package.json.stub +21 -0
- package/dist/stubs/partykit/worker/party.ts.stub +175 -0
- package/dist/stubs/partykit/worker/partykit.toml.stub +14 -0
- package/package.json +19 -4
- package/dist/src/services/presence_service.d.ts +0 -44
- package/dist/src/services/presence_service.d.ts.map +0 -1
- package/dist/src/services/presence_service.js +0 -103
- package/dist/src/services/presence_service.js.map +0 -1
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ResolveUserFn } from './http/types.js';
|
|
2
|
+
import type { CollaborationConfig, PartyKitConfig } from './types.js';
|
|
2
3
|
/**
|
|
3
|
-
* Shape
|
|
4
|
-
*
|
|
4
|
+
* Shape of the `config/collaboration.ts` published by the stub — the
|
|
5
|
+
* "app-friendly" version of {@link CollaborationConfig} (redisUrl as a
|
|
6
|
+
* string, optional storage).
|
|
5
7
|
*/
|
|
6
8
|
export type CollaborationAppConfig = {
|
|
7
9
|
engine?: CollaborationConfig['engine'];
|
|
@@ -9,12 +11,29 @@ export type CollaborationAppConfig = {
|
|
|
9
11
|
redisUrl?: string;
|
|
10
12
|
debounce?: number;
|
|
11
13
|
authorize: CollaborationConfig['authorize'];
|
|
12
|
-
/**
|
|
14
|
+
/** Omitted = in-memory (dev only). Production passes a persistent storage. */
|
|
13
15
|
storage?: CollaborationConfig['storage'];
|
|
16
|
+
/** Required when engine = 'partykit' (edge sync). */
|
|
17
|
+
partykit?: PartyKitConfig;
|
|
18
|
+
/**
|
|
19
|
+
* Built-in REST endpoints. Registered automatically by the provider
|
|
20
|
+
* unless `enabled: false` — then call `collaborationRoutes(router)`
|
|
21
|
+
* inside `start/routes.ts` and apply your own middleware.
|
|
22
|
+
*/
|
|
23
|
+
routes?: {
|
|
24
|
+
/** Default: true. */
|
|
25
|
+
enabled?: boolean;
|
|
26
|
+
/** Default: '/collaboration'. */
|
|
27
|
+
prefix?: string;
|
|
28
|
+
/** Middleware applied to the whole route group (manual mode too). */
|
|
29
|
+
middleware?: unknown[];
|
|
30
|
+
/** Resolves the authenticated user for the token endpoint. */
|
|
31
|
+
resolveUser?: ResolveUserFn;
|
|
32
|
+
};
|
|
14
33
|
};
|
|
15
34
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
35
|
+
* Type-safe config helper used in the app's `config/collaboration.ts` —
|
|
36
|
+
* same pattern as @adonisjs/*'s `defineConfig`.
|
|
18
37
|
*/
|
|
19
38
|
export declare function defineConfig(config: CollaborationAppConfig): CollaborationAppConfig;
|
|
20
39
|
//# sourceMappingURL=define_config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define_config.d.ts","sourceRoot":"","sources":["../../src/define_config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"define_config.d.ts","sourceRoot":"","sources":["../../src/define_config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEtE;;;;GAIG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,CAAC,EAAE,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAC5C,8EAA8E;IAC9E,OAAO,CAAC,EAAE,mBAAmB,CAAC,SAAS,CAAC,CAAC;IACzC,qDAAqD;IACrD,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B;;;;OAIG;IACH,MAAM,CAAC,EAAE;QACP,qBAAqB;QACrB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,iCAAiC;QACjC,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,qEAAqE;QACrE,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC;QACvB,8DAA8D;QAC9D,WAAW,CAAC,EAAE,aAAa,CAAC;KAC7B,CAAC;CACH,CAAC;AAEF;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,sBAAsB,GAAG,sBAAsB,CAEnF"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* Type-safe config helper used in the app's `config/collaboration.ts` —
|
|
3
|
+
* same pattern as @adonisjs/*'s `defineConfig`.
|
|
4
4
|
*/
|
|
5
5
|
export function defineConfig(config) {
|
|
6
6
|
return config;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define_config.js","sourceRoot":"","sources":["../../src/define_config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"define_config.js","sourceRoot":"","sources":["../../src/define_config.ts"],"names":[],"mappings":"AAmCA;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,MAA8B;IACzD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/src/driver.d.ts
CHANGED
|
@@ -1,49 +1,43 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { AuthorizeFn } from './auth/token.js';
|
|
2
|
+
import type { CollabComment, CollabConnectionContext, CollabDiffSummary, CollabPermission, CollabVersion, CollaborationConfig, CollaborationStorage, PartyKitConfig } from './types.js';
|
|
2
3
|
/**
|
|
3
|
-
*
|
|
4
|
-
* Automerge):
|
|
5
|
-
*
|
|
6
|
-
* (
|
|
4
|
+
* Contract for a CRDT driver. The driver owns the engine (Yjs/Hocuspocus or
|
|
5
|
+
* Automerge): it receives the Adonis HTTP server to attach the WebSocket,
|
|
6
|
+
* speaks the engine's binary protocol with clients and implements version
|
|
7
|
+
* control (native in Automerge, via snapshots in Yjs).
|
|
7
8
|
*/
|
|
8
9
|
export interface CollaborationDriver {
|
|
9
10
|
readonly engine: string;
|
|
10
|
-
/**
|
|
11
|
+
/** Attaches the WebSocket transport to the HTTP server (upgrade on the configured path). */
|
|
11
12
|
attach(server: import('node:http').Server): Promise<void>;
|
|
12
|
-
/**
|
|
13
|
+
/** Current binary state of the document (for external export/push, e.g. Drive). */
|
|
13
14
|
getDocumentState(docName: string): Promise<Uint8Array>;
|
|
14
|
-
/**
|
|
15
|
+
/** Plain text of the document (for LanguageTool, RAG, comment indexes). */
|
|
15
16
|
getDocumentText(docName: string): Promise<string>;
|
|
16
|
-
/**
|
|
17
|
+
/** Creates a named version in the history. */
|
|
17
18
|
createVersion(docName: string, createdBy: string | null, label: string | null): Promise<CollabVersion>;
|
|
18
|
-
/**
|
|
19
|
+
/** Lists the versions in the history. */
|
|
19
20
|
listVersions(docName: string): Promise<CollabVersion[]>;
|
|
20
|
-
/**
|
|
21
|
+
/** Restores the document to a version (creates a new "restored from X" version). */
|
|
21
22
|
restoreVersion(docName: string, versionId: string, restoredBy: string | null): Promise<void>;
|
|
22
|
-
/**
|
|
23
|
+
/** Diff summary between two versions. */
|
|
23
24
|
diffVersions(docName: string, aId: string, bId: string): Promise<CollabDiffSummary>;
|
|
24
|
-
/**
|
|
25
|
-
listComments(docName: string, space?: string): Promise<CollabComment[]>;
|
|
26
|
-
/** Cria um comentário ancorado num espaço do documento. */
|
|
27
|
-
createComment(docName: string, comment: Omit<CollabComment, 'id' | 'createdAt' | 'updatedAt' | 'resolvedAt'>): Promise<CollabComment>;
|
|
28
|
-
/** Resolve/reabre um comentário. Retorna null se não existir. */
|
|
29
|
-
resolveComment(docName: string, commentId: string, resolved: boolean): Promise<CollabComment | null>;
|
|
30
|
-
/** Remove um comentário. Retorna false se não existir. */
|
|
31
|
-
deleteComment(docName: string, commentId: string): Promise<boolean>;
|
|
32
|
-
/** Encerra graciosamente (flush + fecha conexões). */
|
|
25
|
+
/** Gracefully shuts down (flush + closes connections). */
|
|
33
26
|
close(): Promise<void>;
|
|
34
27
|
}
|
|
35
|
-
/**
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
28
|
+
/** Narrow dependencies for self-hosted engines (Yjs/Automerge). */
|
|
29
|
+
export interface SelfHostedDriverOptions {
|
|
30
|
+
storage?: CollaborationStorage;
|
|
31
|
+
authorize: AuthorizeFn;
|
|
32
|
+
path?: string;
|
|
33
|
+
debounce?: number;
|
|
34
|
+
}
|
|
35
|
+
/** Narrow dependencies for the edge engine (PartyKit). */
|
|
36
|
+
export interface PartyKitDriverOptions {
|
|
37
|
+
storage?: CollaborationStorage;
|
|
38
|
+
partykit: PartyKitConfig;
|
|
45
39
|
}
|
|
46
|
-
/** Helpers
|
|
40
|
+
/** Helpers shared across drivers. */
|
|
47
41
|
export type { CollabComment, CollabConnectionContext, CollabPermission, CollabVersion, CollaborationConfig, };
|
|
48
42
|
export type { CollabDiffSummary };
|
|
49
43
|
//# sourceMappingURL=driver.d.ts.map
|
package/dist/src/driver.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../../src/driver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EACb,uBAAuB,EACvB,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAEpB;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB,
|
|
1
|
+
{"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../../src/driver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EACV,aAAa,EACb,uBAAuB,EACvB,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,mBAAmB,EACnB,oBAAoB,EACpB,cAAc,EACf,MAAM,YAAY,CAAC;AAEpB;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB,4FAA4F;IAC5F,MAAM,CAAC,MAAM,EAAE,OAAO,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1D,mFAAmF;IACnF,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAEvD,2EAA2E;IAC3E,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAElD,8CAA8C;IAC9C,aAAa,CACX,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,KAAK,EAAE,MAAM,GAAG,IAAI,GACnB,OAAO,CAAC,aAAa,CAAC,CAAC;IAE1B,yCAAyC;IACzC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAExD,oFAAoF;IACpF,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7F,yCAAyC;IACzC,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAEpF,0DAA0D;IAC1D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,mEAAmE;AACnE,MAAM,WAAW,uBAAuB;IACtC,OAAO,CAAC,EAAE,oBAAoB,CAAC;IAC/B,SAAS,EAAE,WAAW,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,0DAA0D;AAC1D,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,oBAAoB,CAAC;IAC/B,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED,qCAAqC;AACrC,YAAY,EACV,aAAa,EACb,uBAAuB,EACvB,gBAAgB,EAChB,aAAa,EACb,mBAAmB,GACpB,CAAC;AACF,YAAY,EAAE,iBAAiB,EAAE,CAAC"}
|
|
@@ -1,30 +1,25 @@
|
|
|
1
|
-
import type { CollaborationDriver } from '../../driver.js';
|
|
2
|
-
import type {
|
|
1
|
+
import type { CollaborationDriver, SelfHostedDriverOptions } from '../../driver.js';
|
|
2
|
+
import type { CollabDiffSummary, CollabVersion } from '../../types.js';
|
|
3
3
|
export declare class AutomergeDriver implements CollaborationDriver {
|
|
4
|
-
#private;
|
|
5
|
-
private config;
|
|
6
4
|
readonly engine = "automerge";
|
|
7
5
|
private rooms;
|
|
8
6
|
private wss?;
|
|
9
|
-
private
|
|
10
|
-
|
|
7
|
+
private readonly options;
|
|
8
|
+
private readonly storage;
|
|
9
|
+
private persistTimers;
|
|
10
|
+
constructor(options: SelfHostedDriverOptions);
|
|
11
11
|
private loadRoom;
|
|
12
12
|
private broadcast;
|
|
13
13
|
attach(server: import('node:http').Server): Promise<void>;
|
|
14
14
|
private handleClientMessage;
|
|
15
|
-
private persistTimers;
|
|
16
15
|
private persistDebounced;
|
|
17
16
|
getDocumentState(docName: string): Promise<Uint8Array>;
|
|
18
17
|
getDocumentText(docName: string): Promise<string>;
|
|
19
|
-
/**
|
|
18
|
+
/** Versions = markers over the native history (heads hash). */
|
|
20
19
|
createVersion(docName: string, createdBy: string | null, label: string | null): Promise<CollabVersion>;
|
|
21
20
|
listVersions(docName: string): Promise<CollabVersion[]>;
|
|
22
21
|
restoreVersion(docName: string, versionId: string, _restoredBy: string | null): Promise<void>;
|
|
23
22
|
diffVersions(docName: string, aId: string, bId: string): Promise<CollabDiffSummary>;
|
|
24
|
-
listComments(docName: string, space?: string): Promise<CollabComment[]>;
|
|
25
|
-
createComment(docName: string, comment: Omit<CollabComment, 'id' | 'createdAt' | 'updatedAt' | 'resolvedAt'>): Promise<CollabComment>;
|
|
26
|
-
resolveComment(docName: string, commentId: string, resolved: boolean): Promise<CollabComment | null>;
|
|
27
|
-
deleteComment(docName: string, commentId: string): Promise<boolean>;
|
|
28
23
|
close(): Promise<void>;
|
|
29
24
|
}
|
|
30
25
|
//# sourceMappingURL=automerge_driver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"automerge_driver.d.ts","sourceRoot":"","sources":["../../../../src/drivers/automerge/automerge_driver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"automerge_driver.d.ts","sourceRoot":"","sources":["../../../../src/drivers/automerge/automerge_driver.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AACpF,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAwB,MAAM,gBAAgB,CAAC;AAyB7F,qBAAa,eAAgB,YAAW,mBAAmB;IACzD,QAAQ,CAAC,MAAM,eAAe;IAE9B,OAAO,CAAC,KAAK,CAA2B;IACxC,OAAO,CAAC,GAAG,CAAC,CAAkB;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;IAClD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;IAC/C,OAAO,CAAC,aAAa,CAAoD;gBAE7D,OAAO,EAAE,uBAAuB;YAK9B,QAAQ;IActB,OAAO,CAAC,SAAS;IAQX,MAAM,CAAC,MAAM,EAAE,OAAO,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAsDjD,mBAAmB;IAkBjC,OAAO,CAAC,gBAAgB;IAclB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAKtD,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAMvD,+DAA+D;IACzD,aAAa,CACjB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,KAAK,EAAE,MAAM,GAAG,IAAI,GACnB,OAAO,CAAC,aAAa,CAAC;IAgBnB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAIvD,cAAc,CAClB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAAG,IAAI,GACzB,OAAO,CAAC,IAAI,CAAC;IAoBV,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAenF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAM7B"}
|
|
@@ -1,33 +1,24 @@
|
|
|
1
1
|
import * as A from '@automerge/automerge';
|
|
2
2
|
import { next as ANext } from '@automerge/automerge';
|
|
3
3
|
import { WebSocketServer } from 'ws';
|
|
4
|
-
import { CommentService } from '../../services/comment_service.js';
|
|
5
|
-
import { InMemoryCollaborationStorage } from '../../storage/in_memory_storage.js';
|
|
6
4
|
import { createVersionMetadata, seqVersions } from '../../versioning.js';
|
|
5
|
+
import { lineDiff, resolveStorage } from '../shared.js';
|
|
7
6
|
export class AutomergeDriver {
|
|
8
|
-
config;
|
|
9
7
|
engine = 'automerge';
|
|
10
8
|
rooms = new Map();
|
|
11
9
|
wss;
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
#storage() {
|
|
19
|
-
if (this.config.storage) {
|
|
20
|
-
return this.config.storage;
|
|
21
|
-
}
|
|
22
|
-
this.#memoryStorage ??= new InMemoryCollaborationStorage();
|
|
23
|
-
return this.#memoryStorage;
|
|
10
|
+
options;
|
|
11
|
+
storage;
|
|
12
|
+
persistTimers = new Map();
|
|
13
|
+
constructor(options) {
|
|
14
|
+
this.options = options;
|
|
15
|
+
this.storage = resolveStorage(options.storage);
|
|
24
16
|
}
|
|
25
|
-
#memoryStorage;
|
|
26
17
|
async loadRoom(docName) {
|
|
27
18
|
let room = this.rooms.get(docName);
|
|
28
19
|
if (room)
|
|
29
20
|
return room;
|
|
30
|
-
const stored = await this
|
|
21
|
+
const stored = await this.storage.loadDocument(docName);
|
|
31
22
|
const doc = stored
|
|
32
23
|
? A.load(stored.state)
|
|
33
24
|
: A.from({ content: '' });
|
|
@@ -43,7 +34,7 @@ export class AutomergeDriver {
|
|
|
43
34
|
}
|
|
44
35
|
}
|
|
45
36
|
async attach(server) {
|
|
46
|
-
const path = this.
|
|
37
|
+
const path = this.options.path ?? '/collaboration';
|
|
47
38
|
const wss = new WebSocketServer({ noServer: true });
|
|
48
39
|
this.wss = wss;
|
|
49
40
|
server.on('upgrade', (request, socket, head) => {
|
|
@@ -53,25 +44,25 @@ export class AutomergeDriver {
|
|
|
53
44
|
wss.handleUpgrade(request, socket, head, async (ws) => {
|
|
54
45
|
const docName = decodeURIComponent(url.searchParams.get('doc') ?? '');
|
|
55
46
|
if (!docName) {
|
|
56
|
-
ws.close(4000, 'doc
|
|
47
|
+
ws.close(4000, 'doc required');
|
|
57
48
|
return;
|
|
58
49
|
}
|
|
59
|
-
//
|
|
50
|
+
// Authentication: base64 token in the query (?token=...&doc=...).
|
|
60
51
|
const token = url.searchParams.get('token');
|
|
61
52
|
if (!token) {
|
|
62
|
-
ws.close(4001, '
|
|
53
|
+
ws.close(4001, 'not authenticated');
|
|
63
54
|
return;
|
|
64
55
|
}
|
|
65
56
|
try {
|
|
66
57
|
const ctx = JSON.parse(Buffer.from(token, 'base64').toString());
|
|
67
|
-
const permission = await this.
|
|
58
|
+
const permission = await this.options.authorize(ctx, docName);
|
|
68
59
|
if (!permission.canRead) {
|
|
69
|
-
ws.close(4003, '
|
|
60
|
+
ws.close(4003, 'no access');
|
|
70
61
|
return;
|
|
71
62
|
}
|
|
72
63
|
const room = await this.loadRoom(docName);
|
|
73
64
|
room.clients.add(ws);
|
|
74
|
-
//
|
|
65
|
+
// Sends the full state to the new client.
|
|
75
66
|
ws.send(A.save(room.text));
|
|
76
67
|
ws.on('message', (data) => {
|
|
77
68
|
void this.handleClientMessage(docName, data, ws);
|
|
@@ -81,38 +72,35 @@ export class AutomergeDriver {
|
|
|
81
72
|
});
|
|
82
73
|
}
|
|
83
74
|
catch {
|
|
84
|
-
ws.close(4001, '
|
|
75
|
+
ws.close(4001, 'authentication failed');
|
|
85
76
|
}
|
|
86
77
|
});
|
|
87
78
|
});
|
|
88
79
|
}
|
|
89
|
-
// biome-ignore lint/suspicious/noExplicitAny:
|
|
80
|
+
// biome-ignore lint/suspicious/noExplicitAny: automerge's typing is unstable between minors
|
|
90
81
|
async handleClientMessage(docName, data, sender) {
|
|
91
82
|
const room = await this.loadRoom(docName);
|
|
92
83
|
try {
|
|
93
|
-
//
|
|
84
|
+
// Client sends an incremental binary doc; merge into the server doc.
|
|
94
85
|
const incoming = A.load(data);
|
|
95
86
|
const merged = A.merge(room.text, incoming);
|
|
96
87
|
room.text = merged;
|
|
97
88
|
this.broadcast(room, data, sender);
|
|
98
|
-
//
|
|
89
|
+
// Persistence with simple per-room debounce.
|
|
99
90
|
await this.persistDebounced(docName, room);
|
|
100
91
|
}
|
|
101
92
|
catch {
|
|
102
|
-
//
|
|
93
|
+
// Invalid payload: ignore (a badly-behaved client doesn't take down the room).
|
|
103
94
|
}
|
|
104
95
|
}
|
|
105
|
-
persistTimers = new Map();
|
|
106
96
|
persistDebounced(docName, room) {
|
|
107
97
|
return new Promise((resolve) => {
|
|
108
98
|
const existing = this.persistTimers.get(docName);
|
|
109
99
|
if (existing)
|
|
110
100
|
clearTimeout(existing);
|
|
111
101
|
this.persistTimers.set(docName, setTimeout(() => {
|
|
112
|
-
void this
|
|
113
|
-
|
|
114
|
-
.finally(() => resolve());
|
|
115
|
-
}, this.config.debounce ?? 2000));
|
|
102
|
+
void this.storage.saveDocument(docName, A.save(room.text)).finally(() => resolve());
|
|
103
|
+
}, this.options.debounce ?? 2000));
|
|
116
104
|
});
|
|
117
105
|
}
|
|
118
106
|
async getDocumentState(docName) {
|
|
@@ -124,32 +112,32 @@ export class AutomergeDriver {
|
|
|
124
112
|
const content = room.text.content;
|
|
125
113
|
return content ? content.toString() : '';
|
|
126
114
|
}
|
|
127
|
-
/**
|
|
115
|
+
/** Versions = markers over the native history (heads hash). */
|
|
128
116
|
async createVersion(docName, createdBy, label) {
|
|
129
117
|
const room = await this.loadRoom(docName);
|
|
130
118
|
const heads = ANext.getHeads(room.text);
|
|
131
|
-
const existing = await this
|
|
119
|
+
const existing = await this.storage.listVersions(docName);
|
|
132
120
|
const version = {
|
|
133
121
|
...createVersionMetadata(createdBy, label, seqVersions(existing)),
|
|
134
122
|
id: heads.join(','),
|
|
135
123
|
};
|
|
136
|
-
// Snapshot = save
|
|
137
|
-
//
|
|
138
|
-
await this
|
|
124
|
+
// Snapshot = binary save of the doc up to those heads (Automerge compresses
|
|
125
|
+
// well; storing the whole doc as the "snapshot" keeps restore O(1)).
|
|
126
|
+
await this.storage.saveVersion(docName, version, A.save(room.text));
|
|
139
127
|
return version;
|
|
140
128
|
}
|
|
141
129
|
async listVersions(docName) {
|
|
142
|
-
return this
|
|
130
|
+
return this.storage.listVersions(docName);
|
|
143
131
|
}
|
|
144
132
|
async restoreVersion(docName, versionId, _restoredBy) {
|
|
145
|
-
const bytes = await this
|
|
133
|
+
const bytes = await this.storage.loadVersionSnapshot(docName, versionId);
|
|
146
134
|
if (!bytes)
|
|
147
|
-
throw new Error(`
|
|
135
|
+
throw new Error(`Version ${versionId} not found`);
|
|
148
136
|
const snapshotDoc = A.load(bytes);
|
|
149
137
|
const room = await this.loadRoom(docName);
|
|
150
138
|
const merged = A.merge(room.text, snapshotDoc);
|
|
151
|
-
// Automerge merge
|
|
152
|
-
//
|
|
139
|
+
// Automerge merge converges to the most recent state; to "restore",
|
|
140
|
+
// we overwrite the content field with the value from the version.
|
|
153
141
|
const restoredContent = snapshotDoc
|
|
154
142
|
.content;
|
|
155
143
|
const finalDoc = A.change(merged, (doc) => {
|
|
@@ -157,33 +145,20 @@ export class AutomergeDriver {
|
|
|
157
145
|
});
|
|
158
146
|
room.text = finalDoc;
|
|
159
147
|
this.broadcast(room, A.save(finalDoc));
|
|
160
|
-
await this
|
|
148
|
+
await this.storage.saveDocument(docName, A.save(finalDoc));
|
|
161
149
|
}
|
|
162
150
|
async diffVersions(docName, aId, bId) {
|
|
163
151
|
const [aBytes, bBytes] = await Promise.all([
|
|
164
|
-
this
|
|
165
|
-
this
|
|
152
|
+
this.storage.loadVersionSnapshot(docName, aId),
|
|
153
|
+
this.storage.loadVersionSnapshot(docName, bId),
|
|
166
154
|
]);
|
|
167
155
|
if (!aBytes || !bBytes)
|
|
168
|
-
throw new Error('
|
|
156
|
+
throw new Error('Version not found');
|
|
169
157
|
const textOf = (bytes) => {
|
|
170
158
|
const doc = A.load(bytes);
|
|
171
159
|
return doc.content?.toString() ?? '';
|
|
172
160
|
};
|
|
173
|
-
return
|
|
174
|
-
}
|
|
175
|
-
/* ───────────────────────── comentários ancorados ───────────────────────── */
|
|
176
|
-
async listComments(docName, space) {
|
|
177
|
-
return this.commentsService.list(docName, space);
|
|
178
|
-
}
|
|
179
|
-
async createComment(docName, comment) {
|
|
180
|
-
return this.commentsService.create(docName, comment);
|
|
181
|
-
}
|
|
182
|
-
async resolveComment(docName, commentId, resolved) {
|
|
183
|
-
return this.commentsService.resolve(docName, commentId, resolved);
|
|
184
|
-
}
|
|
185
|
-
async deleteComment(docName, commentId) {
|
|
186
|
-
return this.commentsService.remove(docName, commentId);
|
|
161
|
+
return lineDiff(textOf(aBytes), textOf(bBytes));
|
|
187
162
|
}
|
|
188
163
|
async close() {
|
|
189
164
|
for (const timer of this.persistTimers.values())
|
|
@@ -193,17 +168,4 @@ export class AutomergeDriver {
|
|
|
193
168
|
});
|
|
194
169
|
}
|
|
195
170
|
}
|
|
196
|
-
function diffByLine(a, b) {
|
|
197
|
-
const linesA = new Set(a.split('\n'));
|
|
198
|
-
const linesB = new Set(b.split('\n'));
|
|
199
|
-
let added = 0;
|
|
200
|
-
for (const line of linesB)
|
|
201
|
-
if (!linesA.has(line))
|
|
202
|
-
added++;
|
|
203
|
-
let removed = 0;
|
|
204
|
-
for (const line of linesA)
|
|
205
|
-
if (!linesB.has(line))
|
|
206
|
-
removed++;
|
|
207
|
-
return { added, removed };
|
|
208
|
-
}
|
|
209
171
|
//# sourceMappingURL=automerge_driver.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"automerge_driver.js","sourceRoot":"","sources":["../../../../src/drivers/automerge/automerge_driver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,sBAAsB,CAAC;AAC1C,OAAO,EAAE,IAAI,IAAI,KAAK,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"automerge_driver.js","sourceRoot":"","sources":["../../../../src/drivers/automerge/automerge_driver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { CollaborationDriver, PartyKitDriverOptions } from '../../driver.js';
|
|
2
|
+
import type { CollabDiffSummary, CollabVersion } from '../../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* PartyKit driver (edge sync).
|
|
5
|
+
*
|
|
6
|
+
* Unlike the Yjs/Automerge drivers, the transport is NOT attached to the
|
|
7
|
+
* Adonis HTTP server: PartyKit runs as a standalone Worker (Cloudflare
|
|
8
|
+
* Durable Objects) on its own origin and browsers connect to it directly.
|
|
9
|
+
* This driver is the worker's HTTP client — `attach()` is an intentional
|
|
10
|
+
* no-op.
|
|
11
|
+
*
|
|
12
|
+
* Responsibilities:
|
|
13
|
+
* - `getDocumentState`/`getDocumentText`: GET the worker's `onRequest`;
|
|
14
|
+
* - `restoreVersion`: POST the binary update to the live doc (edge broadcast);
|
|
15
|
+
* - version control + comments: stay in Adonis (injected storage),
|
|
16
|
+
* fetching the current room state over HTTP before snapshotting.
|
|
17
|
+
*
|
|
18
|
+
* The worker template (`stubs/partykit/worker/`) is published by
|
|
19
|
+
* `collaboration:init --engine=partykit`.
|
|
20
|
+
*/
|
|
21
|
+
export { signPartyKitToken, verifyPartyKitToken } from '../../auth/token.js';
|
|
22
|
+
/** Typed error for non-2xx worker responses. */
|
|
23
|
+
export declare class PartyKitRoomError extends Error {
|
|
24
|
+
readonly status: number;
|
|
25
|
+
readonly body: string;
|
|
26
|
+
readonly docName: string;
|
|
27
|
+
constructor(status: number, body: string, docName: string);
|
|
28
|
+
}
|
|
29
|
+
export declare class PartyKitDriver implements CollaborationDriver {
|
|
30
|
+
readonly engine = "partykit";
|
|
31
|
+
private readonly options;
|
|
32
|
+
private readonly storage;
|
|
33
|
+
constructor(options: PartyKitDriverOptions);
|
|
34
|
+
/** Validates the partykit config (throws a clear message when absent). */
|
|
35
|
+
private partyConfig;
|
|
36
|
+
/** Room HTTP endpoint URL on the worker. */
|
|
37
|
+
private roomUrl;
|
|
38
|
+
/** Authenticated HTTP call to the worker's `onRequest`. */
|
|
39
|
+
private roomRequest;
|
|
40
|
+
/**
|
|
41
|
+
* Intentional no-op: the WebSocket lives in the PartyKit worker, not the
|
|
42
|
+
* Node server. Kept on the interface for provider lifecycle compatibility
|
|
43
|
+
* (which calls attach during ready()).
|
|
44
|
+
*/
|
|
45
|
+
attach(_server: import('node:http').Server): Promise<void>;
|
|
46
|
+
getDocumentState(docName: string): Promise<Uint8Array>;
|
|
47
|
+
getDocumentText(docName: string): Promise<string>;
|
|
48
|
+
createVersion(docName: string, createdBy: string | null, label: string | null): Promise<CollabVersion>;
|
|
49
|
+
listVersions(docName: string): Promise<CollabVersion[]>;
|
|
50
|
+
restoreVersion(docName: string, versionId: string, restoredBy: string | null): Promise<void>;
|
|
51
|
+
diffVersions(docName: string, aId: string, bId: string): Promise<CollabDiffSummary>;
|
|
52
|
+
close(): Promise<void>;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=partykit_driver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"partykit_driver.d.ts","sourceRoot":"","sources":["../../../../src/drivers/partykit/partykit_driver.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAClF,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAwB,MAAM,gBAAgB,CAAC;AAI7F;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE7E,gDAAgD;AAChD,qBAAa,iBAAkB,SAAQ,KAAK;aAExB,MAAM,EAAE,MAAM;aACd,IAAI,EAAE,MAAM;aACZ,OAAO,EAAE,MAAM;gBAFf,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM;CAKlC;AAED,qBAAa,cAAe,YAAW,mBAAmB;IACxD,QAAQ,CAAC,MAAM,cAAc;IAE7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;gBAEnC,OAAO,EAAE,qBAAqB;IAK1C,0EAA0E;IAC1E,OAAO,CAAC,WAAW;IAWnB,4CAA4C;IAC5C,OAAO,CAAC,OAAO;IAOf,2DAA2D;YAC7C,WAAW;IAsBzB;;;;OAIG;IACG,MAAM,CAAC,OAAO,EAAE,OAAO,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1D,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAWtD,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAWjD,aAAa,CACjB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,KAAK,EAAE,MAAM,GAAG,IAAI,GACnB,OAAO,CAAC,aAAa,CAAC;IASnB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAIvD,cAAc,CAClB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GAAG,IAAI,GACxB,OAAO,CAAC,IAAI,CAAC;IAkBV,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAsBnF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
|