@dxos/migrations 0.5.9-main.89d55b2 → 0.5.9-main.912f1ef
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/dist/lib/browser/index.mjs +54 -20
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node/index.cjs +51 -17
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/meta.json +1 -1
- package/dist/types/src/migration-builder.d.ts +3 -1
- package/dist/types/src/migration-builder.d.ts.map +1 -1
- package/package.json +10 -10
- package/src/migration-builder.ts +51 -16
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// packages/sdk/migrations/src/migration-builder.ts
|
|
2
|
-
import {
|
|
2
|
+
import { next as am } from "@dxos/automerge/automerge";
|
|
3
3
|
import { CreateEpochRequest } from "@dxos/client/halo";
|
|
4
|
-
import { ObjectCore } from "@dxos/echo-db";
|
|
5
|
-
import { encodeReference, Reference } from "@dxos/echo-protocol";
|
|
4
|
+
import { ObjectCore, migrateDocument } from "@dxos/echo-db";
|
|
5
|
+
import { SpaceDocVersion, encodeReference, Reference } from "@dxos/echo-protocol";
|
|
6
6
|
import { requireTypeReference } from "@dxos/echo-schema";
|
|
7
7
|
import { invariant } from "@dxos/invariant";
|
|
8
8
|
var __dxlog_file = "/home/runner/work/dxos/dxos/packages/sdk/migrations/src/migration-builder.ts";
|
|
@@ -33,11 +33,37 @@ var MigrationBuilder = class {
|
|
|
33
33
|
return;
|
|
34
34
|
}
|
|
35
35
|
const { schema, props } = await migrate(objectStructure);
|
|
36
|
-
this.
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
36
|
+
const oldHandle = await this._findObjectContainingHandle(id);
|
|
37
|
+
invariant(oldHandle, void 0, {
|
|
38
|
+
F: __dxlog_file,
|
|
39
|
+
L: 61,
|
|
40
|
+
S: this,
|
|
41
|
+
A: [
|
|
42
|
+
"oldHandle",
|
|
43
|
+
""
|
|
44
|
+
]
|
|
40
45
|
});
|
|
46
|
+
const newState = {
|
|
47
|
+
version: SpaceDocVersion.CURRENT,
|
|
48
|
+
access: {
|
|
49
|
+
spaceKey: this._space.key.toHex()
|
|
50
|
+
},
|
|
51
|
+
objects: {
|
|
52
|
+
[id]: {
|
|
53
|
+
system: {
|
|
54
|
+
type: encodeReference(requireTypeReference(schema))
|
|
55
|
+
},
|
|
56
|
+
data: props,
|
|
57
|
+
meta: {
|
|
58
|
+
keys: []
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
const migratedDoc = migrateDocument(oldHandle.docSync(), newState);
|
|
64
|
+
const newHandle = this._repo.import(am.save(migratedDoc));
|
|
65
|
+
this._newLinks[id] = newHandle.url;
|
|
66
|
+
this._addHandleToFlushList(newHandle);
|
|
41
67
|
}
|
|
42
68
|
async addObject(schema, props) {
|
|
43
69
|
const core = this._createObject({
|
|
@@ -58,7 +84,7 @@ var MigrationBuilder = class {
|
|
|
58
84
|
}
|
|
59
85
|
invariant(this._newRoot, "New root not created", {
|
|
60
86
|
F: __dxlog_file,
|
|
61
|
-
L:
|
|
87
|
+
L: 103,
|
|
62
88
|
S: this,
|
|
63
89
|
A: [
|
|
64
90
|
"this._newRoot",
|
|
@@ -69,10 +95,7 @@ var MigrationBuilder = class {
|
|
|
69
95
|
const propertiesStructure = doc.objects?.[this._space.properties.id];
|
|
70
96
|
propertiesStructure && changeFn(propertiesStructure);
|
|
71
97
|
});
|
|
72
|
-
this.
|
|
73
|
-
documentId: this._newRoot.documentId,
|
|
74
|
-
heads: getHeads(this._newRoot.docSync())
|
|
75
|
-
});
|
|
98
|
+
this._addHandleToFlushList(this._newRoot);
|
|
76
99
|
}
|
|
77
100
|
/**
|
|
78
101
|
* @internal
|
|
@@ -83,7 +106,7 @@ var MigrationBuilder = class {
|
|
|
83
106
|
}
|
|
84
107
|
invariant(this._newRoot, "New root not created", {
|
|
85
108
|
F: __dxlog_file,
|
|
86
|
-
L:
|
|
109
|
+
L: 119,
|
|
87
110
|
S: this,
|
|
88
111
|
A: [
|
|
89
112
|
"this._newRoot",
|
|
@@ -98,6 +121,15 @@ var MigrationBuilder = class {
|
|
|
98
121
|
automergeRootUrl: this._newRoot.url
|
|
99
122
|
});
|
|
100
123
|
}
|
|
124
|
+
async _findObjectContainingHandle(id) {
|
|
125
|
+
const documentId = this._rootDoc.links?.[id] || this._newLinks[id];
|
|
126
|
+
const docHandle = documentId && this._repo.find(documentId);
|
|
127
|
+
if (!docHandle) {
|
|
128
|
+
return void 0;
|
|
129
|
+
}
|
|
130
|
+
await docHandle.whenReady();
|
|
131
|
+
return docHandle;
|
|
132
|
+
}
|
|
101
133
|
_buildNewRoot() {
|
|
102
134
|
const previousLinks = {
|
|
103
135
|
...this._rootDoc.links ?? {}
|
|
@@ -106,6 +138,7 @@ var MigrationBuilder = class {
|
|
|
106
138
|
delete previousLinks[id];
|
|
107
139
|
}
|
|
108
140
|
this._newRoot = this._repo.create({
|
|
141
|
+
version: SpaceDocVersion.CURRENT,
|
|
109
142
|
access: {
|
|
110
143
|
spaceKey: this._space.key.toHex()
|
|
111
144
|
},
|
|
@@ -115,10 +148,7 @@ var MigrationBuilder = class {
|
|
|
115
148
|
...this._newLinks
|
|
116
149
|
}
|
|
117
150
|
});
|
|
118
|
-
this.
|
|
119
|
-
documentId: this._newRoot.documentId,
|
|
120
|
-
heads: getHeads(this._newRoot.docSync())
|
|
121
|
-
});
|
|
151
|
+
this._addHandleToFlushList(this._newRoot);
|
|
122
152
|
}
|
|
123
153
|
_createObject({ id, schema, props }) {
|
|
124
154
|
const core = new ObjectCore();
|
|
@@ -128,6 +158,7 @@ var MigrationBuilder = class {
|
|
|
128
158
|
core.initNewObject(props);
|
|
129
159
|
core.setType(requireTypeReference(schema));
|
|
130
160
|
const newHandle = this._repo.create({
|
|
161
|
+
version: SpaceDocVersion.CURRENT,
|
|
131
162
|
access: {
|
|
132
163
|
spaceKey: this._space.key.toHex()
|
|
133
164
|
},
|
|
@@ -136,11 +167,14 @@ var MigrationBuilder = class {
|
|
|
136
167
|
}
|
|
137
168
|
});
|
|
138
169
|
this._newLinks[core.id] = newHandle.url;
|
|
170
|
+
this._addHandleToFlushList(newHandle);
|
|
171
|
+
return core;
|
|
172
|
+
}
|
|
173
|
+
_addHandleToFlushList(handle) {
|
|
139
174
|
this._flushStates.push({
|
|
140
|
-
documentId:
|
|
141
|
-
heads: getHeads(
|
|
175
|
+
documentId: handle.documentId,
|
|
176
|
+
heads: am.getHeads(handle.docSync())
|
|
142
177
|
});
|
|
143
|
-
return core;
|
|
144
178
|
}
|
|
145
179
|
};
|
|
146
180
|
|
|
@@ -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 { type Doc,
|
|
5
|
-
"mappings": ";AAIA,SAAmBA,
|
|
6
|
-
"names": ["
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { type Doc, next as am } from '@dxos/automerge/automerge';\nimport { type AnyDocumentId, type DocHandle, type Repo } from '@dxos/automerge/automerge-repo';\nimport { type Space } from '@dxos/client/echo';\nimport { CreateEpochRequest } from '@dxos/client/halo';\nimport { type AutomergeContext, ObjectCore, migrateDocument } from '@dxos/echo-db';\nimport { SpaceDocVersion, encodeReference, type ObjectStructure, type SpaceDoc, Reference } from '@dxos/echo-protocol';\nimport { requireTypeReference, type S } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { type FlushRequest } from '@dxos/protocols/proto/dxos/echo/service';\nimport { type MaybePromise } from '@dxos/util';\n\nexport class MigrationBuilder {\n private readonly _repo: Repo;\n private readonly _automergeContext: AutomergeContext;\n private readonly _rootDoc: Doc<SpaceDoc>;\n\n // echoId -> automergeUrl\n private readonly _newLinks: Record<string, string> = {};\n private readonly _flushStates: FlushRequest.DocState[] = [];\n private readonly _deleteObjects: string[] = [];\n\n private _newRoot?: DocHandle<SpaceDoc> = undefined;\n\n constructor(private readonly _space: Space) {\n this._repo = this._space.db.coreDatabase.automerge.repo;\n this._automergeContext = this._space.db.coreDatabase.automerge;\n // TODO(wittjosiah): Accessing private API.\n this._rootDoc = (this._space.db.coreDatabase as any)._automergeDocLoader\n .getSpaceRootDocHandle()\n .docSync() as Doc<SpaceDoc>;\n }\n\n async findObject(id: string): Promise<ObjectStructure | undefined> {\n const documentId = (this._rootDoc.links?.[id] || this._newLinks[id]) 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.docSync() as Doc<SpaceDoc>;\n return doc.objects?.[id];\n }\n\n async migrateObject(\n id: string,\n migrate: (objectStructure: ObjectStructure) => MaybePromise<{ schema: S.Schema<any>; props: any }>,\n ) {\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: SpaceDoc = {\n version: SpaceDocVersion.CURRENT,\n access: {\n spaceKey: this._space.key.toHex(),\n },\n objects: {\n [id]: {\n system: {\n type: encodeReference(requireTypeReference(schema)),\n },\n data: props,\n meta: {\n keys: [],\n },\n },\n },\n };\n const migratedDoc = migrateDocument(oldHandle.docSync() as Doc<SpaceDoc>, newState);\n const newHandle = this._repo.import<SpaceDoc>(am.save(migratedDoc));\n this._newLinks[id] = newHandle.url;\n this._addHandleToFlushList(newHandle);\n }\n\n async addObject(schema: S.Schema<any>, props: any) {\n const core = this._createObject({ schema, props });\n return core.id;\n }\n\n createReference(id: string) {\n return encodeReference(new Reference(id));\n }\n\n deleteObject(id: string) {\n this._deleteObjects.push(id);\n }\n\n changeProperties(changeFn: (properties: ObjectStructure) => void) {\n if (!this._newRoot) {\n this._buildNewRoot();\n }\n invariant(this._newRoot, 'New root not created');\n\n this._newRoot.change((doc: SpaceDoc) => {\n const propertiesStructure = doc.objects?.[this._space.properties.id];\n propertiesStructure && changeFn(propertiesStructure);\n });\n this._addHandleToFlushList(this._newRoot);\n }\n\n /**\n * @internal\n */\n async _commit() {\n if (!this._newRoot) {\n this._buildNewRoot();\n }\n invariant(this._newRoot, 'New root not created');\n\n await this._automergeContext.flush({\n states: this._flushStates,\n });\n\n // Create new epoch.\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<DocHandle<SpaceDoc> | undefined> {\n const documentId = (this._rootDoc.links?.[id] || this._newLinks[id]) 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 _buildNewRoot() {\n const previousLinks = { ...(this._rootDoc.links ?? {}) };\n for (const id of this._deleteObjects) {\n delete previousLinks[id];\n }\n\n this._newRoot = this._repo.create<SpaceDoc>({\n version: SpaceDocVersion.CURRENT,\n access: {\n spaceKey: this._space.key.toHex(),\n },\n objects: this._rootDoc.objects,\n links: {\n ...previousLinks,\n ...this._newLinks,\n },\n });\n this._addHandleToFlushList(this._newRoot);\n }\n\n private _createObject({ id, schema, props }: { id?: string; schema: S.Schema<any>; props: any }) {\n const core = new ObjectCore();\n if (id) {\n core.id = id;\n }\n\n core.initNewObject(props);\n core.setType(requireTypeReference(schema));\n const newHandle = this._repo.create<SpaceDoc>({\n version: SpaceDocVersion.CURRENT,\n access: {\n spaceKey: this._space.key.toHex(),\n },\n objects: {\n [core.id]: core.getDoc(),\n },\n });\n this._newLinks[core.id] = newHandle.url;\n this._addHandleToFlushList(newHandle);\n\n return core;\n }\n\n private _addHandleToFlushList(handle: DocHandle<any>) {\n this._flushStates.push({\n documentId: handle.documentId,\n heads: am.getHeads(handle.docSync()),\n });\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Space, create, 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 _state = create<{ running: string[] }>({ running: [] });\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) {\n return this._state.running.includes(space.key.toHex());\n }\n\n static define(namespace: string, migrations: Migration[]) {\n this.namespace = namespace;\n this.migrations = migrations;\n }\n\n static async migrate(space: Space, targetVersion?: string | number) {\n invariant(!this.running(space), 'Migration already running');\n invariant(this.versionProperty, 'Migrations namespace not set');\n invariant(space.state.get() === SpaceState.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 this._state.running.push(space.key.toHex());\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 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 this._state.running.splice(this._state.running.indexOf(space.key.toHex()), 1);\n\n return true;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["next", "am", "CreateEpochRequest", "ObjectCore", "migrateDocument", "SpaceDocVersion", "encodeReference", "Reference", "requireTypeReference", "invariant", "MigrationBuilder", "constructor", "_space", "_newLinks", "_flushStates", "_deleteObjects", "_newRoot", "undefined", "_repo", "db", "coreDatabase", "automerge", "repo", "_automergeContext", "_rootDoc", "_automergeDocLoader", "getSpaceRootDocHandle", "docSync", "findObject", "id", "documentId", "links", "docHandle", "find", "whenReady", "doc", "objects", "migrateObject", "migrate", "objectStructure", "schema", "props", "oldHandle", "_findObjectContainingHandle", "newState", "version", "CURRENT", "access", "spaceKey", "key", "toHex", "system", "type", "data", "meta", "keys", "migratedDoc", "newHandle", "import", "save", "url", "_addHandleToFlushList", "addObject", "core", "_createObject", "createReference", "deleteObject", "push", "changeProperties", "changeFn", "_buildNewRoot", "change", "propertiesStructure", "properties", "_commit", "flush", "states", "internal", "createEpoch", "migration", "Migration", "REPLACE_AUTOMERGE_ROOT", "automergeRootUrl", "previousLinks", "create", "initNewObject", "setType", "getDoc", "handle", "heads", "getHeads", "create", "SpaceState", "invariant", "Migrations", "migrations", "_state", "create", "running", "versionProperty", "namespace", "targetVersion", "length", "version", "space", "includes", "key", "toHex", "define", "migrate", "invariant", "state", "get", "SpaceState", "READY", "currentVersion", "properties", "currentIndex", "findIndex", "m", "i", "targetIndex", "push", "slice", "migration", "builder", "MigrationBuilder", "next", "changeProperties", "propertiesStructure", "data", "_commit", "splice", "indexOf"]
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"packages/sdk/migrations/src/migration-builder.ts":{"bytes":
|
|
1
|
+
{"inputs":{"packages/sdk/migrations/src/migration-builder.ts":{"bytes":21641,"imports":[{"path":"@dxos/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-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true}],"format":"esm"},"packages/sdk/migrations/src/migrations.ts":{"bytes":9817,"imports":[{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"packages/sdk/migrations/src/migration-builder.ts","kind":"import-statement","original":"./migration-builder"}],"format":"esm"},"packages/sdk/migrations/src/index.ts":{"bytes":698,"imports":[{"path":"packages/sdk/migrations/src/migration-builder.ts","kind":"import-statement","original":"./migration-builder"},{"path":"packages/sdk/migrations/src/migrations.ts","kind":"import-statement","original":"./migrations"}],"format":"esm"}},"outputs":{"packages/sdk/migrations/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":15103},"packages/sdk/migrations/dist/lib/browser/index.mjs":{"imports":[{"path":"@dxos/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-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","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":"packages/sdk/migrations/src/index.ts","inputs":{"packages/sdk/migrations/src/migration-builder.ts":{"bytesInOutput":4976},"packages/sdk/migrations/src/index.ts":{"bytesInOutput":0},"packages/sdk/migrations/src/migrations.ts":{"bytesInOutput":2745}},"bytes":7899}}}
|
package/dist/lib/node/index.cjs
CHANGED
|
@@ -58,11 +58,37 @@ var MigrationBuilder = class {
|
|
|
58
58
|
return;
|
|
59
59
|
}
|
|
60
60
|
const { schema, props } = await migrate(objectStructure);
|
|
61
|
-
this.
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
61
|
+
const oldHandle = await this._findObjectContainingHandle(id);
|
|
62
|
+
(0, import_invariant.invariant)(oldHandle, void 0, {
|
|
63
|
+
F: __dxlog_file,
|
|
64
|
+
L: 61,
|
|
65
|
+
S: this,
|
|
66
|
+
A: [
|
|
67
|
+
"oldHandle",
|
|
68
|
+
""
|
|
69
|
+
]
|
|
65
70
|
});
|
|
71
|
+
const newState = {
|
|
72
|
+
version: import_echo_protocol.SpaceDocVersion.CURRENT,
|
|
73
|
+
access: {
|
|
74
|
+
spaceKey: this._space.key.toHex()
|
|
75
|
+
},
|
|
76
|
+
objects: {
|
|
77
|
+
[id]: {
|
|
78
|
+
system: {
|
|
79
|
+
type: (0, import_echo_protocol.encodeReference)((0, import_echo_schema.requireTypeReference)(schema))
|
|
80
|
+
},
|
|
81
|
+
data: props,
|
|
82
|
+
meta: {
|
|
83
|
+
keys: []
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
const migratedDoc = (0, import_echo_db.migrateDocument)(oldHandle.docSync(), newState);
|
|
89
|
+
const newHandle = this._repo.import(import_automerge.next.save(migratedDoc));
|
|
90
|
+
this._newLinks[id] = newHandle.url;
|
|
91
|
+
this._addHandleToFlushList(newHandle);
|
|
66
92
|
}
|
|
67
93
|
async addObject(schema, props) {
|
|
68
94
|
const core = this._createObject({
|
|
@@ -83,7 +109,7 @@ var MigrationBuilder = class {
|
|
|
83
109
|
}
|
|
84
110
|
(0, import_invariant.invariant)(this._newRoot, "New root not created", {
|
|
85
111
|
F: __dxlog_file,
|
|
86
|
-
L:
|
|
112
|
+
L: 103,
|
|
87
113
|
S: this,
|
|
88
114
|
A: [
|
|
89
115
|
"this._newRoot",
|
|
@@ -94,10 +120,7 @@ var MigrationBuilder = class {
|
|
|
94
120
|
const propertiesStructure = doc.objects?.[this._space.properties.id];
|
|
95
121
|
propertiesStructure && changeFn(propertiesStructure);
|
|
96
122
|
});
|
|
97
|
-
this.
|
|
98
|
-
documentId: this._newRoot.documentId,
|
|
99
|
-
heads: (0, import_automerge.getHeads)(this._newRoot.docSync())
|
|
100
|
-
});
|
|
123
|
+
this._addHandleToFlushList(this._newRoot);
|
|
101
124
|
}
|
|
102
125
|
/**
|
|
103
126
|
* @internal
|
|
@@ -108,7 +131,7 @@ var MigrationBuilder = class {
|
|
|
108
131
|
}
|
|
109
132
|
(0, import_invariant.invariant)(this._newRoot, "New root not created", {
|
|
110
133
|
F: __dxlog_file,
|
|
111
|
-
L:
|
|
134
|
+
L: 119,
|
|
112
135
|
S: this,
|
|
113
136
|
A: [
|
|
114
137
|
"this._newRoot",
|
|
@@ -123,6 +146,15 @@ var MigrationBuilder = class {
|
|
|
123
146
|
automergeRootUrl: this._newRoot.url
|
|
124
147
|
});
|
|
125
148
|
}
|
|
149
|
+
async _findObjectContainingHandle(id) {
|
|
150
|
+
const documentId = this._rootDoc.links?.[id] || this._newLinks[id];
|
|
151
|
+
const docHandle = documentId && this._repo.find(documentId);
|
|
152
|
+
if (!docHandle) {
|
|
153
|
+
return void 0;
|
|
154
|
+
}
|
|
155
|
+
await docHandle.whenReady();
|
|
156
|
+
return docHandle;
|
|
157
|
+
}
|
|
126
158
|
_buildNewRoot() {
|
|
127
159
|
const previousLinks = {
|
|
128
160
|
...this._rootDoc.links ?? {}
|
|
@@ -131,6 +163,7 @@ var MigrationBuilder = class {
|
|
|
131
163
|
delete previousLinks[id];
|
|
132
164
|
}
|
|
133
165
|
this._newRoot = this._repo.create({
|
|
166
|
+
version: import_echo_protocol.SpaceDocVersion.CURRENT,
|
|
134
167
|
access: {
|
|
135
168
|
spaceKey: this._space.key.toHex()
|
|
136
169
|
},
|
|
@@ -140,10 +173,7 @@ var MigrationBuilder = class {
|
|
|
140
173
|
...this._newLinks
|
|
141
174
|
}
|
|
142
175
|
});
|
|
143
|
-
this.
|
|
144
|
-
documentId: this._newRoot.documentId,
|
|
145
|
-
heads: (0, import_automerge.getHeads)(this._newRoot.docSync())
|
|
146
|
-
});
|
|
176
|
+
this._addHandleToFlushList(this._newRoot);
|
|
147
177
|
}
|
|
148
178
|
_createObject({ id, schema, props }) {
|
|
149
179
|
const core = new import_echo_db.ObjectCore();
|
|
@@ -153,6 +183,7 @@ var MigrationBuilder = class {
|
|
|
153
183
|
core.initNewObject(props);
|
|
154
184
|
core.setType((0, import_echo_schema.requireTypeReference)(schema));
|
|
155
185
|
const newHandle = this._repo.create({
|
|
186
|
+
version: import_echo_protocol.SpaceDocVersion.CURRENT,
|
|
156
187
|
access: {
|
|
157
188
|
spaceKey: this._space.key.toHex()
|
|
158
189
|
},
|
|
@@ -161,11 +192,14 @@ var MigrationBuilder = class {
|
|
|
161
192
|
}
|
|
162
193
|
});
|
|
163
194
|
this._newLinks[core.id] = newHandle.url;
|
|
195
|
+
this._addHandleToFlushList(newHandle);
|
|
196
|
+
return core;
|
|
197
|
+
}
|
|
198
|
+
_addHandleToFlushList(handle) {
|
|
164
199
|
this._flushStates.push({
|
|
165
|
-
documentId:
|
|
166
|
-
heads:
|
|
200
|
+
documentId: handle.documentId,
|
|
201
|
+
heads: import_automerge.next.getHeads(handle.docSync())
|
|
167
202
|
});
|
|
168
|
-
return core;
|
|
169
203
|
}
|
|
170
204
|
};
|
|
171
205
|
var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/sdk/migrations/src/migrations.ts";
|
|
@@ -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 { type Doc,
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAIA,
|
|
6
|
-
"names": ["import_invariant", "MigrationBuilder", "constructor", "_space", "_newLinks", "_flushStates", "_deleteObjects", "_newRoot", "undefined", "_repo", "db", "coreDatabase", "automerge", "repo", "_automergeContext", "_rootDoc", "_automergeDocLoader", "getSpaceRootDocHandle", "docSync", "findObject", "id", "documentId", "links", "docHandle", "find", "whenReady", "doc", "objects", "migrateObject", "migrate", "objectStructure", "schema", "props", "
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { type Doc, next as am } from '@dxos/automerge/automerge';\nimport { type AnyDocumentId, type DocHandle, type Repo } from '@dxos/automerge/automerge-repo';\nimport { type Space } from '@dxos/client/echo';\nimport { CreateEpochRequest } from '@dxos/client/halo';\nimport { type AutomergeContext, ObjectCore, migrateDocument } from '@dxos/echo-db';\nimport { SpaceDocVersion, encodeReference, type ObjectStructure, type SpaceDoc, Reference } from '@dxos/echo-protocol';\nimport { requireTypeReference, type S } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { type FlushRequest } from '@dxos/protocols/proto/dxos/echo/service';\nimport { type MaybePromise } from '@dxos/util';\n\nexport class MigrationBuilder {\n private readonly _repo: Repo;\n private readonly _automergeContext: AutomergeContext;\n private readonly _rootDoc: Doc<SpaceDoc>;\n\n // echoId -> automergeUrl\n private readonly _newLinks: Record<string, string> = {};\n private readonly _flushStates: FlushRequest.DocState[] = [];\n private readonly _deleteObjects: string[] = [];\n\n private _newRoot?: DocHandle<SpaceDoc> = undefined;\n\n constructor(private readonly _space: Space) {\n this._repo = this._space.db.coreDatabase.automerge.repo;\n this._automergeContext = this._space.db.coreDatabase.automerge;\n // TODO(wittjosiah): Accessing private API.\n this._rootDoc = (this._space.db.coreDatabase as any)._automergeDocLoader\n .getSpaceRootDocHandle()\n .docSync() as Doc<SpaceDoc>;\n }\n\n async findObject(id: string): Promise<ObjectStructure | undefined> {\n const documentId = (this._rootDoc.links?.[id] || this._newLinks[id]) 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.docSync() as Doc<SpaceDoc>;\n return doc.objects?.[id];\n }\n\n async migrateObject(\n id: string,\n migrate: (objectStructure: ObjectStructure) => MaybePromise<{ schema: S.Schema<any>; props: any }>,\n ) {\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: SpaceDoc = {\n version: SpaceDocVersion.CURRENT,\n access: {\n spaceKey: this._space.key.toHex(),\n },\n objects: {\n [id]: {\n system: {\n type: encodeReference(requireTypeReference(schema)),\n },\n data: props,\n meta: {\n keys: [],\n },\n },\n },\n };\n const migratedDoc = migrateDocument(oldHandle.docSync() as Doc<SpaceDoc>, newState);\n const newHandle = this._repo.import<SpaceDoc>(am.save(migratedDoc));\n this._newLinks[id] = newHandle.url;\n this._addHandleToFlushList(newHandle);\n }\n\n async addObject(schema: S.Schema<any>, props: any) {\n const core = this._createObject({ schema, props });\n return core.id;\n }\n\n createReference(id: string) {\n return encodeReference(new Reference(id));\n }\n\n deleteObject(id: string) {\n this._deleteObjects.push(id);\n }\n\n changeProperties(changeFn: (properties: ObjectStructure) => void) {\n if (!this._newRoot) {\n this._buildNewRoot();\n }\n invariant(this._newRoot, 'New root not created');\n\n this._newRoot.change((doc: SpaceDoc) => {\n const propertiesStructure = doc.objects?.[this._space.properties.id];\n propertiesStructure && changeFn(propertiesStructure);\n });\n this._addHandleToFlushList(this._newRoot);\n }\n\n /**\n * @internal\n */\n async _commit() {\n if (!this._newRoot) {\n this._buildNewRoot();\n }\n invariant(this._newRoot, 'New root not created');\n\n await this._automergeContext.flush({\n states: this._flushStates,\n });\n\n // Create new epoch.\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<DocHandle<SpaceDoc> | undefined> {\n const documentId = (this._rootDoc.links?.[id] || this._newLinks[id]) 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 _buildNewRoot() {\n const previousLinks = { ...(this._rootDoc.links ?? {}) };\n for (const id of this._deleteObjects) {\n delete previousLinks[id];\n }\n\n this._newRoot = this._repo.create<SpaceDoc>({\n version: SpaceDocVersion.CURRENT,\n access: {\n spaceKey: this._space.key.toHex(),\n },\n objects: this._rootDoc.objects,\n links: {\n ...previousLinks,\n ...this._newLinks,\n },\n });\n this._addHandleToFlushList(this._newRoot);\n }\n\n private _createObject({ id, schema, props }: { id?: string; schema: S.Schema<any>; props: any }) {\n const core = new ObjectCore();\n if (id) {\n core.id = id;\n }\n\n core.initNewObject(props);\n core.setType(requireTypeReference(schema));\n const newHandle = this._repo.create<SpaceDoc>({\n version: SpaceDocVersion.CURRENT,\n access: {\n spaceKey: this._space.key.toHex(),\n },\n objects: {\n [core.id]: core.getDoc(),\n },\n });\n this._newLinks[core.id] = newHandle.url;\n this._addHandleToFlushList(newHandle);\n\n return core;\n }\n\n private _addHandleToFlushList(handle: DocHandle<any>) {\n this._flushStates.push({\n documentId: handle.documentId,\n heads: am.getHeads(handle.docSync()),\n });\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Space, create, 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 _state = create<{ running: string[] }>({ running: [] });\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) {\n return this._state.running.includes(space.key.toHex());\n }\n\n static define(namespace: string, migrations: Migration[]) {\n this.namespace = namespace;\n this.migrations = migrations;\n }\n\n static async migrate(space: Space, targetVersion?: string | number) {\n invariant(!this.running(space), 'Migration already running');\n invariant(this.versionProperty, 'Migrations namespace not set');\n invariant(space.state.get() === SpaceState.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 this._state.running.push(space.key.toHex());\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 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 this._state.running.splice(this._state.running.indexOf(space.key.toHex()), 1);\n\n return true;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_invariant", "MigrationBuilder", "constructor", "_space", "_newLinks", "_flushStates", "_deleteObjects", "_newRoot", "undefined", "_repo", "db", "coreDatabase", "automerge", "repo", "_automergeContext", "_rootDoc", "_automergeDocLoader", "getSpaceRootDocHandle", "docSync", "findObject", "id", "documentId", "links", "docHandle", "find", "whenReady", "doc", "objects", "migrateObject", "migrate", "objectStructure", "schema", "props", "oldHandle", "_findObjectContainingHandle", "invariant", "newState", "version", "SpaceDocVersion", "CURRENT", "access", "spaceKey", "key", "toHex", "system", "type", "encodeReference", "requireTypeReference", "data", "meta", "keys", "migratedDoc", "migrateDocument", "newHandle", "import", "am", "save", "url", "_addHandleToFlushList", "addObject", "core", "_createObject", "createReference", "Reference", "deleteObject", "push", "changeProperties", "changeFn", "_buildNewRoot", "change", "propertiesStructure", "properties", "_commit", "flush", "states", "internal", "createEpoch", "migration", "CreateEpochRequest", "Migration", "REPLACE_AUTOMERGE_ROOT", "automergeRootUrl", "previousLinks", "create", "ObjectCore", "initNewObject", "setType", "getDoc", "handle", "heads", "getHeads", "Migrations", "migrations", "_state", "running", "versionProperty", "namespace", "targetVersion", "length", "space", "includes", "define", "state", "get", "SpaceState", "READY", "currentVersion", "currentIndex", "findIndex", "m", "i", "targetIndex", "slice", "builder", "next", "splice", "indexOf"]
|
|
7
7
|
}
|
package/dist/lib/node/meta.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"packages/sdk/migrations/src/migration-builder.ts":{"bytes":
|
|
1
|
+
{"inputs":{"packages/sdk/migrations/src/migration-builder.ts":{"bytes":21641,"imports":[{"path":"@dxos/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-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true}],"format":"esm"},"packages/sdk/migrations/src/migrations.ts":{"bytes":9817,"imports":[{"path":"@dxos/client/echo","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"packages/sdk/migrations/src/migration-builder.ts","kind":"import-statement","original":"./migration-builder"}],"format":"esm"},"packages/sdk/migrations/src/index.ts":{"bytes":698,"imports":[{"path":"packages/sdk/migrations/src/migration-builder.ts","kind":"import-statement","original":"./migration-builder"},{"path":"packages/sdk/migrations/src/migrations.ts","kind":"import-statement","original":"./migrations"}],"format":"esm"}},"outputs":{"packages/sdk/migrations/dist/lib/node/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":15103},"packages/sdk/migrations/dist/lib/node/index.cjs":{"imports":[{"path":"@dxos/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-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","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":"packages/sdk/migrations/src/index.ts","inputs":{"packages/sdk/migrations/src/migration-builder.ts":{"bytesInOutput":4976},"packages/sdk/migrations/src/index.ts":{"bytesInOutput":0},"packages/sdk/migrations/src/migrations.ts":{"bytesInOutput":2745}},"bytes":7899}}}
|
|
@@ -18,10 +18,12 @@ export declare class MigrationBuilder {
|
|
|
18
18
|
props: any;
|
|
19
19
|
}>): Promise<void>;
|
|
20
20
|
addObject(schema: S.Schema<any>, props: any): Promise<string>;
|
|
21
|
-
createReference(id: string): import("@dxos/echo-protocol").
|
|
21
|
+
createReference(id: string): import("@dxos/echo-protocol").EncodedReference;
|
|
22
22
|
deleteObject(id: string): void;
|
|
23
23
|
changeProperties(changeFn: (properties: ObjectStructure) => void): void;
|
|
24
|
+
private _findObjectContainingHandle;
|
|
24
25
|
private _buildNewRoot;
|
|
25
26
|
private _createObject;
|
|
27
|
+
private _addHandleToFlushList;
|
|
26
28
|
}
|
|
27
29
|
//# sourceMappingURL=migration-builder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migration-builder.d.ts","sourceRoot":"","sources":["../../../src/migration-builder.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAG/C,OAAO,
|
|
1
|
+
{"version":3,"file":"migration-builder.d.ts","sourceRoot":"","sources":["../../../src/migration-builder.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAG/C,OAAO,EAAoC,KAAK,eAAe,EAA4B,MAAM,qBAAqB,CAAC;AACvH,OAAO,EAAwB,KAAK,CAAC,EAAE,MAAM,mBAAmB,CAAC;AAGjE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,qBAAa,gBAAgB;IAYf,OAAO,CAAC,QAAQ,CAAC,MAAM;IAXnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAO;IAC7B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAmB;IACrD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IAGzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8B;IACxD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA+B;IAC5D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAE/C,OAAO,CAAC,QAAQ,CAAC,CAAkC;gBAEtB,MAAM,EAAE,KAAK;IASpC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC;IAY5D,aAAa,CACjB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,CAAC,eAAe,EAAE,eAAe,KAAK,YAAY,CAAC;QAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAAC,KAAK,EAAE,GAAG,CAAA;KAAE,CAAC;IAmC9F,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG;IAKjD,eAAe,CAAC,EAAE,EAAE,MAAM;IAI1B,YAAY,CAAC,EAAE,EAAE,MAAM;IAIvB,gBAAgB,CAAC,QAAQ,EAAE,CAAC,UAAU,EAAE,eAAe,KAAK,IAAI;YAiClD,2BAA2B;IAWzC,OAAO,CAAC,aAAa;IAoBrB,OAAO,CAAC,aAAa;IAuBrB,OAAO,CAAC,qBAAqB;CAM9B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/migrations",
|
|
3
|
-
"version": "0.5.9-main.
|
|
3
|
+
"version": "0.5.9-main.912f1ef",
|
|
4
4
|
"description": "",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
@@ -20,15 +20,15 @@
|
|
|
20
20
|
"src"
|
|
21
21
|
],
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@dxos/
|
|
24
|
-
"@dxos/
|
|
25
|
-
"@dxos/echo-
|
|
26
|
-
"@dxos/echo-
|
|
27
|
-
"@dxos/
|
|
28
|
-
"@dxos/
|
|
29
|
-
"@dxos/
|
|
30
|
-
"@dxos/
|
|
31
|
-
"@dxos/util": "0.5.9-main.
|
|
23
|
+
"@dxos/automerge": "0.5.9-main.912f1ef",
|
|
24
|
+
"@dxos/client": "0.5.9-main.912f1ef",
|
|
25
|
+
"@dxos/echo-db": "0.5.9-main.912f1ef",
|
|
26
|
+
"@dxos/echo-protocol": "0.5.9-main.912f1ef",
|
|
27
|
+
"@dxos/echo-schema": "0.5.9-main.912f1ef",
|
|
28
|
+
"@dxos/invariant": "0.5.9-main.912f1ef",
|
|
29
|
+
"@dxos/log": "0.5.9-main.912f1ef",
|
|
30
|
+
"@dxos/protocols": "0.5.9-main.912f1ef",
|
|
31
|
+
"@dxos/util": "0.5.9-main.912f1ef"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {},
|
|
34
34
|
"publishConfig": {
|
package/src/migration-builder.ts
CHANGED
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
// Copyright 2024 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import { type Doc,
|
|
5
|
+
import { type Doc, next as am } from '@dxos/automerge/automerge';
|
|
6
6
|
import { type AnyDocumentId, type DocHandle, type Repo } from '@dxos/automerge/automerge-repo';
|
|
7
7
|
import { type Space } from '@dxos/client/echo';
|
|
8
8
|
import { CreateEpochRequest } from '@dxos/client/halo';
|
|
9
|
-
import { type AutomergeContext, ObjectCore } from '@dxos/echo-db';
|
|
10
|
-
import { encodeReference, type ObjectStructure,
|
|
9
|
+
import { type AutomergeContext, ObjectCore, migrateDocument } from '@dxos/echo-db';
|
|
10
|
+
import { SpaceDocVersion, encodeReference, type ObjectStructure, type SpaceDoc, Reference } from '@dxos/echo-protocol';
|
|
11
11
|
import { requireTypeReference, type S } from '@dxos/echo-schema';
|
|
12
12
|
import { invariant } from '@dxos/invariant';
|
|
13
13
|
import { type FlushRequest } from '@dxos/protocols/proto/dxos/echo/service';
|
|
@@ -56,7 +56,31 @@ export class MigrationBuilder {
|
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
const { schema, props } = await migrate(objectStructure);
|
|
59
|
-
|
|
59
|
+
|
|
60
|
+
const oldHandle = await this._findObjectContainingHandle(id);
|
|
61
|
+
invariant(oldHandle);
|
|
62
|
+
|
|
63
|
+
const newState: SpaceDoc = {
|
|
64
|
+
version: SpaceDocVersion.CURRENT,
|
|
65
|
+
access: {
|
|
66
|
+
spaceKey: this._space.key.toHex(),
|
|
67
|
+
},
|
|
68
|
+
objects: {
|
|
69
|
+
[id]: {
|
|
70
|
+
system: {
|
|
71
|
+
type: encodeReference(requireTypeReference(schema)),
|
|
72
|
+
},
|
|
73
|
+
data: props,
|
|
74
|
+
meta: {
|
|
75
|
+
keys: [],
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
const migratedDoc = migrateDocument(oldHandle.docSync() as Doc<SpaceDoc>, newState);
|
|
81
|
+
const newHandle = this._repo.import<SpaceDoc>(am.save(migratedDoc));
|
|
82
|
+
this._newLinks[id] = newHandle.url;
|
|
83
|
+
this._addHandleToFlushList(newHandle);
|
|
60
84
|
}
|
|
61
85
|
|
|
62
86
|
async addObject(schema: S.Schema<any>, props: any) {
|
|
@@ -82,10 +106,7 @@ export class MigrationBuilder {
|
|
|
82
106
|
const propertiesStructure = doc.objects?.[this._space.properties.id];
|
|
83
107
|
propertiesStructure && changeFn(propertiesStructure);
|
|
84
108
|
});
|
|
85
|
-
this.
|
|
86
|
-
documentId: this._newRoot.documentId,
|
|
87
|
-
heads: getHeads(this._newRoot.docSync()),
|
|
88
|
-
});
|
|
109
|
+
this._addHandleToFlushList(this._newRoot);
|
|
89
110
|
}
|
|
90
111
|
|
|
91
112
|
/**
|
|
@@ -108,6 +129,17 @@ export class MigrationBuilder {
|
|
|
108
129
|
});
|
|
109
130
|
}
|
|
110
131
|
|
|
132
|
+
private async _findObjectContainingHandle(id: string): Promise<DocHandle<SpaceDoc> | undefined> {
|
|
133
|
+
const documentId = (this._rootDoc.links?.[id] || this._newLinks[id]) as AnyDocumentId | undefined;
|
|
134
|
+
const docHandle = documentId && this._repo.find(documentId);
|
|
135
|
+
if (!docHandle) {
|
|
136
|
+
return undefined;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
await docHandle.whenReady();
|
|
140
|
+
return docHandle;
|
|
141
|
+
}
|
|
142
|
+
|
|
111
143
|
private _buildNewRoot() {
|
|
112
144
|
const previousLinks = { ...(this._rootDoc.links ?? {}) };
|
|
113
145
|
for (const id of this._deleteObjects) {
|
|
@@ -115,6 +147,7 @@ export class MigrationBuilder {
|
|
|
115
147
|
}
|
|
116
148
|
|
|
117
149
|
this._newRoot = this._repo.create<SpaceDoc>({
|
|
150
|
+
version: SpaceDocVersion.CURRENT,
|
|
118
151
|
access: {
|
|
119
152
|
spaceKey: this._space.key.toHex(),
|
|
120
153
|
},
|
|
@@ -124,10 +157,7 @@ export class MigrationBuilder {
|
|
|
124
157
|
...this._newLinks,
|
|
125
158
|
},
|
|
126
159
|
});
|
|
127
|
-
this.
|
|
128
|
-
documentId: this._newRoot.documentId,
|
|
129
|
-
heads: getHeads(this._newRoot.docSync()),
|
|
130
|
-
});
|
|
160
|
+
this._addHandleToFlushList(this._newRoot);
|
|
131
161
|
}
|
|
132
162
|
|
|
133
163
|
private _createObject({ id, schema, props }: { id?: string; schema: S.Schema<any>; props: any }) {
|
|
@@ -139,6 +169,7 @@ export class MigrationBuilder {
|
|
|
139
169
|
core.initNewObject(props);
|
|
140
170
|
core.setType(requireTypeReference(schema));
|
|
141
171
|
const newHandle = this._repo.create<SpaceDoc>({
|
|
172
|
+
version: SpaceDocVersion.CURRENT,
|
|
142
173
|
access: {
|
|
143
174
|
spaceKey: this._space.key.toHex(),
|
|
144
175
|
},
|
|
@@ -147,11 +178,15 @@ export class MigrationBuilder {
|
|
|
147
178
|
},
|
|
148
179
|
});
|
|
149
180
|
this._newLinks[core.id] = newHandle.url;
|
|
150
|
-
this.
|
|
151
|
-
documentId: newHandle.documentId,
|
|
152
|
-
heads: getHeads(newHandle.docSync()),
|
|
153
|
-
});
|
|
181
|
+
this._addHandleToFlushList(newHandle);
|
|
154
182
|
|
|
155
183
|
return core;
|
|
156
184
|
}
|
|
185
|
+
|
|
186
|
+
private _addHandleToFlushList(handle: DocHandle<any>) {
|
|
187
|
+
this._flushStates.push({
|
|
188
|
+
documentId: handle.documentId,
|
|
189
|
+
heads: am.getHeads(handle.docSync()),
|
|
190
|
+
});
|
|
191
|
+
}
|
|
157
192
|
}
|