@univerjs-pro/collaboration-worktree-service 1.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +148 -0
- package/README.zh-CN.md +169 -0
- package/dist/index.cjs +1 -0
- package/dist/index.d.ts +520 -0
- package/dist/index.mjs +1 -0
- package/package.json +22 -0
package/README.md
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# @univerjs-pro/collaboration-worktree-service
|
|
2
|
+
|
|
3
|
+
English | [简体中文](./README.zh-CN.md)
|
|
4
|
+
|
|
5
|
+
A network-agnostic Univer Worktree Service that provides collaboratively editable drafts, freezing, merge evaluation, and per-Unit merge for one or more Units.
|
|
6
|
+
|
|
7
|
+
Worktree isolates draft changesets by `(worktreeID, unitID)`, reuses the trunk `UniverCollabService` OT, Unit-data handling, and submission engine, and does not change the existing changeset structure.
|
|
8
|
+
|
|
9
|
+
When using Worktree Client, `UniverCollabWorktreeEndpoint` calls Worktree Service. Calling the Service APIs below directly is an advanced integration.
|
|
10
|
+
|
|
11
|
+
## Installation and creation
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
pnpm add \
|
|
15
|
+
@univerjs-pro/collaboration-service \
|
|
16
|
+
@univerjs-pro/collaboration-worktree-service \
|
|
17
|
+
@univerjs-pro/collaboration-worktree-endpoint \
|
|
18
|
+
@univerjs-pro/collaboration-database-sqlite \
|
|
19
|
+
@univerjs-pro/collaboration-worktree-database-sqlite
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
```ts
|
|
23
|
+
const trunkDatabase = new SQLiteDatabaseAdapter({ filename });
|
|
24
|
+
const worktreeDatabase = new SQLiteWorktreeDatabaseAdapter({ filename });
|
|
25
|
+
|
|
26
|
+
const collabService = new UniverCollabService({
|
|
27
|
+
dbAdapter: trunkDatabase,
|
|
28
|
+
});
|
|
29
|
+
const worktreeService = new UniverCollabWorktreeService({
|
|
30
|
+
trunk: {
|
|
31
|
+
service: collabService,
|
|
32
|
+
dbAdapter: trunkDatabase,
|
|
33
|
+
},
|
|
34
|
+
dbAdapter: worktreeDatabase,
|
|
35
|
+
});
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
The trunk and Worktree Adapters may use the same SQLite file, but remain two independent contracts and lifecycle objects. All collaboration packages must use matching versions from the same release cohort.
|
|
39
|
+
|
|
40
|
+
Next, create `UniverCollabWorktreeEndpoint` and register it on the same Transport as the trunk Endpoint.
|
|
41
|
+
|
|
42
|
+
## Worktree middleware
|
|
43
|
+
|
|
44
|
+
Worktree middleware is independent of trunk Service middleware:
|
|
45
|
+
|
|
46
|
+
| Action | When it runs | Visible fields | Retry semantics | Typical uses |
|
|
47
|
+
| --- | --- | --- | --- | --- |
|
|
48
|
+
| `readWorktreeData` | After Worktree Request creation, before reading the Adapter | `userID`, `customData`, `request` | Once per API call | Worktree visibility and management-read ACL |
|
|
49
|
+
| `createWorktree` | After Request creation, before creating Worktree | `userID`, `customData`, `request` | Once per call | Creation permission, quota, discoverability scope |
|
|
50
|
+
| `addWorktreeUnit` | After Request creation, before adding a trunk Unit | `userID`, `customData`, `request` | Once per call | Unit read/edit permission |
|
|
51
|
+
| `createWorktreeUnit` | After preparing the initial snapshot, before creating a draft Unit | `userID`, `customData`, `request` | Once per call | New-Unit type, quota, creation permission |
|
|
52
|
+
| `markWorktreeReady` | After Request creation, before Adapter freezes each Unit's current draft revision | `userID`, `customData`, `request` | Once per call | Ready permission and review rules |
|
|
53
|
+
| `reopenWorktree` | After Request creation, before Adapter returns to draft | `userID`, `customData`, `request` | Once per call | Reopen permission |
|
|
54
|
+
| `discardWorktree` | After Request creation, before Adapter discard | `userID`, `customData`, `request` | Once per call | Discard permission and audit |
|
|
55
|
+
| `mergeWorktree` | After Request creation, before starting or continuing per-Unit merge | `userID`, `memberID`, `customData`, `request` | Once per merge call; internal Unit submission retries do not repeat it | Formal merge permission |
|
|
56
|
+
| `readUnitData` | After Worktree Unit Request creation, before reading draft data | `userID`, `customData`, `request` | Once per API call | Draft Unit read ACL, merge-preview reads |
|
|
57
|
+
| `submitChangeset` | After draft submission Request creation, before idempotency and OT | `userID`, `memberID`, `customData`, `request` | Once per logical submission; database revision conflicts do not repeat it | Draft edit ACL, size limits |
|
|
58
|
+
| `applyChangeset` | After OT aligns changeset to current revision, before applying it to pending Unit state | `userID`, `memberID`, `customData`, `request`, `changeset`, `currentRevision`, `attempt` | Repeated after database revision conflict | Validation of aligned mutations |
|
|
59
|
+
| `commitChangeset` | After applying changeset to pending Unit state, before Adapter checks revision and writes | `userID`, `memberID`, `customData`, `request`, `changeset`, `expectedHeadRevision`, `attempt` | Repeated after database revision conflict | Final revision checks and metrics |
|
|
60
|
+
|
|
61
|
+
`applyChangeset` and `commitChangeset` must be retry-safe and cannot perform non-reversible side effects. A final merge into trunk still enters the trunk Service's own middleware.
|
|
62
|
+
|
|
63
|
+
## Advanced integration: call Worktree Service directly
|
|
64
|
+
|
|
65
|
+
Every call explicitly supplies the current user; no stateful Worktree handle needs to be opened or bound first:
|
|
66
|
+
|
|
67
|
+
```ts
|
|
68
|
+
const context = {
|
|
69
|
+
userID: user.userId,
|
|
70
|
+
customData: { tenantID, traceID },
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
await worktreeService.createWorktree(
|
|
74
|
+
{ worktreeID, units: [unitID] },
|
|
75
|
+
context
|
|
76
|
+
);
|
|
77
|
+
|
|
78
|
+
await worktreeService.markReady({ worktreeID }, context);
|
|
79
|
+
|
|
80
|
+
const result = await worktreeService.mergeWorktree(
|
|
81
|
+
{ worktreeID },
|
|
82
|
+
{ ...context, memberID }
|
|
83
|
+
);
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Regular lifecycle and read methods need only `userID`. `submitChangeset()` and `mergeWorktree()` also need `memberID` because they may be associated with an online collaboration submission. When using the frontend SDK through Worktree Endpoint, Endpoint supplies the online Session's `memberID`. Applications calling these methods directly supply one themselves; the Service only passes the string through.
|
|
87
|
+
|
|
88
|
+
`customData` belongs only to the current call. It can hold tenant, trace, or ACL query caches and is not automatically persisted into Worktree or changesets.
|
|
89
|
+
|
|
90
|
+
A retry of the same draft submission keeps `unitID/type/sid/reqId`; its `baseRev` may advance only through confirmed changesets ordered before it and must not pass its own confirmed revision. After reading and validating `(baseRev, draftHead]` history, the Service checks for a duplicate before OT and `applyChangeset`. The Database Adapter only serializes instance races with revision CAS; a losing attempt reloads and finds the submission in the new history.
|
|
91
|
+
|
|
92
|
+
## Common APIs
|
|
93
|
+
|
|
94
|
+
- `createWorktree()` / `getWorktree()`: create and read a Worktree.
|
|
95
|
+
- `addUnit()`: add an existing trunk Unit to a Worktree.
|
|
96
|
+
- `createUnitFromSnapshot()` / `createUnitFromData()`: create a Worktree-local Unit.
|
|
97
|
+
- `getUnitLoadData()` / `getChangesets()`: read draft collaboration data.
|
|
98
|
+
- `submitChangeset()`: submit a draft changeset.
|
|
99
|
+
- `markReady()` / `reopenWorktree()` / `discardWorktree()`: advance or terminate the lifecycle.
|
|
100
|
+
- `evaluateWorktreeUnitMerge()`: generate a merge evaluation or preview for one Unit.
|
|
101
|
+
- `mergeWorktree()`: merge Worktree Units into trunk one by one.
|
|
102
|
+
|
|
103
|
+
## Lifecycle
|
|
104
|
+
|
|
105
|
+
```text
|
|
106
|
+
create → draft → ready → merging → merged
|
|
107
|
+
↑ │
|
|
108
|
+
└ reopen┘
|
|
109
|
+
|
|
110
|
+
draft/ready → discarded
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
- Only `draft` accepts further changesets.
|
|
114
|
+
- `markReady()` freezes each Unit's current draft revision.
|
|
115
|
+
- `reopenWorktree()` permits `ready → draft`.
|
|
116
|
+
- `mergeWorktree()` merges one Unit at a time into trunk.
|
|
117
|
+
- Multi-Unit merge is not atomic across Units; display each Unit's `mergeResult`.
|
|
118
|
+
|
|
119
|
+
A Worktree can reference an existing trunk Unit or create a Worktree-only Unit through `createUnitFromData()`. After merge, a new Unit is created in trunk at revision `1`; draft changeset history is not copied.
|
|
120
|
+
|
|
121
|
+
## Permission boundary
|
|
122
|
+
|
|
123
|
+
Worktree middleware and trunk Service middleware are independent. Protect the Worktree and final trunk writes separately: check visibility in `readWorktreeData`, draft edit rights in `submitChangeset`, and formal merge rights in `mergeWorktree`. Merging into trunk still executes trunk Service authorization middleware.
|
|
124
|
+
|
|
125
|
+
A merge preview reuses read permission and does not grant formal merge permission. Worktree discoverability scope also cannot replace current Unit ACL checks.
|
|
126
|
+
|
|
127
|
+
## Merge evaluation
|
|
128
|
+
|
|
129
|
+
`evaluateWorktreeUnitMerge()` is used only in `ready` and may return:
|
|
130
|
+
|
|
131
|
+
- `preview`: trunk advanced and a static merged-result snapshot was generated.
|
|
132
|
+
- `conflict`: Worktree changes cannot be automatically merged into current trunk through OT.
|
|
133
|
+
- `not-behind`: trunk has not advanced past the revision recorded when Worktree was created.
|
|
134
|
+
- `already-merged`: this Unit completed in a previous partial merge.
|
|
135
|
+
- `not-applicable`: a Worktree-created Unit has no initial trunk revision.
|
|
136
|
+
|
|
137
|
+
Evaluation does not submit a changeset or change Worktree state. Formal merge always uses trunk state at execution time.
|
|
138
|
+
|
|
139
|
+
## Limitations and disposal
|
|
140
|
+
|
|
141
|
+
Worktree deletion, rollback/reset, History, cleanup of referenced trunk history, and periodic draft snapshots are not currently provided. Shutdown order is Worktree Service → trunk Service → both Adapters:
|
|
142
|
+
|
|
143
|
+
```ts
|
|
144
|
+
await worktreeService.dispose();
|
|
145
|
+
await collabService.dispose();
|
|
146
|
+
await worktreeDatabase.dispose();
|
|
147
|
+
await trunkDatabase.dispose();
|
|
148
|
+
```
|
package/README.zh-CN.md
ADDED
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
# @univerjs-pro/collaboration-worktree-service
|
|
2
|
+
|
|
3
|
+
[English](./README.md) | [简体中文](./README.zh-CN.md)
|
|
4
|
+
|
|
5
|
+
无网络依赖的 Univer Worktree Service,为一个或多个 Unit 提供可协同编辑的 draft、冻结、
|
|
6
|
+
合入评估和逐 Unit merge。
|
|
7
|
+
|
|
8
|
+
Worktree 以 `(worktreeID, unitID)` 隔离 draft changesets,复用 trunk
|
|
9
|
+
`UniverCollabService` 的 OT、Unit 数据处理和提交引擎,不修改现有 changeset 结构。
|
|
10
|
+
|
|
11
|
+
使用 Worktree Client 时,由 `UniverCollabWorktreeEndpoint` 调用 Worktree Service;应用
|
|
12
|
+
直接调用下面的 Service API 属于高级集成。
|
|
13
|
+
|
|
14
|
+
## 安装与创建
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
pnpm add \
|
|
18
|
+
@univerjs-pro/collaboration-service \
|
|
19
|
+
@univerjs-pro/collaboration-worktree-service \
|
|
20
|
+
@univerjs-pro/collaboration-worktree-endpoint \
|
|
21
|
+
@univerjs-pro/collaboration-database-sqlite \
|
|
22
|
+
@univerjs-pro/collaboration-worktree-database-sqlite
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
```ts
|
|
26
|
+
const trunkDatabase = new SQLiteDatabaseAdapter({ filename });
|
|
27
|
+
const worktreeDatabase = new SQLiteWorktreeDatabaseAdapter({ filename });
|
|
28
|
+
|
|
29
|
+
const collabService = new UniverCollabService({
|
|
30
|
+
dbAdapter: trunkDatabase,
|
|
31
|
+
});
|
|
32
|
+
const worktreeService = new UniverCollabWorktreeService({
|
|
33
|
+
trunk: {
|
|
34
|
+
service: collabService,
|
|
35
|
+
dbAdapter: trunkDatabase,
|
|
36
|
+
},
|
|
37
|
+
dbAdapter: worktreeDatabase,
|
|
38
|
+
});
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
trunk 和 Worktree Adapter 可以使用同一个 SQLite 文件,但仍是两个独立契约和生命周期
|
|
42
|
+
对象。全部协同包必须使用同一 release cohort 的匹配版本。
|
|
43
|
+
|
|
44
|
+
接着创建 `UniverCollabWorktreeEndpoint`,并与 trunk Endpoint 注册到同一个
|
|
45
|
+
Transport。
|
|
46
|
+
|
|
47
|
+
## Worktree middleware
|
|
48
|
+
|
|
49
|
+
Worktree middleware 与 trunk Service middleware 相互独立:
|
|
50
|
+
|
|
51
|
+
| Action | 触发时机 | 可见字段 | 重试语义 | 典型用途 |
|
|
52
|
+
| --- | --- | --- | --- | --- |
|
|
53
|
+
| `readWorktreeData` | Worktree Request 创建后、读 Adapter 前 | `userID`、`customData`、`request` | 每次 API 调用一次 | Worktree 可见性和管理读取 ACL |
|
|
54
|
+
| `createWorktree` | Request 创建后、创建 Worktree 前 | `userID`、`customData`、`request` | 每次调用一次 | 创建权限、配额和可发现范围 |
|
|
55
|
+
| `addWorktreeUnit` | Request 创建后、加入 trunk Unit 前 | `userID`、`customData`、`request` | 每次调用一次 | Unit 读取/编辑权限 |
|
|
56
|
+
| `createWorktreeUnit` | 初始 snapshot 准备后、创建 draft Unit 前 | `userID`、`customData`、`request` | 每次调用一次 | 新 Unit 类型、配额和创建权限 |
|
|
57
|
+
| `markWorktreeReady` | Request 创建后、Adapter 冻结各 Unit 当前 draft revision 前 | `userID`、`customData`、`request` | 每次调用一次 | ready 权限和评审规则 |
|
|
58
|
+
| `reopenWorktree` | Request 创建后、Adapter 切回 draft 前 | `userID`、`customData`、`request` | 每次调用一次 | reopen 权限 |
|
|
59
|
+
| `discardWorktree` | Request 创建后、Adapter discard 前 | `userID`、`customData`、`request` | 每次调用一次 | discard 权限和审计 |
|
|
60
|
+
| `mergeWorktree` | Request 创建后、开始或继续逐 Unit merge 前 | `userID`、`memberID`、`customData`、`request` | 每次 merge 调用一次;内部 Unit 提交重试不重复该 action | 正式合入权限 |
|
|
61
|
+
| `readUnitData` | Worktree Unit Request 创建后、读取 draft 数据前 | `userID`、`customData`、`request` | 每次 API 调用一次 | draft Unit 读取 ACL、合入预览读取 |
|
|
62
|
+
| `submitChangeset` | draft 提交 Request 创建后、幂等与 OT 前 | `userID`、`memberID`、`customData`、`request` | 每次逻辑提交一次;数据库 revision 冲突重试时不重复 | draft 编辑 ACL、大小限制 |
|
|
63
|
+
| `applyChangeset` | changeset 已通过 OT 与当前 revision 对齐、应用到待提交 Unit 状态前 | `userID`、`memberID`、`customData`、`request`、`changeset`、`currentRevision`、`attempt` | 数据库 revision 冲突后重复 | 对齐后的 mutation 检查 |
|
|
64
|
+
| `commitChangeset` | changeset 已应用到待提交 Unit 状态、Adapter 检查 revision 并写入前 | `userID`、`memberID`、`customData`、`request`、`changeset`、`expectedHeadRevision`、`attempt` | 数据库 revision 冲突后重复 | 最终 revision 检查和指标 |
|
|
65
|
+
|
|
66
|
+
`applyChangeset` 和 `commitChangeset` 必须可重试,不能执行不可回滚副作用。Worktree 最终
|
|
67
|
+
合入 trunk 时仍会进入 trunk Service 自己的 middleware。
|
|
68
|
+
|
|
69
|
+
## 高级集成:直接使用 Worktree Service API
|
|
70
|
+
|
|
71
|
+
每次调用都显式传入当前用户,不需要先打开或绑定一个有状态的 Worktree handle:
|
|
72
|
+
|
|
73
|
+
```ts
|
|
74
|
+
const context = {
|
|
75
|
+
userID: user.userId,
|
|
76
|
+
customData: { tenantID, traceID },
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
await worktreeService.createWorktree(
|
|
80
|
+
{ worktreeID, units: [unitID] },
|
|
81
|
+
context
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
await worktreeService.markReady({ worktreeID }, context);
|
|
85
|
+
|
|
86
|
+
const result = await worktreeService.mergeWorktree(
|
|
87
|
+
{ worktreeID },
|
|
88
|
+
{ ...context, memberID }
|
|
89
|
+
);
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
普通生命周期和读取方法只需要 `userID`。`submitChangeset()` 与 `mergeWorktree()` 还需要
|
|
93
|
+
`memberID`,因为它们可能关联一次在线协同提交。通过 Worktree Endpoint 使用前端 SDK
|
|
94
|
+
时,Endpoint 会提供在线 Session 的 `memberID`;应用直接调用这两个方法时自行传入,
|
|
95
|
+
Service 只透传该字符串。
|
|
96
|
+
|
|
97
|
+
`customData` 只属于本次调用,可用于 tenant、trace 或 ACL 查询缓存,不会自动持久化到
|
|
98
|
+
Worktree 或 changeset。
|
|
99
|
+
|
|
100
|
+
重试同一个 draft submission 时保持 `unitID/type/sid/reqId`;`baseRev` 只能越过排在它
|
|
101
|
+
之前的 confirmed changesets,不能越过自身 confirmed revision。Service 在读取并验证
|
|
102
|
+
`(baseRev, draftHead]` history 后、执行 OT 和 `applyChangeset` 前检查重复提交;Database
|
|
103
|
+
Adapter 只用 revision CAS 串行化多实例竞态,失败方 reload 后从新 history 命中 submission。
|
|
104
|
+
|
|
105
|
+
## 常用 API
|
|
106
|
+
|
|
107
|
+
- `createWorktree()` / `getWorktree()`:创建和读取 Worktree。
|
|
108
|
+
- `addUnit()`:把已有 trunk Unit 加入 Worktree。
|
|
109
|
+
- `createUnitFromSnapshot()` / `createUnitFromData()`:创建 Worktree 本地 Unit。
|
|
110
|
+
- `getUnitLoadData()` / `getChangesets()`:读取 draft 协同数据。
|
|
111
|
+
- `submitChangeset()`:提交 draft changeset。
|
|
112
|
+
- `markReady()` / `reopenWorktree()` / `discardWorktree()`:推进或终止生命周期。
|
|
113
|
+
- `evaluateWorktreeUnitMerge()`:生成单个 Unit 的合入评估或预览。
|
|
114
|
+
- `mergeWorktree()`:把 Worktree 中的 Unit 逐个合入 trunk。
|
|
115
|
+
|
|
116
|
+
## 生命周期
|
|
117
|
+
|
|
118
|
+
```text
|
|
119
|
+
create → draft → ready → merging → merged
|
|
120
|
+
↑ │
|
|
121
|
+
└ reopen┘
|
|
122
|
+
|
|
123
|
+
draft/ready → discarded
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
- 只有 `draft` 可以继续提交 changeset。
|
|
127
|
+
- `markReady()` 冻结每个 Unit 当前的 draft revision。
|
|
128
|
+
- `reopenWorktree()` 允许 `ready → draft`。
|
|
129
|
+
- `mergeWorktree()` 逐 Unit 合入 trunk。
|
|
130
|
+
- 多 Unit merge 不保证跨 Unit 原子性,应展示每个 Unit 的 `mergeResult`。
|
|
131
|
+
|
|
132
|
+
Worktree 可以引用已有 trunk Unit,也可以通过 `createUnitFromData()` 创建只存在于
|
|
133
|
+
Worktree 的新 Unit。新 Unit merge 后以 revision `1` 在 trunk 创建,不复制 draft
|
|
134
|
+
changeset 历史。
|
|
135
|
+
|
|
136
|
+
## 权限边界
|
|
137
|
+
|
|
138
|
+
Worktree middleware 与 trunk Service middleware 相互独立。应用应分别保护 Worktree
|
|
139
|
+
本身和最终 trunk 写入。例如在 `readWorktreeData` 检查可见性,在 `submitChangeset`
|
|
140
|
+
检查 draft 编辑权,在 `mergeWorktree` 检查正式合入权;合入 trunk 时仍会执行 trunk
|
|
141
|
+
Service 自己的权限 middleware。
|
|
142
|
+
|
|
143
|
+
合入预览复用读取权限,不代表用户拥有正式 merge 权限。Worktree 的可发现范围也不能替代
|
|
144
|
+
实时的 Unit ACL 检查。
|
|
145
|
+
|
|
146
|
+
## 合入评估
|
|
147
|
+
|
|
148
|
+
`evaluateWorktreeUnitMerge()` 只在 `ready` 状态使用,可能返回:
|
|
149
|
+
|
|
150
|
+
- `preview`:trunk 已前进,并生成静态合入结果 snapshot。
|
|
151
|
+
- `conflict`:Worktree 修改无法通过 OT 自动合入当前 trunk。
|
|
152
|
+
- `not-behind`:trunk 自创建 Worktree 时记录的 revision 后没有前进。
|
|
153
|
+
- `already-merged`:该 Unit 已在之前的部分 merge 中完成。
|
|
154
|
+
- `not-applicable`:Worktree 内新建 Unit,没有对应的初始 trunk revision。
|
|
155
|
+
|
|
156
|
+
评估不会提交 changeset,也不会改变 Worktree 状态;正式 merge 始终以执行时的 trunk
|
|
157
|
+
为准。
|
|
158
|
+
|
|
159
|
+
## 限制与资源释放
|
|
160
|
+
|
|
161
|
+
当前不提供 Worktree 删除、回滚/重置、History、Worktree 引用的 trunk 历史清理或周期性
|
|
162
|
+
draft snapshot。停止顺序为 Worktree Service → trunk Service → 两个 Adapter:
|
|
163
|
+
|
|
164
|
+
```ts
|
|
165
|
+
await worktreeService.dispose();
|
|
166
|
+
await collabService.dispose();
|
|
167
|
+
await worktreeDatabase.dispose();
|
|
168
|
+
await trunkDatabase.dispose();
|
|
169
|
+
```
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Object['defineProperty'](exports,Symbol['toStringTag'],{'value':'Module'});let e=require('node:crypto'),t=require('node:util'),n=require('@univerjs-pro/collaboration-service'),r=require('@univerjs/protocol');var i=class extends Error{['code'];['retryable'];['details'];constructor(_0x217243,_0x5d4f30,_0x4414b5={}){super(_0x5d4f30,{'cause':_0x4414b5['cause']}),this['name']='WorktreeError',this['code']=_0x217243,this['retryable']=_0x4414b5['retryable']??!0x1,_0x4414b5['details']!==void 0x0&&(this['details']=_0x4414b5['details']);}},a=class{['_worktreeID'];['_trunk'];['_worktree'];constructor(_0x42333b,_0x51fc6c,_0x13d7ca){this['_worktreeID']=_0x42333b,this['_trunk']=_0x51fc6c,this['_worktree']=_0x13d7ca;}async['getUnit'](_0xe7bacc,_0x3853cf){let _0x1b9a89=await this['_worktree']['getWorktreeUnit'](_0xe7bacc,this['_worktreeID'],_0x3853cf);return _0x1b9a89?{'unitID':_0x1b9a89['unitID'],'type':_0x1b9a89['type'],'headRevision':_0x1b9a89['draftHeadRevision']}:null;}async['getSnapshot'](_0x531fb0,_0x2a3d37,_0x29f1e7){let _0x2c2657=await this['_getUnitRecord'](_0x531fb0,_0x2a3d37);if(!_0x2c2657)return null;let _0x102f7c=_0x29f1e7?.['revision'],_0x15b386=_0x102f7c===void 0x0||_0x102f7c===0x0?_0x2c2657['draftHeadRevision']:Math['min'](_0x102f7c,_0x2c2657['draftHeadRevision']);if(_0x2c2657['source']==='worktree')return(await this['_worktree']['getUnitSeed'](_0x531fb0,this['_worktreeID'],_0x2a3d37))?.['snapshot']??null;let _0x207d5f=o(_0x2c2657);return this['_trunk']['getSnapshot'](_0x531fb0,_0x2a3d37,{'revision':Math['min'](_0x15b386,_0x207d5f)});}async['getChangesets'](_0x29aa2b,_0xdb1acc,_0x188785){let _0x13bb96=await this['_getUnitRecord'](_0x29aa2b,_0xdb1acc);if(!_0x13bb96)return{'changesets':[],'latestRevision':0x0};let _0x3505de=_0x188785['to']===0x0?_0x13bb96['draftHeadRevision']:Math['min'](_0x188785['to'],_0x13bb96['draftHeadRevision']);if(_0x13bb96['source']==='worktree')return{'changesets':[...(_0x188785['from']<_0x3505de?await this['_worktree']['getDraftChangesets'](_0x29aa2b,this['_worktreeID'],_0xdb1acc,{'from':Math['max'](_0x188785['from'],0x1),'to':_0x3505de}):{'changesets':[]})['changesets']],'latestRevision':_0x13bb96['draftHeadRevision']};let _0x7debd8=o(_0x13bb96),_0x2218a3=Math['min'](_0x3505de,_0x7debd8),_0x8225cc=_0x188785['from']<_0x2218a3?await this['_trunk']['getChangesets'](_0x29aa2b,_0xdb1acc,{'from':_0x188785['from'],'to':_0x2218a3}):{'changesets':[]},_0x5c54a3=Math['max'](_0x188785['from'],_0x7debd8),_0x590422=_0x5c54a3<_0x3505de?await this['_worktree']['getDraftChangesets'](_0x29aa2b,this['_worktreeID'],_0xdb1acc,{'from':_0x5c54a3,'to':_0x3505de}):{'changesets':[]};return{'changesets':[..._0x8225cc['changesets'],..._0x590422['changesets']],'latestRevision':_0x13bb96['draftHeadRevision']};}async['createUnit'](_0x1fe0f3,_0xa5e633){switch((await this['_worktree']['createUnit'](_0x1fe0f3,{'unit':{'worktreeID':this['_worktreeID'],'unitID':_0xa5e633['record']['unitID'],'type':_0xa5e633['record']['type'],'source':'worktree','draftHeadRevision':0x1},'seed':{'snapshot':_0xa5e633['snapshot'],..._0xa5e633['sheetBlocks']===void 0x0?{}:{'sheetBlocks':_0xa5e633['sheetBlocks']}}}))['status']){case'created':return{'status':'created','record':_0xa5e633['record']};case'already-created':return{'status':'already-exists','record':_0xa5e633['record']};case'not-found':throw new n['CollabError']('UNIT_NOT_FOUND','Worktree\x20'+this['_worktreeID']+'\x20does\x20not\x20exist');case'unit-exists':throw new n['CollabError']('INVALID_REQUEST','Unit\x20'+_0xa5e633['record']['unitID']+'\x20already\x20exists\x20in\x20the\x20Worktree');case'status-mismatch':throw new n['CollabError']('PERMISSION_DENIED','Worktree\x20'+this['_worktreeID']+'\x20is\x20not\x20editable');}}['deleteUnits'](_0x44ed7f,_0x573a48){return Promise['reject'](new n['CollabError']('INVALID_REQUEST','Cannot\x20delete\x20Units\x20through\x20a\x20Worktree\x20draft'));}['recoverUnits'](_0x4c0546,_0x35fa99){return Promise['reject'](new n['CollabError']('INVALID_REQUEST','Cannot\x20recover\x20Units\x20through\x20a\x20Worktree\x20draft'));}async['commitChangeset'](_0x2acba2,_0x4012ee){let _0x5c48b0=await this['_worktree']['commitDraftChangeset'](_0x2acba2,{'worktreeID':this['_worktreeID'],'changeset':_0x4012ee['changeset']});switch(_0x5c48b0['status']){case'committed':case'revision-mismatch':return _0x5c48b0;case'not-found':throw new n['CollabError']('UNIT_NOT_FOUND','Worktree\x20or\x20Worktree\x20Unit\x20does\x20not\x20exist');case'not-editable':throw new n['CollabError']('PERMISSION_DENIED','Worktree\x20is\x20'+_0x5c48b0['worktreeStatus']);case'unit-frozen':throw new n['CollabError']('PERMISSION_DENIED','Worktree\x20Unit\x20has\x20already\x20been\x20merged');}}['saveSnapshot'](_0x1c8bc8,_0x5c9b9a){return Promise['reject'](new n['CollabError']('INTERNAL_ERROR','Worktree\x20draft\x20snapshots\x20are\x20disabled'));}async['getSheetBlock'](_0x2c1146,_0x5e3a78,_0x52b0b2){let _0x1e26b3=await this['_getUnitRecord'](_0x2c1146,_0x5e3a78);return _0x1e26b3?_0x1e26b3['source']==='worktree'?(await this['_worktree']['getUnitSeed'](_0x2c1146,this['_worktreeID'],_0x5e3a78))?.['sheetBlocks']?.['find'](_0x31abc8=>_0x31abc8['id']===_0x52b0b2)??null:this['_trunk']['getSheetBlock'](_0x2c1146,_0x5e3a78,_0x52b0b2):null;}['_getUnitRecord'](_0xce81de,_0x370238){return this['_worktree']['getWorktreeUnit'](_0xce81de,this['_worktreeID'],_0x370238);}};function o(_0x38bfc5){if(_0x38bfc5['source']!=='trunk'||!Number['isSafeInteger'](_0x38bfc5['baselineTrunkRevision'])||_0x38bfc5['baselineTrunkRevision']<0x1)throw new n['CollabError']('ADAPTER_FAILURE','Trunk-sourced\x20Worktree\x20Unit\x20has\x20no\x20valid\x20baseline');return _0x38bfc5['baselineTrunkRevision'];}async function s(_0x214bf4){let _0x55eb81=new n['UniverUnitRuntime']({'dbAdapter':_0x214bf4['dbAdapter'],..._0x214bf4['runtime']?.['maxLoadedUnits']===void 0x0?{}:{'maxLoadedUnits':_0x214bf4['runtime']['maxLoadedUnits']},..._0x214bf4['runtime']?.['idleTimeoutMs']===void 0x0?{}:{'idleTimeoutMs':_0x214bf4['runtime']['idleTimeoutMs']}});try{let _0xcd1531=await _0x55eb81['ensureUnit'](_0x214bf4['context'],_0x214bf4['unitID'],_0x214bf4['type']);try{if(_0xcd1531['revision']!==_0x214bf4['expectedRevision'])throw c('Unit\x20Runtime\x20did\x20not\x20reach\x20the\x20frozen\x20Worktree\x20revision');let _0x391997=await _0x55eb81['createSnapshot'](_0xcd1531);if(_0x391997['snapshot']['unitID']!==_0x214bf4['unitID']||_0x391997['snapshot']['type']!==_0x214bf4['type']||_0x391997['snapshot']['rev']!==_0x214bf4['expectedRevision'])throw c('Unit\x20Runtime\x20returned\x20an\x20invalid\x20Worktree\x20snapshot');return _0x391997;}finally{_0x55eb81['releaseUnit'](_0xcd1531);}}finally{await _0x55eb81['dispose']();}}function c(_0x1e803a){return new n['CollabError']('ADAPTER_FAILURE',_0x1e803a,{'retryable':!0x0});}async function l(_0x26274a){let _0x2aee2f=new n['UniverUnitRuntime']({'dbAdapter':_0x26274a['dbAdapter'],..._0x26274a['runtime']?.['maxLoadedUnits']===void 0x0?{}:{'maxLoadedUnits':_0x26274a['runtime']['maxLoadedUnits']},..._0x26274a['runtime']?.['idleTimeoutMs']===void 0x0?{}:{'idleTimeoutMs':_0x26274a['runtime']['idleTimeoutMs']}});try{let _0x2fb0d3=u(_0x2aee2f,_0x26274a),_0x1e0ce1=await _0x2aee2f['ensureUnit'](_0x26274a['context'],_0x26274a['unitID'],_0x26274a['type']);try{if(_0x1e0ce1['revision']!==_0x26274a['trunkHeadRevision'])throw new n['CollabError']('REVISION_MISMATCH','Trunk\x20changed\x20while\x20materializing\x20Worktree\x20merge\x20preview',{'retryable':!0x0});if(await _0x2aee2f['applyChangeset'](_0x26274a['context'],_0x1e0ce1,_0x2fb0d3),_0x1e0ce1['revision']!==_0x2fb0d3['revision'])throw new n['CollabError']('INTERNAL_ERROR','Preview\x20Runtime\x20did\x20not\x20reach\x20the\x20merge\x20candidate\x20revision',{'retryable':!0x0});return await _0x2aee2f['createSnapshot'](_0x1e0ce1);}finally{_0x2aee2f['releaseUnit'](_0x1e0ce1);}}finally{await _0x2aee2f['dispose']();}}function u(_0x450b9a,_0x1ba908){let _0x5b8b6c=_0x450b9a['changesetTransformer']['parseClient'](_0x1ba908['original']);return{..._0x450b9a['changesetTransformer']['transform'](_0x5b8b6c,_0x1ba908['trunkHistory']),'unitID':_0x1ba908['original']['unitID'],'type':_0x1ba908['original']['type'],'baseRev':_0x1ba908['trunkHeadRevision'],'revision':_0x1ba908['trunkHeadRevision']+0x1,'sid':_0x1ba908['original']['sid'],'reqId':_0x1ba908['original']['reqId']};}var d=class{['_middlewares']=new Map();['use'](_0x2a454a,_0x2a6ec8){let _0x56513a=this['_middlewares']['get'](_0x2a454a)??[],_0x38a811=_0x2a6ec8;_0x56513a['push'](_0x38a811),this['_middlewares']['set'](_0x2a454a,_0x56513a);let _0x555c71=!0x1;return{'dispose':()=>{if(_0x555c71)return;_0x555c71=!0x0;let _0x3b7b19=_0x56513a['indexOf'](_0x38a811);_0x3b7b19>=0x0&&_0x56513a['splice'](_0x3b7b19,0x1);}};}async['run'](_0x320028,_0x181c09,_0x9cca87){let _0x259dcd=[...this['_middlewares']['get'](_0x320028)??[]],_0x25130d=async _0x1ebc93=>{let _0x42c307=_0x259dcd[_0x1ebc93];if(!_0x42c307){await _0x9cca87();return;}let _0x54fed7=!0x1,_0x58b6a0,_0x55b5c4=()=>{if(_0x54fed7)throw Error('Middleware\x20for\x20action\x20'+String(_0x320028)+'\x20called\x20next()\x20more\x20than\x20once');return _0x54fed7=!0x0,_0x58b6a0=_0x25130d(_0x1ebc93+0x1),_0x58b6a0;};try{await _0x42c307(_0x181c09,_0x55b5c4);}catch(_0x2b78ed){if(_0x58b6a0)try{await _0x58b6a0;}catch{}throw _0x2b78ed;}if(!_0x54fed7)throw Error('Middleware\x20for\x20action\x20'+String(_0x320028)+'\x20completed\x20without\x20calling\x20next()');await _0x58b6a0;};await _0x25130d(0x0);}['clear'](){this['_middlewares']['clear']();}};function f(_0x542346){return{'worktreeID':_0x542346['worktreeID'],'units':_0x542346['units']??[]};}function p(_0x63bfb4){return{'worktreeID':_0x63bfb4['worktreeID']};}function m(_0x24ab6c){return{'worktreeID':_0x24ab6c['worktreeID'],'unitID':_0x24ab6c['unitID']};}function ee(_0x356fd2){return{'worktreeID':_0x356fd2['worktreeID']};}function h(_0x7c68b4){return{'worktreeID':_0x7c68b4['worktreeID']};}function g(_0x480f03){return{'worktreeID':_0x480f03['worktreeID']};}function _(_0x47a0c6){return{'worktreeID':_0x47a0c6['worktreeID']};}function te(_0x3f5402){return{'worktreeID':_0x3f5402['worktreeID'],'unitID':_0x3f5402['unitID']};}var v=class{['_onListenerError'];['_listeners']=new Map();constructor(_0x2207a9){this['_onListenerError']=_0x2207a9;}['on'](_0x3731fe,_0x12795a){let _0x4d6f87=this['_listeners']['get'](_0x3731fe)??[],_0xafde99=_0x12795a;_0x4d6f87['push'](_0xafde99),this['_listeners']['set'](_0x3731fe,_0x4d6f87);let _0x3fe210=!0x1;return{'dispose':()=>{if(_0x3fe210)return;_0x3fe210=!0x0;let _0x17d734=_0x4d6f87['indexOf'](_0xafde99);_0x17d734>=0x0&&_0x4d6f87['splice'](_0x17d734,0x1);}};}async['emit'](_0x2503db,_0x22969c){for(let _0x4500b2 of[...this['_listeners']['get'](_0x2503db)??[]])try{await _0x4500b2(_0x22969c);}catch(_0x2bb17a){try{this['_onListenerError'](_0x2bb17a);}catch{}}}['clear'](){this['_listeners']['clear']();}},y=class{['_state']='running';['_activeCalls']=0x0;['_resolveDrain'];['_disposePromise'];get['state'](){return this['_state'];}['run'](_0x5eb0b2){return this['_state']==='running'?(this['_activeCalls']+=0x1,Promise['resolve']()['then'](_0x5eb0b2)['finally'](()=>{--this['_activeCalls'],this['_activeCalls']===0x0&&(this['_resolveDrain']?.(),this['_resolveDrain']=void 0x0);})):Promise['reject'](new n['CollabError']('INTERNAL_ERROR','Worktree\x20Service\x20is\x20'+this['_state'],{'retryable':!0x0}));}['dispose'](_0x41daff){return this['_disposePromise']?this['_disposePromise']:(this['_state']='disposing',this['_disposePromise']=this['_finishDispose'](_0x41daff),this['_disposePromise']);}async['_finishDispose'](_0x5747d4){this['_activeCalls']>0x0&&await new Promise(_0x17eef0=>{this['_resolveDrain']=_0x17eef0;});try{await _0x5747d4();}finally{this['_state']='disposed';}}},b=new Set([r['UniverType']['UNIVER_SHEET'],r['UniverType']['UNIVER_DOC'],r['UniverType']['UNIVER_SLIDE'],r['UniverType']['UNIVER_BOARD'],r['UniverType']['UNIVER_BASE']]),x=class{['_trunkService'];['_trunkDbAdapter'];['_dbAdapter'];['_middleware']=new d();['_events'];['_lifecycle']=new y();['_logger'];['_metrics'];['_runtimeOptions'];['_maxRevisionRetries'];['_draftServices']=new Map();constructor(_0x5e1f7f){if(!_0x5e1f7f?.['trunk']?.['service']||!_0x5e1f7f['trunk']['dbAdapter'])throw TypeError('UniverCollabWorktreeService\x20requires\x20trunk\x20service\x20and\x20dbAdapter');if(!_0x5e1f7f['dbAdapter'])throw TypeError('UniverCollabWorktreeService\x20requires\x20a\x20Worktree\x20dbAdapter');if(this['_trunkService']=_0x5e1f7f['trunk']['service'],this['_trunkDbAdapter']=_0x5e1f7f['trunk']['dbAdapter'],this['_dbAdapter']=_0x5e1f7f['dbAdapter'],this['_runtimeOptions']=_0x5e1f7f['runtime'],this['_maxRevisionRetries']=_0x5e1f7f['submitChangeset']?.['maxRevisionRetries'],this['_maxRevisionRetries']!==void 0x0&&(!Number['isSafeInteger'](this['_maxRevisionRetries'])||this['_maxRevisionRetries']<0x0))throw TypeError('submitChangeset.maxRevisionRetries\x20must\x20be\x20a\x20non-negative\x20safe\x20integer');this['_logger']=ne(_0x5e1f7f['logger']),this['_metrics']=re(_0x5e1f7f['metrics']),this['_events']=new v(_0x1da84e=>{this['_logger']['error']('Worktree\x20Service\x20event\x20listener\x20failed',{'error':$(_0x1da84e)});});}['use'](_0x3e46e6,_0x34811e){return this['_assertRunning'](),this['_middleware']['use'](_0x3e46e6,_0x34811e);}['on'](_0x45d2bf,_0x1887e6){return this['_assertRunning'](),this['_events']['on'](_0x45d2bf,_0x1887e6);}['createWorktree'](_0x5004de,_0x3030ec){return this['_call']('createWorktree',async()=>{let _0x51415b=C(_0x3030ec),_0x301009=f(_0x5004de),_0x25f6d3={..._0x51415b,'request':_0x301009},_0x3c56f4;return await this['_middleware']['run']('createWorktree',_0x25f6d3,async()=>{S(_0x5004de['worktreeID']),D(_0x301009['units']);let _0x1dcd7a=await Promise['all'](_0x301009['units']['map'](_0x29d8c5=>this['_requireTrunkUnit'](_0x25f6d3,_0x29d8c5))),_0x2df98b=await this['_database'](()=>this['_dbAdapter']['createWorktree'](_0x25f6d3,{'record':{'worktreeID':_0x5004de['worktreeID'],'sid':(0x0,e['randomUUID'])(),'status':'draft'},'units':_0x1dcd7a['map'](_0x2a7e7b=>({'worktreeID':_0x5004de['worktreeID'],'unitID':_0x2a7e7b['unitID'],'type':_0x2a7e7b['type'],'source':'trunk','baselineTrunkRevision':_0x2a7e7b['headRevision'],'draftHeadRevision':_0x2a7e7b['headRevision']}))})),_0x196cf9=R(_0x2df98b['aggregate'],_0x5004de['worktreeID']);if(_0x2df98b['status']==='already-exists')throw new i('WORKTREE_ALREADY_EXISTS','Worktree\x20'+_0x5004de['worktreeID']+'\x20already\x20exists');L(_0x196cf9,_0x301009['units']),_0x3c56f4={'worktree':_0x196cf9},await this['_events']['emit']('worktreeCreated',{'userID':_0x51415b['userID'],'customData':_0x51415b['customData'],'request':_0x301009,'worktree':_0x196cf9,'occurredAt':Date['now']()});}),_0x3c56f4;});}['getWorktree'](_0x5e864f,_0x3d37a5){return this['_call']('getWorktree',async()=>{let _0x3ac16e=C(_0x3d37a5),_0x4c4a96=p(_0x5e864f),_0x223f4a={..._0x3ac16e,'request':_0x4c4a96},_0x59256a;return await this['_middleware']['run']('readWorktreeData',_0x223f4a,async()=>{S(_0x5e864f['worktreeID']);let _0x25dc68=await this['_database'](()=>this['_dbAdapter']['getWorktree'](_0x223f4a,_0x5e864f['worktreeID']));if(!_0x25dc68)throw Y(_0x5e864f['worktreeID']);_0x59256a={'worktree':R(_0x25dc68,_0x5e864f['worktreeID'])};}),_0x59256a;});}['addUnit'](_0x57114e,_0x29768a){return this['_call']('addUnit',async()=>{let _0x4cc2ca=C(_0x29768a),_0x188acd=m(_0x57114e),_0x5bafaf={..._0x4cc2ca,'request':_0x188acd},_0x1171b9;return await this['_middleware']['run']('addWorktreeUnit',_0x5bafaf,async()=>{if(S(_0x57114e['worktreeID']),!_0x57114e['unitID'])throw X('unitID\x20is\x20required');let _0x587a9d=await this['_requireTrunkUnit'](_0x5bafaf,_0x57114e['unitID']),_0x3f17d6=await this['_database'](()=>this['_dbAdapter']['addUnit'](_0x5bafaf,{'unit':{'worktreeID':_0x57114e['worktreeID'],'unitID':_0x587a9d['unitID'],'type':_0x587a9d['type'],'source':'trunk','baselineTrunkRevision':_0x587a9d['headRevision'],'draftHeadRevision':_0x587a9d['headRevision']}}));if(_0x3f17d6['status']==='not-found')throw Y(_0x57114e['worktreeID']);let _0x1da18b=R(_0x3f17d6['aggregate'],_0x57114e['worktreeID']);if(_0x3f17d6['status']==='status-mismatch')throw new i('WORKTREE_NOT_EDITABLE','Worktree\x20'+_0x57114e['worktreeID']+'\x20is\x20'+_0x1da18b['status'],{'details':{'status':_0x1da18b['status']}});if(_0x1171b9={'worktree':_0x1da18b},_0x3f17d6['status']==='added'){let _0x353388=U(_0x1da18b,_0x57114e['unitID']);await this['_events']['emit']('worktreeUnitAdded',{'userID':_0x4cc2ca['userID'],'customData':_0x4cc2ca['customData'],'request':_0x188acd,'worktree':_0x1da18b,'unit':_0x353388,'occurredAt':Date['now']()});}}),_0x1171b9;});}['createUnitFromSnapshot'](_0x3e3fae,_0x307956){return this['_call']('createUnitFromSnapshot',async()=>{S(_0x3e3fae['worktreeID']);let _0x3ccc5d=C(_0x307956),{worktreeID:_0x48747a,..._0x1fb3e1}=_0x3e3fae;await this['_draftService'](_0x48747a)['createUnitFromSnapshot'](_0x1fb3e1,_0x3ccc5d);let _0x3ef3d3=p({'worktreeID':_0x48747a});return{'worktree':R(await this['_requireWorktreeAggregate']({..._0x3ccc5d,'request':_0x3ef3d3},_0x48747a),_0x48747a)};});}['createUnitFromData'](_0x25fb2c,_0x5f023c){return this['_call']('createUnitFromData',async()=>{S(_0x25fb2c['worktreeID']);let _0x20435e=C(_0x5f023c),{worktreeID:_0x8ca3e8,..._0x25073a}=_0x25fb2c;await this['_draftService'](_0x8ca3e8)['createUnitFromData'](_0x25073a,_0x20435e);let _0x1e51ec=p({'worktreeID':_0x8ca3e8});return{'worktree':R(await this['_requireWorktreeAggregate']({..._0x20435e,'request':_0x1e51ec},_0x8ca3e8),_0x8ca3e8)};});}['markReady'](_0x2400fb,_0x54aefa){return this['_call']('markReady',async()=>{let _0x25fefa=C(_0x54aefa),_0x51d56e=ee(_0x2400fb),_0x1eeafe={..._0x25fefa,'request':_0x51d56e},_0x2cfbf5;return await this['_middleware']['run']('markWorktreeReady',_0x1eeafe,async()=>{_0x2cfbf5=await this['_transition'](_0x2400fb['worktreeID'],_0x25fefa,_0x51d56e,()=>this['_dbAdapter']['markReady'](_0x1eeafe,_0x2400fb['worktreeID']));}),_0x2cfbf5;});}['reopenWorktree'](_0x1e7ed0,_0x5b08e6){return this['_call']('reopenWorktree',async()=>{let _0x5cf313=C(_0x5b08e6),_0x11af58=h(_0x1e7ed0),_0xf776f9={..._0x5cf313,'request':_0x11af58},_0x4a4fca;return await this['_middleware']['run']('reopenWorktree',_0xf776f9,async()=>{_0x4a4fca=await this['_transition'](_0x1e7ed0['worktreeID'],_0x5cf313,_0x11af58,()=>this['_dbAdapter']['reopenWorktree'](_0xf776f9,_0x1e7ed0['worktreeID']));}),_0x4a4fca;});}['discardWorktree'](_0x54178b,_0x371b8b){return this['_call']('discardWorktree',async()=>{let _0x597ae7=C(_0x371b8b),_0x3ff19b=g(_0x54178b),_0x1d57fb={..._0x597ae7,'request':_0x3ff19b},_0x7d2518;return await this['_middleware']['run']('discardWorktree',_0x1d57fb,async()=>{_0x7d2518=await this['_transition'](_0x54178b['worktreeID'],_0x597ae7,_0x3ff19b,()=>this['_dbAdapter']['discardWorktree'](_0x1d57fb,_0x54178b['worktreeID']));}),_0x7d2518;});}['mergeWorktree'](_0x235620,_0x4bb1d7){return this['_call']('mergeWorktree',async()=>{let _0x4543d7=w(_0x4bb1d7),_0x6cae12=_(_0x235620),_0x4ce7a1={..._0x4543d7,'request':_0x6cae12},_0x296072;return await this['_middleware']['run']('mergeWorktree',_0x4ce7a1,async()=>{S(_0x235620['worktreeID']);let _0x702ddc=await this['_database'](()=>this['_dbAdapter']['startOrResumeMerge'](_0x4ce7a1,_0x235620['worktreeID']));if(_0x702ddc['status']==='not-found')throw Y(_0x235620['worktreeID']);let _0x23ba09=_0x702ddc['aggregate'],_0x51412c=R(_0x23ba09,_0x235620['worktreeID']);if(_0x702ddc['status']==='status-mismatch')throw new i('WORKTREE_STATUS_MISMATCH','Worktree\x20'+_0x235620['worktreeID']+'\x20cannot\x20merge\x20from\x20'+_0x51412c['status'],{'details':{'status':_0x51412c['status']}});if(_0x702ddc['status']==='already-merged'){_0x296072={'worktree':_0x51412c};return;}_0x702ddc['status']==='started'&&await this['_events']['emit']('worktreeStatusChanged',{'userID':_0x4543d7['userID'],'customData':_0x4543d7['customData'],'request':_0x6cae12,'worktree':_0x51412c,'previousStatus':'ready','status':'merging','occurredAt':Date['now']()});for(let _0x291e8d of _0x23ba09['units']){if(J(_0x291e8d['mergeResult']))continue;let _0x3a68db=await this['_mergeUnit'](_0x4ce7a1,_0x23ba09['worktree']['sid'],_0x291e8d,_0x4543d7),_0x424779=await this['_database'](()=>this['_dbAdapter']['recordUnitMergeResult'](_0x4ce7a1,{'worktreeID':_0x235620['worktreeID'],'unitID':_0x291e8d['unitID'],'readyDraftHeadRevision':O(_0x291e8d),'mergeResult':_0x3a68db}));if(_0x424779['status']==='not-found')throw Y(_0x235620['worktreeID']);if(_0x424779['status']==='stale-merge'){if(_0x23ba09=await this['_requireWorktreeAggregate'](_0x4ce7a1,_0x235620['worktreeID']),_0x51412c=R(_0x23ba09,_0x235620['worktreeID']),_0x23ba09['worktree']['status']!=='merging')break;continue;}if(_0x424779['status']!=='recorded'&&_0x424779['status']!=='already-recorded')throw Z('Database\x20returned\x20an\x20invalid\x20merge\x20result\x20status');_0x23ba09=_0x424779['aggregate'],_0x51412c=R(_0x23ba09,_0x235620['worktreeID']),_0x424779['status']==='recorded'&&await this['_events']['emit']('worktreeUnitMergeResultRecorded',{'userID':_0x4543d7['userID'],'customData':_0x4543d7['customData'],'request':_0x6cae12,'worktree':_0x51412c,'unit':U(_0x51412c,_0x291e8d['unitID']),'occurredAt':Date['now']()});}if(_0x23ba09['worktree']['status']==='merging'){let _0x22f569=await this['_database'](()=>this['_dbAdapter']['finishMerge'](_0x4ce7a1,_0x235620['worktreeID']));if(_0x22f569['status']==='not-found')throw Y(_0x235620['worktreeID']);if(_0x23ba09=_0x22f569['aggregate'],_0x51412c=R(_0x23ba09,_0x235620['worktreeID']),_0x22f569['status']==='transitioned')await this['_events']['emit']('worktreeStatusChanged',{'userID':_0x4543d7['userID'],'customData':_0x4543d7['customData'],'request':_0x6cae12,'worktree':_0x51412c,'previousStatus':_0x22f569['previousStatus'],'status':_0x51412c['status'],'occurredAt':Date['now']()});else{if(_0x22f569['status']==='status-mismatch'&&_0x51412c['status']!=='ready'&&_0x51412c['status']!=='merged')throw new i('WORKTREE_STALE_MERGE','Worktree\x20'+_0x235620['worktreeID']+'\x20merge\x20was\x20superseded',{'retryable':!0x0,'details':{'status':_0x51412c['status']}});}}_0x296072={'worktree':_0x51412c};}),_0x296072;});}['evaluateWorktreeUnitMerge'](_0x4c96c0,_0x3fcced){return this['_call']('evaluateWorktreeUnitMerge',async()=>{let _0x5d7d3d=C(_0x3fcced),_0x3c60ca=te(_0x4c96c0),_0x55686b={..._0x5d7d3d,'request':_0x3c60ca},_0x22d150;return await this['_middleware']['run']('readUnitData',_0x55686b,async()=>{if(S(_0x4c96c0['worktreeID']),!_0x4c96c0['unitID'])throw X('unitID\x20is\x20required');let _0x111542=await this['_requireWorktreeAggregate'](_0x55686b,_0x4c96c0['worktreeID']);if(_0x111542['worktree']['status']!=='ready')throw new i('WORKTREE_STATUS_MISMATCH','Worktree\x20'+_0x4c96c0['worktreeID']+'\x20cannot\x20preview\x20from\x20'+_0x111542['worktree']['status'],{'details':{'status':_0x111542['worktree']['status']}});let _0x463475=_0x111542['units']['find'](_0x4ed92a=>_0x4ed92a['unitID']===_0x4c96c0['unitID']);if(!_0x463475)throw new i('WORKTREE_UNIT_NOT_FOUND','Unit\x20'+_0x4c96c0['unitID']+'\x20does\x20not\x20exist\x20in\x20Worktree\x20'+_0x4c96c0['worktreeID']);if(_0x463475['source']==='worktree'){_0x22d150={'status':'not-applicable','reason':'worktree-created-unit','worktreeID':_0x4c96c0['worktreeID'],'unitID':_0x4c96c0['unitID']};return;}if(J(_0x463475['mergeResult'])){_0x22d150={'status':'already-merged','worktreeID':_0x4c96c0['worktreeID'],'unitID':_0x4c96c0['unitID'],'mergeResult':q(_0x463475['mergeResult'])};return;}let _0x5e1b57=B(_0x463475),_0x2d4aec=O(_0x463475),_0x3309b1=await this['_trunkService']['getUnitLoadData']({'unitID':_0x463475['unitID'],'type':_0x463475['type'],'revision':0x0},_0x5d7d3d);if(_0x3309b1['targetRevision']===_0x5e1b57){_0x22d150={'status':'not-behind','worktreeID':_0x4c96c0['worktreeID'],'unitID':_0x4c96c0['unitID']};return;}if(_0x3309b1['targetRevision']<_0x5e1b57)throw Z('Trunk\x20head\x20is\x20behind\x20the\x20Worktree\x20baseline');let _0x1d0a7f=k(_0x463475,_0x2d4aec,await this['_database'](()=>this['_dbAdapter']['getDraftChangesets'](_0x55686b,_0x463475['worktreeID'],_0x463475['unitID'],{'from':_0x5e1b57,'to':_0x2d4aec}))),_0x131f48=await this['_trunkService']['getChangesets']({'unitID':_0x463475['unitID'],'type':_0x463475['type'],'from':_0x5e1b57,'to':_0x3309b1['targetRevision']},_0x5d7d3d);try{let _0x354347={'context':_0x55686b,'dbAdapter':this['_trunkDbAdapter'],'unitID':_0x463475['unitID'],'type':_0x463475['type'],...this['_runtimeOptions']===void 0x0?{}:{'runtime':this['_runtimeOptions']}},_0x2724d6=_0x2d4aec===_0x5e1b57?await s({..._0x354347,'expectedRevision':_0x3309b1['targetRevision']}):await l({..._0x354347,'trunkHeadRevision':_0x3309b1['targetRevision'],'original':A(_0x111542['worktree']['sid'],_0x463475,_0x2d4aec,_0x1d0a7f,{'userID':_0x5d7d3d['userID'],'memberID':'worktree-merge-preview'}),'trunkHistory':_0x131f48['changesets']});_0x22d150={'status':'preview','worktreeID':_0x4c96c0['worktreeID'],'unitID':_0x4c96c0['unitID'],'preview':_0x2724d6};}catch(_0x36e5e8){if(_0x36e5e8 instanceof n['CollabError']&&_0x36e5e8['code']==='OT_CONFLICT'){_0x22d150={'status':'conflict','worktreeID':_0x4c96c0['worktreeID'],'unitID':_0x4c96c0['unitID'],'error':M(_0x36e5e8)};return;}throw _0x36e5e8;}}),_0x22d150;});}['getUnitLoadData'](_0x2c64e7,_0x3b5768){return this['_call']('getUnitLoadData',()=>(S(_0x2c64e7['worktreeID']),this['_draftService'](_0x2c64e7['worktreeID'])['getUnitLoadData']({'unitID':_0x2c64e7['unitID'],'type':_0x2c64e7['type'],'revision':_0x2c64e7['revision']},C(_0x3b5768))));}['getChangesets'](_0x323344,_0x325852){return this['_call']('getChangesets',()=>(S(_0x323344['worktreeID']),this['_draftService'](_0x323344['worktreeID'])['getChangesets']({'unitID':_0x323344['unitID'],'type':_0x323344['type'],'from':_0x323344['from'],'to':_0x323344['to']},C(_0x325852))));}['getSheetBlock'](_0x455f62,_0x3fa6af){return this['_call']('getSheetBlock',()=>(S(_0x455f62['worktreeID']),this['_draftService'](_0x455f62['worktreeID'])['getSheetBlock']({'unitID':_0x455f62['unitID'],'type':_0x455f62['type'],'blockID':_0x455f62['blockID']},C(_0x3fa6af))));}['submitChangeset'](_0x33a856,_0x386959){return this['_call']('submitChangeset',()=>(S(_0x33a856['worktreeID']),this['_draftService'](_0x33a856['worktreeID'])['submitChangeset']({'changeset':_0x33a856['changeset']},w(_0x386959))));}['dispose'](){return this['_lifecycle']['dispose'](async()=>{this['_middleware']['clear'](),this['_events']['clear']();let _0x16c49f=[...this['_draftServices']['values']()];this['_draftServices']['clear'](),await Promise['all'](_0x16c49f['map'](_0x5a7071=>_0x5a7071['dispose']()));});}['_draftService'](_0xe842f6){let _0x263423=this['_draftServices']['get'](_0xe842f6);if(_0x263423)return _0x263423;let _0x44bafc=new n['UniverCollabService']({'dbAdapter':new a(_0xe842f6,this['_trunkDbAdapter'],this['_dbAdapter']),'snapshotPolicy':!0x1,...this['_runtimeOptions']===void 0x0?{}:{'runtime':this['_runtimeOptions']},...this['_maxRevisionRetries']===void 0x0?{}:{'submitChangeset':{'maxRevisionRetries':this['_maxRevisionRetries']}},'logger':this['_logger'],'metrics':this['_metrics']});return _0x44bafc['use']('createUnit',(_0x1ac8e6,_0xade5b1)=>{let _0x3a1709=E(_0x1ac8e6['request'],_0xe842f6);return this['_middleware']['run']('createWorktreeUnit',{'userID':_0x1ac8e6['userID'],'customData':_0x1ac8e6['customData'],'request':_0x3a1709},_0xade5b1);}),_0x44bafc['use']('readUnitData',(_0x1a8a1a,_0x261d4b)=>{let _0x2a2e53=E(_0x1a8a1a['request'],_0xe842f6);return this['_middleware']['run']('readUnitData',{'userID':_0x1a8a1a['userID'],'customData':_0x1a8a1a['customData'],'request':_0x2a2e53},_0x261d4b);}),_0x44bafc['use']('submitChangeset',(_0xa7c9f,_0x80ce02)=>{let _0x19e814=E(_0xa7c9f['request'],_0xe842f6);return this['_middleware']['run']('submitChangeset',{'userID':_0xa7c9f['userID'],'memberID':_0xa7c9f['memberID'],'customData':_0xa7c9f['customData'],'request':_0x19e814},_0x80ce02);}),_0x44bafc['use']('applyChangeset',(_0x77ee6f,_0x3943c4)=>{let _0x1533bc=E(_0x77ee6f['request'],_0xe842f6);return this['_middleware']['run']('applyChangeset',{'userID':_0x77ee6f['userID'],'memberID':_0x77ee6f['memberID'],'customData':_0x77ee6f['customData'],'request':_0x1533bc,'attempt':_0x77ee6f['attempt'],'currentRevision':_0x77ee6f['currentRevision'],'changeset':_0x77ee6f['changeset']},_0x3943c4);}),_0x44bafc['use']('commitChangeset',(_0x2c0a68,_0x1974ec)=>{let _0x23d5cb=E(_0x2c0a68['request'],_0xe842f6);return this['_middleware']['run']('commitChangeset',{'userID':_0x2c0a68['userID'],'memberID':_0x2c0a68['memberID'],'customData':_0x2c0a68['customData'],'request':_0x23d5cb,'attempt':_0x2c0a68['attempt'],'expectedHeadRevision':_0x2c0a68['expectedHeadRevision'],'changeset':_0x2c0a68['changeset']},_0x1974ec);}),_0x44bafc['on']('changesetCommitted',_0x384bab=>{let _0x328aca=E(_0x384bab['request'],_0xe842f6);return this['_events']['emit']('changesetCommitted',{'userID':_0x384bab['userID'],'memberID':_0x384bab['memberID'],'customData':_0x384bab['customData'],'request':_0x328aca,'changeset':_0x384bab['changeset'],'committedAt':_0x384bab['committedAt']});}),_0x44bafc['on']('unitCreated',async _0xc19d44=>{let _0x1a0269=E(_0xc19d44['request'],_0xe842f6),_0x541188=R(await this['_requireWorktreeAggregate']({'userID':_0xc19d44['userID'],'customData':_0xc19d44['customData'],'request':_0x1a0269},_0xe842f6),_0xe842f6);await this['_events']['emit']('worktreeUnitCreated',{'userID':_0xc19d44['userID'],'customData':_0xc19d44['customData'],'request':_0x1a0269,'worktree':_0x541188,'unit':U(_0x541188,_0xc19d44['record']['unitID']),'occurredAt':_0xc19d44['createdAt']});}),this['_draftServices']['set'](_0xe842f6,_0x44bafc),_0x44bafc;}async['_mergeUnit'](_0x3ca546,_0x4eb902,_0x3365a2,_0x133c3d){try{if(_0x3365a2['source']==='worktree')return await this['_mergeCreatedUnit'](_0x3ca546,_0x3365a2,_0x133c3d);let _0x37ab3e=B(_0x3365a2),_0x523a30=O(_0x3365a2);if(_0x523a30===_0x37ab3e)return{'status':'unchanged'};let _0x54668c=k(_0x3365a2,_0x523a30,await this['_database'](()=>this['_dbAdapter']['getDraftChangesets'](_0x3ca546,_0x3365a2['worktreeID'],_0x3365a2['unitID'],{'from':_0x37ab3e,'to':_0x523a30}))),_0x23214b=await this['_trunkService']['submitChangeset']({'changeset':A(_0x4eb902,_0x3365a2,_0x523a30,_0x54668c,_0x133c3d)},_0x133c3d);return _0x23214b['status']==='committed'||_0x23214b['status']==='already-committed'?{'status':'merged','trunkRevision':_0x23214b['changeset']['revision']}:j('error'in _0x23214b?_0x23214b['error']:Error('Trunk\x20merge\x20failed'));}catch(_0x51e217){return j(_0x51e217);}}async['_mergeCreatedUnit'](_0x415a60,_0x1ba915,_0x1dbf59){let _0x361826=O(_0x1ba915),_0x5f40c3=await this['_database'](()=>this['_dbAdapter']['getUnitMergeArtifact'](_0x415a60,_0x1ba915['worktreeID'],_0x1ba915['unitID']));if(!_0x5f40c3){let _0xaa2f62=await s({'context':_0x415a60,'dbAdapter':new a(_0x1ba915['worktreeID'],this['_trunkDbAdapter'],this['_dbAdapter']),'unitID':_0x1ba915['unitID'],'type':_0x1ba915['type'],'expectedRevision':_0x361826,...this['_runtimeOptions']===void 0x0?{}:{'runtime':this['_runtimeOptions']}});if(!await this['_database'](()=>this['_dbAdapter']['getUnitSeed'](_0x415a60,_0x1ba915['worktreeID'],_0x1ba915['unitID'])))throw Z('Worktree-created\x20Unit\x20seed\x20is\x20missing');let _0x2066db=await this['_database'](()=>this['_dbAdapter']['saveUnitMergeArtifact'](_0x415a60,{'worktreeID':_0x1ba915['worktreeID'],'unitID':_0x1ba915['unitID'],'artifact':{'readyDraftHeadRevision':_0x361826,'unit':{'snapshot':H(_0xaa2f62['snapshot']),..._0xaa2f62['sheetBlocks']===void 0x0?{}:{'sheetBlocks':_0xaa2f62['sheetBlocks']}}}}));if(_0x2066db['status']==='not-found')throw Y(_0x1ba915['worktreeID']);if(_0x2066db['status']==='stale-merge')throw new i('WORKTREE_STALE_MERGE','Worktree\x20Unit\x20changed\x20while\x20saving\x20its\x20merge\x20artifact',{'retryable':!0x0});if(!('artifact'in _0x2066db))throw Z('Database\x20returned\x20an\x20invalid\x20merge\x20artifact\x20result');_0x5f40c3=_0x2066db['artifact'];}if(!_0x5f40c3)throw Z('Worktree\x20Unit\x20merge\x20artifact\x20is\x20missing');V(_0x1ba915,_0x361826,_0x5f40c3);let _0x3d7181=_0x5f40c3['unit'];if(await this['_trunkService']['createUnitFromSnapshot']({'snapshot':_0x3d7181['snapshot'],'sheetBlocks':[..._0x3d7181['sheetBlocks']??[]]},_0x1dbf59),!await this['_matchesCreatedTrunkUnit'](_0x415a60,_0x1ba915,_0x3d7181))throw new P('Trunk\x20Unit\x20'+_0x1ba915['unitID']+'\x20already\x20exists\x20with\x20different\x20content');return{'status':'merged','trunkRevision':0x1};}async['_matchesCreatedTrunkUnit'](_0x576366,_0x51bd2a,_0x47f244){let _0x98c75a=await this['_database'](()=>this['_trunkDbAdapter']['getUnit'](_0x576366,_0x51bd2a['unitID']));if(!_0x98c75a||_0x98c75a['type']!==_0x51bd2a['type']||_0x98c75a['headRevision']<0x1||!F(await this['_database'](()=>this['_trunkDbAdapter']['getSnapshot'](_0x576366,_0x51bd2a['unitID'],{'revision':0x1})),_0x47f244['snapshot']))return!0x1;for(let _0x12f01a of _0x47f244['sheetBlocks']??[])if(!F(await this['_database'](()=>this['_trunkDbAdapter']['getSheetBlock'](_0x576366,_0x51bd2a['unitID'],_0x12f01a['id'])),_0x12f01a))return!0x1;return!0x0;}async['_requireWorktreeAggregate'](_0x21f2f8,_0x291262){let _0x392bd5=await this['_database'](()=>this['_dbAdapter']['getWorktree'](_0x21f2f8,_0x291262));if(!_0x392bd5)throw Y(_0x291262);return R(_0x392bd5,_0x291262),_0x392bd5;}async['_transition'](_0x42f2fd,_0x2aa12e,_0x1acb97,_0x5dab12){S(_0x42f2fd);let _0x4d0d36=await this['_database'](_0x5dab12);if(_0x4d0d36['status']==='not-found')throw Y(_0x42f2fd);let _0x5026d7=R(_0x4d0d36['aggregate'],_0x42f2fd);if(_0x4d0d36['status']==='status-mismatch')throw new i('WORKTREE_STATUS_MISMATCH','Worktree\x20'+_0x42f2fd+'\x20cannot\x20transition\x20from\x20'+_0x5026d7['status'],{'details':{'status':_0x5026d7['status']}});return _0x4d0d36['status']==='transitioned'&&await this['_events']['emit']('worktreeStatusChanged',{'userID':_0x2aa12e['userID'],'customData':_0x2aa12e['customData'],'request':_0x1acb97,'worktree':_0x5026d7,'previousStatus':_0x4d0d36['previousStatus'],'status':_0x5026d7['status'],'occurredAt':Date['now']()}),{'worktree':_0x5026d7};}async['_requireTrunkUnit'](_0x533536,_0x4f0d34){let _0x340034=await this['_database'](()=>this['_trunkDbAdapter']['getUnit'](_0x533536,_0x4f0d34));if(!_0x340034)throw new n['CollabError']('UNIT_NOT_FOUND','Trunk\x20Unit\x20'+_0x4f0d34+'\x20does\x20not\x20exist');if(_0x340034['unitID']!==_0x4f0d34||!b['has'](_0x340034['type'])||!Number['isSafeInteger'](_0x340034['headRevision'])||_0x340034['headRevision']<0x1)throw Z('Trunk\x20Database\x20returned\x20invalid\x20Unit\x20metadata');return _0x340034;}async['_database'](_0xbab44a){try{return await _0xbab44a();}catch(_0xa12308){throw _0xa12308 instanceof n['CollabError']||_0xa12308 instanceof i?_0xa12308:Z('Database\x20Adapter\x20failed',_0xa12308);}}async['_call'](_0x2f1df6,_0x45388b){try{return this['_metrics']['increment']('collaboration.worktree.service.call',{'operation':_0x2f1df6}),await this['_lifecycle']['run'](_0x45388b);}catch(_0x12f478){throw _0x12f478 instanceof n['CollabError']||_0x12f478 instanceof i?_0x12f478:(this['_logger']['error']('Worktree\x20Service\x20operation\x20failed',{'operation':_0x2f1df6,'error':$(_0x12f478)}),new n['CollabError']('INTERNAL_ERROR','Worktree\x20Service\x20failed',{'retryable':!0x0,'cause':_0x12f478}));}}['_assertRunning'](){if(this['_lifecycle']['state']!=='running')throw new n['CollabError']('INTERNAL_ERROR','Worktree\x20Service\x20is\x20'+this['_lifecycle']['state'],{'retryable':!0x0});}};function S(_0x20ef42){if(!_0x20ef42)throw X('worktreeID\x20is\x20required');}function C(_0x31e4b5){return T(_0x31e4b5),{'userID':_0x31e4b5['userID'],'customData':_0x31e4b5['customData']??Object['create'](null)};}function w(_0x1d77a5){if(T(_0x1d77a5),typeof _0x1d77a5['memberID']!='string'||_0x1d77a5['memberID']['length']===0x0)throw X('memberID\x20must\x20be\x20a\x20non-empty\x20string');return{'userID':_0x1d77a5['userID'],'memberID':_0x1d77a5['memberID'],'customData':_0x1d77a5['customData']??Object['create'](null)};}function T(_0x16f902){if(!_0x16f902||typeof _0x16f902!='object')throw X('context\x20must\x20be\x20an\x20object');if(typeof _0x16f902['userID']!='string'||_0x16f902['userID']['length']===0x0)throw X('userID\x20must\x20be\x20a\x20non-empty\x20string');if(_0x16f902['customData']!==void 0x0&&(_0x16f902['customData']===null||typeof _0x16f902['customData']!='object'||Array['isArray'](_0x16f902['customData'])))throw X('customData\x20must\x20be\x20an\x20object');}function E(_0x2deef1,_0x16030d){let _0x51f20b=_0x2deef1;if(_0x51f20b['worktreeID']!==void 0x0){if(_0x51f20b['worktreeID']!==_0x16030d)throw new n['CollabError']('INTERNAL_ERROR','Draft\x20Request\x20is\x20bound\x20to\x20a\x20different\x20Worktree',{'retryable':!0x0});return _0x51f20b;}return Object['defineProperty'](_0x2deef1,'worktreeID',{'value':_0x16030d,'enumerable':!0x0,'configurable':!0x1,'writable':!0x1}),_0x2deef1;}function D(_0x1f82b7){if(_0x1f82b7['some'](_0x4122a0=>!_0x4122a0))throw X('Initial\x20Unit\x20IDs\x20cannot\x20be\x20empty');if(new Set(_0x1f82b7)['size']!==_0x1f82b7['length'])throw X('Initial\x20Unit\x20IDs\x20must\x20be\x20unique');}function O(_0x450734){let _0x53c033=_0x450734['readyDraftHeadRevision'],_0x1d4578=_0x450734['source']==='trunk'?B(_0x450734):0x1;if(_0x53c033===void 0x0||!Number['isSafeInteger'](_0x53c033)||_0x53c033<_0x1d4578)throw Z('Merging\x20Worktree\x20Unit\x20has\x20no\x20valid\x20frozen\x20draft\x20head');return _0x53c033;}function k(_0x4e0437,_0x1a486a,_0x1cb72b){let _0x4055ba=B(_0x4e0437);if(_0x1cb72b['latestRevision']===void 0x0||_0x1cb72b['latestRevision']<_0x1a486a)throw new N('Frozen\x20Worktree\x20draft\x20history\x20is\x20no\x20longer\x20readable');let _0x3f8ffa=_0x4055ba+0x1,_0x35b707=[];for(let _0x351351 of _0x1cb72b['changesets']){if(_0x351351['unitID']!==_0x4e0437['unitID']||_0x351351['type']!==_0x4e0437['type']||_0x351351['baseRev']!==_0x3f8ffa-0x1||_0x351351['revision']!==_0x3f8ffa)throw new N('Frozen\x20Worktree\x20draft\x20history\x20is\x20not\x20contiguous');_0x35b707['push'](...structuredClone(_0x351351['mutations'])),_0x3f8ffa+=0x1;}if(_0x3f8ffa-0x1!==_0x1a486a)throw new N('Frozen\x20Worktree\x20draft\x20history\x20is\x20incomplete');return _0x35b707;}function A(_0x3f8c46,_0x30e254,_0x7b3cd0,_0x1c8938,_0x2c7d19){let _0x4153d0=B(_0x30e254);return{'unitID':_0x30e254['unitID'],'type':_0x30e254['type'],'baseRev':_0x4153d0,'revision':_0x4153d0+0x1,'userID':_0x2c7d19['userID'],'memberID':_0x2c7d19['memberID'],'sid':_0x3f8c46,'reqId':_0x7b3cd0-_0x4153d0,'mutations':_0x1c8938};}function j(_0x4775a3){let _0x5a7278=M(_0x4775a3);return _0x4775a3 instanceof N||_0x4775a3 instanceof P||_0x4775a3 instanceof n['CollabError']&&_0x4775a3['code']==='OT_CONFLICT'?{'status':'conflict','error':_0x5a7278}:{'status':'failed','error':_0x5a7278};}function M(_0x27452d){return _0x27452d instanceof N?{'code':'WORKTREE_DRAFT_HISTORY_INVALID','message':_0x27452d['message'],'retryable':!0x0}:_0x27452d instanceof P?{'code':'WORKTREE_CREATE_CONFLICT','message':_0x27452d['message'],'retryable':!0x1}:_0x27452d instanceof n['CollabError']||_0x27452d instanceof i?{'code':_0x27452d['code'],'message':_0x27452d['message'],'retryable':_0x27452d['retryable']}:{'code':'INTERNAL_ERROR','message':_0x27452d instanceof Error?_0x27452d['message']:'Merge\x20failed','retryable':!0x0};}var N=class extends Error{constructor(_0x557235){super(_0x557235),this['name']='FrozenDraftConflict';}},P=class extends Error{constructor(_0x22ecde){super(_0x22ecde),this['name']='WorktreeCreateConflict';}};function F(_0x1472e8,_0x7e8ba2){return(0x0,t['isDeepStrictEqual'])(I(_0x1472e8),I(_0x7e8ba2));}function I(_0x3e5625){if(_0x3e5625!==void 0x0)return JSON['parse'](JSON['stringify'](_0x3e5625,(_0x6567ec,_0x1d1ce5)=>_0x1d1ce5 instanceof Uint8Array?{'__univerCollaborationBinary':[..._0x1d1ce5]}:_0x1d1ce5));}function L(_0x2f4bdf,_0x5f212b){let _0x45c611=new Set(_0x2f4bdf['units']['map'](({unitID:_0x168f60})=>_0x168f60));if(_0x45c611['size']!==_0x5f212b['length']||_0x5f212b['some'](_0x4259ec=>!_0x45c611['has'](_0x4259ec)))throw Z('Database\x20returned\x20incomplete\x20initial\x20Worktree\x20Units');}function R(_0x3fdf03,_0x30b916){let {worktree:_0x1e162c,units:_0x3cb358}=_0x3fdf03;if(_0x1e162c['worktreeID']!==_0x30b916||!_0x1e162c['sid']||!W(_0x1e162c['status']))throw Z('Database\x20returned\x20invalid\x20Worktree\x20metadata');let _0x391e40=new Set(),_0x38c323=_0x3cb358['map'](_0x121cab=>{let _0x7aa2dc=_0x121cab['source']==='trunk'&&Number['isSafeInteger'](_0x121cab['baselineTrunkRevision'])&&_0x121cab['baselineTrunkRevision']>=0x1&&_0x121cab['draftHeadRevision']>=_0x121cab['baselineTrunkRevision']||_0x121cab['source']==='worktree'&&_0x121cab['baselineTrunkRevision']===void 0x0&&_0x121cab['draftHeadRevision']>=0x1;if(_0x121cab['worktreeID']!==_0x30b916||!_0x121cab['unitID']||_0x391e40['has'](_0x121cab['unitID'])||!b['has'](_0x121cab['type'])||!_0x7aa2dc||!Number['isSafeInteger'](_0x121cab['draftHeadRevision'])||_0x121cab['readyDraftHeadRevision']!==void 0x0&&_0x121cab['readyDraftHeadRevision']!==_0x121cab['draftHeadRevision']||_0x121cab['mergeResult']!==void 0x0&&_0x121cab['readyDraftHeadRevision']===void 0x0||!G(_0x121cab['mergeResult']))throw Z('Database\x20returned\x20invalid\x20Worktree\x20Unit\x20metadata');return _0x391e40['add'](_0x121cab['unitID']),z(_0x121cab);});if(_0x1e162c['status']==='merged'&&_0x38c323['some'](({mergeResult:_0xb43174})=>!J(_0xb43174)))throw Z('Merged\x20Worktree\x20contains\x20an\x20incomplete\x20Unit');return{'worktreeID':_0x1e162c['worktreeID'],'status':_0x1e162c['status'],'units':_0x38c323};}function z(_0x15998f){return{'unitID':_0x15998f['unitID'],'type':_0x15998f['type'],'source':_0x15998f['source'],..._0x15998f['baselineTrunkRevision']===void 0x0?{}:{'baselineTrunkRevision':_0x15998f['baselineTrunkRevision']},'draftHeadRevision':_0x15998f['draftHeadRevision'],..._0x15998f['readyDraftHeadRevision']===void 0x0?{}:{'readyDraftHeadRevision':_0x15998f['readyDraftHeadRevision']},..._0x15998f['mergeResult']===void 0x0?{}:{'mergeResult':K(_0x15998f['mergeResult'])}};}function B(_0x234e6c){if(_0x234e6c['source']!=='trunk'||!Number['isSafeInteger'](_0x234e6c['baselineTrunkRevision'])||_0x234e6c['baselineTrunkRevision']<0x1)throw Z('Trunk-sourced\x20Worktree\x20Unit\x20has\x20no\x20valid\x20baseline');return _0x234e6c['baselineTrunkRevision'];}function V(_0x45aa09,_0x493564,_0x3c4dc8){if(_0x3c4dc8['readyDraftHeadRevision']!==_0x493564||_0x3c4dc8['unit']['snapshot']['unitID']!==_0x45aa09['unitID']||_0x3c4dc8['unit']['snapshot']['type']!==_0x45aa09['type']||_0x3c4dc8['unit']['snapshot']['rev']!==0x1)throw Z('Database\x20returned\x20an\x20invalid\x20Worktree\x20Unit\x20merge\x20artifact');}function H(_0x47ac9d){let _0x40ab4f={..._0x47ac9d,'rev':0x1};return _0x47ac9d['workbook']?{..._0x40ab4f,'workbook':{..._0x47ac9d['workbook'],'rev':0x1}}:_0x47ac9d['doc']?{..._0x40ab4f,'doc':{..._0x47ac9d['doc'],'rev':0x1}}:_0x47ac9d['slide']?{..._0x40ab4f,'slide':{..._0x47ac9d['slide'],'rev':0x1}}:_0x47ac9d['board']?{..._0x40ab4f,'board':{..._0x47ac9d['board'],'rev':0x1}}:_0x40ab4f;}function U(_0x4e6922,_0x23b76a){let _0x39878d=_0x4e6922['units']['find'](_0x2b521f=>_0x2b521f['unitID']===_0x23b76a);if(!_0x39878d)throw Z('Database\x20omitted\x20the\x20added\x20Worktree\x20Unit');return _0x39878d;}function W(_0x38e2de){return _0x38e2de==='draft'||_0x38e2de==='ready'||_0x38e2de==='merging'||_0x38e2de==='merged'||_0x38e2de==='discarded';}function G(_0x28f57e){return _0x28f57e===void 0x0?!0x0:!_0x28f57e||typeof _0x28f57e!='object'||!('status'in _0x28f57e)?!0x1:_0x28f57e['status']==='unchanged'?!0x0:_0x28f57e['status']==='merged'&&'trunkRevision'in _0x28f57e?typeof _0x28f57e['trunkRevision']=='number'&&Number['isSafeInteger'](_0x28f57e['trunkRevision'])&&_0x28f57e['trunkRevision']>=0x1:_0x28f57e['status']!=='conflict'&&_0x28f57e['status']!=='failed'||!('error'in _0x28f57e)||!_0x28f57e['error']||typeof _0x28f57e['error']!='object'||!('code'in _0x28f57e['error'])||!('message'in _0x28f57e['error'])||!('retryable'in _0x28f57e['error'])?!0x1:typeof _0x28f57e['error']['code']=='string'&&!!_0x28f57e['error']['code']&&typeof _0x28f57e['error']['message']=='string'&&!!_0x28f57e['error']['message']&&typeof _0x28f57e['error']['retryable']=='boolean';}function K(_0x3585d5){return _0x3585d5['status']==='merged'?{'status':'merged','trunkRevision':_0x3585d5['trunkRevision']}:_0x3585d5['status']==='unchanged'?{'status':'unchanged'}:{'status':_0x3585d5['status'],'error':{'code':_0x3585d5['error']['code'],'message':_0x3585d5['error']['message'],'retryable':_0x3585d5['error']['retryable']}};}function q(_0x508cc1){if(_0x508cc1?.['status']==='merged')return{'status':'merged','trunkRevision':_0x508cc1['trunkRevision']};if(_0x508cc1?.['status']==='unchanged')return{'status':'unchanged'};throw Z('Worktree\x20Unit\x20merge\x20result\x20is\x20not\x20terminal');}function J(_0x23a04a){return _0x23a04a?.['status']==='merged'||_0x23a04a?.['status']==='unchanged';}function Y(_0x4623a2){return new i('WORKTREE_NOT_FOUND','Worktree\x20'+_0x4623a2+'\x20does\x20not\x20exist');}function X(_0x4e8a20){return new n['CollabError']('INVALID_REQUEST',_0x4e8a20);}function Z(_0x2377de,_0x553330){return new n['CollabError']('ADAPTER_FAILURE',_0x2377de,{'retryable':!0x0,..._0x553330===void 0x0?{}:{'cause':_0x553330}});}function ne(_0x34f1d7){return _0x34f1d7?{'debug':(..._0x3d2e41)=>Q(()=>_0x34f1d7['debug'](..._0x3d2e41)),'info':(..._0x772a97)=>Q(()=>_0x34f1d7['info'](..._0x772a97)),'warn':(..._0x28dd95)=>Q(()=>_0x34f1d7['warn'](..._0x28dd95)),'error':(..._0x712f91)=>Q(()=>_0x34f1d7['error'](..._0x712f91))}:{'debug':()=>void 0x0,'info':()=>void 0x0,'warn':()=>void 0x0,'error':()=>void 0x0};}function re(_0x2e1dbd){return _0x2e1dbd?{'increment':(..._0x473220)=>Q(()=>_0x2e1dbd['increment'](..._0x473220)),'observe':(..._0x170715)=>Q(()=>_0x2e1dbd['observe'](..._0x170715))}:{'increment':()=>void 0x0,'observe':()=>void 0x0};}function Q(_0x3d79f9){try{_0x3d79f9();}catch{}}function $(_0x3cf30e){return _0x3cf30e instanceof Error?_0x3cf30e['message']:String(_0x3cf30e);}exports['UniverCollabWorktreeService']=x,exports['WorktreeError']=i;
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,520 @@
|
|
|
1
|
+
import { ChangesetRange, CollabContext, CollabMemberContext, CreateUnitFromDataInput, CreateUnitFromSnapshotInput, CreateUnitRequest, CustomData, Disposable, GetChangesetsRequest, GetChangesetsResult, GetSheetBlockRequest, GetSheetBlockResult, GetUnitLoadDataRequest, IDatabaseAdapter, ILogger, IMetrics, IUniverCollabService, JsonObject, Middleware, MiddlewareNext, SaveSnapshotInput, SubmitChangesetRequest, SubmitChangesetResult, UnitLoadData } from "@univerjs-pro/collaboration-service";
|
|
2
|
+
import { IChangeset, ISheetBlock, ISnapshot, UniverType } from "@univerjs/protocol";
|
|
3
|
+
|
|
4
|
+
//#region src/model/types.d.ts
|
|
5
|
+
type WorktreeStatus = "draft" | "ready" | "merging" | "merged" | "discarded";
|
|
6
|
+
type WorktreeUnitSource = "trunk" | "worktree";
|
|
7
|
+
interface WorktreeMergeError {
|
|
8
|
+
readonly code: string;
|
|
9
|
+
readonly message: string;
|
|
10
|
+
readonly retryable: boolean;
|
|
11
|
+
}
|
|
12
|
+
type WorktreeUnitMergeResult = {
|
|
13
|
+
readonly status: "merged";
|
|
14
|
+
readonly trunkRevision: number;
|
|
15
|
+
} | {
|
|
16
|
+
readonly status: "unchanged";
|
|
17
|
+
} | {
|
|
18
|
+
readonly status: "conflict";
|
|
19
|
+
readonly error: WorktreeMergeError;
|
|
20
|
+
} | {
|
|
21
|
+
readonly status: "failed";
|
|
22
|
+
readonly error: WorktreeMergeError;
|
|
23
|
+
};
|
|
24
|
+
interface WorktreeRecord {
|
|
25
|
+
readonly worktreeID: string;
|
|
26
|
+
readonly sid: string;
|
|
27
|
+
readonly status: WorktreeStatus;
|
|
28
|
+
}
|
|
29
|
+
interface WorktreeUnitRecord {
|
|
30
|
+
readonly worktreeID: string;
|
|
31
|
+
readonly unitID: string;
|
|
32
|
+
readonly type: UniverType;
|
|
33
|
+
readonly source: WorktreeUnitSource;
|
|
34
|
+
readonly baselineTrunkRevision?: number;
|
|
35
|
+
readonly draftHeadRevision: number;
|
|
36
|
+
readonly readyDraftHeadRevision?: number;
|
|
37
|
+
readonly mergeResult?: WorktreeUnitMergeResult;
|
|
38
|
+
}
|
|
39
|
+
interface WorktreeAggregateRecord {
|
|
40
|
+
readonly worktree: WorktreeRecord;
|
|
41
|
+
readonly units: readonly WorktreeUnitRecord[];
|
|
42
|
+
}
|
|
43
|
+
interface WorktreeData {
|
|
44
|
+
readonly worktreeID: string;
|
|
45
|
+
readonly status: WorktreeStatus;
|
|
46
|
+
readonly units: readonly WorktreeUnitData[];
|
|
47
|
+
}
|
|
48
|
+
interface WorktreeUnitData {
|
|
49
|
+
readonly unitID: string;
|
|
50
|
+
readonly type: UniverType;
|
|
51
|
+
readonly source: WorktreeUnitSource;
|
|
52
|
+
readonly baselineTrunkRevision?: number;
|
|
53
|
+
readonly draftHeadRevision: number;
|
|
54
|
+
readonly readyDraftHeadRevision?: number;
|
|
55
|
+
readonly mergeResult?: WorktreeUnitMergeResult;
|
|
56
|
+
}
|
|
57
|
+
//#endregion
|
|
58
|
+
//#region src/database/adapter.d.ts
|
|
59
|
+
interface WorktreeDatabaseContext<TRequest extends object = object> {
|
|
60
|
+
readonly userID: string;
|
|
61
|
+
readonly customData: CustomData;
|
|
62
|
+
readonly request: TRequest;
|
|
63
|
+
}
|
|
64
|
+
interface WorktreeMemberDatabaseContext<TRequest extends object = object> extends WorktreeDatabaseContext<TRequest> {
|
|
65
|
+
readonly memberID: string;
|
|
66
|
+
}
|
|
67
|
+
interface WorktreeRevisionRange {
|
|
68
|
+
readonly from: number;
|
|
69
|
+
readonly to: number;
|
|
70
|
+
}
|
|
71
|
+
interface CreateWorktreeDatabaseInput {
|
|
72
|
+
readonly record: WorktreeRecord;
|
|
73
|
+
readonly units: readonly WorktreeUnitRecord[];
|
|
74
|
+
}
|
|
75
|
+
type CreateWorktreeDatabaseResult = {
|
|
76
|
+
readonly status: "created";
|
|
77
|
+
readonly aggregate: WorktreeAggregateRecord;
|
|
78
|
+
} | {
|
|
79
|
+
readonly status: "already-exists";
|
|
80
|
+
readonly aggregate: WorktreeAggregateRecord;
|
|
81
|
+
};
|
|
82
|
+
interface AddWorktreeUnitDatabaseInput {
|
|
83
|
+
readonly unit: WorktreeUnitRecord;
|
|
84
|
+
}
|
|
85
|
+
type AddWorktreeUnitDatabaseResult = {
|
|
86
|
+
readonly status: "added" | "already-exists";
|
|
87
|
+
readonly aggregate: WorktreeAggregateRecord;
|
|
88
|
+
} | {
|
|
89
|
+
readonly status: "status-mismatch";
|
|
90
|
+
readonly aggregate: WorktreeAggregateRecord;
|
|
91
|
+
} | {
|
|
92
|
+
readonly status: "not-found";
|
|
93
|
+
};
|
|
94
|
+
interface WorktreeUnitSeed {
|
|
95
|
+
readonly snapshot: ISnapshot;
|
|
96
|
+
readonly sheetBlocks?: readonly ISheetBlock[];
|
|
97
|
+
}
|
|
98
|
+
interface WorktreeUnitMergeArtifact {
|
|
99
|
+
readonly readyDraftHeadRevision: number;
|
|
100
|
+
readonly unit: WorktreeUnitSeed;
|
|
101
|
+
}
|
|
102
|
+
interface SaveWorktreeUnitMergeArtifactInput {
|
|
103
|
+
readonly worktreeID: string;
|
|
104
|
+
readonly unitID: string;
|
|
105
|
+
readonly artifact: WorktreeUnitMergeArtifact;
|
|
106
|
+
}
|
|
107
|
+
type SaveWorktreeUnitMergeArtifactResult = {
|
|
108
|
+
readonly status: "saved" | "already-saved";
|
|
109
|
+
readonly artifact: WorktreeUnitMergeArtifact;
|
|
110
|
+
} | {
|
|
111
|
+
readonly status: "stale-merge" | "not-found";
|
|
112
|
+
};
|
|
113
|
+
interface CreateWorktreeUnitDatabaseInput {
|
|
114
|
+
readonly unit: WorktreeUnitRecord;
|
|
115
|
+
readonly seed: WorktreeUnitSeed;
|
|
116
|
+
}
|
|
117
|
+
type CreateWorktreeUnitDatabaseResult = {
|
|
118
|
+
readonly status: "created" | "already-created";
|
|
119
|
+
readonly aggregate: WorktreeAggregateRecord;
|
|
120
|
+
} | {
|
|
121
|
+
readonly status: "unit-exists" | "status-mismatch";
|
|
122
|
+
readonly aggregate: WorktreeAggregateRecord;
|
|
123
|
+
} | {
|
|
124
|
+
readonly status: "not-found";
|
|
125
|
+
};
|
|
126
|
+
interface CommitWorktreeChangesetInput {
|
|
127
|
+
readonly worktreeID: string;
|
|
128
|
+
readonly changeset: IChangeset;
|
|
129
|
+
}
|
|
130
|
+
type CommitWorktreeChangesetResult = {
|
|
131
|
+
readonly status: "committed";
|
|
132
|
+
readonly changeset: IChangeset;
|
|
133
|
+
readonly headRevision: number;
|
|
134
|
+
} | {
|
|
135
|
+
readonly status: "revision-mismatch";
|
|
136
|
+
readonly actualHeadRevision: number;
|
|
137
|
+
} | {
|
|
138
|
+
readonly status: "not-editable";
|
|
139
|
+
readonly worktreeStatus: WorktreeStatus;
|
|
140
|
+
} | {
|
|
141
|
+
readonly status: "unit-frozen" | "not-found";
|
|
142
|
+
};
|
|
143
|
+
type WorktreeTransitionResult = {
|
|
144
|
+
readonly status: "transitioned";
|
|
145
|
+
readonly previousStatus: WorktreeStatus;
|
|
146
|
+
readonly aggregate: WorktreeAggregateRecord;
|
|
147
|
+
} | {
|
|
148
|
+
readonly status: "already-in-target";
|
|
149
|
+
readonly aggregate: WorktreeAggregateRecord;
|
|
150
|
+
} | {
|
|
151
|
+
readonly status: "status-mismatch";
|
|
152
|
+
readonly aggregate: WorktreeAggregateRecord;
|
|
153
|
+
} | {
|
|
154
|
+
readonly status: "not-found";
|
|
155
|
+
};
|
|
156
|
+
type StartMergeResult = {
|
|
157
|
+
readonly status: "started" | "resumed" | "already-merged";
|
|
158
|
+
readonly aggregate: WorktreeAggregateRecord;
|
|
159
|
+
} | {
|
|
160
|
+
readonly status: "status-mismatch";
|
|
161
|
+
readonly aggregate: WorktreeAggregateRecord;
|
|
162
|
+
} | {
|
|
163
|
+
readonly status: "not-found";
|
|
164
|
+
};
|
|
165
|
+
interface RecordUnitMergeResultInput {
|
|
166
|
+
readonly worktreeID: string;
|
|
167
|
+
readonly unitID: string;
|
|
168
|
+
readonly readyDraftHeadRevision: number;
|
|
169
|
+
readonly mergeResult: WorktreeUnitMergeResult;
|
|
170
|
+
}
|
|
171
|
+
type RecordUnitMergeResultResult = {
|
|
172
|
+
readonly status: "recorded" | "already-recorded";
|
|
173
|
+
readonly aggregate: WorktreeAggregateRecord;
|
|
174
|
+
} | {
|
|
175
|
+
readonly status: "stale-merge" | "not-found";
|
|
176
|
+
};
|
|
177
|
+
interface IWorktreeDatabaseAdapter {
|
|
178
|
+
getWorktree(context: WorktreeDatabaseContext, worktreeID: string): Promise<WorktreeAggregateRecord | null>;
|
|
179
|
+
getWorktreeUnit(context: WorktreeDatabaseContext, worktreeID: string, unitID: string): Promise<WorktreeUnitRecord | null>;
|
|
180
|
+
getDraftChangesets(context: WorktreeDatabaseContext, worktreeID: string, unitID: string, range: WorktreeRevisionRange): Promise<ChangesetRange>;
|
|
181
|
+
getUnitSeed(context: WorktreeDatabaseContext, worktreeID: string, unitID: string): Promise<WorktreeUnitSeed | null>;
|
|
182
|
+
getUnitMergeArtifact(context: WorktreeDatabaseContext, worktreeID: string, unitID: string): Promise<WorktreeUnitMergeArtifact | null>;
|
|
183
|
+
createWorktree(context: WorktreeDatabaseContext, input: CreateWorktreeDatabaseInput): Promise<CreateWorktreeDatabaseResult>;
|
|
184
|
+
addUnit(context: WorktreeDatabaseContext, input: AddWorktreeUnitDatabaseInput): Promise<AddWorktreeUnitDatabaseResult>;
|
|
185
|
+
createUnit(context: WorktreeDatabaseContext, input: CreateWorktreeUnitDatabaseInput): Promise<CreateWorktreeUnitDatabaseResult>;
|
|
186
|
+
saveUnitMergeArtifact(context: WorktreeDatabaseContext, input: SaveWorktreeUnitMergeArtifactInput): Promise<SaveWorktreeUnitMergeArtifactResult>;
|
|
187
|
+
commitDraftChangeset(context: WorktreeDatabaseContext, input: CommitWorktreeChangesetInput): Promise<CommitWorktreeChangesetResult>;
|
|
188
|
+
markReady(context: WorktreeDatabaseContext, worktreeID: string): Promise<WorktreeTransitionResult>;
|
|
189
|
+
reopenWorktree(context: WorktreeDatabaseContext, worktreeID: string): Promise<WorktreeTransitionResult>;
|
|
190
|
+
discardWorktree(context: WorktreeDatabaseContext, worktreeID: string): Promise<WorktreeTransitionResult>;
|
|
191
|
+
startOrResumeMerge(context: WorktreeDatabaseContext, worktreeID: string): Promise<StartMergeResult>;
|
|
192
|
+
recordUnitMergeResult(context: WorktreeDatabaseContext, input: RecordUnitMergeResultInput): Promise<RecordUnitMergeResultResult>;
|
|
193
|
+
finishMerge(context: WorktreeDatabaseContext, worktreeID: string): Promise<WorktreeTransitionResult>;
|
|
194
|
+
dispose?(): Promise<void>;
|
|
195
|
+
}
|
|
196
|
+
//#endregion
|
|
197
|
+
//#region src/errors/worktree-error.d.ts
|
|
198
|
+
type WorktreeErrorCode = "WORKTREE_NOT_FOUND" | "WORKTREE_ALREADY_EXISTS" | "WORKTREE_UNIT_NOT_FOUND" | "WORKTREE_NOT_EDITABLE" | "WORKTREE_STATUS_MISMATCH" | "WORKTREE_UNIT_FROZEN" | "WORKTREE_STALE_MERGE";
|
|
199
|
+
declare class WorktreeError extends Error {
|
|
200
|
+
readonly code: WorktreeErrorCode;
|
|
201
|
+
readonly retryable: boolean;
|
|
202
|
+
readonly details?: Readonly<JsonObject>;
|
|
203
|
+
constructor(code: WorktreeErrorCode, message: string, options?: {
|
|
204
|
+
readonly retryable?: boolean;
|
|
205
|
+
readonly details?: Readonly<JsonObject>;
|
|
206
|
+
readonly cause?: unknown;
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
//#endregion
|
|
210
|
+
//#region src/request/request.d.ts
|
|
211
|
+
interface BaseWorktreeRequest {
|
|
212
|
+
readonly worktreeID: string;
|
|
213
|
+
}
|
|
214
|
+
interface CreateWorktreeRequest extends BaseWorktreeRequest {
|
|
215
|
+
readonly units: readonly string[];
|
|
216
|
+
}
|
|
217
|
+
interface GetWorktreeRequest extends BaseWorktreeRequest {}
|
|
218
|
+
interface AddWorktreeUnitRequest extends BaseWorktreeRequest {
|
|
219
|
+
readonly unitID: string;
|
|
220
|
+
}
|
|
221
|
+
interface CreateWorktreeUnitRequest extends CreateUnitRequest, BaseWorktreeRequest {}
|
|
222
|
+
interface MarkWorktreeReadyRequest extends BaseWorktreeRequest {}
|
|
223
|
+
interface ReopenWorktreeRequest extends BaseWorktreeRequest {}
|
|
224
|
+
interface DiscardWorktreeRequest extends BaseWorktreeRequest {}
|
|
225
|
+
interface MergeWorktreeRequest extends BaseWorktreeRequest {}
|
|
226
|
+
interface EvaluateWorktreeUnitMergeRequest extends BaseWorktreeRequest {
|
|
227
|
+
readonly unitID: string;
|
|
228
|
+
}
|
|
229
|
+
interface GetWorktreeUnitLoadDataRequest extends GetUnitLoadDataRequest, BaseWorktreeRequest {}
|
|
230
|
+
interface GetWorktreeChangesetsRequest extends GetChangesetsRequest, BaseWorktreeRequest {}
|
|
231
|
+
interface GetWorktreeSheetBlockRequest extends GetSheetBlockRequest, BaseWorktreeRequest {}
|
|
232
|
+
type ReadWorktreeUnitDataRequest = EvaluateWorktreeUnitMergeRequest | GetWorktreeUnitLoadDataRequest | GetWorktreeChangesetsRequest | GetWorktreeSheetBlockRequest;
|
|
233
|
+
interface SubmitWorktreeChangesetRequest extends SubmitChangesetRequest, BaseWorktreeRequest {}
|
|
234
|
+
type WorktreeRequest = CreateWorktreeRequest | GetWorktreeRequest | AddWorktreeUnitRequest | CreateWorktreeUnitRequest | MarkWorktreeReadyRequest | ReopenWorktreeRequest | DiscardWorktreeRequest | MergeWorktreeRequest | ReadWorktreeUnitDataRequest | SubmitWorktreeChangesetRequest;
|
|
235
|
+
//#endregion
|
|
236
|
+
//#region src/middleware/middleware.d.ts
|
|
237
|
+
type WorktreeMiddlewareAction = "readWorktreeData" | "createWorktree" | "addWorktreeUnit" | "createWorktreeUnit" | "markWorktreeReady" | "reopenWorktree" | "discardWorktree" | "mergeWorktree" | "readUnitData" | "submitChangeset" | "applyChangeset" | "commitChangeset";
|
|
238
|
+
type WorktreeMiddlewareNext = MiddlewareNext;
|
|
239
|
+
type WorktreeMiddleware<TContext> = Middleware<TContext>;
|
|
240
|
+
interface BaseWorktreeMiddlewareContext {
|
|
241
|
+
readonly userID: string;
|
|
242
|
+
readonly customData: CustomData;
|
|
243
|
+
}
|
|
244
|
+
interface MemberWorktreeMiddlewareContext extends BaseWorktreeMiddlewareContext {
|
|
245
|
+
readonly memberID: string;
|
|
246
|
+
}
|
|
247
|
+
interface ReadWorktreeDataMiddlewareContext extends BaseWorktreeMiddlewareContext {
|
|
248
|
+
readonly request: GetWorktreeRequest;
|
|
249
|
+
}
|
|
250
|
+
interface CreateWorktreeMiddlewareContext extends BaseWorktreeMiddlewareContext {
|
|
251
|
+
readonly request: CreateWorktreeRequest;
|
|
252
|
+
}
|
|
253
|
+
interface AddWorktreeUnitMiddlewareContext extends BaseWorktreeMiddlewareContext {
|
|
254
|
+
readonly request: AddWorktreeUnitRequest;
|
|
255
|
+
}
|
|
256
|
+
interface CreateWorktreeUnitMiddlewareContext extends BaseWorktreeMiddlewareContext {
|
|
257
|
+
readonly request: CreateWorktreeUnitRequest;
|
|
258
|
+
}
|
|
259
|
+
interface MarkWorktreeReadyMiddlewareContext extends BaseWorktreeMiddlewareContext {
|
|
260
|
+
readonly request: MarkWorktreeReadyRequest;
|
|
261
|
+
}
|
|
262
|
+
interface ReopenWorktreeMiddlewareContext extends BaseWorktreeMiddlewareContext {
|
|
263
|
+
readonly request: ReopenWorktreeRequest;
|
|
264
|
+
}
|
|
265
|
+
interface DiscardWorktreeMiddlewareContext extends BaseWorktreeMiddlewareContext {
|
|
266
|
+
readonly request: DiscardWorktreeRequest;
|
|
267
|
+
}
|
|
268
|
+
interface MergeWorktreeMiddlewareContext extends MemberWorktreeMiddlewareContext {
|
|
269
|
+
readonly request: MergeWorktreeRequest;
|
|
270
|
+
}
|
|
271
|
+
interface ReadWorktreeUnitDataMiddlewareContext extends BaseWorktreeMiddlewareContext {
|
|
272
|
+
readonly request: ReadWorktreeUnitDataRequest;
|
|
273
|
+
}
|
|
274
|
+
interface SubmitWorktreeChangesetMiddlewareContext extends MemberWorktreeMiddlewareContext {
|
|
275
|
+
readonly request: SubmitWorktreeChangesetRequest;
|
|
276
|
+
}
|
|
277
|
+
interface ApplyWorktreeChangesetMiddlewareContext extends MemberWorktreeMiddlewareContext {
|
|
278
|
+
readonly request: SubmitWorktreeChangesetRequest;
|
|
279
|
+
readonly attempt: number;
|
|
280
|
+
readonly currentRevision: number;
|
|
281
|
+
readonly changeset: Readonly<IChangeset>;
|
|
282
|
+
}
|
|
283
|
+
interface CommitWorktreeChangesetMiddlewareContext extends MemberWorktreeMiddlewareContext {
|
|
284
|
+
readonly request: SubmitWorktreeChangesetRequest;
|
|
285
|
+
readonly attempt: number;
|
|
286
|
+
readonly expectedHeadRevision: number;
|
|
287
|
+
readonly changeset: Readonly<IChangeset>;
|
|
288
|
+
}
|
|
289
|
+
interface WorktreeMiddlewareMap {
|
|
290
|
+
readonly readWorktreeData: Middleware<ReadWorktreeDataMiddlewareContext>;
|
|
291
|
+
readonly createWorktree: Middleware<CreateWorktreeMiddlewareContext>;
|
|
292
|
+
readonly addWorktreeUnit: Middleware<AddWorktreeUnitMiddlewareContext>;
|
|
293
|
+
readonly createWorktreeUnit: Middleware<CreateWorktreeUnitMiddlewareContext>;
|
|
294
|
+
readonly markWorktreeReady: Middleware<MarkWorktreeReadyMiddlewareContext>;
|
|
295
|
+
readonly reopenWorktree: Middleware<ReopenWorktreeMiddlewareContext>;
|
|
296
|
+
readonly discardWorktree: Middleware<DiscardWorktreeMiddlewareContext>;
|
|
297
|
+
readonly mergeWorktree: Middleware<MergeWorktreeMiddlewareContext>;
|
|
298
|
+
readonly readUnitData: Middleware<ReadWorktreeUnitDataMiddlewareContext>;
|
|
299
|
+
readonly submitChangeset: Middleware<SubmitWorktreeChangesetMiddlewareContext>;
|
|
300
|
+
readonly applyChangeset: Middleware<ApplyWorktreeChangesetMiddlewareContext>;
|
|
301
|
+
readonly commitChangeset: Middleware<CommitWorktreeChangesetMiddlewareContext>;
|
|
302
|
+
}
|
|
303
|
+
//#endregion
|
|
304
|
+
//#region src/service/events.d.ts
|
|
305
|
+
interface BaseWorktreeEvent {
|
|
306
|
+
readonly userID: string;
|
|
307
|
+
readonly customData: CustomData;
|
|
308
|
+
readonly worktree: WorktreeData;
|
|
309
|
+
readonly occurredAt: number;
|
|
310
|
+
}
|
|
311
|
+
interface WorktreeCreatedEvent extends BaseWorktreeEvent {
|
|
312
|
+
readonly request: CreateWorktreeRequest;
|
|
313
|
+
}
|
|
314
|
+
interface WorktreeUnitAddedEvent extends BaseWorktreeEvent {
|
|
315
|
+
readonly request: AddWorktreeUnitRequest;
|
|
316
|
+
readonly unit: WorktreeUnitData;
|
|
317
|
+
}
|
|
318
|
+
interface WorktreeUnitCreatedEvent extends BaseWorktreeEvent {
|
|
319
|
+
readonly request: CreateWorktreeUnitRequest;
|
|
320
|
+
readonly unit: WorktreeUnitData;
|
|
321
|
+
}
|
|
322
|
+
interface WorktreeStatusChangedEvent extends BaseWorktreeEvent {
|
|
323
|
+
readonly request: MarkWorktreeReadyRequest | ReopenWorktreeRequest | DiscardWorktreeRequest | MergeWorktreeRequest;
|
|
324
|
+
readonly previousStatus: WorktreeStatus;
|
|
325
|
+
readonly status: WorktreeStatus;
|
|
326
|
+
}
|
|
327
|
+
interface WorktreeUnitMergeResultRecordedEvent extends BaseWorktreeEvent {
|
|
328
|
+
readonly request: MergeWorktreeRequest;
|
|
329
|
+
readonly unit: WorktreeUnitData;
|
|
330
|
+
}
|
|
331
|
+
interface WorktreeChangesetCommittedEvent {
|
|
332
|
+
readonly userID: string;
|
|
333
|
+
readonly memberID: string;
|
|
334
|
+
readonly customData: CustomData;
|
|
335
|
+
readonly request: SubmitWorktreeChangesetRequest;
|
|
336
|
+
readonly changeset: IChangeset;
|
|
337
|
+
readonly committedAt: number;
|
|
338
|
+
}
|
|
339
|
+
interface WorktreeServiceEventMap {
|
|
340
|
+
readonly worktreeCreated: WorktreeCreatedEvent;
|
|
341
|
+
readonly worktreeUnitAdded: WorktreeUnitAddedEvent;
|
|
342
|
+
readonly worktreeUnitCreated: WorktreeUnitCreatedEvent;
|
|
343
|
+
readonly worktreeStatusChanged: WorktreeStatusChangedEvent;
|
|
344
|
+
readonly worktreeUnitMergeResultRecorded: WorktreeUnitMergeResultRecordedEvent;
|
|
345
|
+
readonly changesetCommitted: WorktreeChangesetCommittedEvent;
|
|
346
|
+
}
|
|
347
|
+
//#endregion
|
|
348
|
+
//#region src/operations/operations.d.ts
|
|
349
|
+
interface WorktreeResult {
|
|
350
|
+
readonly worktree: WorktreeData;
|
|
351
|
+
}
|
|
352
|
+
interface CreateWorktreeInput {
|
|
353
|
+
readonly worktreeID: string;
|
|
354
|
+
readonly units?: readonly string[];
|
|
355
|
+
}
|
|
356
|
+
interface GetWorktreeInput {
|
|
357
|
+
readonly worktreeID: string;
|
|
358
|
+
}
|
|
359
|
+
interface AddWorktreeUnitInput {
|
|
360
|
+
readonly worktreeID: string;
|
|
361
|
+
readonly unitID: string;
|
|
362
|
+
}
|
|
363
|
+
type CreateWorktreeUnitFromSnapshotInput = CreateUnitFromSnapshotInput & {
|
|
364
|
+
readonly worktreeID: string;
|
|
365
|
+
};
|
|
366
|
+
type CreateWorktreeUnitFromDataInput = CreateUnitFromDataInput & {
|
|
367
|
+
readonly worktreeID: string;
|
|
368
|
+
};
|
|
369
|
+
interface MarkWorktreeReadyInput {
|
|
370
|
+
readonly worktreeID: string;
|
|
371
|
+
}
|
|
372
|
+
interface ReopenWorktreeInput {
|
|
373
|
+
readonly worktreeID: string;
|
|
374
|
+
}
|
|
375
|
+
interface DiscardWorktreeInput {
|
|
376
|
+
readonly worktreeID: string;
|
|
377
|
+
}
|
|
378
|
+
interface MergeWorktreeInput {
|
|
379
|
+
readonly worktreeID: string;
|
|
380
|
+
}
|
|
381
|
+
interface EvaluateWorktreeUnitMergeInput {
|
|
382
|
+
readonly worktreeID: string;
|
|
383
|
+
readonly unitID: string;
|
|
384
|
+
}
|
|
385
|
+
type WorktreeUnitMergeEvaluation = {
|
|
386
|
+
readonly status: "not-behind";
|
|
387
|
+
readonly worktreeID: string;
|
|
388
|
+
readonly unitID: string;
|
|
389
|
+
} | {
|
|
390
|
+
readonly status: "preview";
|
|
391
|
+
readonly worktreeID: string;
|
|
392
|
+
readonly unitID: string;
|
|
393
|
+
readonly preview: SaveSnapshotInput;
|
|
394
|
+
} | {
|
|
395
|
+
readonly status: "conflict";
|
|
396
|
+
readonly worktreeID: string;
|
|
397
|
+
readonly unitID: string;
|
|
398
|
+
readonly error: WorktreeMergeError;
|
|
399
|
+
} | {
|
|
400
|
+
readonly status: "already-merged";
|
|
401
|
+
readonly worktreeID: string;
|
|
402
|
+
readonly unitID: string;
|
|
403
|
+
readonly mergeResult: {
|
|
404
|
+
readonly status: "merged";
|
|
405
|
+
readonly trunkRevision: number;
|
|
406
|
+
} | {
|
|
407
|
+
readonly status: "unchanged";
|
|
408
|
+
};
|
|
409
|
+
} | {
|
|
410
|
+
readonly status: "not-applicable";
|
|
411
|
+
readonly worktreeID: string;
|
|
412
|
+
readonly unitID: string;
|
|
413
|
+
readonly reason: "worktree-created-unit";
|
|
414
|
+
};
|
|
415
|
+
interface GetWorktreeUnitLoadDataInput {
|
|
416
|
+
readonly worktreeID: string;
|
|
417
|
+
readonly unitID: string;
|
|
418
|
+
readonly type: UniverType;
|
|
419
|
+
readonly revision: number;
|
|
420
|
+
}
|
|
421
|
+
interface GetWorktreeChangesetsInput {
|
|
422
|
+
readonly worktreeID: string;
|
|
423
|
+
readonly unitID: string;
|
|
424
|
+
readonly type: UniverType;
|
|
425
|
+
readonly from: number;
|
|
426
|
+
readonly to: number;
|
|
427
|
+
}
|
|
428
|
+
interface GetWorktreeSheetBlockInput {
|
|
429
|
+
readonly worktreeID: string;
|
|
430
|
+
readonly unitID: string;
|
|
431
|
+
readonly type: UniverType;
|
|
432
|
+
readonly blockID: string;
|
|
433
|
+
}
|
|
434
|
+
interface SubmitWorktreeChangesetInput {
|
|
435
|
+
readonly worktreeID: string;
|
|
436
|
+
readonly changeset: IChangeset;
|
|
437
|
+
}
|
|
438
|
+
type GetWorktreeChangesetsResult = GetChangesetsResult;
|
|
439
|
+
type GetWorktreeSheetBlockResult = GetSheetBlockResult;
|
|
440
|
+
type SubmitWorktreeChangesetResult = SubmitChangesetResult;
|
|
441
|
+
//#endregion
|
|
442
|
+
//#region src/service/service.d.ts
|
|
443
|
+
interface UniverCollabWorktreeServiceOptions {
|
|
444
|
+
readonly trunk: {
|
|
445
|
+
readonly service: IUniverCollabService;
|
|
446
|
+
readonly dbAdapter: IDatabaseAdapter;
|
|
447
|
+
};
|
|
448
|
+
readonly dbAdapter: IWorktreeDatabaseAdapter;
|
|
449
|
+
readonly runtime?: {
|
|
450
|
+
readonly maxLoadedUnits?: number;
|
|
451
|
+
readonly idleTimeoutMs?: number;
|
|
452
|
+
};
|
|
453
|
+
readonly submitChangeset?: {
|
|
454
|
+
readonly maxRevisionRetries?: number;
|
|
455
|
+
};
|
|
456
|
+
readonly logger?: ILogger;
|
|
457
|
+
readonly metrics?: IMetrics;
|
|
458
|
+
}
|
|
459
|
+
interface IUniverCollabWorktreeService {
|
|
460
|
+
use<K extends WorktreeMiddlewareAction>(action: K, middleware: WorktreeMiddlewareMap[K]): Disposable;
|
|
461
|
+
createWorktree(input: CreateWorktreeInput, context: CollabContext): Promise<WorktreeResult>;
|
|
462
|
+
getWorktree(input: GetWorktreeInput, context: CollabContext): Promise<WorktreeResult>;
|
|
463
|
+
addUnit(input: AddWorktreeUnitInput, context: CollabContext): Promise<WorktreeResult>;
|
|
464
|
+
createUnitFromSnapshot(input: CreateWorktreeUnitFromSnapshotInput, context: CollabContext): Promise<WorktreeResult>;
|
|
465
|
+
createUnitFromData(input: CreateWorktreeUnitFromDataInput, context: CollabContext): Promise<WorktreeResult>;
|
|
466
|
+
markReady(input: MarkWorktreeReadyInput, context: CollabContext): Promise<WorktreeResult>;
|
|
467
|
+
reopenWorktree(input: ReopenWorktreeInput, context: CollabContext): Promise<WorktreeResult>;
|
|
468
|
+
discardWorktree(input: DiscardWorktreeInput, context: CollabContext): Promise<WorktreeResult>;
|
|
469
|
+
mergeWorktree(input: MergeWorktreeInput, context: CollabMemberContext): Promise<WorktreeResult>;
|
|
470
|
+
evaluateWorktreeUnitMerge(input: EvaluateWorktreeUnitMergeInput, context: CollabContext): Promise<WorktreeUnitMergeEvaluation>;
|
|
471
|
+
getUnitLoadData(input: GetWorktreeUnitLoadDataInput, context: CollabContext): Promise<UnitLoadData>;
|
|
472
|
+
getChangesets(input: GetWorktreeChangesetsInput, context: CollabContext): Promise<GetWorktreeChangesetsResult>;
|
|
473
|
+
getSheetBlock(input: GetWorktreeSheetBlockInput, context: CollabContext): Promise<GetWorktreeSheetBlockResult>;
|
|
474
|
+
submitChangeset(input: SubmitWorktreeChangesetInput, context: CollabMemberContext): Promise<SubmitWorktreeChangesetResult>;
|
|
475
|
+
on<K extends keyof WorktreeServiceEventMap>(event: K, listener: (event: WorktreeServiceEventMap[K]) => void | Promise<void>): Disposable;
|
|
476
|
+
dispose(): Promise<void>;
|
|
477
|
+
}
|
|
478
|
+
declare class UniverCollabWorktreeService implements IUniverCollabWorktreeService {
|
|
479
|
+
private readonly _trunkService;
|
|
480
|
+
private readonly _trunkDbAdapter;
|
|
481
|
+
private readonly _dbAdapter;
|
|
482
|
+
private readonly _middleware;
|
|
483
|
+
private readonly _events;
|
|
484
|
+
private readonly _lifecycle;
|
|
485
|
+
private readonly _logger;
|
|
486
|
+
private readonly _metrics;
|
|
487
|
+
private readonly _runtimeOptions;
|
|
488
|
+
private readonly _maxRevisionRetries;
|
|
489
|
+
private readonly _draftServices;
|
|
490
|
+
constructor(options: UniverCollabWorktreeServiceOptions);
|
|
491
|
+
use<K extends WorktreeMiddlewareAction>(action: K, middleware: WorktreeMiddlewareMap[K]): Disposable;
|
|
492
|
+
on<K extends keyof WorktreeServiceEventMap>(event: K, listener: (event: WorktreeServiceEventMap[K]) => void | Promise<void>): Disposable;
|
|
493
|
+
createWorktree(input: CreateWorktreeInput, context: CollabContext): Promise<WorktreeResult>;
|
|
494
|
+
getWorktree(input: GetWorktreeInput, context: CollabContext): Promise<WorktreeResult>;
|
|
495
|
+
addUnit(input: AddWorktreeUnitInput, context: CollabContext): Promise<WorktreeResult>;
|
|
496
|
+
createUnitFromSnapshot(input: CreateWorktreeUnitFromSnapshotInput, context: CollabContext): Promise<WorktreeResult>;
|
|
497
|
+
createUnitFromData(input: CreateWorktreeUnitFromDataInput, context: CollabContext): Promise<WorktreeResult>;
|
|
498
|
+
markReady(input: MarkWorktreeReadyInput, context: CollabContext): Promise<WorktreeResult>;
|
|
499
|
+
reopenWorktree(input: ReopenWorktreeInput, context: CollabContext): Promise<WorktreeResult>;
|
|
500
|
+
discardWorktree(input: DiscardWorktreeInput, context: CollabContext): Promise<WorktreeResult>;
|
|
501
|
+
mergeWorktree(input: MergeWorktreeInput, context: CollabMemberContext): Promise<WorktreeResult>;
|
|
502
|
+
evaluateWorktreeUnitMerge(input: EvaluateWorktreeUnitMergeInput, context: CollabContext): Promise<WorktreeUnitMergeEvaluation>;
|
|
503
|
+
getUnitLoadData(input: GetWorktreeUnitLoadDataInput, context: CollabContext): Promise<UnitLoadData>;
|
|
504
|
+
getChangesets(input: GetWorktreeChangesetsInput, context: CollabContext): Promise<GetWorktreeChangesetsResult>;
|
|
505
|
+
getSheetBlock(input: GetWorktreeSheetBlockInput, context: CollabContext): Promise<GetWorktreeSheetBlockResult>;
|
|
506
|
+
submitChangeset(input: SubmitWorktreeChangesetInput, context: CollabMemberContext): Promise<SubmitWorktreeChangesetResult>;
|
|
507
|
+
dispose(): Promise<void>;
|
|
508
|
+
private _draftService;
|
|
509
|
+
private _mergeUnit;
|
|
510
|
+
private _mergeCreatedUnit;
|
|
511
|
+
private _matchesCreatedTrunkUnit;
|
|
512
|
+
private _requireWorktreeAggregate;
|
|
513
|
+
private _transition;
|
|
514
|
+
private _requireTrunkUnit;
|
|
515
|
+
private _database;
|
|
516
|
+
private _call;
|
|
517
|
+
private _assertRunning;
|
|
518
|
+
}
|
|
519
|
+
//#endregion
|
|
520
|
+
export { type AddWorktreeUnitDatabaseInput, type AddWorktreeUnitDatabaseResult, type AddWorktreeUnitInput, type AddWorktreeUnitMiddlewareContext, type AddWorktreeUnitRequest, type ApplyWorktreeChangesetMiddlewareContext, type BaseWorktreeMiddlewareContext, type BaseWorktreeRequest, type CommitWorktreeChangesetInput, type CommitWorktreeChangesetMiddlewareContext, type CommitWorktreeChangesetResult, type CreateWorktreeDatabaseInput, type CreateWorktreeDatabaseResult, type CreateWorktreeInput, type CreateWorktreeMiddlewareContext, type CreateWorktreeRequest, type CreateWorktreeUnitDatabaseInput, type CreateWorktreeUnitDatabaseResult, type CreateWorktreeUnitFromDataInput, type CreateWorktreeUnitFromSnapshotInput, type CreateWorktreeUnitMiddlewareContext, type CreateWorktreeUnitRequest, type DiscardWorktreeInput, type DiscardWorktreeMiddlewareContext, type DiscardWorktreeRequest, type EvaluateWorktreeUnitMergeInput, type EvaluateWorktreeUnitMergeRequest, type GetWorktreeChangesetsInput, type GetWorktreeChangesetsRequest, type GetWorktreeChangesetsResult, type GetWorktreeInput, type GetWorktreeRequest, type GetWorktreeSheetBlockInput, type GetWorktreeSheetBlockRequest, type GetWorktreeSheetBlockResult, type GetWorktreeUnitLoadDataInput, type GetWorktreeUnitLoadDataRequest, type IUniverCollabWorktreeService, type IWorktreeDatabaseAdapter, type MarkWorktreeReadyInput, type MarkWorktreeReadyMiddlewareContext, type MarkWorktreeReadyRequest, type MemberWorktreeMiddlewareContext, type MergeWorktreeInput, type MergeWorktreeMiddlewareContext, type MergeWorktreeRequest, type ReadWorktreeDataMiddlewareContext, type ReadWorktreeUnitDataMiddlewareContext, type ReadWorktreeUnitDataRequest, type RecordUnitMergeResultInput, type RecordUnitMergeResultResult, type ReopenWorktreeInput, type ReopenWorktreeMiddlewareContext, type ReopenWorktreeRequest, type SaveWorktreeUnitMergeArtifactInput, type SaveWorktreeUnitMergeArtifactResult, type StartMergeResult, type SubmitWorktreeChangesetInput, type SubmitWorktreeChangesetMiddlewareContext, type SubmitWorktreeChangesetRequest, type SubmitWorktreeChangesetResult, UniverCollabWorktreeService, type UniverCollabWorktreeServiceOptions, type WorktreeAggregateRecord, type WorktreeChangesetCommittedEvent, type WorktreeCreatedEvent, type WorktreeData, type WorktreeDatabaseContext, WorktreeError, type WorktreeErrorCode, type WorktreeMemberDatabaseContext, type WorktreeMergeError, type WorktreeMiddleware, type WorktreeMiddlewareAction, type WorktreeMiddlewareMap, type WorktreeMiddlewareNext, type WorktreeRecord, type WorktreeRequest, type WorktreeResult, type WorktreeRevisionRange, type WorktreeServiceEventMap, type WorktreeStatus, type WorktreeStatusChangedEvent, type WorktreeTransitionResult, type WorktreeUnitAddedEvent, type WorktreeUnitCreatedEvent, type WorktreeUnitData, type WorktreeUnitMergeArtifact, type WorktreeUnitMergeEvaluation, type WorktreeUnitMergeResult, type WorktreeUnitMergeResultRecordedEvent, type WorktreeUnitRecord, type WorktreeUnitSeed, type WorktreeUnitSource };
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const _0x10a35c=_0x4976;function _0x4976(_0x261cbe,_0x130802){_0x261cbe=_0x261cbe-0x140;const _0x37ca53=_0x37ca();let _0x4976b9=_0x37ca53[_0x261cbe];return _0x4976b9;}function _0x37ca(){const _0x170bea=['1194HuSlSl','6915470FavPSc','10fNnopd','47911tyQsBc','34sKEyRY','UniverCollabWorktreeService','6071230xnPeWD','8tsiRUa','8931969vxgkPq','1024532QLeVNM','2086428crkSAB','5096EBDrRa','3PeKCmA'];_0x37ca=function(){return _0x170bea;};return _0x37ca();}(function(_0x4d8e99,_0x582ec7){const _0x5cc8fe=_0x4976,_0x61d2e8=_0x4d8e99();while(!![]){try{const _0x1ec513=parseInt(_0x5cc8fe(0x14c))/0x1*(-parseInt(_0x5cc8fe(0x140))/0x2)+parseInt(_0x5cc8fe(0x148))/0x3*(-parseInt(_0x5cc8fe(0x145))/0x4)+parseInt(_0x5cc8fe(0x14a))/0x5+-parseInt(_0x5cc8fe(0x149))/0x6*(-parseInt(_0x5cc8fe(0x147))/0x7)+-parseInt(_0x5cc8fe(0x143))/0x8*(-parseInt(_0x5cc8fe(0x144))/0x9)+parseInt(_0x5cc8fe(0x14b))/0xa*(-parseInt(_0x5cc8fe(0x142))/0xb)+-parseInt(_0x5cc8fe(0x146))/0xc;if(_0x1ec513===_0x582ec7)break;else _0x61d2e8['push'](_0x61d2e8['shift']());}catch(_0x21a74c){_0x61d2e8['push'](_0x61d2e8['shift']());}}}(_0x37ca,0xb0c14));import _0x3c5e81 from'./index.cjs';const facadeExport0=_0x3c5e81[_0x10a35c(0x141)],facadeExport1=_0x3c5e81['WorktreeError'];export{facadeExport0 as UniverCollabWorktreeService,facadeExport1 as WorktreeError};
|
package/package.json
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@univerjs-pro/collaboration-worktree-service",
|
|
3
|
+
"type": "module",
|
|
4
|
+
"version": "1.0.0-beta.2",
|
|
5
|
+
"main": "./dist/index.cjs",
|
|
6
|
+
"module": "./dist/index.mjs",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.mjs",
|
|
12
|
+
"require": "./dist/index.cjs"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist"
|
|
17
|
+
],
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"@univerjs-pro/collaboration-service": "1.0.0-beta.2",
|
|
20
|
+
"@univerjs/protocol": "1.0.0-beta.2"
|
|
21
|
+
}
|
|
22
|
+
}
|