@adonis-agora/collaboration 0.11.0 → 0.13.0
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 +156 -0
- package/dist/providers/collaboration_provider.d.ts.map +1 -1
- package/dist/providers/collaboration_provider.js +4 -0
- package/dist/providers/collaboration_provider.js.map +1 -1
- package/dist/src/auth/secret.d.ts +48 -0
- package/dist/src/auth/secret.d.ts.map +1 -0
- package/dist/src/auth/secret.js +95 -0
- package/dist/src/auth/secret.js.map +1 -0
- package/dist/src/auth/token.d.ts +111 -14
- package/dist/src/auth/token.d.ts.map +1 -1
- package/dist/src/auth/token.js +95 -14
- package/dist/src/auth/token.js.map +1 -1
- package/dist/src/collaboration_manager.d.ts +72 -7
- package/dist/src/collaboration_manager.d.ts.map +1 -1
- package/dist/src/collaboration_manager.js +131 -1
- package/dist/src/collaboration_manager.js.map +1 -1
- package/dist/src/define_config.d.ts +5 -0
- package/dist/src/define_config.d.ts.map +1 -1
- package/dist/src/define_config.js.map +1 -1
- package/dist/src/documents.d.ts +100 -0
- package/dist/src/documents.d.ts.map +1 -1
- package/dist/src/documents.js +49 -0
- package/dist/src/documents.js.map +1 -1
- package/dist/src/driver.d.ts +53 -0
- package/dist/src/driver.d.ts.map +1 -1
- package/dist/src/driver.js +4 -1
- package/dist/src/driver.js.map +1 -1
- package/dist/src/drivers/automerge/automerge_driver.d.ts +25 -0
- package/dist/src/drivers/automerge/automerge_driver.d.ts.map +1 -1
- package/dist/src/drivers/automerge/automerge_driver.js +105 -16
- package/dist/src/drivers/automerge/automerge_driver.js.map +1 -1
- package/dist/src/drivers/partykit/partykit_driver.d.ts +5 -0
- package/dist/src/drivers/partykit/partykit_driver.d.ts.map +1 -1
- package/dist/src/drivers/partykit/partykit_driver.js +13 -7
- package/dist/src/drivers/partykit/partykit_driver.js.map +1 -1
- package/dist/src/drivers/yjs/yjs_driver.d.ts +16 -4
- package/dist/src/drivers/yjs/yjs_driver.d.ts.map +1 -1
- package/dist/src/drivers/yjs/yjs_driver.js +168 -17
- package/dist/src/drivers/yjs/yjs_driver.js.map +1 -1
- package/dist/src/http/types.d.ts +21 -3
- package/dist/src/http/types.d.ts.map +1 -1
- package/dist/src/http/types.js.map +1 -1
- package/dist/src/index.d.ts +9 -6
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +6 -4
- package/dist/src/index.js.map +1 -1
- package/dist/src/observability.d.ts +11 -0
- package/dist/src/observability.d.ts.map +1 -1
- package/dist/src/observability.js +18 -0
- package/dist/src/observability.js.map +1 -1
- package/dist/src/routes.d.ts +74 -2
- package/dist/src/routes.d.ts.map +1 -1
- package/dist/src/routes.js +147 -9
- package/dist/src/routes.js.map +1 -1
- package/dist/src/types.d.ts +45 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/stubs/config/collaboration.stub +8 -0
- package/dist/stubs/partykit/worker/party.ts.stub +35 -4
- package/package.json +1 -1
package/dist/src/documents.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Doc as YDoc } from 'yjs';
|
|
1
2
|
import type { CollabConnectionContext, CollaborationEngine, CollabPermission } from './types.js';
|
|
2
3
|
/**
|
|
3
4
|
* The `:name` segments of a document pattern, as the object
|
|
@@ -12,6 +13,27 @@ export type DocumentParams<Pattern extends string> = string extends Pattern ? Re
|
|
|
12
13
|
[Name in DocumentParamNames<Pattern>]: string;
|
|
13
14
|
};
|
|
14
15
|
type DocumentParamNames<Pattern extends string> = Pattern extends `${infer Head}/${infer Rest}` ? DocumentParamNames<Head> | DocumentParamNames<Rest> : Pattern extends `:${infer Name}` ? Name : never;
|
|
16
|
+
/**
|
|
17
|
+
* What {@link CollabDocumentDeclaration.load} may hand back.
|
|
18
|
+
*
|
|
19
|
+
* A `Uint8Array` is the document's state in its **engine's own** binary format
|
|
20
|
+
* — a Yjs update (`Y.encodeStateAsUpdate(doc)`), an Automerge save
|
|
21
|
+
* (`A.save(doc)`). It is the only form every engine understands, so it is the
|
|
22
|
+
* one to reach for.
|
|
23
|
+
*
|
|
24
|
+
* A `Y.Doc` is accepted as a shortcut for the Yjs engine, because building a
|
|
25
|
+
* seed there usually means running the app's own content through a transformer
|
|
26
|
+
* that already returns one (`TiptapTransformer.toYdoc(json, 'default')`), and
|
|
27
|
+
* encoding it by hand is a line of ceremony with nothing to decide in it. The
|
|
28
|
+
* type is Yjs's because the convenience is Yjs's: an Automerge seed arrives as
|
|
29
|
+
* `A.save(doc)`, and a `Y.Doc` handed to a non-Yjs document is reported and
|
|
30
|
+
* ignored instead of guessed at. Nothing here mentions Tiptap — the editor is
|
|
31
|
+
* the app's business, the bytes are ours.
|
|
32
|
+
*
|
|
33
|
+
* `null`/`undefined` means "nothing to seed": the document opens empty and the
|
|
34
|
+
* hook is asked again the next time it is opened.
|
|
35
|
+
*/
|
|
36
|
+
export type CollabDocumentSeed = Uint8Array | YDoc | null | undefined;
|
|
15
37
|
/**
|
|
16
38
|
* Declaração declarativa de um documento colaborativo.
|
|
17
39
|
*
|
|
@@ -35,6 +57,11 @@ type DocumentParamNames<Pattern extends string> = Pattern extends `${infer Head}
|
|
|
35
57
|
* ? { canRead: true, canWrite: true, canComment: true }
|
|
36
58
|
* : { canRead: false, canWrite: false, canComment: false }
|
|
37
59
|
* },
|
|
60
|
+
* async load({ params }) {
|
|
61
|
+
* const research = await Research.find(params.id)
|
|
62
|
+
* if (!research?.body) return null
|
|
63
|
+
* return TiptapTransformer.toYdoc(research.body, 'default')
|
|
64
|
+
* },
|
|
38
65
|
* },
|
|
39
66
|
* }
|
|
40
67
|
*/
|
|
@@ -51,6 +78,38 @@ export interface CollabDocumentDeclaration<P extends Record<string, string> = Re
|
|
|
51
78
|
docName: string;
|
|
52
79
|
params: P;
|
|
53
80
|
}) => Promise<CollabPermission>;
|
|
81
|
+
/**
|
|
82
|
+
* Initial content for a document the storage has **never** stored — the
|
|
83
|
+
* `params` are typed from the key, exactly like `authorize`'s.
|
|
84
|
+
*
|
|
85
|
+
* Called when the document is opened and the storage has nothing under its
|
|
86
|
+
* name; the result is persisted right away, so the next connection loads it
|
|
87
|
+
* from storage and the hook is never asked about that document again. It is
|
|
88
|
+
* how a document whose real content lives elsewhere (a `researches.body`
|
|
89
|
+
* column, an imported file) is born holding that content instead of empty.
|
|
90
|
+
*
|
|
91
|
+
* Without it, seeding is the app's problem, and the app can only solve it
|
|
92
|
+
* from a request it *knows* precedes the WebSocket — which is a race
|
|
93
|
+
* dressed up as an ordering. Losing that race is not merely wrong, it is
|
|
94
|
+
* destructive: the editor mounts against an empty CRDT document, the CRDT
|
|
95
|
+
* is what the editor shows, and the first autosave writes that emptiness
|
|
96
|
+
* over the text in the database. That is a real dissertation, lost on
|
|
97
|
+
* 2026-08-28.
|
|
98
|
+
*
|
|
99
|
+
* It receives the document, not the connection. The first client to open a
|
|
100
|
+
* new document decides what every later one sees, so a seed that varied
|
|
101
|
+
* with `ctx` would freeze whoever arrived first into everyone else's
|
|
102
|
+
* document — a per-user document is a different document, with a different
|
|
103
|
+
* name.
|
|
104
|
+
*
|
|
105
|
+
* A `load` that throws is reported on the observability seam and the
|
|
106
|
+
* document opens empty: a broken seed must not become a failed
|
|
107
|
+
* handshake that the client then retries forever.
|
|
108
|
+
*/
|
|
109
|
+
load?: (info: {
|
|
110
|
+
docName: string;
|
|
111
|
+
params: P;
|
|
112
|
+
}) => Promise<CollabDocumentSeed>;
|
|
54
113
|
}
|
|
55
114
|
/**
|
|
56
115
|
* Identity helper for declaring a document **outside** `config/collaboration.ts`
|
|
@@ -64,6 +123,47 @@ export interface CollabDocumentDeclaration<P extends Record<string, string> = Re
|
|
|
64
123
|
* pattern it is later attached to is a compile error at the config.
|
|
65
124
|
*/
|
|
66
125
|
export declare function defineDocument<P extends Record<string, string> = Record<string, string>>(declaration: CollabDocumentDeclaration<P>): CollabDocumentDeclaration<P>;
|
|
126
|
+
/** The pattern {@link defineCollection} declares for a prefix. */
|
|
127
|
+
export type CollectionPattern<Prefix extends string> = `${Prefix}/:id`;
|
|
128
|
+
/**
|
|
129
|
+
* Declares a **collection**: many documents named `<prefix>/<id>` that share
|
|
130
|
+
* one engine and one rule — the shape almost every document type has.
|
|
131
|
+
*
|
|
132
|
+
* A pattern only matches many documents when it has a `:segment`; a bare
|
|
133
|
+
* `'whiteboards'` matches exactly one document named `whiteboards`. This
|
|
134
|
+
* helper makes the common case impossible to get wrong: give it the prefix
|
|
135
|
+
* and it declares `'<prefix>/:id'`, with `params.id` typed in `authorize`.
|
|
136
|
+
* Spread it into `documents`:
|
|
137
|
+
*
|
|
138
|
+
* @example
|
|
139
|
+
* documents: {
|
|
140
|
+
* ...defineCollection('whiteboards', {
|
|
141
|
+
* engine: 'automerge',
|
|
142
|
+
* async authorize(ctx, { params }) {
|
|
143
|
+
* const member = await Whiteboard.isMember(params.id, ctx.userId)
|
|
144
|
+
* return { canRead: member, canWrite: member, canComment: member }
|
|
145
|
+
* },
|
|
146
|
+
* }),
|
|
147
|
+
* ...defineCollection('announcements'), // engine + authorize from the globals
|
|
148
|
+
* }
|
|
149
|
+
*
|
|
150
|
+
* The prefix is the literal part of the name: no `:params`, no leading or
|
|
151
|
+
* trailing slash. Nested literals are fine (`'workspaces/main/boards'`). For a
|
|
152
|
+
* shape that is not `<prefix>/<id>` — several params, a suffix like
|
|
153
|
+
* `researches/:id/writing` — write the pattern out as a key instead.
|
|
154
|
+
*/
|
|
155
|
+
export declare function defineCollection<Prefix extends string>(prefix: Prefix, declaration?: CollabDocumentDeclaration<{
|
|
156
|
+
id: string;
|
|
157
|
+
}>): {
|
|
158
|
+
[K in CollectionPattern<Prefix>]: CollabDocumentDeclaration<{
|
|
159
|
+
id: string;
|
|
160
|
+
}>;
|
|
161
|
+
};
|
|
162
|
+
/**
|
|
163
|
+
* The `:name` segments of a pattern, in order — `[]` for a pattern that
|
|
164
|
+
* matches exactly one document.
|
|
165
|
+
*/
|
|
166
|
+
export declare function documentPatternParams(pattern: string): string[];
|
|
67
167
|
/**
|
|
68
168
|
* Casa um docName com um padrão `researches/:id/writing`, extraindo os
|
|
69
169
|
* params nomeados. Retorna null se não casar.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../../src/documents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEjG;;;;;;;;GAQG;AACH,MAAM,MAAM,cAAc,CAAC,OAAO,SAAS,MAAM,IAAI,MAAM,SAAS,OAAO,GACvE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACtB;KAAG,IAAI,IAAI,kBAAkB,CAAC,OAAO,CAAC,GAAG,MAAM;CAAE,CAAC;AAEtD,KAAK,kBAAkB,CAAC,OAAO,SAAS,MAAM,IAAI,OAAO,SAAS,GAAG,MAAM,IAAI,IAAI,MAAM,IAAI,EAAE,GAC3F,kBAAkB,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,IAAI,CAAC,GACnD,OAAO,SAAS,IAAI,MAAM,IAAI,EAAE,GAC9B,IAAI,GACJ,KAAK,CAAC;AAEZ
|
|
1
|
+
{"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../../src/documents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,IAAI,IAAI,EAAE,MAAM,KAAK,CAAC;AACvC,OAAO,KAAK,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEjG;;;;;;;;GAQG;AACH,MAAM,MAAM,cAAc,CAAC,OAAO,SAAS,MAAM,IAAI,MAAM,SAAS,OAAO,GACvE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACtB;KAAG,IAAI,IAAI,kBAAkB,CAAC,OAAO,CAAC,GAAG,MAAM;CAAE,CAAC;AAEtD,KAAK,kBAAkB,CAAC,OAAO,SAAS,MAAM,IAAI,OAAO,SAAS,GAAG,MAAM,IAAI,IAAI,MAAM,IAAI,EAAE,GAC3F,kBAAkB,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,IAAI,CAAC,GACnD,OAAO,SAAS,IAAI,MAAM,IAAI,EAAE,GAC9B,IAAI,GACJ,KAAK,CAAC;AAEZ;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,CAAC;AAEtE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,WAAW,yBAAyB,CACxC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAEzD,iEAAiE;IACjE,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,CACV,GAAG,EAAE,uBAAuB,EAC5B,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,CAAC,CAAA;KAAE,KACjC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC/B;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,CAAC,CAAA;KAAE,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;CAC9E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACtF,WAAW,EAAE,yBAAyB,CAAC,CAAC,CAAC,GACxC,yBAAyB,CAAC,CAAC,CAAC,CAE9B;AAED,kEAAkE;AAClE,MAAM,MAAM,iBAAiB,CAAC,MAAM,SAAS,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC;AAEvE;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,SAAS,MAAM,EACpD,MAAM,EAAE,MAAM,EACd,WAAW,GAAE,yBAAyB,CAAC;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAAM,GAC1D;KAAG,CAAC,IAAI,iBAAiB,CAAC,MAAM,CAAC,GAAG,yBAAyB,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;CAAE,CAiBjF;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAK/D;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAe/B"}
|
package/dist/src/documents.js
CHANGED
|
@@ -12,6 +12,55 @@
|
|
|
12
12
|
export function defineDocument(declaration) {
|
|
13
13
|
return declaration;
|
|
14
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* Declares a **collection**: many documents named `<prefix>/<id>` that share
|
|
17
|
+
* one engine and one rule — the shape almost every document type has.
|
|
18
|
+
*
|
|
19
|
+
* A pattern only matches many documents when it has a `:segment`; a bare
|
|
20
|
+
* `'whiteboards'` matches exactly one document named `whiteboards`. This
|
|
21
|
+
* helper makes the common case impossible to get wrong: give it the prefix
|
|
22
|
+
* and it declares `'<prefix>/:id'`, with `params.id` typed in `authorize`.
|
|
23
|
+
* Spread it into `documents`:
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* documents: {
|
|
27
|
+
* ...defineCollection('whiteboards', {
|
|
28
|
+
* engine: 'automerge',
|
|
29
|
+
* async authorize(ctx, { params }) {
|
|
30
|
+
* const member = await Whiteboard.isMember(params.id, ctx.userId)
|
|
31
|
+
* return { canRead: member, canWrite: member, canComment: member }
|
|
32
|
+
* },
|
|
33
|
+
* }),
|
|
34
|
+
* ...defineCollection('announcements'), // engine + authorize from the globals
|
|
35
|
+
* }
|
|
36
|
+
*
|
|
37
|
+
* The prefix is the literal part of the name: no `:params`, no leading or
|
|
38
|
+
* trailing slash. Nested literals are fine (`'workspaces/main/boards'`). For a
|
|
39
|
+
* shape that is not `<prefix>/<id>` — several params, a suffix like
|
|
40
|
+
* `researches/:id/writing` — write the pattern out as a key instead.
|
|
41
|
+
*/
|
|
42
|
+
export function defineCollection(prefix, declaration = {}) {
|
|
43
|
+
if (prefix === '' ||
|
|
44
|
+
prefix.includes(':') ||
|
|
45
|
+
prefix.startsWith('/') ||
|
|
46
|
+
prefix.endsWith('/') ||
|
|
47
|
+
prefix.includes('//')) {
|
|
48
|
+
throw new Error(`[@adonis-agora/collaboration] defineCollection(${JSON.stringify(prefix)}): the prefix is ` +
|
|
49
|
+
'the literal part of the document name — no ":params", no leading or trailing "/". ' +
|
|
50
|
+
'defineCollection("whiteboards") declares "whiteboards/:id".');
|
|
51
|
+
}
|
|
52
|
+
return { [`${prefix}/:id`]: declaration };
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* The `:name` segments of a pattern, in order — `[]` for a pattern that
|
|
56
|
+
* matches exactly one document.
|
|
57
|
+
*/
|
|
58
|
+
export function documentPatternParams(pattern) {
|
|
59
|
+
return pattern
|
|
60
|
+
.split('/')
|
|
61
|
+
.filter((segment) => segment.startsWith(':'))
|
|
62
|
+
.map((segment) => segment.slice(1));
|
|
63
|
+
}
|
|
15
64
|
/**
|
|
16
65
|
* Casa um docName com um padrão `researches/:id/writing`, extraindo os
|
|
17
66
|
* params nomeados. Retorna null se não casar.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"documents.js","sourceRoot":"","sources":["../../src/documents.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"documents.js","sourceRoot":"","sources":["../../src/documents.ts"],"names":[],"mappings":"AAyHA;;;;;;;;;;GAUG;AACH,MAAM,UAAU,cAAc,CAC5B,WAAyC;IAEzC,OAAO,WAAW,CAAC;AACrB,CAAC;AAKD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAAc,EACd,WAAW,GAA8C,EAAE;IAE3D,IACE,MAAM,KAAK,EAAE;QACb,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;QACpB,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;QACtB,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;QACpB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EACrB,CAAC;QACD,MAAM,IAAI,KAAK,CACb,kDAAkD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,mBAAmB;YACzF,oFAAoF;YACpF,6DAA6D,CAChE,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,CAAC,GAAG,MAAM,MAAM,CAAC,EAAE,WAAW,EAEtC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,OAAO,OAAO;SACX,KAAK,CAAC,GAAG,CAAC;SACV,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;SAC5C,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACxC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAe,EACf,OAAe;IAEf,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEhD,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAE,CAAC;QAC3B,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAE,CAAC;QACzC,CAAC;aAAM,IAAI,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/src/driver.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import type { CollabTokenSecret } from './auth/secret.js';
|
|
1
2
|
import type { AuthorizeFn } from './auth/token.js';
|
|
3
|
+
import type { CollabDocumentSeed } from './documents.js';
|
|
2
4
|
import type { CollabComment, CollabConnectionContext, CollabDiffSummary, CollaborationConfig, CollaborationStorage, CollabPermission, CollabVersion, PartyKitConfig } from './types.js';
|
|
3
5
|
/**
|
|
4
6
|
* Contract for a CRDT driver. The driver owns the engine (Yjs/Hocuspocus or
|
|
@@ -22,18 +24,69 @@ export interface CollaborationDriver {
|
|
|
22
24
|
restoreVersion(docName: string, versionId: string, restoredBy: string | null): Promise<void>;
|
|
23
25
|
/** Diff summary between two versions. */
|
|
24
26
|
diffVersions(docName: string, aId: string, bId: string): Promise<CollabDiffSummary>;
|
|
27
|
+
/**
|
|
28
|
+
* Binary state stored for one version — what `getDocumentState` is to the
|
|
29
|
+
* present, this is to a point in the history. Apps that already read the
|
|
30
|
+
* live state to export it (text extraction, a push to Drive) need the same
|
|
31
|
+
* for "the document as it was at version X"; without it on the contract
|
|
32
|
+
* they reached in through a cast, which is how a private method becomes a
|
|
33
|
+
* de-facto public one that nobody may rename.
|
|
34
|
+
*/
|
|
35
|
+
getVersionState(docName: string, versionId: string): Promise<Uint8Array>;
|
|
25
36
|
/** Gracefully shuts down (flush + closes connections). */
|
|
26
37
|
close(): Promise<void>;
|
|
27
38
|
}
|
|
39
|
+
/**
|
|
40
|
+
* Drivers that keep the document alive **in this process** and can hand the
|
|
41
|
+
* instance over for direct work.
|
|
42
|
+
*
|
|
43
|
+
* Optional on the driver contract on purpose: a `partykit` document lives on
|
|
44
|
+
* the edge and there is no in-process instance to give, so the engine says so
|
|
45
|
+
* by not implementing this rather than by returning a convincing fake. Ask
|
|
46
|
+
* with {@link supportsLiveDocuments} instead of casting — the manager routes
|
|
47
|
+
* by document name and only learns the engine afterwards.
|
|
48
|
+
*
|
|
49
|
+
* The document is Yjs's own type, not a wrapper. Everything a caller comes
|
|
50
|
+
* here for — merging an external change into what is on screen, reading the
|
|
51
|
+
* text without waiting for a flush — is a `transact()` that has to fan out to
|
|
52
|
+
* the connected clients, and a wrapper around that would only be a worse
|
|
53
|
+
* `Y.Doc`. The engine leaks here because this IS the engine-specific seam;
|
|
54
|
+
* the manager stays engine-agnostic by asking whether the seam exists.
|
|
55
|
+
*/
|
|
56
|
+
export interface LiveDocumentDriver {
|
|
57
|
+
/** The live document, or `undefined` when nobody has it open here. */
|
|
58
|
+
liveDocument(docName: string): import('yjs').Doc | undefined;
|
|
59
|
+
}
|
|
60
|
+
/** Whether this driver keeps live in-process documents ({@link LiveDocumentDriver}). */
|
|
61
|
+
export declare function supportsLiveDocuments(driver: CollaborationDriver): driver is CollaborationDriver & LiveDocumentDriver;
|
|
28
62
|
/** Narrow dependencies for self-hosted engines (Yjs/Automerge). */
|
|
29
63
|
import type { PresenceService } from './services/presence_service.js';
|
|
30
64
|
export interface SelfHostedDriverOptions {
|
|
31
65
|
storage?: CollaborationStorage;
|
|
32
66
|
authorize: AuthorizeFn;
|
|
67
|
+
/**
|
|
68
|
+
* Key the handshake verifies tokens against — the same one the issuer
|
|
69
|
+
* signs with, resolved through `auth/secret.ts`.
|
|
70
|
+
*
|
|
71
|
+
* Required, and deliberately not optional: a driver built without it would
|
|
72
|
+
* have to choose between refusing every connection and accepting unsigned
|
|
73
|
+
* ones, and the second choice is the vulnerability this replaced (an
|
|
74
|
+
* unauthenticated client sending `base64({"userId":"<victim>"})` was
|
|
75
|
+
* authorized as that user). The manager passes a resolver that reads the
|
|
76
|
+
* app key, so an app configures nothing.
|
|
77
|
+
*/
|
|
78
|
+
tokenSecret: CollabTokenSecret;
|
|
33
79
|
path?: string;
|
|
34
80
|
debounce?: number;
|
|
35
81
|
/** Alimenta presença server-side (cross-instance) no connect/disconnect. */
|
|
36
82
|
presence?: PresenceService;
|
|
83
|
+
/**
|
|
84
|
+
* Initial content for a document the storage has never stored — the manager
|
|
85
|
+
* resolves it from the matching `documents` declaration's `load`. The driver
|
|
86
|
+
* asks once, when it is about to open an empty document, and persists what
|
|
87
|
+
* it gets back before serving it.
|
|
88
|
+
*/
|
|
89
|
+
seedDocument?: (docName: string) => Promise<CollabDocumentSeed>;
|
|
37
90
|
}
|
|
38
91
|
/** Narrow dependencies for the edge engine (PartyKit). */
|
|
39
92
|
export interface PartyKitDriverOptions {
|
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,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EACV,aAAa,EACb,uBAAuB,EACvB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,EAChB,aAAa,EACb,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,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEtE,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;IAClB,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../../src/driver.ts"],"names":[],"mappings":"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"}
|
package/dist/src/driver.js
CHANGED
package/dist/src/driver.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"driver.js","sourceRoot":"","sources":["../../src/driver.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"driver.js","sourceRoot":"","sources":["../../src/driver.ts"],"names":[],"mappings":"AAqFA,wFAAwF;AACxF,MAAM,UAAU,qBAAqB,CACnC,MAA2B;IAE3B,OAAO,OAAQ,MAAsC,CAAC,YAAY,KAAK,UAAU,CAAC;AACpF,CAAC"}
|
|
@@ -7,8 +7,31 @@ export declare class AutomergeDriver implements CollaborationDriver {
|
|
|
7
7
|
private readonly options;
|
|
8
8
|
private readonly storage;
|
|
9
9
|
private persistTimers;
|
|
10
|
+
/**
|
|
11
|
+
* Rooms being opened, by document name.
|
|
12
|
+
*
|
|
13
|
+
* `loadRoom` reads the storage before it registers the room, so two
|
|
14
|
+
* messages arriving on a cold document used to open it twice and the second
|
|
15
|
+
* `rooms.set` threw the first room — and its clients' merges — away. With a
|
|
16
|
+
* seeding `load` in the picture that stops being a lost update and becomes
|
|
17
|
+
* duplicated content, so the window has to close.
|
|
18
|
+
*/
|
|
19
|
+
private roomLoads;
|
|
10
20
|
constructor(options: SelfHostedDriverOptions);
|
|
11
21
|
private loadRoom;
|
|
22
|
+
private openRoom;
|
|
23
|
+
/**
|
|
24
|
+
* The document a name is born with: the declaration's `load`, else the
|
|
25
|
+
* empty `{ content: '' }` this driver has always started from.
|
|
26
|
+
*
|
|
27
|
+
* Automerge gets the hook for the same reason Yjs does — the room is the
|
|
28
|
+
* only copy the clients will ever see, so content that is not in it when
|
|
29
|
+
* the first client connects is content the first save will erase. What it
|
|
30
|
+
* does NOT get is the `Y.Doc` shortcut: seeds arrive here as `A.save(doc)`
|
|
31
|
+
* bytes, and anything else is a configuration mistake worth naming rather
|
|
32
|
+
* than a document worth guessing at.
|
|
33
|
+
*/
|
|
34
|
+
private seedDocument;
|
|
12
35
|
private broadcast;
|
|
13
36
|
attach(server: import('node:http').Server): Promise<void>;
|
|
14
37
|
private handleClientMessage;
|
|
@@ -25,6 +48,8 @@ export declare class AutomergeDriver implements CollaborationDriver {
|
|
|
25
48
|
* that leaves no entry in it is a restore nobody can undo.
|
|
26
49
|
*/
|
|
27
50
|
restoreVersion(docName: string, versionId: string, restoredBy: string | null): Promise<void>;
|
|
51
|
+
/** Binary state stored for a version (`A.save` of the doc at that point). */
|
|
52
|
+
getVersionState(docName: string, versionId: string): Promise<Uint8Array>;
|
|
28
53
|
diffVersions(docName: string, aId: string, bId: string): Promise<CollabDiffSummary>;
|
|
29
54
|
close(): Promise<void>;
|
|
30
55
|
}
|
|
@@ -1 +1 @@
|
|
|
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;AAEpF,OAAO,KAAK,EACV,iBAAiB,EAGjB,aAAa,EACd,MAAM,gBAAgB,CAAC;AA+BxB,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;
|
|
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;AAEpF,OAAO,KAAK,EACV,iBAAiB,EAGjB,aAAa,EACd,MAAM,gBAAgB,CAAC;AA+BxB,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;IACzE;;;;;;;;OAQG;IACH,OAAO,CAAC,SAAS,CAAoC;IAErD,YAAY,OAAO,EAAE,uBAAuB,EAG3C;IAED,OAAO,CAAC,QAAQ;YAYF,QAAQ;IAWtB;;;;;;;;;;OAUG;YAEW,YAAY;IA0C1B,OAAO,CAAC,SAAS;IAQX,MAAM,CAAC,MAAM,EAAE,OAAO,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2G9D;YAGa,mBAAmB;IAkBjC,OAAO,CAAC,gBAAgB;IAwBlB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAG3D;IAEK,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAItD;IAED,+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,CAcxB;IAEK,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAE5D;IAED;;;;;OAKG;IACG,cAAc,CAClB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GAAG,IAAI,GACxB,OAAO,CAAC,IAAI,CAAC,CAgCf;IAED,6EAA6E;IACvE,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAI7E;IAEK,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAYxF;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAS3B;CACF"}
|
|
@@ -1,8 +1,8 @@
|
|
|
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 {
|
|
5
|
-
import { reportCollaborationError } from '../../observability.js';
|
|
4
|
+
import { verifySelfHostedToken } from '../../auth/token.js';
|
|
5
|
+
import { reportCollaborationError, reportCollaborationWarning } from '../../observability.js';
|
|
6
6
|
import { createVersionMetadata, restoredFromLabel, seqVersions } from '../../versioning.js';
|
|
7
7
|
import { lineDiff, resolveStorage } from '../shared.js';
|
|
8
8
|
/**
|
|
@@ -30,22 +30,91 @@ export class AutomergeDriver {
|
|
|
30
30
|
options;
|
|
31
31
|
storage;
|
|
32
32
|
persistTimers = new Map();
|
|
33
|
+
/**
|
|
34
|
+
* Rooms being opened, by document name.
|
|
35
|
+
*
|
|
36
|
+
* `loadRoom` reads the storage before it registers the room, so two
|
|
37
|
+
* messages arriving on a cold document used to open it twice and the second
|
|
38
|
+
* `rooms.set` threw the first room — and its clients' merges — away. With a
|
|
39
|
+
* seeding `load` in the picture that stops being a lost update and becomes
|
|
40
|
+
* duplicated content, so the window has to close.
|
|
41
|
+
*/
|
|
42
|
+
roomLoads = new Map();
|
|
33
43
|
constructor(options) {
|
|
34
44
|
this.options = options;
|
|
35
45
|
this.storage = resolveStorage(options.storage);
|
|
36
46
|
}
|
|
37
|
-
|
|
38
|
-
|
|
47
|
+
loadRoom(docName) {
|
|
48
|
+
const room = this.rooms.get(docName);
|
|
39
49
|
if (room)
|
|
40
|
-
return room;
|
|
50
|
+
return Promise.resolve(room);
|
|
51
|
+
const loading = this.roomLoads.get(docName);
|
|
52
|
+
if (loading)
|
|
53
|
+
return loading;
|
|
54
|
+
const opening = this.openRoom(docName);
|
|
55
|
+
this.roomLoads.set(docName, opening);
|
|
56
|
+
return opening.finally(() => this.roomLoads.delete(docName));
|
|
57
|
+
}
|
|
58
|
+
async openRoom(docName) {
|
|
41
59
|
const stored = await this.storage.loadDocument(docName);
|
|
42
60
|
const doc = stored
|
|
43
61
|
? A.load(stored.state)
|
|
44
|
-
:
|
|
45
|
-
room = { text: doc, clients: new Set() };
|
|
62
|
+
: await this.seedDocument(docName);
|
|
63
|
+
const room = { text: doc, clients: new Set() };
|
|
46
64
|
this.rooms.set(docName, room);
|
|
47
65
|
return room;
|
|
48
66
|
}
|
|
67
|
+
/**
|
|
68
|
+
* The document a name is born with: the declaration's `load`, else the
|
|
69
|
+
* empty `{ content: '' }` this driver has always started from.
|
|
70
|
+
*
|
|
71
|
+
* Automerge gets the hook for the same reason Yjs does — the room is the
|
|
72
|
+
* only copy the clients will ever see, so content that is not in it when
|
|
73
|
+
* the first client connects is content the first save will erase. What it
|
|
74
|
+
* does NOT get is the `Y.Doc` shortcut: seeds arrive here as `A.save(doc)`
|
|
75
|
+
* bytes, and anything else is a configuration mistake worth naming rather
|
|
76
|
+
* than a document worth guessing at.
|
|
77
|
+
*/
|
|
78
|
+
// biome-ignore lint/suspicious/noExplicitAny: automerge's typing is unstable between minors
|
|
79
|
+
async seedDocument(docName) {
|
|
80
|
+
const empty = () => A.from({ content: '' });
|
|
81
|
+
if (!this.options.seedDocument)
|
|
82
|
+
return empty();
|
|
83
|
+
let seed;
|
|
84
|
+
try {
|
|
85
|
+
seed = await this.options.seedDocument(docName);
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
// A failing seed opens the document empty; it must never close the
|
|
89
|
+
// connection, which the client would only retry.
|
|
90
|
+
reportCollaborationError({ scope: 'storage', operation: 'loadDocument', docName, error });
|
|
91
|
+
return empty();
|
|
92
|
+
}
|
|
93
|
+
if (!seed)
|
|
94
|
+
return empty();
|
|
95
|
+
if (!(seed instanceof Uint8Array)) {
|
|
96
|
+
reportCollaborationWarning({ docName }, `document "${docName}" runs on the automerge engine, but its load() returned a Y.Doc — ` +
|
|
97
|
+
'an Automerge seed is the bytes of A.save(doc). Opening the document empty.');
|
|
98
|
+
return empty();
|
|
99
|
+
}
|
|
100
|
+
let doc;
|
|
101
|
+
try {
|
|
102
|
+
doc = A.load(seed);
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
reportCollaborationError({ scope: 'storage', operation: 'loadDocument', docName, error });
|
|
106
|
+
return empty();
|
|
107
|
+
}
|
|
108
|
+
// Persisted before it is served: without this the hook would run again on
|
|
109
|
+
// every cold room, and the app would pay the read every time.
|
|
110
|
+
try {
|
|
111
|
+
await this.storage.saveDocument(docName, seed);
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
reportCollaborationError({ scope: 'storage', operation: 'saveDocument', docName, error });
|
|
115
|
+
}
|
|
116
|
+
return doc;
|
|
117
|
+
}
|
|
49
118
|
broadcast(room, payload, sender) {
|
|
50
119
|
for (const client of room.clients) {
|
|
51
120
|
if (client !== sender && client.readyState === 1) {
|
|
@@ -67,13 +136,30 @@ export class AutomergeDriver {
|
|
|
67
136
|
ws.close(4000, 'doc required');
|
|
68
137
|
return;
|
|
69
138
|
}
|
|
70
|
-
// Authentication:
|
|
139
|
+
// Authentication: signed token in the query (?token=...&doc=...).
|
|
140
|
+
//
|
|
141
|
+
// Verified, not decoded. This used to accept the base64 of any JSON
|
|
142
|
+
// with a `userId` in it, which made the query string an identity
|
|
143
|
+
// claim anyone could write: no session, no cookie, no login — just
|
|
144
|
+
// `?token=base64({"userId":"<victim>"})` and the room opened as them.
|
|
145
|
+
// `docName` is the document this socket asked for, so the check also
|
|
146
|
+
// pins the token to it.
|
|
71
147
|
const token = url.searchParams.get('token');
|
|
72
148
|
if (!token) {
|
|
73
149
|
ws.close(4001, 'not authenticated');
|
|
74
150
|
return;
|
|
75
151
|
}
|
|
76
|
-
|
|
152
|
+
let ctx;
|
|
153
|
+
try {
|
|
154
|
+
ctx = await verifySelfHostedToken(token, docName, this.options.tokenSecret);
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
// No signing key: a server misconfiguration, and a distinct answer
|
|
158
|
+
// from a rejected token so the logs say which one happened.
|
|
159
|
+
reportCollaborationError({ scope: 'authorize', operation: 'upgrade', docName, error });
|
|
160
|
+
ws.close(4503, 'authentication unavailable');
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
77
163
|
if (!ctx) {
|
|
78
164
|
ws.close(4001, 'authentication failed');
|
|
79
165
|
return;
|
|
@@ -206,9 +292,7 @@ export class AutomergeDriver {
|
|
|
206
292
|
* that leaves no entry in it is a restore nobody can undo.
|
|
207
293
|
*/
|
|
208
294
|
async restoreVersion(docName, versionId, restoredBy) {
|
|
209
|
-
const bytes = await this.
|
|
210
|
-
if (!bytes)
|
|
211
|
-
throw new Error(`Version ${versionId} not found`);
|
|
295
|
+
const bytes = await this.getVersionState(docName, versionId);
|
|
212
296
|
const snapshotDoc = A.load(bytes);
|
|
213
297
|
const room = await this.loadRoom(docName);
|
|
214
298
|
const existing = await this.storage.listVersions(docName);
|
|
@@ -229,13 +313,18 @@ export class AutomergeDriver {
|
|
|
229
313
|
this.broadcast(room, A.save(finalDoc));
|
|
230
314
|
await this.storage.saveDocument(docName, A.save(finalDoc));
|
|
231
315
|
}
|
|
316
|
+
/** Binary state stored for a version (`A.save` of the doc at that point). */
|
|
317
|
+
async getVersionState(docName, versionId) {
|
|
318
|
+
const persisted = await this.storage.loadVersionSnapshot(docName, versionId);
|
|
319
|
+
if (!persisted)
|
|
320
|
+
throw new Error(`Version ${versionId} not found`);
|
|
321
|
+
return persisted;
|
|
322
|
+
}
|
|
232
323
|
async diffVersions(docName, aId, bId) {
|
|
233
324
|
const [aBytes, bBytes] = await Promise.all([
|
|
234
|
-
this.
|
|
235
|
-
this.
|
|
325
|
+
this.getVersionState(docName, aId),
|
|
326
|
+
this.getVersionState(docName, bId),
|
|
236
327
|
]);
|
|
237
|
-
if (!aBytes || !bBytes)
|
|
238
|
-
throw new Error('Version not found');
|
|
239
328
|
const textOf = (bytes) => {
|
|
240
329
|
const doc = A.load(bytes);
|
|
241
330
|
return doc.content?.toString() ?? '';
|
|
@@ -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;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAOlE,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC5F,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAExD;;;;;;;;;;;;;GAaG;AAEH,gFAAgF;AAChF,MAAM,eAAe,GAAG,IAAI,OAAO,EAAU,CAAC;AAE9C,2EAA2E;AAC3E,MAAM,WAAW,GAAG,IAAI,OAAO,EAAkB,CAAC;AAQlD,MAAM,OAAO,eAAe;IACjB,MAAM,GAAG,WAAW,CAAC;IAEtB,KAAK,GAAG,IAAI,GAAG,EAAgB,CAAC;IAChC,GAAG,CAAmB;IACb,OAAO,CAA0B;IACjC,OAAO,CAAuB;IACvC,aAAa,GAAG,IAAI,GAAG,EAAyC,CAAC;IAEzE,YAAY,OAAgC;QAC1C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,OAAe;QACpC,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;QAEtB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACxD,MAAM,GAAG,GAAG,MAAM;YAChB,CAAC,CAAC,CAAC,CAAC,IAAI,CAA0B,MAAM,CAAC,KAAK,CAAC;YAC/C,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,EAA6B,CAAC,CAAC;QAEvD,IAAI,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;QACzC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,SAAS,CAAC,IAAU,EAAE,OAAmB,EAAE,MAA+B;QAChF,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;gBACjD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAkC;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,gBAAgB,CAAC;QACnD,MAAM,GAAG,GAAG,IAAI,eAAe,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QAEf,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC7C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAC;YAC5D,IAAI,GAAG,CAAC,QAAQ,KAAK,IAAI;gBAAE,OAAO;YAElC,GAAG,CAAC,aAAa,CAAC,OAAO,EAAE,MAAmC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;gBACjF,MAAM,OAAO,GAAG,kBAAkB,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;gBACtE,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;oBAC/B,OAAO;gBACT,CAAC;gBAED,kEAAkE;gBAClE,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC5C,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;oBACpC,OAAO;gBACT,CAAC;gBAED,MAAM,GAAG,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBACpC,IAAI,CAAC,GAAG,EAAE,CAAC;oBACT,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,uBAAuB,CAAC,CAAC;oBACxC,OAAO;gBACT,CAAC;gBAED,mEAAmE;gBACnE,kEAAkE;gBAClE,4DAA4D;gBAC5D,IAAI,UAA4B,CAAC;gBACjC,IAAI,CAAC;oBACH,UAAU,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;gBAC1D,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,wBAAwB,CAAC;wBACvB,KAAK,EAAE,WAAW;wBAClB,SAAS,EAAE,SAAS;wBACpB,OAAO;wBACP,KAAK;qBACN,CAAC,CAAC;oBACH,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,2BAA2B,CAAC,CAAC;oBAC5C,OAAO;gBACT,CAAC;gBAED,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;oBACxB,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;oBAC5B,OAAO;gBACT,CAAC;gBAED,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;oBAC1C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBACrB,IAAI,CAAC,UAAU,CAAC,QAAQ;wBAAE,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAElD,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE;wBACzC,MAAM,EAAE,GAAG,CAAC,MAAM;wBAClB,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBACnD,CAAC,CAAC;oBAEH,0CAA0C;oBAC1C,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;oBAE3B,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;wBACxB,kEAAkE;wBAClE,iEAAiE;wBACjE,iDAAiD;wBACjD,IAAI,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;4BAAE,OAAO;wBACpC,KAAK,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAkB,EAAE,EAAE,CAAC,CAAC;oBACjE,CAAC,CAAC,CAAC;oBAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;wBAClB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;wBACxB,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;wBAC3B,kEAAkE;wBAClE,MAAM,cAAc,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAC3C,CAAC,MAAM,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,MAAM,CACnD,CAAC;wBACF,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;wBACvB,IAAI,CAAC,cAAc,EAAE,CAAC;4BACpB,KAAK,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;wBACzD,CAAC;oBACH,CAAC,CAAC,CAAC;oBACH,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;gBAClC,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,wBAAwB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;oBAC1F,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,6BAA6B,CAAC,CAAC;gBAChD,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,4FAA4F;IACpF,KAAK,CAAC,mBAAmB,CAAC,OAAe,EAAE,IAAgB,EAAE,MAAW;QAC9E,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAE1C,IAAI,CAAC;YACH,qEAAqE;YACrE,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAA0B,IAAI,CAAC,CAAC;YACvD,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC5C,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;YAEnB,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YAEnC,6CAA6C;YAC7C,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,+EAA+E;QACjF,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAC,OAAe,EAAE,IAAU;QAClD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACjD,IAAI,QAAQ;gBAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;YAErC,IAAI,CAAC,aAAa,CAAC,GAAG,CACpB,OAAO,EACP,UAAU,CAAC,GAAG,EAAE;gBACd,KAAK,IAAI,CAAC,OAAO;qBACd,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;qBACxC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;oBACxB,wBAAwB,CAAC;wBACvB,KAAK,EAAE,SAAS;wBAChB,SAAS,EAAE,cAAc;wBACzB,OAAO;wBACP,KAAK;qBACN,CAAC,CAAC;gBACL,CAAC,CAAC;qBACD,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YAC9B,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,CAClC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,OAAe;QACpC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC1C,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,OAAe;QACnC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAI,IAAI,CAAC,IAAwD,CAAC,OAAO,CAAC;QACvF,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3C,CAAC;IAED,+DAA+D;IAC/D,KAAK,CAAC,aAAa,CACjB,OAAe,EACf,SAAwB,EACxB,KAAoB;QAEpB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAE1D,MAAM,OAAO,GAAkB;YAC7B,GAAG,qBAAqB,CAAC,SAAS,EAAE,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;YACjE,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;SACpB,CAAC;QAEF,4EAA4E;QAC5E,qEAAqE;QACrE,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACpE,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAe;QAChC,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,cAAc,CAClB,OAAe,EACf,SAAiB,EACjB,UAAyB;QAEzB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACzE,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,WAAW,SAAS,YAAY,CAAC,CAAC;QAE9D,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,CAA0B,KAAK,CAAC,CAAC;QAC3D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAE1C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;QACpE,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAC5B,OAAO,EACP;YACE,GAAG,qBAAqB,CACtB,UAAU,EACV,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,EACpC,WAAW,CAAC,QAAQ,CAAC,CACtB;YACD,EAAE,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;SACxC,EACD,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAClB,CAAC;QAEF,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAC/C,oEAAoE;QACpE,kEAAkE;QAClE,MAAM,eAAe,GAAI,WAA+D;aACrF,OAAO,CAAC;QACX,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE;YACvC,GAA2B,CAAC,OAAO,GAAG,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC3E,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC;QACrB,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QACvC,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAe,EAAE,GAAW,EAAE,GAAW;QAC1D,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACzC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC;YAC9C,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC;SAC/C,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAE7D,MAAM,MAAM,GAAG,CAAC,KAAiB,EAAE,EAAE;YACnC,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAuC,KAAK,CAAC,CAAC;YAChE,OAAO,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QACvC,CAAC,CAAC;QAEF,OAAO,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,KAAK;QACT,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;QACrE,uEAAuE;QACvE,qEAAqE;QACrE,iDAAiD;QACjD,IAAI,CAAC,IAAI,CAAC,GAAG;YAAE,OAAO;QACtB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"automerge_driver.js","sourceRoot":"","sources":["../../../../src/drivers/automerge/automerge_driver.ts"],"names":[],"mappings":"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"}
|
|
@@ -48,6 +48,11 @@ export declare class PartyKitDriver implements CollaborationDriver {
|
|
|
48
48
|
createVersion(docName: string, createdBy: string | null, label: string | null): Promise<CollabVersion>;
|
|
49
49
|
listVersions(docName: string): Promise<CollabVersion[]>;
|
|
50
50
|
restoreVersion(docName: string, versionId: string, restoredBy: string | null): Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* Binary state stored for a version. Local storage answers it, not the
|
|
53
|
+
* worker: the edge room only holds the present, the history is Adonis's.
|
|
54
|
+
*/
|
|
55
|
+
getVersionState(docName: string, versionId: string): Promise<Uint8Array>;
|
|
51
56
|
diffVersions(docName: string, aId: string, bId: string): Promise<CollabDiffSummary>;
|
|
52
57
|
close(): Promise<void>;
|
|
53
58
|
}
|
|
@@ -1 +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,EAAwB,aAAa,EAAE,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;IAHjC,YACkB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EAIhC;CACF;AAED,qBAAa,cAAe,YAAW,mBAAmB;IACxD,QAAQ,CAAC,MAAM,cAAc;IAE7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;IAE/C,YAAY,OAAO,EAAE,qBAAqB,EAGzC;IAED,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,CAE/D;IAEK,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAS3D;IAEK,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAStD;IAEK,aAAa,CACjB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,KAAK,EAAE,MAAM,GAAG,IAAI,GACnB,OAAO,CAAC,aAAa,CAAC,CAOxB;IAEK,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAE5D;IAEK,cAAc,CAClB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GAAG,IAAI,GACxB,OAAO,CAAC,IAAI,CAAC,
|
|
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,EAAwB,aAAa,EAAE,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;IAHjC,YACkB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EAIhC;CACF;AAED,qBAAa,cAAe,YAAW,mBAAmB;IACxD,QAAQ,CAAC,MAAM,cAAc;IAE7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;IAE/C,YAAY,OAAO,EAAE,qBAAqB,EAGzC;IAED,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,CAE/D;IAEK,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAS3D;IAEK,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAStD;IAEK,aAAa,CACjB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,KAAK,EAAE,MAAM,GAAG,IAAI,GACnB,OAAO,CAAC,aAAa,CAAC,CAOxB;IAEK,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAE5D;IAEK,cAAc,CAClB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GAAG,IAAI,GACxB,OAAO,CAAC,IAAI,CAAC,CAef;IAED;;;OAGG;IACG,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAI7E;IAEK,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAmBxF;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3B;CACF"}
|
|
@@ -119,9 +119,7 @@ export class PartyKitDriver {
|
|
|
119
119
|
}
|
|
120
120
|
async restoreVersion(docName, versionId, restoredBy) {
|
|
121
121
|
void restoredBy;
|
|
122
|
-
const snapshot = await this.
|
|
123
|
-
if (!snapshot)
|
|
124
|
-
throw new Error(`Version ${versionId} not found`);
|
|
122
|
+
const snapshot = await this.getVersionState(docName, versionId);
|
|
125
123
|
// POSTs the full snapshot: the worker applies the update to the live
|
|
126
124
|
// doc (idempotent CRDT merge) and the protocol fans out to clients.
|
|
127
125
|
const response = await this.roomRequest(docName, {
|
|
@@ -134,13 +132,21 @@ export class PartyKitDriver {
|
|
|
134
132
|
}
|
|
135
133
|
await this.storage.saveDocument(docName, snapshot);
|
|
136
134
|
}
|
|
135
|
+
/**
|
|
136
|
+
* Binary state stored for a version. Local storage answers it, not the
|
|
137
|
+
* worker: the edge room only holds the present, the history is Adonis's.
|
|
138
|
+
*/
|
|
139
|
+
async getVersionState(docName, versionId) {
|
|
140
|
+
const persisted = await this.storage.loadVersionSnapshot(docName, versionId);
|
|
141
|
+
if (!persisted)
|
|
142
|
+
throw new Error(`Version ${versionId} not found`);
|
|
143
|
+
return persisted;
|
|
144
|
+
}
|
|
137
145
|
async diffVersions(docName, aId, bId) {
|
|
138
146
|
const [aBytes, bBytes] = await Promise.all([
|
|
139
|
-
this.
|
|
140
|
-
this.
|
|
147
|
+
this.getVersionState(docName, aId),
|
|
148
|
+
this.getVersionState(docName, bId),
|
|
141
149
|
]);
|
|
142
|
-
if (!aBytes || !bBytes)
|
|
143
|
-
throw new Error('Version not found');
|
|
144
150
|
const textOf = (bytes) => {
|
|
145
151
|
try {
|
|
146
152
|
const doc = new Y.Doc();
|