@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
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,29 @@
|
|
|
1
1
|
# @adonis-agora/collaboration
|
|
2
2
|
|
|
3
|
+
## 0.2.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- badb9f7: New `partykit` engine: edge sync via Cloudflare Workers + Durable Objects. Includes `PartyKitDriver` (HTTP client of the worker's onRequest API), HS256 JWT helpers (`signPartyKitToken`/`verifyPartyKitToken`), worker template published by the new `collaboration:init` command, and `config.partykit.{roomHost,jwtSecret,party,fetchTimeoutMs}`.
|
|
8
|
+
|
|
9
|
+
New ace commands: `collaboration:init` (base directories, migrations, PartyKit worker scaffold) and `make:collab-document <name>` (shared per-document types with spaces + anchor kinds). Commands are registered automatically by `configure` via the new `./commands` export.
|
|
10
|
+
|
|
11
|
+
Built-in REST endpoints (token, comments CRUD, versions, binary state) are now registered automatically by the provider under `/collaboration`. Set `routes.enabled = false` to take manual control with the new `collaborationRoutes(router, options)` export — supports custom prefix, middleware/guards and a pluggable `resolveUser`. The binary state POST is protected by a shared worker secret.
|
|
12
|
+
|
|
13
|
+
AdonisJS v7 codegen integration: an Assembler `init` hook generates `.adonisjs/collaboration/documents.ts`, a typed registry (`CollabDocumentName`, `CollabDocumentDefinition`) refreshed by `node ace codegen` / dev server / build.
|
|
14
|
+
|
|
15
|
+
Refactor — seams made real:
|
|
16
|
+
|
|
17
|
+
- Comments now flow through a single seam: `manager.comments`. Drivers no longer accept, store or delegate comment operations (12 pass-through methods removed). This also fixes a latent bug where manager and drivers held separate in-memory storage instances when none was configured.
|
|
18
|
+
- New `auth/token` module (`issueToken`, `parseLegacyToken`, `buildWsUrl`, `signPartyKitToken`, `verifyPartyKitToken`) replaces six scattered token implementations; the REST `/token` endpoint now enforces `config.authorize` (403 on denial) — previously it was bypassed off the WS path.
|
|
19
|
+
- Drivers take narrow dependency objects (`SelfHostedDriverOptions`, `PartyKitDriverOptions`) instead of the whole `CollaborationConfig`.
|
|
20
|
+
- Removed dead `PresenceService` (+ ioredis dependency) and the duplicated REST controller/routes stubs — manual mode uses `collaborationRoutes()` directly.
|
|
21
|
+
|
|
22
|
+
New engines and client surfaces:
|
|
23
|
+
|
|
24
|
+
- `partyserver` engine: client transport (`PartyServerCollabTransport`) for the self-hosted Cloudflare Workers stack via `y-partyserver/provider`; token issuance treats it like the partykit edge engine.
|
|
25
|
+
- Automerge on the client: new `useAutomergeDoc(docName)` hook speaking the server driver's binary protocol directly (initial full save, debounced local saves, CRDT merge) — intentionally outside the Y.Doc-centric hooks, since Automerge docs cannot back Tiptap/awareness.
|
|
26
|
+
|
|
3
27
|
## 0.1.1
|
|
4
28
|
|
|
5
29
|
### Patch Changes
|
package/README.md
ADDED
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
# @adonis-agora/collaboration
|
|
2
|
+
|
|
3
|
+
Collaborative editing (CRDT) for AdonisJS — Yjs (Hocuspocus), Automerge and PartyKit (edge) drivers, Redis-backed presence, unified version control, anchored comments, ace codegen and React client hooks. Part of the Agora ecosystem.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
node ace add @adonis-agora/collaboration
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Quick start
|
|
12
|
+
|
|
13
|
+
```sh
|
|
14
|
+
node ace configure @adonis-agora/collaboration # provider + config/collaboration.ts
|
|
15
|
+
node ace collaboration:init # REST routes, controller, migrations
|
|
16
|
+
node ace make:collab-document researches/writing # shared types per document
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Wire `config/collaboration.ts` with your `authorize()` (the lib never authorizes by default) and a storage backend (`LucidStorage`, `FileSystemStorage` or your own).
|
|
20
|
+
|
|
21
|
+
### Engines
|
|
22
|
+
|
|
23
|
+
| Engine | Sync runs on | Best for |
|
|
24
|
+
|---|---|---|
|
|
25
|
+
| `yjs` (default) | Embedded Hocuspocus on the Adonis HTTP server | Self-hosted, single origin |
|
|
26
|
+
| `automerge` | Custom room broadcast on Adonis server | Native history |
|
|
27
|
+
| `partykit` | Cloudflare Workers + Durable Objects (edge) | Global latency, separate origin |
|
|
28
|
+
|
|
29
|
+
PartyKit setup:
|
|
30
|
+
|
|
31
|
+
```ts
|
|
32
|
+
// config/collaboration.ts
|
|
33
|
+
{
|
|
34
|
+
engine: 'partykit',
|
|
35
|
+
partykit: { roomHost: 'meu-app.partykit.dev', jwtSecret: process.env.COLLAB_JWT_SECRET },
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Then run `collaboration:init --engine=partykit` to scaffold the worker into `partykit-worker/` and deploy with `npx partykit deploy`.
|
|
40
|
+
|
|
41
|
+
## Server API
|
|
42
|
+
|
|
43
|
+
```ts
|
|
44
|
+
import collaboration from '@adonis-agora/collaboration/services/main'
|
|
45
|
+
|
|
46
|
+
await collaboration.current.getDocumentText('researches/42/writing')
|
|
47
|
+
const version = await collaboration.current.createVersion('researches/42/writing', userId, 'v1')
|
|
48
|
+
collaboration.current.comments.list('researches/42/writing', 'text')
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Version control works across engines: full-update snapshots (Yjs/PartyKit) or native heads (Automerge). Comments are anchored per space (`text-range`, `canvas-object`, `timestamp`) and persisted via the storage backend.
|
|
52
|
+
|
|
53
|
+
## Client hooks (React)
|
|
54
|
+
|
|
55
|
+
```sh
|
|
56
|
+
pnpm add @adonis-agora/collaboration-client
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
```tsx
|
|
60
|
+
import {
|
|
61
|
+
CollaborationProvider,
|
|
62
|
+
useCollabDoc,
|
|
63
|
+
useAwareness,
|
|
64
|
+
useComments,
|
|
65
|
+
useVersions,
|
|
66
|
+
} from '@adonis-agora/collaboration-client'
|
|
67
|
+
|
|
68
|
+
<CollaborationProvider baseUrl="https://api.app" getHeaders={() => ({ cookie })}>
|
|
69
|
+
<Editor docName="researches/42/writing" />
|
|
70
|
+
</CollaborationProvider>
|
|
71
|
+
|
|
72
|
+
function Editor({ docName }: { docName: string }) {
|
|
73
|
+
const { doc, status } = useCollabDoc(docName) // Y.Doc + connection status
|
|
74
|
+
const { peers } = useAwareness(docName)
|
|
75
|
+
const { comments, create, resolve } = useComments(docName, 'text')
|
|
76
|
+
const { versions, create: createVersion } = useVersions(docName)
|
|
77
|
+
// feed doc into Tiptap/y-prosemirror…
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
The transport is chosen automatically from the engine reported by `GET /collaboration/token` (HocuspocusProvider or YPartyKitProvider).
|
|
82
|
+
|
|
83
|
+
## Codegen
|
|
84
|
+
|
|
85
|
+
### Commands
|
|
86
|
+
|
|
87
|
+
- `collaboration:init` — scaffolds the documents directory, base migrations (when a database is configured) and the PartyKit worker (`--engine=partykit`)
|
|
88
|
+
- `make:collab-document <name>` — generates shared document types in `app/collaboration/documents/` (spaces + allowed anchor kinds), importable by the frontend
|
|
89
|
+
|
|
90
|
+
Commands are registered automatically by `configure`; manual setups need `commands: ['@adonis-agora/collaboration/commands']` in `adonisrc.ts`.
|
|
91
|
+
|
|
92
|
+
### Typed document registry
|
|
93
|
+
|
|
94
|
+
The package ships an Assembler `init` hook (registered by `configure`) that scans `app/collaboration/documents/` and generates `.adonisjs/collaboration/documents.ts`:
|
|
95
|
+
|
|
96
|
+
```ts
|
|
97
|
+
import type { CollabDocumentName, CollabDocumentDefinition } from '.adonisjs/collaboration/documents.js'
|
|
98
|
+
|
|
99
|
+
function open(name: CollabDocumentName) { … } // autocomplete + exhaustiveness
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Refresh it with `node ace codegen`, the dev server, tests or build — same lifecycle as controllers/routes barrels.
|
|
103
|
+
|
|
104
|
+
## REST endpoints
|
|
105
|
+
|
|
106
|
+
Ten endpoints ship built-in (token, comments CRUD, versions, binary state) and are **registered automatically** on boot under `/collaboration`.
|
|
107
|
+
|
|
108
|
+
Protect them via config — any Adonis middleware or auth guard works:
|
|
109
|
+
|
|
110
|
+
```ts
|
|
111
|
+
// config/collaboration.ts
|
|
112
|
+
routes: {
|
|
113
|
+
enabled: true,
|
|
114
|
+
prefix: '/collaboration',
|
|
115
|
+
middleware: [() => import('#middleware/auth_middleware')], // guards apply here
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Prefer full control? Disable and register manually where you want:
|
|
120
|
+
|
|
121
|
+
```ts
|
|
122
|
+
// routes.enabled = false
|
|
123
|
+
import { collaborationRoutes } from '@adonis-agora/collaboration'
|
|
124
|
+
|
|
125
|
+
collaborationRoutes(router, {
|
|
126
|
+
prefix: '/api/collab',
|
|
127
|
+
middleware: [authMiddleware],
|
|
128
|
+
})
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Without a resolver the token endpoint fails closed (401): pass `routes.resolveUser` or run your auth middleware first. The binary `state` POST is machine-to-machine (PartyKit worker → Adonis) and requires the shared worker secret instead of a user.
|
|
132
|
+
|
|
133
|
+
> **Route type-safety caveat**: auto-registered routes live in the provider's `ready()` phase, which runs after the codegen warmup — so they may not appear in `.adonisjs/server/routes.d.ts`. If your app relies on generated route types (e.g. Tuyau), use manual mode: set `routes.enabled = false` and call `collaborationRoutes(router)` in `start/routes.ts`, where routes are always picked up.
|
|
134
|
+
|
|
135
|
+
## Editor binding (Tiptap)
|
|
136
|
+
|
|
137
|
+
The client hooks hand you a plain `Y.Doc` — feed it straight into Tiptap:
|
|
138
|
+
|
|
139
|
+
```tsx
|
|
140
|
+
import Collaboration from '@tiptap/extension-collaboration'
|
|
141
|
+
import CollaborationCursor from '@tiptap/extension-collaboration-cursor'
|
|
142
|
+
import { useEditor } from '@tiptap/react'
|
|
143
|
+
import StarterKit from '@tiptap/starter-kit'
|
|
144
|
+
import { useCollabDoc, useAwareness } from '@adonis-agora/collaboration-client'
|
|
145
|
+
|
|
146
|
+
function Editor({ docName, user }: { docName: string; user: { name: string; color: string } }) {
|
|
147
|
+
const { doc, status } = useCollabDoc(docName)
|
|
148
|
+
const { peers } = useAwareness(docName)
|
|
149
|
+
|
|
150
|
+
const editor = useEditor({
|
|
151
|
+
extensions: [
|
|
152
|
+
StarterKit,
|
|
153
|
+
Collaboration.configure({ document: doc }),
|
|
154
|
+
CollaborationCursor.configure({ user }),
|
|
155
|
+
],
|
|
156
|
+
editable: status === 'connected',
|
|
157
|
+
})
|
|
158
|
+
|
|
159
|
+
return (
|
|
160
|
+
<>
|
|
161
|
+
<EditorContent editor={editor} />
|
|
162
|
+
{peers.map((peer) => (
|
|
163
|
+
<span key={peer.clientId} style={{ color: 'gray' }}>{peer.name ?? 'anon'}</span>
|
|
164
|
+
))}
|
|
165
|
+
</>
|
|
166
|
+
)
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## License
|
|
171
|
+
|
|
172
|
+
MIT
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { BaseCommand } from '@adonisjs/core/ace';
|
|
2
|
+
/**
|
|
3
|
+
* `node ace collaboration:init`
|
|
4
|
+
*
|
|
5
|
+
* Scaffolds the HTTP + edge layer of the collaboration package:
|
|
6
|
+
* - base directory for document definitions (scanned by the codegen hook);
|
|
7
|
+
* - migrations when a database is configured (storage-backed installs);
|
|
8
|
+
* - PartyKit worker (when engine = partykit).
|
|
9
|
+
*
|
|
10
|
+
* REST endpoints are registered automatically by the service provider —
|
|
11
|
+
* set `routes.enabled: false` in config and call `collaborationRoutes()`
|
|
12
|
+
* in `start/routes.ts` to control middleware yourself.
|
|
13
|
+
*
|
|
14
|
+
* `config/collaboration.ts` and the provider are published by
|
|
15
|
+
* `node ace configure @adonis-agora/collaboration`.
|
|
16
|
+
*/
|
|
17
|
+
export default class CollaborationInit extends BaseCommand {
|
|
18
|
+
static commandName: string;
|
|
19
|
+
static description: string;
|
|
20
|
+
static options: {
|
|
21
|
+
startApp: boolean;
|
|
22
|
+
};
|
|
23
|
+
engine?: string;
|
|
24
|
+
run(): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=collaboration_init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collaboration_init.d.ts","sourceRoot":"","sources":["../../commands/collaboration_init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAS,MAAM,oBAAoB,CAAC;AAGxD;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,WAAW;IACxD,OAAgB,WAAW,SAAwB;IACnD,OAAgB,WAAW,SACoD;IAC/E,OAAgB,OAAO;;MAAsB;IAKrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAET,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA+DpC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { BaseCommand, flags } from '@adonisjs/core/ace';
|
|
8
|
+
import { stubsRoot } from '../stubs/main.js';
|
|
9
|
+
/**
|
|
10
|
+
* `node ace collaboration:init`
|
|
11
|
+
*
|
|
12
|
+
* Scaffolds the HTTP + edge layer of the collaboration package:
|
|
13
|
+
* - base directory for document definitions (scanned by the codegen hook);
|
|
14
|
+
* - migrations when a database is configured (storage-backed installs);
|
|
15
|
+
* - PartyKit worker (when engine = partykit).
|
|
16
|
+
*
|
|
17
|
+
* REST endpoints are registered automatically by the service provider —
|
|
18
|
+
* set `routes.enabled: false` in config and call `collaborationRoutes()`
|
|
19
|
+
* in `start/routes.ts` to control middleware yourself.
|
|
20
|
+
*
|
|
21
|
+
* `config/collaboration.ts` and the provider are published by
|
|
22
|
+
* `node ace configure @adonis-agora/collaboration`.
|
|
23
|
+
*/
|
|
24
|
+
export default class CollaborationInit extends BaseCommand {
|
|
25
|
+
static commandName = 'collaboration:init';
|
|
26
|
+
static description = 'Scaffold base directories, migrations and (optionally) the PartyKit worker';
|
|
27
|
+
static options = { startApp: true };
|
|
28
|
+
async run() {
|
|
29
|
+
const appConfig = this.app.config.get('collaboration', {});
|
|
30
|
+
const resolvedEngine = this.engine ?? appConfig.engine ?? 'yjs';
|
|
31
|
+
const hasDatabase = this.app.config.has('database');
|
|
32
|
+
const codemods = await this.createCodemods();
|
|
33
|
+
// 1. Base documents directory (scanned by the codegen init hook).
|
|
34
|
+
await codemods.makeUsingStub(stubsRoot, 'collaboration/documents_dir.stub', {});
|
|
35
|
+
this.logger.action('create app/collaboration/documents/').succeeded();
|
|
36
|
+
// 2. Base migrations (when a database is configured).
|
|
37
|
+
if (hasDatabase) {
|
|
38
|
+
const prefix = Date.now();
|
|
39
|
+
const tables = ['collab_documents', 'collab_versions', 'collab_comments'];
|
|
40
|
+
for (const [index, tableName] of tables.entries()) {
|
|
41
|
+
await codemods.makeUsingStub(stubsRoot, `collaboration/migrations/${tableName}.stub`, {
|
|
42
|
+
migration: {
|
|
43
|
+
tableName,
|
|
44
|
+
fileName: `${prefix}_${index}_create_${tableName}_table.ts`,
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
this.logger.action(`create migration ${tableName}`).succeeded();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// 3. PartyKit worker.
|
|
51
|
+
if (resolvedEngine === 'partykit') {
|
|
52
|
+
if (!appConfig.partykit?.roomHost) {
|
|
53
|
+
this.logger.warning('engine=partykit without config.partykit.roomHost — the driver will fail at runtime until configured');
|
|
54
|
+
}
|
|
55
|
+
await codemods.makeUsingStub(stubsRoot, 'partykit/worker/party.ts.stub', {});
|
|
56
|
+
await codemods.makeUsingStub(stubsRoot, 'partykit/worker/package.json.stub', {});
|
|
57
|
+
await codemods.makeUsingStub(stubsRoot, 'partykit/worker/partykit.toml.stub', {
|
|
58
|
+
partykitWorkerName: this.app.appName ?? 'collab-worker',
|
|
59
|
+
adonisBaseUrl: process.env.APP_URL ?? 'http://localhost:3333',
|
|
60
|
+
});
|
|
61
|
+
this.logger.info([
|
|
62
|
+
'',
|
|
63
|
+
'PartyKit worker generated at partykit-worker/',
|
|
64
|
+
' 1. cd partykit-worker && npm install',
|
|
65
|
+
' 2. npx partykit secret put COLLAB_JWT_SECRET',
|
|
66
|
+
' 3. npx partykit dev # local',
|
|
67
|
+
' 4. npx partykit deploy # production',
|
|
68
|
+
'',
|
|
69
|
+
].join('\n'));
|
|
70
|
+
}
|
|
71
|
+
this.logger.success([
|
|
72
|
+
'Collaboration initialized.',
|
|
73
|
+
'REST endpoints are registered automatically by the provider (disable with routes.enabled=false).',
|
|
74
|
+
'Next step: node ace make:collab-document <name>',
|
|
75
|
+
].join(' '));
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
__decorate([
|
|
79
|
+
flags.string({
|
|
80
|
+
description: 'Sync engine (yjs | automerge | partykit) — defaults to the one in config',
|
|
81
|
+
})
|
|
82
|
+
], CollaborationInit.prototype, "engine", void 0);
|
|
83
|
+
//# sourceMappingURL=collaboration_init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collaboration_init.js","sourceRoot":"","sources":["../../commands/collaboration_init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"commands":[{"commandName":"collaboration:init","description":"Scaffold base directories, migrations and (optionally) the PartyKit worker","help":"","namespace":"collaboration","aliases":[],"flags":[{"name":"engine","flagName":"engine","required":false,"type":"string","description":"Sync engine (yjs | automerge | partykit) — defaults to the one in config"}],"args":[],"options":{"startApp":true},"filePath":"collaboration_init.js"},{"commandName":"make:collab-document","description":"Make shared types for a collaborative document (spaces + anchors)","help":"","namespace":"make","aliases":[],"flags":[{"name":"anchors","flagName":"anchors","required":false,"type":"string","description":"Allowed anchor kinds as a comma-separated list (text-range,canvas-object,timestamp)"},{"name":"spaces","flagName":"spaces","required":false,"type":"string","description":"Document spaces as a comma-separated list (default 'text')"}],"args":[{"name":"name","argumentName":"name","required":true,"description":"Collaborative document name (e.g. researches/writing)","type":"string"}],"options":{"startApp":true,"allowUnknownFlags":true},"filePath":"make_collab_document.js"}],"version":1}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ace commands barrel — same pattern as @adonisjs/lucid. The Adonis kernel
|
|
3
|
+
* calls getMetaData()/getCommand() through the "./commands" export listed in
|
|
4
|
+
* the adonisrc.ts `commands` array.
|
|
5
|
+
*/
|
|
6
|
+
interface CommandMeta {
|
|
7
|
+
commandName: string;
|
|
8
|
+
filePath: string;
|
|
9
|
+
[key: string]: unknown;
|
|
10
|
+
}
|
|
11
|
+
export declare function getMetaData(): Promise<CommandMeta[]>;
|
|
12
|
+
export declare function getCommand(metaData: {
|
|
13
|
+
commandName: string;
|
|
14
|
+
}): Promise<any>;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=main.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../commands/main.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AAEH,UAAU,WAAW;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAID,wBAAsB,WAAW,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAS1D;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,gBAWjE"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
let commandsMetaData;
|
|
3
|
+
export async function getMetaData() {
|
|
4
|
+
if (commandsMetaData) {
|
|
5
|
+
return commandsMetaData;
|
|
6
|
+
}
|
|
7
|
+
const commandsIndex = await readFile(new URL('./commands.json', import.meta.url), 'utf-8');
|
|
8
|
+
commandsMetaData = JSON.parse(commandsIndex).commands;
|
|
9
|
+
return commandsMetaData;
|
|
10
|
+
}
|
|
11
|
+
export async function getCommand(metaData) {
|
|
12
|
+
const commands = await getMetaData();
|
|
13
|
+
const command = commands.find(({ commandName }) => metaData.commandName === commandName);
|
|
14
|
+
if (!command) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
const { default: commandConstructor } = await import(new URL(command.filePath, import.meta.url).href);
|
|
18
|
+
return commandConstructor;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=main.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../commands/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAc5C,IAAI,gBAA2C,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAC3F,gBAAgB,GAAI,IAAI,CAAC,KAAK,CAAC,aAAa,CAAiC,CAAC,QAAQ,CAAC;IAEvF,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAiC;IAChE,MAAM,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAC;IACrC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,KAAK,WAAW,CAAC,CAAC;IACzF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAClD,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAChD,CAAC;IACF,OAAO,kBAAkB,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { BaseCommand } from '@adonisjs/core/ace';
|
|
2
|
+
/**
|
|
3
|
+
* `node ace make:collab-document researches/writing`
|
|
4
|
+
*
|
|
5
|
+
* Generates the shared types for a collaborative document (doc name
|
|
6
|
+
* pattern, spaces, allowed anchor kinds) at
|
|
7
|
+
* `app/collaboration/documents/<name>_types.ts`. The typed registry in
|
|
8
|
+
* `.adonisjs/collaboration/documents.ts` is refreshed automatically by the
|
|
9
|
+
* codegen hook (`node ace codegen` / dev server).
|
|
10
|
+
*/
|
|
11
|
+
export default class MakeCollabDocument extends BaseCommand {
|
|
12
|
+
static commandName: string;
|
|
13
|
+
static description: string;
|
|
14
|
+
static options: {
|
|
15
|
+
startApp: boolean;
|
|
16
|
+
allowUnknownFlags: boolean;
|
|
17
|
+
};
|
|
18
|
+
name: string;
|
|
19
|
+
anchors?: string;
|
|
20
|
+
spaces?: string;
|
|
21
|
+
run(): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=make_collab_document.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"make_collab_document.d.ts","sourceRoot":"","sources":["../../commands/make_collab_document.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAe,MAAM,oBAAoB,CAAC;AAI9D;;;;;;;;GAQG;AACH,MAAM,CAAC,OAAO,OAAO,kBAAmB,SAAQ,WAAW;IACzD,OAAgB,WAAW,SAA0B;IACrD,OAAgB,WAAW,SAAuE;IAClG,OAAgB,OAAO;;;MAA+C;IAG9D,IAAI,EAAE,MAAM,CAAC;IAMb,OAAO,CAAC,EAAE,MAAM,CAAC;IAGjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAET,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA8CpC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { BaseCommand, args, flags } from '@adonisjs/core/ace';
|
|
8
|
+
import stringHelpers from '@adonisjs/core/helpers/string';
|
|
9
|
+
import { stubsRoot } from '../stubs/main.js';
|
|
10
|
+
/**
|
|
11
|
+
* `node ace make:collab-document researches/writing`
|
|
12
|
+
*
|
|
13
|
+
* Generates the shared types for a collaborative document (doc name
|
|
14
|
+
* pattern, spaces, allowed anchor kinds) at
|
|
15
|
+
* `app/collaboration/documents/<name>_types.ts`. The typed registry in
|
|
16
|
+
* `.adonisjs/collaboration/documents.ts` is refreshed automatically by the
|
|
17
|
+
* codegen hook (`node ace codegen` / dev server).
|
|
18
|
+
*/
|
|
19
|
+
export default class MakeCollabDocument extends BaseCommand {
|
|
20
|
+
static commandName = 'make:collab-document';
|
|
21
|
+
static description = 'Make shared types for a collaborative document (spaces + anchors)';
|
|
22
|
+
static options = { startApp: true, allowUnknownFlags: true };
|
|
23
|
+
async run() {
|
|
24
|
+
const entity = this.app.generators.createEntity(this.name);
|
|
25
|
+
const documentName = `${entity.path ? `${entity.path}/` : ''}${stringHelpers.snakeCase(entity.name)}`;
|
|
26
|
+
const className = stringHelpers.pascalCase(entity.name);
|
|
27
|
+
const fileName = `${stringHelpers.snakeCase(entity.name)}_types.ts`;
|
|
28
|
+
const anchorKinds = (this.anchors ?? 'text-range')
|
|
29
|
+
.split(',')
|
|
30
|
+
.map((kind) => kind.trim())
|
|
31
|
+
.filter((kind) => ['text-range', 'canvas-object', 'timestamp'].includes(kind));
|
|
32
|
+
if (anchorKinds.length === 0) {
|
|
33
|
+
this.logger.error('invalid --anchors. Use values from: text-range, canvas-object, timestamp');
|
|
34
|
+
this.exitCode = 1;
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const spaceList = (this.spaces ?? 'text')
|
|
38
|
+
.split(',')
|
|
39
|
+
.map((space) => space.trim())
|
|
40
|
+
.filter(Boolean);
|
|
41
|
+
const codemods = await this.createCodemods();
|
|
42
|
+
await codemods.makeUsingStub(stubsRoot, 'collaboration/document_types.stub', {
|
|
43
|
+
document: {
|
|
44
|
+
documentName,
|
|
45
|
+
className,
|
|
46
|
+
fileName,
|
|
47
|
+
anchorKinds,
|
|
48
|
+
spaceList,
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
this.logger.action(`create app/collaboration/documents/${fileName}`).succeeded();
|
|
52
|
+
// The typed registry is generated by the codegen init hook scanning
|
|
53
|
+
// app/collaboration/documents — nothing to edit by hand.
|
|
54
|
+
this.logger.info([
|
|
55
|
+
'',
|
|
56
|
+
`Document '${documentName}' registered. Refresh the typed registry with:`,
|
|
57
|
+
' node ace codegen (or restart the dev server)',
|
|
58
|
+
'→ importable from .adonisjs/collaboration/documents.ts',
|
|
59
|
+
' (types CollabDocumentName / CollabDocumentDefinition)',
|
|
60
|
+
'',
|
|
61
|
+
].join('\n'));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
__decorate([
|
|
65
|
+
args.string({ description: 'Collaborative document name (e.g. researches/writing)' })
|
|
66
|
+
], MakeCollabDocument.prototype, "name", void 0);
|
|
67
|
+
__decorate([
|
|
68
|
+
flags.string({
|
|
69
|
+
description: 'Allowed anchor kinds as a comma-separated list (text-range,canvas-object,timestamp)',
|
|
70
|
+
})
|
|
71
|
+
], MakeCollabDocument.prototype, "anchors", void 0);
|
|
72
|
+
__decorate([
|
|
73
|
+
flags.string({ description: "Document spaces as a comma-separated list (default 'text')" })
|
|
74
|
+
], MakeCollabDocument.prototype, "spaces", void 0);
|
|
75
|
+
//# sourceMappingURL=make_collab_document.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"make_collab_document.js","sourceRoot":"","sources":["../../commands/make_collab_document.ts"],"names":[],"mappings":"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"}
|
package/dist/configure.d.ts
CHANGED
|
@@ -3,7 +3,9 @@ import type Configure from '@adonisjs/core/commands/configure';
|
|
|
3
3
|
* `node ace configure @adonis-agora/collaboration` — auto-wires the package:
|
|
4
4
|
*
|
|
5
5
|
* 1. registers the collaboration service provider in `adonisrc.ts`;
|
|
6
|
-
* 2.
|
|
6
|
+
* 2. registers the ace commands barrel (`collaboration:init`,
|
|
7
|
+
* `make:collab-document`);
|
|
8
|
+
* 3. publishes `config/collaboration.ts` (engine, path, redis, authorize,
|
|
7
9
|
* storage).
|
|
8
10
|
*/
|
|
9
11
|
export declare function configure(command: Configure): Promise<void>;
|
package/dist/configure.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configure.d.ts","sourceRoot":"","sources":["../configure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,mCAAmC,CAAC;AAG/D
|
|
1
|
+
{"version":3,"file":"configure.d.ts","sourceRoot":"","sources":["../configure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,mCAAmC,CAAC;AAG/D;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,SAAS,iBAWjD"}
|
package/dist/configure.js
CHANGED
|
@@ -3,13 +3,18 @@ import { stubsRoot } from './stubs/main.js';
|
|
|
3
3
|
* `node ace configure @adonis-agora/collaboration` — auto-wires the package:
|
|
4
4
|
*
|
|
5
5
|
* 1. registers the collaboration service provider in `adonisrc.ts`;
|
|
6
|
-
* 2.
|
|
6
|
+
* 2. registers the ace commands barrel (`collaboration:init`,
|
|
7
|
+
* `make:collab-document`);
|
|
8
|
+
* 3. publishes `config/collaboration.ts` (engine, path, redis, authorize,
|
|
7
9
|
* storage).
|
|
8
10
|
*/
|
|
9
11
|
export async function configure(command) {
|
|
10
12
|
const codemods = await command.createCodemods();
|
|
11
13
|
await codemods.updateRcFile((rcFile) => {
|
|
12
14
|
rcFile.addProvider('@adonis-agora/collaboration/collaboration_provider');
|
|
15
|
+
rcFile.addCommand('@adonis-agora/collaboration/commands');
|
|
16
|
+
// Codegen v7: registry tipado de documentos em .adonisjs/ (node ace codegen).
|
|
17
|
+
rcFile.addAssemblerHook('init', '@adonis-agora/collaboration/codegen_init');
|
|
13
18
|
});
|
|
14
19
|
await codemods.makeUsingStub(stubsRoot, 'config/collaboration.stub', {});
|
|
15
20
|
}
|
package/dist/configure.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configure.js","sourceRoot":"","sources":["../configure.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C
|
|
1
|
+
{"version":3,"file":"configure.js","sourceRoot":"","sources":["../configure.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAkB;IAChD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,cAAc,EAAE,CAAC;IAEhD,MAAM,QAAQ,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,EAAE;QACrC,MAAM,CAAC,WAAW,CAAC,oDAAoD,CAAC,CAAC;QACzE,MAAM,CAAC,UAAU,CAAC,sCAAsC,CAAC,CAAC;QAC1D,8EAA8E;QAC9E,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,0CAA0C,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,CAAC,aAAa,CAAC,SAAS,EAAE,2BAA2B,EAAE,EAAE,CAAC,CAAC;AAC3E,CAAC"}
|
|
@@ -4,12 +4,16 @@ import type { ApplicationService } from '@adonisjs/core/types';
|
|
|
4
4
|
*
|
|
5
5
|
* - `register()` hands the booted app to `services/main` and binds the
|
|
6
6
|
* `CollaborationManager` singleton from `config/collaboration.ts`;
|
|
7
|
-
* - `boot()` attaches the collaboration WebSocket upgrade to the
|
|
8
|
-
* server (path from config, default `/collaboration`);
|
|
7
|
+
* - `boot()`/`ready()` attaches the collaboration WebSocket upgrade to the
|
|
8
|
+
* Adonis HTTP server (path from config, default `/collaboration`);
|
|
9
|
+
* - `ready()` registers the built-in REST endpoints automatically unless
|
|
10
|
+
* `routes.enabled: false` — then call `collaborationRoutes(router)` in
|
|
11
|
+
* `start/routes.ts` with your own middleware;
|
|
9
12
|
* - `shutdown()` flushes pending stores and closes all connections.
|
|
10
13
|
*/
|
|
11
14
|
export default class CollaborationServiceProvider {
|
|
12
15
|
protected app: ApplicationService;
|
|
16
|
+
private config?;
|
|
13
17
|
constructor(app: ApplicationService);
|
|
14
18
|
register(): void;
|
|
15
19
|
ready(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collaboration_provider.d.ts","sourceRoot":"","sources":["../../providers/collaboration_provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"collaboration_provider.d.ts","sourceRoot":"","sources":["../../providers/collaboration_provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAM/D;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,OAAO,OAAO,4BAA4B;IAGnC,SAAS,CAAC,GAAG,EAAE,kBAAkB;IAF7C,OAAO,CAAC,MAAM,CAAC,CAAyB;gBAElB,GAAG,EAAE,kBAAkB;IAE7C,QAAQ;IA6BF,KAAK;IA8CL,QAAQ;CAIf"}
|