@dxos/migrations 0.8.4-main.f5c0578 → 0.8.4-main.fcfe5033a5
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 +2 -2
- package/dist/lib/browser/index.mjs +77 -44
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +77 -44
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/types/src/migration-builder.d.ts +4 -4
- package/dist/types/src/migration-builder.d.ts.map +1 -1
- package/dist/types/src/migrations.d.ts +2 -1
- package/dist/types/src/migrations.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +18 -13
- package/src/migration-builder.ts +32 -31
- package/src/migrations.test.ts +25 -17
- package/src/migrations.ts +14 -6
package/README.md
CHANGED
|
@@ -1,28 +1,25 @@
|
|
|
1
1
|
// src/migration-builder.ts
|
|
2
|
-
import { next as
|
|
2
|
+
import { next as A } from "@automerge/automerge";
|
|
3
3
|
import { CreateEpochRequest } from "@dxos/client/halo";
|
|
4
4
|
import { ObjectCore, migrateDocument } from "@dxos/echo-db";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
5
|
+
import { EncodedReference, SpaceDocVersion } from "@dxos/echo-protocol";
|
|
6
|
+
import { getSchemaDXN } from "@dxos/echo/internal";
|
|
7
7
|
import { invariant } from "@dxos/invariant";
|
|
8
|
+
import { DXN } from "@dxos/keys";
|
|
8
9
|
var __dxlog_file = "/__w/dxos/dxos/packages/sdk/migrations/src/migration-builder.ts";
|
|
9
10
|
var MigrationBuilder = class {
|
|
10
11
|
_space;
|
|
11
12
|
_repo;
|
|
12
13
|
_rootDoc;
|
|
13
14
|
// echoId -> automergeUrl
|
|
14
|
-
_newLinks;
|
|
15
|
-
_flushIds;
|
|
16
|
-
_deleteObjects;
|
|
17
|
-
_newRoot;
|
|
15
|
+
_newLinks = {};
|
|
16
|
+
_flushIds = [];
|
|
17
|
+
_deleteObjects = [];
|
|
18
|
+
_newRoot = void 0;
|
|
18
19
|
constructor(_space) {
|
|
19
20
|
this._space = _space;
|
|
20
|
-
this.
|
|
21
|
-
this.
|
|
22
|
-
this._deleteObjects = [];
|
|
23
|
-
this._newRoot = void 0;
|
|
24
|
-
this._repo = this._space.db.coreDatabase._repo;
|
|
25
|
-
this._rootDoc = this._space.db.coreDatabase._automergeDocLoader.getSpaceRootDocHandle().doc();
|
|
21
|
+
this._repo = this._space.internal.db.coreDatabase._repo;
|
|
22
|
+
this._rootDoc = this._space.internal.db.coreDatabase._automergeDocLoader.getSpaceRootDocHandle().doc();
|
|
26
23
|
}
|
|
27
24
|
async findObject(id) {
|
|
28
25
|
const documentId = (this._rootDoc.links?.[id] || this._newLinks[id])?.toString();
|
|
@@ -43,7 +40,7 @@ var MigrationBuilder = class {
|
|
|
43
40
|
const oldHandle = await this._findObjectContainingHandle(id);
|
|
44
41
|
invariant(oldHandle, void 0, {
|
|
45
42
|
F: __dxlog_file,
|
|
46
|
-
L:
|
|
43
|
+
L: 79,
|
|
47
44
|
S: this,
|
|
48
45
|
A: [
|
|
49
46
|
"oldHandle",
|
|
@@ -58,7 +55,7 @@ var MigrationBuilder = class {
|
|
|
58
55
|
objects: {
|
|
59
56
|
[id]: {
|
|
60
57
|
system: {
|
|
61
|
-
type:
|
|
58
|
+
type: EncodedReference.fromDXN(getSchemaDXN(schema))
|
|
62
59
|
},
|
|
63
60
|
data: props,
|
|
64
61
|
meta: {
|
|
@@ -68,30 +65,40 @@ var MigrationBuilder = class {
|
|
|
68
65
|
}
|
|
69
66
|
};
|
|
70
67
|
const migratedDoc = migrateDocument(oldHandle.doc(), newState);
|
|
71
|
-
const newHandle = this._repo.import(
|
|
68
|
+
const newHandle = this._repo.import(A.save(migratedDoc));
|
|
69
|
+
await newHandle.whenReady();
|
|
70
|
+
invariant(newHandle.url, "Migrated document URL not available after whenReady", {
|
|
71
|
+
F: __dxlog_file,
|
|
72
|
+
L: 101,
|
|
73
|
+
S: this,
|
|
74
|
+
A: [
|
|
75
|
+
"newHandle.url",
|
|
76
|
+
"'Migrated document URL not available after whenReady'"
|
|
77
|
+
]
|
|
78
|
+
});
|
|
72
79
|
this._newLinks[id] = newHandle.url;
|
|
73
|
-
this._addHandleToFlushList(newHandle);
|
|
80
|
+
this._addHandleToFlushList(newHandle.documentId);
|
|
74
81
|
}
|
|
75
82
|
async addObject(schema, props) {
|
|
76
|
-
const core = this._createObject({
|
|
83
|
+
const core = await this._createObject({
|
|
77
84
|
schema,
|
|
78
85
|
props
|
|
79
86
|
});
|
|
80
87
|
return core.id;
|
|
81
88
|
}
|
|
82
89
|
createReference(id) {
|
|
83
|
-
return
|
|
90
|
+
return EncodedReference.fromDXN(DXN.fromLocalObjectId(id));
|
|
84
91
|
}
|
|
85
92
|
deleteObject(id) {
|
|
86
93
|
this._deleteObjects.push(id);
|
|
87
94
|
}
|
|
88
|
-
changeProperties(changeFn) {
|
|
95
|
+
async changeProperties(changeFn) {
|
|
89
96
|
if (!this._newRoot) {
|
|
90
|
-
this._buildNewRoot();
|
|
97
|
+
await this._buildNewRoot();
|
|
91
98
|
}
|
|
92
99
|
invariant(this._newRoot, "New root not created", {
|
|
93
100
|
F: __dxlog_file,
|
|
94
|
-
L:
|
|
101
|
+
L: 123,
|
|
95
102
|
S: this,
|
|
96
103
|
A: [
|
|
97
104
|
"this._newRoot",
|
|
@@ -102,18 +109,19 @@ var MigrationBuilder = class {
|
|
|
102
109
|
const propertiesStructure = doc.objects?.[this._space.properties.id];
|
|
103
110
|
propertiesStructure && changeFn(propertiesStructure);
|
|
104
111
|
});
|
|
105
|
-
this.
|
|
112
|
+
await this._newRoot.whenReady();
|
|
113
|
+
this._addHandleToFlushList(this._newRoot.documentId);
|
|
106
114
|
}
|
|
107
115
|
/**
|
|
108
116
|
* @internal
|
|
109
117
|
*/
|
|
110
118
|
async _commit() {
|
|
111
119
|
if (!this._newRoot) {
|
|
112
|
-
this._buildNewRoot();
|
|
120
|
+
await this._buildNewRoot();
|
|
113
121
|
}
|
|
114
122
|
invariant(this._newRoot, "New root not created", {
|
|
115
123
|
F: __dxlog_file,
|
|
116
|
-
L:
|
|
124
|
+
L: 140,
|
|
117
125
|
S: this,
|
|
118
126
|
A: [
|
|
119
127
|
"this._newRoot",
|
|
@@ -121,6 +129,15 @@ var MigrationBuilder = class {
|
|
|
121
129
|
]
|
|
122
130
|
});
|
|
123
131
|
await this._space.db.flush();
|
|
132
|
+
invariant(this._newRoot.url, "New root URL not available", {
|
|
133
|
+
F: __dxlog_file,
|
|
134
|
+
L: 145,
|
|
135
|
+
S: this,
|
|
136
|
+
A: [
|
|
137
|
+
"this._newRoot.url",
|
|
138
|
+
"'New root URL not available'"
|
|
139
|
+
]
|
|
140
|
+
});
|
|
124
141
|
await this._space.internal.createEpoch({
|
|
125
142
|
migration: CreateEpochRequest.Migration.REPLACE_AUTOMERGE_ROOT,
|
|
126
143
|
automergeRootUrl: this._newRoot.url
|
|
@@ -135,7 +152,7 @@ var MigrationBuilder = class {
|
|
|
135
152
|
await docHandle.whenReady();
|
|
136
153
|
return docHandle;
|
|
137
154
|
}
|
|
138
|
-
_buildNewRoot() {
|
|
155
|
+
async _buildNewRoot() {
|
|
139
156
|
const links = {
|
|
140
157
|
...this._rootDoc.links ?? {}
|
|
141
158
|
};
|
|
@@ -143,7 +160,7 @@ var MigrationBuilder = class {
|
|
|
143
160
|
delete links[id];
|
|
144
161
|
}
|
|
145
162
|
for (const [id, url] of Object.entries(this._newLinks)) {
|
|
146
|
-
links[id] = new
|
|
163
|
+
links[id] = new A.RawString(url);
|
|
147
164
|
}
|
|
148
165
|
this._newRoot = this._repo.create({
|
|
149
166
|
version: SpaceDocVersion.CURRENT,
|
|
@@ -153,15 +170,16 @@ var MigrationBuilder = class {
|
|
|
153
170
|
objects: this._rootDoc.objects,
|
|
154
171
|
links
|
|
155
172
|
});
|
|
156
|
-
this.
|
|
173
|
+
await this._newRoot.whenReady();
|
|
174
|
+
this._addHandleToFlushList(this._newRoot.documentId);
|
|
157
175
|
}
|
|
158
|
-
_createObject({ id, schema, props }) {
|
|
176
|
+
async _createObject({ id, schema, props }) {
|
|
159
177
|
const core = new ObjectCore();
|
|
160
178
|
if (id) {
|
|
161
179
|
core.id = id;
|
|
162
180
|
}
|
|
163
181
|
core.initNewObject(props);
|
|
164
|
-
core.setType(
|
|
182
|
+
core.setType(EncodedReference.fromDXN(getSchemaDXN(schema)));
|
|
165
183
|
const newHandle = this._repo.create({
|
|
166
184
|
version: SpaceDocVersion.CURRENT,
|
|
167
185
|
access: {
|
|
@@ -171,25 +189,29 @@ var MigrationBuilder = class {
|
|
|
171
189
|
[core.id]: core.getDoc()
|
|
172
190
|
}
|
|
173
191
|
});
|
|
192
|
+
await newHandle.whenReady();
|
|
174
193
|
this._newLinks[core.id] = newHandle.url;
|
|
175
|
-
this._addHandleToFlushList(newHandle);
|
|
194
|
+
this._addHandleToFlushList(newHandle.documentId);
|
|
176
195
|
return core;
|
|
177
196
|
}
|
|
178
|
-
_addHandleToFlushList(
|
|
179
|
-
this._flushIds.push(
|
|
197
|
+
_addHandleToFlushList(id) {
|
|
198
|
+
this._flushIds.push(id);
|
|
180
199
|
}
|
|
181
200
|
};
|
|
182
201
|
|
|
183
202
|
// src/migrations.ts
|
|
184
|
-
import {
|
|
203
|
+
import { Atom } from "@effect-atom/atom";
|
|
204
|
+
import * as Registry from "@effect-atom/atom/Registry";
|
|
205
|
+
import { SpaceState } from "@dxos/client/echo";
|
|
185
206
|
import { invariant as invariant2 } from "@dxos/invariant";
|
|
186
207
|
var __dxlog_file2 = "/__w/dxos/dxos/packages/sdk/migrations/src/migrations.ts";
|
|
187
208
|
var Migrations = class {
|
|
188
209
|
static namespace;
|
|
189
210
|
static migrations = [];
|
|
190
|
-
static
|
|
211
|
+
static _registry = Registry.make();
|
|
212
|
+
static _stateAtom = Atom.make({
|
|
191
213
|
running: []
|
|
192
|
-
});
|
|
214
|
+
}).pipe(Atom.keepAlive);
|
|
193
215
|
static get versionProperty() {
|
|
194
216
|
return this.namespace && `${this.namespace}.version`;
|
|
195
217
|
}
|
|
@@ -197,7 +219,8 @@ var Migrations = class {
|
|
|
197
219
|
return this.migrations[this.migrations.length - 1]?.version;
|
|
198
220
|
}
|
|
199
221
|
static running(space) {
|
|
200
|
-
|
|
222
|
+
const state = this._registry.get(this._stateAtom);
|
|
223
|
+
return state.running.includes(space.key.toHex());
|
|
201
224
|
}
|
|
202
225
|
static define(namespace, migrations) {
|
|
203
226
|
this.namespace = namespace;
|
|
@@ -206,7 +229,7 @@ var Migrations = class {
|
|
|
206
229
|
static async migrate(space, targetVersion) {
|
|
207
230
|
invariant2(!this.running(space), "Migration already running", {
|
|
208
231
|
F: __dxlog_file2,
|
|
209
|
-
L:
|
|
232
|
+
L: 49,
|
|
210
233
|
S: this,
|
|
211
234
|
A: [
|
|
212
235
|
"!this.running(space)",
|
|
@@ -215,7 +238,7 @@ var Migrations = class {
|
|
|
215
238
|
});
|
|
216
239
|
invariant2(this.versionProperty, "Migrations namespace not set", {
|
|
217
240
|
F: __dxlog_file2,
|
|
218
|
-
L:
|
|
241
|
+
L: 50,
|
|
219
242
|
S: this,
|
|
220
243
|
A: [
|
|
221
244
|
"this.versionProperty",
|
|
@@ -224,7 +247,7 @@ var Migrations = class {
|
|
|
224
247
|
});
|
|
225
248
|
invariant2(space.state.get() === SpaceState.SPACE_READY, "Space not ready", {
|
|
226
249
|
F: __dxlog_file2,
|
|
227
|
-
L:
|
|
250
|
+
L: 51,
|
|
228
251
|
S: this,
|
|
229
252
|
A: [
|
|
230
253
|
"space.state.get() === SpaceState.SPACE_READY",
|
|
@@ -238,7 +261,14 @@ var Migrations = class {
|
|
|
238
261
|
if (currentIndex === targetIndex) {
|
|
239
262
|
return false;
|
|
240
263
|
}
|
|
241
|
-
|
|
264
|
+
const spaceKey = space.key.toHex();
|
|
265
|
+
const currentState = this._registry.get(this._stateAtom);
|
|
266
|
+
this._registry.set(this._stateAtom, {
|
|
267
|
+
running: [
|
|
268
|
+
...currentState.running,
|
|
269
|
+
spaceKey
|
|
270
|
+
]
|
|
271
|
+
});
|
|
242
272
|
if (targetIndex > currentIndex) {
|
|
243
273
|
const migrations = this.migrations.slice(currentIndex, targetIndex);
|
|
244
274
|
for (const migration of migrations) {
|
|
@@ -247,10 +277,10 @@ var Migrations = class {
|
|
|
247
277
|
space,
|
|
248
278
|
builder
|
|
249
279
|
});
|
|
250
|
-
builder.changeProperties((propertiesStructure) => {
|
|
280
|
+
await builder.changeProperties((propertiesStructure) => {
|
|
251
281
|
invariant2(this.versionProperty, "Migrations namespace not set", {
|
|
252
282
|
F: __dxlog_file2,
|
|
253
|
-
L:
|
|
283
|
+
L: 69,
|
|
254
284
|
S: this,
|
|
255
285
|
A: [
|
|
256
286
|
"this.versionProperty",
|
|
@@ -262,7 +292,10 @@ var Migrations = class {
|
|
|
262
292
|
await builder._commit();
|
|
263
293
|
}
|
|
264
294
|
}
|
|
265
|
-
this.
|
|
295
|
+
const finalState = this._registry.get(this._stateAtom);
|
|
296
|
+
this._registry.set(this._stateAtom, {
|
|
297
|
+
running: finalState.running.filter((key) => key !== spaceKey)
|
|
298
|
+
});
|
|
266
299
|
return true;
|
|
267
300
|
}
|
|
268
301
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/migration-builder.ts", "../../../src/migrations.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport {
|
|
5
|
-
"mappings": ";AAIA,
|
|
6
|
-
"names": ["next", "
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { next as A, type Doc } from '@automerge/automerge';\nimport { type AnyDocumentId, type DocumentId } from '@automerge/automerge-repo';\nimport type * as Schema from 'effect/Schema';\n\nimport { type Space } from '@dxos/client/echo';\nimport { CreateEpochRequest } from '@dxos/client/halo';\nimport { type DocHandleProxy, ObjectCore, type RepoProxy, migrateDocument } from '@dxos/echo-db';\nimport { type DatabaseDirectory, EncodedReference, type ObjectStructure, SpaceDocVersion } from '@dxos/echo-protocol';\nimport { getSchemaDXN } from '@dxos/echo/internal';\nimport { invariant } from '@dxos/invariant';\nimport { DXN } from '@dxos/keys';\nimport { type MaybePromise } from '@dxos/util';\n\n/*\n\nConsidering a better API for this:\n\n```ts\nconst migration = space.db.beginMigration(); // all actions are not visible to queries and are only applied once you call `apply`\n\nmigration.applyObjectMigration(defineMigration(From, To, { ... }));\n\nmigration.delete(id);\nmigration.add(obj);\n\nawait migration.apply(); // Will create new epoch.\n```\n\n*/\n\n// TODO(dmaretskyi): We no longer need to hook into ECHO internals, with the changes to echo APIs.\nexport class MigrationBuilder {\n private readonly _repo: RepoProxy;\n private readonly _rootDoc: Doc<DatabaseDirectory>;\n\n // echoId -> automergeUrl\n private readonly _newLinks: Record<string, string> = {};\n private readonly _flushIds: DocumentId[] = [];\n private readonly _deleteObjects: string[] = [];\n\n private _newRoot?: DocHandleProxy<DatabaseDirectory> = undefined;\n\n constructor(private readonly _space: Space) {\n this._repo = this._space.internal.db.coreDatabase._repo;\n // TODO(wittjosiah): Accessing private API.\n this._rootDoc = (this._space.internal.db.coreDatabase as any)._automergeDocLoader\n .getSpaceRootDocHandle()\n .doc() as Doc<DatabaseDirectory>;\n }\n\n async findObject(id: string): Promise<ObjectStructure | undefined> {\n const documentId = (this._rootDoc.links?.[id] || this._newLinks[id])?.toString() as AnyDocumentId | undefined;\n const docHandle = documentId && this._repo.find(documentId);\n if (!docHandle) {\n return undefined;\n }\n\n await docHandle.whenReady();\n const doc = docHandle.doc() as Doc<DatabaseDirectory>;\n return doc.objects?.[id];\n }\n\n async migrateObject(\n id: string,\n migrate: (objectStructure: ObjectStructure) => MaybePromise<{ schema: Schema.Schema.AnyNoContext; props: any }>,\n ): Promise<void> {\n const objectStructure = await this.findObject(id);\n if (!objectStructure) {\n return;\n }\n\n const { schema, props } = await migrate(objectStructure);\n\n const oldHandle = await this._findObjectContainingHandle(id);\n invariant(oldHandle);\n\n const newState: DatabaseDirectory = {\n version: SpaceDocVersion.CURRENT,\n access: {\n spaceKey: this._space.key.toHex(),\n },\n objects: {\n [id]: {\n system: {\n type: EncodedReference.fromDXN(getSchemaDXN(schema)!),\n },\n data: props,\n meta: {\n keys: [],\n },\n },\n },\n };\n const migratedDoc = migrateDocument(oldHandle.doc() as Doc<DatabaseDirectory>, newState);\n const newHandle = this._repo.import<DatabaseDirectory>(A.save(migratedDoc));\n await newHandle.whenReady();\n invariant(newHandle.url, 'Migrated document URL not available after whenReady');\n this._newLinks[id] = newHandle.url;\n this._addHandleToFlushList(newHandle.documentId!);\n }\n\n async addObject(schema: Schema.Schema.AnyNoContext, props: any): Promise<string> {\n const core = await this._createObject({ schema, props });\n return core.id;\n }\n\n createReference(id: string) {\n return EncodedReference.fromDXN(DXN.fromLocalObjectId(id));\n }\n\n deleteObject(id: string): void {\n this._deleteObjects.push(id);\n }\n\n async changeProperties(changeFn: (properties: ObjectStructure) => void): Promise<void> {\n if (!this._newRoot) {\n await this._buildNewRoot();\n }\n invariant(this._newRoot, 'New root not created');\n\n this._newRoot.change((doc: DatabaseDirectory) => {\n const propertiesStructure = doc.objects?.[this._space.properties.id];\n propertiesStructure && changeFn(propertiesStructure);\n });\n await this._newRoot.whenReady();\n this._addHandleToFlushList(this._newRoot.documentId!);\n }\n\n /**\n * @internal\n */\n async _commit(): Promise<void> {\n if (!this._newRoot) {\n await this._buildNewRoot();\n }\n invariant(this._newRoot, 'New root not created');\n\n await this._space.db.flush();\n\n // Create new epoch.\n invariant(this._newRoot.url, 'New root URL not available');\n await this._space.internal.createEpoch({\n migration: CreateEpochRequest.Migration.REPLACE_AUTOMERGE_ROOT,\n automergeRootUrl: this._newRoot.url,\n });\n }\n\n private async _findObjectContainingHandle(id: string): Promise<DocHandleProxy<DatabaseDirectory> | undefined> {\n const documentId = (this._rootDoc.links?.[id] || this._newLinks[id])?.toString() as AnyDocumentId | undefined;\n const docHandle = documentId && this._repo.find(documentId);\n if (!docHandle) {\n return undefined;\n }\n\n await docHandle.whenReady();\n return docHandle;\n }\n\n private async _buildNewRoot(): Promise<void> {\n const links = { ...(this._rootDoc.links ?? {}) };\n for (const id of this._deleteObjects) {\n delete links[id];\n }\n\n for (const [id, url] of Object.entries(this._newLinks)) {\n links[id] = new A.RawString(url);\n }\n\n this._newRoot = this._repo.create<DatabaseDirectory>({\n version: SpaceDocVersion.CURRENT,\n access: {\n spaceKey: this._space.key.toHex(),\n },\n objects: this._rootDoc.objects,\n links,\n });\n await this._newRoot.whenReady();\n this._addHandleToFlushList(this._newRoot.documentId!);\n }\n\n private async _createObject({\n id,\n schema,\n props,\n }: {\n id?: string;\n schema: Schema.Schema.AnyNoContext;\n props: any;\n }): Promise<ObjectCore> {\n const core = new ObjectCore();\n if (id) {\n core.id = id;\n }\n\n core.initNewObject(props);\n core.setType(EncodedReference.fromDXN(getSchemaDXN(schema)!));\n const newHandle = this._repo.create<DatabaseDirectory>({\n version: SpaceDocVersion.CURRENT,\n access: {\n spaceKey: this._space.key.toHex(),\n },\n objects: {\n [core.id]: core.getDoc() as ObjectStructure,\n },\n });\n await newHandle.whenReady();\n this._newLinks[core.id] = newHandle.url!;\n this._addHandleToFlushList(newHandle.documentId!);\n\n return core;\n }\n\n private _addHandleToFlushList(id: DocumentId): void {\n this._flushIds.push(id);\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Atom } from '@effect-atom/atom';\nimport * as Registry from '@effect-atom/atom/Registry';\n\nimport { type Space, SpaceState } from '@dxos/client/echo';\nimport { invariant } from '@dxos/invariant';\nimport { type MaybePromise } from '@dxos/util';\n\nimport { MigrationBuilder } from './migration-builder';\n\nexport type MigrationContext = {\n space: Space;\n builder: MigrationBuilder;\n};\n\nexport type Migration = {\n version: string;\n next: (context: MigrationContext) => MaybePromise<void>;\n};\n\nexport class Migrations {\n static namespace?: string;\n static migrations: Migration[] = [];\n private static _registry = Registry.make();\n private static _stateAtom = Atom.make<{ running: string[] }>({ running: [] }).pipe(Atom.keepAlive);\n\n static get versionProperty() {\n return this.namespace && `${this.namespace}.version`;\n }\n\n static get targetVersion() {\n return this.migrations[this.migrations.length - 1]?.version;\n }\n\n static running(space: Space): boolean {\n const state = this._registry.get(this._stateAtom);\n return state.running.includes(space.key.toHex());\n }\n\n static define(namespace: string, migrations: Migration[]): void {\n this.namespace = namespace;\n this.migrations = migrations;\n }\n\n static async migrate(space: Space, targetVersion?: string | number): Promise<boolean> {\n invariant(!this.running(space), 'Migration already running');\n invariant(this.versionProperty, 'Migrations namespace not set');\n invariant(space.state.get() === SpaceState.SPACE_READY, 'Space not ready');\n const currentVersion = space.properties[this.versionProperty];\n const currentIndex = this.migrations.findIndex((m) => m.version === currentVersion) + 1;\n const i = this.migrations.findIndex((m) => m.version === targetVersion);\n const targetIndex = i === -1 ? this.migrations.length : i + 1;\n if (currentIndex === targetIndex) {\n return false;\n }\n\n const spaceKey = space.key.toHex();\n const currentState = this._registry.get(this._stateAtom);\n this._registry.set(this._stateAtom, { running: [...currentState.running, spaceKey] });\n if (targetIndex > currentIndex) {\n const migrations = this.migrations.slice(currentIndex, targetIndex);\n for (const migration of migrations) {\n const builder = new MigrationBuilder(space);\n await migration.next({ space, builder });\n await builder.changeProperties((propertiesStructure) => {\n invariant(this.versionProperty, 'Migrations namespace not set');\n propertiesStructure.data[this.versionProperty] = migration.version;\n });\n await builder._commit();\n }\n }\n const finalState = this._registry.get(this._stateAtom);\n this._registry.set(this._stateAtom, { running: finalState.running.filter((key) => key !== spaceKey) });\n\n return true;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["next", "A", "CreateEpochRequest", "ObjectCore", "migrateDocument", "EncodedReference", "SpaceDocVersion", "getSchemaDXN", "invariant", "DXN", "MigrationBuilder", "_repo", "_rootDoc", "_newLinks", "_flushIds", "_deleteObjects", "_newRoot", "undefined", "_space", "internal", "db", "coreDatabase", "_automergeDocLoader", "getSpaceRootDocHandle", "doc", "findObject", "id", "documentId", "links", "toString", "docHandle", "find", "whenReady", "objects", "migrateObject", "migrate", "objectStructure", "schema", "props", "oldHandle", "_findObjectContainingHandle", "newState", "version", "CURRENT", "access", "spaceKey", "key", "toHex", "system", "type", "fromDXN", "data", "meta", "keys", "migratedDoc", "newHandle", "import", "save", "url", "_addHandleToFlushList", "addObject", "core", "_createObject", "createReference", "fromLocalObjectId", "deleteObject", "push", "changeProperties", "changeFn", "_buildNewRoot", "change", "propertiesStructure", "properties", "_commit", "flush", "createEpoch", "migration", "Migration", "REPLACE_AUTOMERGE_ROOT", "automergeRootUrl", "Object", "entries", "RawString", "create", "initNewObject", "setType", "getDoc", "Atom", "Registry", "SpaceState", "invariant", "Migrations", "namespace", "migrations", "_registry", "make", "_stateAtom", "Atom", "running", "pipe", "keepAlive", "versionProperty", "targetVersion", "length", "version", "space", "state", "get", "includes", "key", "toHex", "define", "migrate", "invariant", "SpaceState", "SPACE_READY", "currentVersion", "properties", "currentIndex", "findIndex", "m", "i", "targetIndex", "spaceKey", "currentState", "set", "slice", "migration", "builder", "MigrationBuilder", "next", "changeProperties", "propertiesStructure", "data", "_commit", "finalState", "filter"]
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"src/migration-builder.ts":{"bytes":
|
|
1
|
+
{"inputs":{"src/migration-builder.ts":{"bytes":23919,"imports":[{"path":"@automerge/automerge","kind":"import-statement","external":true},{"path":"@dxos/client/halo","kind":"import-statement","external":true},{"path":"@dxos/echo-db","kind":"import-statement","external":true},{"path":"@dxos/echo-protocol","kind":"import-statement","external":true},{"path":"@dxos/echo/internal","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true}],"format":"esm"},"src/migrations.ts":{"bytes":11487,"imports":[{"path":"@effect-atom/atom","kind":"import-statement","external":true},{"path":"@effect-atom/atom/Registry","kind":"import-statement","external":true},{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"src/migration-builder.ts","kind":"import-statement","original":"./migration-builder"}],"format":"esm"},"src/index.ts":{"bytes":653,"imports":[{"path":"src/migration-builder.ts","kind":"import-statement","original":"./migration-builder"},{"path":"src/migrations.ts","kind":"import-statement","original":"./migrations"}],"format":"esm"}},"outputs":{"dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":17169},"dist/lib/browser/index.mjs":{"imports":[{"path":"@automerge/automerge","kind":"import-statement","external":true},{"path":"@dxos/client/halo","kind":"import-statement","external":true},{"path":"@dxos/echo-db","kind":"import-statement","external":true},{"path":"@dxos/echo-protocol","kind":"import-statement","external":true},{"path":"@dxos/echo/internal","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@effect-atom/atom","kind":"import-statement","external":true},{"path":"@effect-atom/atom/Registry","kind":"import-statement","external":true},{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true}],"exports":["MigrationBuilder","Migrations"],"entryPoint":"src/index.ts","inputs":{"src/migration-builder.ts":{"bytesInOutput":5571},"src/index.ts":{"bytesInOutput":0},"src/migrations.ts":{"bytesInOutput":3215}},"bytes":8916}}}
|